diff options
author | Kristóf Marussy <kristof@marussy.com> | 2021-12-30 12:05:27 +0100 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2021-12-30 12:05:27 +0100 |
commit | 62d816402c6ddccf22c9ac68822cf100f61662d6 (patch) | |
tree | 3963ce347ea0278e22f63eb16615ef3a23c23bf9 | |
parent | build: Simplify clean script (diff) | |
download | sophie-62d816402c6ddccf22c9ac68822cf100f61662d6.tar.gz sophie-62d816402c6ddccf22c9ac68822cf100f61662d6.tar.zst sophie-62d816402c6ddccf22c9ac68822cf100f61662d6.zip |
build: Use shared packages through modules
By running the build for the shared packages only once, errors in them
are reported only once in watch mode.
We still have to point jest to the original source files (and rebuild
the shared source files as part of the test), because it won't load the
"module" entry of the shared packages. However, as a benefit, jest can
now run even if the shared packages haven't been built yet.
-rw-r--r-- | jest.config.js | 5 | ||||
-rw-r--r-- | packages/service-shared/esbuild.config.js | 21 | ||||
-rw-r--r-- | packages/service-shared/package.json | 2 | ||||
-rw-r--r-- | packages/shared/package.json | 1 | ||||
-rw-r--r-- | scripts/build.js | 21 | ||||
-rw-r--r-- | scripts/watch.js | 43 |
6 files changed, 62 insertions, 31 deletions
diff --git a/jest.config.js b/jest.config.js index 6943513..d0ba361 100644 --- a/jest.config.js +++ b/jest.config.js | |||
@@ -1,5 +1,7 @@ | |||
1 | // @ts-check | 1 | // @ts-check |
2 | 2 | ||
3 | const { join } = require('path'); | ||
4 | |||
3 | /** @type {import('ts-jest').InitialOptionsTsJest} */ | 5 | /** @type {import('ts-jest').InitialOptionsTsJest} */ |
4 | module.exports = { | 6 | module.exports = { |
5 | preset: 'ts-jest', | 7 | preset: 'ts-jest', |
@@ -8,6 +10,9 @@ module.exports = { | |||
8 | isolatedModules: true, | 10 | isolatedModules: true, |
9 | }, | 11 | }, |
10 | }, | 12 | }, |
13 | moduleNameMapper: { | ||
14 | '@sophie/(.+)': join(__dirname, 'packages/$1/src/index.ts'), | ||
15 | }, | ||
11 | resetMocks: true, | 16 | resetMocks: true, |
12 | restoreMocks: true, | 17 | restoreMocks: true, |
13 | testEnvironment: 'node', | 18 | testEnvironment: 'node', |
diff --git a/packages/service-shared/esbuild.config.js b/packages/service-shared/esbuild.config.js new file mode 100644 index 0000000..ce57cd7 --- /dev/null +++ b/packages/service-shared/esbuild.config.js | |||
@@ -0,0 +1,21 @@ | |||
1 | // @ts-check | ||
2 | |||
3 | const { chrome } = require('../../config/build-common'); | ||
4 | const { getConfig } = require('../../config/esbuild-config'); | ||
5 | |||
6 | module.exports = getConfig({ | ||
7 | absWorkingDir: __dirname, | ||
8 | entryPoints: [ | ||
9 | 'src/index.ts', | ||
10 | ], | ||
11 | outfile: 'dist/index.mjs', | ||
12 | format: 'esm', | ||
13 | // The package that includes this one will have a header comment, | ||
14 | // no need to have an additional one here. | ||
15 | banner: {}, | ||
16 | platform: 'node', | ||
17 | target: chrome, | ||
18 | external: [ | ||
19 | 'zod', | ||
20 | ], | ||
21 | }); | ||
diff --git a/packages/service-shared/package.json b/packages/service-shared/package.json index 6f34a9d..e812e4a 100644 --- a/packages/service-shared/package.json +++ b/packages/service-shared/package.json | |||
@@ -3,7 +3,7 @@ | |||
3 | "version": "0.1.0", | 3 | "version": "0.1.0", |
4 | "private": true, | 4 | "private": true, |
5 | "sideEffects": false, | 5 | "sideEffects": false, |
6 | "main": "src/index.ts", | 6 | "module": "dist/index.mjs", |
7 | "types": "dist/index.d.ts", | 7 | "types": "dist/index.d.ts", |
8 | "scripts": { | 8 | "scripts": { |
9 | "typecheck": "tsc" | 9 | "typecheck": "tsc" |
diff --git a/packages/shared/package.json b/packages/shared/package.json index e2b2c77..e4b57b0 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json | |||
@@ -3,7 +3,6 @@ | |||
3 | "version": "0.1.0", | 3 | "version": "0.1.0", |
4 | "private": true, | 4 | "private": true, |
5 | "sideEffects": false, | 5 | "sideEffects": false, |
6 | "main": "src/index.ts", | ||
7 | "module": "dist/index.mjs", | 6 | "module": "dist/index.mjs", |
8 | "types": "dist/index.d.ts", | 7 | "types": "dist/index.d.ts", |
9 | "scripts": { | 8 | "scripts": { |
diff --git a/scripts/build.js b/scripts/build.js index 416530d..5abcdab 100644 --- a/scripts/build.js +++ b/scripts/build.js | |||
@@ -18,16 +18,21 @@ function buildPackageVite(packageName) { | |||
18 | } | 18 | } |
19 | 19 | ||
20 | function buildAll() { | 20 | function buildAll() { |
21 | // Esbuild can natively load a typescript main file, | 21 | const buildServiceShared = buildPackageEsbuild('service-shared'); |
22 | // so we don't need to bundle `service-shared`. | ||
23 | // We onyl bundle `shared` for vite. | ||
24 | const buildShared = buildPackageEsbuild('shared'); | 22 | const buildShared = buildPackageEsbuild('shared'); |
25 | return Promise.all([ | 23 | return Promise.all([ |
26 | buildShared.then(() => buildPackageEsbuild('main')), | 24 | Promise.all([ |
27 | buildPackageEsbuild('service-inject'), | 25 | buildServiceShared, |
28 | buildPackageEsbuild('service-preload'), | 26 | buildShared, |
29 | buildPackageEsbuild('preload'), | 27 | ]).then(() => buildPackageEsbuild('main')), |
30 | buildPackageVite('renderer'), | 28 | buildServiceShared.then(() => Promise.all([ |
29 | buildPackageEsbuild('service-inject'), | ||
30 | buildPackageEsbuild('service-preload'), | ||
31 | ])), | ||
32 | buildShared.then(() => Promise.all([ | ||
33 | buildPackageEsbuild('preload'), | ||
34 | buildPackageVite('renderer'), | ||
35 | ])), | ||
31 | ]); | 36 | ]); |
32 | } | 37 | } |
33 | 38 | ||
diff --git a/scripts/watch.js b/scripts/watch.js index 367ab88..d4229e9 100644 --- a/scripts/watch.js +++ b/scripts/watch.js | |||
@@ -11,10 +11,10 @@ process.env.MODE = 'development'; | |||
11 | process.env.NODE_ENV = 'development'; | 11 | process.env.NODE_ENV = 'development'; |
12 | 12 | ||
13 | /** @type {string} */ | 13 | /** @type {string} */ |
14 | const sharedPackageSource = packageSource('shared'); | 14 | const sharedModule = join(__dirname, '../packages/shared/dist/index.mjs'); |
15 | 15 | ||
16 | /** @type {string} */ | 16 | /** @type {string} */ |
17 | const serviceSharedPackageSource = packageSource('service-shared'); | 17 | const serviceSharedModule = join(__dirname, '../packages/service-shared/dist/index.mjs'); |
18 | 18 | ||
19 | /** @type {RegExp[]} */ | 19 | /** @type {RegExp[]} */ |
20 | const stderrIgnorePatterns = [ | 20 | const stderrIgnorePatterns = [ |
@@ -29,14 +29,6 @@ const stderrIgnorePatterns = [ | |||
29 | 29 | ||
30 | /** | 30 | /** |
31 | * @param {string} packageName | 31 | * @param {string} packageName |
32 | * @returns {string} | ||
33 | */ | ||
34 | function packageSource(packageName) { | ||
35 | return join(__dirname, `../packages/${packageName}/src`); | ||
36 | } | ||
37 | |||
38 | /** | ||
39 | * @param {string} packageName | ||
40 | * @param {string[]} [extraPaths] | 32 | * @param {string[]} [extraPaths] |
41 | * @param {() => void} [callback] | 33 | * @param {() => void} [callback] |
42 | * @return {Promise<void>} | 34 | * @return {Promise<void>} |
@@ -47,7 +39,7 @@ async function setupEsbuildWatcher(packageName, extraPaths, callback) { | |||
47 | config.incremental = true; | 39 | config.incremental = true; |
48 | const incrementalBuild = await esbuild.build(config); | 40 | const incrementalBuild = await esbuild.build(config); |
49 | const paths = [ | 41 | const paths = [ |
50 | packageSource(packageName), | 42 | join(__dirname, `../packages/${packageName}/src`), |
51 | ...(extraPaths || []), | 43 | ...(extraPaths || []), |
52 | ]; | 44 | ]; |
53 | const watcher = chokidar.watch(paths, { | 45 | const watcher = chokidar.watch(paths, { |
@@ -60,8 +52,8 @@ async function setupEsbuildWatcher(packageName, extraPaths, callback) { | |||
60 | } | 52 | } |
61 | watcher.on('change', () => { | 53 | watcher.on('change', () => { |
62 | incrementalBuild.rebuild().then(() => { | 54 | incrementalBuild.rebuild().then(() => { |
63 | console.log(`\u26a1 Reloading package ${packageName}`); | ||
64 | if (callback) { | 55 | if (callback) { |
56 | console.log(`\u26a1 Reloading package ${packageName}`); | ||
65 | callback(); | 57 | callback(); |
66 | } | 58 | } |
67 | }).catch((err) => { | 59 | }).catch((err) => { |
@@ -100,7 +92,7 @@ async function setupDevServer(packageName) { | |||
100 | * @return {Promise<void>} | 92 | * @return {Promise<void>} |
101 | */ | 93 | */ |
102 | function setupPreloadPackageWatcher(sendEvent) { | 94 | function setupPreloadPackageWatcher(sendEvent) { |
103 | return setupEsbuildWatcher('preload', [sharedPackageSource], () => { | 95 | return setupEsbuildWatcher('preload', [sharedModule], () => { |
104 | sendEvent({ | 96 | sendEvent({ |
105 | type: 'full-reload', | 97 | type: 'full-reload', |
106 | }); | 98 | }); |
@@ -113,7 +105,7 @@ function setupPreloadPackageWatcher(sendEvent) { | |||
113 | * @return {Promise<void>} | 105 | * @return {Promise<void>} |
114 | */ | 106 | */ |
115 | function setupServicePackageWatcher(packageName, sendEvent) { | 107 | function setupServicePackageWatcher(packageName, sendEvent) { |
116 | return setupEsbuildWatcher(packageName, [serviceSharedPackageSource], () => { | 108 | return setupEsbuildWatcher(packageName, [serviceSharedModule], () => { |
117 | sendEvent({ | 109 | sendEvent({ |
118 | type: 'custom', | 110 | type: 'custom', |
119 | event: 'sophie:reload-services', | 111 | event: 'sophie:reload-services', |
@@ -139,8 +131,8 @@ function setupMainPackageWatcher(viteDevServer) { | |||
139 | return setupEsbuildWatcher( | 131 | return setupEsbuildWatcher( |
140 | 'main', | 132 | 'main', |
141 | [ | 133 | [ |
142 | serviceSharedPackageSource, | 134 | serviceSharedModule, |
143 | sharedPackageSource | 135 | sharedModule, |
144 | ], | 136 | ], |
145 | () => { | 137 | () => { |
146 | if (spawnProcess !== null) { | 138 | if (spawnProcess !== null) { |
@@ -174,13 +166,22 @@ async function setupDevEnvironment() { | |||
174 | viteDevServer.ws.send(event); | 166 | viteDevServer.ws.send(event); |
175 | } | 167 | } |
176 | }; | 168 | }; |
169 | |||
170 | const sharedWatcher = setupEsbuildWatcher('shared'); | ||
171 | const serviceSharedWatcher = setupEsbuildWatcher('service-shared'); | ||
177 | await Promise.all([ | 172 | await Promise.all([ |
178 | setupEsbuildWatcher('shared'), | 173 | sharedWatcher.then(() => Promise.all([ |
179 | setupPreloadPackageWatcher(sendEvent), | 174 | setupPreloadPackageWatcher(sendEvent), |
180 | setupServicePackageWatcher('service-inject', sendEvent), | 175 | setupDevServer('renderer').then((devServer) => { |
181 | setupServicePackageWatcher('service-preload', sendEvent), | 176 | viteDevServer = devServer; |
177 | }), | ||
178 | ])), | ||
179 | serviceSharedWatcher.then(() => Promise.all([ | ||
180 | setupServicePackageWatcher('service-inject', sendEvent), | ||
181 | setupServicePackageWatcher('service-preload', sendEvent), | ||
182 | ])), | ||
182 | ]); | 183 | ]); |
183 | viteDevServer = await setupDevServer('renderer'); | 184 | |
184 | console.log('\ud83c\udf80 Sophie is starting up') | 185 | console.log('\ud83c\udf80 Sophie is starting up') |
185 | return setupMainPackageWatcher(viteDevServer); | 186 | return setupMainPackageWatcher(viteDevServer); |
186 | } | 187 | } |