@form8ion/javascript 15.8.3 → 16.0.0-beta.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.
Files changed (39) hide show
  1. package/README.md +2 -2
  2. package/lib/index.js +66 -58
  3. package/lib/index.js.map +1 -1
  4. package/package.json +17 -17
  5. package/src/code-style/lifter.js +2 -2
  6. package/src/dependencies/installer.js +5 -5
  7. package/src/dependencies/installer.test.js +8 -22
  8. package/src/dependencies/processor.js +10 -8
  9. package/src/dependencies/processor.test.js +31 -18
  10. package/src/dependencies/remover.js +2 -3
  11. package/src/dependencies/remover.test.js +4 -2
  12. package/src/lifter.js +8 -5
  13. package/src/lifter.test.js +12 -11
  14. package/src/node-version/scaffolder.js +4 -5
  15. package/src/node-version/scaffolder.test.js +5 -4
  16. package/src/node-version/tasks.js +4 -6
  17. package/src/node-version/tasks.test.js +5 -8
  18. package/src/options/schemas.js +2 -1
  19. package/src/options/schemas.test.js +11 -5
  20. package/src/package/lifter.js +3 -4
  21. package/src/package/lifter.test.js +8 -4
  22. package/src/package/scaffolder.js +2 -3
  23. package/src/package/scaffolder.test.js +3 -1
  24. package/src/project-type/application/scaffolder.js +2 -3
  25. package/src/project-type/application/scaffolder.test.js +3 -5
  26. package/src/project-type/monorepo/scaffolder.js +2 -3
  27. package/src/project-type/monorepo/scaffolder.test.js +3 -6
  28. package/src/project-type/package/scaffolder.js +2 -3
  29. package/src/project-type/package/scaffolder.test.js +6 -5
  30. package/src/project-type/publishable/access-level.js +1 -1
  31. package/src/project-type/publishable/access-level.test.js +5 -3
  32. package/src/project-type/scaffolder.js +4 -4
  33. package/src/project-type/scaffolder.test.js +15 -16
  34. package/src/prompts/questions.js +3 -3
  35. package/src/prompts/questions.test.js +6 -5
  36. package/src/scaffolder.js +7 -8
  37. package/src/scaffolder.test.js +6 -5
  38. package/src/tester.js +2 -4
  39. package/src/tester.test.js +5 -8
package/README.md CHANGED
@@ -175,7 +175,7 @@ $ npm test
175
175
 
176
176
  [renovate-link]: https://renovatebot.com
177
177
 
178
- [renovate-badge]: https://img.shields.io/badge/renovate-enabled-brightgreen.svg?logo=renovatebot
178
+ [renovate-badge]: https://img.shields.io/badge/renovate-enabled-brightgreen.svg?logo=renovate
179
179
 
180
180
  [github-actions-ci-link]: https://github.com/form8ion/javascript/actions?query=workflow%3A%22Node.js+CI%22+branch%3Amaster
181
181
 
@@ -197,6 +197,6 @@ $ npm test
197
197
 
198
198
  [coverage-link]: https://codecov.io/github/form8ion/javascript
199
199
 
200
- [coverage-badge]: https://img.shields.io/codecov/c/github/form8ion/javascript?logo=codecov
200
+ [coverage-badge]: https://img.shields.io/codecov/c/github/form8ion/javascript/master?logo=codecov
201
201
 
202
202
  [slsa-badge]: https://slsa.dev/images/gh-badge-level2.svg
package/lib/index.js CHANGED
@@ -1,11 +1,10 @@
1
1
  import { questionNames as questionNames$2, questions } from '@travi/language-scaffolder-prompts';
2
2
  import deepmerge from 'deepmerge';
3
- import { warn, info, error } from '@travi/cli-messages';
4
3
  import { scaffoldChoice, dialects as dialects$1, projectTypes as projectTypes$1, packageManagers as packageManagers$1, writePackageJson, PROD_DEPENDENCY_TYPE, DEV_DEPENDENCY_TYPE, mergeIntoExistingPackageJson } from '@form8ion/javascript-core';
5
4
  import * as commitConventionPlugin from '@form8ion/commit-convention';
6
5
  import { scaffold as scaffold$5 } from '@form8ion/commit-convention';
7
6
  import joi from 'joi';
8
- import { fileExists, directoryExists, optionsSchemas, validateOptions, fileTypes, loadConfigFile, writeConfigFile, applyEnhancers } from '@form8ion/core';
7
+ import { fileExists, directoryExists, optionsSchemas, validateOptions, visibilityOptions, fileTypes, loadConfigFile, writeConfigFile, applyEnhancers } from '@form8ion/core';
9
8
  import { prompt as prompt$1 } from '@form8ion/overridable-prompts';
10
9
  import { execa } from 'execa';
11
10
  import npmConf from 'npm-conf';
@@ -145,7 +144,7 @@ const nameBasedConfigSchema = joi.object({
145
144
 
146
145
  const registriesSchema = joi.object().pattern(joi.string(), joi.string().uri()).default({});
147
146
 
148
- const visibilitySchema = joi.string().valid('Public', 'Private').required();
147
+ const visibilitySchema = joi.string().valid(...Object.keys(visibilityOptions)).required();
149
148
 
150
149
  const projectNameSchema = joi.string().regex(/^@\w*\//, {invert: true}).required();
151
150
 
@@ -270,7 +269,8 @@ async function prompt(
270
269
  vcs,
271
270
  decisions,
272
271
  configs,
273
- pathWithinParent
272
+ pathWithinParent,
273
+ {logger}
274
274
  ) {
275
275
  const npmConf$1 = npmConf();
276
276
 
@@ -279,7 +279,7 @@ async function prompt(
279
279
  maybeLoggedInNpmUsername = (await execa('npm', ['whoami'])).stdout;
280
280
  } catch (failedExecutionResult) {
281
281
  if (!decisions[questionNames$1.SCOPE]) {
282
- warn('No logged in user found with `npm whoami`. Login with `npm login` '
282
+ logger.warn('No logged in user found with `npm whoami`. Login with `npm login` '
283
283
  + 'to use your npm account name as the package scope default.');
284
284
  }
285
285
  }
@@ -657,8 +657,8 @@ $ ${packageManager} test
657
657
  };
658
658
  }
659
659
 
660
- async function determineLatestVersionOf(nodeVersionCategory) {
661
- info('Determining version of node', {level: 'secondary'});
660
+ async function determineLatestVersionOf(nodeVersionCategory, {logger}) {
661
+ logger.info('Determining version of node', {level: 'secondary'});
662
662
 
663
663
  const {stdout: nvmLsOutput} = await execa(
664
664
  `. ~/.nvm/nvm.sh && nvm ls-remote${('LTS' === nodeVersionCategory) ? ' --lts' : ''}`,
@@ -671,25 +671,25 @@ async function determineLatestVersionOf(nodeVersionCategory) {
671
671
  return lsLine.match(/(v[0-9]+)\.[0-9]+\.[0-9]+/)[1];
672
672
  }
673
673
 
674
- function install(nodeVersionCategory) {
675
- info(`Installing ${nodeVersionCategory} version of node using nvm`, {level: 'secondary'});
674
+ function install(nodeVersionCategory, {logger}) {
675
+ logger.info(`Installing ${nodeVersionCategory} version of node using nvm`, {level: 'secondary'});
676
676
 
677
677
  const subprocess = execa('. ~/.nvm/nvm.sh && nvm install', {shell: true});
678
678
  subprocess.stdout.pipe(process.stdout);
679
679
  return subprocess;
680
680
  }
681
681
 
682
- async function scaffoldNodeVersion({projectRoot, nodeVersionCategory}) {
682
+ async function scaffoldNodeVersion({projectRoot, nodeVersionCategory}, {logger}) {
683
683
  if (!nodeVersionCategory) return undefined;
684
684
 
685
685
  const lowerCaseCategory = nodeVersionCategory.toLowerCase();
686
- info(`Configuring ${lowerCaseCategory} version of node`);
686
+ logger.info(`Configuring ${lowerCaseCategory} version of node`);
687
687
 
688
- const version = await determineLatestVersionOf(nodeVersionCategory);
688
+ const version = await determineLatestVersionOf(nodeVersionCategory, {logger});
689
689
 
690
690
  await promises.writeFile(`${projectRoot}/.nvmrc`, version);
691
691
 
692
- await install(nodeVersionCategory);
692
+ await install(nodeVersionCategory, {logger});
693
693
 
694
694
  return version;
695
695
  }
@@ -741,8 +741,8 @@ async function scaffoldPackage({
741
741
  license,
742
742
  author,
743
743
  description
744
- }) {
745
- info('Configuring package.json');
744
+ }, {logger}) {
745
+ logger.info('Configuring package.json');
746
746
 
747
747
  const packageName = determinePackageName(projectName, scope);
748
748
 
@@ -845,10 +845,11 @@ async function installDependencies(
845
845
  dependencies,
846
846
  dependenciesType,
847
847
  projectRoot,
848
- packageManager = packageManagers$1.NPM
848
+ packageManager,
849
+ {logger}
849
850
  ) {
850
851
  if (dependencies.length) {
851
- info(`Installing ${dependenciesType} dependencies`, {level: 'secondary'});
852
+ logger.info(`Installing ${dependenciesType} dependencies`, {level: 'secondary'});
852
853
 
853
854
  await execa(
854
855
  `. ~/.nvm/nvm.sh && nvm use && ${packageManager} ${
@@ -858,19 +859,22 @@ async function installDependencies(
858
859
  }`,
859
860
  {shell: true, cwd: projectRoot}
860
861
  );
861
- } else warn(`No ${dependenciesType} dependencies to install`);
862
+ } else logger.warn(`No ${dependenciesType} dependencies to install`);
862
863
  }
863
864
 
864
- async function removeDependencies({packageManager, dependencies}) {
865
+ async function removeDependencies({packageManager, dependencies}, {logger}) {
865
866
  if (dependencies.length) {
866
- info('Removing dependencies dependencies', {level: 'secondary'});
867
+ logger.info('Removing dependencies dependencies', {level: 'secondary'});
867
868
 
868
869
  await execa(packageManager, ['remove', ...dependencies]);
869
870
  }
870
871
  }
871
872
 
872
- async function processDependencies({dependencies = {}, devDependencies, projectRoot, packageManager}) {
873
- info('Processing dependencies');
873
+ async function processDependencies(
874
+ {dependencies = {}, devDependencies, projectRoot, packageManager},
875
+ {logger}
876
+ ) {
877
+ logger.info('Processing dependencies');
874
878
 
875
879
  if (Array.isArray(devDependencies)) {
876
880
  throw new Error(
@@ -885,12 +889,12 @@ async function processDependencies({dependencies = {}, devDependencies, projectR
885
889
  const {javascript: {production = [], development = [], remove: dependenciesToRemove = []} = {}} = dependencies;
886
890
 
887
891
  try {
888
- await installDependencies(production, PROD_DEPENDENCY_TYPE, projectRoot, packageManager);
889
- await installDependencies(development, DEV_DEPENDENCY_TYPE, projectRoot, packageManager);
890
- await removeDependencies({packageManager, dependencies: dependenciesToRemove});
892
+ await installDependencies(production, PROD_DEPENDENCY_TYPE, projectRoot, packageManager, {logger});
893
+ await installDependencies(development, DEV_DEPENDENCY_TYPE, projectRoot, packageManager, {logger});
894
+ await removeDependencies({packageManager, dependencies: dependenciesToRemove}, {logger});
891
895
  } catch (e) {
892
- error('Failed to update dependencies');
893
- error(e, {level: 'secondary'});
896
+ logger.error('Failed to update dependencies');
897
+ logger.error(e, {level: 'secondary'});
894
898
  }
895
899
  }
896
900
 
@@ -982,8 +986,8 @@ async function liftPackageJson({
982
986
  packageManager,
983
987
  vcs,
984
988
  pathWithinParent
985
- }) {
986
- info('Updating `package.json`', {level: 'secondary'});
989
+ }, {logger}) {
990
+ logger.info('Updating `package.json`', {level: 'secondary'});
987
991
 
988
992
  const existingPackageJsonContents = JSON.parse(await promises.readFile(`${projectRoot}/package.json`, 'utf-8'));
989
993
  const {scripts: liftedScripts, dependencies: scriptDependencies} = liftScripts({
@@ -1008,11 +1012,11 @@ async function liftPackageJson({
1008
1012
  devDependencies,
1009
1013
  projectRoot,
1010
1014
  packageManager
1011
- });
1015
+ }, {logger});
1012
1016
  }
1013
1017
 
1014
1018
  function mapProjectVisibility({projectVisibility}) {
1015
- return 'Public' === projectVisibility ? 'public' : 'restricted';
1019
+ return 'OSS' === projectVisibility ? 'public' : 'restricted';
1016
1020
  }
1017
1021
 
1018
1022
  function isScope(firstPart) {
@@ -1220,8 +1224,8 @@ async function scaffoldPackageProjectType({
1220
1224
  dialect,
1221
1225
  provideExample,
1222
1226
  publishRegistry
1223
- }) {
1224
- info('Scaffolding Package Details');
1227
+ }, {logger}) {
1228
+ logger.info('Scaffolding Package Details');
1225
1229
 
1226
1230
  const packageAccessLevel = mapProjectVisibility({projectVisibility: visibility});
1227
1231
  const [detailsForBuild, publishableResults] = await Promise.all([
@@ -1289,15 +1293,15 @@ function liftPackage({projectRoot, packageDetails, configs}) {
1289
1293
  }
1290
1294
 
1291
1295
  async function projectIsPackage({
1292
- packageDetails: {exports: exports$1, publishConfig, bin, private: projectMarkedPrivate}
1296
+ packageDetails: {exports, publishConfig, bin, private: projectMarkedPrivate}
1293
1297
  }) {
1294
- return !projectMarkedPrivate && (!!exports$1 || (!!publishConfig && !bin));
1298
+ return !projectMarkedPrivate && (!!exports || (!!publishConfig && !bin));
1295
1299
  }
1296
1300
 
1297
1301
  const defaultBuildDirectory$1 = 'public';
1298
1302
 
1299
- async function scaffoldApplication({projectRoot}) {
1300
- info('Scaffolding Application Details');
1303
+ async function scaffoldApplication({projectRoot}, {logger}) {
1304
+ logger.info('Scaffolding Application Details');
1301
1305
 
1302
1306
  await mergeIntoExistingPackageJson({projectRoot, config: {private: true}});
1303
1307
 
@@ -1320,8 +1324,8 @@ function projectIsApplication({packageDetails}) {
1320
1324
  return !!packageDetails.private;
1321
1325
  }
1322
1326
 
1323
- async function scaffoldMonorepo({projectRoot}) {
1324
- info('Scaffolding Monorepo Details');
1327
+ async function scaffoldMonorepo({projectRoot}, {logger}) {
1328
+ logger.info('Scaffolding Monorepo Details');
1325
1329
 
1326
1330
  await mergeIntoExistingPackageJson({projectRoot, config: {private: true}});
1327
1331
 
@@ -1400,7 +1404,7 @@ async function scaffoldProjectType({
1400
1404
  dialect,
1401
1405
  provideExample,
1402
1406
  publishRegistry
1403
- }) {
1407
+ }, {logger}) {
1404
1408
  switch (projectType) {
1405
1409
  case projectTypes$1.PACKAGE:
1406
1410
  return scaffoldPackageProjectType({
@@ -1415,9 +1419,9 @@ async function scaffoldProjectType({
1415
1419
  dialect,
1416
1420
  provideExample,
1417
1421
  publishRegistry
1418
- });
1422
+ }, {logger});
1419
1423
  case projectTypes$1.APPLICATION:
1420
- return scaffoldApplication({projectRoot});
1424
+ return scaffoldApplication({projectRoot}, {logger});
1421
1425
  case projectTypes$1.CLI:
1422
1426
  return scaffoldCli({
1423
1427
  visibility,
@@ -1428,7 +1432,7 @@ async function scaffoldProjectType({
1428
1432
  packageBundlers
1429
1433
  });
1430
1434
  case projectTypes$1.MONOREPO:
1431
- return scaffoldMonorepo({projectRoot});
1435
+ return scaffoldMonorepo({projectRoot}, {logger});
1432
1436
  case 'Other':
1433
1437
  return {};
1434
1438
  default:
@@ -1685,8 +1689,8 @@ async function scaffoldCodeStyle({
1685
1689
  ].filter(Boolean)));
1686
1690
  }
1687
1691
 
1688
- function liftCodeStyle(options) {
1689
- return applyEnhancers({options, enhancers: [eslintPlugin]});
1692
+ function liftCodeStyle(options, dependencies) {
1693
+ return applyEnhancers({options, enhancers: [eslintPlugin], dependencies});
1690
1694
  }
1691
1695
 
1692
1696
  function codeStyleConfigured(options) {
@@ -1700,8 +1704,8 @@ var codeStylePlugin = /*#__PURE__*/Object.freeze({
1700
1704
  test: codeStyleConfigured
1701
1705
  });
1702
1706
 
1703
- async function scaffoldJavascript(options) {
1704
- info('Initializing JavaScript project');
1707
+ async function scaffoldJavascript(options, {logger}) {
1708
+ logger.info('Initializing JavaScript project');
1705
1709
 
1706
1710
  const {
1707
1711
  projectRoot,
@@ -1737,9 +1741,9 @@ async function scaffoldJavascript(options) {
1737
1741
  provideExample,
1738
1742
  packageManager,
1739
1743
  dialect
1740
- } = await prompt(ciServices, hosts, visibility, vcs, decisions, configs, pathWithinParent);
1744
+ } = await prompt(ciServices, hosts, visibility, vcs, decisions, configs, pathWithinParent, {logger});
1741
1745
 
1742
- info('Writing project files', {level: 'secondary'});
1746
+ logger.info('Writing project files', {level: 'secondary'});
1743
1747
 
1744
1748
  const {packageName} = await scaffoldPackage({
1745
1749
  projectRoot,
@@ -1749,7 +1753,7 @@ async function scaffoldJavascript(options) {
1749
1753
  license,
1750
1754
  author,
1751
1755
  description
1752
- });
1756
+ }, {logger});
1753
1757
  const projectTypeResults = await scaffoldProjectType({
1754
1758
  projectType,
1755
1759
  projectRoot,
@@ -1763,7 +1767,7 @@ async function scaffoldJavascript(options) {
1763
1767
  dialect,
1764
1768
  provideExample,
1765
1769
  publishRegistry: configs.registries.publish
1766
- });
1770
+ }, {logger});
1767
1771
  const verificationResults = await scaffoldVerification({
1768
1772
  projectRoot,
1769
1773
  dialect,
@@ -1777,7 +1781,7 @@ async function scaffoldJavascript(options) {
1777
1781
  pathWithinParent
1778
1782
  });
1779
1783
  const [nodeVersion, npmResults, dialectResults, codeStyleResults] = await Promise.all([
1780
- scaffoldNodeVersion({projectRoot, nodeVersionCategory}),
1784
+ scaffoldNodeVersion({projectRoot, nodeVersionCategory}, {logger}),
1781
1785
  scaffoldNpmConfiguration({projectType, projectRoot}),
1782
1786
  scaffoldDialect({
1783
1787
  dialect,
@@ -1913,8 +1917,8 @@ async function liftJavaScript({
1913
1917
  pathWithinParent,
1914
1918
  enhancers = {},
1915
1919
  configs = {}
1916
- }) {
1917
- info('Lifting JavaScript-specific details');
1920
+ }, dependencies) {
1921
+ dependencies.logger.info('Lifting JavaScript-specific details');
1918
1922
 
1919
1923
  const [packageManager, packageContents] = await Promise.all([
1920
1924
  resolveCurrentPackageManager({projectRoot, packageManager: results.packageManager}),
@@ -1936,15 +1940,19 @@ async function liftJavaScript({
1936
1940
  packageManagers,
1937
1941
  registriesPlugin
1938
1942
  },
1939
- options: {packageManager, projectRoot, vcs, packageDetails: JSON.parse(packageContents), configs}
1943
+ options: {packageManager, projectRoot, vcs, packageDetails: JSON.parse(packageContents), configs},
1944
+ dependencies
1940
1945
  });
1941
1946
 
1942
- await liftPackageJson(deepmerge.all([{projectRoot, packageManager, vcs, pathWithinParent}, enhancerResults]));
1947
+ await liftPackageJson(
1948
+ deepmerge.all([{projectRoot, packageManager, vcs, pathWithinParent}, enhancerResults]),
1949
+ dependencies
1950
+ );
1943
1951
 
1944
1952
  return enhancerResults;
1945
1953
  }
1946
1954
 
1947
- async function projectUsesJavaScript({projectRoot}) {
1955
+ async function projectUsesJavaScript({projectRoot}, {logger}) {
1948
1956
  const [nvmFound, jsPackageManagerFound] = await Promise.all([
1949
1957
  nodeVersionMangerInUse({projectRoot}),
1950
1958
  packageManagerInUse({projectRoot})
@@ -1952,7 +1960,7 @@ async function projectUsesJavaScript({projectRoot}) {
1952
1960
 
1953
1961
  const jsProjectFound = nvmFound || jsPackageManagerFound;
1954
1962
 
1955
- if (jsProjectFound) info('JavaScript Project Detected');
1963
+ if (jsProjectFound) logger.info('JavaScript Project Detected');
1956
1964
 
1957
1965
  return jsProjectFound;
1958
1966
  }