specflow-dev-service 0.0.0-beta.3 → 0.0.0-beta.5

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.
@@ -3,12 +3,37 @@
3
3
  var node_path = require('node:path');
4
4
  var spawn = require('cross-spawn');
5
5
 
6
+ /**
7
+ * 自动注入 port 参数到 dev 命令
8
+ * - 已含 ${PORT} / --port 的不重复注入
9
+ * - npm/pnpm run → -- --port <port>(npm 用 -- 传参给脚本)
10
+ * - yarn → --port <port>(yarn 不需要 --)
11
+ * - 已知工具 → --port <port>
12
+ */
13
+ function injectDevPort(cmd, port) {
14
+ const result = cmd.replace(/\$\{PORT\}/g, String(port));
15
+ // 已有 --port 参数,不重复注入
16
+ if (/\b--port\b/.test(result)) return result;
17
+
18
+ // npm run / pnpm run → 追加 -- --port <port>
19
+ if (/^(npm|pnpm)\s+run\s+/.test(result)) {
20
+ return `${result} -- --port ${port}`;
21
+ }
22
+ // yarn → 追加 --port <port>(yarn 不需要 --)
23
+ if (/^yarn\s+/.test(result)) {
24
+ return `${result} --port ${port}`;
25
+ }
26
+
27
+ // 已知工具 → 追加 --port <port>
28
+ if (result.includes('rspkify') || result.includes('rspack') || result.includes('vite') || result.includes('webpack-dev-server') || result.includes('webpack serve')) {
29
+ return `${result} --port ${port}`;
30
+ }
31
+ return result;
32
+ }
6
33
  function startClient(config) {
7
34
  const cwd = node_path.resolve(config.dir || 'client');
8
35
  const port = config.port ?? 3000;
9
-
10
- // 支持 ${PORT} 占位符 + 注入 PORT 环境变量
11
- const cmd = (config.dev || 'npm run dev').replace(/\$\{PORT\}/g, String(port));
36
+ const cmd = injectDevPort(config.dev || 'npm run dev', port);
12
37
  const child = spawn(cmd, [], {
13
38
  cwd,
14
39
  stdio: 'inherit',
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sources":["../../src/runner/client.ts"],"sourcesContent":["import { resolve } from 'node:path';\n\nimport spawn from 'cross-spawn';\n\nimport type { ClientConfig } from '../config/schema';\nimport type { ChildProcess } from 'node:child_process';\n\nexport interface ClientHandle {\n child: ChildProcess;\n stop: () => void;\n}\n\nexport function startClient(config: ClientConfig): ClientHandle {\n const cwd = resolve(config.dir || 'client');\n const port = config.port ?? 3000;\n\n // 支持 ${PORT} 占位符 + 注入 PORT 环境变量\n const cmd = (config.dev || 'npm run dev').replace(/\\$\\{PORT\\}/g, String(port));\n\n const child = spawn(cmd, [], {\n cwd,\n stdio: 'inherit',\n shell: true,\n env: {\n ...process.env,\n PORT: String(port),\n },\n });\n\n return {\n child,\n stop: () => child.kill(),\n };\n}\n\nexport function stopClient(handle: ClientHandle): void {\n handle.stop();\n}\n"],"names":["startClient","config","cwd","resolve","dir","port","cmd","dev","replace","String","child","spawn","stdio","shell","env","process","PORT","stop","kill","stopClient","handle"],"mappings":";;;;;AAYO,SAASA,WAAWA,CAACC,MAAoB,EAAgB;EAC9D,MAAMC,GAAG,GAAGC,iBAAO,CAACF,MAAM,CAACG,GAAG,IAAI,QAAQ,CAAC;AAC3C,EAAA,MAAMC,IAAI,GAAGJ,MAAM,CAACI,IAAI,IAAI,IAAI;;AAEhC;AACA,EAAA,MAAMC,GAAG,GAAG,CAACL,MAAM,CAACM,GAAG,IAAI,aAAa,EAAEC,OAAO,CAAC,aAAa,EAAEC,MAAM,CAACJ,IAAI,CAAC,CAAC;AAE9E,EAAA,MAAMK,KAAK,GAAGC,KAAK,CAACL,GAAG,EAAE,EAAE,EAAE;IAC3BJ,GAAG;AACHU,IAAAA,KAAK,EAAE,SAAS;AAChBC,IAAAA,KAAK,EAAE,IAAI;AACXC,IAAAA,GAAG,EAAE;MACH,GAAGC,OAAO,CAACD,GAAG;MACdE,IAAI,EAAEP,MAAM,CAACJ,IAAI;AACnB;AACF,GAAC,CAAC;EAEF,OAAO;IACLK,KAAK;AACLO,IAAAA,IAAI,EAAEA,MAAMP,KAAK,CAACQ,IAAI;GACvB;AACH;AAEO,SAASC,UAAUA,CAACC,MAAoB,EAAQ;EACrDA,MAAM,CAACH,IAAI,EAAE;AACf;;;;;"}
1
+ {"version":3,"file":"client.js","sources":["../../src/runner/client.ts"],"sourcesContent":["import { resolve } from 'node:path';\n\nimport spawn from 'cross-spawn';\n\nimport type { ClientConfig } from '../config/schema';\nimport type { ChildProcess } from 'node:child_process';\n\nexport interface ClientHandle {\n child: ChildProcess;\n stop: () => void;\n}\n\n/**\n * 自动注入 port 参数到 dev 命令\n * - 已含 ${PORT} / --port 的不重复注入\n * - npm/pnpm run → -- --port <port>(npm 用 -- 传参给脚本)\n * - yarn → --port <port>(yarn 不需要 --)\n * - 已知工具 → --port <port>\n */\nfunction injectDevPort(cmd: string, port: number): string {\n const result = cmd.replace(/\\$\\{PORT\\}/g, String(port));\n // 已有 --port 参数,不重复注入\n if (/\\b--port\\b/.test(result)) return result;\n\n // npm run / pnpm run → 追加 -- --port <port>\n if (/^(npm|pnpm)\\s+run\\s+/.test(result)) {\n return `${result} -- --port ${port}`;\n }\n // yarn → 追加 --port <port>(yarn 不需要 --)\n if (/^yarn\\s+/.test(result)) {\n return `${result} --port ${port}`;\n }\n\n // 已知工具 → 追加 --port <port>\n if (result.includes('rspkify') || result.includes('rspack') || result.includes('vite') || result.includes('webpack-dev-server') || result.includes('webpack serve')) {\n return `${result} --port ${port}`;\n }\n\n return result;\n}\n\nexport function startClient(config: ClientConfig): ClientHandle {\n const cwd = resolve(config.dir || 'client');\n const port = config.port ?? 3000;\n\n const cmd = injectDevPort(config.dev || 'npm run dev', port);\n\n const child = spawn(cmd, [], {\n cwd,\n stdio: 'inherit',\n shell: true,\n env: {\n ...process.env,\n PORT: String(port),\n },\n });\n\n return {\n child,\n stop: () => child.kill(),\n };\n}\n\nexport function stopClient(handle: ClientHandle): void {\n handle.stop();\n}\n"],"names":["injectDevPort","cmd","port","result","replace","String","test","includes","startClient","config","cwd","resolve","dir","dev","child","spawn","stdio","shell","env","process","PORT","stop","kill","stopClient","handle"],"mappings":";;;;;AAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,aAAaA,CAACC,GAAW,EAAEC,IAAY,EAAU;AACxD,EAAA,MAAMC,MAAM,GAAGF,GAAG,CAACG,OAAO,CAAC,aAAa,EAAEC,MAAM,CAACH,IAAI,CAAC,CAAC;AACvD;EACA,IAAI,YAAY,CAACI,IAAI,CAACH,MAAM,CAAC,EAAE,OAAOA,MAAM;;AAE5C;AACA,EAAA,IAAI,sBAAsB,CAACG,IAAI,CAACH,MAAM,CAAC,EAAE;AACvC,IAAA,OAAO,CAAA,EAAGA,MAAM,CAAA,WAAA,EAAcD,IAAI,CAAA,CAAE;AACtC,EAAA;AACA;AACA,EAAA,IAAI,UAAU,CAACI,IAAI,CAACH,MAAM,CAAC,EAAE;AAC3B,IAAA,OAAO,CAAA,EAAGA,MAAM,CAAA,QAAA,EAAWD,IAAI,CAAA,CAAE;AACnC,EAAA;;AAEA;AACA,EAAA,IAAIC,MAAM,CAACI,QAAQ,CAAC,SAAS,CAAC,IAAIJ,MAAM,CAACI,QAAQ,CAAC,QAAQ,CAAC,IAAIJ,MAAM,CAACI,QAAQ,CAAC,MAAM,CAAC,IAAIJ,MAAM,CAACI,QAAQ,CAAC,oBAAoB,CAAC,IAAIJ,MAAM,CAACI,QAAQ,CAAC,eAAe,CAAC,EAAE;AACnK,IAAA,OAAO,CAAA,EAAGJ,MAAM,CAAA,QAAA,EAAWD,IAAI,CAAA,CAAE;AACnC,EAAA;AAEA,EAAA,OAAOC,MAAM;AACf;AAEO,SAASK,WAAWA,CAACC,MAAoB,EAAgB;EAC9D,MAAMC,GAAG,GAAGC,iBAAO,CAACF,MAAM,CAACG,GAAG,IAAI,QAAQ,CAAC;AAC3C,EAAA,MAAMV,IAAI,GAAGO,MAAM,CAACP,IAAI,IAAI,IAAI;EAEhC,MAAMD,GAAG,GAAGD,aAAa,CAACS,MAAM,CAACI,GAAG,IAAI,aAAa,EAAEX,IAAI,CAAC;AAE5D,EAAA,MAAMY,KAAK,GAAGC,KAAK,CAACd,GAAG,EAAE,EAAE,EAAE;IAC3BS,GAAG;AACHM,IAAAA,KAAK,EAAE,SAAS;AAChBC,IAAAA,KAAK,EAAE,IAAI;AACXC,IAAAA,GAAG,EAAE;MACH,GAAGC,OAAO,CAACD,GAAG;MACdE,IAAI,EAAEf,MAAM,CAACH,IAAI;AACnB;AACF,GAAC,CAAC;EAEF,OAAO;IACLY,KAAK;AACLO,IAAAA,IAAI,EAAEA,MAAMP,KAAK,CAACQ,IAAI;GACvB;AACH;AAEO,SAASC,UAAUA,CAACC,MAAoB,EAAQ;EACrDA,MAAM,CAACH,IAAI,EAAE;AACf;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specflow-dev-service",
3
- "version": "0.0.0-beta.3",
3
+ "version": "0.0.0-beta.5",
4
4
  "description": "Specflow DevService CLI — 一键启动前端 + Go 热更新开发环境,可选协议统一层",
5
5
  "main": "./dist/cli.js",
6
6
  "module": "./dist/cli.js",