@simplysm/sd-cli 13.0.7 → 13.0.8
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/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +4 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/orchestrators/WatchOrchestrator.d.ts +1 -0
- package/dist/orchestrators/WatchOrchestrator.d.ts.map +1 -1
- package/dist/orchestrators/WatchOrchestrator.js +4 -1
- package/dist/orchestrators/WatchOrchestrator.js.map +1 -1
- package/dist/utils/replace-deps.d.ts +32 -2
- package/dist/utils/replace-deps.d.ts.map +1 -1
- package/dist/utils/replace-deps.js +129 -5
- package/dist/utils/replace-deps.js.map +1 -1
- package/package.json +4 -4
- package/src/commands/dev.ts +4 -1
- package/src/orchestrators/WatchOrchestrator.ts +4 -1
- package/src/utils/replace-deps.ts +222 -9
- package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
- package/templates/add-server/__SERVER__/package.json.hbs +2 -2
- package/templates/init/package.json.hbs +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAyBA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAyBA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4hB/D"}
|
package/dist/commands/dev.js
CHANGED
|
@@ -5,7 +5,7 @@ import { Worker } from "@simplysm/core-node";
|
|
|
5
5
|
import { consola } from "consola";
|
|
6
6
|
import { loadSdConfig } from "../utils/sd-config.js";
|
|
7
7
|
import { getVersion } from "../utils/build-env.js";
|
|
8
|
-
import { setupReplaceDeps } from "../utils/replace-deps.js";
|
|
8
|
+
import { setupReplaceDeps, watchReplaceDeps } from "../utils/replace-deps.js";
|
|
9
9
|
import { Capacitor } from "../capacitor/capacitor.js";
|
|
10
10
|
import { filterPackagesByTargets, getWatchScopes } from "../utils/package-utils.js";
|
|
11
11
|
import { printErrors, printServers } from "../utils/output-utils.js";
|
|
@@ -27,8 +27,10 @@ async function runDev(options) {
|
|
|
27
27
|
process.exitCode = 1;
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
|
+
let replaceDepWatcher;
|
|
30
31
|
if (sdConfig.replaceDeps != null) {
|
|
31
32
|
await setupReplaceDeps(cwd, sdConfig.replaceDeps);
|
|
33
|
+
replaceDepWatcher = await watchReplaceDeps(cwd, sdConfig.replaceDeps);
|
|
32
34
|
}
|
|
33
35
|
const version = await getVersion(cwd);
|
|
34
36
|
const baseEnv = { VER: version, DEV: "true" };
|
|
@@ -424,6 +426,7 @@ async function runDev(options) {
|
|
|
424
426
|
...[...serverBuildWorkers.values()].map(({ worker }) => worker.terminate()),
|
|
425
427
|
...[...serverRuntimeWorkers.values()].map((worker) => worker.terminate())
|
|
426
428
|
]);
|
|
429
|
+
replaceDepWatcher?.dispose();
|
|
427
430
|
process.stdout.write("\u2714 \uC644\uB8CC\n");
|
|
428
431
|
}
|
|
429
432
|
export {
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/dev.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,aAAa;AACtB,SAAS,cAAgC;AAEzC,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,
|
|
4
|
+
"mappings": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,aAAa;AACtB,SAAS,cAAgC;AAEzC,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB,wBAAoD;AAI/E,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB,sBAA0C;AAC5E,SAAS,aAAa,oBAAoB;AAC1C,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,OAIK;AAyCP,eAAsB,OAAO,SAAoC;AAC/D,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,QAAQ,QAAQ,YAAY;AAE3C,SAAO,MAAM,oBAAU,EAAE,QAAQ,CAAC;AAGlC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,aAAa,EAAE,KAAK,KAAK,MAAM,KAAK,QAAQ,QAAQ,CAAC;AACtE,WAAO,MAAM,wCAAoB;AAAA,EACnC,SAAS,KAAK;AACZ,YAAQ,MAAM,2CAAuB,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE;AAC/E,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,SAAS,eAAe,MAAM;AAChC,UAAM,iBAAiB,KAAK,SAAS,WAAW;AAChD,wBAAoB,MAAM,iBAAiB,KAAK,SAAS,WAAW;AAAA,EACtE;AAGA,QAAM,UAAU,MAAM,WAAW,GAAG;AACpC,QAAM,UAAU,EAAE,KAAK,SAAS,KAAK,OAAO;AAG5C,QAAM,kBAAkB,KAAK,KAAK,KAAK,cAAc;AACrD,QAAM,cAAc,KAAK,MAAM,GAAG,aAAa,iBAAiB,OAAO,CAAC,EAAE;AAC1E,QAAM,cAAc,eAAe,WAAW;AAG9C,QAAM,cAAc,wBAAwB,SAAS,UAAU,OAAO;AAGtE,QAAM,iBAAyE,CAAC;AAChF,QAAM,iBAAyE,CAAC;AAEhF,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,WAAW,GAAG;AACxD,QAAI,OAAO,WAAW,UAAU;AAC9B,qBAAe,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,IACtC,WAAW,OAAO,WAAW,UAAU;AACrC,qBAAe,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,IACtC;AAAA,EACF;AAEA,MAAI,eAAe,WAAW,KAAK,eAAe,WAAW,GAAG;AAC9D,YAAQ,OAAO,MAAM,qFAAmC;AACxD;AAAA,EACF;AAGA,QAAM,cAAc,IAAI,IAAI,eAAe,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC;AAClE,QAAM,mBAAmB,oBAAI,IAAsB;AACnD,aAAW,EAAE,MAAM,OAAO,KAAK,gBAAgB;AAC7C,QAAI,OAAO,OAAO,WAAW,YAAY,YAAY,IAAI,OAAO,MAAM,GAAG;AACvE,YAAM,UAAU,iBAAiB,IAAI,OAAO,MAAM,KAAK,CAAC;AACxD,cAAQ,KAAK,IAAI;AACjB,uBAAiB,IAAI,OAAO,QAAQ,OAAO;AAAA,IAC7C;AAAA,EACF;AAGA,QAAM,mBAAmB,YAAY,QAAQ,0BAA0B;AACvE,QAAM,mBAAmB,YAAY,QAAQ,0BAA0B;AACvE,QAAM,0BAA0B,YAAY,QAAQ,kCAAkC;AAKtF,QAAM,0BAA8C,eACjD;AAAA,IACC,CAAC,EAAE,OAAO,MACR,OAAO,OAAO,WAAW,YAAa,OAAO,OAAO,WAAW,YAAY,CAAC,YAAY,IAAI,OAAO,MAAM;AAAA,EAC7G,EACC,IAAI,CAAC,EAAE,MAAM,OAAO,OAAO;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,OAAkC,gBAAgB;AAAA,IACjE,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB,EAAE;AAGJ,QAAM,oBAAwC,eAC3C,OAAO,CAAC,EAAE,OAAO,MAAM,OAAO,OAAO,WAAW,YAAY,YAAY,IAAI,OAAO,MAAM,CAAC,EAC1F,IAAI,CAAC,EAAE,MAAM,OAAO,OAAO;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,OAAkC,gBAAgB;AAAA,IACjE,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB,EAAE;AAGJ,QAAM,UAAU,oBAAI,IAA2B;AAG/C,QAAM,iBAAiB,IAAI,oBAAoB,MAAM;AAGrD,iBAAe,GAAG,iBAAiB,MAAM;AACvC,gBAAY,OAAO;AACnB,iBAAa,SAAS,gBAAgB;AAAA,EACxC,CAAC;AAGD,MAAI;AACJ,QAAM,mBAAmB,IAAI,QAAc,CAAC,YAAY;AACtD,uBAAmB;AAAA,EACrB,CAAC;AAGD,QAAM,gBAAgB,MAAM;AAC1B,YAAQ,IAAI,UAAU,aAAa;AACnC,YAAQ,IAAI,WAAW,aAAa;AACpC,qBAAiB;AAAA,EACnB;AACA,UAAQ,GAAG,UAAU,aAAa;AAClC,UAAQ,GAAG,WAAW,aAAa;AAGnC,QAAM,gCAAgC,oBAAI,IAA2B;AACrE,aAAW,cAAc,yBAAyB;AAChD,kCAA8B;AAAA,MAC5B,WAAW;AAAA,MACX,IAAI,QAAc,CAAC,YAAY;AAC7B,mBAAW,gBAAgB;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,0BAA0B,oBAAI,IAA2B;AAC/D,QAAM,0BAA0B,oBAAI,IAA8D;AAClG,aAAW,cAAc,mBAAmB;AAC1C,4BAAwB;AAAA,MACtB,WAAW;AAAA,MACX,IAAI,QAAc,CAAC,YAAY;AAC7B,mBAAW,gBAAgB;AAAA,MAC7B,CAAC;AAAA,IACH;AAEA,QAAI;AACJ,UAAM,eAAe,IAAI,QAAc,CAAC,YAAY;AAClD,sBAAgB;AAAA,IAClB,CAAC;AACD,4BAAwB,IAAI,WAAW,MAAM,EAAE,SAAS,cAAc,UAAU,cAAc,CAAC;AAAA,EACjG;AAGA,QAAM,qBAAqB,oBAAI,IAQ7B;AACF,aAAW,EAAE,KAAK,KAAK,gBAAgB;AACrC,QAAI;AACJ,UAAM,UAAU,IAAI,QAAc,CAAC,YAAY;AAC7C,iBAAW;AAAA,IACb,CAAC;AACD,uBAAmB,IAAI,MAAM;AAAA,MAC3B,QAAQ,OAAO,OAAkC,gBAAgB;AAAA,MACjE,cAAc;AAAA,MACd,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAGA,QAAM,cAAsC,CAAC;AAG7C,QAAM,uBAAuB,oBAAI,IAA2D;AAG5F,QAAM,wBAAwB,oBAAI,IAA8D;AAChG,aAAW,EAAE,KAAK,KAAK,gBAAgB;AACrC,QAAI;AACJ,UAAM,UAAU,IAAI,QAAc,CAAC,YAAY;AAC7C,iBAAW;AAAA,IACb,CAAC;AACD,0BAAsB,IAAI,MAAM,EAAE,SAAS,SAAS,CAAC;AAAA,EACvD;AAGA,QAAM,sBAAsB,oBAAI,IAA6C;AAC7E,aAAW,cAAc,yBAAyB;AAChD,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,QACE,WAAW,GAAG,WAAW,IAAI;AAAA,QAC7B,YAAY,GAAG,WAAW,IAAI;AAAA,QAC9B,YAAY;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,wBAAoB,IAAI,WAAW,MAAM,YAAY;AAGrD,eAAW,OAAO,GAAG,eAAe,CAAC,SAAS;AAC5C,YAAM,QAAQ;AACd,mBAAa;AAAA,QACX,MAAM,WAAW;AAAA,QACjB,QAAQ,WAAW,OAAO;AAAA,QAC1B,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,MAAM,MAAM;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAGA,aAAW,cAAc,mBAAmB;AAC1C,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,QACE,WAAW,GAAG,WAAW,IAAI;AAAA,QAC7B,YAAY,GAAG,WAAW,IAAI;AAAA,QAC9B,YAAY;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,wBAAoB,IAAI,WAAW,MAAM,YAAY;AAGrD,eAAW,OAAO,GAAG,eAAe,CAAC,SAAS;AAC5C,YAAM,QAAQ;AACd,kBAAY,WAAW,IAAI,IAAI,MAAM;AAErC,8BAAwB,IAAI,WAAW,IAAI,GAAG,SAAS;AAEvD,mBAAa;AAAA,QACX,MAAM,WAAW;AAAA,QACjB,QAAQ,WAAW,OAAO;AAAA,QAC1B,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAGA,aAAW,EAAE,KAAK,KAAK,gBAAgB;AACrC,UAAM,cAAc,mBAAmB,IAAI,IAAI;AAC/C,QAAI,eAAe;AAEnB,gBAAY,OAAO,GAAG,cAAc,MAAM;AACxC,UAAI,CAAC,cAAc;AAEjB,cAAM,WAAW,eAAe,cAAc,GAAG,IAAI,WAAW,GAAG,IAAI,WAAW;AAClF,2BAAmB,IAAI,MAAM;AAAA,UAC3B,GAAG;AAAA,UACH,eAAe;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,gBAAY,OAAO,GAAG,SAAS,OAAO,SAAS;AAC7C,YAAM,QAAQ;AAEd,UAAI,MAAM,SAAS;AAEjB,cAAM,eAAe,mBAAmB,IAAI,IAAI;AAChD,qBAAa,aAAa,MAAM;AAGhC,cAAM,kBAAkB,qBAAqB,IAAI,IAAI;AACrD,YAAI,mBAAmB,MAAM;AAE3B,kBAAQ,KAAK,IAAI,IAAI,6CAAe;AACpC,gBAAM,gBAAgB,UAAU;AAAA,QAClC;AAGA,cAAM,gBAAgB,OAAO,OAAyC,uBAAuB;AAC7F,6BAAqB,IAAI,MAAM,aAAa;AAG5C,cAAM,mBAAmB,iBAAiB,IAAI,IAAI,KAAK,CAAC;AACxD,cAAM,sBAAsB,iBACzB,IAAI,CAAC,eAAe,wBAAwB,IAAI,UAAU,GAAG,OAAO,EACpE,OAAO,CAAC,MAA0B,KAAK,IAAI;AAC9C,YAAI,oBAAoB,SAAS,GAAG;AAClC,gBAAM,QAAQ,IAAI,mBAAmB;AAAA,QACvC;AAGA,cAAM,oBAA4C,CAAC;AACnD,mBAAW,cAAc,kBAAkB;AACzC,cAAI,cAAc,aAAa;AAC7B,8BAAkB,UAAU,IAAI,YAAY,UAAU;AAAA,UACxD;AAAA,QACF;AAGA,sBAAc,GAAG,eAAe,CAAC,cAAc;AAC7C,gBAAM,aAAa;AACnB,kBAAQ,IAAI,GAAG,IAAI,WAAW;AAAA,YAC5B;AAAA,YACA,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,MAAM,WAAW;AAAA,UACnB,CAAC;AAED,cAAI,cAAc;AAChB,2BAAe;AACf,kCAAsB,IAAI,IAAI,GAAG,SAAS;AAAA,UAC5C;AACA,uBAAa,cAAc;AAAA,QAC7B,CAAC;AAED,sBAAc,GAAG,SAAS,CAAC,cAAc;AACvC,gBAAM,aAAa;AACnB,kBAAQ,IAAI,GAAG,IAAI,WAAW;AAAA,YAC5B;AAAA,YACA,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,SAAS,WAAW;AAAA,UACtB,CAAC;AAED,cAAI,cAAc;AAChB,2BAAe;AACf,kCAAsB,IAAI,IAAI,GAAG,SAAS;AAAA,UAC5C;AACA,uBAAa,cAAc;AAAA,QAC7B,CAAC;AAGD,aAAK,cAAc,MAAM;AAAA,UACvB,YAAY,MAAM;AAAA,UAClB,aAAa;AAAA,QACf,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,IAAI,GAAG,IAAI,UAAU;AAAA,UAC3B;AAAA,UACA,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,SAAS,MAAM,QAAQ,KAAK,IAAI;AAAA,QAClC,CAAC;AAED,YAAI,cAAc;AAChB,yBAAe;AACf,gCAAsB,IAAI,IAAI,GAAG,SAAS;AAAA,QAC5C;AACA,oBAAY,cAAc;AAAA,MAC5B;AAAA,IACF,CAAC;AAED,gBAAY,OAAO,GAAG,SAAS,CAAC,SAAS;AACvC,YAAM,QAAQ;AACd,cAAQ,IAAI,GAAG,IAAI,UAAU;AAAA,QAC3B;AAAA,QACA,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS,MAAM;AAAA,MACjB,CAAC;AACD,kBAAY,cAAc;AAAA,IAC5B,CAAC;AAAA,EACH;AAGA,QAAM,eAAe,IAAI;AAAA,IACvB;AAAA;AAAA,MAEE,GAAG,wBAAwB,IAAI,CAAC,gBAAgB;AAAA,QAC9C,OAAO,GAAG,WAAW,IAAI;AAAA,QACzB,MAAM,MAAM,8BAA8B,IAAI,WAAW,IAAI,KAAK,QAAQ,QAAQ;AAAA,MACpF,EAAE;AAAA;AAAA,MAEF,GAAG,kBAAkB,IAAI,CAAC,gBAAgB;AAAA,QACxC,OAAO,GAAG,WAAW,IAAI;AAAA,QACzB,MAAM,MAAM,wBAAwB,IAAI,WAAW,IAAI,KAAK,QAAQ,QAAQ;AAAA,MAC9E,EAAE;AAAA;AAAA,MAEF,GAAG,eAAe,IAAI,CAAC,EAAE,KAAK,OAAO;AAAA,QACnC,OAAO,GAAG,IAAI;AAAA,QACd,MAAM,MAAM,sBAAsB,IAAI,IAAI,GAAG,WAAW,QAAQ,QAAQ;AAAA,MAC1E,EAAE;AAAA,IACJ;AAAA,IACA,EAAE,YAAY,KAAK;AAAA,EACrB;AAGA,aAAW,cAAc,yBAAyB;AAChD,UAAM,SAAS,KAAK,KAAK,KAAK,YAAY,WAAW,IAAI;AACzD,UAAM,eAAe,oBAAoB,IAAI,WAAW,IAAI;AAC5D,UAAM,eAAsC;AAAA,MAC1C,GAAG,WAAW;AAAA,MACd,KAAK,EAAE,GAAG,SAAS,GAAG,WAAW,OAAO,IAAI;AAAA,IAC9C;AACA,eAAW,OACR,WAAW;AAAA,MACV,MAAM,WAAW;AAAA,MACjB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,mBAAa;AAAA,QACX,MAAM,WAAW;AAAA,QACjB,QAAQ,WAAW,OAAO;AAAA,QAC1B,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC1D,CAAC;AAAA,IACH,CAAC;AAAA,EACL;AAGA,aAAW,cAAc,mBAAmB;AAC1C,UAAM,SAAS,KAAK,KAAK,KAAK,YAAY,WAAW,IAAI;AACzD,UAAM,eAAe,oBAAoB,IAAI,WAAW,IAAI;AAE5D,UAAM,aAAoC;AAAA,MACxC,GAAG,WAAW;AAAA,MACd,QAAQ;AAAA;AAAA,MACR,KAAK,EAAE,GAAG,SAAS,GAAG,WAAW,OAAO,IAAI;AAAA,IAC9C;AACA,eAAW,OACR,WAAW;AAAA,MACV,MAAM,WAAW;AAAA,MACjB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,mBAAa;AAAA,QACX,MAAM,WAAW;AAAA,QACjB,QAAQ,WAAW,OAAO;AAAA,QAC1B,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC1D,CAAC;AAAA,IACH,CAAC;AAAA,EACL;AAGA,aAAW,EAAE,MAAM,OAAO,KAAK,gBAAgB;AAC7C,UAAM,SAAS,KAAK,KAAK,KAAK,YAAY,IAAI;AAC9C,UAAM,cAAc,mBAAmB,IAAI,IAAI;AAC/C,gBAAY,OACT,WAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,EAAE,GAAG,SAAS,GAAG,OAAO,IAAI;AAAA,MACjC,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,IACpB,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,cAAQ,IAAI,GAAG,IAAI,UAAU;AAAA,QAC3B;AAAA,QACA,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC1D,CAAC;AACD,kBAAY,cAAc;AAAA,IAC5B,CAAC;AAAA,EACL;AAGA,QAAM,aAAa,IAAI;AAGvB,QAAM,oBAA4D,CAAC;AACnE,aAAW,EAAE,MAAM,OAAO,KAAK,gBAAgB;AAC7C,QAAI,OAAO,aAAa,MAAM;AAC5B,wBAAkB,KAAK,CAAC,MAAM,MAAM,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,MAAI,kBAAkB,SAAS,GAAG;AAChC,UAAM,iBAAiB,IAAI;AAAA,MACzB,kBAAkB,IAAI,CAAC,CAAC,MAAM,MAAM,OAAO;AAAA,QACzC,OAAO,GAAG,IAAI;AAAA,QACd,MAAM,YAAY;AAChB,gBAAM,SAAS,KAAK,KAAK,KAAK,YAAY,IAAI;AAC9C,cAAI;AACF,kBAAM,MAAM,MAAM,UAAU,OAAO,QAAQ,OAAO,SAAU;AAC5D,kBAAM,IAAI,WAAW;AACrB,oBAAQ,IAAI,GAAG,IAAI,cAAc;AAAA,cAC/B;AAAA,cACA,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,QAAQ;AAAA,YACV,CAAC;AAAA,UACH,SAAS,KAAK;AACZ,oBAAQ,IAAI,GAAG,IAAI,cAAc;AAAA,cAC/B;AAAA,cACA,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,YAC1D,CAAC;AACD,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF,EAAE;AAAA,MACF,EAAE,YAAY,OAAO,aAAa,MAAM;AAAA,IAC1C;AAEA,QAAI;AACF,YAAM,eAAe,IAAI;AAAA,IAC3B,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,cAAY,OAAO;AACnB,eAAa,SAAS,gBAAgB;AAGtC,QAAM;AAGN,UAAQ,OAAO,MAAM,iCAAa;AAClC,QAAM,QAAQ,IAAI;AAAA,IAChB,GAAG,wBAAwB,IAAI,CAAC,EAAE,OAAO,MAAM,OAAO,UAAU,CAAC;AAAA,IACjE,GAAG,kBAAkB,IAAI,CAAC,EAAE,OAAO,MAAM,OAAO,UAAU,CAAC;AAAA,IAC3D,GAAG,CAAC,GAAG,mBAAmB,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,MAAM,OAAO,UAAU,CAAC;AAAA,IAC1E,GAAG,CAAC,GAAG,qBAAqB,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,OAAO,UAAU,CAAC;AAAA,EAC1E,CAAC;AACD,qBAAmB,QAAQ;AAC3B,UAAQ,OAAO,MAAM,uBAAQ;AAC/B;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WatchOrchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrators/WatchOrchestrator.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAE3D,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,gBAAgB,CAAmB;
|
|
1
|
+
{"version":3,"file":"WatchOrchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrators/WatchOrchestrator.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAE3D,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,kBAAkB,CAAoC;gBAElD,OAAO,EAAE,wBAAwB;IAK7C;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2EjC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6C5B;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBhC"}
|
|
@@ -3,7 +3,7 @@ import { Listr } from "listr2";
|
|
|
3
3
|
import { consola } from "consola";
|
|
4
4
|
import { loadSdConfig } from "../utils/sd-config.js";
|
|
5
5
|
import { filterPackagesByTargets } from "../utils/package-utils.js";
|
|
6
|
-
import { setupReplaceDeps } from "../utils/replace-deps.js";
|
|
6
|
+
import { setupReplaceDeps, watchReplaceDeps } from "../utils/replace-deps.js";
|
|
7
7
|
import { printErrors } from "../utils/output-utils.js";
|
|
8
8
|
import { RebuildListrManager } from "../utils/listr-manager.js";
|
|
9
9
|
import { ResultCollector } from "../infra/ResultCollector.js";
|
|
@@ -22,6 +22,7 @@ class WatchOrchestrator {
|
|
|
22
22
|
_dtsBuilder;
|
|
23
23
|
_packages = [];
|
|
24
24
|
_copySrcWatchers = [];
|
|
25
|
+
_replaceDepWatcher;
|
|
25
26
|
constructor(options) {
|
|
26
27
|
this._cwd = process.cwd();
|
|
27
28
|
this._options = options;
|
|
@@ -49,6 +50,7 @@ class WatchOrchestrator {
|
|
|
49
50
|
}
|
|
50
51
|
if (sdConfig.replaceDeps != null) {
|
|
51
52
|
await setupReplaceDeps(this._cwd, sdConfig.replaceDeps);
|
|
53
|
+
this._replaceDepWatcher = await watchReplaceDeps(this._cwd, sdConfig.replaceDeps);
|
|
52
54
|
}
|
|
53
55
|
const allPackages = filterPackagesByTargets(sdConfig.packages, this._options.targets);
|
|
54
56
|
const isLibraryTarget = (target) => target === "node" || target === "browser" || target === "neutral";
|
|
@@ -144,6 +146,7 @@ class WatchOrchestrator {
|
|
|
144
146
|
...this._copySrcWatchers.map((w) => w.close())
|
|
145
147
|
]);
|
|
146
148
|
this._copySrcWatchers = [];
|
|
149
|
+
this._replaceDepWatcher?.dispose();
|
|
147
150
|
process.stdout.write("\u2714 \uC644\uB8CC\n");
|
|
148
151
|
}
|
|
149
152
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/orchestrators/WatchOrchestrator.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,aAAa;AACtB,SAAS,eAAe;AAExB,SAAS,oBAAoB;AAC7B,SAAS,+BAA+B;AACxC,SAAS,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -19,14 +19,44 @@ export declare function resolveReplaceDepEntries(replaceDeps: Record<string, str
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function parseWorkspaceGlobs(content: string): string[];
|
|
21
21
|
/**
|
|
22
|
-
* replaceDeps
|
|
22
|
+
* replaceDeps 복사 교체 항목
|
|
23
|
+
*/
|
|
24
|
+
export interface ReplaceDepEntry {
|
|
25
|
+
targetName: string;
|
|
26
|
+
sourcePath: string;
|
|
27
|
+
targetPath: string;
|
|
28
|
+
resolvedSourcePath: string;
|
|
29
|
+
actualTargetPath: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* watchReplaceDeps 반환 타입
|
|
33
|
+
*/
|
|
34
|
+
export interface WatchReplaceDepResult {
|
|
35
|
+
entries: ReplaceDepEntry[];
|
|
36
|
+
dispose: () => void;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* replaceDeps 설정에 따라 node_modules 내 패키지를 소스 디렉토리로 복사 교체한다.
|
|
23
40
|
*
|
|
24
41
|
* 1. pnpm-workspace.yaml 파싱 → workspace 패키지 경로 목록
|
|
25
42
|
* 2. [루트, ...workspace 패키지]의 node_modules에서 매칭되는 패키지 찾기
|
|
26
|
-
* 3. 기존 symlink/디렉토리 제거 → 소스
|
|
43
|
+
* 3. 기존 symlink/디렉토리 제거 → 소스 경로를 복사 (node_modules, package.json, .cache, tests 제외)
|
|
27
44
|
*
|
|
28
45
|
* @param projectRoot - 프로젝트 루트 경로
|
|
29
46
|
* @param replaceDeps - sd.config.ts의 replaceDeps 설정
|
|
30
47
|
*/
|
|
31
48
|
export declare function setupReplaceDeps(projectRoot: string, replaceDeps: Record<string, string>): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* replaceDeps 설정에 따라 소스 디렉토리를 watch하여 변경 시 대상 경로로 복사한다.
|
|
51
|
+
*
|
|
52
|
+
* 1. pnpm-workspace.yaml 파싱 → workspace 패키지 경로 목록
|
|
53
|
+
* 2. [루트, ...workspace 패키지]의 node_modules에서 매칭되는 패키지 찾기
|
|
54
|
+
* 3. 소스 디렉토리를 FsWatcher로 watch (300ms delay)
|
|
55
|
+
* 4. 변경 시 대상 경로로 복사 (node_modules, package.json, .cache, tests 제외)
|
|
56
|
+
*
|
|
57
|
+
* @param projectRoot - 프로젝트 루트 경로
|
|
58
|
+
* @param replaceDeps - sd.config.ts의 replaceDeps 설정
|
|
59
|
+
* @returns entries와 dispose 함수
|
|
60
|
+
*/
|
|
61
|
+
export declare function watchReplaceDeps(projectRoot: string, replaceDeps: Record<string, string>): Promise<WatchReplaceDepResult>;
|
|
32
62
|
//# sourceMappingURL=replace-deps.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replace-deps.d.ts","sourceRoot":"","sources":["../../src/utils/replace-deps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"replace-deps.d.ts","sourceRoot":"","sources":["../../src/utils/replace-deps.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,WAAW,EAAE,MAAM,EAAE,GACpB,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BnD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B7D;AAmBD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAqF9G;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,qBAAqB,CAAC,CA8IhC"}
|
|
@@ -2,6 +2,7 @@ import fs from "fs";
|
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { glob } from "glob";
|
|
4
4
|
import { consola } from "consola";
|
|
5
|
+
import { fsCopy, fsMkdir, fsRm, FsWatcher } from "@simplysm/core-node";
|
|
5
6
|
function resolveReplaceDepEntries(replaceDeps, targetNames) {
|
|
6
7
|
const results = [];
|
|
7
8
|
for (const [pattern, sourceTemplate] of Object.entries(replaceDeps)) {
|
|
@@ -44,6 +45,11 @@ function parseWorkspaceGlobs(content) {
|
|
|
44
45
|
}
|
|
45
46
|
return globs;
|
|
46
47
|
}
|
|
48
|
+
const EXCLUDED_NAMES = /* @__PURE__ */ new Set(["node_modules", "package.json", ".cache", "tests"]);
|
|
49
|
+
function replaceDepsCopyFilter(itemPath) {
|
|
50
|
+
const basename = path.basename(itemPath);
|
|
51
|
+
return !EXCLUDED_NAMES.has(basename);
|
|
52
|
+
}
|
|
47
53
|
async function setupReplaceDeps(projectRoot, replaceDeps) {
|
|
48
54
|
const logger = consola.withTag("sd:cli:replace-deps");
|
|
49
55
|
const searchRoots = [projectRoot];
|
|
@@ -81,19 +87,137 @@ async function setupReplaceDeps(projectRoot, replaceDeps) {
|
|
|
81
87
|
continue;
|
|
82
88
|
}
|
|
83
89
|
try {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
90
|
+
let actualTargetPath = targetPath;
|
|
91
|
+
let isSymlink = false;
|
|
92
|
+
try {
|
|
93
|
+
const stat = await fs.promises.lstat(targetPath);
|
|
94
|
+
if (stat.isSymbolicLink()) {
|
|
95
|
+
actualTargetPath = await fs.promises.realpath(targetPath);
|
|
96
|
+
isSymlink = true;
|
|
97
|
+
}
|
|
98
|
+
} catch {
|
|
99
|
+
}
|
|
100
|
+
await fs.promises.rm(actualTargetPath, { recursive: true, force: true });
|
|
101
|
+
if (isSymlink) {
|
|
102
|
+
await fs.promises.rm(targetPath, { recursive: true, force: true });
|
|
103
|
+
}
|
|
104
|
+
await fsCopy(resolvedSourcePath, targetPath, replaceDepsCopyFilter);
|
|
87
105
|
logger.info(`${targetName} \u2192 ${sourcePath}`);
|
|
88
106
|
} catch (err) {
|
|
89
|
-
logger.error(
|
|
107
|
+
logger.error(`\uBCF5\uC0AC \uAD50\uCCB4 \uC2E4\uD328 (${targetName}): ${err instanceof Error ? err.message : err}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function watchReplaceDeps(projectRoot, replaceDeps) {
|
|
113
|
+
const logger = consola.withTag("sd:cli:replace-deps:watch");
|
|
114
|
+
const entries = [];
|
|
115
|
+
const searchRoots = [projectRoot];
|
|
116
|
+
const workspaceYamlPath = path.join(projectRoot, "pnpm-workspace.yaml");
|
|
117
|
+
try {
|
|
118
|
+
const yamlContent = await fs.promises.readFile(workspaceYamlPath, "utf-8");
|
|
119
|
+
const workspaceGlobs = parseWorkspaceGlobs(yamlContent);
|
|
120
|
+
for (const pattern of workspaceGlobs) {
|
|
121
|
+
const dirs = await glob(pattern, { cwd: projectRoot, absolute: true });
|
|
122
|
+
searchRoots.push(...dirs);
|
|
123
|
+
}
|
|
124
|
+
} catch {
|
|
125
|
+
}
|
|
126
|
+
for (const searchRoot of searchRoots) {
|
|
127
|
+
const nodeModulesDir = path.join(searchRoot, "node_modules");
|
|
128
|
+
try {
|
|
129
|
+
await fs.promises.access(nodeModulesDir);
|
|
130
|
+
} catch {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const targetNames = [];
|
|
134
|
+
for (const pattern of Object.keys(replaceDeps)) {
|
|
135
|
+
const matches = await glob(pattern, { cwd: nodeModulesDir });
|
|
136
|
+
targetNames.push(...matches);
|
|
137
|
+
}
|
|
138
|
+
if (targetNames.length === 0) continue;
|
|
139
|
+
const matchedEntries = resolveReplaceDepEntries(replaceDeps, targetNames);
|
|
140
|
+
for (const { targetName, sourcePath } of matchedEntries) {
|
|
141
|
+
const targetPath = path.join(nodeModulesDir, targetName);
|
|
142
|
+
const resolvedSourcePath = path.resolve(projectRoot, sourcePath);
|
|
143
|
+
try {
|
|
144
|
+
await fs.promises.access(resolvedSourcePath);
|
|
145
|
+
} catch {
|
|
146
|
+
logger.warn(`\uC18C\uC2A4 \uACBD\uB85C\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC544 \uC2A4\uD0B5\uD569\uB2C8\uB2E4: ${resolvedSourcePath}`);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
let actualTargetPath = targetPath;
|
|
150
|
+
try {
|
|
151
|
+
const stat = await fs.promises.lstat(targetPath);
|
|
152
|
+
if (stat.isSymbolicLink()) {
|
|
153
|
+
actualTargetPath = await fs.promises.realpath(targetPath);
|
|
154
|
+
}
|
|
155
|
+
} catch {
|
|
90
156
|
}
|
|
157
|
+
entries.push({
|
|
158
|
+
targetName,
|
|
159
|
+
sourcePath,
|
|
160
|
+
targetPath,
|
|
161
|
+
resolvedSourcePath,
|
|
162
|
+
actualTargetPath
|
|
163
|
+
});
|
|
91
164
|
}
|
|
92
165
|
}
|
|
166
|
+
const watchers = [];
|
|
167
|
+
const watchedSources = /* @__PURE__ */ new Set();
|
|
168
|
+
for (const entry of entries) {
|
|
169
|
+
if (watchedSources.has(entry.resolvedSourcePath)) continue;
|
|
170
|
+
watchedSources.add(entry.resolvedSourcePath);
|
|
171
|
+
const watcher = await FsWatcher.watch([entry.resolvedSourcePath], { followSymlinks: false });
|
|
172
|
+
watcher.onChange({ delay: 300 }, async (changeInfos) => {
|
|
173
|
+
for (const { path: changedPath } of changeInfos) {
|
|
174
|
+
const basename = path.basename(changedPath);
|
|
175
|
+
if (EXCLUDED_NAMES.has(basename)) continue;
|
|
176
|
+
for (const e of entries) {
|
|
177
|
+
if (e.resolvedSourcePath !== entry.resolvedSourcePath) continue;
|
|
178
|
+
const relativePath = path.relative(e.resolvedSourcePath, changedPath);
|
|
179
|
+
const destPath = path.join(e.actualTargetPath, relativePath);
|
|
180
|
+
try {
|
|
181
|
+
let sourceExists = false;
|
|
182
|
+
try {
|
|
183
|
+
await fs.promises.access(changedPath);
|
|
184
|
+
sourceExists = true;
|
|
185
|
+
} catch {
|
|
186
|
+
}
|
|
187
|
+
if (sourceExists) {
|
|
188
|
+
const stat = await fs.promises.stat(changedPath);
|
|
189
|
+
if (stat.isDirectory()) {
|
|
190
|
+
await fsMkdir(destPath);
|
|
191
|
+
} else {
|
|
192
|
+
await fsMkdir(path.dirname(destPath));
|
|
193
|
+
await fsCopy(changedPath, destPath, replaceDepsCopyFilter);
|
|
194
|
+
}
|
|
195
|
+
logger.info(`\uBCF5\uC0AC: ${relativePath} \u2192 ${e.targetName}`);
|
|
196
|
+
} else {
|
|
197
|
+
await fsRm(destPath);
|
|
198
|
+
logger.info(`\uC0AD\uC81C: ${relativePath} (${e.targetName})`);
|
|
199
|
+
}
|
|
200
|
+
} catch (err) {
|
|
201
|
+
logger.error(`\uBCF5\uC0AC \uC2E4\uD328 (${e.targetName}/${relativePath}): ${err instanceof Error ? err.message : err}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
watchers.push(watcher);
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
entries,
|
|
210
|
+
dispose: () => {
|
|
211
|
+
for (const watcher of watchers) {
|
|
212
|
+
void watcher.close();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
};
|
|
93
216
|
}
|
|
94
217
|
export {
|
|
95
218
|
parseWorkspaceGlobs,
|
|
96
219
|
resolveReplaceDepEntries,
|
|
97
|
-
setupReplaceDeps
|
|
220
|
+
setupReplaceDeps,
|
|
221
|
+
watchReplaceDeps
|
|
98
222
|
};
|
|
99
223
|
//# sourceMappingURL=replace-deps.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/replace-deps.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,YAAY;AACrB,SAAS,eAAe;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/sd-cli",
|
|
3
3
|
"sideEffects": false,
|
|
4
|
-
"version": "13.0.
|
|
4
|
+
"version": "13.0.8",
|
|
5
5
|
"description": "심플리즘 패키지 - CLI 도구",
|
|
6
6
|
"author": "김석래",
|
|
7
7
|
"repository": {
|
|
@@ -45,9 +45,9 @@
|
|
|
45
45
|
"vite-plugin-solid": "^2.11.10",
|
|
46
46
|
"vite-tsconfig-paths": "^6.1.1",
|
|
47
47
|
"yargs": "^18.0.0",
|
|
48
|
-
"@simplysm/core-common": "13.0.
|
|
49
|
-
"@simplysm/
|
|
50
|
-
"@simplysm/
|
|
48
|
+
"@simplysm/core-common": "13.0.8",
|
|
49
|
+
"@simplysm/storage": "13.0.8",
|
|
50
|
+
"@simplysm/core-node": "13.0.8"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/semver": "^7.7.1",
|
package/src/commands/dev.ts
CHANGED
|
@@ -6,7 +6,7 @@ import type { SdConfig, SdClientPackageConfig, SdServerPackageConfig } from "../
|
|
|
6
6
|
import { consola } from "consola";
|
|
7
7
|
import { loadSdConfig } from "../utils/sd-config";
|
|
8
8
|
import { getVersion } from "../utils/build-env";
|
|
9
|
-
import { setupReplaceDeps } from "../utils/replace-deps";
|
|
9
|
+
import { setupReplaceDeps, watchReplaceDeps, type WatchReplaceDepResult } from "../utils/replace-deps";
|
|
10
10
|
import type * as ClientWorkerModule from "../workers/client.worker";
|
|
11
11
|
import type * as ServerWorkerModule from "../workers/server.worker";
|
|
12
12
|
import type * as ServerRuntimeWorkerModule from "../workers/server-runtime.worker";
|
|
@@ -79,8 +79,10 @@ export async function runDev(options: DevOptions): Promise<void> {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
// replaceDeps 설정이 있으면 symlink 교체
|
|
82
|
+
let replaceDepWatcher: WatchReplaceDepResult | undefined;
|
|
82
83
|
if (sdConfig.replaceDeps != null) {
|
|
83
84
|
await setupReplaceDeps(cwd, sdConfig.replaceDeps);
|
|
85
|
+
replaceDepWatcher = await watchReplaceDeps(cwd, sdConfig.replaceDeps);
|
|
84
86
|
}
|
|
85
87
|
|
|
86
88
|
// VER, DEV 환경변수 준비
|
|
@@ -596,6 +598,7 @@ export async function runDev(options: DevOptions): Promise<void> {
|
|
|
596
598
|
...[...serverBuildWorkers.values()].map(({ worker }) => worker.terminate()),
|
|
597
599
|
...[...serverRuntimeWorkers.values()].map((worker) => worker.terminate()),
|
|
598
600
|
]);
|
|
601
|
+
replaceDepWatcher?.dispose();
|
|
599
602
|
process.stdout.write("✔ 완료\n");
|
|
600
603
|
}
|
|
601
604
|
|
|
@@ -4,7 +4,7 @@ import { consola } from "consola";
|
|
|
4
4
|
import type { BuildTarget, SdConfig, SdPackageConfig } from "../sd-config.types";
|
|
5
5
|
import { loadSdConfig } from "../utils/sd-config";
|
|
6
6
|
import { filterPackagesByTargets } from "../utils/package-utils";
|
|
7
|
-
import { setupReplaceDeps } from "../utils/replace-deps";
|
|
7
|
+
import { setupReplaceDeps, watchReplaceDeps, type WatchReplaceDepResult } from "../utils/replace-deps";
|
|
8
8
|
import { printErrors } from "../utils/output-utils";
|
|
9
9
|
import { RebuildListrManager } from "../utils/listr-manager";
|
|
10
10
|
import { ResultCollector } from "../infra/ResultCollector";
|
|
@@ -43,6 +43,7 @@ export class WatchOrchestrator {
|
|
|
43
43
|
private _dtsBuilder!: DtsBuilder;
|
|
44
44
|
private _packages: PackageInfo[] = [];
|
|
45
45
|
private _copySrcWatchers: FsWatcher[] = [];
|
|
46
|
+
private _replaceDepWatcher: WatchReplaceDepResult | undefined;
|
|
46
47
|
|
|
47
48
|
constructor(options: WatchOrchestratorOptions) {
|
|
48
49
|
this._cwd = process.cwd();
|
|
@@ -76,6 +77,7 @@ export class WatchOrchestrator {
|
|
|
76
77
|
// replaceDeps 설정이 있으면 symlink 교체
|
|
77
78
|
if (sdConfig.replaceDeps != null) {
|
|
78
79
|
await setupReplaceDeps(this._cwd, sdConfig.replaceDeps);
|
|
80
|
+
this._replaceDepWatcher = await watchReplaceDeps(this._cwd, sdConfig.replaceDeps);
|
|
79
81
|
}
|
|
80
82
|
|
|
81
83
|
// targets 필터링
|
|
@@ -205,6 +207,7 @@ export class WatchOrchestrator {
|
|
|
205
207
|
...this._copySrcWatchers.map((w) => w.close()),
|
|
206
208
|
]);
|
|
207
209
|
this._copySrcWatchers = [];
|
|
210
|
+
this._replaceDepWatcher?.dispose();
|
|
208
211
|
|
|
209
212
|
process.stdout.write("✔ 완료\n");
|
|
210
213
|
}
|
|
@@ -2,6 +2,7 @@ import fs from "fs";
|
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { glob } from "glob";
|
|
4
4
|
import { consola } from "consola";
|
|
5
|
+
import { fsCopy, fsMkdir, fsRm, FsWatcher } from "@simplysm/core-node";
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* replaceDeps 설정의 glob 패턴과 대상 패키지 목록을 매칭하여
|
|
@@ -83,11 +84,47 @@ export function parseWorkspaceGlobs(content: string): string[] {
|
|
|
83
84
|
}
|
|
84
85
|
|
|
85
86
|
/**
|
|
86
|
-
*
|
|
87
|
+
* 복사 시 제외할 항목 이름들
|
|
88
|
+
*/
|
|
89
|
+
const EXCLUDED_NAMES = new Set(["node_modules", "package.json", ".cache", "tests"]);
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* replaceDeps 복사 시 사용할 필터 함수
|
|
93
|
+
* node_modules, package.json, .cache, tests를 제외한다.
|
|
94
|
+
*
|
|
95
|
+
* @param itemPath - 복사할 항목의 절대 경로
|
|
96
|
+
* @returns 복사 대상이면 true, 제외하면 false
|
|
97
|
+
*/
|
|
98
|
+
function replaceDepsCopyFilter(itemPath: string): boolean {
|
|
99
|
+
const basename = path.basename(itemPath);
|
|
100
|
+
return !EXCLUDED_NAMES.has(basename);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* replaceDeps 복사 교체 항목
|
|
105
|
+
*/
|
|
106
|
+
export interface ReplaceDepEntry {
|
|
107
|
+
targetName: string;
|
|
108
|
+
sourcePath: string;
|
|
109
|
+
targetPath: string;
|
|
110
|
+
resolvedSourcePath: string;
|
|
111
|
+
actualTargetPath: string;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* watchReplaceDeps 반환 타입
|
|
116
|
+
*/
|
|
117
|
+
export interface WatchReplaceDepResult {
|
|
118
|
+
entries: ReplaceDepEntry[];
|
|
119
|
+
dispose: () => void;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* replaceDeps 설정에 따라 node_modules 내 패키지를 소스 디렉토리로 복사 교체한다.
|
|
87
124
|
*
|
|
88
125
|
* 1. pnpm-workspace.yaml 파싱 → workspace 패키지 경로 목록
|
|
89
126
|
* 2. [루트, ...workspace 패키지]의 node_modules에서 매칭되는 패키지 찾기
|
|
90
|
-
* 3. 기존 symlink/디렉토리 제거 → 소스
|
|
127
|
+
* 3. 기존 symlink/디렉토리 제거 → 소스 경로를 복사 (node_modules, package.json, .cache, tests 제외)
|
|
91
128
|
*
|
|
92
129
|
* @param projectRoot - 프로젝트 루트 경로
|
|
93
130
|
* @param replaceDeps - sd.config.ts의 replaceDeps 설정
|
|
@@ -133,7 +170,7 @@ export async function setupReplaceDeps(projectRoot: string, replaceDeps: Record<
|
|
|
133
170
|
// 패턴 매칭 및 경로 해석
|
|
134
171
|
const entries = resolveReplaceDepEntries(replaceDeps, targetNames);
|
|
135
172
|
|
|
136
|
-
// 3.
|
|
173
|
+
// 3. 복사 교체
|
|
137
174
|
for (const { targetName, sourcePath } of entries) {
|
|
138
175
|
const targetPath = path.join(nodeModulesDir, targetName);
|
|
139
176
|
const resolvedSourcePath = path.resolve(projectRoot, sourcePath);
|
|
@@ -147,17 +184,193 @@ export async function setupReplaceDeps(projectRoot: string, replaceDeps: Record<
|
|
|
147
184
|
}
|
|
148
185
|
|
|
149
186
|
try {
|
|
150
|
-
//
|
|
151
|
-
|
|
187
|
+
// targetPath가 symlink면 realpath로 해석하여 실제 .pnpm 스토어 경로 얻기
|
|
188
|
+
let actualTargetPath = targetPath;
|
|
189
|
+
let isSymlink = false;
|
|
190
|
+
try {
|
|
191
|
+
const stat = await fs.promises.lstat(targetPath);
|
|
192
|
+
if (stat.isSymbolicLink()) {
|
|
193
|
+
actualTargetPath = await fs.promises.realpath(targetPath);
|
|
194
|
+
isSymlink = true;
|
|
195
|
+
}
|
|
196
|
+
} catch {
|
|
197
|
+
// targetPath가 존재하지 않으면 그대로 사용
|
|
198
|
+
}
|
|
152
199
|
|
|
153
|
-
//
|
|
154
|
-
|
|
155
|
-
|
|
200
|
+
// 기존 디렉토리 제거
|
|
201
|
+
await fs.promises.rm(actualTargetPath, { recursive: true, force: true });
|
|
202
|
+
|
|
203
|
+
// symlink였다면 symlink도 제거
|
|
204
|
+
if (isSymlink) {
|
|
205
|
+
await fs.promises.rm(targetPath, { recursive: true, force: true });
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// 소스를 복사 (node_modules, package.json, .cache, tests 제외)
|
|
209
|
+
await fsCopy(resolvedSourcePath, targetPath, replaceDepsCopyFilter);
|
|
156
210
|
|
|
157
211
|
logger.info(`${targetName} → ${sourcePath}`);
|
|
158
212
|
} catch (err) {
|
|
159
|
-
logger.error(
|
|
213
|
+
logger.error(`복사 교체 실패 (${targetName}): ${err instanceof Error ? err.message : err}`);
|
|
160
214
|
}
|
|
161
215
|
}
|
|
162
216
|
}
|
|
163
217
|
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* replaceDeps 설정에 따라 소스 디렉토리를 watch하여 변경 시 대상 경로로 복사한다.
|
|
221
|
+
*
|
|
222
|
+
* 1. pnpm-workspace.yaml 파싱 → workspace 패키지 경로 목록
|
|
223
|
+
* 2. [루트, ...workspace 패키지]의 node_modules에서 매칭되는 패키지 찾기
|
|
224
|
+
* 3. 소스 디렉토리를 FsWatcher로 watch (300ms delay)
|
|
225
|
+
* 4. 변경 시 대상 경로로 복사 (node_modules, package.json, .cache, tests 제외)
|
|
226
|
+
*
|
|
227
|
+
* @param projectRoot - 프로젝트 루트 경로
|
|
228
|
+
* @param replaceDeps - sd.config.ts의 replaceDeps 설정
|
|
229
|
+
* @returns entries와 dispose 함수
|
|
230
|
+
*/
|
|
231
|
+
export async function watchReplaceDeps(
|
|
232
|
+
projectRoot: string,
|
|
233
|
+
replaceDeps: Record<string, string>,
|
|
234
|
+
): Promise<WatchReplaceDepResult> {
|
|
235
|
+
const logger = consola.withTag("sd:cli:replace-deps:watch");
|
|
236
|
+
const entries: ReplaceDepEntry[] = [];
|
|
237
|
+
|
|
238
|
+
// 1. Workspace 패키지 경로 목록 수집
|
|
239
|
+
const searchRoots = [projectRoot];
|
|
240
|
+
|
|
241
|
+
const workspaceYamlPath = path.join(projectRoot, "pnpm-workspace.yaml");
|
|
242
|
+
try {
|
|
243
|
+
const yamlContent = await fs.promises.readFile(workspaceYamlPath, "utf-8");
|
|
244
|
+
const workspaceGlobs = parseWorkspaceGlobs(yamlContent);
|
|
245
|
+
|
|
246
|
+
for (const pattern of workspaceGlobs) {
|
|
247
|
+
const dirs = await glob(pattern, { cwd: projectRoot, absolute: true });
|
|
248
|
+
searchRoots.push(...dirs);
|
|
249
|
+
}
|
|
250
|
+
} catch {
|
|
251
|
+
// pnpm-workspace.yaml가 없으면 루트만 처리
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// 2. 각 searchRoot의 node_modules에서 매칭되는 패키지 찾기
|
|
255
|
+
for (const searchRoot of searchRoots) {
|
|
256
|
+
const nodeModulesDir = path.join(searchRoot, "node_modules");
|
|
257
|
+
|
|
258
|
+
try {
|
|
259
|
+
await fs.promises.access(nodeModulesDir);
|
|
260
|
+
} catch {
|
|
261
|
+
continue; // node_modules 없으면 스킵
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// replaceDeps의 각 glob 패턴으로 node_modules 내 디렉토리 탐색
|
|
265
|
+
const targetNames: string[] = [];
|
|
266
|
+
for (const pattern of Object.keys(replaceDeps)) {
|
|
267
|
+
const matches = await glob(pattern, { cwd: nodeModulesDir });
|
|
268
|
+
targetNames.push(...matches);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (targetNames.length === 0) continue;
|
|
272
|
+
|
|
273
|
+
// 패턴 매칭 및 경로 해석
|
|
274
|
+
const matchedEntries = resolveReplaceDepEntries(replaceDeps, targetNames);
|
|
275
|
+
|
|
276
|
+
// 3. entry 정보 수집 (symlink 해석 포함)
|
|
277
|
+
for (const { targetName, sourcePath } of matchedEntries) {
|
|
278
|
+
const targetPath = path.join(nodeModulesDir, targetName);
|
|
279
|
+
const resolvedSourcePath = path.resolve(projectRoot, sourcePath);
|
|
280
|
+
|
|
281
|
+
// 소스 경로 존재 확인
|
|
282
|
+
try {
|
|
283
|
+
await fs.promises.access(resolvedSourcePath);
|
|
284
|
+
} catch {
|
|
285
|
+
logger.warn(`소스 경로가 존재하지 않아 스킵합니다: ${resolvedSourcePath}`);
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// targetPath가 symlink면 realpath로 해석하여 실제 .pnpm 스토어 경로 얻기
|
|
290
|
+
let actualTargetPath = targetPath;
|
|
291
|
+
try {
|
|
292
|
+
const stat = await fs.promises.lstat(targetPath);
|
|
293
|
+
if (stat.isSymbolicLink()) {
|
|
294
|
+
actualTargetPath = await fs.promises.realpath(targetPath);
|
|
295
|
+
}
|
|
296
|
+
} catch {
|
|
297
|
+
// targetPath가 존재하지 않으면 그대로 사용
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
entries.push({
|
|
301
|
+
targetName,
|
|
302
|
+
sourcePath,
|
|
303
|
+
targetPath,
|
|
304
|
+
resolvedSourcePath,
|
|
305
|
+
actualTargetPath,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// 4. 소스 디렉토리 watch 설정
|
|
311
|
+
const watchers: FsWatcher[] = [];
|
|
312
|
+
const watchedSources = new Set<string>();
|
|
313
|
+
|
|
314
|
+
for (const entry of entries) {
|
|
315
|
+
if (watchedSources.has(entry.resolvedSourcePath)) continue;
|
|
316
|
+
watchedSources.add(entry.resolvedSourcePath);
|
|
317
|
+
|
|
318
|
+
const watcher = await FsWatcher.watch([entry.resolvedSourcePath], { followSymlinks: false });
|
|
319
|
+
watcher.onChange({ delay: 300 }, async (changeInfos) => {
|
|
320
|
+
for (const { path: changedPath } of changeInfos) {
|
|
321
|
+
// 제외 항목 필터링
|
|
322
|
+
const basename = path.basename(changedPath);
|
|
323
|
+
if (EXCLUDED_NAMES.has(basename)) continue;
|
|
324
|
+
|
|
325
|
+
// 이 소스 경로를 사용하는 모든 entry에 대해 복사
|
|
326
|
+
for (const e of entries) {
|
|
327
|
+
if (e.resolvedSourcePath !== entry.resolvedSourcePath) continue;
|
|
328
|
+
|
|
329
|
+
// 소스 경로 기준 상대 경로 계산
|
|
330
|
+
const relativePath = path.relative(e.resolvedSourcePath, changedPath);
|
|
331
|
+
const destPath = path.join(e.actualTargetPath, relativePath);
|
|
332
|
+
|
|
333
|
+
try {
|
|
334
|
+
// 소스가 존재하는지 확인
|
|
335
|
+
let sourceExists = false;
|
|
336
|
+
try {
|
|
337
|
+
await fs.promises.access(changedPath);
|
|
338
|
+
sourceExists = true;
|
|
339
|
+
} catch {
|
|
340
|
+
// 소스가 삭제됨
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (sourceExists) {
|
|
344
|
+
// 소스가 디렉토리인지 파일인지 확인
|
|
345
|
+
const stat = await fs.promises.stat(changedPath);
|
|
346
|
+
if (stat.isDirectory()) {
|
|
347
|
+
await fsMkdir(destPath);
|
|
348
|
+
} else {
|
|
349
|
+
await fsMkdir(path.dirname(destPath));
|
|
350
|
+
await fsCopy(changedPath, destPath, replaceDepsCopyFilter);
|
|
351
|
+
}
|
|
352
|
+
logger.info(`복사: ${relativePath} → ${e.targetName}`);
|
|
353
|
+
} else {
|
|
354
|
+
// 소스가 삭제됨 → 대상도 삭제
|
|
355
|
+
await fsRm(destPath);
|
|
356
|
+
logger.info(`삭제: ${relativePath} (${e.targetName})`);
|
|
357
|
+
}
|
|
358
|
+
} catch (err) {
|
|
359
|
+
logger.error(`복사 실패 (${e.targetName}/${relativePath}): ${err instanceof Error ? err.message : err}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
watchers.push(watcher);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
return {
|
|
369
|
+
entries,
|
|
370
|
+
dispose: () => {
|
|
371
|
+
for (const watcher of watchers) {
|
|
372
|
+
void watcher.close();
|
|
373
|
+
}
|
|
374
|
+
},
|
|
375
|
+
};
|
|
376
|
+
}
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"vitest": "vitest"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@simplysm/sd-cli": "~13.0.
|
|
19
|
-
"@simplysm/claude": "~13.0.
|
|
20
|
-
"@simplysm/lint": "~13.0.
|
|
18
|
+
"@simplysm/sd-cli": "~13.0.8",
|
|
19
|
+
"@simplysm/claude": "~13.0.8",
|
|
20
|
+
"@simplysm/lint": "~13.0.8",
|
|
21
21
|
"@types/node": "^20.19.33",
|
|
22
22
|
"eslint": "^9.39.2",
|
|
23
23
|
"prettier": "^3.8.1",
|