UNPKG

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