@form8ion/javascript 2.2.0 → 3.1.0-alpha.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
@@ -5,13 +5,13 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var languageScaffolderPrompts = require('@travi/language-scaffolder-prompts');
6
6
  var deepmerge = require('deepmerge');
7
7
  var javascriptCore = require('@form8ion/javascript-core');
8
- var codecov = require('@form8ion/codecov');
9
- var fs = require('fs');
10
8
  var joi = require('joi');
11
9
  var inquirer = require('inquirer');
12
10
  var overridablePrompts = require('@form8ion/overridable-prompts');
11
+ var codecov = require('@form8ion/codecov');
12
+ var fs = require('fs');
13
+ var core = require('@form8ion/core');
13
14
  var cliMessages = require('@travi/cli-messages');
14
- var liftJavascript = require('@form8ion/lift-javascript');
15
15
  var commitConvention = require('@form8ion/commit-convention');
16
16
  var hoek = require('@hapi/hoek');
17
17
  var execa = require('execa');
@@ -150,6 +150,42 @@ async function scaffoldCoverage ({
150
150
  }));
151
151
  }
152
152
 
153
+ function nycIsConfigured ({
154
+ projectRoot
155
+ }) {
156
+ return core.fileExists(`${projectRoot}/.nycrc`);
157
+ }
158
+
159
+ async function removeNyc ({
160
+ projectRoot
161
+ }) {
162
+ await fs.promises.unlink(`${projectRoot}/.nycrc`);
163
+ }
164
+
165
+ async function lift$2({
166
+ projectRoot
167
+ }) {
168
+ if (await nycIsConfigured({
169
+ projectRoot
170
+ })) {
171
+ const [c8Results] = await Promise.all([scaffoldC8({
172
+ projectRoot
173
+ }), removeNyc({
174
+ projectRoot
175
+ })]);
176
+ return c8Results;
177
+ }
178
+
179
+ return {};
180
+ }
181
+
182
+ var coveragePlugin = /*#__PURE__*/Object.freeze({
183
+ __proto__: null,
184
+ scaffold: scaffoldCoverage,
185
+ lift: lift$2,
186
+ test: nycIsConfigured
187
+ });
188
+
153
189
  const unitTestFrameworksSchema = joi__namespace.object().required().pattern(/^/, joi__namespace.object({
154
190
  scaffolder: joi__namespace.func().arity(1).required()
155
191
  }));
@@ -195,6 +231,157 @@ async function scaffoldUnitTesting ({
195
231
  }, framework, coverage]);
196
232
  }
197
233
 
234
+ async function applyEnhancers ({
235
+ results,
236
+ enhancers = {},
237
+ projectRoot
238
+ }) {
239
+ cliMessages.info('Applying Enhancers');
240
+ return Object.values(enhancers).reduce(async (acc, enhancer) => {
241
+ if (await enhancer.test({
242
+ projectRoot
243
+ })) {
244
+ const previousResults = await acc;
245
+ return deepmerge__default["default"](previousResults, await enhancer.lift({
246
+ results: previousResults,
247
+ projectRoot
248
+ }));
249
+ }
250
+
251
+ return acc;
252
+ }, results);
253
+ }
254
+
255
+ async function test$1({
256
+ projectRoot
257
+ }) {
258
+ const {
259
+ engines
260
+ } = JSON.parse(await fs.promises.readFile(`${projectRoot}/package.json`, 'utf8'));
261
+ return !!(engines !== null && engines !== void 0 && engines.node);
262
+ }
263
+ async function lift$1({
264
+ projectRoot
265
+ }) {
266
+ const {
267
+ name
268
+ } = JSON.parse(await fs.promises.readFile(`${projectRoot}/package.json`, 'utf8'));
269
+ return {
270
+ devDependencies: ['ls-engines'],
271
+ scripts: {
272
+ 'lint:engines': 'ls-engines'
273
+ },
274
+ badges: {
275
+ consumer: {
276
+ node: {
277
+ img: `https://img.shields.io/node/v/${name}?logo=node.js`,
278
+ text: 'node'
279
+ }
280
+ }
281
+ }
282
+ };
283
+ }
284
+
285
+ var enginesEnhancer = /*#__PURE__*/Object.freeze({
286
+ __proto__: null,
287
+ test: test$1,
288
+ lift: lift$1
289
+ });
290
+
291
+ function enhanceHuskyEnhancer(packageManager) {
292
+ return {
293
+ test: husky.test,
294
+ lift: ({
295
+ projectRoot,
296
+ results
297
+ }) => husky.lift({
298
+ projectRoot,
299
+ results,
300
+ packageManager
301
+ })
302
+ };
303
+ }
304
+
305
+ async function liftPackage ({
306
+ projectRoot,
307
+ scripts,
308
+ tags,
309
+ dependencies,
310
+ devDependencies,
311
+ packageManager
312
+ }) {
313
+ if (scripts || tags) {
314
+ cliMessages.info('Updating `package.json`', {
315
+ level: 'secondary'
316
+ });
317
+ const pathToPackageJson = `${projectRoot}/package.json`;
318
+ const existingPackageJsonContents = JSON.parse(await fs.promises.readFile(pathToPackageJson, 'utf8'));
319
+ await fs.promises.writeFile(pathToPackageJson, JSON.stringify(_objectSpread2(_objectSpread2({}, existingPackageJsonContents), {}, {
320
+ scripts: _objectSpread2(_objectSpread2({}, existingPackageJsonContents.scripts), scripts)
321
+ }, tags && {
322
+ keywords: existingPackageJsonContents.keywords ? [...existingPackageJsonContents.keywords, ...tags] : tags
323
+ }), null, 2));
324
+ }
325
+
326
+ cliMessages.info('Installing dependencies');
327
+ await javascriptCore.installDependencies(dependencies || [], javascriptCore.PROD_DEPENDENCY_TYPE, projectRoot, packageManager);
328
+ await javascriptCore.installDependencies([...(devDependencies || [])], javascriptCore.DEV_DEPENDENCY_TYPE, projectRoot, packageManager);
329
+ }
330
+
331
+ async function resolvePackageManager ({
332
+ projectRoot,
333
+ packageManager
334
+ }) {
335
+ if (packageManager) return packageManager;
336
+
337
+ if (await core.fileExists(`${projectRoot}/package-lock.json`)) {
338
+ return javascriptCore.packageManagers.NPM;
339
+ }
340
+
341
+ if (await core.fileExists(`${projectRoot}/yarn.lock`)) {
342
+ return javascriptCore.packageManagers.YARN;
343
+ }
344
+
345
+ throw new Error('Package-manager could not be determined');
346
+ }
347
+
348
+ async function lift ({
349
+ projectRoot,
350
+ results
351
+ }) {
352
+ cliMessages.info('Lifting JavaScript-specific details');
353
+ const {
354
+ scripts,
355
+ tags,
356
+ eslintConfigs,
357
+ dependencies,
358
+ devDependencies,
359
+ packageManager: manager
360
+ } = results;
361
+ const packageManager = await resolvePackageManager({
362
+ projectRoot,
363
+ packageManager: manager
364
+ });
365
+ const eslintResults = await eslint.lift({
366
+ projectRoot,
367
+ configs: eslintConfigs
368
+ });
369
+ const enhancerResults = await applyEnhancers({
370
+ results,
371
+ enhancers: [enhanceHuskyEnhancer(packageManager), enginesEnhancer, coveragePlugin],
372
+ projectRoot
373
+ });
374
+ await liftPackage(deepmerge__default["default"].all([{
375
+ projectRoot,
376
+ scripts,
377
+ tags,
378
+ dependencies,
379
+ devDependencies,
380
+ packageManager
381
+ }, enhancerResults, eslintResults]));
382
+ return enhancerResults;
383
+ }
384
+
198
385
  function validate(options) {
199
386
  const schema = joi__namespace.object().required().keys({
200
387
  projectRoot: joi__namespace.string().required(),
@@ -1477,7 +1664,7 @@ async function scaffolder (options) {
1477
1664
  scripts: mergedContributions.scripts,
1478
1665
  pathWithinParent
1479
1666
  });
1480
- const liftResults = await liftJavascript.lift({
1667
+ const liftResults = await lift({
1481
1668
  results: deepmerge__default["default"]({
1482
1669
  devDependencies: ['npm-run-all'],
1483
1670
  packageManager
@@ -1501,9 +1688,17 @@ async function scaffolder (options) {
1501
1688
  };
1502
1689
  }
1503
1690
 
1691
+ async function test ({
1692
+ projectRoot
1693
+ }) {
1694
+ return core.fileExists(`${projectRoot}/.nvmrc`);
1695
+ }
1696
+
1504
1697
  const questionNames = _objectSpread2(_objectSpread2({}, languageScaffolderPrompts.questionNames), questionNames$1);
1505
1698
 
1699
+ exports.lift = lift;
1506
1700
  exports.questionNames = questionNames;
1507
1701
  exports.scaffold = scaffolder;
1508
1702
  exports.scaffoldUnitTesting = scaffoldUnitTesting;
1703
+ exports.test = test;
1509
1704
  //# sourceMappingURL=index.cjs.js.map