@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.
- package/dist/babel/index.js +27 -23
- package/dist/babel/index.mjs +1 -1
- package/dist/chunk-5FTDWKHH.mjs +244 -0
- package/dist/chunk-7JRAEFRB.mjs +7510 -0
- package/dist/chunk-HRYR54PT.mjs +175 -0
- package/dist/chunk-O4AUS7EU.mjs +148 -0
- package/dist/chunk-Z2G5RZ4H.mjs +186 -0
- package/dist/chunk-ZE3KCHBM.mjs +2918 -0
- package/dist/cli/index.js +35 -23
- package/dist/cli/index.mjs +5 -5
- package/dist/dev-server.js +35 -23
- package/dist/dev-server.mjs +4 -4
- package/dist/envelope.js +27 -23
- package/dist/envelope.mjs +2 -2
- package/dist/index.js +35 -23
- package/dist/index.mjs +6 -6
- package/dist/project-compiler-NNK32MPG.mjs +10 -0
- package/dist/testing/index.js +27 -23
- package/dist/testing/index.mjs +1 -1
- package/dist/verify-BYHUKARQ.mjs +1833 -0
- package/dist/vite/index.js +27 -23
- package/dist/vite/index.mjs +2 -2
- package/package.json +5 -2
package/dist/babel/index.js
CHANGED
|
@@ -5993,8 +5993,12 @@ function extractStaticObj(obj) {
|
|
|
5993
5993
|
return result;
|
|
5994
5994
|
}
|
|
5995
5995
|
|
|
5996
|
-
//
|
|
5997
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
6495
|
+
category: normalizeCategory("expression", "guard"),
|
|
6492
6496
|
parts: transition.conditions.map((c, i) => ({
|
|
6493
6497
|
slug: `condition_${i}`,
|
|
6494
|
-
category:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
6584
|
+
category: normalizeCategory("expression", "guard"),
|
|
6581
6585
|
parts: [{
|
|
6582
6586
|
slug: "body",
|
|
6583
|
-
category:
|
|
6587
|
+
category: normalizeCategory("expression", "eq"),
|
|
6584
6588
|
parts: [
|
|
6585
|
-
{ slug: "lhs", category:
|
|
6586
|
-
{ slug: "rhs", category:
|
|
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:
|
|
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:
|
|
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:
|
|
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 =
|
|
6651
|
+
categoryArray = normalizeCategory(primary, ...tags);
|
|
6648
6652
|
} else {
|
|
6649
6653
|
categoryArray = [category];
|
|
6650
6654
|
}
|
package/dist/babel/index.mjs
CHANGED
|
@@ -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
|
+
};
|