@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
package/README.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# @mindmatrix/react-compiler
|
|
2
|
+
|
|
3
|
+
Babel plugin + Vite integration that transforms React workflow files into Pure Form (IR) JSON output.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add -D @mindmatrix/react-compiler
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### Vite Plugin
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
// vite.config.ts
|
|
17
|
+
import { defineConfig } from 'vite';
|
|
18
|
+
import { mindmatrixReact } from '@mindmatrix/react-compiler/vite';
|
|
19
|
+
|
|
20
|
+
export default defineConfig({
|
|
21
|
+
plugins: [
|
|
22
|
+
mindmatrixReact({
|
|
23
|
+
mode: 'infer',
|
|
24
|
+
include: ['**/*.workflow.tsx']
|
|
25
|
+
})
|
|
26
|
+
]
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Babel Plugin
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
// babel.config.js
|
|
34
|
+
module.exports = {
|
|
35
|
+
plugins: [
|
|
36
|
+
['@mindmatrix/react-compiler/babel', { mode: 'infer' }]
|
|
37
|
+
]
|
|
38
|
+
};
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### CLI
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Build workflows
|
|
45
|
+
pnpm mmrc build --src src/workflows --out dist/workflows
|
|
46
|
+
|
|
47
|
+
# Deploy workflows
|
|
48
|
+
pnpm mmrc deploy --api-url http://localhost:3010 --token YOUR_TOKEN
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Features
|
|
52
|
+
|
|
53
|
+
- Extract `useState` calls → IR field definitions
|
|
54
|
+
- Extract `useOnEnter`, `useOnExit` → IR action definitions
|
|
55
|
+
- Extract `useTransition` → IR transition definitions
|
|
56
|
+
- Extract `useOnEvent` → IR event subscriptions
|
|
57
|
+
- Extract JSX components → IR experience nodes
|
|
58
|
+
- Emit Pure Form JSON matching `IRWorkflowDefinition` schema
|
|
59
|
+
|
|
60
|
+
## Example
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
// src/workflows/approval.workflow.tsx
|
|
64
|
+
import { useState, useOnEnter, useTransition } from '@mindmatrix/react';
|
|
65
|
+
|
|
66
|
+
export function ApprovalWorkflow() {
|
|
67
|
+
const [status, setStatus] = useState('pending');
|
|
68
|
+
const [approver, setApprover] = useState('');
|
|
69
|
+
|
|
70
|
+
useOnEnter('approved', () => {
|
|
71
|
+
setStatus('done');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const approve = useTransition('approve');
|
|
75
|
+
|
|
76
|
+
return <div>Status: {status}</div>;
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Compiles to:
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"slug": "approval",
|
|
85
|
+
"name": "ApprovalWorkflow",
|
|
86
|
+
"version": "0.1.0",
|
|
87
|
+
"category": "workflow",
|
|
88
|
+
"fields": [
|
|
89
|
+
{ "name": "status", "type": "text", "default_value": "pending" },
|
|
90
|
+
{ "name": "approver", "type": "text", "default_value": "" }
|
|
91
|
+
],
|
|
92
|
+
"states": [
|
|
93
|
+
{
|
|
94
|
+
"name": "approved",
|
|
95
|
+
"type": "REGULAR",
|
|
96
|
+
"on_enter": [
|
|
97
|
+
{ "id": "auto_1", "type": "set_field", "mode": "auto", "config": { "field": "status", "value": "done" } }
|
|
98
|
+
],
|
|
99
|
+
"during": [],
|
|
100
|
+
"on_exit": []
|
|
101
|
+
}
|
|
102
|
+
],
|
|
103
|
+
"transitions": [
|
|
104
|
+
{ "name": "approve", "from": [], "to": "approved", "actions": [], "conditions": [] }
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
```
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compiles blueprint-chat app/ views through the same Babel plugin
|
|
3
|
+
* that handles .workflow.tsx files.
|
|
4
|
+
*
|
|
5
|
+
* Each app/ file has @workflow JSDoc + default export function →
|
|
6
|
+
* compiled to { canonical, ir } with view tree.
|
|
7
|
+
*
|
|
8
|
+
* Run from repo root: node packages/react-compiler/compile-blueprint-chat.mjs
|
|
9
|
+
*/
|
|
10
|
+
import { transformSync } from '@babel/core';
|
|
11
|
+
import { readFileSync, readdirSync, writeFileSync, mkdirSync, statSync } from 'fs';
|
|
12
|
+
import { join, dirname, relative } from 'path';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
+
const __dirname = dirname(__filename);
|
|
17
|
+
|
|
18
|
+
const plugin = await import('./dist/babel/index.mjs');
|
|
19
|
+
const babelPlugin = plugin.default;
|
|
20
|
+
|
|
21
|
+
const blueprintDir = join(__dirname, '../blueprint-chat/app');
|
|
22
|
+
const outDir = join(__dirname, '../frontend/src/workflows/compiled/blueprint-chat');
|
|
23
|
+
|
|
24
|
+
mkdirSync(outDir, { recursive: true });
|
|
25
|
+
|
|
26
|
+
// Recursively find all .tsx files in app/
|
|
27
|
+
function findTsxFiles(dir, base = '') {
|
|
28
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
29
|
+
const files = [];
|
|
30
|
+
for (const entry of entries) {
|
|
31
|
+
const relPath = base ? `${base}/${entry.name}` : entry.name;
|
|
32
|
+
if (entry.isDirectory()) {
|
|
33
|
+
files.push(...findTsxFiles(join(dir, entry.name), relPath));
|
|
34
|
+
} else if (entry.name.endsWith('.tsx')) {
|
|
35
|
+
files.push({ fullPath: join(dir, entry.name), relPath });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return files;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const files = findTsxFiles(blueprintDir);
|
|
42
|
+
console.log(`Found ${files.length} .tsx files in blueprint-chat/app/\n`);
|
|
43
|
+
|
|
44
|
+
let compiled = 0;
|
|
45
|
+
let failed = 0;
|
|
46
|
+
const results = [];
|
|
47
|
+
|
|
48
|
+
for (const { fullPath, relPath } of files) {
|
|
49
|
+
const code = readFileSync(fullPath, 'utf-8');
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
const result = transformSync(code, {
|
|
53
|
+
filename: fullPath,
|
|
54
|
+
plugins: [[babelPlugin, { mode: 'infer' }]],
|
|
55
|
+
parserOpts: { plugins: ['jsx', 'typescript'] },
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const def = result?.metadata?.mindmatrixDefinition;
|
|
59
|
+
const canonical = result?.metadata?.mindmatrixCanonical;
|
|
60
|
+
const ir = result?.metadata?.mindmatrixIR;
|
|
61
|
+
|
|
62
|
+
if (def) {
|
|
63
|
+
const combinedOutput = {
|
|
64
|
+
canonical: canonical || null,
|
|
65
|
+
ir: def,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Use the slug from the workflow annotation
|
|
69
|
+
const outFile = join(outDir, `${def.slug}.json`);
|
|
70
|
+
writeFileSync(outFile, JSON.stringify(combinedOutput, null, 2), 'utf-8');
|
|
71
|
+
console.log(` ✓ ${relPath} → ${def.slug}.json`);
|
|
72
|
+
|
|
73
|
+
// Check if view tree was extracted
|
|
74
|
+
const viewTree = def.views?.default || def.metadata?.experience;
|
|
75
|
+
if (viewTree) {
|
|
76
|
+
console.log(` view tree: ${viewTree.children?.length || 0} top-level children`);
|
|
77
|
+
} else {
|
|
78
|
+
console.log(` ⚠ no view tree extracted`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
results.push({ slug: def.slug, relPath, hasView: !!viewTree });
|
|
82
|
+
compiled++;
|
|
83
|
+
} else {
|
|
84
|
+
console.log(` ⚠ ${relPath}: no @workflow annotation or no definition generated`);
|
|
85
|
+
failed++;
|
|
86
|
+
}
|
|
87
|
+
} catch (err) {
|
|
88
|
+
console.error(` ✗ ${relPath}: ${err.message}`);
|
|
89
|
+
failed++;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
console.log(`\nCompiled: ${compiled}, Failed/Skipped: ${failed}`);
|
|
94
|
+
|
|
95
|
+
// Summary of view trees
|
|
96
|
+
console.log('\n--- View tree summary ---');
|
|
97
|
+
for (const r of results) {
|
|
98
|
+
console.log(` ${r.slug}: view=${r.hasView ? '✓' : '✗'} (${r.relPath})`);
|
|
99
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compiles blueprint-glass-console app/ views through the same Babel plugin
|
|
3
|
+
* that handles .workflow.tsx files.
|
|
4
|
+
*
|
|
5
|
+
* Each app/ file has @workflow JSDoc + default export function →
|
|
6
|
+
* compiled to { canonical, ir } with view tree.
|
|
7
|
+
*
|
|
8
|
+
* Run from repo root: node packages/react-compiler/compile-blueprint-glass-console.mjs
|
|
9
|
+
*/
|
|
10
|
+
import { transformSync } from '@babel/core';
|
|
11
|
+
import { readFileSync, readdirSync, writeFileSync, mkdirSync } from 'fs';
|
|
12
|
+
import { join, dirname } from 'path';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
+
const __dirname = dirname(__filename);
|
|
17
|
+
|
|
18
|
+
const plugin = await import('./dist/babel/index.mjs');
|
|
19
|
+
const babelPlugin = plugin.default;
|
|
20
|
+
|
|
21
|
+
const blueprintDir = join(__dirname, '../blueprint-glass-console/app');
|
|
22
|
+
const outDir = join(__dirname, '../frontend/src/workflows/compiled/blueprint-glass-console');
|
|
23
|
+
|
|
24
|
+
mkdirSync(outDir, { recursive: true });
|
|
25
|
+
|
|
26
|
+
// Recursively find all .tsx files in app/
|
|
27
|
+
function findTsxFiles(dir, base = '') {
|
|
28
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
29
|
+
const files = [];
|
|
30
|
+
for (const entry of entries) {
|
|
31
|
+
const relPath = base ? `${base}/${entry.name}` : entry.name;
|
|
32
|
+
if (entry.isDirectory()) {
|
|
33
|
+
files.push(...findTsxFiles(join(dir, entry.name), relPath));
|
|
34
|
+
} else if (entry.name.endsWith('.tsx')) {
|
|
35
|
+
files.push({ fullPath: join(dir, entry.name), relPath });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return files;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const files = findTsxFiles(blueprintDir);
|
|
42
|
+
console.log(`Found ${files.length} .tsx files in blueprint-glass-console/app/\n`);
|
|
43
|
+
|
|
44
|
+
let compiled = 0;
|
|
45
|
+
let failed = 0;
|
|
46
|
+
const results = [];
|
|
47
|
+
|
|
48
|
+
for (const { fullPath, relPath } of files) {
|
|
49
|
+
const code = readFileSync(fullPath, 'utf-8');
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
const result = transformSync(code, {
|
|
53
|
+
filename: fullPath,
|
|
54
|
+
plugins: [[babelPlugin, { mode: 'infer' }]],
|
|
55
|
+
parserOpts: { plugins: ['jsx', 'typescript'] },
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const def = result?.metadata?.mindmatrixDefinition;
|
|
59
|
+
const canonical = result?.metadata?.mindmatrixCanonical;
|
|
60
|
+
|
|
61
|
+
if (def) {
|
|
62
|
+
const combinedOutput = {
|
|
63
|
+
canonical: canonical || null,
|
|
64
|
+
ir: def,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Use the slug from the workflow annotation
|
|
68
|
+
const outFile = join(outDir, `${def.slug}.json`);
|
|
69
|
+
writeFileSync(outFile, JSON.stringify(combinedOutput, null, 2), 'utf-8');
|
|
70
|
+
console.log(` ✓ ${relPath} → ${def.slug}.json`);
|
|
71
|
+
|
|
72
|
+
// Check if view tree was extracted
|
|
73
|
+
const viewTree = def.views?.default || def.metadata?.experience;
|
|
74
|
+
if (viewTree) {
|
|
75
|
+
console.log(` view tree: ${viewTree.children?.length || 0} top-level children`);
|
|
76
|
+
} else {
|
|
77
|
+
console.log(` ⚠ no view tree extracted`);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
results.push({ slug: def.slug, relPath, hasView: !!viewTree });
|
|
81
|
+
compiled++;
|
|
82
|
+
} else {
|
|
83
|
+
console.log(` ⚠ ${relPath}: no @workflow annotation or no definition generated`);
|
|
84
|
+
failed++;
|
|
85
|
+
}
|
|
86
|
+
} catch (err) {
|
|
87
|
+
console.error(` ✗ ${relPath}: ${err.message}`);
|
|
88
|
+
failed++;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
console.log(`\nCompiled: ${compiled}, Failed/Skipped: ${failed}`);
|
|
93
|
+
|
|
94
|
+
// Summary of view trees
|
|
95
|
+
console.log('\n--- View tree summary ---');
|
|
96
|
+
for (const r of results) {
|
|
97
|
+
console.log(` ${r.slug}: view=${r.hasView ? '✓' : '✗'} (${r.relPath})`);
|
|
98
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compiles all .workflow.tsx files into engine-compatible JSON definitions.
|
|
3
|
+
* Outputs to packages/frontend/src/workflows/compiled/
|
|
4
|
+
*
|
|
5
|
+
* Each compiled output contains both:
|
|
6
|
+
* - canonical: Pure form tree per 041 protocol (THE TRUTH)
|
|
7
|
+
* - ir: Lowered IR with normalized view tree (derivable cache)
|
|
8
|
+
*
|
|
9
|
+
* Run from repo root: node packages/react-compiler/compile-chat-defs.mjs
|
|
10
|
+
*/
|
|
11
|
+
import { transformSync } from '@babel/core';
|
|
12
|
+
import { readFileSync, readdirSync, writeFileSync, mkdirSync } from 'fs';
|
|
13
|
+
import { join, dirname } from 'path';
|
|
14
|
+
import { fileURLToPath } from 'url';
|
|
15
|
+
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
|
|
19
|
+
const plugin = await import('./dist/babel/index.mjs');
|
|
20
|
+
const babelPlugin = plugin.default;
|
|
21
|
+
|
|
22
|
+
const workflowDir = join(__dirname, '../frontend/src/workflows');
|
|
23
|
+
const outDir = join(__dirname, '../frontend/src/workflows/compiled');
|
|
24
|
+
|
|
25
|
+
const files = readdirSync(workflowDir).filter(f => f.endsWith('.workflow.tsx'));
|
|
26
|
+
|
|
27
|
+
mkdirSync(outDir, { recursive: true });
|
|
28
|
+
|
|
29
|
+
let compiled = 0;
|
|
30
|
+
const slugs = [];
|
|
31
|
+
|
|
32
|
+
for (const file of files) {
|
|
33
|
+
const filePath = join(workflowDir, file);
|
|
34
|
+
const code = readFileSync(filePath, 'utf-8');
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
const result = transformSync(code, {
|
|
38
|
+
filename: filePath,
|
|
39
|
+
plugins: [[babelPlugin, { mode: 'infer' }]],
|
|
40
|
+
parserOpts: { plugins: ['jsx', 'typescript'] },
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const def = result?.metadata?.mindmatrixDefinition;
|
|
44
|
+
const canonical = result?.metadata?.mindmatrixCanonical;
|
|
45
|
+
|
|
46
|
+
if (def) {
|
|
47
|
+
// Output combined format: { canonical, ir }
|
|
48
|
+
const combinedOutput = {
|
|
49
|
+
canonical: canonical || null,
|
|
50
|
+
ir: def,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const outFile = join(outDir, `${def.slug}.json`);
|
|
54
|
+
writeFileSync(outFile, JSON.stringify(combinedOutput, null, 2), 'utf-8');
|
|
55
|
+
console.log(` ✓ ${file} → ${def.slug}.json (canonical + ir)`);
|
|
56
|
+
slugs.push(def.slug);
|
|
57
|
+
compiled++;
|
|
58
|
+
} else {
|
|
59
|
+
console.error(` ✗ ${file}: no definition generated`);
|
|
60
|
+
}
|
|
61
|
+
} catch (err) {
|
|
62
|
+
console.error(` ✗ ${file}: ${err.message}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Generate index.ts that re-exports all definitions
|
|
67
|
+
const indexContent = [
|
|
68
|
+
'// Auto-generated by compile-chat-defs.mjs — do not edit manually',
|
|
69
|
+
`// Compiled from ${files.length} .workflow.tsx files`,
|
|
70
|
+
'',
|
|
71
|
+
...slugs.map(slug => {
|
|
72
|
+
const varName = slug.replace(/-/g, '_').replace(/^mm_/, 'mm');
|
|
73
|
+
return `import ${varName}Def from './${slug}.json';`;
|
|
74
|
+
}),
|
|
75
|
+
'',
|
|
76
|
+
'export const compiledDefinitions: Record<string, unknown> = {',
|
|
77
|
+
...slugs.map(slug => {
|
|
78
|
+
const varName = slug.replace(/-/g, '_').replace(/^mm_/, 'mm');
|
|
79
|
+
return ` '${slug}': ${varName}Def,`;
|
|
80
|
+
}),
|
|
81
|
+
'};',
|
|
82
|
+
'',
|
|
83
|
+
...slugs.map(slug => {
|
|
84
|
+
const varName = slug.replace(/-/g, '_').replace(/^mm_/, 'mm');
|
|
85
|
+
return `export { default as ${varName}Def } from './${slug}.json';`;
|
|
86
|
+
}),
|
|
87
|
+
'',
|
|
88
|
+
].join('\n');
|
|
89
|
+
|
|
90
|
+
writeFileSync(join(outDir, 'index.ts'), indexContent);
|
|
91
|
+
console.log(`\n ✓ index.ts generated (${slugs.length} definitions)`);
|
|
92
|
+
console.log(`\nCompiled ${compiled} workflow definitions`);
|