@mmapp/react-compiler 0.1.0-alpha.1 → 0.1.0-alpha.3
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 +113 -6
- 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-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-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-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-NW6555WJ.mjs +186 -0
- package/dist/chunk-OMZE6VLQ.mjs +214 -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-VCAY2KGM.mjs +175 -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 +1616 -366
- package/dist/cli/index.mjs +8 -8
- package/dist/codemod/cli.mjs +1 -1
- package/dist/codemod/index.mjs +1 -1
- 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 +982 -53
- package/dist/dev-server.mjs +5 -5
- package/dist/envelope.js +113 -6
- package/dist/envelope.mjs +3 -3
- package/dist/index.d.mts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +992 -63
- package/dist/index.mjs +8 -8
- package/{src/cli/init.ts → dist/init-7JQMAAXS.mjs} +70 -95
- 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-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-VLPR22QF.mjs +7 -0
- package/dist/pull-FUS5QYZS.mjs +109 -0
- package/dist/pull-LD5ENLGY.mjs +109 -0
- package/dist/testing/index.js +113 -6
- package/dist/testing/index.mjs +2 -2
- package/dist/vite/index.js +113 -6
- package/dist/vite/index.mjs +3 -3
- package/examples/uber-app/app/admin/fleet.tsx +19 -19
- package/package.json +4 -3
- 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/scripts/decompile.ts
DELETED
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env npx tsx
|
|
2
|
-
/**
|
|
3
|
-
* decompile.ts — Decompile a workflow definition from PostgreSQL to disk.
|
|
4
|
-
*
|
|
5
|
-
* Called by mm-api's WorkspaceManager to hydrate a workspace with the real
|
|
6
|
-
* TypeScript project decompiler instead of the simplified Rust stub.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* npx tsx packages/react-compiler/scripts/decompile.ts <definition_id> <workspace_path>
|
|
10
|
-
*
|
|
11
|
-
* Reads DATABASE_URL from mm-core/mm-server.env.
|
|
12
|
-
* Fetches the definition + child definitions from the database.
|
|
13
|
-
* Calls hydrateWorkspace() to decompile and write files to disk.
|
|
14
|
-
* Outputs a JSON result to stdout for the Rust caller to parse.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import * as fs from 'fs';
|
|
18
|
-
import * as path from 'path';
|
|
19
|
-
import { execSync } from 'child_process';
|
|
20
|
-
import pg from 'pg';
|
|
21
|
-
import { hydrateWorkspace } from '../src/decompiler/workspace-hydrator';
|
|
22
|
-
import type { DecompilerInput } from '../src/decompiler/index';
|
|
23
|
-
|
|
24
|
-
const ENV_FILE = path.resolve(__dirname, '../../../mm-core/mm-server.env');
|
|
25
|
-
|
|
26
|
-
// ── Parse DATABASE_URL from env file ─────────────────────────────────────────
|
|
27
|
-
|
|
28
|
-
function readDatabaseUrl(): string {
|
|
29
|
-
// Prefer env var if set (e.g. in CI or production)
|
|
30
|
-
if (process.env.DATABASE_URL) return process.env.DATABASE_URL;
|
|
31
|
-
|
|
32
|
-
const content = fs.readFileSync(ENV_FILE, 'utf-8');
|
|
33
|
-
for (const line of content.split('\n')) {
|
|
34
|
-
const match = line.match(/^DATABASE_URL=(.+)$/);
|
|
35
|
-
if (match) return match[1].trim();
|
|
36
|
-
}
|
|
37
|
-
throw new Error(`DATABASE_URL not found in ${ENV_FILE}`);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// ── Map DB row to DecompilerInput ────────────────────────────────────────────
|
|
41
|
-
|
|
42
|
-
interface DefinitionRow {
|
|
43
|
-
id: string;
|
|
44
|
-
slug: string;
|
|
45
|
-
name: string | null;
|
|
46
|
-
version: string | null;
|
|
47
|
-
description: string | null;
|
|
48
|
-
category: string | null;
|
|
49
|
-
states: unknown;
|
|
50
|
-
transitions: unknown;
|
|
51
|
-
fields: unknown;
|
|
52
|
-
roles: unknown;
|
|
53
|
-
experience: unknown;
|
|
54
|
-
metadata: unknown;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function rowToDecompilerInput(row: DefinitionRow): DecompilerInput {
|
|
58
|
-
return {
|
|
59
|
-
slug: row.slug,
|
|
60
|
-
name: row.name || row.slug,
|
|
61
|
-
version: row.version || '1.0.0',
|
|
62
|
-
description: row.description || undefined,
|
|
63
|
-
category: row.category || 'workflow',
|
|
64
|
-
states: Array.isArray(row.states) ? row.states : [],
|
|
65
|
-
transitions: Array.isArray(row.transitions) ? row.transitions : [],
|
|
66
|
-
fields: Array.isArray(row.fields) ? row.fields : [],
|
|
67
|
-
roles: Array.isArray(row.roles) ? row.roles : [],
|
|
68
|
-
experience: row.experience as DecompilerInput['experience'],
|
|
69
|
-
metadata: (row.metadata as Record<string, unknown>) || undefined,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// ── Main ─────────────────────────────────────────────────────────────────────
|
|
74
|
-
|
|
75
|
-
async function main() {
|
|
76
|
-
const [definitionId, workspacePath] = process.argv.slice(2);
|
|
77
|
-
|
|
78
|
-
if (!definitionId || !workspacePath) {
|
|
79
|
-
console.error('Usage: decompile.ts <definition_id> <workspace_path>');
|
|
80
|
-
process.exit(1);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Connect to database
|
|
84
|
-
const databaseUrl = readDatabaseUrl();
|
|
85
|
-
const client = new pg.Client({ connectionString: databaseUrl });
|
|
86
|
-
await client.connect();
|
|
87
|
-
|
|
88
|
-
try {
|
|
89
|
-
// Fetch the main definition
|
|
90
|
-
const { rows } = await client.query<DefinitionRow>(
|
|
91
|
-
`SELECT id, slug, name, version, description, category,
|
|
92
|
-
states, transitions, fields, roles, experience, metadata
|
|
93
|
-
FROM workflow_definitions
|
|
94
|
-
WHERE id = $1`,
|
|
95
|
-
[definitionId],
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
if (rows.length === 0) {
|
|
99
|
-
throw new Error(`Definition ${definitionId} not found`);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const mainRow = rows[0];
|
|
103
|
-
const input = rowToDecompilerInput(mainRow);
|
|
104
|
-
|
|
105
|
-
// Fetch child definitions (definitions whose parent_definition_id = this id)
|
|
106
|
-
const { rows: childRows } = await client.query<DefinitionRow>(
|
|
107
|
-
`SELECT id, slug, name, version, description, category,
|
|
108
|
-
states, transitions, fields, roles, experience, metadata
|
|
109
|
-
FROM workflow_definitions
|
|
110
|
-
WHERE parent_definition_id = $1
|
|
111
|
-
ORDER BY slug`,
|
|
112
|
-
[definitionId],
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
if (childRows.length > 0) {
|
|
116
|
-
input.childDefinitions = childRows.map(rowToDecompilerInput);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Ensure workspace directory exists
|
|
120
|
-
fs.mkdirSync(workspacePath, { recursive: true });
|
|
121
|
-
|
|
122
|
-
// Hydrate — decompile and write files to disk
|
|
123
|
-
const result = hydrateWorkspace(workspacePath, input);
|
|
124
|
-
|
|
125
|
-
// Write workspace scaffolding files (only if they don't already exist)
|
|
126
|
-
const scaffoldFiles: Record<string, string> = {
|
|
127
|
-
'package.json': JSON.stringify(
|
|
128
|
-
{
|
|
129
|
-
private: true,
|
|
130
|
-
name: 'mm-workspace',
|
|
131
|
-
version: '0.0.0',
|
|
132
|
-
dependencies: {
|
|
133
|
-
react: '^18.2.0',
|
|
134
|
-
'@mindmatrix/react': 'workspace:*',
|
|
135
|
-
},
|
|
136
|
-
devDependencies: {
|
|
137
|
-
'@types/react': '^18.2.0',
|
|
138
|
-
typescript: '^5.0.0',
|
|
139
|
-
},
|
|
140
|
-
},
|
|
141
|
-
null,
|
|
142
|
-
2,
|
|
143
|
-
) + '\n',
|
|
144
|
-
'tsconfig.json': JSON.stringify(
|
|
145
|
-
{
|
|
146
|
-
compilerOptions: {
|
|
147
|
-
target: 'ES2020',
|
|
148
|
-
module: 'ESNext',
|
|
149
|
-
lib: ['ES2020', 'DOM', 'DOM.Iterable'],
|
|
150
|
-
jsx: 'react-jsx',
|
|
151
|
-
moduleResolution: 'bundler',
|
|
152
|
-
strict: true,
|
|
153
|
-
esModuleInterop: true,
|
|
154
|
-
skipLibCheck: true,
|
|
155
|
-
forceConsistentCasingInFileNames: true,
|
|
156
|
-
resolveJsonModule: true,
|
|
157
|
-
isolatedModules: true,
|
|
158
|
-
noEmit: true,
|
|
159
|
-
baseUrl: '.',
|
|
160
|
-
paths: {
|
|
161
|
-
'@mindmatrix/react': ['./node_modules/@mindmatrix/react'],
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
include: ['**/*.ts', '**/*.tsx'],
|
|
165
|
-
},
|
|
166
|
-
null,
|
|
167
|
-
2,
|
|
168
|
-
) + '\n',
|
|
169
|
-
'.prettierrc': JSON.stringify(
|
|
170
|
-
{
|
|
171
|
-
semi: true,
|
|
172
|
-
singleQuote: true,
|
|
173
|
-
trailingComma: 'all',
|
|
174
|
-
printWidth: 100,
|
|
175
|
-
tabWidth: 2,
|
|
176
|
-
},
|
|
177
|
-
null,
|
|
178
|
-
2,
|
|
179
|
-
) + '\n',
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
for (const [filename, content] of Object.entries(scaffoldFiles)) {
|
|
183
|
-
const filePath = path.join(workspacePath, filename);
|
|
184
|
-
if (!fs.existsSync(filePath)) {
|
|
185
|
-
fs.writeFileSync(filePath, content, 'utf-8');
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// Format all generated .ts/.tsx files with prettier
|
|
190
|
-
try {
|
|
191
|
-
const prettierBin = path.resolve(__dirname, '../../../node_modules/.bin/prettier');
|
|
192
|
-
execSync(
|
|
193
|
-
`${prettierBin} --write "**/*.{ts,tsx}" --ignore-unknown 2>/dev/null`,
|
|
194
|
-
{ cwd: workspacePath, stdio: 'pipe' },
|
|
195
|
-
);
|
|
196
|
-
} catch {
|
|
197
|
-
// prettier formatting is best-effort — don't fail the decompile
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Output result as JSON for the Rust caller
|
|
201
|
-
const output = {
|
|
202
|
-
success: true,
|
|
203
|
-
slug: input.slug,
|
|
204
|
-
written: result.written,
|
|
205
|
-
skipped: result.skipped,
|
|
206
|
-
unchanged: result.unchanged,
|
|
207
|
-
totalFiles: result.decompileResult.files.length,
|
|
208
|
-
entryFile: result.decompileResult.entryFile,
|
|
209
|
-
splitTier: result.decompileResult.splitDecision.tier,
|
|
210
|
-
childDefinitions: childRows.length,
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
console.log(JSON.stringify(output));
|
|
214
|
-
} finally {
|
|
215
|
-
await client.end();
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
main().catch((err) => {
|
|
220
|
-
const output = {
|
|
221
|
-
success: false,
|
|
222
|
-
error: err.message || String(err),
|
|
223
|
-
};
|
|
224
|
-
console.log(JSON.stringify(output));
|
|
225
|
-
process.exit(1);
|
|
226
|
-
});
|
package/scripts/seed-auth.ts
DELETED
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env npx tsx
|
|
2
|
-
/**
|
|
3
|
-
* Seed Auth Module — Compiles packages/blueprint-auth/ and inserts
|
|
4
|
-
* all workflow definitions (parent module + children) into PostgreSQL.
|
|
5
|
-
*
|
|
6
|
-
* Usage: npx tsx packages/react-compiler/scripts/seed-auth.ts
|
|
7
|
-
*
|
|
8
|
-
* Reads DATABASE_URL from mm-core/mm-server.env.
|
|
9
|
-
* Compiles blueprint-auth/ via compileProject().
|
|
10
|
-
* Inserts parent definition + all child definitions (models, router).
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import * as fs from 'fs';
|
|
14
|
-
import * as path from 'path';
|
|
15
|
-
import { randomUUID } from 'crypto';
|
|
16
|
-
import pg from 'pg';
|
|
17
|
-
import { compileProject } from '../src/project-compiler';
|
|
18
|
-
|
|
19
|
-
const AUTH_DIR = path.resolve(__dirname, '../../blueprint-auth');
|
|
20
|
-
const ENV_FILE = path.resolve(__dirname, '../../../mm-core/mm-server.env');
|
|
21
|
-
|
|
22
|
-
// ── Read all .ts/.tsx files recursively ──────────────────────────────────────
|
|
23
|
-
|
|
24
|
-
function readAllFiles(dir: string, prefix = ''): Record<string, string> {
|
|
25
|
-
const result: Record<string, string> = {};
|
|
26
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
27
|
-
for (const entry of entries) {
|
|
28
|
-
if (entry.name === 'node_modules' || entry.name === 'dist') continue;
|
|
29
|
-
const relPath = prefix ? prefix + '/' + entry.name : entry.name;
|
|
30
|
-
const absPath = path.join(dir, entry.name);
|
|
31
|
-
if (entry.isDirectory()) {
|
|
32
|
-
Object.assign(result, readAllFiles(absPath, relPath));
|
|
33
|
-
} else if (/\.(ts|tsx)$/.test(entry.name)) {
|
|
34
|
-
result[relPath] = fs.readFileSync(absPath, 'utf-8');
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return result;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// ── Parse DATABASE_URL from env file ─────────────────────────────────────────
|
|
41
|
-
|
|
42
|
-
function readDatabaseUrl(): string {
|
|
43
|
-
const content = fs.readFileSync(ENV_FILE, 'utf-8');
|
|
44
|
-
for (const line of content.split('\n')) {
|
|
45
|
-
const match = line.match(/^DATABASE_URL=(.+)$/);
|
|
46
|
-
if (match) return match[1].trim();
|
|
47
|
-
}
|
|
48
|
-
throw new Error(`DATABASE_URL not found in ${ENV_FILE}`);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// ── Insert a single definition row ───────────────────────────────────────────
|
|
52
|
-
|
|
53
|
-
async function insertDefinition(
|
|
54
|
-
client: pg.Client,
|
|
55
|
-
id: string,
|
|
56
|
-
def: {
|
|
57
|
-
slug: string;
|
|
58
|
-
name: string;
|
|
59
|
-
version?: string;
|
|
60
|
-
description?: string;
|
|
61
|
-
category: string;
|
|
62
|
-
states?: unknown[];
|
|
63
|
-
transitions?: unknown[];
|
|
64
|
-
fields?: unknown[];
|
|
65
|
-
roles?: unknown[];
|
|
66
|
-
metadata?: Record<string, unknown>;
|
|
67
|
-
experience?: unknown;
|
|
68
|
-
tags?: Array<{ tag_name: string }>;
|
|
69
|
-
},
|
|
70
|
-
parentId: string | null,
|
|
71
|
-
) {
|
|
72
|
-
const experienceJson = def.experience ? JSON.stringify(def.experience) : null;
|
|
73
|
-
await client.query(
|
|
74
|
-
`INSERT INTO workflow_definitions (
|
|
75
|
-
id, slug, name, version, description, category,
|
|
76
|
-
states, transitions, fields, roles,
|
|
77
|
-
metadata, experience, view,
|
|
78
|
-
visibility, publish_status, is_immutable,
|
|
79
|
-
owner_type, is_primary_variant,
|
|
80
|
-
sub_workflow_version_strategy,
|
|
81
|
-
instantiation_count, active_instance_count,
|
|
82
|
-
fork_count, rating_sum, rating_count,
|
|
83
|
-
featured, allows_forks, allows_sub_workflow_contributions,
|
|
84
|
-
tenant_id, inline_tags,
|
|
85
|
-
parent_definition_id,
|
|
86
|
-
created_at, updated_at
|
|
87
|
-
) VALUES (
|
|
88
|
-
$1, $2, $3, $4, $5, $6,
|
|
89
|
-
$7, $8, $9, $10,
|
|
90
|
-
$11, $12, $12,
|
|
91
|
-
'PUBLIC'::"WorkflowVisibility",
|
|
92
|
-
'PUBLISHED'::"WorkflowPublishStatus",
|
|
93
|
-
false,
|
|
94
|
-
'SYSTEM'::"WorkflowOwnerType",
|
|
95
|
-
true,
|
|
96
|
-
'LATEST'::"WorkflowVersionStrategy",
|
|
97
|
-
0, 0,
|
|
98
|
-
0, 0, 0,
|
|
99
|
-
false, true, false,
|
|
100
|
-
'default', '[]'::jsonb,
|
|
101
|
-
$13,
|
|
102
|
-
NOW(), NOW()
|
|
103
|
-
)`,
|
|
104
|
-
[
|
|
105
|
-
id,
|
|
106
|
-
def.slug,
|
|
107
|
-
def.name,
|
|
108
|
-
def.version || '1.0.0',
|
|
109
|
-
def.description || null,
|
|
110
|
-
def.category || 'workflow',
|
|
111
|
-
JSON.stringify(def.states || []),
|
|
112
|
-
JSON.stringify(def.transitions || []),
|
|
113
|
-
JSON.stringify(def.fields || []),
|
|
114
|
-
JSON.stringify(def.roles || []),
|
|
115
|
-
JSON.stringify(def.metadata || {}),
|
|
116
|
-
experienceJson,
|
|
117
|
-
parentId,
|
|
118
|
-
],
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// ── Main ─────────────────────────────────────────────────────────────────────
|
|
123
|
-
|
|
124
|
-
async function main() {
|
|
125
|
-
// 1. Read source files
|
|
126
|
-
console.log('Reading blueprint-auth files...');
|
|
127
|
-
const files = readAllFiles(AUTH_DIR);
|
|
128
|
-
const fileCount = Object.keys(files).length;
|
|
129
|
-
console.log(` ${fileCount} files loaded\n`);
|
|
130
|
-
|
|
131
|
-
// 2. Compile
|
|
132
|
-
console.log('Compiling project...');
|
|
133
|
-
const result = compileProject(files);
|
|
134
|
-
|
|
135
|
-
if (result.errors.length > 0) {
|
|
136
|
-
console.warn(`\n ${result.errors.length} compilation error(s):`);
|
|
137
|
-
for (const err of result.errors) {
|
|
138
|
-
console.warn(` ${err.file}: ${err.message}`);
|
|
139
|
-
}
|
|
140
|
-
console.log();
|
|
141
|
-
}
|
|
142
|
-
if (result.warnings.length > 0) {
|
|
143
|
-
console.warn(` ${result.warnings.length} warning(s)\n`);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const parentIR = result.ir;
|
|
147
|
-
const children = result.childDefinitions;
|
|
148
|
-
|
|
149
|
-
console.log(` Parent: ${parentIR.slug} (${parentIR.category})`);
|
|
150
|
-
console.log(` Child definitions: ${children.length}`);
|
|
151
|
-
for (const child of children) {
|
|
152
|
-
console.log(` - ${child.slug} (${child.category}) — ${child.states?.length || 0} states, ${child.fields?.length || 0} fields`);
|
|
153
|
-
}
|
|
154
|
-
console.log();
|
|
155
|
-
|
|
156
|
-
// 3. Connect to database
|
|
157
|
-
const databaseUrl = readDatabaseUrl();
|
|
158
|
-
console.log('Connecting to database...');
|
|
159
|
-
const client = new pg.Client({ connectionString: databaseUrl });
|
|
160
|
-
await client.connect();
|
|
161
|
-
console.log(' Connected.\n');
|
|
162
|
-
|
|
163
|
-
try {
|
|
164
|
-
// 4. Delete any existing definitions with these slugs (idempotent re-runs)
|
|
165
|
-
const allDefs = [parentIR, ...children];
|
|
166
|
-
const allSlugs = allDefs.map(d => d.slug);
|
|
167
|
-
|
|
168
|
-
console.log('Cleaning up existing definitions...');
|
|
169
|
-
const deleteResult = await client.query(
|
|
170
|
-
`DELETE FROM workflow_definitions WHERE slug = ANY($1) RETURNING slug`,
|
|
171
|
-
[allSlugs],
|
|
172
|
-
);
|
|
173
|
-
if (deleteResult.rowCount && deleteResult.rowCount > 0) {
|
|
174
|
-
console.log(` Removed ${deleteResult.rowCount} existing row(s)\n`);
|
|
175
|
-
} else {
|
|
176
|
-
console.log(' None found (fresh insert)\n');
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// 5. Generate IDs
|
|
180
|
-
const idMap: Record<string, string> = {};
|
|
181
|
-
for (const def of allDefs) {
|
|
182
|
-
idMap[def.slug] = randomUUID();
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const parentId = idMap[parentIR.slug];
|
|
186
|
-
const childIds = children.map(c => idMap[c.slug]);
|
|
187
|
-
|
|
188
|
-
// 6. Attach child IDs to parent metadata (compiler already extracted module_manifest)
|
|
189
|
-
const parentMeta = { ...(parentIR.metadata as Record<string, unknown> || {}) };
|
|
190
|
-
parentMeta.childDefinitionIds = childIds;
|
|
191
|
-
parentMeta.childSlugs = children.map(c => c.slug);
|
|
192
|
-
|
|
193
|
-
// Ensure the compiler-extracted manifest has model slugs from actual children
|
|
194
|
-
if (parentMeta.module_manifest && typeof parentMeta.module_manifest === 'object') {
|
|
195
|
-
const manifest = parentMeta.module_manifest as Record<string, unknown>;
|
|
196
|
-
manifest.models = children.filter(c => (c.category === 'model' || c.category === 'data')).map(c => c.slug);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// 7. Insert parent (with composed experience from compiler)
|
|
200
|
-
// Fix category: compiler returns "workflow,blueprint,module" but modules endpoint expects JSON array
|
|
201
|
-
const parentCategory = typeof parentIR.category === 'string' && parentIR.category.includes(',')
|
|
202
|
-
? JSON.stringify(parentIR.category.split(','))
|
|
203
|
-
: parentIR.category;
|
|
204
|
-
|
|
205
|
-
console.log('Inserting definitions...');
|
|
206
|
-
const parentExperience = (parentIR as any).experience || null;
|
|
207
|
-
await insertDefinition(client, parentId, {
|
|
208
|
-
...parentIR,
|
|
209
|
-
category: parentCategory as string,
|
|
210
|
-
metadata: parentMeta,
|
|
211
|
-
experience: parentExperience,
|
|
212
|
-
}, null);
|
|
213
|
-
// Force category to JSON array format for modules endpoint compatibility.
|
|
214
|
-
// The pg driver converts JSON arrays to PG array syntax, so use raw SQL.
|
|
215
|
-
if (typeof parentCategory === 'string' && parentCategory.startsWith('[')) {
|
|
216
|
-
const escaped = parentCategory.replace(/'/g, "''");
|
|
217
|
-
await client.query(`UPDATE workflow_definitions SET category = '${escaped}' WHERE id = '${parentId}'`);
|
|
218
|
-
}
|
|
219
|
-
const expLabel = parentExperience ? ' [+experience]' : '';
|
|
220
|
-
console.log(` + ${parentIR.slug} (${parentIR.category})${expLabel} -> ${parentId}`);
|
|
221
|
-
|
|
222
|
-
// 8. Insert children with parent_definition_id
|
|
223
|
-
for (const child of children) {
|
|
224
|
-
const childExperience = (child as any).experience || null;
|
|
225
|
-
const childExpLabel = childExperience ? ' [+experience]' : '';
|
|
226
|
-
await insertDefinition(client, idMap[child.slug], {
|
|
227
|
-
...child,
|
|
228
|
-
experience: childExperience,
|
|
229
|
-
}, parentId);
|
|
230
|
-
console.log(` + ${child.slug} (${child.category})${childExpLabel} -> ${idMap[child.slug]}`);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
// 9. Set child_definitions array on parent
|
|
234
|
-
await client.query(
|
|
235
|
-
`UPDATE workflow_definitions SET child_definitions = $1 WHERE id = $2`,
|
|
236
|
-
[childIds, parentId],
|
|
237
|
-
);
|
|
238
|
-
|
|
239
|
-
// 10. Print summary
|
|
240
|
-
console.log('\n=== Seed Summary ===');
|
|
241
|
-
console.log(`Parent: ${parentIR.slug} -> ${parentId}`);
|
|
242
|
-
console.log(` category: ${parentIR.category}`);
|
|
243
|
-
console.log(` states: ${parentIR.states?.length || 0}`);
|
|
244
|
-
console.log(` transitions: ${parentIR.transitions?.length || 0}`);
|
|
245
|
-
console.log(` fields: ${parentIR.fields?.length || 0}`);
|
|
246
|
-
console.log(` roles: ${parentIR.roles?.length || 0}`);
|
|
247
|
-
console.log(` experience: ${parentExperience ? 'yes' : 'none'}`);
|
|
248
|
-
console.log(` children: ${childIds.length}`);
|
|
249
|
-
console.log(` page experiences: ${Object.keys(result.pageExperiences).length}`);
|
|
250
|
-
console.log();
|
|
251
|
-
|
|
252
|
-
for (const child of children) {
|
|
253
|
-
const ce = (child as any).experience;
|
|
254
|
-
console.log(`Child: ${child.slug} -> ${idMap[child.slug]}`);
|
|
255
|
-
console.log(` category: ${child.category}, states: ${child.states?.length || 0}, fields: ${child.fields?.length || 0}, experience: ${ce ? 'yes' : 'none'}`);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
console.log(`\nTotal: ${allDefs.length} definitions inserted.`);
|
|
259
|
-
} finally {
|
|
260
|
-
await client.end();
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
main().catch((err) => {
|
|
265
|
-
console.error('Seed failed:', err.message || err);
|
|
266
|
-
process.exit(1);
|
|
267
|
-
});
|