@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.
- package/README.md +2 -2
- package/lib/index.js +77 -64
- package/lib/index.js.map +1 -1
- package/package.json +17 -17
- package/src/code-style/lifter.js +2 -2
- package/src/dependencies/installer.js +5 -5
- package/src/dependencies/installer.test.js +8 -22
- package/src/dependencies/processor.js +10 -8
- package/src/dependencies/processor.test.js +31 -18
- package/src/dependencies/remover.js +2 -3
- package/src/dependencies/remover.test.js +4 -2
- package/src/lifter.js +8 -5
- package/src/lifter.test.js +12 -11
- package/src/node-version/scaffolder.js +4 -5
- package/src/node-version/scaffolder.test.js +5 -4
- package/src/node-version/tasks.js +4 -6
- package/src/node-version/tasks.test.js +5 -8
- package/src/options/schemas.js +2 -1
- package/src/options/schemas.test.js +11 -5
- package/src/package/lifter.js +3 -4
- package/src/package/lifter.test.js +8 -4
- package/src/package/scaffolder.js +2 -3
- package/src/package/scaffolder.test.js +3 -1
- package/src/project-type/application/scaffolder.js +2 -3
- package/src/project-type/application/scaffolder.test.js +3 -5
- package/src/project-type/monorepo/scaffolder.js +2 -3
- package/src/project-type/monorepo/scaffolder.test.js +3 -6
- package/src/project-type/package/scaffolder.js +2 -3
- package/src/project-type/package/scaffolder.test.js +6 -5
- package/src/project-type/publishable/access-level.js +1 -1
- package/src/project-type/publishable/access-level.test.js +5 -3
- package/src/project-type/publishable/badges.js +2 -2
- package/src/project-type/publishable/badges.test.js +14 -5
- package/src/project-type/publishable/lifter.js +9 -4
- package/src/project-type/publishable/lifter.test.js +4 -4
- package/src/project-type/scaffolder.js +4 -4
- package/src/project-type/scaffolder.test.js +15 -16
- package/src/prompts/questions.js +3 -3
- package/src/prompts/questions.test.js +6 -5
- package/src/scaffolder.js +7 -8
- package/src/scaffolder.test.js +6 -5
- package/src/tester.js +2 -4
- package/src/tester.test.js +5 -8
package/src/package/lifter.js
CHANGED
|
@@ -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(
|
|
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 {
|
|
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
|
-
|
|
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,
|
|
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,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 `
|
|
7
|
-
expect(determinePackageAccessLevelFromProjectVisibility({projectVisibility: '
|
|
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: '
|
|
12
|
+
expect(determinePackageAccessLevelFromProjectVisibility({projectVisibility: any.fromList(['ISS', 'CS'])}))
|
|
13
|
+
.toEqual('restricted');
|
|
12
14
|
});
|
|
13
15
|
});
|
|
@@ -4,14 +4,14 @@ function buildNpmBadgeImageUrl(packageName, customRegistry) {
|
|
|
4
4
|
return `https://img.shields.io/npm/v/${packageName}?${params}`;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
export default function scaffoldPublishableBadges({packageName, accessLevel, customRegistry}) {
|
|
7
|
+
export default function scaffoldPublishableBadges({packageName, accessLevel, customRegistry, registryPage}) {
|
|
8
8
|
return {
|
|
9
9
|
consumer: {
|
|
10
10
|
...'public' === accessLevel && {
|
|
11
11
|
npm: {
|
|
12
12
|
img: buildNpmBadgeImageUrl(packageName, customRegistry),
|
|
13
13
|
text: 'npm',
|
|
14
|
-
link:
|
|
14
|
+
link: registryPage
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
},
|
|
@@ -5,24 +5,33 @@ import defineBadges from './badges.js';
|
|
|
5
5
|
|
|
6
6
|
describe('badges for publishable project types', async () => {
|
|
7
7
|
const packageName = any.word();
|
|
8
|
+
const registryPage = any.url();
|
|
8
9
|
const npmBadgeDetails = {
|
|
9
10
|
img: `https://img.shields.io/npm/v/${packageName}?logo=npm`,
|
|
10
11
|
text: 'npm',
|
|
11
|
-
link:
|
|
12
|
+
link: registryPage
|
|
12
13
|
};
|
|
13
14
|
|
|
14
|
-
it('should define the badges when the access level is not public', () => {
|
|
15
|
-
expect(defineBadges(packageName)).toEqual({consumer: {}, status: {}});
|
|
15
|
+
it('should note define the badges when the access level is not public', () => {
|
|
16
|
+
expect(defineBadges({packageName})).toEqual({consumer: {}, status: {}});
|
|
16
17
|
});
|
|
17
18
|
|
|
18
19
|
it('should return the npm badge for packages with a public access level', () => {
|
|
19
|
-
expect(defineBadges({
|
|
20
|
+
expect(defineBadges({
|
|
21
|
+
packageName,
|
|
22
|
+
accessLevel: 'public',
|
|
23
|
+
registryPage
|
|
24
|
+
}).consumer).toEqual({npm: npmBadgeDetails});
|
|
20
25
|
});
|
|
21
26
|
|
|
22
27
|
it('should include the registry_uri in the npm badge when a custom registry is provided', () => {
|
|
23
28
|
const customRegistry = any.url();
|
|
24
29
|
|
|
25
|
-
const {searchParams} = new URL(defineBadges({
|
|
30
|
+
const {searchParams} = new URL(defineBadges({
|
|
31
|
+
packageName,
|
|
32
|
+
accessLevel: 'public',
|
|
33
|
+
customRegistry
|
|
34
|
+
}, `https://www.npmjs.com/package/${packageName}`).consumer.npm.img);
|
|
26
35
|
|
|
27
36
|
expect(searchParams.get('registry_uri')).toEqual(customRegistry);
|
|
28
37
|
});
|
|
@@ -8,17 +8,22 @@ import {lift as liftProvenance} from './provenance/index.js';
|
|
|
8
8
|
export default async function liftPublishable({projectRoot, packageDetails, configs}) {
|
|
9
9
|
const {name: packageName, publishConfig: {access: packageAccessLevel}} = packageDetails;
|
|
10
10
|
const customRegistry = resolveRegistry(packageName, configs.registries);
|
|
11
|
-
const
|
|
11
|
+
const registryPage = `https://www.npmjs.com/package/${packageName}`;
|
|
12
12
|
|
|
13
|
-
await mergeIntoExistingPackageJson({projectRoot, config: {homepage}});
|
|
13
|
+
await mergeIntoExistingPackageJson({projectRoot, config: {homepage: registryPage}});
|
|
14
14
|
|
|
15
15
|
return deepmerge(
|
|
16
16
|
await liftProvenance({packageDetails, projectRoot, customRegistry}),
|
|
17
17
|
{
|
|
18
|
-
homepage,
|
|
18
|
+
homepage: registryPage,
|
|
19
19
|
dependencies: {javascript: {development: ['publint']}},
|
|
20
20
|
scripts: {'lint:publish': 'publint --strict'},
|
|
21
|
-
badges: defineBadges({
|
|
21
|
+
badges: defineBadges({
|
|
22
|
+
packageName,
|
|
23
|
+
accessLevel: packageAccessLevel,
|
|
24
|
+
customRegistry,
|
|
25
|
+
registryPage
|
|
26
|
+
})
|
|
22
27
|
}
|
|
23
28
|
);
|
|
24
29
|
}
|
|
@@ -27,11 +27,11 @@ describe('publishable project-type lifter', () => {
|
|
|
27
27
|
const provenanceResults = any.simpleObject();
|
|
28
28
|
const mergedResults = any.simpleObject();
|
|
29
29
|
const badgesResults = any.simpleObject();
|
|
30
|
-
const
|
|
30
|
+
const registryPage = `https://www.npmjs.com/package/${packageName}`;
|
|
31
31
|
when(resolveRegistry).calledWith(packageName, registries).thenReturn(customRegistry);
|
|
32
32
|
when(liftProvenance).calledWith({packageDetails, projectRoot, customRegistry}).thenResolve(provenanceResults);
|
|
33
33
|
when(defineBadges)
|
|
34
|
-
.calledWith({packageName, accessLevel: packageAccessLevel, customRegistry})
|
|
34
|
+
.calledWith({packageName, accessLevel: packageAccessLevel, customRegistry, registryPage})
|
|
35
35
|
.thenReturn(badgesResults);
|
|
36
36
|
when(deepmerge).calledWith(
|
|
37
37
|
provenanceResults,
|
|
@@ -39,11 +39,11 @@ describe('publishable project-type lifter', () => {
|
|
|
39
39
|
scripts: {'lint:publish': 'publint --strict'},
|
|
40
40
|
dependencies: {javascript: {development: ['publint']}},
|
|
41
41
|
badges: badgesResults,
|
|
42
|
-
homepage
|
|
42
|
+
homepage: registryPage
|
|
43
43
|
}
|
|
44
44
|
).thenReturn(mergedResults);
|
|
45
45
|
|
|
46
46
|
expect(await lift({projectRoot, packageDetails, configs: {registries}})).toEqual(mergedResults);
|
|
47
|
-
expect(mergeIntoExistingPackageJson).toHaveBeenCalledWith({projectRoot, config: {homepage}});
|
|
47
|
+
expect(mergeIntoExistingPackageJson).toHaveBeenCalledWith({projectRoot, config: {homepage: registryPage}});
|
|
48
48
|
});
|
|
49
49
|
});
|
|
@@ -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 {
|
|
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(
|
|
101
|
-
.
|
|
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.
|
|
110
|
+
await expect(() => projectTypeScaffolder({projectType}, {logger}))
|
|
111
|
+
.rejects.toThrow(`The project-type of ${projectType} is invalid`);
|
|
113
112
|
});
|
|
114
113
|
});
|
package/src/prompts/questions.js
CHANGED
|
@@ -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,
|