everything-dev 0.3.2 → 1.3.2
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/README.md +64 -0
- package/cli.js +10 -0
- package/dist/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/api-contract.cjs +172 -0
- package/dist/api-contract.cjs.map +1 -0
- package/dist/api-contract.mjs +171 -0
- package/dist/api-contract.mjs.map +1 -0
- package/dist/api.cjs +124 -0
- package/dist/api.cjs.map +1 -0
- package/dist/api.d.cts +36 -0
- package/dist/api.d.cts.map +1 -0
- package/dist/api.d.mts +36 -0
- package/dist/api.d.mts.map +1 -0
- package/dist/api.mjs +119 -0
- package/dist/api.mjs.map +1 -0
- package/dist/app.cjs +156 -0
- package/dist/app.cjs.map +1 -0
- package/dist/app.mjs +153 -0
- package/dist/app.mjs.map +1 -0
- package/dist/cli/catalog.cjs +30 -0
- package/dist/cli/catalog.cjs.map +1 -0
- package/dist/cli/catalog.mjs +29 -0
- package/dist/cli/catalog.mjs.map +1 -0
- package/dist/cli/help.cjs +16 -0
- package/dist/cli/help.cjs.map +1 -0
- package/dist/cli/help.mjs +16 -0
- package/dist/cli/help.mjs.map +1 -0
- package/dist/cli/init.cjs +317 -0
- package/dist/cli/init.cjs.map +1 -0
- package/dist/cli/init.d.cts +36 -0
- package/dist/cli/init.d.cts.map +1 -0
- package/dist/cli/init.d.mts +36 -0
- package/dist/cli/init.d.mts.map +1 -0
- package/dist/cli/init.mjs +309 -0
- package/dist/cli/init.mjs.map +1 -0
- package/dist/cli/parse.cjs +96 -0
- package/dist/cli/parse.cjs.map +1 -0
- package/dist/cli/parse.mjs +95 -0
- package/dist/cli/parse.mjs.map +1 -0
- package/dist/cli/prompts.cjs +42 -0
- package/dist/cli/prompts.cjs.map +1 -0
- package/dist/cli/prompts.mjs +41 -0
- package/dist/cli/prompts.mjs.map +1 -0
- package/dist/cli.cjs +167 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +166 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/components/dev-view.cjs +307 -0
- package/dist/components/dev-view.cjs.map +1 -0
- package/dist/components/dev-view.mjs +306 -0
- package/dist/components/dev-view.mjs.map +1 -0
- package/dist/components/streaming-view.cjs +146 -0
- package/dist/components/streaming-view.cjs.map +1 -0
- package/dist/components/streaming-view.mjs +144 -0
- package/dist/components/streaming-view.mjs.map +1 -0
- package/dist/config.cjs +280 -0
- package/dist/config.cjs.map +1 -0
- package/dist/config.d.cts +35 -0
- package/dist/config.d.cts.map +1 -0
- package/dist/config.d.mts +35 -0
- package/dist/config.d.mts.map +1 -0
- package/dist/config.mjs +266 -0
- package/dist/config.mjs.map +1 -0
- package/dist/contract.cjs +209 -0
- package/dist/contract.cjs.map +1 -0
- package/dist/contract.d.cts +490 -0
- package/dist/contract.d.cts.map +1 -0
- package/dist/contract.d.mts +490 -0
- package/dist/contract.d.mts.map +1 -0
- package/dist/contract.meta.cjs +104 -0
- package/dist/contract.meta.cjs.map +1 -0
- package/dist/contract.meta.d.cts +141 -0
- package/dist/contract.meta.d.cts.map +1 -0
- package/dist/contract.meta.d.mts +141 -0
- package/dist/contract.meta.d.mts.map +1 -0
- package/dist/contract.meta.mjs +102 -0
- package/dist/contract.meta.mjs.map +1 -0
- package/dist/contract.mjs +186 -0
- package/dist/contract.mjs.map +1 -0
- package/dist/dev-logs.cjs +53 -0
- package/dist/dev-logs.cjs.map +1 -0
- package/dist/dev-logs.mjs +51 -0
- package/dist/dev-logs.mjs.map +1 -0
- package/dist/dev-session.cjs +195 -0
- package/dist/dev-session.cjs.map +1 -0
- package/dist/dev-session.mjs +194 -0
- package/dist/dev-session.mjs.map +1 -0
- package/dist/fastkv.cjs +89 -0
- package/dist/fastkv.cjs.map +1 -0
- package/dist/fastkv.d.cts +11 -0
- package/dist/fastkv.d.cts.map +1 -0
- package/dist/fastkv.d.mts +11 -0
- package/dist/fastkv.d.mts.map +1 -0
- package/dist/fastkv.mjs +82 -0
- package/dist/fastkv.mjs.map +1 -0
- package/dist/federation.server.cjs +27 -0
- package/dist/federation.server.cjs.map +1 -0
- package/dist/federation.server.mjs +27 -0
- package/dist/federation.server.mjs.map +1 -0
- package/dist/host.cjs +367 -0
- package/dist/host.cjs.map +1 -0
- package/dist/host.d.cts +22 -0
- package/dist/host.d.cts.map +1 -0
- package/dist/host.d.mts +22 -0
- package/dist/host.d.mts.map +1 -0
- package/dist/host.mjs +364 -0
- package/dist/host.mjs.map +1 -0
- package/dist/index.cjs +122 -0
- package/dist/index.d.cts +7 -0
- package/dist/index.d.mts +7 -0
- package/dist/index.mjs +9 -0
- package/dist/integrity.cjs +39 -0
- package/dist/integrity.cjs.map +1 -0
- package/dist/integrity.d.cts +7 -0
- package/dist/integrity.d.cts.map +1 -0
- package/dist/integrity.d.mts +7 -0
- package/dist/integrity.d.mts.map +1 -0
- package/dist/integrity.mjs +35 -0
- package/dist/integrity.mjs.map +1 -0
- package/dist/mf.cjs +77 -0
- package/dist/mf.cjs.map +1 -0
- package/dist/mf.d.cts +19 -0
- package/dist/mf.d.cts.map +1 -0
- package/dist/mf.d.mts +19 -0
- package/dist/mf.d.mts.map +1 -0
- package/dist/mf.mjs +71 -0
- package/dist/mf.mjs.map +1 -0
- package/dist/near-cli.cjs +196 -0
- package/dist/near-cli.cjs.map +1 -0
- package/dist/near-cli.mjs +193 -0
- package/dist/near-cli.mjs.map +1 -0
- package/dist/network.cjs +9 -0
- package/dist/network.cjs.map +1 -0
- package/dist/network.mjs +8 -0
- package/dist/network.mjs.map +1 -0
- package/dist/orchestrator.cjs +441 -0
- package/dist/orchestrator.cjs.map +1 -0
- package/dist/orchestrator.d.cts +40 -0
- package/dist/orchestrator.d.cts.map +1 -0
- package/dist/orchestrator.d.mts +40 -0
- package/dist/orchestrator.d.mts.map +1 -0
- package/dist/orchestrator.mjs +436 -0
- package/dist/orchestrator.mjs.map +1 -0
- package/dist/plugin.cjs +825 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.cts +347 -0
- package/dist/plugin.d.cts.map +1 -0
- package/dist/plugin.d.mts +348 -0
- package/dist/plugin.d.mts.map +1 -0
- package/dist/plugin.mjs +822 -0
- package/dist/plugin.mjs.map +1 -0
- package/dist/process-registry.cjs +120 -0
- package/dist/process-registry.cjs.map +1 -0
- package/dist/process-registry.d.cts +25 -0
- package/dist/process-registry.d.cts.map +1 -0
- package/dist/process-registry.d.mts +25 -0
- package/dist/process-registry.d.mts.map +1 -0
- package/dist/process-registry.mjs +119 -0
- package/dist/process-registry.mjs.map +1 -0
- package/dist/sdk.cjs +61 -0
- package/dist/sdk.d.cts +5 -0
- package/dist/sdk.d.mts +5 -0
- package/dist/sdk.mjs +6 -0
- package/dist/shared.cjs +143 -0
- package/dist/shared.cjs.map +1 -0
- package/dist/shared.d.cts +33 -0
- package/dist/shared.d.cts.map +1 -0
- package/dist/shared.d.mts +33 -0
- package/dist/shared.d.mts.map +1 -0
- package/dist/shared.mjs +140 -0
- package/dist/shared.mjs.map +1 -0
- package/dist/types.cjs +160 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +269 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +269 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +144 -0
- package/dist/types.mjs.map +1 -0
- package/dist/ui/head.cjs +67 -0
- package/dist/ui/head.cjs.map +1 -0
- package/dist/ui/head.d.cts +19 -0
- package/dist/ui/head.d.cts.map +1 -0
- package/dist/ui/head.d.mts +19 -0
- package/dist/ui/head.d.mts.map +1 -0
- package/dist/ui/head.mjs +61 -0
- package/dist/ui/head.mjs.map +1 -0
- package/dist/ui/index.cjs +32 -0
- package/dist/ui/index.d.cts +7 -0
- package/dist/ui/index.d.mts +7 -0
- package/dist/ui/index.mjs +6 -0
- package/dist/ui/metadata.cjs +106 -0
- package/dist/ui/metadata.cjs.map +1 -0
- package/dist/ui/metadata.d.cts +35 -0
- package/dist/ui/metadata.d.cts.map +1 -0
- package/dist/ui/metadata.d.mts +35 -0
- package/dist/ui/metadata.d.mts.map +1 -0
- package/dist/ui/metadata.mjs +100 -0
- package/dist/ui/metadata.mjs.map +1 -0
- package/dist/ui/router.cjs +56 -0
- package/dist/ui/router.cjs.map +1 -0
- package/dist/ui/router.d.cts +11 -0
- package/dist/ui/router.d.cts.map +1 -0
- package/dist/ui/router.d.mts +11 -0
- package/dist/ui/router.d.mts.map +1 -0
- package/dist/ui/router.mjs +51 -0
- package/dist/ui/router.mjs.map +1 -0
- package/dist/ui/runtime.cjs +65 -0
- package/dist/ui/runtime.cjs.map +1 -0
- package/dist/ui/runtime.d.cts +29 -0
- package/dist/ui/runtime.d.cts.map +1 -0
- package/dist/ui/runtime.d.mts +29 -0
- package/dist/ui/runtime.d.mts.map +1 -0
- package/dist/ui/runtime.mjs +53 -0
- package/dist/ui/runtime.mjs.map +1 -0
- package/dist/ui/types.cjs +0 -0
- package/dist/ui/types.d.cts +52 -0
- package/dist/ui/types.d.cts.map +1 -0
- package/dist/ui/types.d.mts +52 -0
- package/dist/ui/types.d.mts.map +1 -0
- package/dist/ui/types.mjs +1 -0
- package/dist/utils/banner.cjs +24 -0
- package/dist/utils/banner.cjs.map +1 -0
- package/dist/utils/banner.mjs +23 -0
- package/dist/utils/banner.mjs.map +1 -0
- package/dist/utils/linkify.cjs +15 -0
- package/dist/utils/linkify.cjs.map +1 -0
- package/dist/utils/linkify.mjs +14 -0
- package/dist/utils/linkify.mjs.map +1 -0
- package/dist/utils/run.cjs +40 -0
- package/dist/utils/run.cjs.map +1 -0
- package/dist/utils/run.mjs +39 -0
- package/dist/utils/run.mjs.map +1 -0
- package/dist/utils/theme.cjs +44 -0
- package/dist/utils/theme.cjs.map +1 -0
- package/dist/utils/theme.mjs +37 -0
- package/dist/utils/theme.mjs.map +1 -0
- package/package.json +269 -80
- package/src/api-contract.ts +309 -0
- package/src/api.ts +181 -0
- package/src/app.ts +346 -0
- package/src/cli/catalog.ts +49 -0
- package/src/cli/help.ts +13 -0
- package/src/cli/init.ts +415 -0
- package/src/cli/parse.ts +130 -0
- package/src/cli/prompts.ts +64 -0
- package/src/cli.ts +203 -1507
- package/src/components/dev-view.tsx +104 -41
- package/src/components/streaming-view.ts +89 -22
- package/src/config.ts +462 -532
- package/src/contract.meta.ts +96 -0
- package/src/contract.ts +164 -561
- package/src/dev-logs.ts +85 -0
- package/src/dev-session.ts +318 -0
- package/src/fastkv.ts +153 -0
- package/src/federation.server.ts +43 -0
- package/src/host.ts +526 -0
- package/src/index.ts +6 -3
- package/src/integrity.ts +54 -0
- package/src/mf.ts +105 -0
- package/src/near-cli.ts +284 -0
- package/src/network.ts +3 -0
- package/src/orchestrator.ts +648 -0
- package/src/plugin.ts +1116 -2303
- package/src/process-registry.ts +154 -0
- package/src/scripts/sync-api-contract.ts +24 -0
- package/src/sdk.ts +14 -0
- package/src/shared.ts +206 -0
- package/src/types.ts +152 -206
- package/src/ui/head.ts +34 -27
- package/src/ui/index.ts +3 -3
- package/src/ui/metadata.ts +95 -0
- package/src/ui/router.ts +22 -6
- package/src/ui/runtime.ts +55 -6
- package/src/ui/types.ts +24 -11
- package/src/utils/banner.ts +10 -6
- package/src/utils/run.ts +26 -27
- package/src/utils/theme.ts +3 -66
- package/src/components/monitor-view.tsx +0 -475
- package/src/components/status-view.tsx +0 -173
- package/src/lib/env.ts +0 -109
- package/src/lib/near-cli.ts +0 -289
- package/src/lib/nova.ts +0 -266
- package/src/lib/orchestrator.ts +0 -276
- package/src/lib/process-registry.ts +0 -166
- package/src/lib/process.ts +0 -549
- package/src/lib/resource-monitor/assertions.ts +0 -234
- package/src/lib/resource-monitor/command.ts +0 -283
- package/src/lib/resource-monitor/diff.ts +0 -157
- package/src/lib/resource-monitor/errors.ts +0 -127
- package/src/lib/resource-monitor/index.ts +0 -305
- package/src/lib/resource-monitor/platform/darwin.ts +0 -306
- package/src/lib/resource-monitor/platform/index.ts +0 -35
- package/src/lib/resource-monitor/platform/linux.ts +0 -332
- package/src/lib/resource-monitor/platform/windows.ts +0 -298
- package/src/lib/resource-monitor/snapshot.ts +0 -217
- package/src/lib/resource-monitor/types.ts +0 -74
- package/src/lib/session-recorder/errors.ts +0 -102
- package/src/lib/session-recorder/flows/login.ts +0 -210
- package/src/lib/session-recorder/index.ts +0 -361
- package/src/lib/session-recorder/playwright.ts +0 -257
- package/src/lib/session-recorder/report.ts +0 -353
- package/src/lib/session-recorder/server.ts +0 -267
- package/src/lib/session-recorder/types.ts +0 -115
- package/src/lib/sync.ts +0 -1
- package/src/ui/files.ts +0 -134
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
//#region src/integrity.ts
|
|
4
|
+
function computeSriHash(content) {
|
|
5
|
+
return `sha384-${createHash("sha384").update(content).digest("base64")}`;
|
|
6
|
+
}
|
|
7
|
+
async function computeSriHashForUrl(url) {
|
|
8
|
+
try {
|
|
9
|
+
const entryUrl = url.endsWith("/remoteEntry.js") ? url : url.endsWith("/mf-manifest.json") ? `${url.replace(/\/mf-manifest\.json$/, "")}/remoteEntry.js` : `${url.replace(/\/$/, "")}/remoteEntry.js`;
|
|
10
|
+
const response = await fetch(entryUrl);
|
|
11
|
+
if (!response.ok) {
|
|
12
|
+
console.warn(`[SRI] Failed to fetch ${entryUrl}: ${response.status} ${response.statusText}`);
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
return computeSriHash(Buffer.from(await response.arrayBuffer()));
|
|
16
|
+
} catch (error) {
|
|
17
|
+
console.warn(`[SRI] Error computing integrity for ${url}:`, error instanceof Error ? error.message : error);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function verifySriForUrl(url, expectedIntegrity) {
|
|
22
|
+
const entryUrl = url.endsWith("/remoteEntry.js") ? url : url.endsWith("/mf-manifest.json") ? `${url.replace(/\/mf-manifest\.json$/, "")}/remoteEntry.js` : `${url.replace(/\/$/, "")}/remoteEntry.js`;
|
|
23
|
+
const response = await fetch(entryUrl);
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
console.warn(`[SRI] Failed to fetch ${entryUrl} for verification: ${response.status}`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const computed = computeSriHash(Buffer.from(await response.arrayBuffer()));
|
|
29
|
+
if (computed !== expectedIntegrity) throw new Error(`[SRI] Integrity check failed for ${entryUrl}\n Expected: ${expectedIntegrity}\n Computed: ${computed}`);
|
|
30
|
+
console.log(`[SRI] Integrity verified for ${entryUrl}`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
//#endregion
|
|
34
|
+
export { computeSriHash, computeSriHashForUrl, verifySriForUrl };
|
|
35
|
+
//# sourceMappingURL=integrity.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrity.mjs","names":[],"sources":["../src/integrity.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport function computeSriHash(content: string | Buffer): string {\n return `sha384-${createHash(\"sha384\").update(content).digest(\"base64\")}`;\n}\n\nexport async function computeSriHashForUrl(url: string): Promise<string | null> {\n try {\n const entryUrl = url.endsWith(\"/remoteEntry.js\")\n ? url\n : url.endsWith(\"/mf-manifest.json\")\n ? `${url.replace(/\\/mf-manifest\\.json$/, \"\")}/remoteEntry.js`\n : `${url.replace(/\\/$/, \"\")}/remoteEntry.js`;\n\n const response = await fetch(entryUrl);\n if (!response.ok) {\n console.warn(`[SRI] Failed to fetch ${entryUrl}: ${response.status} ${response.statusText}`);\n return null;\n }\n const buffer = Buffer.from(await response.arrayBuffer());\n return computeSriHash(buffer);\n } catch (error) {\n console.warn(\n `[SRI] Error computing integrity for ${url}:`,\n error instanceof Error ? error.message : error,\n );\n return null;\n }\n}\n\nexport async function verifySriForUrl(url: string, expectedIntegrity: string): Promise<void> {\n const entryUrl = url.endsWith(\"/remoteEntry.js\")\n ? url\n : url.endsWith(\"/mf-manifest.json\")\n ? `${url.replace(/\\/mf-manifest\\.json$/, \"\")}/remoteEntry.js`\n : `${url.replace(/\\/$/, \"\")}/remoteEntry.js`;\n\n const response = await fetch(entryUrl);\n if (!response.ok) {\n console.warn(`[SRI] Failed to fetch ${entryUrl} for verification: ${response.status}`);\n return;\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const computed = computeSriHash(buffer);\n\n if (computed !== expectedIntegrity) {\n throw new Error(\n `[SRI] Integrity check failed for ${entryUrl}\\n Expected: ${expectedIntegrity}\\n Computed: ${computed}`,\n );\n }\n\n console.log(`[SRI] Integrity verified for ${entryUrl}`);\n}\n"],"mappings":";;;AAEA,SAAgB,eAAe,SAAkC;AAC/D,QAAO,UAAU,WAAW,SAAS,CAAC,OAAO,QAAQ,CAAC,OAAO,SAAS;;AAGxE,eAAsB,qBAAqB,KAAqC;AAC9E,KAAI;EACF,MAAM,WAAW,IAAI,SAAS,kBAAkB,GAC5C,MACA,IAAI,SAAS,oBAAoB,GAC/B,GAAG,IAAI,QAAQ,wBAAwB,GAAG,CAAC,mBAC3C,GAAG,IAAI,QAAQ,OAAO,GAAG,CAAC;EAEhC,MAAM,WAAW,MAAM,MAAM,SAAS;AACtC,MAAI,CAAC,SAAS,IAAI;AAChB,WAAQ,KAAK,yBAAyB,SAAS,IAAI,SAAS,OAAO,GAAG,SAAS,aAAa;AAC5F,UAAO;;AAGT,SAAO,eADQ,OAAO,KAAK,MAAM,SAAS,aAAa,CAAC,CAC3B;UACtB,OAAO;AACd,UAAQ,KACN,uCAAuC,IAAI,IAC3C,iBAAiB,QAAQ,MAAM,UAAU,MAC1C;AACD,SAAO;;;AAIX,eAAsB,gBAAgB,KAAa,mBAA0C;CAC3F,MAAM,WAAW,IAAI,SAAS,kBAAkB,GAC5C,MACA,IAAI,SAAS,oBAAoB,GAC/B,GAAG,IAAI,QAAQ,wBAAwB,GAAG,CAAC,mBAC3C,GAAG,IAAI,QAAQ,OAAO,GAAG,CAAC;CAEhC,MAAM,WAAW,MAAM,MAAM,SAAS;AACtC,KAAI,CAAC,SAAS,IAAI;AAChB,UAAQ,KAAK,yBAAyB,SAAS,qBAAqB,SAAS,SAAS;AACtF;;CAIF,MAAM,WAAW,eADF,OAAO,KAAK,MAAM,SAAS,aAAa,CAAC,CACjB;AAEvC,KAAI,aAAa,kBACf,OAAM,IAAI,MACR,oCAAoC,SAAS,gBAAgB,kBAAkB,gBAAgB,WAChG;AAGH,SAAQ,IAAI,gCAAgC,WAAW"}
|
package/dist/mf.cjs
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
3
|
+
let _module_federation_enhanced_runtime = require("@module-federation/enhanced/runtime");
|
|
4
|
+
let _module_federation_runtime_core = require("@module-federation/runtime-core");
|
|
5
|
+
|
|
6
|
+
//#region src/mf.ts
|
|
7
|
+
let mfInstance = null;
|
|
8
|
+
function patchManifestFetchForSsrPublicPath(mf) {
|
|
9
|
+
if (!mf || !mf.loaderHook?.lifecycle?.fetch?.on) return;
|
|
10
|
+
if (mf.__everythingDevPatchedManifestFetch === true) return;
|
|
11
|
+
mf.__everythingDevPatchedManifestFetch = true;
|
|
12
|
+
mf.loaderHook.lifecycle.fetch.on((url, init) => {
|
|
13
|
+
if (typeof url !== "string" || !url.endsWith("/mf-manifest.json")) return;
|
|
14
|
+
return fetch(url, init).then((res) => res.json()).then((json) => {
|
|
15
|
+
json.metaData = json.metaData ?? {};
|
|
16
|
+
json.metaData.ssrPublicPath = json.metaData.ssrPublicPath ?? url.replace(/\/mf-manifest\.json$/, "/");
|
|
17
|
+
return new Response(JSON.stringify(json), { headers: { "content-type": "application/json" } });
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function getFederationInstance() {
|
|
22
|
+
if (mfInstance) return mfInstance;
|
|
23
|
+
const existing = (0, _module_federation_enhanced_runtime.getInstance)();
|
|
24
|
+
if (existing) {
|
|
25
|
+
mfInstance = existing;
|
|
26
|
+
(0, _module_federation_runtime_core.setGlobalFederationInstance)(mfInstance);
|
|
27
|
+
patchManifestFetchForSsrPublicPath(mfInstance);
|
|
28
|
+
return mfInstance;
|
|
29
|
+
}
|
|
30
|
+
mfInstance = (0, _module_federation_enhanced_runtime.createInstance)({
|
|
31
|
+
name: "host",
|
|
32
|
+
remotes: []
|
|
33
|
+
});
|
|
34
|
+
(0, _module_federation_runtime_core.setGlobalFederationInstance)(mfInstance);
|
|
35
|
+
patchManifestFetchForSsrPublicPath(mfInstance);
|
|
36
|
+
return mfInstance;
|
|
37
|
+
}
|
|
38
|
+
async function registerRemote(opts) {
|
|
39
|
+
const instance = getFederationInstance();
|
|
40
|
+
const inferType = () => {
|
|
41
|
+
if (opts.type) return opts.type;
|
|
42
|
+
if (opts.entry.endsWith("/mf-manifest.json")) return "manifest";
|
|
43
|
+
if (opts.entry.endsWith("/remoteEntry.js")) return "script";
|
|
44
|
+
return typeof window === "undefined" ? "script" : "manifest";
|
|
45
|
+
};
|
|
46
|
+
const remoteType = inferType();
|
|
47
|
+
instance.registerRemotes([{
|
|
48
|
+
name: opts.name,
|
|
49
|
+
entry: opts.entry,
|
|
50
|
+
type: remoteType
|
|
51
|
+
}]);
|
|
52
|
+
}
|
|
53
|
+
async function loadRemoteModule(specifier, options) {
|
|
54
|
+
const instance = getFederationInstance();
|
|
55
|
+
if (typeof window === "undefined") await instance.initializeSharing?.("default");
|
|
56
|
+
const mod = await instance.loadRemote(specifier, options);
|
|
57
|
+
if (!mod) throw new Error(`Failed to load remote module: ${specifier}`);
|
|
58
|
+
return mod;
|
|
59
|
+
}
|
|
60
|
+
async function ensureNodeRuntimePlugin() {
|
|
61
|
+
const instance = getFederationInstance();
|
|
62
|
+
if (typeof window !== "undefined") return;
|
|
63
|
+
if (instance.__nodeRuntimePluginLoaded) return;
|
|
64
|
+
const mod = await import("@module-federation/node/runtimePlugin");
|
|
65
|
+
const factory = mod?.default ?? mod;
|
|
66
|
+
const plugin = typeof factory === "function" ? factory() : null;
|
|
67
|
+
if (plugin) instance.registerPlugins([plugin]);
|
|
68
|
+
instance.__nodeRuntimePluginLoaded = true;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
//#endregion
|
|
72
|
+
exports.ensureNodeRuntimePlugin = ensureNodeRuntimePlugin;
|
|
73
|
+
exports.getFederationInstance = getFederationInstance;
|
|
74
|
+
exports.loadRemoteModule = loadRemoteModule;
|
|
75
|
+
exports.patchManifestFetchForSsrPublicPath = patchManifestFetchForSsrPublicPath;
|
|
76
|
+
exports.registerRemote = registerRemote;
|
|
77
|
+
//# sourceMappingURL=mf.cjs.map
|
package/dist/mf.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mf.cjs","names":[],"sources":["../src/mf.ts"],"sourcesContent":["import { createInstance, getInstance } from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\n\ntype FederationInstance = ReturnType<typeof createInstance>;\n\nlet mfInstance: FederationInstance | null = null;\n\nexport function patchManifestFetchForSsrPublicPath(mf: FederationInstance): void {\n if (!mf || !(mf as any).loaderHook?.lifecycle?.fetch?.on) return;\n if ((mf as any).__everythingDevPatchedManifestFetch === true) return;\n (mf as any).__everythingDevPatchedManifestFetch = true;\n\n (mf as any).loaderHook.lifecycle.fetch.on((url: unknown, init: unknown) => {\n if (typeof url !== \"string\" || !url.endsWith(\"/mf-manifest.json\")) {\n return;\n }\n return fetch(url, init as any)\n .then((res) => res.json())\n .then((json: any) => {\n json.metaData = json.metaData ?? {};\n json.metaData.ssrPublicPath =\n json.metaData.ssrPublicPath ?? url.replace(/\\/mf-manifest\\.json$/, \"/\");\n return new Response(JSON.stringify(json), {\n headers: { \"content-type\": \"application/json\" },\n });\n });\n });\n}\n\nexport function getFederationInstance(): FederationInstance {\n if (mfInstance) return mfInstance;\n\n const existing = getInstance();\n if (existing) {\n mfInstance = existing as FederationInstance;\n setGlobalFederationInstance(mfInstance as any);\n patchManifestFetchForSsrPublicPath(mfInstance);\n return mfInstance;\n }\n\n mfInstance = createInstance({\n name: \"host\",\n remotes: [],\n }) as FederationInstance;\n setGlobalFederationInstance(mfInstance as any);\n patchManifestFetchForSsrPublicPath(mfInstance);\n return mfInstance;\n}\n\nexport async function registerRemote(opts: {\n name: string;\n entry: string;\n type?: \"manifest\" | \"script\";\n}): Promise<void> {\n const instance = getFederationInstance();\n\n const inferType = (): \"manifest\" | \"script\" => {\n if (opts.type) return opts.type;\n if (opts.entry.endsWith(\"/mf-manifest.json\")) return \"manifest\";\n if (opts.entry.endsWith(\"/remoteEntry.js\")) return \"script\";\n return typeof window === \"undefined\" ? \"script\" : \"manifest\";\n };\n\n const remoteType = inferType();\n\n instance.registerRemotes([\n {\n name: opts.name,\n entry: opts.entry,\n type: remoteType,\n },\n ]);\n}\n\nexport async function loadRemoteModule<T>(\n specifier: string,\n options?: { loadFactory?: boolean; from?: \"build\" | \"runtime\" },\n): Promise<T> {\n const instance = getFederationInstance();\n\n const isServer = typeof window === \"undefined\";\n if (isServer) {\n await (instance as any).initializeSharing?.(\"default\");\n }\n\n const mod = await instance.loadRemote<T>(specifier, options as any);\n if (!mod) {\n throw new Error(`Failed to load remote module: ${specifier}`);\n }\n return mod;\n}\n\nexport async function ensureNodeRuntimePlugin(): Promise<void> {\n const instance = getFederationInstance();\n if (typeof window !== \"undefined\") return;\n if ((instance as any).__nodeRuntimePluginLoaded) return;\n\n const mod: any = await import(\"@module-federation/node/runtimePlugin\");\n const factory = mod?.default ?? mod;\n const plugin = typeof factory === \"function\" ? factory() : null;\n if (plugin) {\n instance.registerPlugins([plugin]);\n }\n (instance as any).__nodeRuntimePluginLoaded = true;\n}\n"],"mappings":";;;;;;AAKA,IAAI,aAAwC;AAE5C,SAAgB,mCAAmC,IAA8B;AAC/E,KAAI,CAAC,MAAM,CAAE,GAAW,YAAY,WAAW,OAAO,GAAI;AAC1D,KAAK,GAAW,wCAAwC,KAAM;AAC9D,CAAC,GAAW,sCAAsC;AAElD,CAAC,GAAW,WAAW,UAAU,MAAM,IAAI,KAAc,SAAkB;AACzE,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAI,SAAS,oBAAoB,CAC/D;AAEF,SAAO,MAAM,KAAK,KAAY,CAC3B,MAAM,QAAQ,IAAI,MAAM,CAAC,CACzB,MAAM,SAAc;AACnB,QAAK,WAAW,KAAK,YAAY,EAAE;AACnC,QAAK,SAAS,gBACZ,KAAK,SAAS,iBAAiB,IAAI,QAAQ,wBAAwB,IAAI;AACzE,UAAO,IAAI,SAAS,KAAK,UAAU,KAAK,EAAE,EACxC,SAAS,EAAE,gBAAgB,oBAAoB,EAChD,CAAC;IACF;GACJ;;AAGJ,SAAgB,wBAA4C;AAC1D,KAAI,WAAY,QAAO;CAEvB,MAAM,iEAAwB;AAC9B,KAAI,UAAU;AACZ,eAAa;AACb,mEAA4B,WAAkB;AAC9C,qCAAmC,WAAW;AAC9C,SAAO;;AAGT,sEAA4B;EAC1B,MAAM;EACN,SAAS,EAAE;EACZ,CAAC;AACF,kEAA4B,WAAkB;AAC9C,oCAAmC,WAAW;AAC9C,QAAO;;AAGT,eAAsB,eAAe,MAInB;CAChB,MAAM,WAAW,uBAAuB;CAExC,MAAM,kBAAyC;AAC7C,MAAI,KAAK,KAAM,QAAO,KAAK;AAC3B,MAAI,KAAK,MAAM,SAAS,oBAAoB,CAAE,QAAO;AACrD,MAAI,KAAK,MAAM,SAAS,kBAAkB,CAAE,QAAO;AACnD,SAAO,OAAO,WAAW,cAAc,WAAW;;CAGpD,MAAM,aAAa,WAAW;AAE9B,UAAS,gBAAgB,CACvB;EACE,MAAM,KAAK;EACX,OAAO,KAAK;EACZ,MAAM;EACP,CACF,CAAC;;AAGJ,eAAsB,iBACpB,WACA,SACY;CACZ,MAAM,WAAW,uBAAuB;AAGxC,KADiB,OAAO,WAAW,YAEjC,OAAO,SAAiB,oBAAoB,UAAU;CAGxD,MAAM,MAAM,MAAM,SAAS,WAAc,WAAW,QAAe;AACnE,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,iCAAiC,YAAY;AAE/D,QAAO;;AAGT,eAAsB,0BAAyC;CAC7D,MAAM,WAAW,uBAAuB;AACxC,KAAI,OAAO,WAAW,YAAa;AACnC,KAAK,SAAiB,0BAA2B;CAEjD,MAAM,MAAW,MAAM,OAAO;CAC9B,MAAM,UAAU,KAAK,WAAW;CAChC,MAAM,SAAS,OAAO,YAAY,aAAa,SAAS,GAAG;AAC3D,KAAI,OACF,UAAS,gBAAgB,CAAC,OAAO,CAAC;AAEpC,CAAC,SAAiB,4BAA4B"}
|
package/dist/mf.d.cts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createInstance } from "@module-federation/enhanced/runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/mf.d.ts
|
|
4
|
+
type FederationInstance = ReturnType<typeof createInstance>;
|
|
5
|
+
declare function patchManifestFetchForSsrPublicPath(mf: FederationInstance): void;
|
|
6
|
+
declare function getFederationInstance(): FederationInstance;
|
|
7
|
+
declare function registerRemote(opts: {
|
|
8
|
+
name: string;
|
|
9
|
+
entry: string;
|
|
10
|
+
type?: "manifest" | "script";
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
declare function loadRemoteModule<T>(specifier: string, options?: {
|
|
13
|
+
loadFactory?: boolean;
|
|
14
|
+
from?: "build" | "runtime";
|
|
15
|
+
}): Promise<T>;
|
|
16
|
+
declare function ensureNodeRuntimePlugin(): Promise<void>;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { ensureNodeRuntimePlugin, getFederationInstance, loadRemoteModule, patchManifestFetchForSsrPublicPath, registerRemote };
|
|
19
|
+
//# sourceMappingURL=mf.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mf.d.cts","names":[],"sources":["../src/mf.ts"],"mappings":";;;KAGK,kBAAA,GAAqB,UAAA,QAAkB,cAAA;AAAA,iBAI5B,kCAAA,CAAmC,EAAA,EAAI,kBAAA;AAAA,iBAsBvC,qBAAA,CAAA,GAAyB,kBAAA;AAAA,iBAoBnB,cAAA,CAAe,IAAA;EACnC,IAAA;EACA,KAAA;EACA,IAAA;AAAA,IACE,OAAA;AAAA,iBAqBkB,gBAAA,GAAA,CACpB,SAAA,UACA,OAAA;EAAY,WAAA;EAAuB,IAAA;AAAA,IAClC,OAAA,CAAQ,CAAA;AAAA,iBAeW,uBAAA,CAAA,GAA2B,OAAA"}
|
package/dist/mf.d.mts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createInstance } from "@module-federation/enhanced/runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/mf.d.ts
|
|
4
|
+
type FederationInstance = ReturnType<typeof createInstance>;
|
|
5
|
+
declare function patchManifestFetchForSsrPublicPath(mf: FederationInstance): void;
|
|
6
|
+
declare function getFederationInstance(): FederationInstance;
|
|
7
|
+
declare function registerRemote(opts: {
|
|
8
|
+
name: string;
|
|
9
|
+
entry: string;
|
|
10
|
+
type?: "manifest" | "script";
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
declare function loadRemoteModule<T>(specifier: string, options?: {
|
|
13
|
+
loadFactory?: boolean;
|
|
14
|
+
from?: "build" | "runtime";
|
|
15
|
+
}): Promise<T>;
|
|
16
|
+
declare function ensureNodeRuntimePlugin(): Promise<void>;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { ensureNodeRuntimePlugin, getFederationInstance, loadRemoteModule, patchManifestFetchForSsrPublicPath, registerRemote };
|
|
19
|
+
//# sourceMappingURL=mf.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mf.d.mts","names":[],"sources":["../src/mf.ts"],"mappings":";;;KAGK,kBAAA,GAAqB,UAAA,QAAkB,cAAA;AAAA,iBAI5B,kCAAA,CAAmC,EAAA,EAAI,kBAAA;AAAA,iBAsBvC,qBAAA,CAAA,GAAyB,kBAAA;AAAA,iBAoBnB,cAAA,CAAe,IAAA;EACnC,IAAA;EACA,KAAA;EACA,IAAA;AAAA,IACE,OAAA;AAAA,iBAqBkB,gBAAA,GAAA,CACpB,SAAA,UACA,OAAA;EAAY,WAAA;EAAuB,IAAA;AAAA,IAClC,OAAA,CAAQ,CAAA;AAAA,iBAeW,uBAAA,CAAA,GAA2B,OAAA"}
|
package/dist/mf.mjs
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { createInstance, getInstance } from "@module-federation/enhanced/runtime";
|
|
2
|
+
import { setGlobalFederationInstance } from "@module-federation/runtime-core";
|
|
3
|
+
|
|
4
|
+
//#region src/mf.ts
|
|
5
|
+
let mfInstance = null;
|
|
6
|
+
function patchManifestFetchForSsrPublicPath(mf) {
|
|
7
|
+
if (!mf || !mf.loaderHook?.lifecycle?.fetch?.on) return;
|
|
8
|
+
if (mf.__everythingDevPatchedManifestFetch === true) return;
|
|
9
|
+
mf.__everythingDevPatchedManifestFetch = true;
|
|
10
|
+
mf.loaderHook.lifecycle.fetch.on((url, init) => {
|
|
11
|
+
if (typeof url !== "string" || !url.endsWith("/mf-manifest.json")) return;
|
|
12
|
+
return fetch(url, init).then((res) => res.json()).then((json) => {
|
|
13
|
+
json.metaData = json.metaData ?? {};
|
|
14
|
+
json.metaData.ssrPublicPath = json.metaData.ssrPublicPath ?? url.replace(/\/mf-manifest\.json$/, "/");
|
|
15
|
+
return new Response(JSON.stringify(json), { headers: { "content-type": "application/json" } });
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function getFederationInstance() {
|
|
20
|
+
if (mfInstance) return mfInstance;
|
|
21
|
+
const existing = getInstance();
|
|
22
|
+
if (existing) {
|
|
23
|
+
mfInstance = existing;
|
|
24
|
+
setGlobalFederationInstance(mfInstance);
|
|
25
|
+
patchManifestFetchForSsrPublicPath(mfInstance);
|
|
26
|
+
return mfInstance;
|
|
27
|
+
}
|
|
28
|
+
mfInstance = createInstance({
|
|
29
|
+
name: "host",
|
|
30
|
+
remotes: []
|
|
31
|
+
});
|
|
32
|
+
setGlobalFederationInstance(mfInstance);
|
|
33
|
+
patchManifestFetchForSsrPublicPath(mfInstance);
|
|
34
|
+
return mfInstance;
|
|
35
|
+
}
|
|
36
|
+
async function registerRemote(opts) {
|
|
37
|
+
const instance = getFederationInstance();
|
|
38
|
+
const inferType = () => {
|
|
39
|
+
if (opts.type) return opts.type;
|
|
40
|
+
if (opts.entry.endsWith("/mf-manifest.json")) return "manifest";
|
|
41
|
+
if (opts.entry.endsWith("/remoteEntry.js")) return "script";
|
|
42
|
+
return typeof window === "undefined" ? "script" : "manifest";
|
|
43
|
+
};
|
|
44
|
+
const remoteType = inferType();
|
|
45
|
+
instance.registerRemotes([{
|
|
46
|
+
name: opts.name,
|
|
47
|
+
entry: opts.entry,
|
|
48
|
+
type: remoteType
|
|
49
|
+
}]);
|
|
50
|
+
}
|
|
51
|
+
async function loadRemoteModule(specifier, options) {
|
|
52
|
+
const instance = getFederationInstance();
|
|
53
|
+
if (typeof window === "undefined") await instance.initializeSharing?.("default");
|
|
54
|
+
const mod = await instance.loadRemote(specifier, options);
|
|
55
|
+
if (!mod) throw new Error(`Failed to load remote module: ${specifier}`);
|
|
56
|
+
return mod;
|
|
57
|
+
}
|
|
58
|
+
async function ensureNodeRuntimePlugin() {
|
|
59
|
+
const instance = getFederationInstance();
|
|
60
|
+
if (typeof window !== "undefined") return;
|
|
61
|
+
if (instance.__nodeRuntimePluginLoaded) return;
|
|
62
|
+
const mod = await import("@module-federation/node/runtimePlugin");
|
|
63
|
+
const factory = mod?.default ?? mod;
|
|
64
|
+
const plugin = typeof factory === "function" ? factory() : null;
|
|
65
|
+
if (plugin) instance.registerPlugins([plugin]);
|
|
66
|
+
instance.__nodeRuntimePluginLoaded = true;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
//#endregion
|
|
70
|
+
export { ensureNodeRuntimePlugin, getFederationInstance, loadRemoteModule, patchManifestFetchForSsrPublicPath, registerRemote };
|
|
71
|
+
//# sourceMappingURL=mf.mjs.map
|
package/dist/mf.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mf.mjs","names":[],"sources":["../src/mf.ts"],"sourcesContent":["import { createInstance, getInstance } from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\n\ntype FederationInstance = ReturnType<typeof createInstance>;\n\nlet mfInstance: FederationInstance | null = null;\n\nexport function patchManifestFetchForSsrPublicPath(mf: FederationInstance): void {\n if (!mf || !(mf as any).loaderHook?.lifecycle?.fetch?.on) return;\n if ((mf as any).__everythingDevPatchedManifestFetch === true) return;\n (mf as any).__everythingDevPatchedManifestFetch = true;\n\n (mf as any).loaderHook.lifecycle.fetch.on((url: unknown, init: unknown) => {\n if (typeof url !== \"string\" || !url.endsWith(\"/mf-manifest.json\")) {\n return;\n }\n return fetch(url, init as any)\n .then((res) => res.json())\n .then((json: any) => {\n json.metaData = json.metaData ?? {};\n json.metaData.ssrPublicPath =\n json.metaData.ssrPublicPath ?? url.replace(/\\/mf-manifest\\.json$/, \"/\");\n return new Response(JSON.stringify(json), {\n headers: { \"content-type\": \"application/json\" },\n });\n });\n });\n}\n\nexport function getFederationInstance(): FederationInstance {\n if (mfInstance) return mfInstance;\n\n const existing = getInstance();\n if (existing) {\n mfInstance = existing as FederationInstance;\n setGlobalFederationInstance(mfInstance as any);\n patchManifestFetchForSsrPublicPath(mfInstance);\n return mfInstance;\n }\n\n mfInstance = createInstance({\n name: \"host\",\n remotes: [],\n }) as FederationInstance;\n setGlobalFederationInstance(mfInstance as any);\n patchManifestFetchForSsrPublicPath(mfInstance);\n return mfInstance;\n}\n\nexport async function registerRemote(opts: {\n name: string;\n entry: string;\n type?: \"manifest\" | \"script\";\n}): Promise<void> {\n const instance = getFederationInstance();\n\n const inferType = (): \"manifest\" | \"script\" => {\n if (opts.type) return opts.type;\n if (opts.entry.endsWith(\"/mf-manifest.json\")) return \"manifest\";\n if (opts.entry.endsWith(\"/remoteEntry.js\")) return \"script\";\n return typeof window === \"undefined\" ? \"script\" : \"manifest\";\n };\n\n const remoteType = inferType();\n\n instance.registerRemotes([\n {\n name: opts.name,\n entry: opts.entry,\n type: remoteType,\n },\n ]);\n}\n\nexport async function loadRemoteModule<T>(\n specifier: string,\n options?: { loadFactory?: boolean; from?: \"build\" | \"runtime\" },\n): Promise<T> {\n const instance = getFederationInstance();\n\n const isServer = typeof window === \"undefined\";\n if (isServer) {\n await (instance as any).initializeSharing?.(\"default\");\n }\n\n const mod = await instance.loadRemote<T>(specifier, options as any);\n if (!mod) {\n throw new Error(`Failed to load remote module: ${specifier}`);\n }\n return mod;\n}\n\nexport async function ensureNodeRuntimePlugin(): Promise<void> {\n const instance = getFederationInstance();\n if (typeof window !== \"undefined\") return;\n if ((instance as any).__nodeRuntimePluginLoaded) return;\n\n const mod: any = await import(\"@module-federation/node/runtimePlugin\");\n const factory = mod?.default ?? mod;\n const plugin = typeof factory === \"function\" ? factory() : null;\n if (plugin) {\n instance.registerPlugins([plugin]);\n }\n (instance as any).__nodeRuntimePluginLoaded = true;\n}\n"],"mappings":";;;;AAKA,IAAI,aAAwC;AAE5C,SAAgB,mCAAmC,IAA8B;AAC/E,KAAI,CAAC,MAAM,CAAE,GAAW,YAAY,WAAW,OAAO,GAAI;AAC1D,KAAK,GAAW,wCAAwC,KAAM;AAC9D,CAAC,GAAW,sCAAsC;AAElD,CAAC,GAAW,WAAW,UAAU,MAAM,IAAI,KAAc,SAAkB;AACzE,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAI,SAAS,oBAAoB,CAC/D;AAEF,SAAO,MAAM,KAAK,KAAY,CAC3B,MAAM,QAAQ,IAAI,MAAM,CAAC,CACzB,MAAM,SAAc;AACnB,QAAK,WAAW,KAAK,YAAY,EAAE;AACnC,QAAK,SAAS,gBACZ,KAAK,SAAS,iBAAiB,IAAI,QAAQ,wBAAwB,IAAI;AACzE,UAAO,IAAI,SAAS,KAAK,UAAU,KAAK,EAAE,EACxC,SAAS,EAAE,gBAAgB,oBAAoB,EAChD,CAAC;IACF;GACJ;;AAGJ,SAAgB,wBAA4C;AAC1D,KAAI,WAAY,QAAO;CAEvB,MAAM,WAAW,aAAa;AAC9B,KAAI,UAAU;AACZ,eAAa;AACb,8BAA4B,WAAkB;AAC9C,qCAAmC,WAAW;AAC9C,SAAO;;AAGT,cAAa,eAAe;EAC1B,MAAM;EACN,SAAS,EAAE;EACZ,CAAC;AACF,6BAA4B,WAAkB;AAC9C,oCAAmC,WAAW;AAC9C,QAAO;;AAGT,eAAsB,eAAe,MAInB;CAChB,MAAM,WAAW,uBAAuB;CAExC,MAAM,kBAAyC;AAC7C,MAAI,KAAK,KAAM,QAAO,KAAK;AAC3B,MAAI,KAAK,MAAM,SAAS,oBAAoB,CAAE,QAAO;AACrD,MAAI,KAAK,MAAM,SAAS,kBAAkB,CAAE,QAAO;AACnD,SAAO,OAAO,WAAW,cAAc,WAAW;;CAGpD,MAAM,aAAa,WAAW;AAE9B,UAAS,gBAAgB,CACvB;EACE,MAAM,KAAK;EACX,OAAO,KAAK;EACZ,MAAM;EACP,CACF,CAAC;;AAGJ,eAAsB,iBACpB,WACA,SACY;CACZ,MAAM,WAAW,uBAAuB;AAGxC,KADiB,OAAO,WAAW,YAEjC,OAAO,SAAiB,oBAAoB,UAAU;CAGxD,MAAM,MAAM,MAAM,SAAS,WAAc,WAAW,QAAe;AACnE,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,iCAAiC,YAAY;AAE/D,QAAO;;AAGT,eAAsB,0BAAyC;CAC7D,MAAM,WAAW,uBAAuB;AACxC,KAAI,OAAO,WAAW,YAAa;AACnC,KAAK,SAAiB,0BAA2B;CAEjD,MAAM,MAAW,MAAM,OAAO;CAC9B,MAAM,UAAU,KAAK,WAAW;CAChC,MAAM,SAAS,OAAO,YAAY,aAAa,SAAS,GAAG;AAC3D,KAAI,OACF,UAAS,gBAAgB,CAAC,OAAO,CAAC;AAEpC,CAAC,SAAiB,4BAA4B"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
let effect = require("effect");
|
|
3
|
+
let node_crypto = require("node:crypto");
|
|
4
|
+
let node_child_process = require("node:child_process");
|
|
5
|
+
|
|
6
|
+
//#region src/near-cli.ts
|
|
7
|
+
const INSTALLER_URL = `https://github.com/near/near-cli-rs/releases/download/v0.23.5/near-cli-rs-installer.sh`;
|
|
8
|
+
const BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
9
|
+
var NearCliNotFoundError = class extends Error {
|
|
10
|
+
_tag = "NearCliNotFoundError";
|
|
11
|
+
constructor() {
|
|
12
|
+
super("NEAR CLI not found");
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
var NearCliInstallError = class extends Error {
|
|
16
|
+
_tag = "NearCliInstallError";
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(`Failed to install NEAR CLI: ${message}`);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
var NearTransactionError = class extends Error {
|
|
22
|
+
_tag = "NearTransactionError";
|
|
23
|
+
};
|
|
24
|
+
function base64UrlToBytes(input) {
|
|
25
|
+
const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
|
|
26
|
+
return new Uint8Array(Buffer.from(normalized, "base64"));
|
|
27
|
+
}
|
|
28
|
+
function base58Encode(input) {
|
|
29
|
+
if (input.length === 0) return "";
|
|
30
|
+
const digits = [0];
|
|
31
|
+
for (const byte of input) {
|
|
32
|
+
let carry = byte;
|
|
33
|
+
for (let i = 0; i < digits.length; i++) {
|
|
34
|
+
carry += digits[i] << 8;
|
|
35
|
+
digits[i] = carry % 58;
|
|
36
|
+
carry = Math.floor(carry / 58);
|
|
37
|
+
}
|
|
38
|
+
while (carry > 0) {
|
|
39
|
+
digits.push(carry % 58);
|
|
40
|
+
carry = Math.floor(carry / 58);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
let output = "";
|
|
44
|
+
for (const byte of input) if (byte === 0) output += BASE58_ALPHABET[0];
|
|
45
|
+
else break;
|
|
46
|
+
for (let i = digits.length - 1; i >= 0; i--) output += BASE58_ALPHABET[digits[i]];
|
|
47
|
+
return output;
|
|
48
|
+
}
|
|
49
|
+
function generateNearKeyPair() {
|
|
50
|
+
const { publicKey, privateKey } = (0, node_crypto.generateKeyPairSync)("ed25519");
|
|
51
|
+
const publicJwk = publicKey.export({ format: "jwk" });
|
|
52
|
+
const privateJwk = privateKey.export({ format: "jwk" });
|
|
53
|
+
if (!publicJwk.x || !privateJwk.d) throw new Error("Failed to generate NEAR keypair");
|
|
54
|
+
const publicBytes = base64UrlToBytes(publicJwk.x);
|
|
55
|
+
const privateSeed = base64UrlToBytes(privateJwk.d);
|
|
56
|
+
const secretBytes = new Uint8Array(privateSeed.length + publicBytes.length);
|
|
57
|
+
secretBytes.set(privateSeed, 0);
|
|
58
|
+
secretBytes.set(publicBytes, privateSeed.length);
|
|
59
|
+
return {
|
|
60
|
+
publicKey: `ed25519:${base58Encode(publicBytes)}`,
|
|
61
|
+
privateKey: `ed25519:${base58Encode(secretBytes)}`
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const checkNearCliInstalled = effect.Effect.tryPromise({
|
|
65
|
+
try: async () => {
|
|
66
|
+
return await new Promise((resolve) => {
|
|
67
|
+
const proc = (0, node_child_process.spawn)("near", ["--version"], { stdio: "pipe" });
|
|
68
|
+
proc.on("close", (code) => resolve(code === 0));
|
|
69
|
+
proc.on("error", () => resolve(false));
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
catch: () => /* @__PURE__ */ new Error("Failed to check NEAR CLI")
|
|
73
|
+
});
|
|
74
|
+
const installNearCli = effect.Effect.tryPromise({
|
|
75
|
+
try: async () => {
|
|
76
|
+
return await new Promise((resolve, reject) => {
|
|
77
|
+
const proc = (0, node_child_process.spawn)("sh", ["-c", `curl --proto '=https' --tlsv1.2 -LsSf ${INSTALLER_URL} | sh`], { stdio: "inherit" });
|
|
78
|
+
proc.on("close", (code) => {
|
|
79
|
+
if (code === 0) resolve();
|
|
80
|
+
else reject(new NearCliInstallError(`Installer exited with code ${code}`));
|
|
81
|
+
});
|
|
82
|
+
proc.on("error", (err) => reject(new NearCliInstallError(err.message)));
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
catch: (error) => error
|
|
86
|
+
});
|
|
87
|
+
async function runNearCommand(args) {
|
|
88
|
+
await new Promise((resolve, reject) => {
|
|
89
|
+
const proc = (0, node_child_process.spawn)("near", args, { stdio: "inherit" });
|
|
90
|
+
proc.on("close", (code) => {
|
|
91
|
+
if (code === 0) resolve();
|
|
92
|
+
else reject(/* @__PURE__ */ new Error(`near ${args.join(" ")} failed with exit code ${code}`));
|
|
93
|
+
});
|
|
94
|
+
proc.on("error", (err) => reject(new Error(err.message)));
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const ensureNearCli = effect.Effect.gen(function* () {
|
|
98
|
+
if (yield* checkNearCliInstalled) return;
|
|
99
|
+
if (process.env.BOS_INSTALL_NEAR_CLI === "true") {
|
|
100
|
+
yield* installNearCli;
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
console.log();
|
|
104
|
+
console.log(" NEAR CLI not found");
|
|
105
|
+
console.log();
|
|
106
|
+
console.log(` To install manually: curl --proto '=https' --tlsv1.2 -LsSf ${INSTALLER_URL} | sh`);
|
|
107
|
+
console.log();
|
|
108
|
+
yield* effect.Effect.fail(new NearCliNotFoundError());
|
|
109
|
+
});
|
|
110
|
+
const executeTransaction = (config) => effect.Effect.gen(function* () {
|
|
111
|
+
const gas = (config.gas || "300Tgas").replace(/\s+/g, "");
|
|
112
|
+
const deposit = (config.deposit || "0NEAR").replace(/\s+/g, "");
|
|
113
|
+
const network = config.network || (config.account.endsWith(".testnet") ? "testnet" : "mainnet");
|
|
114
|
+
const args = [
|
|
115
|
+
"contract",
|
|
116
|
+
"call-function",
|
|
117
|
+
"as-transaction",
|
|
118
|
+
config.contract,
|
|
119
|
+
config.method,
|
|
120
|
+
"base64-args",
|
|
121
|
+
config.argsBase64,
|
|
122
|
+
"prepaid-gas",
|
|
123
|
+
gas,
|
|
124
|
+
"attached-deposit",
|
|
125
|
+
deposit,
|
|
126
|
+
"sign-as",
|
|
127
|
+
config.account,
|
|
128
|
+
"network-config",
|
|
129
|
+
network
|
|
130
|
+
];
|
|
131
|
+
if (config.privateKey) args.push("sign-with-plaintext-private-key", config.privateKey, "send");
|
|
132
|
+
else args.push("sign-with-keychain", "send");
|
|
133
|
+
const output = yield* effect.Effect.tryPromise({
|
|
134
|
+
try: async () => {
|
|
135
|
+
return await new Promise((resolve, reject) => {
|
|
136
|
+
const proc = (0, node_child_process.spawn)("near", args, { stdio: [
|
|
137
|
+
"inherit",
|
|
138
|
+
"pipe",
|
|
139
|
+
"pipe"
|
|
140
|
+
] });
|
|
141
|
+
let stdout = "";
|
|
142
|
+
let stderr = "";
|
|
143
|
+
proc.stdout?.on("data", (data) => {
|
|
144
|
+
const text = data.toString();
|
|
145
|
+
stdout += text;
|
|
146
|
+
process.stdout.write(text);
|
|
147
|
+
});
|
|
148
|
+
proc.stderr?.on("data", (data) => {
|
|
149
|
+
const text = data.toString();
|
|
150
|
+
stderr += text;
|
|
151
|
+
});
|
|
152
|
+
proc.on("close", (code) => {
|
|
153
|
+
const combined = `${stdout}\n${stderr}`;
|
|
154
|
+
const txHashMatch = combined.match(/Transaction ID:\s*([A-Za-z0-9]+)/i) || combined.match(/([A-HJ-NP-Za-km-z1-9]{43,44})/);
|
|
155
|
+
const softSuccess = Boolean(txHashMatch?.[1]) && /CodeDoesNotExist/i.test(combined) && /Transaction failed/i.test(combined);
|
|
156
|
+
if (code === 0 || softSuccess) resolve(combined);
|
|
157
|
+
else reject(new NearTransactionError(stderr || `Transaction failed with code ${code}`));
|
|
158
|
+
});
|
|
159
|
+
proc.on("error", (err) => reject(new NearTransactionError(err.message)));
|
|
160
|
+
});
|
|
161
|
+
},
|
|
162
|
+
catch: (error) => error
|
|
163
|
+
});
|
|
164
|
+
return {
|
|
165
|
+
success: true,
|
|
166
|
+
txHash: (output.match(/Transaction ID:\s*([A-Za-z0-9]+)/i) || output.match(/([A-HJ-NP-Za-km-z1-9]{43,44})/))?.[1] || "unknown"
|
|
167
|
+
};
|
|
168
|
+
});
|
|
169
|
+
async function addFunctionCallAccessKey(config) {
|
|
170
|
+
const keyPair = generateNearKeyPair();
|
|
171
|
+
await runNearCommand([
|
|
172
|
+
"account",
|
|
173
|
+
"add-key",
|
|
174
|
+
config.account,
|
|
175
|
+
"grant-function-call-access",
|
|
176
|
+
"--allowance",
|
|
177
|
+
config.allowance,
|
|
178
|
+
"--contract-account-id",
|
|
179
|
+
config.contract,
|
|
180
|
+
"--function-names",
|
|
181
|
+
config.functionNames.join(", "),
|
|
182
|
+
"use-manually-provided-public-key",
|
|
183
|
+
keyPair.publicKey,
|
|
184
|
+
"network-config",
|
|
185
|
+
config.network || (config.account.endsWith(".testnet") ? "testnet" : "mainnet"),
|
|
186
|
+
"sign-with-keychain",
|
|
187
|
+
"send"
|
|
188
|
+
]);
|
|
189
|
+
return keyPair;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
//#endregion
|
|
193
|
+
exports.addFunctionCallAccessKey = addFunctionCallAccessKey;
|
|
194
|
+
exports.ensureNearCli = ensureNearCli;
|
|
195
|
+
exports.executeTransaction = executeTransaction;
|
|
196
|
+
//# sourceMappingURL=near-cli.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"near-cli.cjs","names":["Effect"],"sources":["../src/near-cli.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { generateKeyPairSync } from \"node:crypto\";\nimport { Effect } from \"effect\";\n\nexport interface NearTransactionConfig {\n account: string;\n contract: string;\n method: string;\n argsBase64: string;\n network?: \"mainnet\" | \"testnet\";\n privateKey?: string;\n gas?: string;\n deposit?: string;\n}\n\nexport interface NearTransactionResult {\n success: boolean;\n txHash?: string;\n error?: string;\n}\n\nexport interface NearKeyPair {\n publicKey: string;\n privateKey: string;\n}\n\nexport interface FunctionCallAccessKeyConfig {\n account: string;\n contract: string;\n allowance: string;\n functionNames: string[];\n network?: \"mainnet\" | \"testnet\";\n}\n\nconst NEAR_CLI_VERSION = \"0.23.5\";\nconst INSTALLER_URL = `https://github.com/near/near-cli-rs/releases/download/v${NEAR_CLI_VERSION}/near-cli-rs-installer.sh`;\nconst BASE58_ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n\nexport class NearCliNotFoundError extends Error {\n readonly _tag = \"NearCliNotFoundError\";\n constructor() {\n super(\"NEAR CLI not found\");\n }\n}\n\nexport class NearCliInstallError extends Error {\n readonly _tag = \"NearCliInstallError\";\n constructor(message: string) {\n super(`Failed to install NEAR CLI: ${message}`);\n }\n}\n\nexport class NearTransactionError extends Error {\n readonly _tag = \"NearTransactionError\";\n}\n\nfunction base64UrlToBytes(input: string): Uint8Array {\n const normalized = input.replace(/-/g, \"+\").replace(/_/g, \"/\");\n return new Uint8Array(Buffer.from(normalized, \"base64\"));\n}\n\nfunction base58Encode(input: Uint8Array): string {\n if (input.length === 0) return \"\";\n\n const digits: number[] = [0];\n for (const byte of input) {\n let carry = byte;\n for (let i = 0; i < digits.length; i++) {\n carry += digits[i]! << 8;\n digits[i] = carry % 58;\n carry = Math.floor(carry / 58);\n }\n while (carry > 0) {\n digits.push(carry % 58);\n carry = Math.floor(carry / 58);\n }\n }\n\n let output = \"\";\n for (const byte of input) {\n if (byte === 0) output += BASE58_ALPHABET[0];\n else break;\n }\n\n for (let i = digits.length - 1; i >= 0; i--) {\n output += BASE58_ALPHABET[digits[i]!]!;\n }\n\n return output;\n}\n\nexport function generateNearKeyPair(): NearKeyPair {\n const { publicKey, privateKey } = generateKeyPairSync(\"ed25519\");\n const publicJwk = publicKey.export({ format: \"jwk\" }) as JsonWebKey;\n const privateJwk = privateKey.export({ format: \"jwk\" }) as JsonWebKey;\n\n if (!publicJwk.x || !privateJwk.d) {\n throw new Error(\"Failed to generate NEAR keypair\");\n }\n\n const publicBytes = base64UrlToBytes(publicJwk.x);\n const privateSeed = base64UrlToBytes(privateJwk.d);\n const secretBytes = new Uint8Array(privateSeed.length + publicBytes.length);\n secretBytes.set(privateSeed, 0);\n secretBytes.set(publicBytes, privateSeed.length);\n\n return {\n publicKey: `ed25519:${base58Encode(publicBytes)}`,\n privateKey: `ed25519:${base58Encode(secretBytes)}`,\n };\n}\n\nconst checkNearCliInstalled = Effect.tryPromise({\n try: async () => {\n return await new Promise<boolean>((resolve) => {\n const proc = spawn(\"near\", [\"--version\"], { stdio: \"pipe\" });\n proc.on(\"close\", (code) => resolve(code === 0));\n proc.on(\"error\", () => resolve(false));\n });\n },\n catch: () => new Error(\"Failed to check NEAR CLI\"),\n});\n\nconst installNearCli = Effect.tryPromise({\n try: async () => {\n return await new Promise<void>((resolve, reject) => {\n const proc = spawn(\n \"sh\",\n [\"-c\", `curl --proto '=https' --tlsv1.2 -LsSf ${INSTALLER_URL} | sh`],\n {\n stdio: \"inherit\",\n },\n );\n\n proc.on(\"close\", (code) => {\n if (code === 0) resolve();\n else reject(new NearCliInstallError(`Installer exited with code ${code}`));\n });\n proc.on(\"error\", (err) => reject(new NearCliInstallError(err.message)));\n });\n },\n catch: (error) => error as Error,\n});\n\nasync function runNearCommand(args: string[]): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn(\"near\", args, {\n stdio: \"inherit\",\n });\n\n proc.on(\"close\", (code) => {\n if (code === 0) resolve();\n else reject(new Error(`near ${args.join(\" \")} failed with exit code ${code}`));\n });\n\n proc.on(\"error\", (err) => reject(new Error(err.message)));\n });\n}\n\nexport const ensureNearCli = Effect.gen(function* () {\n const isInstalled = yield* checkNearCliInstalled;\n if (isInstalled) return;\n\n if (process.env.BOS_INSTALL_NEAR_CLI === \"true\") {\n yield* installNearCli;\n return;\n }\n\n console.log();\n console.log(\" NEAR CLI not found\");\n\n console.log();\n console.log(` To install manually: curl --proto '=https' --tlsv1.2 -LsSf ${INSTALLER_URL} | sh`);\n console.log();\n yield* Effect.fail(new NearCliNotFoundError());\n});\n\nexport const executeTransaction = (\n config: NearTransactionConfig,\n): Effect.Effect<NearTransactionResult, Error> =>\n Effect.gen(function* () {\n const gas = (config.gas || \"300Tgas\").replace(/\\s+/g, \"\");\n const deposit = (config.deposit || \"0NEAR\").replace(/\\s+/g, \"\");\n const network = config.network || (config.account.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\");\n\n const args = [\n \"contract\",\n \"call-function\",\n \"as-transaction\",\n config.contract,\n config.method,\n \"base64-args\",\n config.argsBase64,\n \"prepaid-gas\",\n gas,\n \"attached-deposit\",\n deposit,\n \"sign-as\",\n config.account,\n \"network-config\",\n network,\n ];\n\n if (config.privateKey) {\n args.push(\"sign-with-plaintext-private-key\", config.privateKey, \"send\");\n } else {\n args.push(\"sign-with-keychain\", \"send\");\n }\n\n const output = yield* Effect.tryPromise({\n try: async () => {\n return await new Promise<string>((resolve, reject) => {\n const proc = spawn(\"near\", args, { stdio: [\"inherit\", \"pipe\", \"pipe\"] });\n\n let stdout = \"\";\n let stderr = \"\";\n\n proc.stdout?.on(\"data\", (data) => {\n const text = data.toString();\n stdout += text;\n process.stdout.write(text);\n });\n\n proc.stderr?.on(\"data\", (data) => {\n const text = data.toString();\n stderr += text;\n });\n\n proc.on(\"close\", (code) => {\n const combined = `${stdout}\\n${stderr}`;\n const txHashMatch =\n combined.match(/Transaction ID:\\s*([A-Za-z0-9]+)/i) ||\n combined.match(/([A-HJ-NP-Za-km-z1-9]{43,44})/);\n const softSuccess =\n Boolean(txHashMatch?.[1]) &&\n /CodeDoesNotExist/i.test(combined) &&\n /Transaction failed/i.test(combined);\n\n if (code === 0 || softSuccess) resolve(combined);\n else reject(new NearTransactionError(stderr || `Transaction failed with code ${code}`));\n });\n\n proc.on(\"error\", (err) => reject(new NearTransactionError(err.message)));\n });\n },\n catch: (error) => error as Error,\n });\n\n const txHashMatch =\n output.match(/Transaction ID:\\s*([A-Za-z0-9]+)/i) ||\n output.match(/([A-HJ-NP-Za-km-z1-9]{43,44})/);\n\n return {\n success: true,\n txHash: txHashMatch?.[1] || \"unknown\",\n };\n });\n\nexport async function addFunctionCallAccessKey(\n config: FunctionCallAccessKeyConfig,\n): Promise<NearKeyPair> {\n const keyPair = generateNearKeyPair();\n const args = [\n \"account\",\n \"add-key\",\n config.account,\n \"grant-function-call-access\",\n \"--allowance\",\n config.allowance,\n \"--contract-account-id\",\n config.contract,\n \"--function-names\",\n config.functionNames.join(\", \"),\n \"use-manually-provided-public-key\",\n keyPair.publicKey,\n \"network-config\",\n config.network || (config.account.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\"),\n \"sign-with-keychain\",\n \"send\",\n ];\n\n await runNearCommand(args);\n return keyPair;\n}\n"],"mappings":";;;;;;AAmCA,MAAM,gBAAgB;AACtB,MAAM,kBAAkB;AAExB,IAAa,uBAAb,cAA0C,MAAM;CAC9C,AAAS,OAAO;CAChB,cAAc;AACZ,QAAM,qBAAqB;;;AAI/B,IAAa,sBAAb,cAAyC,MAAM;CAC7C,AAAS,OAAO;CAChB,YAAY,SAAiB;AAC3B,QAAM,+BAA+B,UAAU;;;AAInD,IAAa,uBAAb,cAA0C,MAAM;CAC9C,AAAS,OAAO;;AAGlB,SAAS,iBAAiB,OAA2B;CACnD,MAAM,aAAa,MAAM,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI;AAC9D,QAAO,IAAI,WAAW,OAAO,KAAK,YAAY,SAAS,CAAC;;AAG1D,SAAS,aAAa,OAA2B;AAC/C,KAAI,MAAM,WAAW,EAAG,QAAO;CAE/B,MAAM,SAAmB,CAAC,EAAE;AAC5B,MAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,QAAQ;AACZ,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAS,OAAO,MAAO;AACvB,UAAO,KAAK,QAAQ;AACpB,WAAQ,KAAK,MAAM,QAAQ,GAAG;;AAEhC,SAAO,QAAQ,GAAG;AAChB,UAAO,KAAK,QAAQ,GAAG;AACvB,WAAQ,KAAK,MAAM,QAAQ,GAAG;;;CAIlC,IAAI,SAAS;AACb,MAAK,MAAM,QAAQ,MACjB,KAAI,SAAS,EAAG,WAAU,gBAAgB;KACrC;AAGP,MAAK,IAAI,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,IACtC,WAAU,gBAAgB,OAAO;AAGnC,QAAO;;AAGT,SAAgB,sBAAmC;CACjD,MAAM,EAAE,WAAW,oDAAmC,UAAU;CAChE,MAAM,YAAY,UAAU,OAAO,EAAE,QAAQ,OAAO,CAAC;CACrD,MAAM,aAAa,WAAW,OAAO,EAAE,QAAQ,OAAO,CAAC;AAEvD,KAAI,CAAC,UAAU,KAAK,CAAC,WAAW,EAC9B,OAAM,IAAI,MAAM,kCAAkC;CAGpD,MAAM,cAAc,iBAAiB,UAAU,EAAE;CACjD,MAAM,cAAc,iBAAiB,WAAW,EAAE;CAClD,MAAM,cAAc,IAAI,WAAW,YAAY,SAAS,YAAY,OAAO;AAC3E,aAAY,IAAI,aAAa,EAAE;AAC/B,aAAY,IAAI,aAAa,YAAY,OAAO;AAEhD,QAAO;EACL,WAAW,WAAW,aAAa,YAAY;EAC/C,YAAY,WAAW,aAAa,YAAY;EACjD;;AAGH,MAAM,wBAAwBA,cAAO,WAAW;CAC9C,KAAK,YAAY;AACf,SAAO,MAAM,IAAI,SAAkB,YAAY;GAC7C,MAAM,qCAAa,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,QAAQ,CAAC;AAC5D,QAAK,GAAG,UAAU,SAAS,QAAQ,SAAS,EAAE,CAAC;AAC/C,QAAK,GAAG,eAAe,QAAQ,MAAM,CAAC;IACtC;;CAEJ,6BAAa,IAAI,MAAM,2BAA2B;CACnD,CAAC;AAEF,MAAM,iBAAiBA,cAAO,WAAW;CACvC,KAAK,YAAY;AACf,SAAO,MAAM,IAAI,SAAe,SAAS,WAAW;GAClD,MAAM,qCACJ,MACA,CAAC,MAAM,yCAAyC,cAAc,OAAO,EACrE,EACE,OAAO,WACR,CACF;AAED,QAAK,GAAG,UAAU,SAAS;AACzB,QAAI,SAAS,EAAG,UAAS;QACpB,QAAO,IAAI,oBAAoB,8BAA8B,OAAO,CAAC;KAC1E;AACF,QAAK,GAAG,UAAU,QAAQ,OAAO,IAAI,oBAAoB,IAAI,QAAQ,CAAC,CAAC;IACvE;;CAEJ,QAAQ,UAAU;CACnB,CAAC;AAEF,eAAe,eAAe,MAA+B;AAC3D,OAAM,IAAI,SAAe,SAAS,WAAW;EAC3C,MAAM,qCAAa,QAAQ,MAAM,EAC/B,OAAO,WACR,CAAC;AAEF,OAAK,GAAG,UAAU,SAAS;AACzB,OAAI,SAAS,EAAG,UAAS;OACpB,wBAAO,IAAI,MAAM,QAAQ,KAAK,KAAK,IAAI,CAAC,yBAAyB,OAAO,CAAC;IAC9E;AAEF,OAAK,GAAG,UAAU,QAAQ,OAAO,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC;GACzD;;AAGJ,MAAa,gBAAgBA,cAAO,IAAI,aAAa;AAEnD,KADoB,OAAO,sBACV;AAEjB,KAAI,QAAQ,IAAI,yBAAyB,QAAQ;AAC/C,SAAO;AACP;;AAGF,SAAQ,KAAK;AACb,SAAQ,IAAI,uBAAuB;AAEnC,SAAQ,KAAK;AACb,SAAQ,IAAI,gEAAgE,cAAc,OAAO;AACjG,SAAQ,KAAK;AACb,QAAOA,cAAO,KAAK,IAAI,sBAAsB,CAAC;EAC9C;AAEF,MAAa,sBACX,WAEAA,cAAO,IAAI,aAAa;CACtB,MAAM,OAAO,OAAO,OAAO,WAAW,QAAQ,QAAQ,GAAG;CACzD,MAAM,WAAW,OAAO,WAAW,SAAS,QAAQ,QAAQ,GAAG;CAC/D,MAAM,UAAU,OAAO,YAAY,OAAO,QAAQ,SAAS,WAAW,GAAG,YAAY;CAErF,MAAM,OAAO;EACX;EACA;EACA;EACA,OAAO;EACP,OAAO;EACP;EACA,OAAO;EACP;EACA;EACA;EACA;EACA;EACA,OAAO;EACP;EACA;EACD;AAED,KAAI,OAAO,WACT,MAAK,KAAK,mCAAmC,OAAO,YAAY,OAAO;KAEvE,MAAK,KAAK,sBAAsB,OAAO;CAGzC,MAAM,SAAS,OAAOA,cAAO,WAAW;EACtC,KAAK,YAAY;AACf,UAAO,MAAM,IAAI,SAAiB,SAAS,WAAW;IACpD,MAAM,qCAAa,QAAQ,MAAM,EAAE,OAAO;KAAC;KAAW;KAAQ;KAAO,EAAE,CAAC;IAExE,IAAI,SAAS;IACb,IAAI,SAAS;AAEb,SAAK,QAAQ,GAAG,SAAS,SAAS;KAChC,MAAM,OAAO,KAAK,UAAU;AAC5B,eAAU;AACV,aAAQ,OAAO,MAAM,KAAK;MAC1B;AAEF,SAAK,QAAQ,GAAG,SAAS,SAAS;KAChC,MAAM,OAAO,KAAK,UAAU;AAC5B,eAAU;MACV;AAEF,SAAK,GAAG,UAAU,SAAS;KACzB,MAAM,WAAW,GAAG,OAAO,IAAI;KAC/B,MAAM,cACJ,SAAS,MAAM,oCAAoC,IACnD,SAAS,MAAM,gCAAgC;KACjD,MAAM,cACJ,QAAQ,cAAc,GAAG,IACzB,oBAAoB,KAAK,SAAS,IAClC,sBAAsB,KAAK,SAAS;AAEtC,SAAI,SAAS,KAAK,YAAa,SAAQ,SAAS;SAC3C,QAAO,IAAI,qBAAqB,UAAU,gCAAgC,OAAO,CAAC;MACvF;AAEF,SAAK,GAAG,UAAU,QAAQ,OAAO,IAAI,qBAAqB,IAAI,QAAQ,CAAC,CAAC;KACxE;;EAEJ,QAAQ,UAAU;EACnB,CAAC;AAMF,QAAO;EACL,SAAS;EACT,SALA,OAAO,MAAM,oCAAoC,IACjD,OAAO,MAAM,gCAAgC,IAIvB,MAAM;EAC7B;EACD;AAEJ,eAAsB,yBACpB,QACsB;CACtB,MAAM,UAAU,qBAAqB;AAoBrC,OAAM,eAnBO;EACX;EACA;EACA,OAAO;EACP;EACA;EACA,OAAO;EACP;EACA,OAAO;EACP;EACA,OAAO,cAAc,KAAK,KAAK;EAC/B;EACA,QAAQ;EACR;EACA,OAAO,YAAY,OAAO,QAAQ,SAAS,WAAW,GAAG,YAAY;EACrE;EACA;EACD,CAEyB;AAC1B,QAAO"}
|