loadDefinedFile.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. 'use strict';
  2. var yaml = require('js-yaml');
  3. var requireFromString = require('require-from-string');
  4. var readFile = require('./readFile');
  5. var parseJson = require('./parseJson');
  6. module.exports = function (filepath, options) {
  7. return readFile(filepath, { throwNotFound: true }).then(function (content) {
  8. var parsedConfig = (function () {
  9. switch (options.format) {
  10. case 'json':
  11. return parseJson(content, filepath);
  12. case 'yaml':
  13. return yaml.safeLoad(content, {
  14. filename: filepath,
  15. });
  16. case 'js':
  17. return requireFromString(content, filepath);
  18. default:
  19. return tryAllParsing(content, filepath);
  20. }
  21. })();
  22. if (!parsedConfig) {
  23. throw new Error(
  24. 'Failed to parse "' + filepath + '" as JSON, JS, or YAML.'
  25. );
  26. }
  27. return {
  28. config: parsedConfig,
  29. filepath: filepath,
  30. };
  31. });
  32. };
  33. function tryAllParsing(content, filepath) {
  34. return tryYaml(content, filepath, function () {
  35. return tryRequire(content, filepath, function () {
  36. return null;
  37. });
  38. });
  39. }
  40. function tryYaml(content, filepath, cb) {
  41. try {
  42. var result = yaml.safeLoad(content, {
  43. filename: filepath,
  44. });
  45. if (typeof result === 'string') {
  46. return cb();
  47. }
  48. return result;
  49. } catch (e) {
  50. return cb();
  51. }
  52. }
  53. function tryRequire(content, filepath, cb) {
  54. try {
  55. return requireFromString(content, filepath);
  56. } catch (e) {
  57. return cb();
  58. }
  59. }