@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
@@ -1,6 +1,5 @@
1
1
  import {promises as fs} from 'node:fs';
2
2
  import deepmerge from 'deepmerge';
3
- import {info} from '@travi/cli-messages';
4
3
  import {writePackageJson} from '@form8ion/javascript-core';
5
4
 
6
5
  import sortPackageProperties from './property-sorter.js';
@@ -17,8 +16,8 @@ export default async function liftPackageJson({
17
16
  packageManager,
18
17
  vcs,
19
18
  pathWithinParent
20
- }) {
21
- info('Updating `package.json`', {level: 'secondary'});
19
+ }, {logger}) {
20
+ logger.info('Updating `package.json`', {level: 'secondary'});
22
21
 
23
22
  const existingPackageJsonContents = JSON.parse(await fs.readFile(`${projectRoot}/package.json`, 'utf-8'));
24
23
  const {scripts: liftedScripts, dependencies: scriptDependencies} = liftScripts({
@@ -43,5 +42,5 @@ export default async function liftPackageJson({
43
42
  devDependencies,
44
43
  projectRoot,
45
44
  packageManager
46
- });
45
+ }, {logger});
47
46
  }
@@ -34,6 +34,7 @@ describe('package.json lifter', () => {
34
34
  const config = any.simpleObject();
35
35
  const tags = any.listOf(any.word);
36
36
  const scriptDependencies = any.simpleObject();
37
+ const logger = {info: () => undefined};
37
38
 
38
39
  beforeEach(() => {
39
40
  when(defineVcsHostDetails).calledWith(vcs, pathWithinParent).thenReturn(vcsDetails);
@@ -53,7 +54,10 @@ describe('package.json lifter', () => {
53
54
  .calledWith({...existingPackageContents, ...vcsDetails, scripts: liftedScripts})
54
55
  .thenReturn(config);
55
56
 
56
- await liftPackage({dependencies, devDependencies, projectRoot, packageManager, vcs, pathWithinParent, scripts});
57
+ await liftPackage(
58
+ {dependencies, devDependencies, projectRoot, packageManager, vcs, pathWithinParent, scripts},
59
+ {logger}
60
+ );
57
61
 
58
62
  expect(writePackageJson).toHaveBeenCalledWith({projectRoot, config});
59
63
  expect(processDependencies).toHaveBeenCalledWith({
@@ -61,7 +65,7 @@ describe('package.json lifter', () => {
61
65
  devDependencies,
62
66
  projectRoot,
63
67
  packageManager
64
- });
68
+ }, {logger});
65
69
  });
66
70
 
67
71
  it('should update keywords if tags are provided', async () => {
@@ -73,7 +77,7 @@ describe('package.json lifter', () => {
73
77
  .calledWith({...existingPackageContents, ...vcsDetails, scripts: liftedScripts, keywords: tags})
74
78
  .thenReturn(config);
75
79
 
76
- await liftPackage({dependencies, projectRoot, packageManager, vcs, pathWithinParent, scripts, tags});
80
+ await liftPackage({dependencies, projectRoot, packageManager, vcs, pathWithinParent, scripts, tags}, {logger});
77
81
 
78
82
  expect(writePackageJson).toHaveBeenCalledWith({projectRoot, config});
79
83
  });
@@ -93,7 +97,7 @@ describe('package.json lifter', () => {
93
97
  })
94
98
  .thenReturn(config);
95
99
 
96
- await liftPackage({dependencies, projectRoot, packageManager, vcs, pathWithinParent, scripts, tags});
100
+ await liftPackage({dependencies, projectRoot, packageManager, vcs, pathWithinParent, scripts, tags}, {logger});
97
101
 
98
102
  expect(writePackageJson).toHaveBeenCalledWith({projectRoot, config});
99
103
  });
@@ -1,4 +1,3 @@
1
- import {info} from '@travi/cli-messages';
2
1
  import {writePackageJson} from '@form8ion/javascript-core';
3
2
 
4
3
  import buildPackageName from './package-name.js';
@@ -12,8 +11,8 @@ export default async function scaffoldPackage({
12
11
  license,
13
12
  author,
14
13
  description
15
- }) {
16
- info('Configuring package.json');
14
+ }, {logger}) {
15
+ logger.info('Configuring package.json');
17
16
 
18
17
  const packageName = buildPackageName(projectName, scope);
19
18
 
@@ -13,6 +13,8 @@ vi.mock('./package-name.js');
13
13
  vi.mock('./details.js');
14
14
 
15
15
  describe('package scaffolder', () => {
16
+ const logger = {info: () => undefined};
17
+
16
18
  it('should create the package file', async () => {
17
19
  const projectName = any.string();
18
20
  const packageName = any.string();
@@ -40,7 +42,7 @@ describe('package scaffolder', () => {
40
42
  license,
41
43
  author,
42
44
  description
43
- })).toEqual({packageName});
45
+ }, {logger})).toEqual({packageName});
44
46
  expect(writePackageJson).toHaveBeenCalledWith({projectRoot, config: packageDetails});
45
47
  });
46
48
  });
@@ -1,10 +1,9 @@
1
1
  import {mergeIntoExistingPackageJson} from '@form8ion/javascript-core';
2
- import {info} from '@travi/cli-messages';
3
2
 
4
3
  const defaultBuildDirectory = 'public';
5
4
 
6
- export default async function scaffoldApplication({projectRoot}) {
7
- info('Scaffolding Application Details');
5
+ export default async function scaffoldApplication({projectRoot}, {logger}) {
6
+ logger.info('Scaffolding Application Details');
8
7
 
9
8
  await mergeIntoExistingPackageJson({projectRoot, config: {private: true}});
10
9
 
@@ -1,6 +1,6 @@
1
1
  import {mergeIntoExistingPackageJson} from '@form8ion/javascript-core';
2
2
 
3
- import {afterEach, describe, expect, it, vi} from 'vitest';
3
+ import {describe, expect, it, vi} from 'vitest';
4
4
  import any from '@travi/any';
5
5
 
6
6
  import scaffoldApplication from './scaffolder.js';
@@ -8,15 +8,13 @@ import scaffoldApplication from './scaffolder.js';
8
8
  vi.mock('@form8ion/javascript-core');
9
9
 
10
10
  describe('application project-type scaffolder', () => {
11
- afterEach(() => {
12
- vi.clearAllMocks();
13
- });
11
+ const logger = {info: () => undefined};
14
12
 
15
13
  it('should scaffold the details specific to an application project-type', async () => {
16
14
  const projectRoot = any.string();
17
15
  const buildDirectory = 'public';
18
16
 
19
- expect(await scaffoldApplication({projectRoot})).toEqual({
17
+ expect(await scaffoldApplication({projectRoot}, {logger})).toEqual({
20
18
  scripts: {
21
19
  clean: `rimraf ./${buildDirectory}`,
22
20
  start: `node ./${buildDirectory}/index.js`,
@@ -1,8 +1,7 @@
1
1
  import {mergeIntoExistingPackageJson} from '@form8ion/javascript-core';
2
- import {info} from '@travi/cli-messages';
3
2
 
4
- export default async function scaffoldMonorepo({projectRoot}) {
5
- info('Scaffolding Monorepo Details');
3
+ export default async function scaffoldMonorepo({projectRoot}, {logger}) {
4
+ logger.info('Scaffolding Monorepo Details');
6
5
 
7
6
  await mergeIntoExistingPackageJson({projectRoot, config: {private: true}});
8
7
 
@@ -1,6 +1,6 @@
1
1
  import {mergeIntoExistingPackageJson} from '@form8ion/javascript-core';
2
2
 
3
- import {describe, vi, it, expect, afterEach} from 'vitest';
3
+ import {describe, expect, it, vi} from 'vitest';
4
4
  import any from '@travi/any';
5
5
 
6
6
  import scaffoldMonorepo from './scaffolder.js';
@@ -9,13 +9,10 @@ vi.mock('@form8ion/javascript-core');
9
9
 
10
10
  describe('monorepo project-type scaffolder', () => {
11
11
  const projectRoot = any.string();
12
-
13
- afterEach(() => {
14
- vi.clearAllMocks();
15
- });
12
+ const logger = {info: () => undefined};
16
13
 
17
14
  it('should scaffold the monorepo specific project details', async () => {
18
- expect(await scaffoldMonorepo({projectRoot})).toEqual({
15
+ expect(await scaffoldMonorepo({projectRoot}, {logger})).toEqual({
19
16
  nextSteps: [{
20
17
  summary: 'Add packages to your new monorepo',
21
18
  description: 'Leverage [@form8ion/add-package-to-monorepo](https://npm.im/@form8ion/add-package-to-monorepo)'
@@ -1,5 +1,4 @@
1
1
  import deepmerge from 'deepmerge';
2
- import {info} from '@travi/cli-messages';
3
2
  import {dialects, mergeIntoExistingPackageJson} from '@form8ion/javascript-core';
4
3
 
5
4
  import determinePackageAccessLevelFromProjectVisibility from '../publishable/access-level.js';
@@ -19,8 +18,8 @@ export default async function scaffoldPackageProjectType({
19
18
  dialect,
20
19
  provideExample,
21
20
  publishRegistry
22
- }) {
23
- info('Scaffolding Package Details');
21
+ }, {logger}) {
22
+ logger.info('Scaffolding Package Details');
24
23
 
25
24
  const packageAccessLevel = determinePackageAccessLevelFromProjectVisibility({projectVisibility: visibility});
26
25
  const [detailsForBuild, publishableResults] = await Promise.all([
@@ -35,6 +35,7 @@ describe('package project-type scaffolder', () => {
35
35
  const documentation = any.simpleObject();
36
36
  const decisions = any.simpleObject();
37
37
  const buildDetailsResults = any.simpleObject();
38
+ const logger = {info: () => undefined};
38
39
 
39
40
  beforeEach(() => {
40
41
  when(documentationScaffolder.default)
@@ -68,7 +69,7 @@ describe('package project-type scaffolder', () => {
68
69
  decisions,
69
70
  dialect,
70
71
  provideExample
71
- })).toEqual({
72
+ }, {logger})).toEqual({
72
73
  ...publishableResults,
73
74
  ...buildDetailsResults,
74
75
  documentation,
@@ -113,7 +114,7 @@ describe('package project-type scaffolder', () => {
113
114
  packageBundlers,
114
115
  decisions,
115
116
  provideExample
116
- })).toEqual({
117
+ }, {logger})).toEqual({
117
118
  ...publishableResults,
118
119
  ...buildDetailsResults,
119
120
  documentation,
@@ -153,7 +154,7 @@ describe('package project-type scaffolder', () => {
153
154
  decisions,
154
155
  dialect,
155
156
  provideExample
156
- })).toEqual({
157
+ }, {logger})).toEqual({
157
158
  ...publishableResults,
158
159
  ...buildDetailsResults,
159
160
  documentation,
@@ -199,7 +200,7 @@ describe('package project-type scaffolder', () => {
199
200
  packageBundlers,
200
201
  dialect,
201
202
  provideExample
202
- })).toEqual({
203
+ }, {logger})).toEqual({
203
204
  ...publishableResults,
204
205
  ...buildDetailsResults,
205
206
  documentation,
@@ -239,7 +240,7 @@ describe('package project-type scaffolder', () => {
239
240
  dialect,
240
241
  provideExample,
241
242
  packageBundlers
242
- });
243
+ }, {logger});
243
244
 
244
245
  expect(mergeIntoExistingPackageJson).toHaveBeenCalledWith({
245
246
  projectRoot,
@@ -1,3 +1,3 @@
1
1
  export default function mapProjectVisibility({projectVisibility}) {
2
- return 'Public' === projectVisibility ? 'public' : 'restricted';
2
+ return 'OSS' === projectVisibility ? 'public' : 'restricted';
3
3
  }
@@ -1,13 +1,15 @@
1
1
  import {describe, expect, it} from 'vitest';
2
+ import any from '@travi/any';
2
3
 
3
4
  import determinePackageAccessLevelFromProjectVisibility from './access-level.js';
4
5
 
5
6
  describe('package access level', () => {
6
- it('should return `public` when project visibility is `Public`', () => {
7
- expect(determinePackageAccessLevelFromProjectVisibility({projectVisibility: 'Public'})).toEqual('public');
7
+ it('should return `public` when project visibility is `OSS`', () => {
8
+ expect(determinePackageAccessLevelFromProjectVisibility({projectVisibility: 'OSS'})).toEqual('public');
8
9
  });
9
10
 
10
11
  it('should return `restricted` when the project visibility is `Private`', () => {
11
- expect(determinePackageAccessLevelFromProjectVisibility({projectVisibility: 'Private'})).toEqual('restricted');
12
+ expect(determinePackageAccessLevelFromProjectVisibility({projectVisibility: any.fromList(['ISS', 'CS'])}))
13
+ .toEqual('restricted');
12
14
  });
13
15
  });
@@ -18,7 +18,7 @@ export default async function scaffoldProjectType({
18
18
  dialect,
19
19
  provideExample,
20
20
  publishRegistry
21
- }) {
21
+ }, {logger}) {
22
22
  switch (projectType) {
23
23
  case projectTypes.PACKAGE:
24
24
  return scaffoldPackageType({
@@ -33,9 +33,9 @@ export default async function scaffoldProjectType({
33
33
  dialect,
34
34
  provideExample,
35
35
  publishRegistry
36
- });
36
+ }, {logger});
37
37
  case projectTypes.APPLICATION:
38
- return scaffoldApplicationType({projectRoot});
38
+ return scaffoldApplicationType({projectRoot}, {logger});
39
39
  case projectTypes.CLI:
40
40
  return scaffoldCliType({
41
41
  visibility,
@@ -46,7 +46,7 @@ export default async function scaffoldProjectType({
46
46
  packageBundlers
47
47
  });
48
48
  case projectTypes.MONOREPO:
49
- return scaffoldMonorepoType({projectRoot});
49
+ return scaffoldMonorepoType({projectRoot}, {logger});
50
50
  case 'Other':
51
51
  return {};
52
52
  default:
@@ -1,6 +1,6 @@
1
1
  import {projectTypes} from '@form8ion/javascript-core';
2
2
 
3
- import {afterEach, describe, expect, it, vi} from 'vitest';
3
+ import {describe, expect, it, vi} from 'vitest';
4
4
  import any from '@travi/any';
5
5
  import {when} from 'vitest-when';
6
6
 
@@ -27,10 +27,7 @@ describe('project-type scaffolder', () => {
27
27
  const dialect = any.word();
28
28
  const provideExample = any.boolean();
29
29
  const packageBundlers = any.simpleObject();
30
-
31
- afterEach(() => {
32
- vi.clearAllMocks();
33
- });
30
+ const logger = {info: () => undefined};
34
31
 
35
32
  it('should apply the package-type scaffolder when the project-type is `Package`', async () => {
36
33
  const scope = any.word();
@@ -46,7 +43,7 @@ describe('project-type scaffolder', () => {
46
43
  dialect,
47
44
  provideExample,
48
45
  publishRegistry
49
- }).thenResolve(results);
46
+ }, {logger}).thenResolve(results);
50
47
 
51
48
  expect(await projectTypeScaffolder({
52
49
  projectType: projectTypes.PACKAGE,
@@ -61,11 +58,11 @@ describe('project-type scaffolder', () => {
61
58
  dialect,
62
59
  provideExample,
63
60
  publishRegistry
64
- })).toEqual(results);
61
+ }, {logger})).toEqual(results);
65
62
  });
66
63
 
67
64
  it('should apply the application-type scaffolder when the project-type is `Application`', async () => {
68
- when(scaffoldApplicationType).calledWith({projectRoot}).thenResolve(results);
65
+ when(scaffoldApplicationType).calledWith({projectRoot}, {logger}).thenResolve(results);
69
66
 
70
67
  expect(await projectTypeScaffolder({
71
68
  projectType: projectTypes.APPLICATION,
@@ -75,7 +72,7 @@ describe('project-type scaffolder', () => {
75
72
  packageManager,
76
73
  decisions,
77
74
  visibility
78
- })).toEqual(results);
75
+ }, {logger})).toEqual(results);
79
76
  });
80
77
 
81
78
  it('should apply the cli-type scaffolder when the project-type is `CLI`', async () => {
@@ -91,24 +88,26 @@ describe('project-type scaffolder', () => {
91
88
  publishRegistry,
92
89
  decisions,
93
90
  packageBundlers
94
- })).toEqual(results);
91
+ }, {logger})).toEqual(results);
95
92
  });
96
93
 
97
94
  it('should apply the monorepo-type scaffolder when the project-type is `Monorepo`', async () => {
98
- when(scaffoldMonorepoType).calledWith({projectRoot}).thenResolve(results);
95
+ when(scaffoldMonorepoType).calledWith({projectRoot}, {logger}).thenResolve(results);
99
96
 
100
- expect(await projectTypeScaffolder({projectRoot, projectType: projectTypes.MONOREPO, packageManager, decisions}))
101
- .toEqual(results);
97
+ expect(await projectTypeScaffolder(
98
+ {projectRoot, projectType: projectTypes.MONOREPO, packageManager, decisions},
99
+ {logger}
100
+ )).toEqual(results);
102
101
  });
103
102
 
104
103
  it('should not throw an error when the project-type is `Other`', async () => {
105
- expect(await projectTypeScaffolder({projectType: 'Other'})).toEqual({});
104
+ expect(await projectTypeScaffolder({projectType: 'Other'}, {logger})).toEqual({});
106
105
  });
107
106
 
108
107
  it('should throw an error for an unknown project-type', async () => {
109
108
  const projectType = any.word();
110
109
 
111
- await expect(() => projectTypeScaffolder({projectType}))
112
- .rejects.toThrowError(`The project-type of ${projectType} is invalid`);
110
+ await expect(() => projectTypeScaffolder({projectType}, {logger}))
111
+ .rejects.toThrow(`The project-type of ${projectType} is invalid`);
113
112
  });
114
113
  });
@@ -1,7 +1,6 @@
1
1
  import {packageManagers, projectTypes} from '@form8ion/javascript-core';
2
2
  import {prompt as promptWithInquirer} from '@form8ion/overridable-prompts';
3
3
  import {questionNames as commonQuestionNames, questions as commonQuestions} from '@travi/language-scaffolder-prompts';
4
- import {warn} from '@travi/cli-messages';
5
4
 
6
5
  import {execa} from 'execa';
7
6
  import npmConfFactory from '../../thirdparty-wrappers/npm-conf.js';
@@ -43,7 +42,8 @@ export async function prompt(
43
42
  vcs,
44
43
  decisions,
45
44
  configs,
46
- pathWithinParent
45
+ pathWithinParent,
46
+ {logger}
47
47
  ) {
48
48
  const npmConf = npmConfFactory();
49
49
 
@@ -52,7 +52,7 @@ export async function prompt(
52
52
  maybeLoggedInNpmUsername = (await execa('npm', ['whoami'])).stdout;
53
53
  } catch (failedExecutionResult) {
54
54
  if (!decisions[questionNames.SCOPE]) {
55
- warn('No logged in user found with `npm whoami`. Login with `npm login` '
55
+ logger.warn('No logged in user found with `npm whoami`. Login with `npm login` '
56
56
  + 'to use your npm account name as the package scope default.');
57
57
  }
58
58
  }
@@ -59,6 +59,7 @@ describe('prompts', () => {
59
59
  [questionNames.DIALECT]: dialect,
60
60
  [questionNames.PROVIDE_EXAMPLE]: provideExample
61
61
  };
62
+ const logger = {info: () => undefined, warn: () => undefined};
62
63
 
63
64
  beforeEach(() => {
64
65
  when(commonPrompts.questions)
@@ -166,7 +167,7 @@ describe('prompts', () => {
166
167
  ], decisions)
167
168
  .thenResolve({...answers, [questionNames.CONFIGURE_LINTING]: any.word()});
168
169
 
169
- expect(await prompt(ciServices, hosts, visibility, vcs, decisions, configs)).toEqual({
170
+ expect(await prompt(ciServices, hosts, visibility, vcs, decisions, configs, undefined, {logger})).toEqual({
170
171
  tests,
171
172
  projectType,
172
173
  ci,
@@ -188,7 +189,7 @@ describe('prompts', () => {
188
189
  when(execa).calledWith('npm', ['whoami']).thenResolve({stdout: npmUser});
189
190
  prompts.prompt.mockResolvedValue({...answers, [questionNames.CONFIGURE_LINTING]: false});
190
191
 
191
- expect(await prompt(ciServices, {}, visibility, vcs, decisions)).toEqual({
192
+ expect(await prompt(ciServices, {}, visibility, vcs, decisions, undefined, undefined, {logger})).toEqual({
192
193
  tests,
193
194
  projectType,
194
195
  ci,
@@ -211,7 +212,7 @@ describe('prompts', () => {
211
212
  .thenReturn(commonQuestions);
212
213
  prompts.prompt.mockResolvedValue(answers);
213
214
 
214
- await prompt(ciServices, {}, 'Private', vcs, null, null, pathWithinParent);
215
+ await prompt(ciServices, {}, 'Private', vcs, null, null, pathWithinParent, {logger});
215
216
 
216
217
  const [questions] = prompts.prompt.mock.lastCall;
217
218
  expect(questions.filter(question => questionNames.NODE_VERSION_CATEGORY === question.name).length).toEqual(0);
@@ -225,7 +226,7 @@ describe('prompts', () => {
225
226
  .thenReturn(commonQuestions);
226
227
  prompts.prompt.mockResolvedValue(answers);
227
228
 
228
- await prompt(ciServices, {}, 'Private', vcs, null, null, pathWithinParent);
229
+ await prompt(ciServices, {}, 'Private', vcs, null, null, pathWithinParent, {logger});
229
230
 
230
231
  const [questions] = prompts.prompt.mock.lastCall;
231
232
  expect(questions.filter(question => questionNames.SHOULD_BE_SCOPED === question.name).length).toEqual(0);
@@ -239,7 +240,7 @@ describe('prompts', () => {
239
240
  .thenReturn(commonQuestions);
240
241
  prompts.prompt.mockResolvedValue(answers);
241
242
 
242
- await prompt(ciServices, {}, 'Public', vcs, {}, null, pathWithinParent);
243
+ await prompt(ciServices, {}, 'Public', vcs, {}, null, pathWithinParent, {logger});
243
244
 
244
245
  const [questions] = prompts.prompt.mock.lastCall;
245
246
  expect(questions.filter(question => questionNames.SHOULD_BE_SCOPED === question.name).length).toEqual(1);
package/src/scaffolder.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import deepmerge from 'deepmerge';
2
- import {info} from '@travi/cli-messages';
3
2
  import {projectTypes, scaffoldChoice} from '@form8ion/javascript-core';
4
3
  import {scaffold as scaffoldCommitConvention} from '@form8ion/commit-convention';
5
4
 
@@ -18,8 +17,8 @@ import buildDocumentationCommand from './documentation/generation-command.js';
18
17
  import {scaffold as scaffoldVerification} from './verification/index.js';
19
18
  import {scaffold as scaffoldCodeStyle} from './code-style/index.js';
20
19
 
21
- export default async function scaffoldJavascript(options) {
22
- info('Initializing JavaScript project');
20
+ export default async function scaffoldJavascript(options, {logger}) {
21
+ logger.info('Initializing JavaScript project');
23
22
 
24
23
  const {
25
24
  projectRoot,
@@ -55,9 +54,9 @@ export default async function scaffoldJavascript(options) {
55
54
  provideExample,
56
55
  packageManager,
57
56
  dialect
58
- } = await prompt(ciServices, hosts, visibility, vcs, decisions, configs, pathWithinParent);
57
+ } = await prompt(ciServices, hosts, visibility, vcs, decisions, configs, pathWithinParent, {logger});
59
58
 
60
- info('Writing project files', {level: 'secondary'});
59
+ logger.info('Writing project files', {level: 'secondary'});
61
60
 
62
61
  const {packageName} = await scaffoldPackage({
63
62
  projectRoot,
@@ -67,7 +66,7 @@ export default async function scaffoldJavascript(options) {
67
66
  license,
68
67
  author,
69
68
  description
70
- });
69
+ }, {logger});
71
70
  const projectTypeResults = await scaffoldProjectType({
72
71
  projectType,
73
72
  projectRoot,
@@ -86,7 +85,7 @@ export default async function scaffoldJavascript(options) {
86
85
  dialect,
87
86
  provideExample,
88
87
  publishRegistry: configs.registries.publish
89
- });
88
+ }, {logger});
90
89
  const verificationResults = await scaffoldVerification({
91
90
  projectRoot,
92
91
  dialect,
@@ -100,7 +99,7 @@ export default async function scaffoldJavascript(options) {
100
99
  pathWithinParent
101
100
  });
102
101
  const [nodeVersion, npmResults, dialectResults, codeStyleResults] = await Promise.all([
103
- scaffoldNodeVersion({projectRoot, nodeVersionCategory}),
102
+ scaffoldNodeVersion({projectRoot, nodeVersionCategory}, {logger}),
104
103
  scaffoldNpmConfig({projectType, projectRoot}),
105
104
  scaffoldDialect({
106
105
  dialect,
@@ -62,6 +62,7 @@ describe('javascript project scaffolder', () => {
62
62
  const mergedVcsIgnore = any.simpleObject();
63
63
  const mergedNextSteps = any.listOf(any.simpleObject);
64
64
  const mergedResults = {...any.simpleObject(), vcsIgnore: mergedVcsIgnore, nextSteps: mergedNextSteps};
65
+ const logger = {info: () => undefined};
65
66
 
66
67
  beforeEach(() => {
67
68
  const projectName = any.word();
@@ -121,7 +122,7 @@ describe('javascript project scaffolder', () => {
121
122
  }
122
123
  });
123
124
  when(prompt)
124
- .calledWith(ciServices, hosts, visibility, vcs, decisions, configs, pathWithinParent)
125
+ .calledWith(ciServices, hosts, visibility, vcs, decisions, configs, pathWithinParent, {logger})
125
126
  .thenResolve({
126
127
  packageManager,
127
128
  dialect,
@@ -138,7 +139,7 @@ describe('javascript project scaffolder', () => {
138
139
  when(scaffoldDocumentation).calledWith({packageManager, projectTypeResults}).thenReturn(documentation);
139
140
  when(buildDocumentationCommand).calledWith(packageManager).thenReturn(documentationCommand);
140
141
  when(scaffoldPackage)
141
- .calledWith({projectRoot, projectName, scope, dialect, license, author, description})
142
+ .calledWith({projectRoot, projectName, scope, dialect, license, author, description}, {logger})
142
143
  .thenResolve(packageResults);
143
144
  when(scaffoldProjectType)
144
145
  .calledWith({
@@ -159,7 +160,7 @@ describe('javascript project scaffolder', () => {
159
160
  scope,
160
161
  tests,
161
162
  publishRegistry
162
- })
163
+ }, {logger})
163
164
  .thenResolve(projectTypeResults);
164
165
  when(scaffoldVerification)
165
166
  .calledWith({
@@ -175,7 +176,7 @@ describe('javascript project scaffolder', () => {
175
176
  integrationTestFrameworks
176
177
  })
177
178
  .thenResolve(verificationResults);
178
- when(scaffoldNodeVersion).calledWith({projectRoot, nodeVersionCategory}).thenResolve(nodeVersionResults);
179
+ when(scaffoldNodeVersion).calledWith({projectRoot, nodeVersionCategory}, {logger}).thenResolve(nodeVersionResults);
179
180
  when(scaffoldDialect)
180
181
  .calledWith({dialect, configs, projectRoot, projectType, testFilenamePattern})
181
182
  .thenResolve(dialectResults);
@@ -235,7 +236,7 @@ describe('javascript project scaffolder', () => {
235
236
  });
236
237
 
237
238
  it('should scaffold the javascript details', async () => {
238
- const results = await scaffold(options);
239
+ const results = await scaffold(options, {logger});
239
240
 
240
241
  expect(scaffoldPackageManager).toHaveBeenCalledWith({projectRoot, packageManager});
241
242
  expect(results).toEqual({
package/src/tester.js CHANGED
@@ -1,9 +1,7 @@
1
- import {info} from '@travi/cli-messages';
2
-
3
1
  import {test as nvmIsUsed} from './node-version/index.js';
4
2
  import {test as jsPackageManagerIsUsed} from './package-managers/index.js';
5
3
 
6
- export default async function projectUsesJavaScript({projectRoot}) {
4
+ export default async function projectUsesJavaScript({projectRoot}, {logger}) {
7
5
  const [nvmFound, jsPackageManagerFound] = await Promise.all([
8
6
  nvmIsUsed({projectRoot}),
9
7
  jsPackageManagerIsUsed({projectRoot})
@@ -11,7 +9,7 @@ export default async function projectUsesJavaScript({projectRoot}) {
11
9
 
12
10
  const jsProjectFound = nvmFound || jsPackageManagerFound;
13
11
 
14
- if (jsProjectFound) info('JavaScript Project Detected');
12
+ if (jsProjectFound) logger.info('JavaScript Project Detected');
15
13
 
16
14
  return jsProjectFound;
17
15
  }
@@ -1,4 +1,4 @@
1
- import {vi, it, describe, afterEach, expect} from 'vitest';
1
+ import {describe, expect, it, vi} from 'vitest';
2
2
  import any from '@travi/any';
3
3
  import {when} from 'vitest-when';
4
4
 
@@ -11,27 +11,24 @@ vi.mock('./package-managers/index.js');
11
11
 
12
12
  describe('javascript predicate', () => {
13
13
  const projectRoot = any.string();
14
-
15
- afterEach(() => {
16
- vi.clearAllMocks();
17
- });
14
+ const logger = {info: () => undefined};
18
15
 
19
16
  it('should return `true` if nvm is detected', async () => {
20
17
  when(nvmIsUsed).calledWith({projectRoot}).thenResolve(true);
21
18
 
22
- expect(await testApplicability({projectRoot})).toBe(true);
19
+ expect(await testApplicability({projectRoot}, {logger})).toBe(true);
23
20
  });
24
21
 
25
22
  it('should return `true` if a javascript package manager is detected', async () => {
26
23
  when(jsPackageManagerIsUsed).calledWith({projectRoot}).thenResolve(true);
27
24
 
28
- expect(await testApplicability({projectRoot})).toBe(true);
25
+ expect(await testApplicability({projectRoot}, {logger})).toBe(true);
29
26
  });
30
27
 
31
28
  it('should return `false` if neither nvm nor a js package manager is found', async () => {
32
29
  when(nvmIsUsed).calledWith({projectRoot}).thenResolve(false);
33
30
  when(jsPackageManagerIsUsed).calledWith({projectRoot}).thenResolve(false);
34
31
 
35
- expect(await testApplicability({projectRoot})).toBe(false);
32
+ expect(await testApplicability({projectRoot}, {logger})).toBe(false);
36
33
  });
37
34
  });