@mmapp/react-compiler 0.1.0-alpha.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/README.md +107 -0
- package/compile-blueprint-chat.mjs +99 -0
- package/compile-blueprint-glass-console.mjs +98 -0
- package/compile-chat-defs.mjs +92 -0
- package/dist/babel/index.d.mts +3 -0
- package/dist/babel/index.d.ts +3 -0
- package/dist/babel/index.js +4851 -0
- package/dist/babel/index.mjs +7 -0
- package/dist/chunk-26U577GB.mjs +3465 -0
- package/dist/chunk-2FBDFAX6.mjs +2362 -0
- package/dist/chunk-2L4QSMXG.mjs +175 -0
- package/dist/chunk-2REDFOER.mjs +931 -0
- package/dist/chunk-46YKSHQR.mjs +175 -0
- package/dist/chunk-4XHK6FWL.mjs +2058 -0
- package/dist/chunk-5M7DKKBC.mjs +215 -0
- package/dist/chunk-5VNJ7C6N.mjs +154 -0
- package/dist/chunk-6CQOAAMV.mjs +1803 -0
- package/dist/chunk-6SEVAAVT.mjs +3516 -0
- package/dist/chunk-6YLR5ZDA.mjs +2829 -0
- package/dist/chunk-AOGY2GK6.mjs +3292 -0
- package/dist/chunk-AXXUXRNA.mjs +1434 -0
- package/dist/chunk-CHLVKMQW.mjs +175 -0
- package/dist/chunk-CKGOZAB7.mjs +939 -0
- package/dist/chunk-D34RAZUX.mjs +2223 -0
- package/dist/chunk-EQGA6A6D.mjs +121 -0
- package/dist/chunk-EY2CSXYA.mjs +822 -0
- package/dist/chunk-FIQ65CDR.mjs +925 -0
- package/dist/chunk-FOZXJFAR.mjs +186 -0
- package/dist/chunk-FX6URXWN.mjs +186 -0
- package/dist/chunk-G7SMOWOL.mjs +828 -0
- package/dist/chunk-GGB4G5YY.mjs +175 -0
- package/dist/chunk-HLRGCCIL.mjs +4839 -0
- package/dist/chunk-HOIUP6IF.mjs +690 -0
- package/dist/chunk-I3AU7GRD.mjs +120 -0
- package/dist/chunk-ILFGMUVD.mjs +1933 -0
- package/dist/chunk-IPTX5MJU.mjs +3223 -0
- package/dist/chunk-ITGUSH2Z.mjs +2783 -0
- package/dist/chunk-IXHBCAMF.mjs +3306 -0
- package/dist/chunk-J7TWJ3TM.mjs +2784 -0
- package/dist/chunk-JDPLDGVF.mjs +4810 -0
- package/dist/chunk-K53XP2DL.mjs +148 -0
- package/dist/chunk-K5HX2SVL.mjs +1902 -0
- package/dist/chunk-KFGYOOVS.mjs +214 -0
- package/dist/chunk-KFVVOS5N.mjs +925 -0
- package/dist/chunk-L2OZ4CDV.mjs +113 -0
- package/dist/chunk-MIZV3TAN.mjs +3293 -0
- package/dist/chunk-NKKLQE5V.mjs +148 -0
- package/dist/chunk-NOW23XFZ.mjs +186 -0
- package/dist/chunk-NRXQKQ74.mjs +148 -0
- package/dist/chunk-OWI6XWCD.mjs +3375 -0
- package/dist/chunk-PRUMNNDI.mjs +3192 -0
- package/dist/chunk-QTBD5B3F.mjs +148 -0
- package/dist/chunk-SKSDPPNT.mjs +3788 -0
- package/dist/chunk-SP2YUS33.mjs +186 -0
- package/dist/chunk-SU4E6E7B.mjs +3153 -0
- package/dist/chunk-SYUUKW5A.mjs +3379 -0
- package/dist/chunk-UL2XZEMA.mjs +3128 -0
- package/dist/chunk-XMWUHQVV.mjs +939 -0
- package/dist/chunk-XZNEDRGN.mjs +3876 -0
- package/dist/chunk-Y6FXYEAI.mjs +10 -0
- package/dist/chunk-YFS6JMYO.mjs +3342 -0
- package/dist/chunk-Z6AIQ4KL.mjs +113 -0
- package/dist/cli/index.d.mts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +11585 -0
- package/dist/cli/index.mjs +701 -0
- package/dist/codemod/cli.d.mts +1 -0
- package/dist/codemod/cli.d.ts +1 -0
- package/dist/codemod/cli.js +1104 -0
- package/dist/codemod/cli.mjs +157 -0
- package/dist/codemod/index.d.mts +148 -0
- package/dist/codemod/index.d.ts +148 -0
- package/dist/codemod/index.js +981 -0
- package/dist/codemod/index.mjs +25 -0
- package/dist/dev-server-Bs_sz2DG.d.mts +111 -0
- package/dist/dev-server-Bs_sz2DG.d.ts +111 -0
- package/dist/dev-server-CjoufJ-u.d.mts +109 -0
- package/dist/dev-server-CjoufJ-u.d.ts +109 -0
- package/dist/dev-server.d.mts +3 -0
- package/dist/dev-server.d.ts +3 -0
- package/dist/dev-server.js +7603 -0
- package/dist/dev-server.mjs +11 -0
- package/dist/envelope-DD7v0v6E.d.mts +265 -0
- package/dist/envelope-DD7v0v6E.d.ts +265 -0
- package/dist/envelope-vCVjrHlo.d.mts +265 -0
- package/dist/envelope-vCVjrHlo.d.ts +265 -0
- package/dist/envelope.d.mts +2 -0
- package/dist/envelope.d.ts +2 -0
- package/dist/envelope.js +5184 -0
- package/dist/envelope.mjs +9 -0
- package/dist/index-B5gSgvnd.d.mts +44 -0
- package/dist/index-B5gSgvnd.d.ts +44 -0
- package/dist/index-Bs0MnR54.d.mts +103 -0
- package/dist/index-Bs0MnR54.d.ts +103 -0
- package/dist/index-DR0nNc_f.d.mts +101 -0
- package/dist/index-DR0nNc_f.d.ts +101 -0
- package/dist/index-revho_gS.d.mts +104 -0
- package/dist/index-revho_gS.d.ts +104 -0
- package/dist/index.d.mts +1099 -0
- package/dist/index.d.ts +1099 -0
- package/dist/index.js +10162 -0
- package/dist/index.mjs +372 -0
- package/dist/init-IXEE2RCF.mjs +340 -0
- package/dist/project-compiler-EGJUTAJU.mjs +10 -0
- package/dist/project-compiler-VFR6CSDX.mjs +10 -0
- package/dist/project-decompiler-5GY2KSG4.mjs +7 -0
- package/dist/pull-A2QUHW4K.mjs +109 -0
- package/dist/pull-JBEQWVPE.mjs +109 -0
- package/dist/testing/index.d.mts +211 -0
- package/dist/testing/index.d.ts +211 -0
- package/dist/testing/index.js +5106 -0
- package/dist/testing/index.mjs +247 -0
- package/dist/vite/index.d.mts +59 -0
- package/dist/vite/index.d.ts +59 -0
- package/dist/vite/index.js +5023 -0
- package/dist/vite/index.mjs +8 -0
- package/examples/README.md +72 -0
- package/examples/authentication/main.workflow.tsx +139 -0
- package/examples/authentication/mm.config.ts +22 -0
- package/examples/authentication/models/auth.ts +45 -0
- package/examples/authentication/pages/LoginPage.tsx +79 -0
- package/examples/authentication/pages/SignupPage.tsx +87 -0
- package/examples/counter.workflow.tsx +65 -0
- package/examples/dashboard.workflow.tsx +419 -0
- package/examples/invoice-approval/actions/invoice.server.ts +72 -0
- package/examples/invoice-approval/main.workflow.tsx +168 -0
- package/examples/invoice-approval/mm.config.ts +18 -0
- package/examples/invoice-approval/models/invoice.ts +46 -0
- package/examples/invoice-approval/pages/InvoiceDetailPage.tsx +175 -0
- package/examples/invoice-approval/pages/InvoiceFormPage.tsx +198 -0
- package/examples/invoice-approval/pages/InvoiceListPage.tsx +141 -0
- package/examples/todo-app.workflow.tsx +131 -0
- package/examples/uber-app/actions/matching.server.ts +177 -0
- package/examples/uber-app/actions/notifications.server.ts +176 -0
- package/examples/uber-app/actions/payments.server.ts +184 -0
- package/examples/uber-app/actions/pricing.server.ts +176 -0
- package/examples/uber-app/app/admin/analytics.tsx +102 -0
- package/examples/uber-app/app/admin/fleet.tsx +102 -0
- package/examples/uber-app/app/admin/surge-pricing.tsx +95 -0
- package/examples/uber-app/app/driver/dashboard.tsx +87 -0
- package/examples/uber-app/app/driver/earnings.tsx +101 -0
- package/examples/uber-app/app/driver/navigation.tsx +94 -0
- package/examples/uber-app/app/driver/ride-acceptance.tsx +103 -0
- package/examples/uber-app/app/rider/home.tsx +109 -0
- package/examples/uber-app/app/rider/payment-methods.tsx +134 -0
- package/examples/uber-app/app/rider/ride-history.tsx +90 -0
- package/examples/uber-app/app/rider/ride-tracking.tsx +108 -0
- package/examples/uber-app/components/DriverCard.tsx +176 -0
- package/examples/uber-app/components/MapView.tsx +216 -0
- package/examples/uber-app/components/RatingStars.tsx +227 -0
- package/examples/uber-app/components/RideCard.tsx +167 -0
- package/examples/uber-app/mm.config.ts +30 -0
- package/examples/uber-app/models/location.model.ts +70 -0
- package/examples/uber-app/models/payment.model.ts +87 -0
- package/examples/uber-app/models/rating.model.ts +54 -0
- package/examples/uber-app/models/ride.model.ts +118 -0
- package/examples/uber-app/models/user.model.ts +66 -0
- package/examples/uber-app/models/vehicle.model.ts +63 -0
- package/examples/uber-app/tests/payment.test.tsx +129 -0
- package/examples/uber-app/tests/ride-flow.test.tsx +123 -0
- package/examples/uber-app/workflows/dispute-resolution.workflow.tsx +205 -0
- package/examples/uber-app/workflows/driver-onboarding.workflow.tsx +227 -0
- package/examples/uber-app/workflows/payment-processing.workflow.tsx +223 -0
- package/examples/uber-app/workflows/ride-request.workflow.tsx +194 -0
- package/package.json +77 -0
- package/package.json.backup +86 -0
- package/scripts/decompile.ts +226 -0
- package/scripts/seed-auth.ts +267 -0
- package/scripts/seed-uber.ts +248 -0
- package/scripts/validate-uber.ts +119 -0
- package/seed-blueprint-chat.mjs +444 -0
- package/seed-blueprint-glass-console.mjs +445 -0
- package/seed-compiled.mjs +318 -0
- package/src/RoundTripValidator.ts +400 -0
- package/src/__tests__/atom-rendering-coverage.test.ts +680 -0
- package/src/__tests__/auth-module-compilation.test.ts +247 -0
- package/src/__tests__/auth-template-compilation.test.ts +589 -0
- package/src/__tests__/change-extractor.test.ts +142 -0
- package/src/__tests__/cli-pull.test.ts +73 -0
- package/src/__tests__/cli-test.test.ts +72 -0
- package/src/__tests__/component-extractor.test.ts +331 -0
- package/src/__tests__/context-extractor.test.ts +145 -0
- package/src/__tests__/decompiler.test.ts +718 -0
- package/src/__tests__/define-blueprint.test.ts +133 -0
- package/src/__tests__/definition-validator.test.ts +519 -0
- package/src/__tests__/during-extractor.test.ts +152 -0
- package/src/__tests__/effect-extractor.test.ts +107 -0
- package/src/__tests__/event-emission.test.ts +127 -0
- package/src/__tests__/examples.test.ts +236 -0
- package/src/__tests__/full-blueprint-coverage.test.ts +1221 -0
- package/src/__tests__/golden-suite.test.ts +403 -0
- package/src/__tests__/grammar-island-extractor.test.ts +289 -0
- package/src/__tests__/instance-key.test.ts +82 -0
- package/src/__tests__/ir-migration.test.ts +255 -0
- package/src/__tests__/lock-file.test.ts +117 -0
- package/src/__tests__/model-extractor.test.ts +195 -0
- package/src/__tests__/model-field-acl.test.ts +237 -0
- package/src/__tests__/model-hooks.test.ts +130 -0
- package/src/__tests__/model-ref-resolution.test.ts +268 -0
- package/src/__tests__/model-roundtrip.test.ts +502 -0
- package/src/__tests__/model-runtime.test.ts +112 -0
- package/src/__tests__/model-transitions.test.ts +183 -0
- package/src/__tests__/nrt-action-trace.test.ts +391 -0
- package/src/__tests__/pipeline-hardening.test.ts +413 -0
- package/src/__tests__/project-compiler.test.ts +546 -0
- package/src/__tests__/project-decompiler.test.ts +343 -0
- package/src/__tests__/query-compilation.test.ts +145 -0
- package/src/__tests__/round-trip/PLAN.md +158 -0
- package/src/__tests__/round-trip/README.md +52 -0
- package/src/__tests__/round-trip/RESULTS.md +86 -0
- package/src/__tests__/round-trip/fixtures/data-heavy/main.workflow.tsx +55 -0
- package/src/__tests__/round-trip/fixtures/data-heavy/mm.config.ts +11 -0
- package/src/__tests__/round-trip/fixtures/data-heavy/models/contact.ts +54 -0
- package/src/__tests__/round-trip/fixtures/full-workflow/main.workflow.tsx +79 -0
- package/src/__tests__/round-trip/fixtures/full-workflow/mm.config.ts +12 -0
- package/src/__tests__/round-trip/fixtures/full-workflow/models/order.ts +50 -0
- package/src/__tests__/round-trip/fixtures/simple-crud/main.workflow.tsx +25 -0
- package/src/__tests__/round-trip/fixtures/simple-crud/mm.config.ts +11 -0
- package/src/__tests__/round-trip/fixtures/simple-crud/models/task.ts +32 -0
- package/src/__tests__/round-trip/fixtures/view-heavy/main.workflow.tsx +79 -0
- package/src/__tests__/round-trip/fixtures/view-heavy/mm.config.ts +10 -0
- package/src/__tests__/round-trip/round-trip.test.ts +2598 -0
- package/src/__tests__/round-trip-ir.test.ts +300 -0
- package/src/__tests__/round-trip.test.ts +1212 -0
- package/src/__tests__/route-merging.test.ts +372 -0
- package/src/__tests__/router-composition.test.ts +489 -0
- package/src/__tests__/router-extractor.test.ts +176 -0
- package/src/__tests__/server-action-extractor.test.ts +128 -0
- package/src/__tests__/smart-type-inference.test.ts +365 -0
- package/src/__tests__/source-envelope.test.ts +284 -0
- package/src/__tests__/source-fidelity.test.ts +516 -0
- package/src/__tests__/state-extractor.test.ts +115 -0
- package/src/__tests__/strict-mode.test.ts +227 -0
- package/src/__tests__/transition-effect-extractor.test.ts +119 -0
- package/src/__tests__/transition-extractor.test.ts +68 -0
- package/src/__tests__/ts-to-expression.test.ts +462 -0
- package/src/__tests__/type-generator.test.ts +201 -0
- package/src/__tests__/uber-validation.test.ts +502 -0
- package/src/action-compiler.ts +361 -0
- package/src/babel/emitters/experience-transform.ts +199 -0
- package/src/babel/emitters/ir-to-tsx-emitter.ts +110 -0
- package/src/babel/emitters/pure-form-emitter.ts +1023 -0
- package/src/babel/emitters/runtime-glue-emitter.ts +39 -0
- package/src/babel/extractors/change-extractor.ts +199 -0
- package/src/babel/extractors/component-extractor.ts +907 -0
- package/src/babel/extractors/computed-extractor.ts +262 -0
- package/src/babel/extractors/context-extractor.ts +277 -0
- package/src/babel/extractors/during-extractor.ts +295 -0
- package/src/babel/extractors/effect-extractor.ts +340 -0
- package/src/babel/extractors/event-extractor.ts +235 -0
- package/src/babel/extractors/grammar-island-extractor.ts +302 -0
- package/src/babel/extractors/model-extractor.ts +1018 -0
- package/src/babel/extractors/router-extractor.ts +303 -0
- package/src/babel/extractors/server-action-extractor.ts +173 -0
- package/src/babel/extractors/server-action-hook-extractor.ts +72 -0
- package/src/babel/extractors/server-state-extractor.ts +88 -0
- package/src/babel/extractors/state-extractor.ts +214 -0
- package/src/babel/extractors/transition-effect-extractor.ts +176 -0
- package/src/babel/extractors/transition-extractor.ts +143 -0
- package/src/babel/index.ts +24 -0
- package/src/babel/transpilers/ts-to-expression.ts +674 -0
- package/src/babel/visitor.ts +807 -0
- package/src/cli/auth.ts +255 -0
- package/src/cli/build.ts +288 -0
- package/src/cli/deploy.ts +206 -0
- package/src/cli/index.ts +328 -0
- package/src/cli/init.ts +388 -0
- package/src/cli/installer.ts +261 -0
- package/src/cli/lock-file.ts +94 -0
- package/src/cli/mmrc.ts +22 -0
- package/src/cli/pull.ts +172 -0
- package/src/cli/registry-client.ts +175 -0
- package/src/cli/test.ts +397 -0
- package/src/cli/type-generator.ts +243 -0
- package/src/codemod/__tests__/forward.test.ts +239 -0
- package/src/codemod/__tests__/reverse.test.ts +145 -0
- package/src/codemod/__tests__/round-trip.test.ts +137 -0
- package/src/codemod/annotation.ts +97 -0
- package/src/codemod/classify.ts +197 -0
- package/src/codemod/cli.ts +207 -0
- package/src/codemod/control-flow.ts +409 -0
- package/src/codemod/forward.ts +244 -0
- package/src/codemod/import-manager.ts +171 -0
- package/src/codemod/index.ts +120 -0
- package/src/codemod/reverse.ts +197 -0
- package/src/codemod/rules.ts +174 -0
- package/src/codemod/state-transform.ts +126 -0
- package/src/decompiler/ast-builder.ts +538 -0
- package/src/decompiler/config-generator.ts +151 -0
- package/src/decompiler/index.ts +315 -0
- package/src/decompiler/project-decompiler.ts +1776 -0
- package/src/decompiler/project.ts +862 -0
- package/src/decompiler/split-strategy.ts +140 -0
- package/src/decompiler/state-emitter.ts +1053 -0
- package/src/decompiler/sx-emitter.ts +318 -0
- package/src/decompiler/workspace-hydrator.ts +189 -0
- package/src/dev-server.ts +238 -0
- package/src/envelope/fs-tree.ts +217 -0
- package/src/envelope/source-envelope.ts +264 -0
- package/src/envelope.ts +315 -0
- package/src/incremental-compiler.ts +401 -0
- package/src/index.ts +99 -0
- package/src/model-compiler.ts +277 -0
- package/src/project-compiler.ts +1629 -0
- package/src/route-extractor.ts +333 -0
- package/src/testing/index.ts +32 -0
- package/src/testing/snapshot.ts +252 -0
- package/src/testing/test-utils.ts +226 -0
- package/src/types.ts +68 -0
- package/src/vite/index.ts +288 -0
- package/test-compile.mjs +142 -0
- package/tsconfig.json +25 -0
- package/tsup.config.ts +23 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import {
|
|
2
|
+
decompileProjectEnhanced
|
|
3
|
+
} from "./chunk-UL2XZEMA.mjs";
|
|
4
|
+
import "./chunk-Y6FXYEAI.mjs";
|
|
5
|
+
|
|
6
|
+
// src/cli/pull.ts
|
|
7
|
+
import { mkdirSync, writeFileSync } from "fs";
|
|
8
|
+
import { join, dirname } from "path";
|
|
9
|
+
async function pull(options) {
|
|
10
|
+
const { slug, apiUrl, token } = options;
|
|
11
|
+
const outDir = options.outDir ?? slug;
|
|
12
|
+
console.log(`[mmrc pull] Fetching "${slug}" from ${apiUrl}...`);
|
|
13
|
+
const ir = await fetchDefinition(apiUrl, token, slug);
|
|
14
|
+
if (!ir) {
|
|
15
|
+
throw new Error(`Definition "${slug}" not found`);
|
|
16
|
+
}
|
|
17
|
+
console.log(` Found: ${ir.name || ir.slug} (${ir.category || "workflow"}, v${ir.version || "1.0.0"})`);
|
|
18
|
+
console.log(` Fields: ${ir.fields?.length ?? 0}, States: ${ir.states?.length ?? 0}, Transitions: ${ir.transitions?.length ?? 0}`);
|
|
19
|
+
const result = decompileProjectEnhanced(ir);
|
|
20
|
+
mkdirSync(outDir, { recursive: true });
|
|
21
|
+
const filesWritten = [];
|
|
22
|
+
for (const file of result.files) {
|
|
23
|
+
const filePath = join(outDir, file.path);
|
|
24
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
25
|
+
writeFileSync(filePath, file.content, "utf-8");
|
|
26
|
+
filesWritten.push(file.path);
|
|
27
|
+
console.log(` + ${file.path}`);
|
|
28
|
+
}
|
|
29
|
+
console.log(`
|
|
30
|
+
[mmrc pull] Scaffolded ${filesWritten.length} files in ${outDir}/`);
|
|
31
|
+
console.log(` Entry: ${result.entryFile}`);
|
|
32
|
+
console.log(`
|
|
33
|
+
Next steps:`);
|
|
34
|
+
console.log(` cd ${outDir}`);
|
|
35
|
+
console.log(` mmrc dev --src .`);
|
|
36
|
+
console.log(` # Edit files, then deploy back:`);
|
|
37
|
+
console.log(` mmrc deploy --src . --api-url ${apiUrl} --token <token>`);
|
|
38
|
+
return { slug, filesWritten, outDir };
|
|
39
|
+
}
|
|
40
|
+
async function fetchDefinition(apiUrl, token, slug) {
|
|
41
|
+
const bySlug = await tryFetch(`${apiUrl}/workflow/definitions?slug=${encodeURIComponent(slug)}`, token);
|
|
42
|
+
if (bySlug) return bySlug;
|
|
43
|
+
const bySearch = await tryFetch(`${apiUrl}/workflow/catalog/search?q=${encodeURIComponent(slug)}`, token);
|
|
44
|
+
if (bySearch) return bySearch;
|
|
45
|
+
const modulesRes = await fetch(`${apiUrl}/modules`, {
|
|
46
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
47
|
+
});
|
|
48
|
+
if (modulesRes.ok) {
|
|
49
|
+
const modules = await modulesRes.json();
|
|
50
|
+
const mod = modules.find((m) => m.module_id === slug || m.name?.toLowerCase() === slug.toLowerCase());
|
|
51
|
+
if (mod) {
|
|
52
|
+
const fullRes = await fetch(`${apiUrl}/workflow/definitions/${mod.module_id}`, {
|
|
53
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
54
|
+
});
|
|
55
|
+
if (fullRes.ok) {
|
|
56
|
+
return normalizeApiResponse(await fullRes.json());
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
async function tryFetch(url, token) {
|
|
63
|
+
try {
|
|
64
|
+
const res = await fetch(url, {
|
|
65
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
66
|
+
});
|
|
67
|
+
if (!res.ok) return null;
|
|
68
|
+
const data = await res.json();
|
|
69
|
+
if (Array.isArray(data)) {
|
|
70
|
+
if (data.length === 0) return null;
|
|
71
|
+
return normalizeApiResponse(data[0]);
|
|
72
|
+
}
|
|
73
|
+
const items = data.items ?? data.data;
|
|
74
|
+
if (items && Array.isArray(items)) {
|
|
75
|
+
if (items.length === 0) return null;
|
|
76
|
+
return normalizeApiResponse(items[0]);
|
|
77
|
+
}
|
|
78
|
+
return normalizeApiResponse(data);
|
|
79
|
+
} catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function normalizeApiResponse(def) {
|
|
84
|
+
const ir = {
|
|
85
|
+
slug: def.slug,
|
|
86
|
+
name: def.name,
|
|
87
|
+
version: def.version || "1.0.0",
|
|
88
|
+
description: def.description || "",
|
|
89
|
+
category: def.category || "workflow",
|
|
90
|
+
fields: def.fields || [],
|
|
91
|
+
states: def.states || [],
|
|
92
|
+
transitions: def.transitions || [],
|
|
93
|
+
roles: def.roles || [],
|
|
94
|
+
on_event: def.on_event || [],
|
|
95
|
+
metadata: {
|
|
96
|
+
...def.metadata || {}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const experience = def.view || def.experience || def.metadata?.experience;
|
|
100
|
+
if (experience) {
|
|
101
|
+
ir.experience = experience;
|
|
102
|
+
ir.metadata.experience = experience;
|
|
103
|
+
ir.view = experience;
|
|
104
|
+
}
|
|
105
|
+
return ir;
|
|
106
|
+
}
|
|
107
|
+
export {
|
|
108
|
+
pull
|
|
109
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import {
|
|
2
|
+
decompileProjectEnhanced
|
|
3
|
+
} from "./chunk-SU4E6E7B.mjs";
|
|
4
|
+
import "./chunk-Y6FXYEAI.mjs";
|
|
5
|
+
|
|
6
|
+
// src/cli/pull.ts
|
|
7
|
+
import { mkdirSync, writeFileSync } from "fs";
|
|
8
|
+
import { join, dirname } from "path";
|
|
9
|
+
async function pull(options) {
|
|
10
|
+
const { slug, apiUrl, token } = options;
|
|
11
|
+
const outDir = options.outDir ?? slug;
|
|
12
|
+
console.log(`[mmrc pull] Fetching "${slug}" from ${apiUrl}...`);
|
|
13
|
+
const ir = await fetchDefinition(apiUrl, token, slug);
|
|
14
|
+
if (!ir) {
|
|
15
|
+
throw new Error(`Definition "${slug}" not found`);
|
|
16
|
+
}
|
|
17
|
+
console.log(` Found: ${ir.name || ir.slug} (${ir.category || "workflow"}, v${ir.version || "1.0.0"})`);
|
|
18
|
+
console.log(` Fields: ${ir.fields?.length ?? 0}, States: ${ir.states?.length ?? 0}, Transitions: ${ir.transitions?.length ?? 0}`);
|
|
19
|
+
const result = decompileProjectEnhanced(ir);
|
|
20
|
+
mkdirSync(outDir, { recursive: true });
|
|
21
|
+
const filesWritten = [];
|
|
22
|
+
for (const file of result.files) {
|
|
23
|
+
const filePath = join(outDir, file.path);
|
|
24
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
25
|
+
writeFileSync(filePath, file.content, "utf-8");
|
|
26
|
+
filesWritten.push(file.path);
|
|
27
|
+
console.log(` + ${file.path}`);
|
|
28
|
+
}
|
|
29
|
+
console.log(`
|
|
30
|
+
[mmrc pull] Scaffolded ${filesWritten.length} files in ${outDir}/`);
|
|
31
|
+
console.log(` Entry: ${result.entryFile}`);
|
|
32
|
+
console.log(`
|
|
33
|
+
Next steps:`);
|
|
34
|
+
console.log(` cd ${outDir}`);
|
|
35
|
+
console.log(` mmrc dev --src .`);
|
|
36
|
+
console.log(` # Edit files, then deploy back:`);
|
|
37
|
+
console.log(` mmrc deploy --src . --api-url ${apiUrl} --token <token>`);
|
|
38
|
+
return { slug, filesWritten, outDir };
|
|
39
|
+
}
|
|
40
|
+
async function fetchDefinition(apiUrl, token, slug) {
|
|
41
|
+
const bySlug = await tryFetch(`${apiUrl}/workflow/definitions?slug=${encodeURIComponent(slug)}`, token);
|
|
42
|
+
if (bySlug) return bySlug;
|
|
43
|
+
const bySearch = await tryFetch(`${apiUrl}/workflow/catalog/search?q=${encodeURIComponent(slug)}`, token);
|
|
44
|
+
if (bySearch) return bySearch;
|
|
45
|
+
const modulesRes = await fetch(`${apiUrl}/modules`, {
|
|
46
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
47
|
+
});
|
|
48
|
+
if (modulesRes.ok) {
|
|
49
|
+
const modules = await modulesRes.json();
|
|
50
|
+
const mod = modules.find((m) => m.module_id === slug || m.name?.toLowerCase() === slug.toLowerCase());
|
|
51
|
+
if (mod) {
|
|
52
|
+
const fullRes = await fetch(`${apiUrl}/workflow/definitions/${mod.module_id}`, {
|
|
53
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
54
|
+
});
|
|
55
|
+
if (fullRes.ok) {
|
|
56
|
+
return normalizeApiResponse(await fullRes.json());
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
async function tryFetch(url, token) {
|
|
63
|
+
try {
|
|
64
|
+
const res = await fetch(url, {
|
|
65
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
66
|
+
});
|
|
67
|
+
if (!res.ok) return null;
|
|
68
|
+
const data = await res.json();
|
|
69
|
+
if (Array.isArray(data)) {
|
|
70
|
+
if (data.length === 0) return null;
|
|
71
|
+
return normalizeApiResponse(data[0]);
|
|
72
|
+
}
|
|
73
|
+
const items = data.items ?? data.data;
|
|
74
|
+
if (items && Array.isArray(items)) {
|
|
75
|
+
if (items.length === 0) return null;
|
|
76
|
+
return normalizeApiResponse(items[0]);
|
|
77
|
+
}
|
|
78
|
+
return normalizeApiResponse(data);
|
|
79
|
+
} catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function normalizeApiResponse(def) {
|
|
84
|
+
const ir = {
|
|
85
|
+
slug: def.slug,
|
|
86
|
+
name: def.name,
|
|
87
|
+
version: def.version || "1.0.0",
|
|
88
|
+
description: def.description || "",
|
|
89
|
+
category: def.category || "workflow",
|
|
90
|
+
fields: def.fields || [],
|
|
91
|
+
states: def.states || [],
|
|
92
|
+
transitions: def.transitions || [],
|
|
93
|
+
roles: def.roles || [],
|
|
94
|
+
on_event: def.on_event || [],
|
|
95
|
+
metadata: {
|
|
96
|
+
...def.metadata || {}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const experience = def.view || def.experience || def.metadata?.experience;
|
|
100
|
+
if (experience) {
|
|
101
|
+
ir.experience = experience;
|
|
102
|
+
ir.metadata.experience = experience;
|
|
103
|
+
ir.view = experience;
|
|
104
|
+
}
|
|
105
|
+
return ir;
|
|
106
|
+
}
|
|
107
|
+
export {
|
|
108
|
+
pull
|
|
109
|
+
};
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import * as _mindmatrix_player_core from '@mindmatrix/player-core';
|
|
2
|
+
import { IRWorkflowDefinition } from '@mindmatrix/player-core';
|
|
3
|
+
|
|
4
|
+
interface CompileOptions {
|
|
5
|
+
/** Compilation mode. Default: 'infer' */
|
|
6
|
+
mode?: 'strict' | 'infer';
|
|
7
|
+
/** Override filename (affects file-type detection). */
|
|
8
|
+
filename?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Compile a .workflow.tsx source string to IR.
|
|
12
|
+
* Returns the full IRWorkflowDefinition extracted by the Babel plugin.
|
|
13
|
+
*/
|
|
14
|
+
declare function compileWorkflow(code: string, options?: CompileOptions): IRWorkflowDefinition;
|
|
15
|
+
/**
|
|
16
|
+
* Compile a model file (models/*.ts) to IR.
|
|
17
|
+
* Model files use interface-based extraction (no JSX).
|
|
18
|
+
*/
|
|
19
|
+
declare function compileModel(code: string, options?: CompileOptions): IRWorkflowDefinition;
|
|
20
|
+
/**
|
|
21
|
+
* Compile a server action file (*.server.ts) to IR.
|
|
22
|
+
*/
|
|
23
|
+
declare function compileServerAction(code: string, options?: CompileOptions): IRWorkflowDefinition;
|
|
24
|
+
/**
|
|
25
|
+
* Extract raw Babel metadata from compilation (IR + warnings + errors).
|
|
26
|
+
*/
|
|
27
|
+
declare function compileRaw(code: string, options?: CompileOptions): {
|
|
28
|
+
ir: IRWorkflowDefinition | undefined;
|
|
29
|
+
code: string | null;
|
|
30
|
+
warnings: Array<{
|
|
31
|
+
message: string;
|
|
32
|
+
code?: string;
|
|
33
|
+
}>;
|
|
34
|
+
errors: Array<{
|
|
35
|
+
message: string;
|
|
36
|
+
code?: string;
|
|
37
|
+
}>;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Mock blueprint context for testing workflow components.
|
|
41
|
+
*
|
|
42
|
+
* Provides the minimal context shape that @mindmatrix/react hooks expect.
|
|
43
|
+
* Does NOT render React — this is a data-only mock for unit testing IR output.
|
|
44
|
+
*/
|
|
45
|
+
interface MockBlueprintProviderProps {
|
|
46
|
+
/** Blueprint slug. Default: 'test-blueprint' */
|
|
47
|
+
slug?: string;
|
|
48
|
+
/** Blueprint version. Default: '1.0.0' */
|
|
49
|
+
version?: string;
|
|
50
|
+
/** Initial state data for the workflow instance. */
|
|
51
|
+
initialState?: Record<string, unknown>;
|
|
52
|
+
/** Mock definitions available in context. */
|
|
53
|
+
definitions?: IRWorkflowDefinition[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Creates a mock blueprint context value.
|
|
57
|
+
*
|
|
58
|
+
* Use this to provide context when testing hooks or components that
|
|
59
|
+
* read from BlueprintContext.
|
|
60
|
+
*/
|
|
61
|
+
declare function createMockBlueprintContext(props?: MockBlueprintProviderProps): {
|
|
62
|
+
slug: string;
|
|
63
|
+
version: string;
|
|
64
|
+
definitions: IRWorkflowDefinition[];
|
|
65
|
+
activeDefinition: IRWorkflowDefinition;
|
|
66
|
+
instanceState: Record<string, unknown>;
|
|
67
|
+
dispatch: () => void;
|
|
68
|
+
navigate: () => void;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Mock workflow provider props for testing individual workflow components.
|
|
72
|
+
*/
|
|
73
|
+
interface MockWorkflowProviderProps {
|
|
74
|
+
/** Workflow slug. Default: 'test-workflow' */
|
|
75
|
+
slug?: string;
|
|
76
|
+
/** Current state name. Default: 'draft' */
|
|
77
|
+
currentState?: string;
|
|
78
|
+
/** Field values. */
|
|
79
|
+
fields?: Record<string, unknown>;
|
|
80
|
+
/** Available transitions from current state. */
|
|
81
|
+
transitions?: string[];
|
|
82
|
+
/** Mock transition handler. */
|
|
83
|
+
onTransition?: (name: string, data?: Record<string, unknown>) => void;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Creates a mock workflow context value.
|
|
87
|
+
*
|
|
88
|
+
* Provides the shape expected by useWorkflow(), useTransition(), etc.
|
|
89
|
+
*/
|
|
90
|
+
declare function createMockWorkflowContext(props?: MockWorkflowProviderProps): {
|
|
91
|
+
slug: string;
|
|
92
|
+
currentState: string;
|
|
93
|
+
fields: Record<string, unknown>;
|
|
94
|
+
availableTransitions: string[];
|
|
95
|
+
transition: (name: string, data?: Record<string, unknown>) => void;
|
|
96
|
+
setField: (name: string, value: unknown) => void;
|
|
97
|
+
getField: (name: string) => unknown;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Convenience: compile + extract specific parts of the IR.
|
|
101
|
+
*/
|
|
102
|
+
declare function extractFields(code: string, options?: CompileOptions): _mindmatrix_player_core.IRFieldDefinition[];
|
|
103
|
+
declare function extractStates(code: string, options?: CompileOptions): _mindmatrix_player_core.IRStateDefinition[];
|
|
104
|
+
declare function extractTransitions(code: string, options?: CompileOptions): _mindmatrix_player_core.IRTransitionDefinition[];
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* IR Snapshot Utilities — snapshot and compare compiled IR for regression testing.
|
|
108
|
+
*
|
|
109
|
+
* snapshotIR() compiles a .workflow.tsx source and returns a stable, serializable
|
|
110
|
+
* IR representation suitable for vitest's toMatchSnapshot() or the custom
|
|
111
|
+
* toMatchIR() matcher.
|
|
112
|
+
*
|
|
113
|
+
* Usage:
|
|
114
|
+
* import { snapshotIR, installIRMatchers } from '@mindmatrix/react-compiler/testing';
|
|
115
|
+
*
|
|
116
|
+
* // In vitest setup or test file:
|
|
117
|
+
* installIRMatchers();
|
|
118
|
+
*
|
|
119
|
+
* it('counter IR is stable', () => {
|
|
120
|
+
* const snapshot = snapshotIR(`
|
|
121
|
+
* import { useState } from 'react';
|
|
122
|
+
* export function Counter() {
|
|
123
|
+
* const [count, setCount] = useState(0);
|
|
124
|
+
* return <div>{count}</div>;
|
|
125
|
+
* }
|
|
126
|
+
* `);
|
|
127
|
+
* expect(snapshot).toMatchSnapshot();
|
|
128
|
+
* });
|
|
129
|
+
*
|
|
130
|
+
* it('IR matches expected shape', () => {
|
|
131
|
+
* const ir = compileWorkflow(`...`);
|
|
132
|
+
* expect(ir).toMatchIR({
|
|
133
|
+
* fields: [{ name: 'count', type: 'number' }],
|
|
134
|
+
* states: expect.arrayContaining([expect.objectContaining({ name: 'draft' })]),
|
|
135
|
+
* });
|
|
136
|
+
* });
|
|
137
|
+
*/
|
|
138
|
+
|
|
139
|
+
interface IRSnapshot {
|
|
140
|
+
/** Workflow slug. */
|
|
141
|
+
slug: string;
|
|
142
|
+
/** Version. */
|
|
143
|
+
version: string;
|
|
144
|
+
/** Category. */
|
|
145
|
+
category: string;
|
|
146
|
+
/** Field names and types. */
|
|
147
|
+
fields: Array<{
|
|
148
|
+
name: string;
|
|
149
|
+
type: string;
|
|
150
|
+
required?: boolean;
|
|
151
|
+
}>;
|
|
152
|
+
/** State names and types. */
|
|
153
|
+
states: Array<{
|
|
154
|
+
name: string;
|
|
155
|
+
type: string;
|
|
156
|
+
enterActions: number;
|
|
157
|
+
exitActions: number;
|
|
158
|
+
}>;
|
|
159
|
+
/** Transition names with from→to. */
|
|
160
|
+
transitions: Array<{
|
|
161
|
+
name: string;
|
|
162
|
+
from: string | string[];
|
|
163
|
+
to: string;
|
|
164
|
+
conditions: number;
|
|
165
|
+
}>;
|
|
166
|
+
/** Whether experience (JSX) is present. */
|
|
167
|
+
hasExperience: boolean;
|
|
168
|
+
/** Extension tags present (cedar, cron, etc.). */
|
|
169
|
+
extensionTags: string[];
|
|
170
|
+
/** Number of data sources. */
|
|
171
|
+
dataSourceCount: number;
|
|
172
|
+
/** Number of mutation targets. */
|
|
173
|
+
mutationTargetCount: number;
|
|
174
|
+
/** Error count. */
|
|
175
|
+
errorCount: number;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Compile workflow source and extract a stable snapshot of its IR structure.
|
|
179
|
+
*
|
|
180
|
+
* The snapshot omits volatile data (action IDs, generated code) and keeps only
|
|
181
|
+
* the structural shape — making it safe for snapshot testing across refactors.
|
|
182
|
+
*/
|
|
183
|
+
declare function snapshotIR(code: string, options?: CompileOptions): IRSnapshot;
|
|
184
|
+
/**
|
|
185
|
+
* Convert an already-compiled IR to a snapshot.
|
|
186
|
+
*/
|
|
187
|
+
declare function irToSnapshot(ir: IRWorkflowDefinition): IRSnapshot;
|
|
188
|
+
/**
|
|
189
|
+
* Partial IR shape for matching.
|
|
190
|
+
* Every field is optional — only specified fields are checked.
|
|
191
|
+
*/
|
|
192
|
+
interface IRMatcher {
|
|
193
|
+
slug?: string;
|
|
194
|
+
version?: string;
|
|
195
|
+
category?: string;
|
|
196
|
+
fields?: Array<Record<string, unknown>>;
|
|
197
|
+
states?: Array<Record<string, unknown>>;
|
|
198
|
+
transitions?: Array<Record<string, unknown>>;
|
|
199
|
+
description?: string;
|
|
200
|
+
[key: string]: unknown;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Install the toMatchIR() custom matcher into vitest's expect.
|
|
204
|
+
*
|
|
205
|
+
* Call this once in your test setup file or at the top of a test file:
|
|
206
|
+
* import { installIRMatchers } from '@mindmatrix/react-compiler/testing';
|
|
207
|
+
* installIRMatchers();
|
|
208
|
+
*/
|
|
209
|
+
declare function installIRMatchers(): void;
|
|
210
|
+
|
|
211
|
+
export { type CompileOptions, type IRMatcher, type IRSnapshot, type MockBlueprintProviderProps, type MockWorkflowProviderProps, compileModel, compileRaw, compileServerAction, compileWorkflow, createMockBlueprintContext, createMockWorkflowContext, extractFields, extractStates, extractTransitions, installIRMatchers, irToSnapshot, snapshotIR };
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import * as _mindmatrix_player_core from '@mindmatrix/player-core';
|
|
2
|
+
import { IRWorkflowDefinition } from '@mindmatrix/player-core';
|
|
3
|
+
|
|
4
|
+
interface CompileOptions {
|
|
5
|
+
/** Compilation mode. Default: 'infer' */
|
|
6
|
+
mode?: 'strict' | 'infer';
|
|
7
|
+
/** Override filename (affects file-type detection). */
|
|
8
|
+
filename?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Compile a .workflow.tsx source string to IR.
|
|
12
|
+
* Returns the full IRWorkflowDefinition extracted by the Babel plugin.
|
|
13
|
+
*/
|
|
14
|
+
declare function compileWorkflow(code: string, options?: CompileOptions): IRWorkflowDefinition;
|
|
15
|
+
/**
|
|
16
|
+
* Compile a model file (models/*.ts) to IR.
|
|
17
|
+
* Model files use interface-based extraction (no JSX).
|
|
18
|
+
*/
|
|
19
|
+
declare function compileModel(code: string, options?: CompileOptions): IRWorkflowDefinition;
|
|
20
|
+
/**
|
|
21
|
+
* Compile a server action file (*.server.ts) to IR.
|
|
22
|
+
*/
|
|
23
|
+
declare function compileServerAction(code: string, options?: CompileOptions): IRWorkflowDefinition;
|
|
24
|
+
/**
|
|
25
|
+
* Extract raw Babel metadata from compilation (IR + warnings + errors).
|
|
26
|
+
*/
|
|
27
|
+
declare function compileRaw(code: string, options?: CompileOptions): {
|
|
28
|
+
ir: IRWorkflowDefinition | undefined;
|
|
29
|
+
code: string | null;
|
|
30
|
+
warnings: Array<{
|
|
31
|
+
message: string;
|
|
32
|
+
code?: string;
|
|
33
|
+
}>;
|
|
34
|
+
errors: Array<{
|
|
35
|
+
message: string;
|
|
36
|
+
code?: string;
|
|
37
|
+
}>;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Mock blueprint context for testing workflow components.
|
|
41
|
+
*
|
|
42
|
+
* Provides the minimal context shape that @mindmatrix/react hooks expect.
|
|
43
|
+
* Does NOT render React — this is a data-only mock for unit testing IR output.
|
|
44
|
+
*/
|
|
45
|
+
interface MockBlueprintProviderProps {
|
|
46
|
+
/** Blueprint slug. Default: 'test-blueprint' */
|
|
47
|
+
slug?: string;
|
|
48
|
+
/** Blueprint version. Default: '1.0.0' */
|
|
49
|
+
version?: string;
|
|
50
|
+
/** Initial state data for the workflow instance. */
|
|
51
|
+
initialState?: Record<string, unknown>;
|
|
52
|
+
/** Mock definitions available in context. */
|
|
53
|
+
definitions?: IRWorkflowDefinition[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Creates a mock blueprint context value.
|
|
57
|
+
*
|
|
58
|
+
* Use this to provide context when testing hooks or components that
|
|
59
|
+
* read from BlueprintContext.
|
|
60
|
+
*/
|
|
61
|
+
declare function createMockBlueprintContext(props?: MockBlueprintProviderProps): {
|
|
62
|
+
slug: string;
|
|
63
|
+
version: string;
|
|
64
|
+
definitions: IRWorkflowDefinition[];
|
|
65
|
+
activeDefinition: IRWorkflowDefinition;
|
|
66
|
+
instanceState: Record<string, unknown>;
|
|
67
|
+
dispatch: () => void;
|
|
68
|
+
navigate: () => void;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Mock workflow provider props for testing individual workflow components.
|
|
72
|
+
*/
|
|
73
|
+
interface MockWorkflowProviderProps {
|
|
74
|
+
/** Workflow slug. Default: 'test-workflow' */
|
|
75
|
+
slug?: string;
|
|
76
|
+
/** Current state name. Default: 'draft' */
|
|
77
|
+
currentState?: string;
|
|
78
|
+
/** Field values. */
|
|
79
|
+
fields?: Record<string, unknown>;
|
|
80
|
+
/** Available transitions from current state. */
|
|
81
|
+
transitions?: string[];
|
|
82
|
+
/** Mock transition handler. */
|
|
83
|
+
onTransition?: (name: string, data?: Record<string, unknown>) => void;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Creates a mock workflow context value.
|
|
87
|
+
*
|
|
88
|
+
* Provides the shape expected by useWorkflow(), useTransition(), etc.
|
|
89
|
+
*/
|
|
90
|
+
declare function createMockWorkflowContext(props?: MockWorkflowProviderProps): {
|
|
91
|
+
slug: string;
|
|
92
|
+
currentState: string;
|
|
93
|
+
fields: Record<string, unknown>;
|
|
94
|
+
availableTransitions: string[];
|
|
95
|
+
transition: (name: string, data?: Record<string, unknown>) => void;
|
|
96
|
+
setField: (name: string, value: unknown) => void;
|
|
97
|
+
getField: (name: string) => unknown;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Convenience: compile + extract specific parts of the IR.
|
|
101
|
+
*/
|
|
102
|
+
declare function extractFields(code: string, options?: CompileOptions): _mindmatrix_player_core.IRFieldDefinition[];
|
|
103
|
+
declare function extractStates(code: string, options?: CompileOptions): _mindmatrix_player_core.IRStateDefinition[];
|
|
104
|
+
declare function extractTransitions(code: string, options?: CompileOptions): _mindmatrix_player_core.IRTransitionDefinition[];
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* IR Snapshot Utilities — snapshot and compare compiled IR for regression testing.
|
|
108
|
+
*
|
|
109
|
+
* snapshotIR() compiles a .workflow.tsx source and returns a stable, serializable
|
|
110
|
+
* IR representation suitable for vitest's toMatchSnapshot() or the custom
|
|
111
|
+
* toMatchIR() matcher.
|
|
112
|
+
*
|
|
113
|
+
* Usage:
|
|
114
|
+
* import { snapshotIR, installIRMatchers } from '@mindmatrix/react-compiler/testing';
|
|
115
|
+
*
|
|
116
|
+
* // In vitest setup or test file:
|
|
117
|
+
* installIRMatchers();
|
|
118
|
+
*
|
|
119
|
+
* it('counter IR is stable', () => {
|
|
120
|
+
* const snapshot = snapshotIR(`
|
|
121
|
+
* import { useState } from 'react';
|
|
122
|
+
* export function Counter() {
|
|
123
|
+
* const [count, setCount] = useState(0);
|
|
124
|
+
* return <div>{count}</div>;
|
|
125
|
+
* }
|
|
126
|
+
* `);
|
|
127
|
+
* expect(snapshot).toMatchSnapshot();
|
|
128
|
+
* });
|
|
129
|
+
*
|
|
130
|
+
* it('IR matches expected shape', () => {
|
|
131
|
+
* const ir = compileWorkflow(`...`);
|
|
132
|
+
* expect(ir).toMatchIR({
|
|
133
|
+
* fields: [{ name: 'count', type: 'number' }],
|
|
134
|
+
* states: expect.arrayContaining([expect.objectContaining({ name: 'draft' })]),
|
|
135
|
+
* });
|
|
136
|
+
* });
|
|
137
|
+
*/
|
|
138
|
+
|
|
139
|
+
interface IRSnapshot {
|
|
140
|
+
/** Workflow slug. */
|
|
141
|
+
slug: string;
|
|
142
|
+
/** Version. */
|
|
143
|
+
version: string;
|
|
144
|
+
/** Category. */
|
|
145
|
+
category: string;
|
|
146
|
+
/** Field names and types. */
|
|
147
|
+
fields: Array<{
|
|
148
|
+
name: string;
|
|
149
|
+
type: string;
|
|
150
|
+
required?: boolean;
|
|
151
|
+
}>;
|
|
152
|
+
/** State names and types. */
|
|
153
|
+
states: Array<{
|
|
154
|
+
name: string;
|
|
155
|
+
type: string;
|
|
156
|
+
enterActions: number;
|
|
157
|
+
exitActions: number;
|
|
158
|
+
}>;
|
|
159
|
+
/** Transition names with from→to. */
|
|
160
|
+
transitions: Array<{
|
|
161
|
+
name: string;
|
|
162
|
+
from: string | string[];
|
|
163
|
+
to: string;
|
|
164
|
+
conditions: number;
|
|
165
|
+
}>;
|
|
166
|
+
/** Whether experience (JSX) is present. */
|
|
167
|
+
hasExperience: boolean;
|
|
168
|
+
/** Extension tags present (cedar, cron, etc.). */
|
|
169
|
+
extensionTags: string[];
|
|
170
|
+
/** Number of data sources. */
|
|
171
|
+
dataSourceCount: number;
|
|
172
|
+
/** Number of mutation targets. */
|
|
173
|
+
mutationTargetCount: number;
|
|
174
|
+
/** Error count. */
|
|
175
|
+
errorCount: number;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Compile workflow source and extract a stable snapshot of its IR structure.
|
|
179
|
+
*
|
|
180
|
+
* The snapshot omits volatile data (action IDs, generated code) and keeps only
|
|
181
|
+
* the structural shape — making it safe for snapshot testing across refactors.
|
|
182
|
+
*/
|
|
183
|
+
declare function snapshotIR(code: string, options?: CompileOptions): IRSnapshot;
|
|
184
|
+
/**
|
|
185
|
+
* Convert an already-compiled IR to a snapshot.
|
|
186
|
+
*/
|
|
187
|
+
declare function irToSnapshot(ir: IRWorkflowDefinition): IRSnapshot;
|
|
188
|
+
/**
|
|
189
|
+
* Partial IR shape for matching.
|
|
190
|
+
* Every field is optional — only specified fields are checked.
|
|
191
|
+
*/
|
|
192
|
+
interface IRMatcher {
|
|
193
|
+
slug?: string;
|
|
194
|
+
version?: string;
|
|
195
|
+
category?: string;
|
|
196
|
+
fields?: Array<Record<string, unknown>>;
|
|
197
|
+
states?: Array<Record<string, unknown>>;
|
|
198
|
+
transitions?: Array<Record<string, unknown>>;
|
|
199
|
+
description?: string;
|
|
200
|
+
[key: string]: unknown;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Install the toMatchIR() custom matcher into vitest's expect.
|
|
204
|
+
*
|
|
205
|
+
* Call this once in your test setup file or at the top of a test file:
|
|
206
|
+
* import { installIRMatchers } from '@mindmatrix/react-compiler/testing';
|
|
207
|
+
* installIRMatchers();
|
|
208
|
+
*/
|
|
209
|
+
declare function installIRMatchers(): void;
|
|
210
|
+
|
|
211
|
+
export { type CompileOptions, type IRMatcher, type IRSnapshot, type MockBlueprintProviderProps, type MockWorkflowProviderProps, compileModel, compileRaw, compileServerAction, compileWorkflow, createMockBlueprintContext, createMockWorkflowContext, extractFields, extractStates, extractTransitions, installIRMatchers, irToSnapshot, snapshotIR };
|