@mmapp/react-compiler 0.1.0-alpha.1 → 0.1.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ATOM-PIPELINE.md +144 -0
- package/README.md +88 -40
- package/dist/babel/index.js +2814 -277
- package/dist/babel/index.mjs +2 -2
- package/dist/chunk-3USIFFE4.mjs +2190 -0
- package/dist/chunk-45YMGEVT.mjs +186 -0
- package/dist/chunk-4FN2AISW.mjs +148 -0
- package/dist/chunk-4OPI5L7G.mjs +2593 -0
- package/dist/chunk-4RYTKOOJ.mjs +186 -0
- package/dist/chunk-52XHYD2V.mjs +214 -0
- package/dist/chunk-5GUFFFGL.mjs +148 -0
- package/dist/chunk-5RKTOVR5.mjs +244 -0
- package/dist/chunk-5YDMOO4X.mjs +214 -0
- package/dist/chunk-64ZWEMLJ.mjs +148 -0
- package/dist/chunk-6XP4KSWQ.mjs +2190 -0
- package/dist/chunk-72QWL54I.mjs +175 -0
- package/dist/chunk-7B4TRI7C.mjs +4835 -0
- package/dist/chunk-7ZKGHTNB.mjs +4952 -0
- package/dist/chunk-CIESM3BP.mjs +33 -0
- package/dist/chunk-DE3ZGQAC.mjs +148 -0
- package/dist/chunk-DMCY3BBG.mjs +1933 -0
- package/dist/chunk-DPIK3PJS.mjs +244 -0
- package/dist/chunk-E5IVH4RE.mjs +186 -0
- package/dist/chunk-E6FZNUR5.mjs +4953 -0
- package/dist/chunk-EJRBDQDP.mjs +2607 -0
- package/dist/chunk-ELO4TXJL.mjs +186 -0
- package/dist/chunk-EO6SYNCG.mjs +175 -0
- package/dist/chunk-FKRO52XH.mjs +3446 -0
- package/dist/chunk-FL4YAKU6.mjs +4941 -0
- package/dist/chunk-FYT47UBU.mjs +5076 -0
- package/dist/chunk-GCLGPOJZ.mjs +148 -0
- package/dist/chunk-GXB4JOP7.mjs +5072 -0
- package/dist/chunk-HFXOUMTD.mjs +175 -0
- package/dist/chunk-HWIZ47US.mjs +214 -0
- package/dist/chunk-IB7MNPQL.mjs +4953 -0
- package/dist/chunk-ICSIHQCG.mjs +148 -0
- package/dist/chunk-J7JUAHS4.mjs +186 -0
- package/dist/chunk-JLA5VNQ3.mjs +186 -0
- package/dist/chunk-JQLWFCTM.mjs +214 -0
- package/dist/chunk-KFJJCQAL.mjs +148 -0
- package/dist/chunk-KJUIIEQE.mjs +186 -0
- package/dist/chunk-KNWTHRVQ.mjs +175 -0
- package/dist/chunk-KSG4XSZF.mjs +175 -0
- package/dist/chunk-LF5N6DOU.mjs +175 -0
- package/dist/chunk-LJQCM2IM.mjs +214 -0
- package/dist/chunk-NTB7OEX2.mjs +2918 -0
- package/dist/chunk-NW6555WJ.mjs +186 -0
- package/dist/chunk-OMZE6VLQ.mjs +214 -0
- package/dist/chunk-OPJKP747.mjs +7506 -0
- package/dist/chunk-P4BR7WVO.mjs +2190 -0
- package/dist/chunk-QQHVYH2X.mjs +244 -0
- package/dist/chunk-S5QLWLLT.mjs +186 -0
- package/dist/chunk-SCWGT2FY.mjs +2190 -0
- package/dist/chunk-SMKJUSB3.mjs +2190 -0
- package/dist/chunk-THFYE5ZX.mjs +244 -0
- package/dist/chunk-VCAY2KGM.mjs +175 -0
- package/dist/chunk-WBYMW4NQ.mjs +3450 -0
- package/dist/chunk-WECAV6QB.mjs +148 -0
- package/dist/chunk-WMKBXUCE.mjs +3228 -0
- package/dist/chunk-XAJ5BKKL.mjs +4947 -0
- package/dist/chunk-XG2X7AEA.mjs +175 -0
- package/dist/chunk-XG7Z23NQ.mjs +148 -0
- package/dist/chunk-XWZAOCQ7.mjs +2607 -0
- package/dist/chunk-Y6MA7ULW.mjs +148 -0
- package/dist/chunk-YMS7Q7LG.mjs +214 -0
- package/dist/chunk-ZA37XTGA.mjs +175 -0
- package/dist/cli/index.js +13189 -6838
- package/dist/cli/index.mjs +140 -22
- package/dist/codemod/cli.mjs +1 -1
- package/dist/codemod/index.mjs +1 -1
- package/dist/config-PL24KEWL.mjs +219 -0
- package/dist/dev-server-RmGHIntF.d.mts +113 -0
- package/dist/dev-server-RmGHIntF.d.ts +113 -0
- package/dist/dev-server.d.mts +1 -1
- package/dist/dev-server.d.ts +1 -1
- package/dist/dev-server.js +4135 -440
- package/dist/dev-server.mjs +5 -5
- package/dist/envelope.js +2812 -275
- package/dist/envelope.mjs +3 -3
- package/dist/index.d.mts +161 -2
- package/dist/index.d.ts +161 -2
- package/dist/index.js +4429 -428
- package/dist/index.mjs +217 -9
- package/{src/cli/init.ts → dist/init-7JQMAAXS.mjs} +70 -95
- package/dist/init-DQDX3QK6.mjs +369 -0
- package/dist/init-EHO4VQ22.mjs +369 -0
- package/dist/init-UC3FWPIW.mjs +367 -0
- package/dist/init-UNSMVKIK.mjs +366 -0
- package/dist/init-UNV5XIDE.mjs +367 -0
- package/dist/project-compiler-2P4N4DR7.mjs +10 -0
- package/dist/project-compiler-D2LCC27O.mjs +10 -0
- package/dist/project-compiler-EJ3GANJE.mjs +10 -0
- package/dist/project-compiler-LOQKVRZJ.mjs +10 -0
- package/dist/project-compiler-OP2VVGJQ.mjs +10 -0
- package/dist/project-compiler-RQ6OQKRM.mjs +10 -0
- package/dist/project-compiler-VWNNCHGO.mjs +10 -0
- package/dist/project-compiler-XVAAU4C5.mjs +10 -0
- package/dist/project-compiler-YES5FGMD.mjs +10 -0
- package/dist/project-compiler-ZKMQDLGU.mjs +10 -0
- package/dist/project-decompiler-FLXCEJHS.mjs +7 -0
- package/dist/project-decompiler-US7GAVIC.mjs +7 -0
- package/dist/project-decompiler-VLPR22QF.mjs +7 -0
- package/dist/pull-FUS5QYZS.mjs +109 -0
- package/dist/pull-LD5ENLGY.mjs +109 -0
- package/dist/pull-P44LDRWB.mjs +109 -0
- package/dist/testing/index.js +2822 -285
- package/dist/testing/index.mjs +2 -2
- package/dist/verify-SEIXUGN4.mjs +1833 -0
- package/dist/vite/index.js +2815 -278
- package/dist/vite/index.mjs +3 -3
- package/examples/uber-app/app/admin/fleet.tsx +19 -19
- package/package.json +16 -6
- package/compile-blueprint-chat.mjs +0 -99
- package/compile-blueprint-glass-console.mjs +0 -98
- package/compile-chat-defs.mjs +0 -92
- package/examples/uber-app/tests/payment.test.tsx +0 -129
- package/examples/uber-app/tests/ride-flow.test.tsx +0 -123
- package/package.json.backup +0 -86
- package/scripts/decompile.ts +0 -226
- package/scripts/seed-auth.ts +0 -267
- package/scripts/seed-uber.ts +0 -248
- package/scripts/validate-uber.ts +0 -119
- package/seed-blueprint-chat.mjs +0 -444
- package/seed-blueprint-glass-console.mjs +0 -445
- package/seed-compiled.mjs +0 -318
- package/src/RoundTripValidator.ts +0 -400
- package/src/__tests__/atom-rendering-coverage.test.ts +0 -680
- package/src/__tests__/auth-module-compilation.test.ts +0 -247
- package/src/__tests__/auth-template-compilation.test.ts +0 -589
- package/src/__tests__/change-extractor.test.ts +0 -142
- package/src/__tests__/cli-pull.test.ts +0 -73
- package/src/__tests__/cli-test.test.ts +0 -72
- package/src/__tests__/component-extractor.test.ts +0 -331
- package/src/__tests__/context-extractor.test.ts +0 -145
- package/src/__tests__/decompiler.test.ts +0 -718
- package/src/__tests__/define-blueprint.test.ts +0 -133
- package/src/__tests__/definition-validator.test.ts +0 -519
- package/src/__tests__/during-extractor.test.ts +0 -152
- package/src/__tests__/effect-extractor.test.ts +0 -107
- package/src/__tests__/event-emission.test.ts +0 -127
- package/src/__tests__/examples.test.ts +0 -236
- package/src/__tests__/full-blueprint-coverage.test.ts +0 -1221
- package/src/__tests__/golden-suite.test.ts +0 -403
- package/src/__tests__/grammar-island-extractor.test.ts +0 -289
- package/src/__tests__/instance-key.test.ts +0 -82
- package/src/__tests__/ir-migration.test.ts +0 -255
- package/src/__tests__/lock-file.test.ts +0 -117
- package/src/__tests__/model-extractor.test.ts +0 -195
- package/src/__tests__/model-field-acl.test.ts +0 -237
- package/src/__tests__/model-hooks.test.ts +0 -130
- package/src/__tests__/model-ref-resolution.test.ts +0 -268
- package/src/__tests__/model-roundtrip.test.ts +0 -502
- package/src/__tests__/model-runtime.test.ts +0 -112
- package/src/__tests__/model-transitions.test.ts +0 -183
- package/src/__tests__/nrt-action-trace.test.ts +0 -391
- package/src/__tests__/pipeline-hardening.test.ts +0 -413
- package/src/__tests__/project-compiler.test.ts +0 -546
- package/src/__tests__/project-decompiler.test.ts +0 -343
- package/src/__tests__/query-compilation.test.ts +0 -145
- package/src/__tests__/round-trip/PLAN.md +0 -158
- package/src/__tests__/round-trip/README.md +0 -52
- package/src/__tests__/round-trip/RESULTS.md +0 -86
- package/src/__tests__/round-trip/fixtures/data-heavy/main.workflow.tsx +0 -55
- package/src/__tests__/round-trip/fixtures/data-heavy/mm.config.ts +0 -11
- package/src/__tests__/round-trip/fixtures/data-heavy/models/contact.ts +0 -54
- package/src/__tests__/round-trip/fixtures/full-workflow/main.workflow.tsx +0 -79
- package/src/__tests__/round-trip/fixtures/full-workflow/mm.config.ts +0 -12
- package/src/__tests__/round-trip/fixtures/full-workflow/models/order.ts +0 -50
- package/src/__tests__/round-trip/fixtures/simple-crud/main.workflow.tsx +0 -25
- package/src/__tests__/round-trip/fixtures/simple-crud/mm.config.ts +0 -11
- package/src/__tests__/round-trip/fixtures/simple-crud/models/task.ts +0 -32
- package/src/__tests__/round-trip/fixtures/view-heavy/main.workflow.tsx +0 -79
- package/src/__tests__/round-trip/fixtures/view-heavy/mm.config.ts +0 -10
- package/src/__tests__/round-trip/round-trip.test.ts +0 -2598
- package/src/__tests__/round-trip-ir.test.ts +0 -300
- package/src/__tests__/round-trip.test.ts +0 -1212
- package/src/__tests__/route-merging.test.ts +0 -372
- package/src/__tests__/router-composition.test.ts +0 -489
- package/src/__tests__/router-extractor.test.ts +0 -176
- package/src/__tests__/server-action-extractor.test.ts +0 -128
- package/src/__tests__/smart-type-inference.test.ts +0 -365
- package/src/__tests__/source-envelope.test.ts +0 -284
- package/src/__tests__/source-fidelity.test.ts +0 -516
- package/src/__tests__/state-extractor.test.ts +0 -115
- package/src/__tests__/strict-mode.test.ts +0 -227
- package/src/__tests__/transition-effect-extractor.test.ts +0 -119
- package/src/__tests__/transition-extractor.test.ts +0 -68
- package/src/__tests__/ts-to-expression.test.ts +0 -462
- package/src/__tests__/type-generator.test.ts +0 -201
- package/src/__tests__/uber-validation.test.ts +0 -502
- package/src/action-compiler.ts +0 -361
- package/src/babel/emitters/experience-transform.ts +0 -199
- package/src/babel/emitters/ir-to-tsx-emitter.ts +0 -110
- package/src/babel/emitters/pure-form-emitter.ts +0 -1023
- package/src/babel/emitters/runtime-glue-emitter.ts +0 -39
- package/src/babel/extractors/change-extractor.ts +0 -199
- package/src/babel/extractors/component-extractor.ts +0 -907
- package/src/babel/extractors/computed-extractor.ts +0 -262
- package/src/babel/extractors/context-extractor.ts +0 -277
- package/src/babel/extractors/during-extractor.ts +0 -295
- package/src/babel/extractors/effect-extractor.ts +0 -340
- package/src/babel/extractors/event-extractor.ts +0 -235
- package/src/babel/extractors/grammar-island-extractor.ts +0 -302
- package/src/babel/extractors/model-extractor.ts +0 -1018
- package/src/babel/extractors/router-extractor.ts +0 -303
- package/src/babel/extractors/server-action-extractor.ts +0 -173
- package/src/babel/extractors/server-action-hook-extractor.ts +0 -72
- package/src/babel/extractors/server-state-extractor.ts +0 -88
- package/src/babel/extractors/state-extractor.ts +0 -214
- package/src/babel/extractors/transition-effect-extractor.ts +0 -176
- package/src/babel/extractors/transition-extractor.ts +0 -143
- package/src/babel/index.ts +0 -24
- package/src/babel/transpilers/ts-to-expression.ts +0 -674
- package/src/babel/visitor.ts +0 -807
- package/src/cli/auth.ts +0 -255
- package/src/cli/build.ts +0 -288
- package/src/cli/deploy.ts +0 -206
- package/src/cli/index.ts +0 -328
- package/src/cli/installer.ts +0 -261
- package/src/cli/lock-file.ts +0 -94
- package/src/cli/mmrc.ts +0 -22
- package/src/cli/pull.ts +0 -172
- package/src/cli/registry-client.ts +0 -175
- package/src/cli/test.ts +0 -397
- package/src/cli/type-generator.ts +0 -243
- package/src/codemod/__tests__/forward.test.ts +0 -239
- package/src/codemod/__tests__/reverse.test.ts +0 -145
- package/src/codemod/__tests__/round-trip.test.ts +0 -137
- package/src/codemod/annotation.ts +0 -97
- package/src/codemod/classify.ts +0 -197
- package/src/codemod/cli.ts +0 -207
- package/src/codemod/control-flow.ts +0 -409
- package/src/codemod/forward.ts +0 -244
- package/src/codemod/import-manager.ts +0 -171
- package/src/codemod/index.ts +0 -120
- package/src/codemod/reverse.ts +0 -197
- package/src/codemod/rules.ts +0 -174
- package/src/codemod/state-transform.ts +0 -126
- package/src/decompiler/ast-builder.ts +0 -538
- package/src/decompiler/config-generator.ts +0 -151
- package/src/decompiler/index.ts +0 -315
- package/src/decompiler/project-decompiler.ts +0 -1776
- package/src/decompiler/project.ts +0 -862
- package/src/decompiler/split-strategy.ts +0 -140
- package/src/decompiler/state-emitter.ts +0 -1053
- package/src/decompiler/sx-emitter.ts +0 -318
- package/src/decompiler/workspace-hydrator.ts +0 -189
- package/src/dev-server.ts +0 -238
- package/src/envelope/fs-tree.ts +0 -217
- package/src/envelope/source-envelope.ts +0 -264
- package/src/envelope.ts +0 -315
- package/src/incremental-compiler.ts +0 -401
- package/src/index.ts +0 -99
- package/src/model-compiler.ts +0 -277
- package/src/project-compiler.ts +0 -1629
- package/src/route-extractor.ts +0 -333
- package/src/testing/index.ts +0 -32
- package/src/testing/snapshot.ts +0 -252
- package/src/testing/test-utils.ts +0 -226
- package/src/types.ts +0 -68
- package/src/vite/index.ts +0 -288
- package/test-compile.mjs +0 -142
- package/tsconfig.json +0 -25
- package/tsup.config.ts +0 -23
- package/vitest.config.ts +0 -9
package/src/index.ts
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Main entry point — @mindmatrix/react-compiler
|
|
3
|
-
*
|
|
4
|
-
* Exports all public APIs from extractors, emitters, and types.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export * from './types';
|
|
8
|
-
export { extractStates } from './babel/extractors/state-extractor';
|
|
9
|
-
export { extractEffects } from './babel/extractors/effect-extractor';
|
|
10
|
-
export { extractTransitions } from './babel/extractors/transition-extractor';
|
|
11
|
-
export { extractEvents } from './babel/extractors/event-extractor';
|
|
12
|
-
export { extractComponents } from './babel/extractors/component-extractor';
|
|
13
|
-
export { emitIR, emitPureForm, emitCanonical, emitCompiledOutput, compilerStateToWorkflow } from './babel/emitters/pure-form-emitter';
|
|
14
|
-
export { transformToFrontend } from './babel/emitters/experience-transform';
|
|
15
|
-
export type { FrontendExperienceNode, FrontendDataSource } from './babel/emitters/experience-transform';
|
|
16
|
-
export { decompileToTSX, normalizeDecompilerInput } from './babel/emitters/ir-to-tsx-emitter';
|
|
17
|
-
export { extractComputed } from './babel/extractors/computed-extractor';
|
|
18
|
-
export type { ComputedFieldExtraction } from './babel/extractors/computed-extractor';
|
|
19
|
-
export { createVisitor } from './babel/visitor';
|
|
20
|
-
|
|
21
|
-
// Re-export Babel plugin as default
|
|
22
|
-
export { default as babelPlugin } from './babel';
|
|
23
|
-
|
|
24
|
-
// Decompiler (IR → .workflow.tsx)
|
|
25
|
-
export { decompile, decompileProject, shouldDecompileAsProject } from './decompiler';
|
|
26
|
-
export type { DecompilerInput, DecompileOptions, DecompileResult, ProjectFile, DecompileProjectResult, DecompileProjectOptions } from './decompiler';
|
|
27
|
-
|
|
28
|
-
// Round-trip validator (IR → TSX → IR)
|
|
29
|
-
export { validateRoundTrip, validateSourceRoundTrip, compileSource } from './RoundTripValidator';
|
|
30
|
-
export type { RoundTripResult, RoundTripDiff } from './RoundTripValidator';
|
|
31
|
-
|
|
32
|
-
// Dev server (programmatic API)
|
|
33
|
-
export { createDevServer } from './dev-server';
|
|
34
|
-
export type { DevServerOptions, DevServerInstance } from './dev-server';
|
|
35
|
-
|
|
36
|
-
// CLI build/deploy (programmatic API)
|
|
37
|
-
export { build } from './cli/build';
|
|
38
|
-
export type { BuildOptions, BuildResult } from './cli/build';
|
|
39
|
-
export { deploy } from './cli/deploy';
|
|
40
|
-
export type { DeployOptions, DeployResult } from './cli/deploy';
|
|
41
|
-
|
|
42
|
-
// Envelope builder (content-addressed deployment bundles)
|
|
43
|
-
export { buildEnvelope } from './envelope';
|
|
44
|
-
export type { EnvelopeManifest, EnvelopeFile, BuildEnvelopeOptions, BuildEnvelopeResult } from './envelope';
|
|
45
|
-
|
|
46
|
-
// Source envelope (lower-level API)
|
|
47
|
-
export { createSourceEnvelope, computeEnvelopeId, envelopesEqual, diffEnvelopes } from './envelope/source-envelope';
|
|
48
|
-
export type { SourceEnvelope, SourceBinding, EnvelopeMetadata } from './envelope/source-envelope';
|
|
49
|
-
export { generateFsTree, detectFileRole, filterByRole, diffFsTrees } from './envelope/fs-tree';
|
|
50
|
-
export type { FsTree, FsTreeEntry, FileRole } from './envelope/fs-tree';
|
|
51
|
-
|
|
52
|
-
// Project compiler (multi-file → composed blueprint with child definitions)
|
|
53
|
-
export { compileProject, IncrementalProjectCompiler } from './project-compiler';
|
|
54
|
-
export type {
|
|
55
|
-
ProjectCompilerOptions,
|
|
56
|
-
ProjectCompilationResult,
|
|
57
|
-
ProjectCompilationError,
|
|
58
|
-
RouteTableEntry,
|
|
59
|
-
ServerActionEntry,
|
|
60
|
-
ImportLink,
|
|
61
|
-
} from './project-compiler';
|
|
62
|
-
|
|
63
|
-
// Phase 2: Model compiler
|
|
64
|
-
export { compileModel, compileModels } from './model-compiler';
|
|
65
|
-
export type { ModelCompilationResult, ModelCompilerOptions } from './model-compiler';
|
|
66
|
-
|
|
67
|
-
// Phase 2: Route extractor
|
|
68
|
-
export { extractRoutes } from './route-extractor';
|
|
69
|
-
export type {
|
|
70
|
-
RouteEntry,
|
|
71
|
-
LayoutEntry,
|
|
72
|
-
RouteExtractionResult,
|
|
73
|
-
RouteExtractorOptions,
|
|
74
|
-
} from './route-extractor';
|
|
75
|
-
|
|
76
|
-
// Phase 2: Action compiler
|
|
77
|
-
export { compileActions, resolveActionReferences } from './action-compiler';
|
|
78
|
-
export type {
|
|
79
|
-
ServerActionRegistration,
|
|
80
|
-
ActionCompilationResult,
|
|
81
|
-
ActionCompilerOptions,
|
|
82
|
-
} from './action-compiler';
|
|
83
|
-
|
|
84
|
-
// Phase 2: Incremental compiler utilities
|
|
85
|
-
export {
|
|
86
|
-
hashContent,
|
|
87
|
-
extractImports,
|
|
88
|
-
resolveImport,
|
|
89
|
-
buildDependencyGraph,
|
|
90
|
-
computeTransitiveDirtySet,
|
|
91
|
-
topologicalSort,
|
|
92
|
-
IncrementalCache,
|
|
93
|
-
} from './incremental-compiler';
|
|
94
|
-
export type {
|
|
95
|
-
FileHash,
|
|
96
|
-
IncrementalStats,
|
|
97
|
-
DependencyEdge,
|
|
98
|
-
DirtyFileSet,
|
|
99
|
-
} from './incremental-compiler';
|
package/src/model-compiler.ts
DELETED
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Model Compiler — standalone module for compiling model files into IR.
|
|
3
|
-
*
|
|
4
|
-
* Extracts TypeScript interfaces from models/*.ts files and produces
|
|
5
|
-
* category='data' IRWorkflowDefinition objects. Handles:
|
|
6
|
-
* - Interface properties → IRFieldDefinition[]
|
|
7
|
-
* - Exported `transitions` arrays/objects → IRTransitionDefinition[]
|
|
8
|
-
* - Exported `fieldOptions` → field enrichment (validation, ACL, computed)
|
|
9
|
-
* - Exported `states` → explicit state declarations
|
|
10
|
-
* - JSDoc @workflow annotations for slug, version, category
|
|
11
|
-
*
|
|
12
|
-
* This module wraps the low-level Babel model-extractor with a clean
|
|
13
|
-
* file-level API for the ProjectCompiler to consume.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { transformSync } from '@babel/core';
|
|
17
|
-
import type {
|
|
18
|
-
IRWorkflowDefinition,
|
|
19
|
-
} from '@mindmatrix/player-core';
|
|
20
|
-
import babelPlugin from './babel';
|
|
21
|
-
|
|
22
|
-
// =============================================================================
|
|
23
|
-
// Types
|
|
24
|
-
// =============================================================================
|
|
25
|
-
|
|
26
|
-
export interface ModelCompilationResult {
|
|
27
|
-
/** The compiled IR with category='data'. */
|
|
28
|
-
ir: IRWorkflowDefinition;
|
|
29
|
-
/** Interface name extracted from the model file. */
|
|
30
|
-
interfaceName: string;
|
|
31
|
-
/** Field names extracted from the interface. */
|
|
32
|
-
fieldNames: string[];
|
|
33
|
-
/** Transition names extracted from the model. */
|
|
34
|
-
transitionNames: string[];
|
|
35
|
-
/** State names (derived from transitions + explicit declarations). */
|
|
36
|
-
stateNames: string[];
|
|
37
|
-
/** Whether fieldOptions were present and applied. */
|
|
38
|
-
hasFieldOptions: boolean;
|
|
39
|
-
/** Raw field options map (for cross-file enrichment). */
|
|
40
|
-
fieldOptions: Record<string, Record<string, unknown>>;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export interface ModelCompilerOptions {
|
|
44
|
-
/** Compilation mode. Default: 'infer'. */
|
|
45
|
-
mode?: 'strict' | 'infer';
|
|
46
|
-
/** Override the slug (otherwise derived from interface name or @workflow). */
|
|
47
|
-
slugOverride?: string;
|
|
48
|
-
/** Override the category (defaults to 'data'). */
|
|
49
|
-
categoryOverride?: string;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// =============================================================================
|
|
53
|
-
// Interface Extraction (regex-based fast path)
|
|
54
|
-
// =============================================================================
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Extracts the primary exported interface name from source code.
|
|
58
|
-
* Uses regex for speed — the full Babel parse handles the real extraction.
|
|
59
|
-
*/
|
|
60
|
-
function extractInterfaceName(source: string): string {
|
|
61
|
-
const match = source.match(/export\s+interface\s+(\w+)/);
|
|
62
|
-
return match ? match[1] : 'Unknown';
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Extracts @workflow JSDoc annotation metadata from source.
|
|
67
|
-
*/
|
|
68
|
-
function extractWorkflowAnnotation(source: string): {
|
|
69
|
-
slug?: string;
|
|
70
|
-
version?: string;
|
|
71
|
-
category?: string;
|
|
72
|
-
description?: string;
|
|
73
|
-
} {
|
|
74
|
-
const result: Record<string, string> = {};
|
|
75
|
-
const workflowMatch = source.match(/@workflow\s+(.+)/);
|
|
76
|
-
if (workflowMatch) {
|
|
77
|
-
const attrs = workflowMatch[1];
|
|
78
|
-
const slugM = attrs.match(/slug="([^"]+)"/);
|
|
79
|
-
if (slugM) result.slug = slugM[1];
|
|
80
|
-
const versionM = attrs.match(/version="([^"]+)"/);
|
|
81
|
-
if (versionM) result.version = versionM[1];
|
|
82
|
-
const categoryM = attrs.match(/category="([^"]+)"/);
|
|
83
|
-
if (categoryM) result.category = categoryM[1];
|
|
84
|
-
}
|
|
85
|
-
const descMatch = source.match(/@description\s+(.+)/);
|
|
86
|
-
if (descMatch) result.description = descMatch[1].trim();
|
|
87
|
-
return result;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Extracts fieldOptions from source via regex (for metadata before full compile).
|
|
92
|
-
*/
|
|
93
|
-
function extractFieldOptionsRaw(source: string): Record<string, Record<string, unknown>> {
|
|
94
|
-
const result: Record<string, Record<string, unknown>> = {};
|
|
95
|
-
const match = source.match(/export\s+const\s+fieldOptions\s*=\s*\{([\s\S]*?)\};/);
|
|
96
|
-
if (!match) return result;
|
|
97
|
-
|
|
98
|
-
const body = match[1];
|
|
99
|
-
const fieldRegex = /(\w+)\s*:\s*\{([^}]*)\}/g;
|
|
100
|
-
let fieldMatch;
|
|
101
|
-
while ((fieldMatch = fieldRegex.exec(body)) !== null) {
|
|
102
|
-
const fieldName = fieldMatch[1];
|
|
103
|
-
const optionsBody = fieldMatch[2];
|
|
104
|
-
const opts: Record<string, unknown> = {};
|
|
105
|
-
|
|
106
|
-
const kvRegex = /(\w+)\s*:\s*(?:'([^']*)'|"([^"]*)"|\[([^\]]*)\]|(\d+(?:\.\d+)?)|(\w+))/g;
|
|
107
|
-
let kvMatch;
|
|
108
|
-
while ((kvMatch = kvRegex.exec(optionsBody)) !== null) {
|
|
109
|
-
const key = kvMatch[1];
|
|
110
|
-
const strVal = kvMatch[2] ?? kvMatch[3];
|
|
111
|
-
const arrVal = kvMatch[4];
|
|
112
|
-
const numVal = kvMatch[5];
|
|
113
|
-
const identVal = kvMatch[6];
|
|
114
|
-
|
|
115
|
-
if (strVal !== undefined) {
|
|
116
|
-
opts[key] = strVal;
|
|
117
|
-
} else if (arrVal !== undefined) {
|
|
118
|
-
opts[key] = arrVal.split(',').map(s => s.trim().replace(/['"]/g, '')).filter(Boolean);
|
|
119
|
-
} else if (numVal !== undefined) {
|
|
120
|
-
opts[key] = Number(numVal);
|
|
121
|
-
} else if (identVal !== undefined) {
|
|
122
|
-
if (identVal === 'true') opts[key] = true;
|
|
123
|
-
else if (identVal === 'false') opts[key] = false;
|
|
124
|
-
else opts[key] = identVal;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
result[fieldName] = opts;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return result;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// =============================================================================
|
|
135
|
-
// Main API
|
|
136
|
-
// =============================================================================
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Compiles a single model file (models/*.ts) into an IRWorkflowDefinition
|
|
140
|
-
* with category='data'.
|
|
141
|
-
*/
|
|
142
|
-
export function compileModel(
|
|
143
|
-
filename: string,
|
|
144
|
-
source: string,
|
|
145
|
-
options: ModelCompilerOptions = {},
|
|
146
|
-
): ModelCompilationResult {
|
|
147
|
-
const mode = options.mode || 'infer';
|
|
148
|
-
const interfaceName = extractInterfaceName(source);
|
|
149
|
-
const annotation = extractWorkflowAnnotation(source);
|
|
150
|
-
const rawFieldOptions = extractFieldOptionsRaw(source);
|
|
151
|
-
|
|
152
|
-
const parserPlugins = filename.endsWith('.tsx')
|
|
153
|
-
? (['typescript', 'jsx'] as const)
|
|
154
|
-
: (['typescript'] as const);
|
|
155
|
-
|
|
156
|
-
const babelResult = transformSync(source, {
|
|
157
|
-
filename,
|
|
158
|
-
plugins: [[babelPlugin, { mode }]],
|
|
159
|
-
parserOpts: { plugins: parserPlugins as any, attachComment: true },
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
const ir: IRWorkflowDefinition =
|
|
163
|
-
(babelResult as any)?.metadata?.mindmatrixIR ?? createEmptyModelIR(interfaceName);
|
|
164
|
-
|
|
165
|
-
// Enforce category
|
|
166
|
-
ir.category = options.categoryOverride || annotation.category || 'data';
|
|
167
|
-
|
|
168
|
-
// Apply slug override
|
|
169
|
-
if (options.slugOverride) {
|
|
170
|
-
ir.slug = options.slugOverride;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Ensure states have at least a draft/idle state
|
|
174
|
-
if (ir.states.length === 0) {
|
|
175
|
-
ir.states.push({
|
|
176
|
-
name: 'draft',
|
|
177
|
-
type: 'START',
|
|
178
|
-
on_enter: [],
|
|
179
|
-
during: [],
|
|
180
|
-
on_exit: [],
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// Ensure START state exists
|
|
185
|
-
const hasStart = ir.states.some(s => s.type === 'START');
|
|
186
|
-
if (!hasStart && ir.states.length > 0) {
|
|
187
|
-
ir.states[0].type = 'START';
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// Add data provenance metadata
|
|
191
|
-
if (!ir.metadata) ir.metadata = {};
|
|
192
|
-
const meta = ir.metadata as Record<string, unknown>;
|
|
193
|
-
meta.sourceInterface = interfaceName;
|
|
194
|
-
meta.fieldOptions = rawFieldOptions;
|
|
195
|
-
meta.provenance = {
|
|
196
|
-
frontend: 'react-compiler',
|
|
197
|
-
source: 'model',
|
|
198
|
-
compiler_version: '2.0.0',
|
|
199
|
-
};
|
|
200
|
-
|
|
201
|
-
return {
|
|
202
|
-
ir,
|
|
203
|
-
interfaceName,
|
|
204
|
-
fieldNames: ir.fields.map(f => f.name),
|
|
205
|
-
transitionNames: ir.transitions.map(t => t.name),
|
|
206
|
-
stateNames: ir.states.map(s => s.name),
|
|
207
|
-
hasFieldOptions: Object.keys(rawFieldOptions).length > 0,
|
|
208
|
-
fieldOptions: rawFieldOptions,
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Compiles multiple model files and returns all results keyed by filename.
|
|
214
|
-
*/
|
|
215
|
-
export function compileModels(
|
|
216
|
-
files: Record<string, string>,
|
|
217
|
-
options: ModelCompilerOptions = {},
|
|
218
|
-
): Map<string, ModelCompilationResult> {
|
|
219
|
-
const results = new Map<string, ModelCompilationResult>();
|
|
220
|
-
|
|
221
|
-
for (const [filename, source] of Object.entries(files)) {
|
|
222
|
-
try {
|
|
223
|
-
const compiled = compileModel(filename, source, options);
|
|
224
|
-
results.set(filename, compiled);
|
|
225
|
-
} catch (_err) {
|
|
226
|
-
const iface = extractInterfaceName(source);
|
|
227
|
-
results.set(filename, {
|
|
228
|
-
ir: createEmptyModelIR(iface),
|
|
229
|
-
interfaceName: iface,
|
|
230
|
-
fieldNames: [],
|
|
231
|
-
transitionNames: [],
|
|
232
|
-
stateNames: ['draft'],
|
|
233
|
-
hasFieldOptions: false,
|
|
234
|
-
fieldOptions: {},
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
return results;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* Creates an empty model IR for error cases.
|
|
244
|
-
*/
|
|
245
|
-
function createEmptyModelIR(interfaceName: string): IRWorkflowDefinition {
|
|
246
|
-
const slug = interfaceName
|
|
247
|
-
.replace(/([A-Z])/g, '-$1')
|
|
248
|
-
.toLowerCase()
|
|
249
|
-
.replace(/^-/, '');
|
|
250
|
-
|
|
251
|
-
return {
|
|
252
|
-
slug,
|
|
253
|
-
name: interfaceName,
|
|
254
|
-
version: '1.0.0',
|
|
255
|
-
description: 'Data model: ' + interfaceName,
|
|
256
|
-
category: 'data',
|
|
257
|
-
fields: [],
|
|
258
|
-
states: [{
|
|
259
|
-
name: 'draft',
|
|
260
|
-
type: 'START',
|
|
261
|
-
on_enter: [],
|
|
262
|
-
during: [],
|
|
263
|
-
on_exit: [],
|
|
264
|
-
}],
|
|
265
|
-
transitions: [],
|
|
266
|
-
roles: [],
|
|
267
|
-
tags: [{ tag_name: 'data' }, { tag_name: 'model' }],
|
|
268
|
-
metadata: {
|
|
269
|
-
sourceInterface: interfaceName,
|
|
270
|
-
provenance: {
|
|
271
|
-
frontend: 'react-compiler',
|
|
272
|
-
source: 'model',
|
|
273
|
-
compiler_version: '2.0.0',
|
|
274
|
-
},
|
|
275
|
-
},
|
|
276
|
-
};
|
|
277
|
-
}
|