aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-30 12:05:27 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-30 12:05:27 +0100
commit62d816402c6ddccf22c9ac68822cf100f61662d6 (patch)
tree3963ce347ea0278e22f63eb16615ef3a23c23bf9
parentbuild: Simplify clean script (diff)
downloadsophie-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.js5
-rw-r--r--packages/service-shared/esbuild.config.js21
-rw-r--r--packages/service-shared/package.json2
-rw-r--r--packages/shared/package.json1
-rw-r--r--scripts/build.js21
-rw-r--r--scripts/watch.js43
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
3const { join } = require('path');
4
3/** @type {import('ts-jest').InitialOptionsTsJest} */ 5/** @type {import('ts-jest').InitialOptionsTsJest} */
4module.exports = { 6module.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
3const { chrome } = require('../../config/build-common');
4const { getConfig } = require('../../config/esbuild-config');
5
6module.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
20function buildAll() { 20function 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';
11process.env.NODE_ENV = 'development'; 11process.env.NODE_ENV = 'development';
12 12
13/** @type {string} */ 13/** @type {string} */
14const sharedPackageSource = packageSource('shared'); 14const sharedModule = join(__dirname, '../packages/shared/dist/index.mjs');
15 15
16/** @type {string} */ 16/** @type {string} */
17const serviceSharedPackageSource = packageSource('service-shared'); 17const serviceSharedModule = join(__dirname, '../packages/service-shared/dist/index.mjs');
18 18
19/** @type {RegExp[]} */ 19/** @type {RegExp[]} */
20const stderrIgnorePatterns = [ 20const stderrIgnorePatterns = [
@@ -29,14 +29,6 @@ const stderrIgnorePatterns = [
29 29
30/** 30/**
31 * @param {string} packageName 31 * @param {string} packageName
32 * @returns {string}
33 */
34function 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 */
102function setupPreloadPackageWatcher(sendEvent) { 94function 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 */
115function setupServicePackageWatcher(packageName, sendEvent) { 107function 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}