@faicad/faijs 0.13.0 → 0.13.1
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/api/occt-kernel-bridge.d.ts.map +1 -1
- package/dist/api/occt-kernel-bridge.js +7 -1
- package/dist/api/occt-kernel-bridge.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.d.ts +1 -1
- package/dist/cad-runtime/browser-lib-loader.js +1 -1
- package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +20 -19
- package/dist/node-host/cli.js.map +1 -1
- package/dist/vendored/brepjs/kernel/index.d.ts +7 -0
- package/dist/vendored/brepjs/kernel/index.d.ts.map +1 -1
- package/dist/vendored/brepjs/kernel/index.js +57 -0
- package/dist/vendored/brepjs/kernel/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"occt-kernel-bridge.d.ts","sourceRoot":"","sources":["../../src/api/occt-kernel-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"occt-kernel-bridge.d.ts","sourceRoot":"","sources":["../../src/api/occt-kernel-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAaH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAIvE;;;;;;;;;GASG;AACH,wBAAgB,cAAc,IAAI,aAAa,CAe9C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,aAAa,CAE/C"}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { getKernel as getFaijsKernel } from '../occt-kernel/occtKernel.js';
|
|
21
21
|
import { OcctWasmAdapter } from '../vendored/brepjs/kernel/occtWasm/occtWasmAdapter.js';
|
|
22
|
-
import { freezeKernels, getActiveKernelId, getKernel as getVendoredKernel, registerKernel, } from '../vendored/brepjs/kernel/index.js';
|
|
22
|
+
import { freezeKernels, getActiveKernelId, getKernel as getVendoredKernel, registerKernel, syncRegistryFromGlobal, syncRegistryToGlobal, } from '../vendored/brepjs/kernel/index.js';
|
|
23
23
|
let _bound = false;
|
|
24
24
|
/**
|
|
25
25
|
* Bind the ported kernel registry to the faijs single occt-wasm instance.
|
|
@@ -32,6 +32,11 @@ let _bound = false;
|
|
|
32
32
|
* @returns the registered kernel adapter.
|
|
33
33
|
*/
|
|
34
34
|
export function bindOcctKernel() {
|
|
35
|
+
// Check the SHARED registry first (globalThis singleton): a CDN-bundled faijs
|
|
36
|
+
// instance has its own module-level `_bound = false`, but the host bundle may
|
|
37
|
+
// already have registered+bound 'occt-wasm'. Re-registering would throw
|
|
38
|
+
// "registry frozen" — treat an existing binding as bound instead.
|
|
39
|
+
syncRegistryFromGlobal();
|
|
35
40
|
if (_bound)
|
|
36
41
|
return getVendoredKernel('occt-wasm');
|
|
37
42
|
const faijsKernel = getFaijsKernel();
|
|
@@ -39,6 +44,7 @@ export function bindOcctKernel() {
|
|
|
39
44
|
registerKernel('occt-wasm', adapter);
|
|
40
45
|
freezeKernels();
|
|
41
46
|
_bound = true;
|
|
47
|
+
syncRegistryToGlobal();
|
|
42
48
|
return adapter;
|
|
43
49
|
}
|
|
44
50
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"occt-kernel-bridge.js","sourceRoot":"","sources":["../../src/api/occt-kernel-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AACvF,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,SAAS,IAAI,iBAAiB,EAC9B,cAAc,
|
|
1
|
+
{"version":3,"file":"occt-kernel-bridge.js","sourceRoot":"","sources":["../../src/api/occt-kernel-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AACvF,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,SAAS,IAAI,iBAAiB,EAC9B,cAAc,EACd,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,oCAAoC,CAAA;AAG3C,IAAI,MAAM,GAAG,KAAK,CAAA;AAElB;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc;IAC5B,8EAA8E;IAC9E,8EAA8E;IAC9E,wEAAwE;IACxE,kEAAkE;IAClE,sBAAsB,EAAE,CAAC;IACzB,IAAI,MAAM;QAAE,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAA;IAEjD,MAAM,WAAW,GAAG,cAAc,EAAgC,CAAA;IAClE,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;IACvD,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IACpC,aAAa,EAAE,CAAA;IACf,MAAM,GAAG,IAAI,CAAA;IACb,oBAAoB,EAAE,CAAA;IACtB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,IAAI,iBAAiB,EAAE,KAAK,WAAW,CAAA;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAA;AACvC,CAAC","sourcesContent":["/**\n * L3 bridge — occt-wasm kernel single-instance injection (D10).\n *\n * The ported `kernel/occtWasm` adapter is constructor-injected (DI form, never\n * imports `occt-wasm` itself). This file is the **only** faijs-side place\n * wiring the two together (boundary rule D8/R5: core side may import the\n * vendored tree only from `api/`):\n *\n * initOcctWasm() ──same instance──▶ OcctWasmAdapter ──▶ registerKernel\n * (faijs existing (vendored, DI) (vendored kernel\n * occt singleton) registry, D10)\n *\n * `occtKernel.getKernel()` returns the faijs singleton `OcctKernel`; building\n * the adapter over that exact instance guarantees the single-instance ban\n * (D10: two wasm instances would put handles in different pointer spaces and\n * silently desync `hasBrep`/`brepOf`/face evolution).\n *\n * See docs/plans/2026-09-01-layered-api-architecture.md §D10 / §D8.\n */\n\nimport { getKernel as getFaijsKernel } from '../occt-kernel/occtKernel'\nimport type { OcctKernelOwner } from '../vendored/brepjs/kernel/occtWasm/occtWasmAdapter.js'\nimport { OcctWasmAdapter } from '../vendored/brepjs/kernel/occtWasm/occtWasmAdapter.js'\nimport {\n freezeKernels,\n getActiveKernelId,\n getKernel as getVendoredKernel,\n registerKernel,\n syncRegistryFromGlobal,\n syncRegistryToGlobal,\n} from '../vendored/brepjs/kernel/index.js'\nimport type { KernelAdapter } from '../vendored/brepjs/kernel/types.js'\n\nlet _bound = false\n\n/**\n * Bind the ported kernel registry to the faijs single occt-wasm instance.\n *\n * Idempotent: the first call registers the adapter and freezes the registry\n * (D10 冻结); subsequent calls return the already-bound adapter without\n * re-registering. Call after `initOcctWasm()` has been run (e.g. inside\n * `registerOcctBrepEngine()` host assembly).\n *\n * @returns the registered kernel adapter.\n */\nexport function bindOcctKernel(): KernelAdapter {\n // Check the SHARED registry first (globalThis singleton): a CDN-bundled faijs\n // instance has its own module-level `_bound = false`, but the host bundle may\n // already have registered+bound 'occt-wasm'. Re-registering would throw\n // \"registry frozen\" — treat an existing binding as bound instead.\n syncRegistryFromGlobal();\n if (_bound) return getVendoredKernel('occt-wasm')\n\n const faijsKernel = getFaijsKernel() as unknown as OcctKernelOwner\n const adapter = OcctWasmAdapter.fromKernel(faijsKernel)\n registerKernel('occt-wasm', adapter)\n freezeKernels()\n _bound = true\n syncRegistryToGlobal()\n return adapter\n}\n\n/**\n * Whether the vendored kernel registry has been bound (D10).\n * @returns true once bound to the occt-wasm kernel.\n */\nexport function isOcctKernelBound(): boolean {\n return _bound && getActiveKernelId() === 'occt-wasm'\n}\n\n/**\n * Access the currently bound vendored kernel adapter (reads the registry).\n * @throws If the bridge has not been bound.\n * @returns the vendored occt-wasm kernel adapter.\n */\nexport function getBrepjsKernel(): KernelAdapter {\n return getVendoredKernel('occt-wasm')\n}"]}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*
|
|
16
16
|
* 别名归一:脚本 specifier 常是短名(demo 的 `.fai.js` 写 `gear-lib-demo` /
|
|
17
17
|
* `sheetmetal`),而 CDN 上是 npm 全名(`@faicad/gear-lib-demo`)。`aliases` 把
|
|
18
|
-
* specifier 映到包名后再装载,与 node 侧 `
|
|
18
|
+
* specifier 映到包名后再装载,与 node 侧 `CLI_SHORT_NAMES` 归一同一职责。
|
|
19
19
|
*
|
|
20
20
|
* `autoLiftFor` 是**同步**回调(`runtime.ts` 在装载后立即取值),所以逐库
|
|
21
21
|
* `faijs.autoLift` 必须**预先**可用:主机从构建期产物 `lib-meta.json`
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*
|
|
16
16
|
* 别名归一:脚本 specifier 常是短名(demo 的 `.fai.js` 写 `gear-lib-demo` /
|
|
17
17
|
* `sheetmetal`),而 CDN 上是 npm 全名(`@faicad/gear-lib-demo`)。`aliases` 把
|
|
18
|
-
* specifier 映到包名后再装载,与 node 侧 `
|
|
18
|
+
* specifier 映到包名后再装载,与 node 侧 `CLI_SHORT_NAMES` 归一同一职责。
|
|
19
19
|
*
|
|
20
20
|
* `autoLiftFor` 是**同步**回调(`runtime.ts` 在装载后立即取值),所以逐库
|
|
21
21
|
* `faijs.autoLift` 必须**预先**可用:主机从构建期产物 `lib-meta.json`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-lib-loader.js","sourceRoot":"","sources":["../../src/cad-runtime/browser-lib-loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * browser-lib-loader — 浏览器通用 `LibLoader` 工厂(D3-Browser,§9.4)\n *\n * 与 node 侧 `cliPortsLibLoader`(`node-host/cli.ts`)对称:都实现 `LibLoader`\n * 契约(`loadLib` / `listLibs` / `options.autoLiftFor`),差别只在装载通道——\n * node 用 `import(pkg)` 从 `node_modules` 解析,浏览器用**动态 `import()`** 取 CDN。\n *\n * 两条通路(Q8 定稿的 a/b 混合,共用同一 `CDN_BASE`):\n * - **方案 a(importmap)**:不提供 `versions` 时,用**已解析的包名**做裸 specifier\n * 动态 `import(pkg)`,由页面 `<script type=\"importmap\">` 的 scope\n * (`\"@faicad/\": \"CDN_BASE/*@faicad/\"`)在后端按依赖图取版。零版本表,dev / playground 用。\n * - **方案 b(精确 pin)**:提供 `versions`(`versions.json`)时拼\n * `` `${cdnBase}${pkg}@${version}/+esm` `` 直链,版本精确 pin 到已发布版本,保证\n * 可复现与缓存命中;release 产物用。\n *\n * 别名归一:脚本 specifier 常是短名(demo 的 `.fai.js` 写 `gear-lib-demo` /\n * `sheetmetal`),而 CDN 上是 npm 全名(`@faicad/gear-lib-demo`)。`aliases` 把\n * specifier 映到包名后再装载,与 node 侧 `
|
|
1
|
+
{"version":3,"file":"browser-lib-loader.js","sourceRoot":"","sources":["../../src/cad-runtime/browser-lib-loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * browser-lib-loader — 浏览器通用 `LibLoader` 工厂(D3-Browser,§9.4)\n *\n * 与 node 侧 `cliPortsLibLoader`(`node-host/cli.ts`)对称:都实现 `LibLoader`\n * 契约(`loadLib` / `listLibs` / `options.autoLiftFor`),差别只在装载通道——\n * node 用 `import(pkg)` 从 `node_modules` 解析,浏览器用**动态 `import()`** 取 CDN。\n *\n * 两条通路(Q8 定稿的 a/b 混合,共用同一 `CDN_BASE`):\n * - **方案 a(importmap)**:不提供 `versions` 时,用**已解析的包名**做裸 specifier\n * 动态 `import(pkg)`,由页面 `<script type=\"importmap\">` 的 scope\n * (`\"@faicad/\": \"CDN_BASE/*@faicad/\"`)在后端按依赖图取版。零版本表,dev / playground 用。\n * - **方案 b(精确 pin)**:提供 `versions`(`versions.json`)时拼\n * `` `${cdnBase}${pkg}@${version}/+esm` `` 直链,版本精确 pin 到已发布版本,保证\n * 可复现与缓存命中;release 产物用。\n *\n * 别名归一:脚本 specifier 常是短名(demo 的 `.fai.js` 写 `gear-lib-demo` /\n * `sheetmetal`),而 CDN 上是 npm 全名(`@faicad/gear-lib-demo`)。`aliases` 把\n * specifier 映到包名后再装载,与 node 侧 `CLI_SHORT_NAMES` 归一同一职责。\n *\n * `autoLiftFor` 是**同步**回调(`runtime.ts` 在装载后立即取值),所以逐库\n * `faijs.autoLift` 必须**预先**可用:主机从构建期产物 `lib-meta.json`\n * (`scripts/gen-importmap.mjs` 生成)经 `meta` 传入;也可调 `prefetchMeta()`\n * 在网络可达时抓各库 `package.json` 预热(失败静默回落推断式)。\n *\n * 本工厂**不**被 `createBrowserPorts` 默认装配——demo 走源码 alias 的 HMR 路径\n * 必须保持零网络;CDN 装载仅服务「从 npm 消费已发布包」的场景,由主机显式注入。\n */\n\nimport type { LibLoader } from './ports'\nimport type { StdlibNamespace } from '../runtime-state'\n\n/** 默认 CDN base(Q8 定稿:jsDelivr npm 镜像;ESM 取 `+esm`)。 */\nexport const DEFAULT_CDN_BASE = 'https://cdn.jsdelivr.net/npm/'\n\n/** 逐库元数据(与 `lib-meta.json` 键形一致)。 */\nexport interface BrowserLibMeta {\n /** `package.json` 的 `faijs.autoLift` 外置字段(D3-autoLift)。 */\n autoLift?: boolean\n}\n\n/** `createBrowserLibLoader` 的选项。 */\nexport interface CreateBrowserLibLoaderOptions {\n /** CDN base,须以 `/` 结尾(缺省 `DEFAULT_CDN_BASE`)。 */\n cdnBase?: string\n /** 方案 b:精确 pin 的 `packageName → version`(`versions.json`);提供即走直链。 */\n versions?: Record<string, string>\n /** 别名表:脚本 import specifier → npm 包名(如 `gear-lib-demo` → `@faicad/gear-lib-demo`)。 */\n aliases?: Record<string, string>\n /** 允许装载的 **npm 包名**白名单;缺省不限制(生产建议显式给)。 */\n libs?: string[]\n /** 逐库元数据(`lib-meta.json`),喂 `options.autoLiftFor`。 */\n meta?: Record<string, BrowserLibMeta>\n /** 全局 autoLift 缺省(喂 `options.autoLift`);缺省交由 runtime 推断式决定。 */\n autoLift?: boolean\n /** 强制方案 a(即使提供了 `versions` 也用裸 specifier,依赖 importmap)。 */\n forceImportMap?: boolean\n /** 注入的动态 import 实现(测试用);缺省为原生动态 `import()`。 */\n importModule?: (url: string) => Promise<unknown>\n /** 注入的 fetch(`prefetchMeta` 用);缺省全局 `fetch`,无则 `prefetchMeta` 为空操作。 */\n fetchImpl?: typeof fetch\n}\n\n/** 浏览器 `LibLoader`(在契约上附加元数据预热)。 */\nexport interface BrowserLibLoader extends LibLoader {\n /**\n * 抓取已知各库的 `package.json`,把 `faijs.autoLift` 填进内部 meta 缓存。\n * 网络失败静默跳过(保持未声明 → 回落推断式)。在 `execute` 前 await 一次即可。\n * @returns promise resolving when all known libs have been probed.\n */\n prefetchMeta(): Promise<void>\n}\n\n/** 归一 CDN base:保证尾随 `/`,避免拼接出 `.../npm@1.0.0` 这类坏 URL。 */\nfunction withTrailingSlash(base: string): string {\n return base.endsWith('/') ? base : `${base}/`\n}\n\n/**\n * 创建浏览器通用 `LibLoader`。\n *\n * 装载顺序:`name` → `aliases` 归一为 npm 包名 → 白名单校验 → 方案 b 直链(有\n * `versions[pkg]` 且未 `forceImportMap`)或方案 a 裸 specifier → 动态 `import()`;\n * 同一包名并发/重复装载共享同一 in-flight promise(CDN 只取一次)。\n * @param opts - CDN base、版本表 / 别名 / 元数据,以及测试用注入点。\n * @returns 满足 `LibLoader` 契约、并附加 `prefetchMeta()` 的浏览器装载器。\n */\nexport function createBrowserLibLoader(opts: CreateBrowserLibLoaderOptions = {}): BrowserLibLoader {\n const cdnBase = withTrailingSlash(opts.cdnBase ?? DEFAULT_CDN_BASE)\n const aliases: Record<string, string> = { ...(opts.aliases ?? {}) }\n const versions = opts.versions\n const allow = opts.libs ? new Set(opts.libs) : undefined\n const meta: Record<string, BrowserLibMeta> = { ...(opts.meta ?? {}) }\n const importModule =\n opts.importModule ?? ((url: string): Promise<unknown> => import(/* @vite-ignore */ url))\n const fetchImpl = opts.fetchImpl ?? (typeof fetch !== 'undefined' ? fetch : undefined)\n\n /** specifier → npm 包名。 */\n const pkgOf = (name: string): string => aliases[name] ?? name\n\n /** 已知 specifier 集合:别名键 ∪ 显式 libs ∪ 版本表键(后两者本身即合法 specifier)。 */\n const specifiers = new Set<string>([\n ...Object.keys(aliases),\n ...(opts.libs ?? []),\n ...Object.keys(versions ?? {}),\n ])\n\n /** 方案 b 的直链;返回 `undefined` 表示走方案 a。 */\n const urlOf = (pkg: string): string | undefined => {\n if (opts.forceImportMap) return undefined\n const v = versions?.[pkg]\n return v ? `${cdnBase}${pkg}@${v}/+esm` : undefined\n }\n\n const pending = new Map<string, Promise<StdlibNamespace>>()\n\n return {\n loadLib: (name: string): Promise<StdlibNamespace> => {\n const pkg = pkgOf(name)\n if (allow && !allow.has(pkg)) {\n return Promise.reject(\n new Error(`package \"${pkg}\" (from specifier \"${name}\") is not in the browser library whitelist`),\n )\n }\n const cached = pending.get(pkg)\n if (cached) return cached\n const url = urlOf(pkg)\n const job = importModule(url ?? pkg).then((mod) => mod as StdlibNamespace)\n pending.set(pkg, job)\n // 装载失败不留毒缓存:清掉后可重试(如网络恢复)。\n job.catch(() => pending.delete(pkg))\n return job\n },\n\n listLibs: () => [...specifiers],\n\n options: {\n ...(opts.autoLift === undefined ? {} : { autoLift: opts.autoLift }),\n // 逐库 autoLift 优先于全局:未声明 → undefined → 回落全局 / runtime 推断式。\n autoLiftFor: (name: string) => meta[pkgOf(name)]?.autoLift,\n },\n\n prefetchMeta: async (): Promise<void> => {\n if (!fetchImpl) return\n const pkgs = new Set<string>([...specifiers].map(pkgOf))\n await Promise.all(\n [...pkgs].map(async (pkg) => {\n if (meta[pkg]) return\n const v = versions?.[pkg]\n try {\n const res = await fetchImpl(`${cdnBase}${pkg}${v ? `@${v}` : ''}/package.json`)\n if (!res.ok) return\n const pj = (await res.json()) as { faijs?: { autoLift?: boolean } }\n const lifted = pj.faijs?.autoLift\n if (typeof lifted === 'boolean') meta[pkg] = { autoLift: lifted }\n } catch {\n // 网络不可达 / 非法 JSON → 保持未声明,交由 runtime 推断式。\n }\n }),\n )\n },\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/node-host/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,sBAAsB,CAAA;AAe/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/node-host/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,sBAAsB,CAAA;AAe/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AA6EvD,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,qJAAqJ;IACrJ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACtC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,EAAE,EAAE,OAAO,CAAA;IACX,8CAA8C;IAC9C,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjF,qDAAqD;IACrD,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,gEAAgE;IAChE,MAAM,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CACnD;AAED,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,EAAE,EAAE,OAAO,CAAA;IACX,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,iFAAiF;IACjF,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACtC,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,0EAA0E;IAC1E,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAA;CACnB;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,EAAE,EAAE,OAAO,CAAA;IACX,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,cAAc,CAmBlF;AAED;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,YAAY,CAAC,CAyGvB;AAkDD;;;;;;;;;;;GAWG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,aAAa,CAAC,CAqExB;AAyID;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IACzC,OAAO,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAA;IACxC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CA4CA;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA2HrG"}
|
package/dist/node-host/cli.js
CHANGED
|
@@ -31,23 +31,20 @@ import { ensureSlot } from '../shape.js';
|
|
|
31
31
|
import { brepOf } from '../shape.js';
|
|
32
32
|
import { asPartName } from '../identity.js';
|
|
33
33
|
import { projectView, projectSheet } from '../api/view/index.js';
|
|
34
|
-
// ── P 四(4.4):Node CLI
|
|
35
|
-
// 脚本 import
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
/**
|
|
42
|
-
const
|
|
43
|
-
'@faicad/gear-lib-demo': '@faicad/gear-lib-demo',
|
|
34
|
+
// ── P 四(4.4):Node CLI 自动装载(D3-Node,§9.4)──
|
|
35
|
+
// 脚本 import 的第三方库按 specifier 动态解析,host 不再写死任何包清单:
|
|
36
|
+
// - scoped 包名(`@faicad/...`)直接动态 import;
|
|
37
|
+
// - 短名(如 `gear-lib-demo`)先归一为 scoped 全名再装载(避免误装同名陌生人包)。
|
|
38
|
+
// 包未安装 → 动态 import 抛 ERR_MODULE_NOT_FOUND,由 runtime 报明确装载失败信息。
|
|
39
|
+
/** scoped 包名前缀:CLI 允许动态装载的库范围。 */
|
|
40
|
+
const CLI_SCOPED_PREFIX = '@faicad/';
|
|
41
|
+
/** 已登记短名 → scoped 全名归一表(仅收录 `@faicad/` 范围内的库,防同名陌生人包)。 */
|
|
42
|
+
const CLI_SHORT_NAMES = {
|
|
44
43
|
'gear-lib-demo': '@faicad/gear-lib-demo',
|
|
45
|
-
'@faicad/sheetmetal': '@faicad/sheetmetal',
|
|
46
44
|
'sheetmetal': '@faicad/sheetmetal',
|
|
47
|
-
'@faicad/cq-compat': '@faicad/cq-compat',
|
|
48
45
|
'cq-compat': '@faicad/cq-compat',
|
|
49
|
-
'@faicad/fai-cq-gears': '@faicad/fai-cq-gears',
|
|
50
46
|
'fai-cq-gears': '@faicad/fai-cq-gears',
|
|
47
|
+
'fai-cq-warehouse': '@faicad/fai-cq-warehouse',
|
|
51
48
|
};
|
|
52
49
|
/**
|
|
53
50
|
* 读库 package.json 的 `faijs.autoLift` 字段(D3-autoLift 外置,§9.4):
|
|
@@ -68,21 +65,25 @@ function readLibAutoLift(pkg) {
|
|
|
68
65
|
return undefined;
|
|
69
66
|
}
|
|
70
67
|
}
|
|
68
|
+
/** specifier → scoped 全名归一:scoped 名原样,已登记短名映射,其余原样交 import 解析。 */
|
|
69
|
+
function normalizeCliSpecifier(name) {
|
|
70
|
+
return CLI_SHORT_NAMES[name] ?? name;
|
|
71
|
+
}
|
|
71
72
|
const cliPortsLibLoader = {
|
|
72
73
|
loadLib: async (name) => {
|
|
73
|
-
const pkg =
|
|
74
|
-
if (!pkg
|
|
75
|
-
throw new Error(`package "${name}" is not
|
|
74
|
+
const pkg = normalizeCliSpecifier(name);
|
|
75
|
+
if (!pkg.startsWith(CLI_SCOPED_PREFIX)) {
|
|
76
|
+
throw new Error(`package "${name}" is not a scoped @faicad/ library`);
|
|
76
77
|
}
|
|
77
78
|
return (await import(pkg));
|
|
78
79
|
},
|
|
79
|
-
listLibs: () => Object.keys(
|
|
80
|
+
listLibs: () => [...Object.keys(CLI_SHORT_NAMES), '@faicad/'],
|
|
80
81
|
// 默认不提升(与历史 CLI 行为一致);各库用 package.json "faijs.autoLift" 逐库覆盖。
|
|
81
82
|
options: {
|
|
82
83
|
autoLift: false,
|
|
83
84
|
autoLiftFor: (name) => {
|
|
84
|
-
const pkg =
|
|
85
|
-
return pkg ? readLibAutoLift(pkg) : undefined;
|
|
85
|
+
const pkg = normalizeCliSpecifier(name);
|
|
86
|
+
return pkg.startsWith(CLI_SCOPED_PREFIX) ? readLibAutoLift(pkg) : undefined;
|
|
86
87
|
},
|
|
87
88
|
},
|
|
88
89
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/node-host/cli.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * faijs-cli — CLI 逻辑(可导入、可测试)。第三方调用入口:packages/core/scripts/faijs-cli.ts。\n * (仓库自用 doc/ci/开发脚本在根 scripts/ 与 packages/core/scripts/gen-*,见 scripts/README.md。)\n *\n *\n * 命令:\n * check <file.fai.js> — dryRun:parse + schema + 引用预检\n * run <file.fai.js> --out <file> — 执行并导出 STL/STEP\n * view <file.fai.js> --out <x.svg> — 执行并投影输出视图 SVG(三视图/等轴测)\n *\n * 选项:\n * --mode <auto|brep|mesh> — 执行模式(默认 auto;view 需要 BREP 路径)\n * --assets <dir> — 资产目录\n * --fonts <dir> — 额外字体目录\n * --part <name> — (view) 指定投影的 shape 变量名;缺省按终端自动选择\n * --view <front|back|top|bottom|left|right|iso|\"x,y,z\">\n * — (view) 单视图方向(默认 front)\n * --sheet <front,top,right,iso> — (view) 多视图图纸(projectSheet;与 --view 互斥)\n */\n\nimport { readFileSync, writeFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { resolve, extname } from 'node:path'\nimport { createRuntime } from '../cad-runtime/runtime'\nimport type { StdlibNamespace } from '../runtime-state'\nimport type { ExecutionMode, HostPorts, LibLoader } from '../cad-runtime/ports'\nimport { createNodePorts } from './index'\nimport { createFsProjectLoader, findProjectRoot, projectKeyOf } from './fs-project-loader'\nimport { buildStlBufferFromMesh } from '../brep/export/stl'\nimport { exportStepFromSolid, exportStepFromSolids, type StepExportEntry } from '../brep/export/step'\nimport { exportStep } from '../occt-kernel/highLevelApi'\nimport { registerOcctBrepEngine } from '../brep/engine/adapters/occt'\nimport type { Shape } from '../mesh/types'\nimport type { CompoundShape } from '../shape'\nimport { ensureSlot } from '../shape'\nimport { brepOf } from '../shape'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { asPartName } from '../identity'\nimport { projectView, projectSheet } from '../api/view'\nimport type { ViewSpec } from '../api/view/view-camera'\n\n// ── P 四(4.4):Node CLI 自动装载白名单 ──\n// 脚本 import 的第三方包默认不从网络解析;仅白名单内的包可按需动态装载\n// (monorepo workspace symlink 直接把裸包解析到包源码,无需 URL 构造)。\n// 注意:脚本 specifier(如 'gear-lib-demo')经 derivePackageName 无 '@' 前缀,\n// 与 CLI 装载的真实包名('@faicad/gear-lib-demo')不同——白名单按真实包名登记,\n// 同时收录该包名的短 specifier 别名,loadLib 一律归一到真实包名再 import。\nconst CLI_ALLOWED_LIBS = new Set(['@faicad/gear-lib-demo', '@faicad/sheetmetal', '@faicad/cq-compat', '@faicad/fai-cq-gears'])\n/** specifier → 真实包名 归一映射(短名与完整 scoped 名都登记为可装载)。 */\nconst CLI_LIB_ALIASES: Record<string, string> = {\n '@faicad/gear-lib-demo': '@faicad/gear-lib-demo',\n 'gear-lib-demo': '@faicad/gear-lib-demo',\n '@faicad/sheetmetal': '@faicad/sheetmetal',\n 'sheetmetal': '@faicad/sheetmetal',\n '@faicad/cq-compat': '@faicad/cq-compat',\n 'cq-compat': '@faicad/cq-compat',\n '@faicad/fai-cq-gears': '@faicad/fai-cq-gears',\n 'fai-cq-gears': '@faicad/fai-cq-gears',\n}\n\n/**\n * 读库 package.json 的 `faijs.autoLift` 字段(D3-autoLift 外置,§9.4):\n * 逐库 autoLift 约定从 host 写死改为由各库自身 package.json 声明,loader 此处读取。\n * 未声明 → 返回 undefined(回落到 runtime 的推断式 `!hasDualOp(ns)`);\n * 声明为布尔 → 直接采用(如 cq-compat 声明 false,因其函数以 faijs Shape 为受众,\n * 被 compat 边界整体提升会破坏内部借面逻辑)。\n */\nconst requireNode = createRequire(import.meta.url)\nfunction readLibAutoLift(pkg: string): boolean | undefined {\n try {\n const pjPath = requireNode.resolve(`${pkg}/package.json`)\n const pj = JSON.parse(readFileSync(pjPath, 'utf8')) as { faijs?: { autoLift?: boolean } }\n const v = pj.faijs?.autoLift\n return typeof v === 'boolean' ? v : undefined\n } catch {\n return undefined\n }\n}\n\nconst cliPortsLibLoader: LibLoader = {\n loadLib: async (name) => {\n const pkg = CLI_LIB_ALIASES[name]\n if (!pkg || !CLI_ALLOWED_LIBS.has(pkg)) {\n throw new Error(`package \"${name}\" is not in the CLI library whitelist`)\n }\n return (await import(pkg)) as StdlibNamespace\n },\n listLibs: () => Object.keys(CLI_LIB_ALIASES),\n // 默认不提升(与历史 CLI 行为一致);各库用 package.json \"faijs.autoLift\" 逐库覆盖。\n options: {\n autoLift: false,\n autoLiftFor: (name) => {\n const pkg = CLI_LIB_ALIASES[name]\n return pkg ? readLibAutoLift(pkg) : undefined\n },\n },\n}\n\n/** 注入 libLoader 到 node ports(CLI 宿主白名单装载)。 */\nfunction withCliLibLoader(ports: HostPorts): HostPorts {\n return { ...ports, libLoader: cliPortsLibLoader }\n}\n\n/**\n * 注入 projectLoader 到 node ports(多文件 §4.5)。\n *\n * 项目根缺省由 `findProjectRoot` 从入口文件向上找最近的 `package.json`;\n * 宿主可用 `--project-root` 覆盖。未提供根(不应发生)时不注入,单文件行为不变。\n */\nfunction withCliProjectLoader(ports: HostPorts, root: string | undefined): HostPorts {\n if (!root) return ports\n return { ...ports, projectLoader: createFsProjectLoader(root) }\n}\n\n/** Options accepted by the `check` command. */\nexport interface CliCheckOptions {\n /** Asset directory used by the node ports. */\n assetsDir?: string\n /** Extra fonts directory used by the node ports. */\n fontsDir?: string\n}\n\n/** Options accepted by the `run` command. */\nexport interface CliRunOptions {\n /** Execution mode ('auto' | 'brep' | 'mesh'). */\n mode?: ExecutionMode\n /** Asset directory used by the node ports. */\n assetsDir?: string\n /** Extra fonts directory used by the node ports. */\n fontsDir?: string\n /** Default font path used by the node ports. */\n defaultFontPath?: string\n /** Host-injected library namespace (includes cad — the CLI entry faijs-cli.ts passes createInternalStdlib; core does not assemble it by default). */\n libs?: Record<string, StdlibNamespace>\n /**\n * 项目根(多文件 §4.5):相对 import 的解析基准,moduleKey = 相对它的路径。\n * 缺省由入口文件向上找最近的 package.json。\n */\n projectRoot?: string\n}\n\n/** Result of the `check` (dry-run validation) command. */\nexport interface CliCheckResult {\n /** Whether the validation passed. */\n ok: boolean\n /** Validation errors found, one per stage. */\n errors: Array<{ stage: string; message: string; line?: number; stmtId?: string }>\n /** Non-fatal warnings reported during validation. */\n warnings: string[]\n /** Script-level summary when the script parsed successfully. */\n script?: { statements: number; callees: string[] }\n}\n\n/** Result of the `run` (execute and export) command. */\nexport interface CliRunResult {\n /** Whether execution and export succeeded. */\n ok: boolean\n /** The written output file path. */\n outputFile?: string\n /** The written output format ('stl' | 'step'). */\n outputFormat?: string\n /** A human-readable error message when the command failed. */\n error?: string\n /** Informational messages collected during execution. */\n infos?: string[]\n}\n\n/** Options accepted by the `view` command. */\nexport interface CliViewOptions {\n /** Execution mode ('auto' | 'brep' | 'mesh'). view 需要 BREP 路径(mesh-only 无投影)。 */\n mode?: ExecutionMode\n /** Asset directory used by the node ports. */\n assetsDir?: string\n /** Extra fonts directory used by the node ports. */\n fontsDir?: string\n /** Default font path used by the node ports. */\n defaultFontPath?: string\n /** Host-injected library namespace (includes cad). */\n libs?: Record<string, StdlibNamespace>\n /** Project root for relative .fai.js imports. */\n projectRoot?: string\n /** Shape variable name to project; default resolves terminals like `run`. */\n part?: string\n /** Single view direction (default 'front'); mutually exclusive with sheet. */\n view?: ViewSpec\n /** Multi-view sheet list (projectSheet); mutually exclusive with view. */\n sheet?: ViewSpec[]\n}\n\n/** Result of the `view` (execute and project SVG) command. */\nexport interface CliViewResult {\n /** Whether execution and projection succeeded. */\n ok: boolean\n /** The written SVG file path(s). */\n outputFiles?: string[]\n /** A human-readable error message when the command failed. */\n error?: string\n /** Informational messages collected during execution. */\n infos?: string[]\n}\n\n/**\n * Execute the `check` command: dry-run validate a .fai.js file.\n *\n * @param filePath - path to the .fai.js file to validate\n * @param _opts - optional CLI check options (assets and fonts directories)\n * @returns the check result with any validation errors\n */\nexport function cliCheck(filePath: string, _opts?: CliCheckOptions): CliCheckResult {\n const code = readFileSync(filePath, 'utf-8')\n const ports = withCliLibLoader(createNodePorts({\n assetsDir: _opts?.assetsDir,\n fontsDir: _opts?.fontsDir,\n }))\n const runtime = createRuntime(ports)\n const result = runtime.check(code)\n return {\n ok: result.ok,\n errors: result.errors.map((e) => ({\n stage: e.stage,\n message: e.message,\n line: e.line,\n stmtId: e.stmtId,\n })),\n warnings: result.warnings,\n script: result.script,\n }\n}\n\n/**\n * Execute the `run` command: execute a .fai.js file and export STL/STEP.\n *\n * @param filePath - path to the .fai.js file to execute\n * @param outPath - output file path for the exported result (extension determines format)\n * @param opts - optional run options (mode, assets/fonts directories, injected libs)\n * @returns the run result describing success or failure\n */\nexport async function cliRun(\n filePath: string,\n outPath: string,\n opts?: CliRunOptions,\n): Promise<CliRunResult> {\n const code = readFileSync(filePath, 'utf-8')\n // 多文件(§4.5):项目根缺省向上找 package.json;入口自身也有 key(相对根的路径),\n // 否则入口在子目录时它的 `./parts/x.fai.js` 会以根为基准解析而错位。\n const projectRoot = opts?.projectRoot ? resolve(opts.projectRoot) : findProjectRoot(filePath)\n const entryKey = projectKeyOf(projectRoot, filePath)\n\n // Initialize OCCT and bind the vendored brepjs kernel registry (D10) so that\n // cq-compat parts (which project ops through compatFn) run end-to-end under\n // the CLI. registerOcctBrepEngine is idempotent and itself boots initOcctWasm.\n await registerOcctBrepEngine()\n\n // Create runtime with node ports\n const ports = withCliProjectLoader(\n withCliLibLoader(createNodePorts({\n assetsDir: opts?.assetsDir,\n fontsDir: opts?.fontsDir,\n defaultFontPath: opts?.defaultFontPath,\n })),\n projectRoot,\n )\n const runtime = createRuntime(ports, opts?.mode ?? 'auto', opts?.libs)\n // Part 1.4:cad 经 registerLib 声明 packageName(脚本可 `import * as cad from\n // '@faicad/faijs'`,check ①.5 据此校验 specifier——不 declare 则 import 被拒)。\n if (opts?.libs?.cad) {\n runtime.registerLib('cad', opts.libs.cad, {\n default: true,\n packageName: '@faicad/faijs',\n })\n }\n\n // Execute(T5 后:direct 路径,源码文本直通执行)\n const execResult = await runtime.execute(code, { entryKey })\n\n if (execResult.failedAt) {\n return {\n ok: false,\n error: `Execution failed at statement ${execResult.failedAt.index} (callee: ${execResult.failedAt.callee}): ${execResult.failedAt.message}`,\n infos: execResult.infos,\n }\n }\n\n // Determine output format from extension\n const ext = extname(outPath).toLowerCase().slice(1)\n const terminals = execResult.terminals ?? []\n\n if (terminals.length === 0) {\n // No terminals — use last output\n const outputNames = [...execResult.outputs.keys()]\n if (outputNames.length === 0) {\n return { ok: false, error: 'No statements to export' }\n }\n const lastPartName = outputNames[outputNames.length - 1]\n const shape = execResult.outputs.get(asPartName(lastPartName))\n if (!shape) {\n return { ok: false, error: `No output for part \"${lastPartName}\"` }\n }\n const solidEntry = execResult.brepSolids?.get(asPartName(lastPartName))\n return writeOutput(outPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined)\n }\n\n // Single terminal\n if (terminals.length === 1) {\n const terminal = terminals[0]\n const shape = execResult.outputs.get(terminal.id)\n if (!shape) {\n return { ok: false, error: `No output for terminal \"${terminal.id}\"` }\n }\n // Assembly (compound with behavior) → expand members with colors\n if (!('positions' in shape) || !('indices' in shape)) {\n const asmResult = writeAssemblyStep(outPath, ext, shape as CompoundShape, execResult)\n if (asmResult) return asmResult\n }\n const solidEntry = execResult.brepSolids?.get(terminal.id)\n return writeOutput(outPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined)\n }\n\n // Multiple terminals — write each to a separate file\n // First, check if any terminal is a compound (assembly) — export it as a single STEP\n for (let i = 0; i < terminals.length; i++) {\n const terminal = terminals[i]\n const shape = execResult.outputs.get(terminal.id)\n if (!shape) continue\n if (!('positions' in shape) || !('indices' in shape)) {\n // Compound terminal — try assembly STEP export\n const asmResult = writeAssemblyStep(outPath, ext, shape as CompoundShape, execResult)\n if (asmResult) return asmResult\n }\n }\n // Then export non-compound terminals\n for (let i = 0; i < terminals.length; i++) {\n const terminal = terminals[i]\n const shape = execResult.outputs.get(terminal.id)\n if (!shape) continue\n if (!('positions' in shape) || !('indices' in shape)) continue // skip compounds\n\n const name = terminal.meta?.name ?? terminal.id\n const sep = outPath.endsWith('/') || outPath.endsWith('\\\\') ? '' : '_'\n const terminalOutPath = `${outPath}${sep}${i}_${name}.${ext}`\n const solidEntry = execResult.brepSolids?.get(terminal.id)\n const result = writeOutput(terminalOutPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined)\n if (!result.ok) return result\n }\n\n return { ok: true, outputFormat: ext }\n}\n\n/**\n * 解析 `--view` 参数:三数字逗号串 → 方向对象(\"1,-1,1\" → { dir: [1,-1,1] }),\n * 否则按视图名字符串处理(未知名由 viewCamera 抛错)。\n */\nfunction parseViewArg(v: string): ViewSpec {\n const parts = v.split(',').map((s) => s.trim())\n if (parts.length === 3) {\n const nums = parts.map(Number)\n if (nums.every((n) => Number.isFinite(n))) return { dir: nums as [number, number, number] }\n }\n // 视图名字符串('front'|'iso'|…):类型上 CLI 接受任意名称,未知名由 viewCamera 抛错。\n return v as ViewSpec\n}\n\n/**\n * 选出待投影的 shape 列表(`--part` 指定,或按终端自动选择,与 `run` 一致):\n * 只保留带 mesh 的 shape(compound/assembly 无 mesh,无法投影,跳过)。\n */\nfunction selectViewShapes(\n execResult: {\n outputs: Map<unknown, Shape | CompoundShape>\n terminals?: Array<{ id: unknown; meta?: { name?: string } }>\n },\n part?: string,\n): Array<{ name: string; shape: Shape }> {\n const outputs = execResult.outputs\n const viewable = (s: Shape | CompoundShape | undefined): s is Shape =>\n !!s && 'positions' in s && 'indices' in s\n\n if (part) {\n const shape = outputs.get(asPartName(part)) ?? outputs.get(part)\n if (viewable(shape)) return [{ name: part, shape }]\n return []\n }\n\n const terminals = execResult.terminals ?? []\n const ids: unknown[] = terminals.length > 0 ? terminals.map((t) => t.id) : [...outputs.keys()]\n const out: Array<{ name: string; shape: Shape }> = []\n for (const id of ids) {\n const shape = outputs.get(id) ?? outputs.get(asPartName(String(id)))\n if (viewable(shape)) {\n const metaName = terminals.find((t) => t.id === id)?.meta?.name\n out.push({ name: metaName ?? String(id), shape })\n }\n }\n return out\n}\n\n/**\n * Execute the `view` command: execute a .fai.js file and write view SVG(s).\n *\n * 投影在宿主侧进行:脚本只需建模(shape 变量或终端),CLI 调 projectView(--view,\n * 缺省 front)或 projectSheet(--sheet)把 SVG 字符串写盘。view 需要 BREP 路径——\n * mesh-only 的 shape 无 brep 槽,projectView 抛 E_BREP_ONLY_INPUT(提示 --mode brep/auto)。\n *\n * @param filePath - path to the .fai.js file to execute\n * @param outPath - output SVG path (multiple shapes get `<out>_<i>_<name>.svg` suffixes)\n * @param opts - optional view options (mode, part, view/sheet, assets/fonts dirs, libs)\n * @returns the view result describing success or failure\n */\nexport async function cliView(\n filePath: string,\n outPath: string,\n opts?: CliViewOptions,\n): Promise<CliViewResult> {\n const code = readFileSync(filePath, 'utf-8')\n const projectRoot = opts?.projectRoot ? resolve(opts.projectRoot) : findProjectRoot(filePath)\n const entryKey = projectKeyOf(projectRoot, filePath)\n\n // Initialize OCCT(投影 HLR 依赖 brep 内核)。registerOcctBrepEngine is\n // idempotent and itself boots initOcctWasm, and also binds the vendored\n // brepjs kernel registry (D10) — same boot path as cliRun above.\n await registerOcctBrepEngine()\n\n const ports = withCliProjectLoader(\n withCliLibLoader(createNodePorts({\n assetsDir: opts?.assetsDir,\n fontsDir: opts?.fontsDir,\n defaultFontPath: opts?.defaultFontPath,\n })),\n projectRoot,\n )\n const runtime = createRuntime(ports, opts?.mode ?? 'auto', opts?.libs)\n if (opts?.libs?.cad) {\n runtime.registerLib('cad', opts.libs.cad, {\n default: true,\n packageName: '@faicad/faijs',\n })\n }\n\n const execResult = await runtime.execute(code, { entryKey })\n\n if (execResult.failedAt) {\n return {\n ok: false,\n error: `Execution failed at statement ${execResult.failedAt.index} (callee: ${execResult.failedAt.callee}): ${execResult.failedAt.message}`,\n infos: execResult.infos,\n }\n }\n\n const shapes = selectViewShapes(execResult, opts?.part)\n if (shapes.length === 0) {\n return {\n ok: false,\n error: opts?.part\n ? `No output for part \"${opts.part}\"`\n : 'No viewable (mesh-bearing) shapes to project',\n infos: execResult.infos,\n }\n }\n\n const outFiles: string[] = []\n const single = shapes.length === 1\n for (let i = 0; i < shapes.length; i++) {\n const { name, shape } = shapes[i]\n const target = single\n ? outPath\n : `${outPath}${outPath.endsWith('/') || outPath.endsWith('\\\\') ? '' : '_'}${i}_${name}.svg`\n try {\n const svg = opts?.sheet\n ? projectSheet(shape, opts.sheet)\n : projectView(shape, opts?.view ?? 'front')\n writeFileSync(target, svg, 'utf-8')\n outFiles.push(target)\n } catch (e) {\n return {\n ok: false,\n error: `Projection failed for \"${name}\": ${(e as Error).message}`,\n infos: execResult.infos,\n }\n }\n }\n return { ok: true, outputFiles: outFiles, infos: execResult.infos }\n}\n\n/**\n * 写出输出文件。\n *\n * 按零件类型分别处理 STEP 导出:\n * - 有 BREP solid → 精确 STEP(exportStepFromSolid,ADVANCED_FACE)\n * - 无 BREP solid → 三角化 STEP(exportStep/meshesToStep,faceted)\n * - STL:无论是否 BREP,都取 mesh Shape 导出\n *\n * keep-syntax §5.1:outputs 现含 compound(group/assembly 产物,无 mesh);\n * compound 无法导出,给出明确错误(此前\"不在 outputs 中\"是静默失败)。\n */\nfunction writeOutput(\n outPath: string,\n ext: string,\n shape: Shape | CompoundShape,\n brepSolid?: { solid: BrepHandle; kernel: BrepEngineApi },\n): CliRunResult {\n if (!('positions' in shape) || !('indices' in shape)) {\n return {\n ok: false,\n error: `Output \"${outPath}\" is a compound (group/assembly) with no exportable mesh; export a member shape instead`,\n }\n }\n if (ext === 'stl') {\n const buffer = buildStlBufferFromMesh(shape.positions, shape.indices)\n writeFileSync(outPath, Buffer.from(buffer))\n return { ok: true, outputFile: outPath, outputFormat: 'stl' }\n }\n\n if (ext === 'step' || ext === 'stp') {\n if (brepSolid) {\n // 有 BREP solid → 精确 STEP\n const buffer = exportStepFromSolid(brepSolid.solid, brepSolid.kernel)\n writeFileSync(outPath, Buffer.from(buffer))\n return { ok: true, outputFile: outPath, outputFormat: 'step' }\n }\n // 无 BREP solid → 三角化 STEP(mesh 也可以导出 STEP,只是三角化的)\n const stepContent = exportStep(shape)\n writeFileSync(outPath, Buffer.from(stepContent, 'utf-8'))\n return { ok: true, outputFile: outPath, outputFormat: 'step' }\n }\n\n return { ok: false, error: `Unsupported output format: .${ext} (supported: .stl, .step)` }\n}\n\n/**\n * Export an assembly (compound with AssemblyBehavior) as a multi-entity STEP\n * file, preserving member names and colors (from behavior.memberColors).\n *\n * Returns null if the compound has no assembly behavior (falls through to\n * regular writeOutput), or a CliRunResult on success/failure.\n */\nfunction writeAssemblyStep(\n outPath: string,\n ext: string,\n compound: CompoundShape,\n execResult: {\n outputs: Map<unknown, Shape | CompoundShape>\n brepSolids?: Map<unknown, { solid: BrepHandle; kernel: BrepEngineApi }>\n },\n): CliRunResult | null {\n if (ext !== 'step' && ext !== 'stp') return null\n const slot = ensureSlot(compound)\n const behavior = slot.behavior as\n | { memberNames?: string[]; memberColors?: Record<string, [number, number, number]> }\n | undefined\n\n // Find a kernel and collect all exportable solids\n let kernel: BrepEngineApi | null = null\n const entries: StepExportEntry[] = []\n\n // Preferred path: use behavior.memberNames to match colors.\n // Member name lookup tries (1) the explicit member name, then (2) the kept\n // script-variable name of the compound's i-th child — cq-compat's\n // buildAssembly passes CadQuery-style part names (\"axk\") while the shapes\n // are registered under their .fai.js variable names (\"shape_axk\").\n if (behavior?.memberNames && behavior.memberNames.length > 0) {\n // Member Shape list (same order as memberNames) — when a member name\n // misses in brepSolids (e.g. cq libs register short names like 'axk' while\n // the statement variable is 'shape_axk'), resolve the member shape by index\n // and extract its BREP solid, keeping the member name and color.\n const children = (compound as { children?: Shape[] }).children ?? []\n for (let i = 0; i < behavior.memberNames.length; i++) {\n const memberName = behavior.memberNames[i]\n // Preferred: read the member's LIVE identity slot (brepOf) — assembly\n // transforms are baked into slot.solid by the executor's\n // applyPendingAssemblyTransforms AFTER this statement, so the brepSolids\n // snapshot (registered at member creation) may hold the PRE-transform\n // handle. GOTCHA: don't reorder — brepSolids entries are stale for\n // transformed members.\n const child = children[i]\n const liveSolid = child ? (brepOf(child) as BrepHandle | undefined) : undefined\n if (liveSolid) {\n if (!kernel) kernel = execResult.brepSolids?.values().next().value?.kernel ?? null\n if (kernel) {\n entries.push({\n solid: liveSolid,\n name: memberName,\n color: behavior.memberColors?.[memberName],\n })\n continue\n }\n }\n const solidEntry = execResult.brepSolids?.get(asPartName(memberName))\n if (solidEntry) {\n if (!kernel) kernel = solidEntry.kernel\n entries.push({\n solid: solidEntry.solid,\n name: memberName,\n color: behavior.memberColors?.[memberName],\n })\n }\n }\n }\n\n // Fallback: export all brepSolids (covers compounds where memberNames wasn't propagated)\n if (entries.length === 0 && execResult.brepSolids) {\n for (const [key, solidEntry] of execResult.brepSolids) {\n if (!kernel) kernel = solidEntry.kernel\n entries.push({\n solid: solidEntry.solid,\n name: typeof key === 'string' ? key : `part_${entries.length}`,\n })\n }\n }\n\n if (!kernel || entries.length === 0) {\n return null // Let writeOutput handle the error\n }\n\n const buffer = exportStepFromSolids(kernel, entries)\n writeFileSync(outPath, Buffer.from(buffer))\n return { ok: true, outputFile: outPath, outputFormat: 'step' }\n}\n\n/**\n * Parse command-line arguments.\n *\n * @param argv - the raw process argument list (index 0 = node, 1 = script)\n * @returns the parsed command, file, and option values (command is null when unusable)\n */\nexport function parseArgs(argv: string[]): {\n command: 'check' | 'run' | 'view' | null\n file?: string\n out?: string\n mode?: ExecutionMode\n assetsDir?: string\n fontsDir?: string\n projectRoot?: string\n view?: string\n sheet?: string\n part?: string\n} {\n const args = argv.slice(2) // skip node + script\n if (args.length === 0) return { command: null }\n\n const command = args[0] as 'check' | 'run' | 'view' | null\n if (command !== 'check' && command !== 'run' && command !== 'view') return { command: null }\n\n let file: string | undefined\n let out: string | undefined\n let mode: ExecutionMode | undefined\n let assetsDir: string | undefined\n let fontsDir: string | undefined\n let projectRoot: string | undefined\n let view: string | undefined\n let sheet: string | undefined\n let part: string | undefined\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i]\n if (arg === '--out' || arg === '-o') {\n out = args[++i]\n } else if (arg === '--mode' || arg === '-m') {\n const m = args[++i] as ExecutionMode\n if (m === 'auto' || m === 'brep' || m === 'mesh') {\n mode = m\n }\n } else if (arg === '--assets') {\n assetsDir = args[++i]\n } else if (arg === '--fonts') {\n fontsDir = args[++i]\n } else if (arg === '--project-root') {\n projectRoot = args[++i]\n } else if (arg === '--view') {\n view = args[++i]\n } else if (arg === '--sheet') {\n sheet = args[++i]\n } else if (arg === '--part') {\n part = args[++i]\n } else if (!file && !arg.startsWith('-')) {\n file = arg\n }\n }\n\n return { command, file, out, mode, assetsDir, fontsDir, projectRoot, view, sheet, part }\n}\n\n/**\n * CLI main entry point (called by scripts/faijs-cli.ts).\n *\n * @param argv - the raw process argument list\n * @param libs - host-injected library namespace (includes cad — faijs-cli.ts passes createInternalStdlib; core does not assemble it by default)\n * @returns the process exit code (0 on success, non-zero on failure)\n */\nexport async function cliMain(argv: string[], libs?: Record<string, StdlibNamespace>): Promise<number> {\n const { command, file, out, mode, assetsDir, fontsDir, projectRoot, view, sheet, part } = parseArgs(argv)\n\n if (!command) {\n process.stderr.write('Usage: faijs-cli <check|run|view> <file.fai.js> [options]\\n')\n process.stderr.write(' check <file> DryRun validation\\n')\n process.stderr.write(' run <file> --out <file> Execute and export STL/STEP\\n')\n process.stderr.write(' view <file> --out <svg> Execute and project view SVG (三视图/等轴测)\\n')\n process.stderr.write(' --mode <auto|brep|mesh> Execution mode (view 需要 BREP 路径)\\n')\n process.stderr.write(' --assets <dir> Asset directory\\n')\n process.stderr.write(' --fonts <dir> Extra fonts directory\\n')\n process.stderr.write(' --project-root <dir> Project root for relative .fai.js imports\\n')\n process.stderr.write(' --part <name> (view) shape variable to project (default: terminals)\\n')\n process.stderr.write(' --view <dir> (view) single view: front|back|top|bottom|left|right|iso|\"x,y,z\" (default front)\\n')\n process.stderr.write(' --sheet <a,b,c> (view) multi-view sheet: front,top,right,iso (mutually exclusive with --view)\\n')\n return 1\n }\n\n if (!file) {\n process.stderr.write(`Error: missing file argument for \"${command}\"\\n`)\n return 1\n }\n\n const filePath = resolve(file)\n\n if (command === 'check') {\n const result = cliCheck(filePath, { assetsDir, fontsDir })\n if (result.ok) {\n process.stdout.write(`✓ ${filePath}: OK\\n`)\n if (result.script) {\n process.stdout.write(` statements: ${result.script.statements}\\n`)\n process.stdout.write(` callees: ${result.script.callees.join(', ')}\\n`)\n }\n return 0\n } else {\n process.stderr.write(`✗ ${filePath}: ${result.errors.length} error(s)\\n`)\n for (const err of result.errors) {\n const loc = err.line ? ` (line ${err.line})` : err.stmtId ? ` (stmt: ${err.stmtId})` : ''\n process.stderr.write(` [${err.stage}] ${err.message}${loc}\\n`)\n }\n return 1\n }\n }\n\n if (command === 'run') {\n if (!out) {\n process.stderr.write('Error: --out is required for \"run\" command\\n')\n return 1\n }\n\n const outPath = resolve(out)\n const result = await cliRun(filePath, outPath, { mode, assetsDir, fontsDir, projectRoot, libs })\n\n if (result.ok) {\n process.stdout.write(`✓ ${filePath} → ${outPath} (${result.outputFormat})\\n`)\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 0\n } else {\n process.stderr.write(`✗ ${filePath}: ${result.error}\\n`)\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 1\n }\n }\n\n if (command === 'view') {\n if (!out) {\n process.stderr.write('Error: --out is required for \"view\" command\\n')\n return 1\n }\n if (view && sheet) {\n process.stderr.write('Error: --view and --sheet are mutually exclusive\\n')\n return 1\n }\n\n const outPath = resolve(out)\n const viewSpec = view ? parseViewArg(view) : undefined\n const sheetSpec = sheet\n ? (sheet\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean) as ViewSpec[])\n : undefined\n const result = await cliView(filePath, outPath, {\n mode,\n assetsDir,\n fontsDir,\n projectRoot,\n libs,\n part,\n view: viewSpec,\n sheet: sheetSpec,\n })\n\n if (result.ok) {\n for (const f of result.outputFiles ?? []) {\n process.stdout.write(`✓ ${filePath} → ${f} (svg)\\n`)\n }\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 0\n } else {\n process.stderr.write(`✗ ${filePath}: ${result.error}\\n`)\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 1\n }\n }\n\n return 1\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/node-host/cli.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * faijs-cli — CLI 逻辑(可导入、可测试)。第三方调用入口:packages/core/scripts/faijs-cli.ts。\n * (仓库自用 doc/ci/开发脚本在根 scripts/ 与 packages/core/scripts/gen-*,见 scripts/README.md。)\n *\n *\n * 命令:\n * check <file.fai.js> — dryRun:parse + schema + 引用预检\n * run <file.fai.js> --out <file> — 执行并导出 STL/STEP\n * view <file.fai.js> --out <x.svg> — 执行并投影输出视图 SVG(三视图/等轴测)\n *\n * 选项:\n * --mode <auto|brep|mesh> — 执行模式(默认 auto;view 需要 BREP 路径)\n * --assets <dir> — 资产目录\n * --fonts <dir> — 额外字体目录\n * --part <name> — (view) 指定投影的 shape 变量名;缺省按终端自动选择\n * --view <front|back|top|bottom|left|right|iso|\"x,y,z\">\n * — (view) 单视图方向(默认 front)\n * --sheet <front,top,right,iso> — (view) 多视图图纸(projectSheet;与 --view 互斥)\n */\n\nimport { readFileSync, writeFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { resolve, extname } from 'node:path'\nimport { createRuntime } from '../cad-runtime/runtime'\nimport type { StdlibNamespace } from '../runtime-state'\nimport type { ExecutionMode, HostPorts, LibLoader } from '../cad-runtime/ports'\nimport { createNodePorts } from './index'\nimport { createFsProjectLoader, findProjectRoot, projectKeyOf } from './fs-project-loader'\nimport { buildStlBufferFromMesh } from '../brep/export/stl'\nimport { exportStepFromSolid, exportStepFromSolids, type StepExportEntry } from '../brep/export/step'\nimport { exportStep } from '../occt-kernel/highLevelApi'\nimport { registerOcctBrepEngine } from '../brep/engine/adapters/occt'\nimport type { Shape } from '../mesh/types'\nimport type { CompoundShape } from '../shape'\nimport { ensureSlot } from '../shape'\nimport { brepOf } from '../shape'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { asPartName } from '../identity'\nimport { projectView, projectSheet } from '../api/view'\nimport type { ViewSpec } from '../api/view/view-camera'\n\n// ── P 四(4.4):Node CLI 自动装载(D3-Node,§9.4)──\n// 脚本 import 的第三方库按 specifier 动态解析,host 不再写死任何包清单:\n// - scoped 包名(`@faicad/...`)直接动态 import;\n// - 短名(如 `gear-lib-demo`)先归一为 scoped 全名再装载(避免误装同名陌生人包)。\n// 包未安装 → 动态 import 抛 ERR_MODULE_NOT_FOUND,由 runtime 报明确装载失败信息。\n/** scoped 包名前缀:CLI 允许动态装载的库范围。 */\nconst CLI_SCOPED_PREFIX = '@faicad/'\n/** 已登记短名 → scoped 全名归一表(仅收录 `@faicad/` 范围内的库,防同名陌生人包)。 */\nconst CLI_SHORT_NAMES: Record<string, string> = {\n 'gear-lib-demo': '@faicad/gear-lib-demo',\n 'sheetmetal': '@faicad/sheetmetal',\n 'cq-compat': '@faicad/cq-compat',\n 'fai-cq-gears': '@faicad/fai-cq-gears',\n 'fai-cq-warehouse': '@faicad/fai-cq-warehouse',\n}\n\n/**\n * 读库 package.json 的 `faijs.autoLift` 字段(D3-autoLift 外置,§9.4):\n * 逐库 autoLift 约定从 host 写死改为由各库自身 package.json 声明,loader 此处读取。\n * 未声明 → 返回 undefined(回落到 runtime 的推断式 `!hasDualOp(ns)`);\n * 声明为布尔 → 直接采用(如 cq-compat 声明 false,因其函数以 faijs Shape 为受众,\n * 被 compat 边界整体提升会破坏内部借面逻辑)。\n */\nconst requireNode = createRequire(import.meta.url)\nfunction readLibAutoLift(pkg: string): boolean | undefined {\n try {\n const pjPath = requireNode.resolve(`${pkg}/package.json`)\n const pj = JSON.parse(readFileSync(pjPath, 'utf8')) as { faijs?: { autoLift?: boolean } }\n const v = pj.faijs?.autoLift\n return typeof v === 'boolean' ? v : undefined\n } catch {\n return undefined\n }\n}\n\n/** specifier → scoped 全名归一:scoped 名原样,已登记短名映射,其余原样交 import 解析。 */\nfunction normalizeCliSpecifier(name: string): string {\n return CLI_SHORT_NAMES[name] ?? name\n}\n\nconst cliPortsLibLoader: LibLoader = {\n loadLib: async (name) => {\n const pkg = normalizeCliSpecifier(name)\n if (!pkg.startsWith(CLI_SCOPED_PREFIX)) {\n throw new Error(`package \"${name}\" is not a scoped @faicad/ library`)\n }\n return (await import(pkg)) as StdlibNamespace\n },\n listLibs: () => [...Object.keys(CLI_SHORT_NAMES), '@faicad/'],\n // 默认不提升(与历史 CLI 行为一致);各库用 package.json \"faijs.autoLift\" 逐库覆盖。\n options: {\n autoLift: false,\n autoLiftFor: (name) => {\n const pkg = normalizeCliSpecifier(name)\n return pkg.startsWith(CLI_SCOPED_PREFIX) ? readLibAutoLift(pkg) : undefined\n },\n },\n}\n\n/** 注入 libLoader 到 node ports(CLI 宿主白名单装载)。 */\nfunction withCliLibLoader(ports: HostPorts): HostPorts {\n return { ...ports, libLoader: cliPortsLibLoader }\n}\n\n/**\n * 注入 projectLoader 到 node ports(多文件 §4.5)。\n *\n * 项目根缺省由 `findProjectRoot` 从入口文件向上找最近的 `package.json`;\n * 宿主可用 `--project-root` 覆盖。未提供根(不应发生)时不注入,单文件行为不变。\n */\nfunction withCliProjectLoader(ports: HostPorts, root: string | undefined): HostPorts {\n if (!root) return ports\n return { ...ports, projectLoader: createFsProjectLoader(root) }\n}\n\n/** Options accepted by the `check` command. */\nexport interface CliCheckOptions {\n /** Asset directory used by the node ports. */\n assetsDir?: string\n /** Extra fonts directory used by the node ports. */\n fontsDir?: string\n}\n\n/** Options accepted by the `run` command. */\nexport interface CliRunOptions {\n /** Execution mode ('auto' | 'brep' | 'mesh'). */\n mode?: ExecutionMode\n /** Asset directory used by the node ports. */\n assetsDir?: string\n /** Extra fonts directory used by the node ports. */\n fontsDir?: string\n /** Default font path used by the node ports. */\n defaultFontPath?: string\n /** Host-injected library namespace (includes cad — the CLI entry faijs-cli.ts passes createInternalStdlib; core does not assemble it by default). */\n libs?: Record<string, StdlibNamespace>\n /**\n * 项目根(多文件 §4.5):相对 import 的解析基准,moduleKey = 相对它的路径。\n * 缺省由入口文件向上找最近的 package.json。\n */\n projectRoot?: string\n}\n\n/** Result of the `check` (dry-run validation) command. */\nexport interface CliCheckResult {\n /** Whether the validation passed. */\n ok: boolean\n /** Validation errors found, one per stage. */\n errors: Array<{ stage: string; message: string; line?: number; stmtId?: string }>\n /** Non-fatal warnings reported during validation. */\n warnings: string[]\n /** Script-level summary when the script parsed successfully. */\n script?: { statements: number; callees: string[] }\n}\n\n/** Result of the `run` (execute and export) command. */\nexport interface CliRunResult {\n /** Whether execution and export succeeded. */\n ok: boolean\n /** The written output file path. */\n outputFile?: string\n /** The written output format ('stl' | 'step'). */\n outputFormat?: string\n /** A human-readable error message when the command failed. */\n error?: string\n /** Informational messages collected during execution. */\n infos?: string[]\n}\n\n/** Options accepted by the `view` command. */\nexport interface CliViewOptions {\n /** Execution mode ('auto' | 'brep' | 'mesh'). view 需要 BREP 路径(mesh-only 无投影)。 */\n mode?: ExecutionMode\n /** Asset directory used by the node ports. */\n assetsDir?: string\n /** Extra fonts directory used by the node ports. */\n fontsDir?: string\n /** Default font path used by the node ports. */\n defaultFontPath?: string\n /** Host-injected library namespace (includes cad). */\n libs?: Record<string, StdlibNamespace>\n /** Project root for relative .fai.js imports. */\n projectRoot?: string\n /** Shape variable name to project; default resolves terminals like `run`. */\n part?: string\n /** Single view direction (default 'front'); mutually exclusive with sheet. */\n view?: ViewSpec\n /** Multi-view sheet list (projectSheet); mutually exclusive with view. */\n sheet?: ViewSpec[]\n}\n\n/** Result of the `view` (execute and project SVG) command. */\nexport interface CliViewResult {\n /** Whether execution and projection succeeded. */\n ok: boolean\n /** The written SVG file path(s). */\n outputFiles?: string[]\n /** A human-readable error message when the command failed. */\n error?: string\n /** Informational messages collected during execution. */\n infos?: string[]\n}\n\n/**\n * Execute the `check` command: dry-run validate a .fai.js file.\n *\n * @param filePath - path to the .fai.js file to validate\n * @param _opts - optional CLI check options (assets and fonts directories)\n * @returns the check result with any validation errors\n */\nexport function cliCheck(filePath: string, _opts?: CliCheckOptions): CliCheckResult {\n const code = readFileSync(filePath, 'utf-8')\n const ports = withCliLibLoader(createNodePorts({\n assetsDir: _opts?.assetsDir,\n fontsDir: _opts?.fontsDir,\n }))\n const runtime = createRuntime(ports)\n const result = runtime.check(code)\n return {\n ok: result.ok,\n errors: result.errors.map((e) => ({\n stage: e.stage,\n message: e.message,\n line: e.line,\n stmtId: e.stmtId,\n })),\n warnings: result.warnings,\n script: result.script,\n }\n}\n\n/**\n * Execute the `run` command: execute a .fai.js file and export STL/STEP.\n *\n * @param filePath - path to the .fai.js file to execute\n * @param outPath - output file path for the exported result (extension determines format)\n * @param opts - optional run options (mode, assets/fonts directories, injected libs)\n * @returns the run result describing success or failure\n */\nexport async function cliRun(\n filePath: string,\n outPath: string,\n opts?: CliRunOptions,\n): Promise<CliRunResult> {\n const code = readFileSync(filePath, 'utf-8')\n // 多文件(§4.5):项目根缺省向上找 package.json;入口自身也有 key(相对根的路径),\n // 否则入口在子目录时它的 `./parts/x.fai.js` 会以根为基准解析而错位。\n const projectRoot = opts?.projectRoot ? resolve(opts.projectRoot) : findProjectRoot(filePath)\n const entryKey = projectKeyOf(projectRoot, filePath)\n\n // Initialize OCCT and bind the vendored brepjs kernel registry (D10) so that\n // cq-compat parts (which project ops through compatFn) run end-to-end under\n // the CLI. registerOcctBrepEngine is idempotent and itself boots initOcctWasm.\n await registerOcctBrepEngine()\n\n // Create runtime with node ports\n const ports = withCliProjectLoader(\n withCliLibLoader(createNodePorts({\n assetsDir: opts?.assetsDir,\n fontsDir: opts?.fontsDir,\n defaultFontPath: opts?.defaultFontPath,\n })),\n projectRoot,\n )\n const runtime = createRuntime(ports, opts?.mode ?? 'auto', opts?.libs)\n // Part 1.4:cad 经 registerLib 声明 packageName(脚本可 `import * as cad from\n // '@faicad/faijs'`,check ①.5 据此校验 specifier——不 declare 则 import 被拒)。\n if (opts?.libs?.cad) {\n runtime.registerLib('cad', opts.libs.cad, {\n default: true,\n packageName: '@faicad/faijs',\n })\n }\n\n // Execute(T5 后:direct 路径,源码文本直通执行)\n const execResult = await runtime.execute(code, { entryKey })\n\n if (execResult.failedAt) {\n return {\n ok: false,\n error: `Execution failed at statement ${execResult.failedAt.index} (callee: ${execResult.failedAt.callee}): ${execResult.failedAt.message}`,\n infos: execResult.infos,\n }\n }\n\n // Determine output format from extension\n const ext = extname(outPath).toLowerCase().slice(1)\n const terminals = execResult.terminals ?? []\n\n if (terminals.length === 0) {\n // No terminals — use last output\n const outputNames = [...execResult.outputs.keys()]\n if (outputNames.length === 0) {\n return { ok: false, error: 'No statements to export' }\n }\n const lastPartName = outputNames[outputNames.length - 1]\n const shape = execResult.outputs.get(asPartName(lastPartName))\n if (!shape) {\n return { ok: false, error: `No output for part \"${lastPartName}\"` }\n }\n const solidEntry = execResult.brepSolids?.get(asPartName(lastPartName))\n return writeOutput(outPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined)\n }\n\n // Single terminal\n if (terminals.length === 1) {\n const terminal = terminals[0]\n const shape = execResult.outputs.get(terminal.id)\n if (!shape) {\n return { ok: false, error: `No output for terminal \"${terminal.id}\"` }\n }\n // Assembly (compound with behavior) → expand members with colors\n if (!('positions' in shape) || !('indices' in shape)) {\n const asmResult = writeAssemblyStep(outPath, ext, shape as CompoundShape, execResult)\n if (asmResult) return asmResult\n }\n const solidEntry = execResult.brepSolids?.get(terminal.id)\n return writeOutput(outPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined)\n }\n\n // Multiple terminals — write each to a separate file\n // First, check if any terminal is a compound (assembly) — export it as a single STEP\n for (let i = 0; i < terminals.length; i++) {\n const terminal = terminals[i]\n const shape = execResult.outputs.get(terminal.id)\n if (!shape) continue\n if (!('positions' in shape) || !('indices' in shape)) {\n // Compound terminal — try assembly STEP export\n const asmResult = writeAssemblyStep(outPath, ext, shape as CompoundShape, execResult)\n if (asmResult) return asmResult\n }\n }\n // Then export non-compound terminals\n for (let i = 0; i < terminals.length; i++) {\n const terminal = terminals[i]\n const shape = execResult.outputs.get(terminal.id)\n if (!shape) continue\n if (!('positions' in shape) || !('indices' in shape)) continue // skip compounds\n\n const name = terminal.meta?.name ?? terminal.id\n const sep = outPath.endsWith('/') || outPath.endsWith('\\\\') ? '' : '_'\n const terminalOutPath = `${outPath}${sep}${i}_${name}.${ext}`\n const solidEntry = execResult.brepSolids?.get(terminal.id)\n const result = writeOutput(terminalOutPath, ext, shape, solidEntry ? { solid: solidEntry.solid, kernel: solidEntry.kernel } : undefined)\n if (!result.ok) return result\n }\n\n return { ok: true, outputFormat: ext }\n}\n\n/**\n * 解析 `--view` 参数:三数字逗号串 → 方向对象(\"1,-1,1\" → { dir: [1,-1,1] }),\n * 否则按视图名字符串处理(未知名由 viewCamera 抛错)。\n */\nfunction parseViewArg(v: string): ViewSpec {\n const parts = v.split(',').map((s) => s.trim())\n if (parts.length === 3) {\n const nums = parts.map(Number)\n if (nums.every((n) => Number.isFinite(n))) return { dir: nums as [number, number, number] }\n }\n // 视图名字符串('front'|'iso'|…):类型上 CLI 接受任意名称,未知名由 viewCamera 抛错。\n return v as ViewSpec\n}\n\n/**\n * 选出待投影的 shape 列表(`--part` 指定,或按终端自动选择,与 `run` 一致):\n * 只保留带 mesh 的 shape(compound/assembly 无 mesh,无法投影,跳过)。\n */\nfunction selectViewShapes(\n execResult: {\n outputs: Map<unknown, Shape | CompoundShape>\n terminals?: Array<{ id: unknown; meta?: { name?: string } }>\n },\n part?: string,\n): Array<{ name: string; shape: Shape }> {\n const outputs = execResult.outputs\n const viewable = (s: Shape | CompoundShape | undefined): s is Shape =>\n !!s && 'positions' in s && 'indices' in s\n\n if (part) {\n const shape = outputs.get(asPartName(part)) ?? outputs.get(part)\n if (viewable(shape)) return [{ name: part, shape }]\n return []\n }\n\n const terminals = execResult.terminals ?? []\n const ids: unknown[] = terminals.length > 0 ? terminals.map((t) => t.id) : [...outputs.keys()]\n const out: Array<{ name: string; shape: Shape }> = []\n for (const id of ids) {\n const shape = outputs.get(id) ?? outputs.get(asPartName(String(id)))\n if (viewable(shape)) {\n const metaName = terminals.find((t) => t.id === id)?.meta?.name\n out.push({ name: metaName ?? String(id), shape })\n }\n }\n return out\n}\n\n/**\n * Execute the `view` command: execute a .fai.js file and write view SVG(s).\n *\n * 投影在宿主侧进行:脚本只需建模(shape 变量或终端),CLI 调 projectView(--view,\n * 缺省 front)或 projectSheet(--sheet)把 SVG 字符串写盘。view 需要 BREP 路径——\n * mesh-only 的 shape 无 brep 槽,projectView 抛 E_BREP_ONLY_INPUT(提示 --mode brep/auto)。\n *\n * @param filePath - path to the .fai.js file to execute\n * @param outPath - output SVG path (multiple shapes get `<out>_<i>_<name>.svg` suffixes)\n * @param opts - optional view options (mode, part, view/sheet, assets/fonts dirs, libs)\n * @returns the view result describing success or failure\n */\nexport async function cliView(\n filePath: string,\n outPath: string,\n opts?: CliViewOptions,\n): Promise<CliViewResult> {\n const code = readFileSync(filePath, 'utf-8')\n const projectRoot = opts?.projectRoot ? resolve(opts.projectRoot) : findProjectRoot(filePath)\n const entryKey = projectKeyOf(projectRoot, filePath)\n\n // Initialize OCCT(投影 HLR 依赖 brep 内核)。registerOcctBrepEngine is\n // idempotent and itself boots initOcctWasm, and also binds the vendored\n // brepjs kernel registry (D10) — same boot path as cliRun above.\n await registerOcctBrepEngine()\n\n const ports = withCliProjectLoader(\n withCliLibLoader(createNodePorts({\n assetsDir: opts?.assetsDir,\n fontsDir: opts?.fontsDir,\n defaultFontPath: opts?.defaultFontPath,\n })),\n projectRoot,\n )\n const runtime = createRuntime(ports, opts?.mode ?? 'auto', opts?.libs)\n if (opts?.libs?.cad) {\n runtime.registerLib('cad', opts.libs.cad, {\n default: true,\n packageName: '@faicad/faijs',\n })\n }\n\n const execResult = await runtime.execute(code, { entryKey })\n\n if (execResult.failedAt) {\n return {\n ok: false,\n error: `Execution failed at statement ${execResult.failedAt.index} (callee: ${execResult.failedAt.callee}): ${execResult.failedAt.message}`,\n infos: execResult.infos,\n }\n }\n\n const shapes = selectViewShapes(execResult, opts?.part)\n if (shapes.length === 0) {\n return {\n ok: false,\n error: opts?.part\n ? `No output for part \"${opts.part}\"`\n : 'No viewable (mesh-bearing) shapes to project',\n infos: execResult.infos,\n }\n }\n\n const outFiles: string[] = []\n const single = shapes.length === 1\n for (let i = 0; i < shapes.length; i++) {\n const { name, shape } = shapes[i]\n const target = single\n ? outPath\n : `${outPath}${outPath.endsWith('/') || outPath.endsWith('\\\\') ? '' : '_'}${i}_${name}.svg`\n try {\n const svg = opts?.sheet\n ? projectSheet(shape, opts.sheet)\n : projectView(shape, opts?.view ?? 'front')\n writeFileSync(target, svg, 'utf-8')\n outFiles.push(target)\n } catch (e) {\n return {\n ok: false,\n error: `Projection failed for \"${name}\": ${(e as Error).message}`,\n infos: execResult.infos,\n }\n }\n }\n return { ok: true, outputFiles: outFiles, infos: execResult.infos }\n}\n\n/**\n * 写出输出文件。\n *\n * 按零件类型分别处理 STEP 导出:\n * - 有 BREP solid → 精确 STEP(exportStepFromSolid,ADVANCED_FACE)\n * - 无 BREP solid → 三角化 STEP(exportStep/meshesToStep,faceted)\n * - STL:无论是否 BREP,都取 mesh Shape 导出\n *\n * keep-syntax §5.1:outputs 现含 compound(group/assembly 产物,无 mesh);\n * compound 无法导出,给出明确错误(此前\"不在 outputs 中\"是静默失败)。\n */\nfunction writeOutput(\n outPath: string,\n ext: string,\n shape: Shape | CompoundShape,\n brepSolid?: { solid: BrepHandle; kernel: BrepEngineApi },\n): CliRunResult {\n if (!('positions' in shape) || !('indices' in shape)) {\n return {\n ok: false,\n error: `Output \"${outPath}\" is a compound (group/assembly) with no exportable mesh; export a member shape instead`,\n }\n }\n if (ext === 'stl') {\n const buffer = buildStlBufferFromMesh(shape.positions, shape.indices)\n writeFileSync(outPath, Buffer.from(buffer))\n return { ok: true, outputFile: outPath, outputFormat: 'stl' }\n }\n\n if (ext === 'step' || ext === 'stp') {\n if (brepSolid) {\n // 有 BREP solid → 精确 STEP\n const buffer = exportStepFromSolid(brepSolid.solid, brepSolid.kernel)\n writeFileSync(outPath, Buffer.from(buffer))\n return { ok: true, outputFile: outPath, outputFormat: 'step' }\n }\n // 无 BREP solid → 三角化 STEP(mesh 也可以导出 STEP,只是三角化的)\n const stepContent = exportStep(shape)\n writeFileSync(outPath, Buffer.from(stepContent, 'utf-8'))\n return { ok: true, outputFile: outPath, outputFormat: 'step' }\n }\n\n return { ok: false, error: `Unsupported output format: .${ext} (supported: .stl, .step)` }\n}\n\n/**\n * Export an assembly (compound with AssemblyBehavior) as a multi-entity STEP\n * file, preserving member names and colors (from behavior.memberColors).\n *\n * Returns null if the compound has no assembly behavior (falls through to\n * regular writeOutput), or a CliRunResult on success/failure.\n */\nfunction writeAssemblyStep(\n outPath: string,\n ext: string,\n compound: CompoundShape,\n execResult: {\n outputs: Map<unknown, Shape | CompoundShape>\n brepSolids?: Map<unknown, { solid: BrepHandle; kernel: BrepEngineApi }>\n },\n): CliRunResult | null {\n if (ext !== 'step' && ext !== 'stp') return null\n const slot = ensureSlot(compound)\n const behavior = slot.behavior as\n | { memberNames?: string[]; memberColors?: Record<string, [number, number, number]> }\n | undefined\n\n // Find a kernel and collect all exportable solids\n let kernel: BrepEngineApi | null = null\n const entries: StepExportEntry[] = []\n\n // Preferred path: use behavior.memberNames to match colors.\n // Member name lookup tries (1) the explicit member name, then (2) the kept\n // script-variable name of the compound's i-th child — cq-compat's\n // buildAssembly passes CadQuery-style part names (\"axk\") while the shapes\n // are registered under their .fai.js variable names (\"shape_axk\").\n if (behavior?.memberNames && behavior.memberNames.length > 0) {\n // Member Shape list (same order as memberNames) — when a member name\n // misses in brepSolids (e.g. cq libs register short names like 'axk' while\n // the statement variable is 'shape_axk'), resolve the member shape by index\n // and extract its BREP solid, keeping the member name and color.\n const children = (compound as { children?: Shape[] }).children ?? []\n for (let i = 0; i < behavior.memberNames.length; i++) {\n const memberName = behavior.memberNames[i]\n // Preferred: read the member's LIVE identity slot (brepOf) — assembly\n // transforms are baked into slot.solid by the executor's\n // applyPendingAssemblyTransforms AFTER this statement, so the brepSolids\n // snapshot (registered at member creation) may hold the PRE-transform\n // handle. GOTCHA: don't reorder — brepSolids entries are stale for\n // transformed members.\n const child = children[i]\n const liveSolid = child ? (brepOf(child) as BrepHandle | undefined) : undefined\n if (liveSolid) {\n if (!kernel) kernel = execResult.brepSolids?.values().next().value?.kernel ?? null\n if (kernel) {\n entries.push({\n solid: liveSolid,\n name: memberName,\n color: behavior.memberColors?.[memberName],\n })\n continue\n }\n }\n const solidEntry = execResult.brepSolids?.get(asPartName(memberName))\n if (solidEntry) {\n if (!kernel) kernel = solidEntry.kernel\n entries.push({\n solid: solidEntry.solid,\n name: memberName,\n color: behavior.memberColors?.[memberName],\n })\n }\n }\n }\n\n // Fallback: export all brepSolids (covers compounds where memberNames wasn't propagated)\n if (entries.length === 0 && execResult.brepSolids) {\n for (const [key, solidEntry] of execResult.brepSolids) {\n if (!kernel) kernel = solidEntry.kernel\n entries.push({\n solid: solidEntry.solid,\n name: typeof key === 'string' ? key : `part_${entries.length}`,\n })\n }\n }\n\n if (!kernel || entries.length === 0) {\n return null // Let writeOutput handle the error\n }\n\n const buffer = exportStepFromSolids(kernel, entries)\n writeFileSync(outPath, Buffer.from(buffer))\n return { ok: true, outputFile: outPath, outputFormat: 'step' }\n}\n\n/**\n * Parse command-line arguments.\n *\n * @param argv - the raw process argument list (index 0 = node, 1 = script)\n * @returns the parsed command, file, and option values (command is null when unusable)\n */\nexport function parseArgs(argv: string[]): {\n command: 'check' | 'run' | 'view' | null\n file?: string\n out?: string\n mode?: ExecutionMode\n assetsDir?: string\n fontsDir?: string\n projectRoot?: string\n view?: string\n sheet?: string\n part?: string\n} {\n const args = argv.slice(2) // skip node + script\n if (args.length === 0) return { command: null }\n\n const command = args[0] as 'check' | 'run' | 'view' | null\n if (command !== 'check' && command !== 'run' && command !== 'view') return { command: null }\n\n let file: string | undefined\n let out: string | undefined\n let mode: ExecutionMode | undefined\n let assetsDir: string | undefined\n let fontsDir: string | undefined\n let projectRoot: string | undefined\n let view: string | undefined\n let sheet: string | undefined\n let part: string | undefined\n\n for (let i = 1; i < args.length; i++) {\n const arg = args[i]\n if (arg === '--out' || arg === '-o') {\n out = args[++i]\n } else if (arg === '--mode' || arg === '-m') {\n const m = args[++i] as ExecutionMode\n if (m === 'auto' || m === 'brep' || m === 'mesh') {\n mode = m\n }\n } else if (arg === '--assets') {\n assetsDir = args[++i]\n } else if (arg === '--fonts') {\n fontsDir = args[++i]\n } else if (arg === '--project-root') {\n projectRoot = args[++i]\n } else if (arg === '--view') {\n view = args[++i]\n } else if (arg === '--sheet') {\n sheet = args[++i]\n } else if (arg === '--part') {\n part = args[++i]\n } else if (!file && !arg.startsWith('-')) {\n file = arg\n }\n }\n\n return { command, file, out, mode, assetsDir, fontsDir, projectRoot, view, sheet, part }\n}\n\n/**\n * CLI main entry point (called by scripts/faijs-cli.ts).\n *\n * @param argv - the raw process argument list\n * @param libs - host-injected library namespace (includes cad — faijs-cli.ts passes createInternalStdlib; core does not assemble it by default)\n * @returns the process exit code (0 on success, non-zero on failure)\n */\nexport async function cliMain(argv: string[], libs?: Record<string, StdlibNamespace>): Promise<number> {\n const { command, file, out, mode, assetsDir, fontsDir, projectRoot, view, sheet, part } = parseArgs(argv)\n\n if (!command) {\n process.stderr.write('Usage: faijs-cli <check|run|view> <file.fai.js> [options]\\n')\n process.stderr.write(' check <file> DryRun validation\\n')\n process.stderr.write(' run <file> --out <file> Execute and export STL/STEP\\n')\n process.stderr.write(' view <file> --out <svg> Execute and project view SVG (三视图/等轴测)\\n')\n process.stderr.write(' --mode <auto|brep|mesh> Execution mode (view 需要 BREP 路径)\\n')\n process.stderr.write(' --assets <dir> Asset directory\\n')\n process.stderr.write(' --fonts <dir> Extra fonts directory\\n')\n process.stderr.write(' --project-root <dir> Project root for relative .fai.js imports\\n')\n process.stderr.write(' --part <name> (view) shape variable to project (default: terminals)\\n')\n process.stderr.write(' --view <dir> (view) single view: front|back|top|bottom|left|right|iso|\"x,y,z\" (default front)\\n')\n process.stderr.write(' --sheet <a,b,c> (view) multi-view sheet: front,top,right,iso (mutually exclusive with --view)\\n')\n return 1\n }\n\n if (!file) {\n process.stderr.write(`Error: missing file argument for \"${command}\"\\n`)\n return 1\n }\n\n const filePath = resolve(file)\n\n if (command === 'check') {\n const result = cliCheck(filePath, { assetsDir, fontsDir })\n if (result.ok) {\n process.stdout.write(`✓ ${filePath}: OK\\n`)\n if (result.script) {\n process.stdout.write(` statements: ${result.script.statements}\\n`)\n process.stdout.write(` callees: ${result.script.callees.join(', ')}\\n`)\n }\n return 0\n } else {\n process.stderr.write(`✗ ${filePath}: ${result.errors.length} error(s)\\n`)\n for (const err of result.errors) {\n const loc = err.line ? ` (line ${err.line})` : err.stmtId ? ` (stmt: ${err.stmtId})` : ''\n process.stderr.write(` [${err.stage}] ${err.message}${loc}\\n`)\n }\n return 1\n }\n }\n\n if (command === 'run') {\n if (!out) {\n process.stderr.write('Error: --out is required for \"run\" command\\n')\n return 1\n }\n\n const outPath = resolve(out)\n const result = await cliRun(filePath, outPath, { mode, assetsDir, fontsDir, projectRoot, libs })\n\n if (result.ok) {\n process.stdout.write(`✓ ${filePath} → ${outPath} (${result.outputFormat})\\n`)\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 0\n } else {\n process.stderr.write(`✗ ${filePath}: ${result.error}\\n`)\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 1\n }\n }\n\n if (command === 'view') {\n if (!out) {\n process.stderr.write('Error: --out is required for \"view\" command\\n')\n return 1\n }\n if (view && sheet) {\n process.stderr.write('Error: --view and --sheet are mutually exclusive\\n')\n return 1\n }\n\n const outPath = resolve(out)\n const viewSpec = view ? parseViewArg(view) : undefined\n const sheetSpec = sheet\n ? (sheet\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean) as ViewSpec[])\n : undefined\n const result = await cliView(filePath, outPath, {\n mode,\n assetsDir,\n fontsDir,\n projectRoot,\n libs,\n part,\n view: viewSpec,\n sheet: sheetSpec,\n })\n\n if (result.ok) {\n for (const f of result.outputFiles ?? []) {\n process.stdout.write(`✓ ${filePath} → ${f} (svg)\\n`)\n }\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 0\n } else {\n process.stderr.write(`✗ ${filePath}: ${result.error}\\n`)\n if (result.infos && result.infos.length > 0) {\n for (const info of result.infos) {\n process.stderr.write(` ℹ ${info}\\n`)\n }\n }\n return 1\n }\n }\n\n return 1\n}\n"]}
|
|
@@ -56,6 +56,13 @@ export declare function getKernel2D(id?: string): KernelAdapter & Kernel2DCapabi
|
|
|
56
56
|
export declare function getKernelCapabilities(id?: string): KernelCapabilities;
|
|
57
57
|
/** Return the id of the currently active default kernel, or `null` if none. */
|
|
58
58
|
export declare function getActiveKernelId(): string | null;
|
|
59
|
+
/**
|
|
60
|
+
* Cross-instance sync hooks (globalThis registry singleton): exported for the
|
|
61
|
+
* L3 bridge (`api/occt-kernel-bridge.ts`) so a CDN-bundled faijs instance with
|
|
62
|
+
* its own module-level `_bound = false` can observe a host-bundle binding.
|
|
63
|
+
*/
|
|
64
|
+
export declare function syncRegistryFromGlobal(): void;
|
|
65
|
+
export declare function syncRegistryToGlobal(): void;
|
|
59
66
|
/** Current tessellation quality tier. */
|
|
60
67
|
export declare function currentQualityTier(): string;
|
|
61
68
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/vendored/brepjs/kernel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE1E,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,cAAc,EACd,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/vendored/brepjs/kernel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE1E,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,cAAc,EACd,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,CAAC;AAqD1E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAIpC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAWvE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,CAcpD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,kBAAkB,CAM3E;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAErE;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAGjD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AACD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,yCAAyC;AACzC,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
|
|
@@ -21,17 +21,59 @@ import { supportsKernel2D } from './kernel2dTypes.js';
|
|
|
21
21
|
import { currentQuality } from './quality.js';
|
|
22
22
|
import { supportsProjection, supportsConstraintSketch } from './types.js';
|
|
23
23
|
export { supportsKernel2D, supportsProjection, supportsConstraintSketch };
|
|
24
|
+
// Kernel registry lives on globalThis (same pattern as runtime-state
|
|
25
|
+
// '__FAICAD_FAIJS_RUNTIME__'): a CDN-bundled faijs subpath (e.g.
|
|
26
|
+
// `/npm/@faicad/faijs@x/brepjs-compat/+esm`) is a SEPARATE module instance from
|
|
27
|
+
// the host bundle, so module-level `const _kernels` would give the CDN copy an
|
|
28
|
+
// empty registry even though the host already bound occt-wasm — every BREP op
|
|
29
|
+
// then fails with "kernel not initialized". Sharing via globalThis keeps one
|
|
30
|
+
// registry across all faijs instances (D10 single-instance holds: all copies
|
|
31
|
+
// see the same occt-wasm adapter).
|
|
32
|
+
const GLOBAL_KEY = '__FAICAD_FAIJS_KERNEL_REGISTRY__';
|
|
33
|
+
function registryState() {
|
|
34
|
+
const g = globalThis;
|
|
35
|
+
let st = g[GLOBAL_KEY];
|
|
36
|
+
if (!st) {
|
|
37
|
+
st = { stateVersion: 1, kernels: new Map(), defaultKernelId: null, cachedDefault: null, frozen: false };
|
|
38
|
+
g[GLOBAL_KEY] = st;
|
|
39
|
+
}
|
|
40
|
+
else if (st.stateVersion !== 1) {
|
|
41
|
+
throw new Error(`[faijs] kernel registry state version mismatch: loaded=${st.stateVersion}, expected=1`);
|
|
42
|
+
}
|
|
43
|
+
return st;
|
|
44
|
+
}
|
|
24
45
|
const _kernels = new Map();
|
|
25
46
|
let _defaultKernelId = null;
|
|
26
47
|
let _cachedDefault = null;
|
|
27
48
|
let _frozen = false;
|
|
49
|
+
// Sync pass-through accessors over the global registry state. Every exported
|
|
50
|
+
// function calls syncFromGlobal() first so a host-bundle bind is visible to a
|
|
51
|
+
// CDN subpath instance and vice versa; mutations call syncToGlobal().
|
|
52
|
+
function syncFromGlobal() {
|
|
53
|
+
const st = registryState();
|
|
54
|
+
_kernels.clear();
|
|
55
|
+
for (const [k, v] of st.kernels)
|
|
56
|
+
_kernels.set(k, v);
|
|
57
|
+
_defaultKernelId = st.defaultKernelId;
|
|
58
|
+
_cachedDefault = st.cachedDefault;
|
|
59
|
+
_frozen = st.frozen;
|
|
60
|
+
}
|
|
61
|
+
function syncToGlobal() {
|
|
62
|
+
const st = registryState();
|
|
63
|
+
st.kernels = new Map(_kernels);
|
|
64
|
+
st.defaultKernelId = _defaultKernelId;
|
|
65
|
+
st.cachedDefault = _cachedDefault;
|
|
66
|
+
st.frozen = _frozen;
|
|
67
|
+
}
|
|
28
68
|
/**
|
|
29
69
|
* Freeze the kernel registry (D10 冻结,同 `freezeEngineRegistries` 时机)。
|
|
30
70
|
* Faijs host calls this at the end of assembly; afterwards any
|
|
31
71
|
* `registerKernel` throws.
|
|
32
72
|
*/
|
|
33
73
|
export function freezeKernels() {
|
|
74
|
+
syncFromGlobal();
|
|
34
75
|
_frozen = true;
|
|
76
|
+
syncToGlobal();
|
|
35
77
|
}
|
|
36
78
|
/**
|
|
37
79
|
* Register a kernel adapter (DIO injection: L3 bridge registers exactly one
|
|
@@ -39,6 +81,7 @@ export function freezeKernels() {
|
|
|
39
81
|
* @throws If the registry is frozen (post-assembly, D10).
|
|
40
82
|
*/
|
|
41
83
|
export function registerKernel(id, adapter) {
|
|
84
|
+
syncFromGlobal();
|
|
42
85
|
if (_frozen) {
|
|
43
86
|
throw new Error(`faijs kernel registry frozen — cannot register '${id}' after assembly (D10)`);
|
|
44
87
|
}
|
|
@@ -47,6 +90,7 @@ export function registerKernel(id, adapter) {
|
|
|
47
90
|
_defaultKernelId = id;
|
|
48
91
|
if (id === _defaultKernelId)
|
|
49
92
|
_cachedDefault = adapter;
|
|
93
|
+
syncToGlobal();
|
|
50
94
|
}
|
|
51
95
|
/**
|
|
52
96
|
* Return a kernel adapter by id, or the default kernel if no id is given.
|
|
@@ -55,6 +99,7 @@ export function registerKernel(id, adapter) {
|
|
|
55
99
|
* (D10: bound by the faijs host at assembly, then frozen).
|
|
56
100
|
*/
|
|
57
101
|
export function getKernel(id) {
|
|
102
|
+
syncFromGlobal();
|
|
58
103
|
if (!id && _cachedDefault)
|
|
59
104
|
return _cachedDefault;
|
|
60
105
|
const targetId = id ?? _defaultKernelId;
|
|
@@ -84,8 +129,20 @@ export function getKernelCapabilities(id) {
|
|
|
84
129
|
}
|
|
85
130
|
/** Return the id of the currently active default kernel, or `null` if none. */
|
|
86
131
|
export function getActiveKernelId() {
|
|
132
|
+
syncFromGlobal();
|
|
87
133
|
return _defaultKernelId;
|
|
88
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Cross-instance sync hooks (globalThis registry singleton): exported for the
|
|
137
|
+
* L3 bridge (`api/occt-kernel-bridge.ts`) so a CDN-bundled faijs instance with
|
|
138
|
+
* its own module-level `_bound = false` can observe a host-bundle binding.
|
|
139
|
+
*/
|
|
140
|
+
export function syncRegistryFromGlobal() {
|
|
141
|
+
syncFromGlobal();
|
|
142
|
+
}
|
|
143
|
+
export function syncRegistryToGlobal() {
|
|
144
|
+
syncToGlobal();
|
|
145
|
+
}
|
|
89
146
|
/** Current tessellation quality tier. */
|
|
90
147
|
export function currentQualityTier() {
|
|
91
148
|
return currentQuality();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/vendored/brepjs/kernel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAyC1E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,CAAC;AAE1E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;AAClD,IAAI,gBAAgB,GAAkB,IAAI,CAAC;AAC3C,IAAI,cAAc,GAAyB,IAAI,CAAC;AAChD,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,OAAsB;IAC/D,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,mDAAmD,EAAE,wBAAwB,CAC9E,CAAC;IACJ,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1B,IAAI,gBAAgB,KAAK,IAAI;QAAE,gBAAgB,GAAG,EAAE,CAAC;IACrD,IAAI,EAAE,KAAK,gBAAgB;QAAE,cAAc,GAAG,OAAO,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,EAAW;IACnC,IAAI,CAAC,EAAE,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IACjD,MAAM,QAAQ,GAAG,EAAE,IAAI,gBAAgB,CAAC;IACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,sBAAsB,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAAW;IACrC,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,qBAAqB,CAAC,EAAW;IAC/C,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC;AACpC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB;IAC/B,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,kBAAkB;IAChC,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC","sourcesContent":["/**\n * Kernel registry facade — vendored port (layer L0 contact surface / D10).\n *\n * brepjs `src/kernel/index.ts`, trimmed to the faijs-compatible surface\n * (see docs/plans/2026-09-01-layered-api-architecture.md §D10 / §D8):\n *\n * - `getKernel()` is a **frozen read-only reader**: it is bound once at\n * assembly time and never switches at runtime. The runtime-switching\n * `withKernel` and the three-tier `init()` WASM fallback are both cut\n * (D10 — faijs already runs the same philosophy in\n * `brep/engine/registry.ts`'s `freezeEngineRegistries()`).\n * - The single occt-wasm module instance is injected through the faijs\n * `initOcctWasm` chain (D10): the faijs L3 bridge builds an\n * {@link OcctWasmAdapter} over that same instance and registers it here.\n * A second registration after `freezeKernels()` throws.\n *\n * Until an adapter is registered, `getKernel()` throws the same\n * \"not initialized\" error brepjs provides.\n */\n\nimport type { KernelAdapter } from './types.js';\nimport type { Kernel2DCapability } from './kernel2dTypes.js';\nimport type { KernelCapabilities } from './capabilities.js';\nimport { supportsKernel2D } from './kernel2dTypes.js';\nimport { currentQuality } from './quality.js';\nimport { supportsProjection, supportsConstraintSketch } from './types.js';\n// Re-export the L0 type surface used by ported L1/L2 code (identically to brepjs).\nexport type {\n KernelAdapter,\n KernelMeshResult,\n DistanceResult,\n KernelInstance,\n BooleanOptions,\n ShapeType,\n SurfaceType,\n ShapeOrientation,\n MeshOptions,\n KernelShape,\n KernelType,\n StepAssemblyPart,\n ShapeEvolution,\n OperationResult,\n} from './types.js';\nexport type {\n ProjectionCapability,\n ConstraintSketchCapability,\n} from './types.js';\nexport type {\n KernelBooleanOps,\n KernelBuilderOps,\n KernelCore,\n KernelCurveOps,\n KernelEvolutionOps,\n KernelIOOps,\n KernelMeasureOps,\n KernelMeshOps,\n KernelModifierOps,\n KernelPrimitiveOps,\n KernelRepairOps,\n KernelSurfaceOps,\n KernelSweepOps,\n KernelTopologyOps,\n KernelTransformOps,\n} from './interfaces/index.js';\nexport type { Kernel2DCapability } from './kernel2dTypes.js';\nexport type { KernelCapabilities } from './capabilities.js';\nexport { supportsKernel2D, supportsProjection, supportsConstraintSketch };\n\nconst _kernels = new Map<string, KernelAdapter>();\nlet _defaultKernelId: string | null = null;\nlet _cachedDefault: KernelAdapter | null = null;\nlet _frozen = false;\n\n/**\n * Freeze the kernel registry (D10 冻结,同 `freezeEngineRegistries` 时机)。\n * Faijs host calls this at the end of assembly; afterwards any\n * `registerKernel` throws.\n */\nexport function freezeKernels(): void {\n _frozen = true;\n}\n\n/**\n * Register a kernel adapter (DIO injection: L3 bridge registers exactly one\n * 'occt-wasm' adapter over the faijs single wasm instance).\n * @throws If the registry is frozen (post-assembly, D10).\n */\nexport function registerKernel(id: string, adapter: KernelAdapter): void {\n if (_frozen) {\n throw new Error(\n `faijs kernel registry frozen — cannot register '${id}' after assembly (D10)`\n );\n }\n _kernels.set(id, adapter);\n if (_defaultKernelId === null) _defaultKernelId = id;\n if (id === _defaultKernelId) _cachedDefault = adapter;\n}\n\n/**\n * Return a kernel adapter by id, or the default kernel if no id is given.\n *\n * @throws If no kernel has been registered via {@link registerKernel}\n * (D10: bound by the faijs host at assembly, then frozen).\n */\nexport function getKernel(id?: string): KernelAdapter {\n if (!id && _cachedDefault) return _cachedDefault;\n const targetId = id ?? _defaultKernelId;\n if (!targetId) {\n throw new Error(\n 'faijs kernel not initialized. The faijs host must bind occt-wasm before use (D10).'\n );\n }\n const kernel = _kernels.get(targetId);\n if (!kernel) {\n throw new Error(`faijs: kernel '${targetId}' is not registered.`);\n }\n return kernel;\n}\n\n/**\n * Return the default kernel narrowed to {@link Kernel2DCapability}.\n * @throws If the kernel does not support 2D operations.\n */\nexport function getKernel2D(id?: string): KernelAdapter & Kernel2DCapability {\n const kernel = getKernel(id);\n if (!supportsKernel2D(kernel)) {\n throw new Error('faijs: current kernel does not support 2D operations.');\n }\n return kernel;\n}\n\n/** Capabilities of the active kernel (defaults to the active). */\nexport function getKernelCapabilities(id?: string): KernelCapabilities {\n return getKernel(id).capabilities;\n}\n\n/** Return the id of the currently active default kernel, or `null` if none. */\nexport function getActiveKernelId(): string | null {\n return _defaultKernelId;\n}\n\n/** Current tessellation quality tier. */\nexport function currentQualityTier(): string {\n return currentQuality();\n}"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/vendored/brepjs/kernel/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Kernel registry facade — vendored port (layer L0 contact surface / D10).\n *\n * brepjs `src/kernel/index.ts`, trimmed to the faijs-compatible surface\n * (see docs/plans/2026-09-01-layered-api-architecture.md §D10 / §D8):\n *\n * - `getKernel()` is a **frozen read-only reader**: it is bound once at\n * assembly time and never switches at runtime. The runtime-switching\n * `withKernel` and the three-tier `init()` WASM fallback are both cut\n * (D10 — faijs already runs the same philosophy in\n * `brep/engine/registry.ts`'s `freezeEngineRegistries()`).\n * - The single occt-wasm module instance is injected through the faijs\n * `initOcctWasm` chain (D10): the faijs L3 bridge builds an\n * {@link OcctWasmAdapter} over that same instance and registers it here.\n * A second registration after `freezeKernels()` throws.\n *\n * Until an adapter is registered, `getKernel()` throws the same\n * \"not initialized\" error brepjs provides.\n */\n\nimport type { KernelAdapter } from './types.js';\nimport type { Kernel2DCapability } from './kernel2dTypes.js';\nimport type { KernelCapabilities } from './capabilities.js';\nimport { supportsKernel2D } from './kernel2dTypes.js';\nimport { currentQuality } from './quality.js';\nimport { supportsProjection, supportsConstraintSketch } from './types.js';\n// Re-export the L0 type surface used by ported L1/L2 code (identically to brepjs).\nexport type {\n KernelAdapter,\n KernelMeshResult,\n DistanceResult,\n KernelInstance,\n BooleanOptions,\n ShapeType,\n SurfaceType,\n ShapeOrientation,\n MeshOptions,\n KernelShape,\n KernelType,\n StepAssemblyPart,\n ShapeEvolution,\n OperationResult,\n} from './types.js';\nexport type {\n ProjectionCapability,\n ConstraintSketchCapability,\n} from './types.js';\nexport type {\n KernelBooleanOps,\n KernelBuilderOps,\n KernelCore,\n KernelCurveOps,\n KernelEvolutionOps,\n KernelIOOps,\n KernelMeasureOps,\n KernelMeshOps,\n KernelModifierOps,\n KernelPrimitiveOps,\n KernelRepairOps,\n KernelSurfaceOps,\n KernelSweepOps,\n KernelTopologyOps,\n KernelTransformOps,\n} from './interfaces/index.js';\nexport type { Kernel2DCapability } from './kernel2dTypes.js';\nexport type { KernelCapabilities } from './capabilities.js';\nexport { supportsKernel2D, supportsProjection, supportsConstraintSketch };\n\n// Kernel registry lives on globalThis (same pattern as runtime-state\n// '__FAICAD_FAIJS_RUNTIME__'): a CDN-bundled faijs subpath (e.g.\n// `/npm/@faicad/faijs@x/brepjs-compat/+esm`) is a SEPARATE module instance from\n// the host bundle, so module-level `const _kernels` would give the CDN copy an\n// empty registry even though the host already bound occt-wasm — every BREP op\n// then fails with \"kernel not initialized\". Sharing via globalThis keeps one\n// registry across all faijs instances (D10 single-instance holds: all copies\n// see the same occt-wasm adapter).\nconst GLOBAL_KEY = '__FAICAD_FAIJS_KERNEL_REGISTRY__';\ntype KernelRegistryState = {\n stateVersion: 1;\n kernels: Map<string, KernelAdapter>;\n defaultKernelId: string | null;\n cachedDefault: KernelAdapter | null;\n frozen: boolean;\n};\nfunction registryState(): KernelRegistryState {\n const g = globalThis as unknown as Record<string, KernelRegistryState | undefined>;\n let st = g[GLOBAL_KEY];\n if (!st) {\n st = { stateVersion: 1, kernels: new Map<string, KernelAdapter>(), defaultKernelId: null, cachedDefault: null, frozen: false };\n g[GLOBAL_KEY] = st;\n } else if (st.stateVersion !== 1) {\n throw new Error(`[faijs] kernel registry state version mismatch: loaded=${st.stateVersion}, expected=1`);\n }\n return st;\n}\nconst _kernels = new Map<string, KernelAdapter>();\nlet _defaultKernelId: string | null = null;\nlet _cachedDefault: KernelAdapter | null = null;\nlet _frozen = false;\n\n// Sync pass-through accessors over the global registry state. Every exported\n// function calls syncFromGlobal() first so a host-bundle bind is visible to a\n// CDN subpath instance and vice versa; mutations call syncToGlobal().\nfunction syncFromGlobal(): void {\n const st = registryState();\n _kernels.clear();\n for (const [k, v] of st.kernels) _kernels.set(k, v);\n _defaultKernelId = st.defaultKernelId;\n _cachedDefault = st.cachedDefault;\n _frozen = st.frozen;\n}\nfunction syncToGlobal(): void {\n const st = registryState();\n st.kernels = new Map(_kernels);\n st.defaultKernelId = _defaultKernelId;\n st.cachedDefault = _cachedDefault;\n st.frozen = _frozen;\n}\n\n/**\n * Freeze the kernel registry (D10 冻结,同 `freezeEngineRegistries` 时机)。\n * Faijs host calls this at the end of assembly; afterwards any\n * `registerKernel` throws.\n */\nexport function freezeKernels(): void {\n syncFromGlobal();\n _frozen = true;\n syncToGlobal();\n}\n\n/**\n * Register a kernel adapter (DIO injection: L3 bridge registers exactly one\n * 'occt-wasm' adapter over the faijs single wasm instance).\n * @throws If the registry is frozen (post-assembly, D10).\n */\nexport function registerKernel(id: string, adapter: KernelAdapter): void {\n syncFromGlobal();\n if (_frozen) {\n throw new Error(\n `faijs kernel registry frozen — cannot register '${id}' after assembly (D10)`\n );\n }\n _kernels.set(id, adapter);\n if (_defaultKernelId === null) _defaultKernelId = id;\n if (id === _defaultKernelId) _cachedDefault = adapter;\n syncToGlobal();\n}\n\n/**\n * Return a kernel adapter by id, or the default kernel if no id is given.\n *\n * @throws If no kernel has been registered via {@link registerKernel}\n * (D10: bound by the faijs host at assembly, then frozen).\n */\nexport function getKernel(id?: string): KernelAdapter {\n syncFromGlobal();\n if (!id && _cachedDefault) return _cachedDefault;\n const targetId = id ?? _defaultKernelId;\n if (!targetId) {\n throw new Error(\n 'faijs kernel not initialized. The faijs host must bind occt-wasm before use (D10).'\n );\n }\n const kernel = _kernels.get(targetId);\n if (!kernel) {\n throw new Error(`faijs: kernel '${targetId}' is not registered.`);\n }\n return kernel;\n}\n\n/**\n * Return the default kernel narrowed to {@link Kernel2DCapability}.\n * @throws If the kernel does not support 2D operations.\n */\nexport function getKernel2D(id?: string): KernelAdapter & Kernel2DCapability {\n const kernel = getKernel(id);\n if (!supportsKernel2D(kernel)) {\n throw new Error('faijs: current kernel does not support 2D operations.');\n }\n return kernel;\n}\n\n/** Capabilities of the active kernel (defaults to the active). */\nexport function getKernelCapabilities(id?: string): KernelCapabilities {\n return getKernel(id).capabilities;\n}\n\n/** Return the id of the currently active default kernel, or `null` if none. */\nexport function getActiveKernelId(): string | null {\n syncFromGlobal();\n return _defaultKernelId;\n}\n\n/**\n * Cross-instance sync hooks (globalThis registry singleton): exported for the\n * L3 bridge (`api/occt-kernel-bridge.ts`) so a CDN-bundled faijs instance with\n * its own module-level `_bound = false` can observe a host-bundle binding.\n */\nexport function syncRegistryFromGlobal(): void {\n syncFromGlobal();\n}\nexport function syncRegistryToGlobal(): void {\n syncToGlobal();\n}\n\n/** Current tessellation quality tier. */\nexport function currentQualityTier(): string {\n return currentQuality();\n}"]}
|