@form8ion/javascript 15.8.3 → 16.0.0-beta.2

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 (46) hide show
  1. package/README.md +4 -4
  2. package/example.js +2 -2
  3. package/lib/index.js +77 -63
  4. package/lib/index.js.map +1 -1
  5. package/package.json +18 -18
  6. package/src/code-style/lifter.js +2 -2
  7. package/src/dependencies/installer.js +5 -5
  8. package/src/dependencies/installer.test.js +8 -22
  9. package/src/dependencies/processor.js +10 -8
  10. package/src/dependencies/processor.test.js +31 -18
  11. package/src/dependencies/remover.js +2 -3
  12. package/src/dependencies/remover.test.js +4 -2
  13. package/src/lifter.js +8 -5
  14. package/src/lifter.test.js +12 -11
  15. package/src/node-version/scaffolder.js +4 -5
  16. package/src/node-version/scaffolder.test.js +5 -4
  17. package/src/node-version/tasks.js +4 -6
  18. package/src/node-version/tasks.test.js +5 -8
  19. package/src/options/schemas.js +2 -1
  20. package/src/options/schemas.test.js +12 -6
  21. package/src/options/validator.js +2 -1
  22. package/src/options/validator.test.js +2 -1
  23. package/src/package/lifter.js +3 -4
  24. package/src/package/lifter.test.js +8 -4
  25. package/src/package/scaffolder.js +2 -3
  26. package/src/package/scaffolder.test.js +3 -1
  27. package/src/project-type/application/scaffolder.js +2 -3
  28. package/src/project-type/application/scaffolder.test.js +3 -5
  29. package/src/project-type/monorepo/scaffolder.js +2 -3
  30. package/src/project-type/monorepo/scaffolder.test.js +3 -6
  31. package/src/project-type/package/scaffolder.js +2 -3
  32. package/src/project-type/package/scaffolder.test.js +6 -5
  33. package/src/project-type/publishable/access-level.js +1 -1
  34. package/src/project-type/publishable/access-level.test.js +6 -4
  35. package/src/project-type/scaffolder.js +4 -4
  36. package/src/project-type/scaffolder.test.js +15 -16
  37. package/src/prompts/conditionals.js +1 -1
  38. package/src/prompts/conditionals.test.js +27 -6
  39. package/src/prompts/questions.js +4 -4
  40. package/src/prompts/questions.test.js +21 -6
  41. package/src/prompts/validators.js +7 -2
  42. package/src/prompts/validators.test.js +9 -6
  43. package/src/scaffolder.js +7 -8
  44. package/src/scaffolder.test.js +6 -5
  45. package/src/tester.js +2 -4
  46. package/src/tester.test.js +5 -8
package/README.md CHANGED
@@ -65,7 +65,7 @@ const projectRoot = process.cwd();
65
65
  await scaffoldJavaScript({
66
66
  projectRoot,
67
67
  projectName: 'project-name',
68
- visibility: 'Public',
68
+ visibility: 'OSS',
69
69
  license: 'MIT',
70
70
  configs: {
71
71
  eslint: {scope: `@${accountName}`},
@@ -121,7 +121,7 @@ await scaffoldUnitTesting({
121
121
  Mocha: {scaffold: options => options},
122
122
  Jest: {scaffold: options => options}
123
123
  },
124
- visibility: 'Public',
124
+ visibility: 'OSS',
125
125
  vcs: {host: 'GitHub', owner: 'foo', name: 'bar'},
126
126
  decisions: {[questionNames.UNIT_TEST_FRAMEWORK]: 'Mocha'}
127
127
  });
@@ -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/example.js CHANGED
@@ -34,7 +34,7 @@ const projectRoot = process.cwd();
34
34
  await scaffoldJavaScript({
35
35
  projectRoot,
36
36
  projectName: 'project-name',
37
- visibility: 'Public',
37
+ visibility: 'OSS',
38
38
  license: 'MIT',
39
39
  configs: {
40
40
  eslint: {scope: `@${accountName}`},
@@ -90,7 +90,7 @@ await scaffoldUnitTesting({
90
90
  Mocha: {scaffold: options => options},
91
91
  Jest: {scaffold: options => options}
92
92
  },
93
- visibility: 'Public',
93
+ visibility: 'OSS',
94
94
  vcs: {host: 'GitHub', owner: 'foo', name: 'bar'},
95
95
  decisions: {[questionNames.UNIT_TEST_FRAMEWORK]: 'Mocha'}
96
96
  });
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
 
@@ -182,7 +181,8 @@ function validate(options) {
182
181
  packageTypes: pluginsSchema,
183
182
  monorepoTypes: pluginsSchema,
184
183
  hosts: pluginsSchema,
185
- ciServices: pluginsSchema
184
+ ciServices: pluginsSchema,
185
+ registries: pluginsSchema
186
186
  }
187
187
  }).required();
188
188
 
@@ -211,7 +211,7 @@ function projectIsApplication$1(answers) {
211
211
  }
212
212
 
213
213
  function packageShouldBeScoped(visibility, answers) {
214
- return 'Private' === visibility || answers[questionNames$1.SHOULD_BE_SCOPED];
214
+ return ['ISS', 'CS'].includes(visibility) || answers[questionNames$1.SHOULD_BE_SCOPED];
215
215
  }
216
216
 
217
217
  function willBePublishedToNpm(answers) {
@@ -235,8 +235,13 @@ function lintingPromptShouldBePresented({
235
235
 
236
236
  function scope(visibility) {
237
237
  return input => {
238
- if (!input && 'Private' === visibility) {
239
- return 'Private packages must be scoped (https://docs.npmjs.com/private-modules/intro#setting-up-your-package)';
238
+ if (!input) {
239
+ if ('CS' === visibility) {
240
+ return 'Closed source packages must be scoped';
241
+ }
242
+ if ('ISS' === visibility) {
243
+ return 'Inner source packages must be scoped';
244
+ }
240
245
  }
241
246
 
242
247
  return true;
@@ -270,7 +275,8 @@ async function prompt(
270
275
  vcs,
271
276
  decisions,
272
277
  configs,
273
- pathWithinParent
278
+ pathWithinParent,
279
+ {logger}
274
280
  ) {
275
281
  const npmConf$1 = npmConf();
276
282
 
@@ -279,7 +285,7 @@ async function prompt(
279
285
  maybeLoggedInNpmUsername = (await execa('npm', ['whoami'])).stdout;
280
286
  } catch (failedExecutionResult) {
281
287
  if (!decisions[questionNames$1.SCOPE]) {
282
- warn('No logged in user found with `npm whoami`. Login with `npm login` '
288
+ logger.warn('No logged in user found with `npm whoami`. Login with `npm login` '
283
289
  + 'to use your npm account name as the package scope default.');
284
290
  }
285
291
  }
@@ -328,7 +334,7 @@ async function prompt(
328
334
  choices: [...Object.values(projectTypes$1), 'Other'],
329
335
  default: projectTypes$1.PACKAGE
330
336
  },
331
- ...'Private' === visibility ? [] : [{
337
+ ...['ISS', 'CS'].includes(visibility) ? [] : [{
332
338
  name: questionNames$1.SHOULD_BE_SCOPED,
333
339
  message: 'Should this package be scoped?',
334
340
  type: 'confirm',
@@ -657,8 +663,8 @@ $ ${packageManager} test
657
663
  };
658
664
  }
659
665
 
660
- async function determineLatestVersionOf(nodeVersionCategory) {
661
- info('Determining version of node', {level: 'secondary'});
666
+ async function determineLatestVersionOf(nodeVersionCategory, {logger}) {
667
+ logger.info('Determining version of node', {level: 'secondary'});
662
668
 
663
669
  const {stdout: nvmLsOutput} = await execa(
664
670
  `. ~/.nvm/nvm.sh && nvm ls-remote${('LTS' === nodeVersionCategory) ? ' --lts' : ''}`,
@@ -671,25 +677,25 @@ async function determineLatestVersionOf(nodeVersionCategory) {
671
677
  return lsLine.match(/(v[0-9]+)\.[0-9]+\.[0-9]+/)[1];
672
678
  }
673
679
 
674
- function install(nodeVersionCategory) {
675
- info(`Installing ${nodeVersionCategory} version of node using nvm`, {level: 'secondary'});
680
+ function install(nodeVersionCategory, {logger}) {
681
+ logger.info(`Installing ${nodeVersionCategory} version of node using nvm`, {level: 'secondary'});
676
682
 
677
683
  const subprocess = execa('. ~/.nvm/nvm.sh && nvm install', {shell: true});
678
684
  subprocess.stdout.pipe(process.stdout);
679
685
  return subprocess;
680
686
  }
681
687
 
682
- async function scaffoldNodeVersion({projectRoot, nodeVersionCategory}) {
688
+ async function scaffoldNodeVersion({projectRoot, nodeVersionCategory}, {logger}) {
683
689
  if (!nodeVersionCategory) return undefined;
684
690
 
685
691
  const lowerCaseCategory = nodeVersionCategory.toLowerCase();
686
- info(`Configuring ${lowerCaseCategory} version of node`);
692
+ logger.info(`Configuring ${lowerCaseCategory} version of node`);
687
693
 
688
- const version = await determineLatestVersionOf(nodeVersionCategory);
694
+ const version = await determineLatestVersionOf(nodeVersionCategory, {logger});
689
695
 
690
696
  await promises.writeFile(`${projectRoot}/.nvmrc`, version);
691
697
 
692
- await install(nodeVersionCategory);
698
+ await install(nodeVersionCategory, {logger});
693
699
 
694
700
  return version;
695
701
  }
@@ -741,8 +747,8 @@ async function scaffoldPackage({
741
747
  license,
742
748
  author,
743
749
  description
744
- }) {
745
- info('Configuring package.json');
750
+ }, {logger}) {
751
+ logger.info('Configuring package.json');
746
752
 
747
753
  const packageName = determinePackageName(projectName, scope);
748
754
 
@@ -845,10 +851,11 @@ async function installDependencies(
845
851
  dependencies,
846
852
  dependenciesType,
847
853
  projectRoot,
848
- packageManager = packageManagers$1.NPM
854
+ packageManager,
855
+ {logger}
849
856
  ) {
850
857
  if (dependencies.length) {
851
- info(`Installing ${dependenciesType} dependencies`, {level: 'secondary'});
858
+ logger.info(`Installing ${dependenciesType} dependencies`, {level: 'secondary'});
852
859
 
853
860
  await execa(
854
861
  `. ~/.nvm/nvm.sh && nvm use && ${packageManager} ${
@@ -858,19 +865,22 @@ async function installDependencies(
858
865
  }`,
859
866
  {shell: true, cwd: projectRoot}
860
867
  );
861
- } else warn(`No ${dependenciesType} dependencies to install`);
868
+ } else logger.warn(`No ${dependenciesType} dependencies to install`);
862
869
  }
863
870
 
864
- async function removeDependencies({packageManager, dependencies}) {
871
+ async function removeDependencies({packageManager, dependencies}, {logger}) {
865
872
  if (dependencies.length) {
866
- info('Removing dependencies dependencies', {level: 'secondary'});
873
+ logger.info('Removing dependencies dependencies', {level: 'secondary'});
867
874
 
868
875
  await execa(packageManager, ['remove', ...dependencies]);
869
876
  }
870
877
  }
871
878
 
872
- async function processDependencies({dependencies = {}, devDependencies, projectRoot, packageManager}) {
873
- info('Processing dependencies');
879
+ async function processDependencies(
880
+ {dependencies = {}, devDependencies, projectRoot, packageManager},
881
+ {logger}
882
+ ) {
883
+ logger.info('Processing dependencies');
874
884
 
875
885
  if (Array.isArray(devDependencies)) {
876
886
  throw new Error(
@@ -885,12 +895,12 @@ async function processDependencies({dependencies = {}, devDependencies, projectR
885
895
  const {javascript: {production = [], development = [], remove: dependenciesToRemove = []} = {}} = dependencies;
886
896
 
887
897
  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});
898
+ await installDependencies(production, PROD_DEPENDENCY_TYPE, projectRoot, packageManager, {logger});
899
+ await installDependencies(development, DEV_DEPENDENCY_TYPE, projectRoot, packageManager, {logger});
900
+ await removeDependencies({packageManager, dependencies: dependenciesToRemove}, {logger});
891
901
  } catch (e) {
892
- error('Failed to update dependencies');
893
- error(e, {level: 'secondary'});
902
+ logger.error('Failed to update dependencies');
903
+ logger.error(e, {level: 'secondary'});
894
904
  }
895
905
  }
896
906
 
@@ -982,8 +992,8 @@ async function liftPackageJson({
982
992
  packageManager,
983
993
  vcs,
984
994
  pathWithinParent
985
- }) {
986
- info('Updating `package.json`', {level: 'secondary'});
995
+ }, {logger}) {
996
+ logger.info('Updating `package.json`', {level: 'secondary'});
987
997
 
988
998
  const existingPackageJsonContents = JSON.parse(await promises.readFile(`${projectRoot}/package.json`, 'utf-8'));
989
999
  const {scripts: liftedScripts, dependencies: scriptDependencies} = liftScripts({
@@ -1008,11 +1018,11 @@ async function liftPackageJson({
1008
1018
  devDependencies,
1009
1019
  projectRoot,
1010
1020
  packageManager
1011
- });
1021
+ }, {logger});
1012
1022
  }
1013
1023
 
1014
1024
  function mapProjectVisibility({projectVisibility}) {
1015
- return 'Public' === projectVisibility ? 'public' : 'restricted';
1025
+ return 'OSS' === projectVisibility ? 'public' : 'restricted';
1016
1026
  }
1017
1027
 
1018
1028
  function isScope(firstPart) {
@@ -1220,8 +1230,8 @@ async function scaffoldPackageProjectType({
1220
1230
  dialect,
1221
1231
  provideExample,
1222
1232
  publishRegistry
1223
- }) {
1224
- info('Scaffolding Package Details');
1233
+ }, {logger}) {
1234
+ logger.info('Scaffolding Package Details');
1225
1235
 
1226
1236
  const packageAccessLevel = mapProjectVisibility({projectVisibility: visibility});
1227
1237
  const [detailsForBuild, publishableResults] = await Promise.all([
@@ -1289,15 +1299,15 @@ function liftPackage({projectRoot, packageDetails, configs}) {
1289
1299
  }
1290
1300
 
1291
1301
  async function projectIsPackage({
1292
- packageDetails: {exports: exports$1, publishConfig, bin, private: projectMarkedPrivate}
1302
+ packageDetails: {exports, publishConfig, bin, private: projectMarkedPrivate}
1293
1303
  }) {
1294
- return !projectMarkedPrivate && (!!exports$1 || (!!publishConfig && !bin));
1304
+ return !projectMarkedPrivate && (!!exports || (!!publishConfig && !bin));
1295
1305
  }
1296
1306
 
1297
1307
  const defaultBuildDirectory$1 = 'public';
1298
1308
 
1299
- async function scaffoldApplication({projectRoot}) {
1300
- info('Scaffolding Application Details');
1309
+ async function scaffoldApplication({projectRoot}, {logger}) {
1310
+ logger.info('Scaffolding Application Details');
1301
1311
 
1302
1312
  await mergeIntoExistingPackageJson({projectRoot, config: {private: true}});
1303
1313
 
@@ -1320,8 +1330,8 @@ function projectIsApplication({packageDetails}) {
1320
1330
  return !!packageDetails.private;
1321
1331
  }
1322
1332
 
1323
- async function scaffoldMonorepo({projectRoot}) {
1324
- info('Scaffolding Monorepo Details');
1333
+ async function scaffoldMonorepo({projectRoot}, {logger}) {
1334
+ logger.info('Scaffolding Monorepo Details');
1325
1335
 
1326
1336
  await mergeIntoExistingPackageJson({projectRoot, config: {private: true}});
1327
1337
 
@@ -1400,7 +1410,7 @@ async function scaffoldProjectType({
1400
1410
  dialect,
1401
1411
  provideExample,
1402
1412
  publishRegistry
1403
- }) {
1413
+ }, {logger}) {
1404
1414
  switch (projectType) {
1405
1415
  case projectTypes$1.PACKAGE:
1406
1416
  return scaffoldPackageProjectType({
@@ -1415,9 +1425,9 @@ async function scaffoldProjectType({
1415
1425
  dialect,
1416
1426
  provideExample,
1417
1427
  publishRegistry
1418
- });
1428
+ }, {logger});
1419
1429
  case projectTypes$1.APPLICATION:
1420
- return scaffoldApplication({projectRoot});
1430
+ return scaffoldApplication({projectRoot}, {logger});
1421
1431
  case projectTypes$1.CLI:
1422
1432
  return scaffoldCli({
1423
1433
  visibility,
@@ -1428,7 +1438,7 @@ async function scaffoldProjectType({
1428
1438
  packageBundlers
1429
1439
  });
1430
1440
  case projectTypes$1.MONOREPO:
1431
- return scaffoldMonorepo({projectRoot});
1441
+ return scaffoldMonorepo({projectRoot}, {logger});
1432
1442
  case 'Other':
1433
1443
  return {};
1434
1444
  default:
@@ -1685,8 +1695,8 @@ async function scaffoldCodeStyle({
1685
1695
  ].filter(Boolean)));
1686
1696
  }
1687
1697
 
1688
- function liftCodeStyle(options) {
1689
- return applyEnhancers({options, enhancers: [eslintPlugin]});
1698
+ function liftCodeStyle(options, dependencies) {
1699
+ return applyEnhancers({options, enhancers: [eslintPlugin], dependencies});
1690
1700
  }
1691
1701
 
1692
1702
  function codeStyleConfigured(options) {
@@ -1700,8 +1710,8 @@ var codeStylePlugin = /*#__PURE__*/Object.freeze({
1700
1710
  test: codeStyleConfigured
1701
1711
  });
1702
1712
 
1703
- async function scaffoldJavascript(options) {
1704
- info('Initializing JavaScript project');
1713
+ async function scaffoldJavascript(options, {logger}) {
1714
+ logger.info('Initializing JavaScript project');
1705
1715
 
1706
1716
  const {
1707
1717
  projectRoot,
@@ -1737,9 +1747,9 @@ async function scaffoldJavascript(options) {
1737
1747
  provideExample,
1738
1748
  packageManager,
1739
1749
  dialect
1740
- } = await prompt(ciServices, hosts, visibility, vcs, decisions, configs, pathWithinParent);
1750
+ } = await prompt(ciServices, hosts, visibility, vcs, decisions, configs, pathWithinParent, {logger});
1741
1751
 
1742
- info('Writing project files', {level: 'secondary'});
1752
+ logger.info('Writing project files', {level: 'secondary'});
1743
1753
 
1744
1754
  const {packageName} = await scaffoldPackage({
1745
1755
  projectRoot,
@@ -1749,7 +1759,7 @@ async function scaffoldJavascript(options) {
1749
1759
  license,
1750
1760
  author,
1751
1761
  description
1752
- });
1762
+ }, {logger});
1753
1763
  const projectTypeResults = await scaffoldProjectType({
1754
1764
  projectType,
1755
1765
  projectRoot,
@@ -1763,7 +1773,7 @@ async function scaffoldJavascript(options) {
1763
1773
  dialect,
1764
1774
  provideExample,
1765
1775
  publishRegistry: configs.registries.publish
1766
- });
1776
+ }, {logger});
1767
1777
  const verificationResults = await scaffoldVerification({
1768
1778
  projectRoot,
1769
1779
  dialect,
@@ -1777,7 +1787,7 @@ async function scaffoldJavascript(options) {
1777
1787
  pathWithinParent
1778
1788
  });
1779
1789
  const [nodeVersion, npmResults, dialectResults, codeStyleResults] = await Promise.all([
1780
- scaffoldNodeVersion({projectRoot, nodeVersionCategory}),
1790
+ scaffoldNodeVersion({projectRoot, nodeVersionCategory}, {logger}),
1781
1791
  scaffoldNpmConfiguration({projectType, projectRoot}),
1782
1792
  scaffoldDialect({
1783
1793
  dialect,
@@ -1913,8 +1923,8 @@ async function liftJavaScript({
1913
1923
  pathWithinParent,
1914
1924
  enhancers = {},
1915
1925
  configs = {}
1916
- }) {
1917
- info('Lifting JavaScript-specific details');
1926
+ }, dependencies) {
1927
+ dependencies.logger.info('Lifting JavaScript-specific details');
1918
1928
 
1919
1929
  const [packageManager, packageContents] = await Promise.all([
1920
1930
  resolveCurrentPackageManager({projectRoot, packageManager: results.packageManager}),
@@ -1936,15 +1946,19 @@ async function liftJavaScript({
1936
1946
  packageManagers,
1937
1947
  registriesPlugin
1938
1948
  },
1939
- options: {packageManager, projectRoot, vcs, packageDetails: JSON.parse(packageContents), configs}
1949
+ options: {packageManager, projectRoot, vcs, packageDetails: JSON.parse(packageContents), configs},
1950
+ dependencies
1940
1951
  });
1941
1952
 
1942
- await liftPackageJson(deepmerge.all([{projectRoot, packageManager, vcs, pathWithinParent}, enhancerResults]));
1953
+ await liftPackageJson(
1954
+ deepmerge.all([{projectRoot, packageManager, vcs, pathWithinParent}, enhancerResults]),
1955
+ dependencies
1956
+ );
1943
1957
 
1944
1958
  return enhancerResults;
1945
1959
  }
1946
1960
 
1947
- async function projectUsesJavaScript({projectRoot}) {
1961
+ async function projectUsesJavaScript({projectRoot}, {logger}) {
1948
1962
  const [nvmFound, jsPackageManagerFound] = await Promise.all([
1949
1963
  nodeVersionMangerInUse({projectRoot}),
1950
1964
  packageManagerInUse({projectRoot})
@@ -1952,7 +1966,7 @@ async function projectUsesJavaScript({projectRoot}) {
1952
1966
 
1953
1967
  const jsProjectFound = nvmFound || jsPackageManagerFound;
1954
1968
 
1955
- if (jsProjectFound) info('JavaScript Project Detected');
1969
+ if (jsProjectFound) logger.info('JavaScript Project Detected');
1956
1970
 
1957
1971
  return jsProjectFound;
1958
1972
  }