node-plop.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
  3. var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
  4. _Object$defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));
  9. var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
  10. var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
  11. var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
  12. var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
  13. var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));
  14. var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign"));
  15. var _fs = _interopRequireDefault(require("fs"));
  16. var _path = _interopRequireDefault(require("path"));
  17. var _inquirer = _interopRequireDefault(require("inquirer"));
  18. var _handlebars = _interopRequireDefault(require("handlebars"));
  19. var _lodash = _interopRequireDefault(require("lodash.get"));
  20. var _resolve = _interopRequireDefault(require("resolve"));
  21. var _bakedInHelpers = _interopRequireDefault(require("./baked-in-helpers"));
  22. var _generatorRunner = _interopRequireDefault(require("./generator-runner"));
  23. function nodePlop(plopfilePath = '', plopCfg = {}) {
  24. let pkgJson = {};
  25. let defaultInclude = {
  26. generators: true
  27. };
  28. let welcomeMessage;
  29. const {
  30. destBasePath,
  31. force
  32. } = plopCfg;
  33. const generators = {};
  34. const partials = {};
  35. const actionTypes = {};
  36. const helpers = (0, _assign.default)({
  37. pkg: propertyPath => (0, _lodash.default)(pkgJson, propertyPath, '')
  38. }, _bakedInHelpers.default);
  39. const baseHelpers = (0, _keys.default)(helpers);
  40. const setPrompt = _inquirer.default.registerPrompt;
  41. const setWelcomeMessage = message => {
  42. welcomeMessage = message;
  43. };
  44. const setHelper = (name, fn) => {
  45. helpers[name] = fn;
  46. };
  47. const setPartial = (name, str) => {
  48. partials[name] = str;
  49. };
  50. const setActionType = (name, fn) => {
  51. actionTypes[name] = fn;
  52. };
  53. function renderString(template, data) {
  54. var _context, _context2;
  55. (0, _forEach.default)(_context = (0, _keys.default)(helpers)).call(_context, h => _handlebars.default.registerHelper(h, helpers[h]));
  56. (0, _forEach.default)(_context2 = (0, _keys.default)(partials)).call(_context2, p => _handlebars.default.registerPartial(p, partials[p]));
  57. return _handlebars.default.compile(template)(data);
  58. }
  59. const getWelcomeMessage = () => welcomeMessage;
  60. const getHelper = name => helpers[name];
  61. const getPartial = name => partials[name];
  62. const getActionType = name => actionTypes[name];
  63. const getGenerator = name => generators[name];
  64. function setGenerator(name = '', config = {}) {
  65. // if no name is provided, use a default
  66. name = name || `generator-${(0, _keys.default)(generators).length + 1}`; // add the generator to this context
  67. generators[name] = (0, _assign.default)(config, {
  68. name: name,
  69. basePath: plopfilePath
  70. });
  71. return generators[name];
  72. }
  73. const getHelperList = () => {
  74. var _context3;
  75. return (0, _filter.default)(_context3 = (0, _keys.default)(helpers)).call(_context3, h => !(0, _includes.default)(baseHelpers).call(baseHelpers, h));
  76. };
  77. const getPartialList = () => (0, _keys.default)(partials);
  78. const getActionTypeList = () => (0, _keys.default)(actionTypes);
  79. function getGeneratorList() {
  80. var _context4;
  81. return (0, _map.default)(_context4 = (0, _keys.default)(generators)).call(_context4, function (name) {
  82. const {
  83. description
  84. } = generators[name];
  85. return {
  86. name,
  87. description
  88. };
  89. });
  90. }
  91. const setDefaultInclude = inc => defaultInclude = inc;
  92. const getDefaultInclude = () => defaultInclude;
  93. const getDestBasePath = () => destBasePath || plopfilePath;
  94. const getPlopfilePath = () => plopfilePath;
  95. const setPlopfilePath = filePath => {
  96. const pathStats = _fs.default.statSync(filePath);
  97. if (pathStats.isFile()) {
  98. plopfilePath = _path.default.dirname(filePath);
  99. } else {
  100. plopfilePath = filePath;
  101. }
  102. };
  103. function load(targets, loadCfg = {}, includeOverride) {
  104. if (typeof targets === 'string') {
  105. targets = [targets];
  106. }
  107. const config = (0, _assign.default)({
  108. destBasePath: getDestBasePath()
  109. }, loadCfg);
  110. (0, _forEach.default)(targets).call(targets, function (target) {
  111. var _context5;
  112. const targetPath = _resolve.default.sync(target, {
  113. basedir: getPlopfilePath()
  114. });
  115. const proxy = nodePlop(targetPath, config);
  116. const proxyDefaultInclude = proxy.getDefaultInclude() || {};
  117. const includeCfg = includeOverride || proxyDefaultInclude;
  118. const include = (0, _assign.default)({
  119. generators: false,
  120. helpers: false,
  121. partials: false,
  122. actionTypes: false
  123. }, includeCfg);
  124. const genNameList = (0, _map.default)(_context5 = proxy.getGeneratorList()).call(_context5, g => g.name);
  125. loadAsset(genNameList, include.generators, setGenerator, proxyName => ({
  126. proxyName,
  127. proxy
  128. }));
  129. loadAsset(proxy.getPartialList(), include.partials, setPartial, proxy.getPartial);
  130. loadAsset(proxy.getHelperList(), include.helpers, setHelper, proxy.getHelper);
  131. loadAsset(proxy.getActionTypeList(), include.actionTypes, setActionType, proxy.getActionType);
  132. });
  133. }
  134. function loadAsset(nameList, include, addFunc, getFunc) {
  135. var incArr;
  136. if (include === true) {
  137. incArr = nameList;
  138. }
  139. if (include instanceof Array) {
  140. incArr = (0, _filter.default)(include).call(include, n => typeof n === 'string');
  141. }
  142. if (incArr != null) {
  143. include = (0, _reduce.default)(incArr).call(incArr, function (inc, name) {
  144. inc[name] = name;
  145. return inc;
  146. }, {});
  147. }
  148. if (include instanceof Object) {
  149. var _context6;
  150. (0, _forEach.default)(_context6 = (0, _keys.default)(include)).call(_context6, i => addFunc(include[i], getFunc(i)));
  151. }
  152. }
  153. function loadPackageJson() {
  154. // look for a package.json file to use for the "pkg" helper
  155. try {
  156. pkgJson = require(_path.default.join(getDestBasePath(), 'package.json'));
  157. } catch (error) {
  158. pkgJson = {};
  159. }
  160. } /////////
  161. // the API that is exposed to the plopfile when it is executed
  162. // it differs from the nodePlopApi in that it does not include the
  163. // generator runner methods
  164. //
  165. const plopfileApi = {
  166. // main methods for setting and getting plop context things
  167. setPrompt,
  168. setWelcomeMessage,
  169. getWelcomeMessage,
  170. setGenerator,
  171. getGenerator,
  172. getGeneratorList,
  173. setPartial,
  174. getPartial,
  175. getPartialList,
  176. setHelper,
  177. getHelper,
  178. getHelperList,
  179. setActionType,
  180. getActionType,
  181. getActionTypeList,
  182. // path context methods
  183. setPlopfilePath,
  184. getPlopfilePath,
  185. getDestBasePath,
  186. // plop.load functionality
  187. load,
  188. setDefaultInclude,
  189. getDefaultInclude,
  190. // render a handlebars template
  191. renderString,
  192. // passthrough properties
  193. inquirer: _inquirer.default,
  194. handlebars: _handlebars.default,
  195. // passthroughs for backward compatibility
  196. addPrompt: setPrompt,
  197. addPartial: setPartial,
  198. addHelper: setHelper
  199. }; // the runner for this instance of the nodePlop api
  200. const runner = (0, _generatorRunner.default)(plopfileApi, {
  201. force
  202. });
  203. const nodePlopApi = (0, _assign.default)({}, plopfileApi, {
  204. getGenerator(name) {
  205. var generator = plopfileApi.getGenerator(name);
  206. if (generator == null) {
  207. throw Error(`Generator "${name}" does not exist.`);
  208. } // if this generator was loaded from an external plopfile, proxy the
  209. // generator request through to the external plop instance
  210. if (generator.proxy) {
  211. return generator.proxy.getGenerator(generator.proxyName);
  212. }
  213. return (0, _assign.default)({}, generator, {
  214. runActions: (data, hooks) => runner.runGeneratorActions(generator, data, hooks),
  215. runPrompts: (bypassArr = []) => runner.runGeneratorPrompts(generator, bypassArr)
  216. });
  217. },
  218. setGenerator(name, config) {
  219. const g = plopfileApi.setGenerator(name, config);
  220. return this.getGenerator(g.name);
  221. }
  222. });
  223. if (plopfilePath) {
  224. plopfilePath = _path.default.resolve(plopfilePath);
  225. const plopFileName = _path.default.basename(plopfilePath);
  226. setPlopfilePath(plopfilePath);
  227. loadPackageJson();
  228. const plopFileExport = require(_path.default.join(plopfilePath, plopFileName));
  229. const plop = typeof plopFileExport === 'function' ? plopFileExport : plopFileExport.default;
  230. plop(plopfileApi, plopCfg);
  231. } else {
  232. setPlopfilePath(process.cwd());
  233. loadPackageJson();
  234. }
  235. return nodePlopApi;
  236. }
  237. var _default = nodePlop;
  238. exports.default = _default;