@form8ion/javascript 2.1.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -45,7 +45,13 @@ $ npm install @form8ion/javascript --save
45
45
 
46
46
  ```javascript
47
47
  const {dialects, projectTypes} = require('@form8ion/javascript-core');
48
- const {scaffold: scaffoldJavaScript, scaffoldUnitTesting, questionNames} = require('./lib/index.cjs');
48
+ const {
49
+ scaffold: scaffoldJavaScript,
50
+ lift: liftJavascript,
51
+ test: thisIsAJavaScriptProject,
52
+ scaffoldUnitTesting,
53
+ questionNames
54
+ } = require('@form8ion/javascript');
49
55
  ```
50
56
 
51
57
  #### Execute
@@ -53,9 +59,10 @@ const {scaffold: scaffoldJavaScript, scaffoldUnitTesting, questionNames} = requi
53
59
  ```javascript
54
60
  (async () => {
55
61
  const accountName = 'form8ion';
62
+ const projectRoot = process.cwd();
56
63
 
57
64
  await scaffoldJavaScript({
58
- projectRoot: process.cwd(),
65
+ projectRoot,
59
66
  projectName: 'project-name',
60
67
  visibility: 'Public',
61
68
  license: 'MIT',
@@ -83,6 +90,20 @@ const {scaffold: scaffoldJavaScript, scaffoldUnitTesting, questionNames} = requi
83
90
  }
84
91
  });
85
92
 
93
+ if (await thisIsAJavaScriptProject({projectRoot})) {
94
+ await liftJavascript({
95
+ projectRoot,
96
+ configs: {eslint: {scope: '@foo'}},
97
+ results: {
98
+ dependencies: [],
99
+ devDependencies: [],
100
+ scripts: {},
101
+ eslintConfigs: [],
102
+ packageManager: 'npm'
103
+ }
104
+ });
105
+ }
106
+
86
107
  await scaffoldUnitTesting({
87
108
  projectRoot: process.cwd(),
88
109
  frameworks: {
package/example.js CHANGED
@@ -5,9 +5,10 @@ import stubbedFs from 'mock-fs';
5
5
  import td from 'testdouble';
6
6
  import 'validate-npm-package-name';
7
7
 
8
- // remark-usage-ignore-next 9
8
+ // remark-usage-ignore-next 10
9
9
  stubbedFs({
10
10
  node_modules: stubbedFs.load(resolve(...[__dirname, 'node_modules'])),
11
+ '.nvmrc': 'v1.2.3',
11
12
  lib: stubbedFs.load(resolve(...[__dirname, 'lib'])),
12
13
  templates: stubbedFs.load(resolve(...[__dirname, 'templates']))
13
14
  });
@@ -17,14 +18,21 @@ td.when(execa('. ~/.nvm/nvm.sh && nvm ls-remote --lts', {shell: true}))
17
18
  td.when(execa('. ~/.nvm/nvm.sh && nvm install', {shell: true})).thenReturn({stdout: {pipe: () => undefined}});
18
19
 
19
20
  const {dialects, projectTypes} = require('@form8ion/javascript-core');
20
- const {scaffold: scaffoldJavaScript, scaffoldUnitTesting, questionNames} = require('./lib/index.cjs');
21
+ const {
22
+ scaffold: scaffoldJavaScript,
23
+ lift: liftJavascript,
24
+ test: thisIsAJavaScriptProject,
25
+ scaffoldUnitTesting,
26
+ questionNames
27
+ } = require('./lib/index.cjs');
21
28
 
22
29
  // #### Execute
23
30
  (async () => {
24
31
  const accountName = 'form8ion';
32
+ const projectRoot = process.cwd();
25
33
 
26
34
  await scaffoldJavaScript({
27
- projectRoot: process.cwd(),
35
+ projectRoot,
28
36
  projectName: 'project-name',
29
37
  visibility: 'Public',
30
38
  license: 'MIT',
@@ -52,6 +60,20 @@ const {scaffold: scaffoldJavaScript, scaffoldUnitTesting, questionNames} = requi
52
60
  }
53
61
  });
54
62
 
63
+ if (await thisIsAJavaScriptProject({projectRoot})) {
64
+ await liftJavascript({
65
+ projectRoot,
66
+ configs: {eslint: {scope: '@foo'}},
67
+ results: {
68
+ dependencies: [],
69
+ devDependencies: [],
70
+ scripts: {},
71
+ eslintConfigs: [],
72
+ packageManager: 'npm'
73
+ }
74
+ });
75
+ }
76
+
55
77
  await scaffoldUnitTesting({
56
78
  projectRoot: process.cwd(),
57
79
  frameworks: {
package/lib/index.cjs.js CHANGED
@@ -11,7 +11,9 @@ var joi = require('joi');
11
11
  var inquirer = require('inquirer');
12
12
  var overridablePrompts = require('@form8ion/overridable-prompts');
13
13
  var cliMessages = require('@travi/cli-messages');
14
- var liftJavascript = require('@form8ion/lift-javascript');
14
+ var eslint = require('@form8ion/eslint');
15
+ var core = require('@form8ion/core');
16
+ var husky = require('@form8ion/husky');
15
17
  var commitConvention = require('@form8ion/commit-convention');
16
18
  var hoek = require('@hapi/hoek');
17
19
  var execa = require('execa');
@@ -24,8 +26,6 @@ var camelcase = require('camelcase');
24
26
  var makeDir = require('make-dir');
25
27
  var touch = require('touch');
26
28
  var path = require('path');
27
- var husky = require('@form8ion/husky');
28
- var eslint = require('@form8ion/eslint');
29
29
 
30
30
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
31
31
 
@@ -195,6 +195,157 @@ async function scaffoldUnitTesting ({
195
195
  }, framework, coverage]);
196
196
  }
197
197
 
198
+ async function applyEnhancers ({
199
+ results,
200
+ enhancers = {},
201
+ projectRoot
202
+ }) {
203
+ cliMessages.info('Applying Enhancers');
204
+ return Object.values(enhancers).reduce(async (acc, enhancer) => {
205
+ if (await enhancer.test({
206
+ projectRoot
207
+ })) {
208
+ const previousResults = await acc;
209
+ return deepmerge__default["default"](previousResults, await enhancer.lift({
210
+ results: previousResults,
211
+ projectRoot
212
+ }));
213
+ }
214
+
215
+ return acc;
216
+ }, results);
217
+ }
218
+
219
+ async function test$1({
220
+ projectRoot
221
+ }) {
222
+ const {
223
+ engines
224
+ } = JSON.parse(await fs.promises.readFile(`${projectRoot}/package.json`, 'utf8'));
225
+ return !!(engines !== null && engines !== void 0 && engines.node);
226
+ }
227
+ async function lift$1({
228
+ projectRoot
229
+ }) {
230
+ const {
231
+ name
232
+ } = JSON.parse(await fs.promises.readFile(`${projectRoot}/package.json`, 'utf8'));
233
+ return {
234
+ devDependencies: ['ls-engines'],
235
+ scripts: {
236
+ 'lint:engines': 'ls-engines'
237
+ },
238
+ badges: {
239
+ consumer: {
240
+ node: {
241
+ img: `https://img.shields.io/node/v/${name}?logo=node.js`,
242
+ text: 'node'
243
+ }
244
+ }
245
+ }
246
+ };
247
+ }
248
+
249
+ var enginesEnhancer = /*#__PURE__*/Object.freeze({
250
+ __proto__: null,
251
+ test: test$1,
252
+ lift: lift$1
253
+ });
254
+
255
+ async function liftPackage ({
256
+ projectRoot,
257
+ scripts,
258
+ tags,
259
+ dependencies,
260
+ devDependencies,
261
+ packageManager
262
+ }) {
263
+ if (scripts || tags) {
264
+ cliMessages.info('Updating `package.json`', {
265
+ level: 'secondary'
266
+ });
267
+ const pathToPackageJson = `${projectRoot}/package.json`;
268
+ const existingPackageJsonContents = JSON.parse(await fs.promises.readFile(pathToPackageJson, 'utf8'));
269
+ await fs.promises.writeFile(pathToPackageJson, JSON.stringify(_objectSpread2(_objectSpread2({}, existingPackageJsonContents), {}, {
270
+ scripts: _objectSpread2(_objectSpread2({}, existingPackageJsonContents.scripts), scripts)
271
+ }, tags && {
272
+ keywords: existingPackageJsonContents.keywords ? [...existingPackageJsonContents.keywords, ...tags] : tags
273
+ }), null, 2));
274
+ }
275
+
276
+ cliMessages.info('Installing dependencies');
277
+ await javascriptCore.installDependencies(dependencies || [], javascriptCore.PROD_DEPENDENCY_TYPE, projectRoot, packageManager);
278
+ await javascriptCore.installDependencies([...(devDependencies || [])], javascriptCore.DEV_DEPENDENCY_TYPE, projectRoot, packageManager);
279
+ }
280
+
281
+ async function resolvePackageManager ({
282
+ projectRoot,
283
+ packageManager
284
+ }) {
285
+ if (packageManager) return packageManager;
286
+
287
+ if (await core.fileExists(`${projectRoot}/package-lock.json`)) {
288
+ return javascriptCore.packageManagers.NPM;
289
+ }
290
+
291
+ if (await core.fileExists(`${projectRoot}/yarn.lock`)) {
292
+ return javascriptCore.packageManagers.YARN;
293
+ }
294
+
295
+ throw new Error('Package-manager could not be determined');
296
+ }
297
+
298
+ function enhanceHuskyEnhancer(packageManager) {
299
+ return {
300
+ test: husky.test,
301
+ lift: ({
302
+ projectRoot,
303
+ results
304
+ }) => husky.lift({
305
+ projectRoot,
306
+ results,
307
+ packageManager
308
+ })
309
+ };
310
+ }
311
+
312
+ async function lift ({
313
+ projectRoot,
314
+ results
315
+ }) {
316
+ cliMessages.info('Lifting JavaScript-specific details');
317
+ const {
318
+ scripts,
319
+ tags,
320
+ eslintConfigs,
321
+ dependencies,
322
+ devDependencies,
323
+ packageManager: manager
324
+ } = results;
325
+ const packageManager = await resolvePackageManager({
326
+ projectRoot,
327
+ packageManager: manager
328
+ });
329
+ const eslintResults = await eslint.lift({
330
+ projectRoot,
331
+ configs: eslintConfigs
332
+ });
333
+ const enhancerResults = await applyEnhancers({
334
+ results,
335
+ enhancers: [enhanceHuskyEnhancer(packageManager), enginesEnhancer],
336
+ projectRoot
337
+ });
338
+ await liftPackage(deepmerge__default["default"].all([{
339
+ projectRoot,
340
+ scripts,
341
+ tags,
342
+ dependencies,
343
+ devDependencies,
344
+ packageManager
345
+ }, enhancerResults, eslintResults]));
346
+ return enhancerResults;
347
+ }
348
+
198
349
  function validate(options) {
199
350
  const schema = joi__namespace.object().required().keys({
200
351
  projectRoot: joi__namespace.string().required(),
@@ -816,7 +967,7 @@ function defineBadges (packageName, visibility) {
816
967
  return {
817
968
  consumer: _objectSpread2({}, 'Public' === visibility && {
818
969
  npm: {
819
- img: `https://img.shields.io/npm/v/${packageName}.svg`,
970
+ img: `https://img.shields.io/npm/v/${packageName}?logo=npm`,
820
971
  text: 'npm',
821
972
  link: `https://www.npmjs.com/package/${packageName}`
822
973
  }
@@ -1477,7 +1628,7 @@ async function scaffolder (options) {
1477
1628
  scripts: mergedContributions.scripts,
1478
1629
  pathWithinParent
1479
1630
  });
1480
- const liftResults = await liftJavascript.lift({
1631
+ const liftResults = await lift({
1481
1632
  results: deepmerge__default["default"]({
1482
1633
  devDependencies: ['npm-run-all'],
1483
1634
  packageManager
@@ -1501,9 +1652,17 @@ async function scaffolder (options) {
1501
1652
  };
1502
1653
  }
1503
1654
 
1655
+ async function test ({
1656
+ projectRoot
1657
+ }) {
1658
+ return core.fileExists(`${projectRoot}/.nvmrc`);
1659
+ }
1660
+
1504
1661
  const questionNames = _objectSpread2(_objectSpread2({}, languageScaffolderPrompts.questionNames), questionNames$1);
1505
1662
 
1663
+ exports.lift = lift;
1506
1664
  exports.questionNames = questionNames;
1507
1665
  exports.scaffold = scaffolder;
1508
1666
  exports.scaffoldUnitTesting = scaffoldUnitTesting;
1667
+ exports.test = test;
1509
1668
  //# sourceMappingURL=index.cjs.js.map