diff --git a/package.json b/package.json index a80f825..09f820f 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,8 @@ "coverage": "vitest run --coverage", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", - "deploy-storybook": "gh-pages -d storybook-static" + "deploy-storybook": "gh-pages -d storybook-static", + "sync-to-compass": "ts-node scripts/sync-to-compass.ts" }, "dependencies": { "@emotion/react": "^11.14.0", @@ -94,6 +95,7 @@ "jsdom": "20.0.3", "prettier": "3.6.2", "storybook": "^9.0.10", + "ts-node": "^10.9.2", "typescript": "^5.7.3", "vite": "6.3.5", "vite-plugin-css-injected-by-js": "^3.5.2", diff --git a/scripts/sync-to-compass.ts b/scripts/sync-to-compass.ts new file mode 100644 index 0000000..c7fbdbb --- /dev/null +++ b/scripts/sync-to-compass.ts @@ -0,0 +1,106 @@ +#!/usr/bin/env ts-node + +/* eslint-disable no-console */ +const fs = require('fs'); +const path = require('path'); +const child_process = require('child_process'); + +// This script is used to sync the built diagramming package +// to the local Compass to test while developing. + +// For why we don't use npm link see: +// https://github.com/mongodb-js/compass/blob/117c32f8ddd5d2bf4f8fceec5b324bf9866de66e/packages/compass-web/scripts/sync-dist-to-mms.js#L47-L52 + +if (!process.env.COMPASS_HOME) { + throw new Error('Missing required environment variable $COMPASS_HOME.'); +} + +const packageDir = path.resolve(__dirname, '..'); +const srcDir = path.resolve(__dirname, '..', 'src'); +const libDir = path.resolve(__dirname, '..', 'dist'); + +const destDir = path.dirname( + child_process.execFileSync('node', ['-p', "require.resolve('@mongodb-js/diagramming')"], { + cwd: process.env.COMPASS_HOME, + encoding: 'utf-8', + }), +); + +console.log({ packageDir, srcDir, libDir, destDir }); + +function debounce void>( + fn: T, + delay: number, + options: { leading?: boolean; trailing?: boolean } = {}, +): () => void { + let timeoutId: NodeJS.Timeout | null = null; + let lastArgs: Parameters | null = null; + + return function (this: ThisParameterType, ...args: Parameters) { + lastArgs = args; + + const executeCall = () => { + fn.apply(this, lastArgs as Parameters); + timeoutId = null; + }; + + if (timeoutId === null && options.leading) { + executeCall(); + } + + if (timeoutId) { + clearTimeout(timeoutId); + } + + if (options.trailing !== false) { + timeoutId = setTimeout(executeCall, delay); + } + }; +} + +const compileAndCopy = debounce( + () => { + try { + child_process.execFileSync('yarn', ['build'], { + cwd: packageDir, + encoding: 'utf-8', + }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (err: any) { + if (err.code) { + // Spawning child process failed. + console.error(err.code); + } else { + // Child was spawned but exited with non-zero exit code. + // Error contains any stdout and stderr from the child. + const { stdout, stderr } = err; + + console.log(stdout); + console.error(stderr); + } + } + fs.cpSync(libDir, destDir, { recursive: true }); + console.log('done.'); + }, + 1_000, + { + leading: true, + trailing: true, + }, +); + +const srcWatcher = fs.watch(srcDir, { recursive: true }, (eventType: string, filename: string) => { + console.log(eventType, filename); + compileAndCopy(); +}); + +function cleanup() { + srcWatcher.close(); +} + +for (const evt of ['SIGINT', 'SIGTERM']) { + process.on(evt, cleanup); +} + +// Run an initial copy on startup. +compileAndCopy(); diff --git a/yarn.lock b/yarn.lock index 2aa2e72..bebaf6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -255,6 +255,15 @@ __metadata: languageName: node linkType: hard +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 10c0/05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 + languageName: node + linkType: hard + "@cush/relative@npm:^1.0.0": version: 1.0.0 resolution: "@cush/relative@npm:1.0.0" @@ -1072,7 +1081,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.1.0": +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": version: 3.1.2 resolution: "@jridgewell/resolve-uri@npm:3.1.2" checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e @@ -1093,6 +1102,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: 10c0/fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" @@ -1341,6 +1360,7 @@ __metadata: react: "npm:17.0.2" react-dom: "npm:17.0.2" storybook: "npm:^9.0.10" + ts-node: "npm:^10.9.2" typescript: "npm:^5.7.3" vite: "npm:6.3.5" vite-plugin-css-injected-by-js: "npm:^3.5.2" @@ -2144,6 +2164,34 @@ __metadata: languageName: node linkType: hard +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node10@npm:1.0.11" + checksum: 10c0/28a0710e5d039e0de484bdf85fee883bfd3f6a8980601f4d44066b0a6bcd821d31c4e231d1117731c4e24268bd4cf2a788a6787c12fc7f8d11014c07d582783c + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb + languageName: node + linkType: hard + "@tybys/wasm-util@npm:^0.9.0": version: 0.9.0 resolution: "@tybys/wasm-util@npm:0.9.0" @@ -3214,7 +3262,7 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.2.0": +"acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": version: 8.3.4 resolution: "acorn-walk@npm:8.3.4" dependencies: @@ -3232,6 +3280,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.4.1": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" + bin: + acorn: bin/acorn + checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec + languageName: node + linkType: hard + "agent-base@npm:6": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -3373,6 +3430,13 @@ __metadata: languageName: node linkType: hard +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -4155,7 +4219,7 @@ __metadata: languageName: node linkType: hard -"create-require@npm:^1.1.1": +"create-require@npm:^1.1.0, create-require@npm:^1.1.1": version: 1.1.1 resolution: "create-require@npm:1.1.1" checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 @@ -4512,6 +4576,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + "diffie-hellman@npm:^5.0.3": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" @@ -7004,6 +7075,13 @@ __metadata: languageName: node linkType: hard +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + "make-fetch-happen@npm:^14.0.3": version: 14.0.3 resolution: "make-fetch-happen@npm:14.0.3" @@ -9329,6 +9407,44 @@ __metadata: languageName: node linkType: hard +"ts-node@npm:^10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.15.0": version: 3.15.0 resolution: "tsconfig-paths@npm:3.15.0" @@ -9707,6 +9823,13 @@ __metadata: languageName: node linkType: hard +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 + languageName: node + linkType: hard + "vite-node@npm:0.34.6": version: 0.34.6 resolution: "vite-node@npm:0.34.6" @@ -10241,6 +10364,13 @@ __metadata: languageName: node linkType: hard +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0"