@servicetitan/startup 35.0.0 → 35.2.0-far-1776.0
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/dist/cli/commands/mfe-generate-metadata.d.ts.map +1 -1
- package/dist/cli/commands/mfe-generate-metadata.js +6 -4
- package/dist/cli/commands/mfe-generate-metadata.js.map +1 -1
- package/dist/cypress-config/index.d.ts +2 -0
- package/dist/cypress-config/index.d.ts.map +1 -0
- package/dist/cypress-config/index.js +20 -0
- package/dist/cypress-config/index.js.map +1 -0
- package/dist/cypress-config/webpack-config.d.ts +4 -0
- package/dist/cypress-config/webpack-config.d.ts.map +1 -0
- package/dist/cypress-config/webpack-config.js +76 -0
- package/dist/cypress-config/webpack-config.js.map +1 -0
- package/dist/storybook-config/swc.js +1 -1
- package/dist/storybook-config/swc.js.map +1 -1
- package/dist/utils/find-package-lock.d.ts +2 -0
- package/dist/utils/find-package-lock.d.ts.map +1 -0
- package/dist/utils/find-package-lock.js +26 -0
- package/dist/utils/find-package-lock.js.map +1 -0
- package/dist/utils/find-up.js +4 -4
- package/dist/utils/find-up.js.map +1 -1
- package/dist/utils/get-base-tsconfig.d.ts +2 -0
- package/dist/utils/get-base-tsconfig.d.ts.map +1 -0
- package/dist/utils/get-base-tsconfig.js +21 -0
- package/dist/utils/get-base-tsconfig.js.map +1 -0
- package/dist/utils/get-package-data.d.ts.map +1 -1
- package/dist/utils/get-package-data.js +28 -1
- package/dist/utils/get-package-data.js.map +1 -1
- package/dist/utils/get-package-version.d.ts +2 -0
- package/dist/utils/get-package-version.d.ts.map +1 -0
- package/dist/utils/get-package-version.js +31 -0
- package/dist/utils/get-package-version.js.map +1 -0
- package/dist/utils/get-tsconfig-with-fallback.d.ts +6 -0
- package/dist/utils/get-tsconfig-with-fallback.d.ts.map +1 -0
- package/dist/utils/get-tsconfig-with-fallback.js +24 -0
- package/dist/utils/get-tsconfig-with-fallback.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/webpack/configs/cache-config.d.ts.map +1 -1
- package/dist/webpack/configs/cache-config.js +1 -14
- package/dist/webpack/configs/cache-config.js.map +1 -1
- package/dist/webpack/configs/utils/get-launchdarkly-sdk-version.d.ts.map +1 -1
- package/dist/webpack/configs/utils/get-launchdarkly-sdk-version.js +1 -11
- package/dist/webpack/configs/utils/get-launchdarkly-sdk-version.js.map +1 -1
- package/dist/webpack/configs/utils/get-web-components-version.d.ts.map +1 -1
- package/dist/webpack/configs/utils/get-web-components-version.js +5 -7
- package/dist/webpack/configs/utils/get-web-components-version.js.map +1 -1
- package/package.json +14 -13
- package/src/cli/commands/__tests__/mfe-generate-metadata.test.ts +23 -4
- package/src/cli/commands/mfe-generate-metadata.ts +6 -6
- package/src/cypress-config/__tests__/webpack-config.test.ts +124 -0
- package/src/cypress-config/index.ts +1 -0
- package/src/cypress-config/webpack-config.ts +58 -0
- package/src/storybook-config/__tests__/swc.test.ts +11 -0
- package/src/storybook-config/swc.ts +2 -2
- package/src/utils/__tests__/find-package-lock.test.ts +35 -0
- package/src/utils/__tests__/get-package-data.test.ts +97 -26
- package/src/utils/__tests__/get-package-version.test.ts +120 -0
- package/src/utils/__tests__/get-tsconfig-with-fallback.test.ts +23 -0
- package/src/utils/__tests__/get-tsconfig.test.ts +4 -4
- package/src/utils/find-package-lock.ts +10 -0
- package/src/utils/find-up.ts +1 -1
- package/src/utils/get-base-tsconfig.ts +5 -0
- package/src/utils/get-package-data.ts +27 -2
- package/src/utils/get-package-version.ts +31 -0
- package/src/utils/get-tsconfig-with-fallback.ts +12 -0
- package/src/utils/index.ts +4 -0
- package/src/webpack/configs/cache-config.ts +1 -10
- package/src/webpack/configs/utils/__tests__/get-launchdarkly-sdk-version.test.ts +24 -8
- package/src/webpack/configs/utils/__tests__/get-web-components-version.test.ts +30 -10
- package/src/webpack/configs/utils/get-launchdarkly-sdk-version.ts +2 -12
- package/src/webpack/configs/utils/get-web-components-version.ts +8 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/webpack/configs/utils/get-launchdarkly-sdk-version.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../../src/webpack/configs/utils/get-launchdarkly-sdk-version.ts"],"sourcesContent":["import { getPackageVersion } from '../../../utils';\n\nexport function getLaunchDarklySdkVersion() {\n return getPackageVersion('launchdarkly-js-client-sdk');\n}\n"],"names":["getLaunchDarklySdkVersion","getPackageVersion"],"mappings":";;;;+BAEgBA;;;eAAAA;;;uBAFkB;AAE3B,SAASA;IACZ,OAAOC,IAAAA,wBAAiB,EAAC;AAC7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-web-components-version.d.ts","sourceRoot":"","sources":["../../../../src/webpack/configs/utils/get-web-components-version.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-web-components-version.d.ts","sourceRoot":"","sources":["../../../../src/webpack/configs/utils/get-web-components-version.ts"],"names":[],"mappings":"AAEA,wBAAgB,uBAAuB,WAQtC"}
|
|
@@ -8,15 +8,13 @@ Object.defineProperty(exports, "getWebComponentsVersion", {
|
|
|
8
8
|
return getWebComponentsVersion;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
12
11
|
const _utils = require("../../../utils");
|
|
13
|
-
function _interop_require_default(obj) {
|
|
14
|
-
return obj && obj.__esModule ? obj : {
|
|
15
|
-
default: obj
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
12
|
function getWebComponentsVersion() {
|
|
19
|
-
|
|
13
|
+
const version = (0, _utils.getPackageVersion)('@servicetitan/web-components');
|
|
14
|
+
if (!version) {
|
|
15
|
+
throw new Error('Unable to resolve @servicetitan/web-components version from package-lock.json');
|
|
16
|
+
}
|
|
17
|
+
return version;
|
|
20
18
|
}
|
|
21
19
|
|
|
22
20
|
//# sourceMappingURL=get-web-components-version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/webpack/configs/utils/get-web-components-version.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../../src/webpack/configs/utils/get-web-components-version.ts"],"sourcesContent":["import { getPackageVersion } from '../../../utils';\n\nexport function getWebComponentsVersion() {\n const version = getPackageVersion('@servicetitan/web-components');\n if (!version) {\n throw new Error(\n 'Unable to resolve @servicetitan/web-components version from package-lock.json'\n );\n }\n return version;\n}\n"],"names":["getWebComponentsVersion","version","getPackageVersion","Error"],"mappings":";;;;+BAEgBA;;;eAAAA;;;uBAFkB;AAE3B,SAASA;IACZ,MAAMC,UAAUC,IAAAA,wBAAiB,EAAC;IAClC,IAAI,CAACD,SAAS;QACV,MAAM,IAAIE,MACN;IAER;IACA,OAAOF;AACX"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/startup",
|
|
3
|
-
"version": "35.0.0",
|
|
3
|
+
"version": "35.2.0-far-1776.0",
|
|
4
4
|
"description": "CLI to create multi-package Lerna projects with TypeScript and React",
|
|
5
5
|
"homepage": "https://docs.st.dev/docs/frontend/uikit/startup",
|
|
6
6
|
"repository": {
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"default": "./dist/index.js",
|
|
21
21
|
"types": "./dist/index.d.ts"
|
|
22
22
|
},
|
|
23
|
+
"./cypress-config": "./dist/cypress-config/index.js",
|
|
23
24
|
"./jest-preset": "./jest/jest-preset.js",
|
|
24
25
|
"./jest-resolver": "./dist/jest/resolver.js",
|
|
25
26
|
"./jest-svg-transformer": "./dist/jest/svg-transformer.js",
|
|
@@ -56,16 +57,16 @@
|
|
|
56
57
|
"@jest/core": "~30.3.0",
|
|
57
58
|
"@jest/types": "~30.3.0",
|
|
58
59
|
"@jsdevtools/coverage-istanbul-loader": "^3.0.5",
|
|
59
|
-
"@servicetitan/eslint-config": "35.
|
|
60
|
-
"@servicetitan/install": "35.
|
|
61
|
-
"@servicetitan/startup-utils": "35.
|
|
62
|
-
"@servicetitan/stylelint-config": "35.
|
|
60
|
+
"@servicetitan/eslint-config": "35.1.0",
|
|
61
|
+
"@servicetitan/install": "35.1.0",
|
|
62
|
+
"@servicetitan/startup-utils": "35.1.0",
|
|
63
|
+
"@servicetitan/stylelint-config": "35.1.0",
|
|
63
64
|
"@svgr/webpack": "^8.1.0",
|
|
64
65
|
"@swc/cli": "^0.5.0",
|
|
65
66
|
"@swc/core": "1.15.18",
|
|
66
67
|
"@types/debug": "^4.1.12",
|
|
67
68
|
"@types/jest": "~30.0.0",
|
|
68
|
-
"@vitest/coverage-v8": "^4.0
|
|
69
|
+
"@vitest/coverage-v8": "^4.1.0",
|
|
69
70
|
"chalk": "~4.1.2",
|
|
70
71
|
"cli-table3": "^0.6.5",
|
|
71
72
|
"cpx2": "8.0.0",
|
|
@@ -87,31 +88,32 @@
|
|
|
87
88
|
"json5": "^2.2.3",
|
|
88
89
|
"lerna": "~9.0.5",
|
|
89
90
|
"less": "~4.5.1",
|
|
90
|
-
"less-loader": "~12.3.
|
|
91
|
+
"less-loader": "~12.3.2",
|
|
91
92
|
"less-plugin-npm-import": "~2.1.0",
|
|
92
93
|
"lodash.kebabcase": "^4.1.1",
|
|
93
94
|
"lodash.memoize": "^4.1.2",
|
|
94
95
|
"memfs": "~4.56.11",
|
|
95
|
-
"mini-css-extract-plugin": "~2.10.
|
|
96
|
+
"mini-css-extract-plugin": "~2.10.1",
|
|
96
97
|
"moment-locales-webpack-plugin": "~1.2.0",
|
|
97
98
|
"multimatch": "~8.0.0",
|
|
98
99
|
"patch-package": "^8.0.1",
|
|
99
100
|
"portfinder": "~1.0.38",
|
|
100
101
|
"postcss": "~8.5.8",
|
|
101
102
|
"prettier": "~3.8.1",
|
|
102
|
-
"sass": "~1.
|
|
103
|
+
"sass": "~1.98.0",
|
|
103
104
|
"sass-loader": "~16.0.7",
|
|
104
105
|
"semver": "~7.7.4",
|
|
105
106
|
"source-map-loader": "~5.0.0",
|
|
106
107
|
"style-loader": "~4.0.0",
|
|
107
108
|
"stylelint": "~16.26.1",
|
|
109
|
+
"swc-loader": "^0.2.7",
|
|
108
110
|
"terminal-link": "^5.0.0",
|
|
109
|
-
"terser-webpack-plugin": "^5.
|
|
111
|
+
"terser-webpack-plugin": "^5.4.0",
|
|
110
112
|
"ts-jest": "29.4.6",
|
|
111
113
|
"ts-node": "~10.9.2",
|
|
112
114
|
"typed-css-modules": "~0.9.1",
|
|
113
115
|
"typescript": "5.9.3",
|
|
114
|
-
"vitest": "^4.0
|
|
116
|
+
"vitest": "^4.1.0",
|
|
115
117
|
"webpack": "~5.105.4",
|
|
116
118
|
"webpack-assets-manifest": "~6.5.1",
|
|
117
119
|
"webpack-bundle-analyzer": "^5.2.0",
|
|
@@ -143,6 +145,5 @@
|
|
|
143
145
|
},
|
|
144
146
|
"cli": {
|
|
145
147
|
"webpack": false
|
|
146
|
-
}
|
|
147
|
-
"gitHead": "3a5f2e6cad93c4e898091fb3d51310ccb26a91ee"
|
|
148
|
+
}
|
|
148
149
|
}
|
|
@@ -35,6 +35,7 @@ describe(`[startup] ${MfeGenerateMetadata.name}`, () => {
|
|
|
35
35
|
|
|
36
36
|
const mockParentPackageJson = {
|
|
37
37
|
name: 'parent-package',
|
|
38
|
+
workspaces: ['packages/*'],
|
|
38
39
|
dependencies: { 'some-dep': '^1.0.0' },
|
|
39
40
|
};
|
|
40
41
|
|
|
@@ -109,10 +110,28 @@ describe(`[startup] ${MfeGenerateMetadata.name}`, () => {
|
|
|
109
110
|
});
|
|
110
111
|
});
|
|
111
112
|
|
|
112
|
-
test('
|
|
113
|
-
await expect(subject()).
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
test('does not throw error', async () => {
|
|
114
|
+
await expect(subject()).resolves.not.toThrow();
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
describe('when tsconfig.json does not exist', () => {
|
|
119
|
+
beforeEach(() => {
|
|
120
|
+
vol.reset();
|
|
121
|
+
vol.fromJSON({
|
|
122
|
+
'./package.json': JSON.stringify(mockPackageJson),
|
|
123
|
+
'../../package.json': JSON.stringify(mockParentPackageJson),
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test('does not throw error', async () => {
|
|
128
|
+
await expect(subject()).resolves.not.toThrow();
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test('outputs metadata with empty entrypoints', async () => {
|
|
132
|
+
await subject();
|
|
133
|
+
|
|
134
|
+
expect(getMetadataFromStdout().entrypoints).toEqual({});
|
|
116
135
|
});
|
|
117
136
|
});
|
|
118
137
|
|
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
getFolders,
|
|
5
5
|
getPackageData,
|
|
6
6
|
getPackageName,
|
|
7
|
-
isWebComponent,
|
|
8
7
|
loadSharedDependencies,
|
|
9
8
|
log,
|
|
10
9
|
logErrors,
|
|
@@ -26,13 +25,14 @@ export class MfeGenerateMetadata extends Command<typeof options> {
|
|
|
26
25
|
|
|
27
26
|
@logErrors
|
|
28
27
|
async execute() {
|
|
29
|
-
if (!isWebComponent()) {
|
|
30
|
-
throw new Error('this command must be run inside a web-component directory');
|
|
31
|
-
}
|
|
32
|
-
|
|
33
28
|
const { output } = this.args;
|
|
34
29
|
|
|
35
|
-
|
|
30
|
+
let destination: string;
|
|
31
|
+
try {
|
|
32
|
+
({ destination } = getFolders());
|
|
33
|
+
} catch {
|
|
34
|
+
destination = 'dist';
|
|
35
|
+
}
|
|
36
36
|
const name = getPackageName();
|
|
37
37
|
const packageData = getPackageData();
|
|
38
38
|
const sharedDependencies = loadSharedDependencies(
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { fs, vol } from 'memfs';
|
|
2
|
+
import { getSwcOptions } from '../../cli/tasks';
|
|
3
|
+
import { TSConfig } from '../../cli/utils';
|
|
4
|
+
import { getBaseTsConfig } from '../../utils';
|
|
5
|
+
import { Overrides, rulesConfig } from '../../webpack/configs';
|
|
6
|
+
import { webpackConfig } from '../webpack-config';
|
|
7
|
+
|
|
8
|
+
jest.mock('fs', () => fs);
|
|
9
|
+
jest.mock('../../webpack/configs');
|
|
10
|
+
jest.mock('../../cli/tasks');
|
|
11
|
+
|
|
12
|
+
describe(`[startup/cypress-config] ${webpackConfig.name}`, () => {
|
|
13
|
+
const mockRules: any[] = [
|
|
14
|
+
{ test: /\.css$/, use: ['css-loader'] },
|
|
15
|
+
{ test: /\.module\.less$/, use: ['style-loader', 'less-loader'] },
|
|
16
|
+
];
|
|
17
|
+
const mockSwcOptions: any = { jsc: 'foobar' };
|
|
18
|
+
const mockTsConfig = { compilerOptions: { target: 'es2020' } };
|
|
19
|
+
const mockFallbackTsConfig = { compilerOptions: { target: 'es2018' } };
|
|
20
|
+
const fallbackConfig = getBaseTsConfig();
|
|
21
|
+
|
|
22
|
+
let overrides: Overrides | undefined;
|
|
23
|
+
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
jest.clearAllMocks();
|
|
26
|
+
jest.mocked(rulesConfig).mockReturnValue({ rules: mockRules });
|
|
27
|
+
jest.mocked(getSwcOptions).mockReturnValue(mockSwcOptions);
|
|
28
|
+
vol.fromJSON({
|
|
29
|
+
'tsconfig.json': JSON.stringify(mockTsConfig),
|
|
30
|
+
[fallbackConfig]: JSON.stringify(mockFallbackTsConfig),
|
|
31
|
+
});
|
|
32
|
+
overrides = undefined;
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
afterEach(() => vol.reset());
|
|
36
|
+
|
|
37
|
+
const subject = () => webpackConfig(overrides);
|
|
38
|
+
|
|
39
|
+
test('gets rules with non-production context', () => {
|
|
40
|
+
subject();
|
|
41
|
+
|
|
42
|
+
expect(rulesConfig).toHaveBeenCalledWith(
|
|
43
|
+
expect.objectContaining({ isProduction: false }),
|
|
44
|
+
expect.anything()
|
|
45
|
+
);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test('includes all rules from rulesConfig', () => {
|
|
49
|
+
const result = subject();
|
|
50
|
+
|
|
51
|
+
for (const rule of mockRules) {
|
|
52
|
+
expect(result.module!.rules).toContainEqual(rule);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('adds swc-loader rule for TypeScript files', () => {
|
|
57
|
+
const result = subject();
|
|
58
|
+
|
|
59
|
+
expect(result.module!.rules).toContainEqual(
|
|
60
|
+
expect.objectContaining({
|
|
61
|
+
test: /\.tsx?$/,
|
|
62
|
+
exclude: /node_modules/,
|
|
63
|
+
use: { loader: 'swc-loader', options: mockSwcOptions },
|
|
64
|
+
})
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('passes tsconfig content to getSwcOptions', () => {
|
|
69
|
+
subject();
|
|
70
|
+
|
|
71
|
+
const tsConfigArg = jest.mocked(getSwcOptions).mock.calls[0][0];
|
|
72
|
+
expect(tsConfigArg).toStrictEqual(new TSConfig('tsconfig.json'));
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('when no tsconfig is found', () => {
|
|
76
|
+
beforeEach(() => fs.rmSync('tsconfig.json'));
|
|
77
|
+
|
|
78
|
+
test('gets default swc config from base.json', () => {
|
|
79
|
+
subject();
|
|
80
|
+
|
|
81
|
+
const tsConfigArg = jest.mocked(getSwcOptions).mock.calls[0][0];
|
|
82
|
+
expect(tsConfigArg).toStrictEqual(new TSConfig(fallbackConfig));
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('includes resolve extensions for TypeScript and JavaScript', () => {
|
|
87
|
+
expect(subject().resolve!.extensions).toEqual(['.ts', '.tsx', '.js', '.jsx']);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
describe('with overrides', () => {
|
|
91
|
+
beforeEach(() => (overrides = { plugins: { MiniCssExtractPlugin: {} } }));
|
|
92
|
+
|
|
93
|
+
test('passes overrides through to rulesConfig', () => {
|
|
94
|
+
subject();
|
|
95
|
+
|
|
96
|
+
expect(rulesConfig).toHaveBeenCalledWith(expect.anything(), overrides);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
describe('with configuration overrides', () => {
|
|
100
|
+
beforeEach(
|
|
101
|
+
() =>
|
|
102
|
+
(overrides = {
|
|
103
|
+
configuration: {
|
|
104
|
+
devtool: 'eval-source-map',
|
|
105
|
+
resolve: {
|
|
106
|
+
alias: {
|
|
107
|
+
'@': '/src',
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
})
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
test('merges configuration overrides into result', () => {
|
|
115
|
+
const result = subject();
|
|
116
|
+
|
|
117
|
+
expect(result.devtool).toBe(overrides!.configuration!.devtool);
|
|
118
|
+
expect(result.resolve?.alias).toEqual(overrides!.configuration!.resolve!.alias);
|
|
119
|
+
expect(result.resolve?.extensions).toEqual(['.ts', '.tsx', '.js', '.jsx']);
|
|
120
|
+
expect(result.module?.rules).toBeDefined();
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './webpack-config';
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { inspect } from 'node:util';
|
|
2
|
+
import type { Configuration } from 'webpack';
|
|
3
|
+
import merge from 'webpack-merge';
|
|
4
|
+
import { getSwcOptions } from '../cli/tasks';
|
|
5
|
+
import { TSConfig } from '../cli/utils';
|
|
6
|
+
import { getTsConfigWithFallback, log } from '../utils';
|
|
7
|
+
import { Context, Overrides, rulesConfig } from '../webpack/configs';
|
|
8
|
+
|
|
9
|
+
export function webpackConfig(overrides?: Overrides): Configuration {
|
|
10
|
+
const context = getContext();
|
|
11
|
+
const rules = getRules(context, overrides ?? {});
|
|
12
|
+
|
|
13
|
+
/* istanbul ignore next: debug only */
|
|
14
|
+
log.debug('cypress-config:webpack-config', () => inspect({ rules }, { depth: null }));
|
|
15
|
+
|
|
16
|
+
const config: Configuration = {
|
|
17
|
+
module: {
|
|
18
|
+
rules,
|
|
19
|
+
},
|
|
20
|
+
resolve: {
|
|
21
|
+
extensions: ['.ts', '.tsx', '.js', '.jsx'],
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
return merge(config, overrides?.configuration ?? {});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function getContext(): Context {
|
|
29
|
+
return {
|
|
30
|
+
destination: '',
|
|
31
|
+
isProduction: false,
|
|
32
|
+
name: '',
|
|
33
|
+
packageData: {} as any,
|
|
34
|
+
sharedDependencies: {},
|
|
35
|
+
source: '',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function getRules(context: Context, overrides: Overrides) {
|
|
40
|
+
const { rules } = rulesConfig(context, overrides);
|
|
41
|
+
|
|
42
|
+
return [getSwcLoaderRule(), ...rules];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function getSwcLoaderRule() {
|
|
46
|
+
const tsConfig = new TSConfig(getTsConfigWithFallback());
|
|
47
|
+
|
|
48
|
+
const swcOptions = getSwcOptions(tsConfig);
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
test: /\.tsx?$/,
|
|
52
|
+
exclude: /node_modules/,
|
|
53
|
+
use: {
|
|
54
|
+
loader: 'swc-loader',
|
|
55
|
+
options: swcOptions,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -2,16 +2,19 @@ import { SwcOptions } from '@swc/cli';
|
|
|
2
2
|
import { fs, vol } from 'memfs';
|
|
3
3
|
import { getSwcOptions } from '../../cli/tasks';
|
|
4
4
|
import { TSConfig } from '../../cli/utils';
|
|
5
|
+
import { getBaseTsConfig } from '../../utils';
|
|
5
6
|
import { swc } from '../swc';
|
|
6
7
|
|
|
7
8
|
jest.mock('fs', () => fs);
|
|
8
9
|
|
|
9
10
|
describe(`[startup/storybook-config] ${swc.name}`, () => {
|
|
11
|
+
const baseJsonPath = getBaseTsConfig();
|
|
10
12
|
const config: SwcOptions = { env: { bugfixes: true } };
|
|
11
13
|
let tsConfig: TSConfig;
|
|
12
14
|
|
|
13
15
|
function setTsConfig(config: Record<string, any> = {}) {
|
|
14
16
|
return vol.fromJSON({
|
|
17
|
+
[baseJsonPath]: JSON.stringify({ compilerOptions: { sourceMap: true } }),
|
|
15
18
|
'tsconfig.json': JSON.stringify(config),
|
|
16
19
|
});
|
|
17
20
|
}
|
|
@@ -34,4 +37,12 @@ describe(`[startup/storybook-config] ${swc.name}`, () => {
|
|
|
34
37
|
expect(subject().jsc.target).toBeUndefined();
|
|
35
38
|
});
|
|
36
39
|
});
|
|
40
|
+
|
|
41
|
+
describe('when no tsconfig is found', () => {
|
|
42
|
+
beforeEach(() => fs.rmSync('tsconfig.json'));
|
|
43
|
+
|
|
44
|
+
test('gets default swc config from base.json', () => {
|
|
45
|
+
expect(subject()).toEqual({ ...config, ...getSwcOptions(new TSConfig(baseJsonPath)) });
|
|
46
|
+
});
|
|
47
|
+
});
|
|
37
48
|
});
|
|
@@ -2,10 +2,10 @@ import type { SwcOptions } from '@swc/cli';
|
|
|
2
2
|
import { inspect } from 'node:util';
|
|
3
3
|
import { getSwcOptions } from '../cli/tasks';
|
|
4
4
|
import { TSConfig } from '../cli/utils';
|
|
5
|
-
import {
|
|
5
|
+
import { getTsConfigWithFallback, log } from '../utils';
|
|
6
6
|
|
|
7
7
|
export function swc(config: SwcOptions) {
|
|
8
|
-
const tsConfig = new TSConfig(
|
|
8
|
+
const tsConfig = new TSConfig(getTsConfigWithFallback());
|
|
9
9
|
const swcOptions = getSwcOptions(tsConfig);
|
|
10
10
|
|
|
11
11
|
/*
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { fs, vol } from 'memfs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { findPackageLock } from '../find-package-lock';
|
|
4
|
+
|
|
5
|
+
jest.mock('fs', () => fs);
|
|
6
|
+
|
|
7
|
+
describe(`[startup] ${findPackageLock.name}`, () => {
|
|
8
|
+
afterEach(() => vol.reset());
|
|
9
|
+
|
|
10
|
+
const subject = () => findPackageLock();
|
|
11
|
+
|
|
12
|
+
describe('when package-lock.json exists in cwd', () => {
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
vol.fromJSON({ './package-lock.json': '{}' });
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('returns path', () => {
|
|
18
|
+
expect(subject()).toBe(path.resolve('./package-lock.json'));
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('when package-lock.json exists in parent directory', () => {
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
vol.fromJSON({ '../package-lock.json': '{}' });
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('returns path', () => {
|
|
28
|
+
expect(subject()).toBe(path.resolve('../package-lock.json'));
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('returns undefined when no package-lock.json exists', () => {
|
|
33
|
+
expect(subject()).toBeUndefined();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
@@ -1,47 +1,118 @@
|
|
|
1
|
+
import { fs, vol } from 'memfs';
|
|
1
2
|
import { getPackageData, getPackageDependencyVersion } from '../get-package-data';
|
|
2
|
-
import { readJson } from '../read-json';
|
|
3
3
|
|
|
4
|
-
jest.mock('
|
|
4
|
+
jest.mock('fs', () => fs);
|
|
5
5
|
|
|
6
6
|
describe(`[startup] Utils`, () => {
|
|
7
7
|
describe(`${getPackageData.name}`, () => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
afterEach(() => vol.reset());
|
|
9
|
+
|
|
10
|
+
const subject = () => getPackageData();
|
|
11
|
+
|
|
12
|
+
describe('when root package.json with workspaces exists', () => {
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
vol.fromJSON({
|
|
15
|
+
'./package.json': JSON.stringify({
|
|
16
|
+
name: 'packageName',
|
|
17
|
+
dependencies: { foo: '1.1.0', baz: '3.0.0' },
|
|
18
|
+
}),
|
|
19
|
+
'../package.json': JSON.stringify({
|
|
20
|
+
workspaces: ['packages/*'],
|
|
21
|
+
dependencies: { foo: '1.0.0', bar: '2.0.0' },
|
|
22
|
+
}),
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test('returns merged dependencies (local overrides root)', () => {
|
|
27
|
+
expect(subject()).toEqual({
|
|
16
28
|
name: 'packageName',
|
|
17
|
-
dependencies: { foo: '1.1.0', baz: '3.0.0' },
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
jest.mocked(readJson).mockImplementation(path => packages[path] ?? {});
|
|
29
|
+
dependencies: { foo: '1.1.0', bar: '2.0.0', baz: '3.0.0' },
|
|
30
|
+
});
|
|
31
|
+
});
|
|
21
32
|
});
|
|
22
33
|
|
|
23
|
-
|
|
34
|
+
describe('when no root package.json found', () => {
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
vol.fromJSON({
|
|
37
|
+
'./package.json': JSON.stringify({
|
|
38
|
+
name: 'rootPackage',
|
|
39
|
+
workspaces: ['packages/*'],
|
|
40
|
+
dependencies: { foo: '1.0.0' },
|
|
41
|
+
}),
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('returns only local dependencies', () => {
|
|
46
|
+
expect(subject()).toEqual({
|
|
47
|
+
name: 'rootPackage',
|
|
48
|
+
dependencies: { foo: '1.0.0' },
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
describe('when root has lerna.json with packages instead of workspaces', () => {
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
vol.fromJSON({
|
|
56
|
+
'./package.json': JSON.stringify({
|
|
57
|
+
name: 'packageName',
|
|
58
|
+
version: '2.0.0',
|
|
59
|
+
dependencies: { foo: '1.0.0' },
|
|
60
|
+
}),
|
|
61
|
+
'../package.json': JSON.stringify({
|
|
62
|
+
dependencies: { bar: '2.0.0' },
|
|
63
|
+
}),
|
|
64
|
+
'../lerna.json': JSON.stringify({
|
|
65
|
+
packages: ['packages/*'],
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('returns dependencies from root discovered via lerna.json', () => {
|
|
71
|
+
expect(subject()).toEqual({
|
|
72
|
+
name: 'packageName',
|
|
73
|
+
version: '2.0.0',
|
|
74
|
+
dependencies: { bar: '2.0.0', foo: '1.0.0' },
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
describe('when root has lerna.json but no package.json at root level', () => {
|
|
80
|
+
beforeEach(() => {
|
|
81
|
+
vol.fromJSON({
|
|
82
|
+
'./package.json': JSON.stringify({
|
|
83
|
+
name: 'packageName',
|
|
84
|
+
version: '3.0.0',
|
|
85
|
+
dependencies: { foo: '1.0.0' },
|
|
86
|
+
}),
|
|
87
|
+
'../lerna.json': JSON.stringify({
|
|
88
|
+
packages: ['packages/*'],
|
|
89
|
+
}),
|
|
90
|
+
});
|
|
91
|
+
});
|
|
24
92
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
},
|
|
93
|
+
test('returns only local dependencies', () => {
|
|
94
|
+
expect(subject()).toEqual({
|
|
95
|
+
name: 'packageName',
|
|
96
|
+
version: '3.0.0',
|
|
97
|
+
dependencies: { foo: '1.0.0' },
|
|
98
|
+
});
|
|
32
99
|
});
|
|
33
100
|
});
|
|
34
101
|
|
|
35
|
-
describe(
|
|
102
|
+
describe('when package.json contains sharedDependencies', () => {
|
|
36
103
|
const sharedDependencies = { react: 'SharedDependencies.React' };
|
|
37
104
|
|
|
38
105
|
beforeEach(() => {
|
|
39
|
-
|
|
40
|
-
|
|
106
|
+
vol.fromJSON({
|
|
107
|
+
'./package.json': JSON.stringify({
|
|
108
|
+
name: 'packageName',
|
|
109
|
+
dependencies: { foo: '1.0.0' },
|
|
110
|
+
cli: { webpack: { 'shared-dependencies': sharedDependencies } },
|
|
111
|
+
}),
|
|
41
112
|
});
|
|
42
113
|
});
|
|
43
114
|
|
|
44
|
-
test('
|
|
115
|
+
test('result contains sharedDependencies', () => {
|
|
45
116
|
expect(subject()).toEqual(expect.objectContaining({ sharedDependencies }));
|
|
46
117
|
});
|
|
47
118
|
});
|