@form8ion/javascript 15.8.2 → 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 (43) hide show
  1. package/README.md +2 -2
  2. package/lib/index.js +77 -64
  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/publishable/badges.js +2 -2
  33. package/src/project-type/publishable/badges.test.js +14 -5
  34. package/src/project-type/publishable/lifter.js +9 -4
  35. package/src/project-type/publishable/lifter.test.js +4 -4
  36. package/src/project-type/scaffolder.js +4 -4
  37. package/src/project-type/scaffolder.test.js +15 -16
  38. package/src/prompts/questions.js +3 -3
  39. package/src/prompts/questions.test.js +6 -5
  40. package/src/scaffolder.js +7 -8
  41. package/src/scaffolder.test.js +6 -5
  42. package/src/tester.js +2 -4
  43. 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) {
@@ -1037,14 +1041,14 @@ function buildNpmBadgeImageUrl(packageName, customRegistry) {
1037
1041
  return `https://img.shields.io/npm/v/${packageName}?${params}`;
1038
1042
  }
1039
1043
 
1040
- function scaffoldPublishableBadges({packageName, accessLevel, customRegistry}) {
1044
+ function scaffoldPublishableBadges({packageName, accessLevel, customRegistry, registryPage}) {
1041
1045
  return {
1042
1046
  consumer: {
1043
1047
  ...'public' === accessLevel && {
1044
1048
  npm: {
1045
1049
  img: buildNpmBadgeImageUrl(packageName, customRegistry),
1046
1050
  text: 'npm',
1047
- link: `https://www.npmjs.com/package/${packageName}`
1051
+ link: registryPage
1048
1052
  }
1049
1053
  }
1050
1054
  },
@@ -1083,17 +1087,22 @@ async function liftProvenance({projectRoot, packageDetails, customRegistry}) {
1083
1087
  async function liftPublishable({projectRoot, packageDetails, configs}) {
1084
1088
  const {name: packageName, publishConfig: {access: packageAccessLevel}} = packageDetails;
1085
1089
  const customRegistry = resolveRegistry(packageName, configs.registries);
1086
- const homepage = `https://npm.im/${packageName}`;
1090
+ const registryPage = `https://www.npmjs.com/package/${packageName}`;
1087
1091
 
1088
- await mergeIntoExistingPackageJson({projectRoot, config: {homepage}});
1092
+ await mergeIntoExistingPackageJson({projectRoot, config: {homepage: registryPage}});
1089
1093
 
1090
1094
  return deepmerge(
1091
1095
  await liftProvenance({packageDetails, projectRoot, customRegistry}),
1092
1096
  {
1093
- homepage,
1097
+ homepage: registryPage,
1094
1098
  dependencies: {javascript: {development: ['publint']}},
1095
1099
  scripts: {'lint:publish': 'publint --strict'},
1096
- badges: scaffoldPublishableBadges({packageName, accessLevel: packageAccessLevel, customRegistry})
1100
+ badges: scaffoldPublishableBadges({
1101
+ packageName,
1102
+ accessLevel: packageAccessLevel,
1103
+ customRegistry,
1104
+ registryPage
1105
+ })
1097
1106
  }
1098
1107
  );
1099
1108
  }
@@ -1215,8 +1224,8 @@ async function scaffoldPackageProjectType({
1215
1224
  dialect,
1216
1225
  provideExample,
1217
1226
  publishRegistry
1218
- }) {
1219
- info('Scaffolding Package Details');
1227
+ }, {logger}) {
1228
+ logger.info('Scaffolding Package Details');
1220
1229
 
1221
1230
  const packageAccessLevel = mapProjectVisibility({projectVisibility: visibility});
1222
1231
  const [detailsForBuild, publishableResults] = await Promise.all([
@@ -1284,15 +1293,15 @@ function liftPackage({projectRoot, packageDetails, configs}) {
1284
1293
  }
1285
1294
 
1286
1295
  async function projectIsPackage({
1287
- packageDetails: {exports: exports$1, publishConfig, bin, private: projectMarkedPrivate}
1296
+ packageDetails: {exports, publishConfig, bin, private: projectMarkedPrivate}
1288
1297
  }) {
1289
- return !projectMarkedPrivate && (!!exports$1 || (!!publishConfig && !bin));
1298
+ return !projectMarkedPrivate && (!!exports || (!!publishConfig && !bin));
1290
1299
  }
1291
1300
 
1292
1301
  const defaultBuildDirectory$1 = 'public';
1293
1302
 
1294
- async function scaffoldApplication({projectRoot}) {
1295
- info('Scaffolding Application Details');
1303
+ async function scaffoldApplication({projectRoot}, {logger}) {
1304
+ logger.info('Scaffolding Application Details');
1296
1305
 
1297
1306
  await mergeIntoExistingPackageJson({projectRoot, config: {private: true}});
1298
1307
 
@@ -1315,8 +1324,8 @@ function projectIsApplication({packageDetails}) {
1315
1324
  return !!packageDetails.private;
1316
1325
  }
1317
1326
 
1318
- async function scaffoldMonorepo({projectRoot}) {
1319
- info('Scaffolding Monorepo Details');
1327
+ async function scaffoldMonorepo({projectRoot}, {logger}) {
1328
+ logger.info('Scaffolding Monorepo Details');
1320
1329
 
1321
1330
  await mergeIntoExistingPackageJson({projectRoot, config: {private: true}});
1322
1331
 
@@ -1395,7 +1404,7 @@ async function scaffoldProjectType({
1395
1404
  dialect,
1396
1405
  provideExample,
1397
1406
  publishRegistry
1398
- }) {
1407
+ }, {logger}) {
1399
1408
  switch (projectType) {
1400
1409
  case projectTypes$1.PACKAGE:
1401
1410
  return scaffoldPackageProjectType({
@@ -1410,9 +1419,9 @@ async function scaffoldProjectType({
1410
1419
  dialect,
1411
1420
  provideExample,
1412
1421
  publishRegistry
1413
- });
1422
+ }, {logger});
1414
1423
  case projectTypes$1.APPLICATION:
1415
- return scaffoldApplication({projectRoot});
1424
+ return scaffoldApplication({projectRoot}, {logger});
1416
1425
  case projectTypes$1.CLI:
1417
1426
  return scaffoldCli({
1418
1427
  visibility,
@@ -1423,7 +1432,7 @@ async function scaffoldProjectType({
1423
1432
  packageBundlers
1424
1433
  });
1425
1434
  case projectTypes$1.MONOREPO:
1426
- return scaffoldMonorepo({projectRoot});
1435
+ return scaffoldMonorepo({projectRoot}, {logger});
1427
1436
  case 'Other':
1428
1437
  return {};
1429
1438
  default:
@@ -1680,8 +1689,8 @@ async function scaffoldCodeStyle({
1680
1689
  ].filter(Boolean)));
1681
1690
  }
1682
1691
 
1683
- function liftCodeStyle(options) {
1684
- return applyEnhancers({options, enhancers: [eslintPlugin]});
1692
+ function liftCodeStyle(options, dependencies) {
1693
+ return applyEnhancers({options, enhancers: [eslintPlugin], dependencies});
1685
1694
  }
1686
1695
 
1687
1696
  function codeStyleConfigured(options) {
@@ -1695,8 +1704,8 @@ var codeStylePlugin = /*#__PURE__*/Object.freeze({
1695
1704
  test: codeStyleConfigured
1696
1705
  });
1697
1706
 
1698
- async function scaffoldJavascript(options) {
1699
- info('Initializing JavaScript project');
1707
+ async function scaffoldJavascript(options, {logger}) {
1708
+ logger.info('Initializing JavaScript project');
1700
1709
 
1701
1710
  const {
1702
1711
  projectRoot,
@@ -1732,9 +1741,9 @@ async function scaffoldJavascript(options) {
1732
1741
  provideExample,
1733
1742
  packageManager,
1734
1743
  dialect
1735
- } = await prompt(ciServices, hosts, visibility, vcs, decisions, configs, pathWithinParent);
1744
+ } = await prompt(ciServices, hosts, visibility, vcs, decisions, configs, pathWithinParent, {logger});
1736
1745
 
1737
- info('Writing project files', {level: 'secondary'});
1746
+ logger.info('Writing project files', {level: 'secondary'});
1738
1747
 
1739
1748
  const {packageName} = await scaffoldPackage({
1740
1749
  projectRoot,
@@ -1744,7 +1753,7 @@ async function scaffoldJavascript(options) {
1744
1753
  license,
1745
1754
  author,
1746
1755
  description
1747
- });
1756
+ }, {logger});
1748
1757
  const projectTypeResults = await scaffoldProjectType({
1749
1758
  projectType,
1750
1759
  projectRoot,
@@ -1758,7 +1767,7 @@ async function scaffoldJavascript(options) {
1758
1767
  dialect,
1759
1768
  provideExample,
1760
1769
  publishRegistry: configs.registries.publish
1761
- });
1770
+ }, {logger});
1762
1771
  const verificationResults = await scaffoldVerification({
1763
1772
  projectRoot,
1764
1773
  dialect,
@@ -1772,7 +1781,7 @@ async function scaffoldJavascript(options) {
1772
1781
  pathWithinParent
1773
1782
  });
1774
1783
  const [nodeVersion, npmResults, dialectResults, codeStyleResults] = await Promise.all([
1775
- scaffoldNodeVersion({projectRoot, nodeVersionCategory}),
1784
+ scaffoldNodeVersion({projectRoot, nodeVersionCategory}, {logger}),
1776
1785
  scaffoldNpmConfiguration({projectType, projectRoot}),
1777
1786
  scaffoldDialect({
1778
1787
  dialect,
@@ -1908,8 +1917,8 @@ async function liftJavaScript({
1908
1917
  pathWithinParent,
1909
1918
  enhancers = {},
1910
1919
  configs = {}
1911
- }) {
1912
- info('Lifting JavaScript-specific details');
1920
+ }, dependencies) {
1921
+ dependencies.logger.info('Lifting JavaScript-specific details');
1913
1922
 
1914
1923
  const [packageManager, packageContents] = await Promise.all([
1915
1924
  resolveCurrentPackageManager({projectRoot, packageManager: results.packageManager}),
@@ -1931,15 +1940,19 @@ async function liftJavaScript({
1931
1940
  packageManagers,
1932
1941
  registriesPlugin
1933
1942
  },
1934
- options: {packageManager, projectRoot, vcs, packageDetails: JSON.parse(packageContents), configs}
1943
+ options: {packageManager, projectRoot, vcs, packageDetails: JSON.parse(packageContents), configs},
1944
+ dependencies
1935
1945
  });
1936
1946
 
1937
- await liftPackageJson(deepmerge.all([{projectRoot, packageManager, vcs, pathWithinParent}, enhancerResults]));
1947
+ await liftPackageJson(
1948
+ deepmerge.all([{projectRoot, packageManager, vcs, pathWithinParent}, enhancerResults]),
1949
+ dependencies
1950
+ );
1938
1951
 
1939
1952
  return enhancerResults;
1940
1953
  }
1941
1954
 
1942
- async function projectUsesJavaScript({projectRoot}) {
1955
+ async function projectUsesJavaScript({projectRoot}, {logger}) {
1943
1956
  const [nvmFound, jsPackageManagerFound] = await Promise.all([
1944
1957
  nodeVersionMangerInUse({projectRoot}),
1945
1958
  packageManagerInUse({projectRoot})
@@ -1947,7 +1960,7 @@ async function projectUsesJavaScript({projectRoot}) {
1947
1960
 
1948
1961
  const jsProjectFound = nvmFound || jsPackageManagerFound;
1949
1962
 
1950
- if (jsProjectFound) info('JavaScript Project Detected');
1963
+ if (jsProjectFound) logger.info('JavaScript Project Detected');
1951
1964
 
1952
1965
  return jsProjectFound;
1953
1966
  }