@mmapp/react-compiler 0.1.0-alpha.6 → 0.1.0-alpha.7

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.
@@ -5993,8 +5993,12 @@ function extractStaticObj(obj) {
5993
5993
  return result;
5994
5994
  }
5995
5995
 
5996
- // src/babel/emitters/pure-form-emitter.ts
5997
- var import_player_core = require("@mindmatrix/player-core");
5996
+ // ../player-core/dist/index.mjs
5997
+ function normalizeCategory(primary, ...tags) {
5998
+ const uniqueTags = [...new Set(tags.filter((t22) => t22 !== primary))];
5999
+ uniqueTags.sort();
6000
+ return [primary, ...uniqueTags];
6001
+ }
5998
6002
 
5999
6003
  // src/babel/emitters/experience-transform.ts
6000
6004
  function transformToFrontend(node) {
@@ -6387,7 +6391,7 @@ function liftAction(action) {
6387
6391
  }
6388
6392
  return {
6389
6393
  slug: action.id,
6390
- category: (0, import_player_core.normalizeCategory)("expression", "mutation", action.type),
6394
+ category: normalizeCategory("expression", "mutation", action.type),
6391
6395
  parts: parts.length > 0 ? parts : void 0
6392
6396
  };
6393
6397
  }
@@ -6417,7 +6421,7 @@ function liftSchedule(during) {
6417
6421
  for (const action of during.actions) {
6418
6422
  parts.push({
6419
6423
  slug: "do",
6420
- category: (0, import_player_core.normalizeCategory)("expression", "mutation", action.type),
6424
+ category: normalizeCategory("expression", "mutation", action.type),
6421
6425
  parts: Object.entries(action.config || {}).map(([key, value]) => ({
6422
6426
  slug: key,
6423
6427
  category: ["atom"],
@@ -6427,7 +6431,7 @@ function liftSchedule(during) {
6427
6431
  }
6428
6432
  return {
6429
6433
  slug: during.id,
6430
- category: (0, import_player_core.normalizeCategory)("schedule", during.type),
6434
+ category: normalizeCategory("schedule", during.type),
6431
6435
  parts
6432
6436
  };
6433
6437
  }
@@ -6440,14 +6444,14 @@ function liftState(state) {
6440
6444
  if (state.on_enter && state.on_enter.length > 0) {
6441
6445
  parts.push({
6442
6446
  slug: "on_enter",
6443
- category: (0, import_player_core.normalizeCategory)("expression", "sequence"),
6447
+ category: normalizeCategory("expression", "sequence"),
6444
6448
  parts: state.on_enter.map(liftAction)
6445
6449
  });
6446
6450
  }
6447
6451
  if (state.on_exit && state.on_exit.length > 0) {
6448
6452
  parts.push({
6449
6453
  slug: "on_exit",
6450
- category: (0, import_player_core.normalizeCategory)("expression", "sequence"),
6454
+ category: normalizeCategory("expression", "sequence"),
6451
6455
  parts: state.on_exit.map(liftAction)
6452
6456
  });
6453
6457
  }
@@ -6458,7 +6462,7 @@ function liftState(state) {
6458
6462
  }
6459
6463
  return {
6460
6464
  slug: state.name,
6461
- category: (0, import_player_core.normalizeCategory)("state", ...tags),
6465
+ category: normalizeCategory("state", ...tags),
6462
6466
  parts: parts.length > 0 ? parts : void 0
6463
6467
  };
6464
6468
  }
@@ -6481,17 +6485,17 @@ function liftTransition(transition) {
6481
6485
  if (transition.actions && transition.actions.length > 0) {
6482
6486
  parts.push({
6483
6487
  slug: "actions",
6484
- category: (0, import_player_core.normalizeCategory)("expression", "sequence"),
6488
+ category: normalizeCategory("expression", "sequence"),
6485
6489
  parts: transition.actions.map(liftAction)
6486
6490
  });
6487
6491
  }
6488
6492
  if (transition.conditions && transition.conditions.length > 0) {
6489
6493
  parts.push({
6490
6494
  slug: "conditions",
6491
- category: (0, import_player_core.normalizeCategory)("expression", "guard"),
6495
+ category: normalizeCategory("expression", "guard"),
6492
6496
  parts: transition.conditions.map((c, i) => ({
6493
6497
  slug: `condition_${i}`,
6494
- category: (0, import_player_core.normalizeCategory)("expression", c.type || "condition"),
6498
+ category: normalizeCategory("expression", c.type || "condition"),
6495
6499
  parts: c.expression ? [{ slug: c.expression, category: ["binding"] }] : void 0
6496
6500
  }))
6497
6501
  });
@@ -6530,7 +6534,7 @@ function liftField(field) {
6530
6534
  }
6531
6535
  return {
6532
6536
  slug: field.name,
6533
- category: (0, import_player_core.normalizeCategory)("field", field.type),
6537
+ category: normalizeCategory("field", field.type),
6534
6538
  parts: parts.length > 0 ? parts : void 0
6535
6539
  };
6536
6540
  }
@@ -6553,20 +6557,20 @@ function liftView(node) {
6553
6557
  if (match) {
6554
6558
  parts.push({
6555
6559
  slug: key,
6556
- category: (0, import_player_core.normalizeCategory)("expression", "effect", "transition"),
6560
+ category: normalizeCategory("expression", "effect", "transition"),
6557
6561
  parts: [{ slug: match[1], category: ["ref"] }]
6558
6562
  });
6559
6563
  } else {
6560
6564
  parts.push({
6561
6565
  slug: key,
6562
- category: (0, import_player_core.normalizeCategory)("expression", "binding"),
6566
+ category: normalizeCategory("expression", "binding"),
6563
6567
  parts: [{ slug: String(expr), category: ["binding"] }]
6564
6568
  });
6565
6569
  }
6566
6570
  } else {
6567
6571
  parts.push({
6568
6572
  slug: key,
6569
- category: (0, import_player_core.normalizeCategory)("expression", "binding"),
6573
+ category: normalizeCategory("expression", "binding"),
6570
6574
  parts: [{ slug: String(expr), category: ["binding"] }]
6571
6575
  });
6572
6576
  }
@@ -6577,20 +6581,20 @@ function liftView(node) {
6577
6581
  if (eqMatch) {
6578
6582
  parts.push({
6579
6583
  slug: "visible_when",
6580
- category: (0, import_player_core.normalizeCategory)("expression", "guard"),
6584
+ category: normalizeCategory("expression", "guard"),
6581
6585
  parts: [{
6582
6586
  slug: "body",
6583
- category: (0, import_player_core.normalizeCategory)("expression", "eq"),
6587
+ category: normalizeCategory("expression", "eq"),
6584
6588
  parts: [
6585
- { slug: "lhs", category: (0, import_player_core.normalizeCategory)("expression", "path"), parts: [{ slug: eqMatch[1], category: ["binding"] }] },
6586
- { slug: "rhs", category: (0, import_player_core.normalizeCategory)("expression", "literal"), parts: [{ slug: eqMatch[2], category: ["literal"] }] }
6589
+ { slug: "lhs", category: normalizeCategory("expression", "path"), parts: [{ slug: eqMatch[1], category: ["binding"] }] },
6590
+ { slug: "rhs", category: normalizeCategory("expression", "literal"), parts: [{ slug: eqMatch[2], category: ["literal"] }] }
6587
6591
  ]
6588
6592
  }]
6589
6593
  });
6590
6594
  } else {
6591
6595
  parts.push({
6592
6596
  slug: "visible_when",
6593
- category: (0, import_player_core.normalizeCategory)("expression", "guard"),
6597
+ category: normalizeCategory("expression", "guard"),
6594
6598
  parts: [{ slug: node.visible_when, category: ["binding"] }]
6595
6599
  });
6596
6600
  }
@@ -6602,7 +6606,7 @@ function liftView(node) {
6602
6606
  }
6603
6607
  return {
6604
6608
  slug: node.id,
6605
- category: (0, import_player_core.normalizeCategory)("view", componentTag),
6609
+ category: normalizeCategory("view", componentTag),
6606
6610
  parts: parts.length > 0 ? parts : void 0
6607
6611
  };
6608
6612
  }
@@ -6623,7 +6627,7 @@ function emitCanonical(extracted, sourceFilename) {
6623
6627
  }
6624
6628
  parts.push({
6625
6629
  slug: "manifest",
6626
- category: (0, import_player_core.normalizeCategory)("meta", "manifest"),
6630
+ category: normalizeCategory("meta", "manifest"),
6627
6631
  parts: [
6628
6632
  {
6629
6633
  slug: "workflows",
@@ -6644,7 +6648,7 @@ function emitCanonical(extracted, sourceFilename) {
6644
6648
  let categoryArray;
6645
6649
  if (category.includes("/")) {
6646
6650
  const [primary, ...tags] = category.split("/");
6647
- categoryArray = (0, import_player_core.normalizeCategory)(primary, ...tags);
6651
+ categoryArray = normalizeCategory(primary, ...tags);
6648
6652
  } else {
6649
6653
  categoryArray = [category];
6650
6654
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  babelPlugin
3
- } from "../chunk-OPJKP747.mjs";
3
+ } from "../chunk-7JRAEFRB.mjs";
4
4
  import "../chunk-CIESM3BP.mjs";
5
5
  export {
6
6
  babelPlugin as default
@@ -0,0 +1,244 @@
1
+ import {
2
+ createSourceEnvelope,
3
+ generateFsTree
4
+ } from "./chunk-5M7DKKBC.mjs";
5
+ import {
6
+ babelPlugin
7
+ } from "./chunk-7JRAEFRB.mjs";
8
+
9
+ // src/cli/build.ts
10
+ import { glob } from "glob";
11
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
12
+ import { transformSync } from "@babel/core";
13
+ import { join, basename, dirname, resolve } from "path";
14
+ import { execSync } from "child_process";
15
+ async function build(options = {}) {
16
+ const srcDir = options.src ?? "src/workflows";
17
+ const outDir = options.outDir ?? "dist/workflows";
18
+ const mode = options.mode ?? "infer";
19
+ if (!options.skipTypeCheck) {
20
+ const tsconfigPath = resolve(srcDir, "tsconfig.json");
21
+ const hasTsconfig = existsSync(tsconfigPath);
22
+ if (hasTsconfig) {
23
+ console.log(`[mindmatrix-react] Type checking (tsc --noEmit)...`);
24
+ try {
25
+ execSync(`npx tsc --noEmit --project ${tsconfigPath}`, {
26
+ cwd: resolve(srcDir),
27
+ stdio: "pipe",
28
+ encoding: "utf-8"
29
+ });
30
+ console.log(`[mindmatrix-react] Type check passed.`);
31
+ } catch (err) {
32
+ const tscError = err;
33
+ const output = tscError.stdout || tscError.stderr || "";
34
+ const lines = output.split("\n").filter((l) => l.trim());
35
+ const typeErrors = [];
36
+ for (const line of lines) {
37
+ const match = line.match(/^(.+?)\((\d+),\d+\):\s*error\s+(TS\d+):\s*(.+)$/);
38
+ if (match) {
39
+ typeErrors.push({
40
+ file: match[1],
41
+ message: `${match[3]}: ${match[4]}`,
42
+ line: parseInt(match[2], 10)
43
+ });
44
+ }
45
+ }
46
+ if (typeErrors.length > 0) {
47
+ console.error(`
48
+ [mindmatrix-react] Type check failed with ${typeErrors.length} error(s):
49
+ `);
50
+ for (const te of typeErrors) {
51
+ console.error(` \u2717 ${te.file}:${te.line || "?"} ${te.message}`);
52
+ }
53
+ console.error(`
54
+ [mindmatrix-react] Fix type errors or use --skip-type-check to bypass.
55
+ `);
56
+ return {
57
+ compiled: 0,
58
+ errors: typeErrors.length,
59
+ warnings: 0,
60
+ definitions: [],
61
+ errorDetails: typeErrors
62
+ };
63
+ } else {
64
+ console.error(`
65
+ [mindmatrix-react] Type check failed:
66
+ ${output}`);
67
+ return {
68
+ compiled: 0,
69
+ errors: 1,
70
+ warnings: 0,
71
+ definitions: [],
72
+ errorDetails: [{ file: "tsconfig.json", message: output.slice(0, 500) }]
73
+ };
74
+ }
75
+ }
76
+ }
77
+ }
78
+ const configPath = resolve(srcDir, "mm.config.ts");
79
+ if (existsSync(configPath)) {
80
+ console.log(`[mindmatrix-react] Detected mm.config.ts \u2014 using project compiler...`);
81
+ const { compileProject } = await import("./project-compiler-NNK32MPG.mjs");
82
+ const allProjectFiles = await glob(`${srcDir}/**/*.{ts,tsx}`, {
83
+ ignore: ["**/node_modules/**", "**/dist/**", "**/__tests__/**", "**/*.test.*"]
84
+ });
85
+ const fileMap = {};
86
+ for (const f of allProjectFiles) {
87
+ const rel = f.startsWith(srcDir + "/") ? f.slice(srcDir.length + 1) : f;
88
+ fileMap[rel] = readFileSync(f, "utf-8");
89
+ }
90
+ mkdirSync(outDir, { recursive: true });
91
+ const result2 = compileProject(fileMap, { mode });
92
+ const errors = result2.errors.filter((e) => e.severity === "error");
93
+ const warnings = result2.errors.filter((e) => e.severity === "warning");
94
+ const definitions2 = [result2.ir];
95
+ const errorDetails2 = [];
96
+ for (const err of errors) {
97
+ errorDetails2.push({ file: err.file, message: err.message, line: err.line });
98
+ console.error(` x ${err.file}${err.line ? `:${err.line}` : ""} ${err.message}`);
99
+ }
100
+ for (const warn of warnings) {
101
+ console.warn(` ! ${warn.file}${warn.line ? `:${warn.line}` : ""} ${warn.message}`);
102
+ }
103
+ const irPath = join(outDir, `${result2.ir.slug}.workflow.json`);
104
+ writeFileSync(irPath, JSON.stringify(result2.ir, null, 2), "utf-8");
105
+ console.log(` + ${basename(irPath)}`);
106
+ const seenSlugs = /* @__PURE__ */ new Set([result2.ir.slug]);
107
+ for (const child of result2.childDefinitions) {
108
+ if (seenSlugs.has(child.slug)) continue;
109
+ seenSlugs.add(child.slug);
110
+ definitions2.push(child);
111
+ const childPath = join(outDir, `${child.slug}.workflow.json`);
112
+ writeFileSync(childPath, JSON.stringify(child, null, 2), "utf-8");
113
+ console.log(` + ${basename(childPath)}`);
114
+ }
115
+ console.log(`
116
+ [mindmatrix-react] Compiled ${definitions2.length} definitions, ${errors.length} errors, ${warnings.length} warnings`);
117
+ return { compiled: definitions2.length, errors: errors.length, warnings: warnings.length, definitions: definitions2, errorDetails: errorDetails2 };
118
+ }
119
+ console.log(`[mindmatrix-react] Building workflows from ${srcDir}...`);
120
+ mkdirSync(outDir, { recursive: true });
121
+ const workflowFiles = await glob(`${srcDir}/**/*.workflow.{tsx,ts,jsx,js}`);
122
+ const modelFiles = await glob(`${srcDir}/**/models/**/*.{ts,tsx}`);
123
+ const serverFiles = await glob(`${srcDir}/**/*.server.{ts,tsx,js,jsx}`);
124
+ const allFiles = [.../* @__PURE__ */ new Set([...workflowFiles, ...modelFiles, ...serverFiles])];
125
+ if (allFiles.length === 0) {
126
+ console.log(`[mindmatrix-react] No workflow files found in ${srcDir}`);
127
+ return { compiled: 0, errors: 0, warnings: 0, definitions: [], errorDetails: [] };
128
+ }
129
+ let compiled = 0;
130
+ let errorCount = 0;
131
+ let warningCount = 0;
132
+ const definitions = [];
133
+ const errorDetails = [];
134
+ for (const file of allFiles) {
135
+ try {
136
+ const code = readFileSync(file, "utf-8");
137
+ const result2 = transformSync(code, {
138
+ filename: file,
139
+ plugins: [[babelPlugin, { mode }]],
140
+ parserOpts: { plugins: ["jsx", "typescript"], attachComment: true }
141
+ });
142
+ const ir = result2?.metadata?.mindmatrixIR;
143
+ const definition = result2?.metadata?.mindmatrixDefinition;
144
+ const canonical = result2?.metadata?.mindmatrixCanonical;
145
+ if (ir) {
146
+ definitions.push(ir);
147
+ const irErrors = ir.metadata?.errors;
148
+ const irWarnings = ir.metadata?.warnings;
149
+ if (irErrors && irErrors.length > 0) {
150
+ for (const err of irErrors) {
151
+ errorDetails.push({
152
+ file: basename(file),
153
+ message: err.message,
154
+ line: err.line
155
+ });
156
+ console.error(` \u2717 ${basename(file)}:${err.line || "?"} ${err.message}`);
157
+ }
158
+ errorCount += irErrors.length;
159
+ }
160
+ if (irWarnings && irWarnings.length > 0) {
161
+ for (const warn of irWarnings) {
162
+ console.warn(` \u26A0 ${basename(file)}:${warn.line || "?"} ${warn.message}`);
163
+ }
164
+ warningCount += irWarnings.length;
165
+ }
166
+ const compiledFileName = basename(file).replace(/\.workflow\.(tsx?|jsx?)$/, ".json").replace(/\.(tsx?|jsx?)$/, ".json");
167
+ const compiledFile = join(outDir, compiledFileName);
168
+ mkdirSync(dirname(compiledFile), { recursive: true });
169
+ writeFileSync(compiledFile, JSON.stringify({ canonical, ir }, null, 2), "utf-8");
170
+ const irFileName = basename(file).replace(/\.workflow\.(tsx?|jsx?)$/, ".workflow.json").replace(/\.(tsx?|jsx?)$/, ".json");
171
+ const irFile = join(outDir, irFileName);
172
+ writeFileSync(irFile, JSON.stringify(ir, null, 2), "utf-8");
173
+ if (definition) {
174
+ const defFileName = basename(file).replace(/\.workflow\.(tsx?|jsx?)$/, ".def.json").replace(/\.(tsx?|jsx?)$/, ".def.json");
175
+ const defFile = join(outDir, defFileName);
176
+ writeFileSync(defFile, JSON.stringify(definition, null, 2), "utf-8");
177
+ }
178
+ console.log(` \u2713 ${basename(file)} \u2192 ${compiledFileName}`);
179
+ compiled++;
180
+ } else {
181
+ console.error(` \u2717 ${basename(file)}: No IR generated`);
182
+ errorDetails.push({ file: basename(file), message: "No IR generated" });
183
+ errorCount++;
184
+ }
185
+ } catch (error) {
186
+ const msg = error.message;
187
+ console.error(` \u2717 ${basename(file)}: ${msg}`);
188
+ errorDetails.push({ file: basename(file), message: msg });
189
+ errorCount++;
190
+ }
191
+ }
192
+ if (options.envelope) {
193
+ const allSourceFiles = await glob(`${srcDir}/**/*.{ts,tsx,js,jsx}`);
194
+ const fsTree = generateFsTree(allSourceFiles, resolve(srcDir));
195
+ const envelope = createSourceEnvelope({
196
+ blueprintSlug: options.slug || "project",
197
+ blueprintVersion: options.version || "0.1.0",
198
+ definitions,
199
+ fsTree,
200
+ mode
201
+ });
202
+ const envelopePath = join(outDir, "envelope.json");
203
+ writeFileSync(envelopePath, JSON.stringify(envelope, null, 2), "utf-8");
204
+ console.log(`
205
+ \u2713 Source envelope \u2192 envelope.json (${envelope.envelopeId.substring(0, 8)})`);
206
+ }
207
+ console.log(`
208
+ [mindmatrix-react] Compiled ${compiled} workflows, ${errorCount} errors, ${warningCount} warnings`);
209
+ const result = { compiled, errors: errorCount, warnings: warningCount, definitions, errorDetails };
210
+ if (options.watch) {
211
+ await startWatchMode(options);
212
+ }
213
+ return result;
214
+ }
215
+ async function startWatchMode(options) {
216
+ const { watch: fsWatch } = await import("fs");
217
+ const srcDir = options.src ?? "src/workflows";
218
+ let debounce = null;
219
+ console.log(`
220
+ [mindmatrix-react] Watching ${srcDir} for changes... (Ctrl+C to stop)
221
+ `);
222
+ fsWatch(srcDir, { recursive: true }, (_event, filename) => {
223
+ if (!filename) return;
224
+ if (!filename.match(/\.(tsx?|jsx?)$/)) return;
225
+ if (filename.includes("node_modules") || filename.includes("dist")) return;
226
+ if (debounce) clearTimeout(debounce);
227
+ debounce = setTimeout(async () => {
228
+ const ts = (/* @__PURE__ */ new Date()).toLocaleTimeString();
229
+ console.log(`
230
+ [${ts}] Change detected: ${filename} \u2014 recompiling...`);
231
+ try {
232
+ await build({ ...options, watch: false, skipTypeCheck: true });
233
+ } catch (e) {
234
+ console.error(`[mindmatrix-react] Rebuild failed:`, e.message);
235
+ }
236
+ }, 300);
237
+ });
238
+ return new Promise(() => {
239
+ });
240
+ }
241
+
242
+ export {
243
+ build
244
+ };