@mmapp/react-compiler 0.1.0-alpha.3 → 0.1.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  deploy
4
- } from "../chunk-EQGA6A6D.mjs";
4
+ } from "../chunk-52XHYD2V.mjs";
5
5
  import {
6
6
  build
7
- } from "../chunk-5RKTOVR5.mjs";
7
+ } from "../chunk-THFYE5ZX.mjs";
8
8
  import "../chunk-5M7DKKBC.mjs";
9
- import "../chunk-FYT47UBU.mjs";
9
+ import "../chunk-OPJKP747.mjs";
10
10
  import {
11
11
  __require
12
12
  } from "../chunk-CIESM3BP.mjs";
@@ -39,8 +39,8 @@ async function test(options = {}) {
39
39
  const rel = f.startsWith(srcDir + "/") ? f.slice(srcDir.length + 1) : f;
40
40
  fileMap[rel] = readFileSync(f, "utf-8");
41
41
  }
42
- const { compileProject } = await import("../project-compiler-D2LCC27O.mjs");
43
- const { decompileProjectEnhanced } = await import("../project-decompiler-FLXCEJHS.mjs");
42
+ const { compileProject } = await import("../project-compiler-OP2VVGJQ.mjs");
43
+ const { decompileProjectEnhanced } = await import("../project-decompiler-US7GAVIC.mjs");
44
44
  process.stdout.write(` Compiling project...`);
45
45
  const t0 = performance.now();
46
46
  let ir1;
@@ -450,15 +450,43 @@ function getPositional() {
450
450
  }
451
451
  return void 0;
452
452
  }
453
+ async function loadDevConfig() {
454
+ try {
455
+ const { existsSync: existsSync3, readFileSync: readFileSync3 } = await import("fs");
456
+ const { resolve: resolve2 } = await import("path");
457
+ const configPath = resolve2(process.cwd(), "mm.config.ts");
458
+ if (!existsSync3(configPath)) return {};
459
+ const content = readFileSync3(configPath, "utf-8");
460
+ const devMatch = content.match(/dev\s*:\s*\{([^}]*)\}/s);
461
+ if (!devMatch) return {};
462
+ const block = devMatch[1];
463
+ const str = (k) => {
464
+ const m = block.match(new RegExp(`${k}\\s*:\\s*['"\`]([^'"\`]*)['"\`]`));
465
+ return m?.[1];
466
+ };
467
+ const num = (k) => {
468
+ const m = block.match(new RegExp(`${k}\\s*:\\s*(\\d+)`));
469
+ return m ? parseInt(m[1], 10) : void 0;
470
+ };
471
+ const bool = (k) => {
472
+ const m = block.match(new RegExp(`${k}\\s*:\\s*(true|false)`));
473
+ return m ? m[1] === "true" : void 0;
474
+ };
475
+ return { port: num("port"), src: str("src"), mode: str("mode"), seed: bool("seed"), apiUrl: str("apiUrl"), token: str("token"), open: bool("open") };
476
+ } catch {
477
+ return {};
478
+ }
479
+ }
453
480
  async function main() {
454
481
  if (command === "dev") {
455
- const port = getFlag("--port") ? parseInt(getFlag("--port"), 10) : void 0;
456
- const src = getFlag("--src");
457
- const mode = getFlag("--mode");
458
- const seed = hasFlag("--seed");
459
- const apiUrl = getFlag("--api-url");
460
- const authToken = getFlag("--token");
461
- const open = hasFlag("--open");
482
+ const devCfg = await loadDevConfig();
483
+ const port = getFlag("--port") ? parseInt(getFlag("--port"), 10) : devCfg.port;
484
+ const src = getFlag("--src") ?? devCfg.src;
485
+ const mode = getFlag("--mode") ?? devCfg.mode;
486
+ const seed = hasFlag("--seed") || devCfg.seed === true;
487
+ const apiUrl = getFlag("--api-url") ?? devCfg.apiUrl;
488
+ const authToken = getFlag("--token") ?? devCfg.token;
489
+ const open = hasFlag("--open") || devCfg.open === true;
462
490
  const { createDevServer } = await import("../dev-server.mjs");
463
491
  const server = await createDevServer({
464
492
  port,
@@ -490,8 +518,23 @@ async function main() {
490
518
  const result = await test({ src });
491
519
  if (!result.success) process.exit(1);
492
520
  } else if (command === "deploy") {
493
- const apiUrl = getFlag("--api-url") ?? "http://localhost:4200/api/v1";
494
- const token = resolveToken(apiUrl, getFlag("--token"));
521
+ const { loadMmrcConfig, resolveTarget } = await import("../config-PL24KEWL.mjs");
522
+ const mmrcConfig = loadMmrcConfig();
523
+ const targetFlag = getFlag("--target");
524
+ const explicitApiUrl = getFlag("--api-url");
525
+ const explicitToken = getFlag("--token");
526
+ let apiUrl;
527
+ let targetName;
528
+ let configToken = null;
529
+ if (targetFlag || mmrcConfig?.environments && !explicitApiUrl) {
530
+ const resolved = resolveTarget(targetFlag, mmrcConfig, "http://localhost:4200/api/v1");
531
+ apiUrl = explicitApiUrl ?? resolved.apiUrl;
532
+ targetName = resolved.name;
533
+ configToken = resolved.token;
534
+ } else {
535
+ apiUrl = explicitApiUrl ?? "http://localhost:4200/api/v1";
536
+ }
537
+ const token = explicitToken ?? configToken ?? resolveToken(apiUrl) ?? null;
495
538
  const dir = getFlag("--dir");
496
539
  const src = getFlag("--src");
497
540
  const force = hasFlag("--force");
@@ -502,6 +545,9 @@ async function main() {
502
545
  console.error(" 1. Run `mmrc login` to save credentials");
503
546
  console.error(" 2. Pass --token TOKEN");
504
547
  console.error(" 3. Set MMRC_TOKEN environment variable");
548
+ if (mmrcConfig?.environments) {
549
+ console.error(" 4. Set token in mmrc.config.ts environment");
550
+ }
505
551
  process.exit(1);
506
552
  }
507
553
  if (shouldBuild) {
@@ -514,7 +560,7 @@ async function main() {
514
560
  const { glob: glob2 } = await import("glob");
515
561
  const configPath = resolve2(srcDir, "mm.config.ts");
516
562
  if (existsSync3(configPath)) {
517
- const { compileProject } = await import("../project-compiler-D2LCC27O.mjs");
563
+ const { compileProject } = await import("../project-compiler-OP2VVGJQ.mjs");
518
564
  const allFiles = await glob2(`${srcDir}/**/*.{ts,tsx}`, {
519
565
  ignore: ["**/node_modules/**", "**/dist/**", "**/__tests__/**", "**/*.test.*"]
520
566
  });
@@ -556,9 +602,9 @@ async function main() {
556
602
  }
557
603
  console.log("");
558
604
  }
559
- await deploy({ apiUrl, token, dir: outDir, force, dryRun });
605
+ await deploy({ apiUrl, token, dir: outDir, force, dryRun, targetName });
560
606
  } else {
561
- await deploy({ apiUrl, token, dir, force, dryRun });
607
+ await deploy({ apiUrl, token, dir, force, dryRun, targetName });
562
608
  }
563
609
  } else if (command === "login") {
564
610
  const apiUrl = getFlag("--api-url") ?? "http://localhost:4200/api/v1";
@@ -577,13 +623,30 @@ async function main() {
577
623
  console.error('[mmrc] Error: name is required\n Usage: mmrc init <name> [--description "..."] [--icon "..."] [--author "..."]');
578
624
  process.exit(1);
579
625
  }
580
- const { init } = await import("../init-UC3FWPIW.mjs");
626
+ const { init } = await import("../init-DQDX3QK6.mjs");
581
627
  await init({
582
628
  name,
583
629
  description: getFlag("--description"),
584
630
  icon: getFlag("--icon"),
585
631
  author: getFlag("--author")
586
632
  });
633
+ } else if (command === "verify") {
634
+ const target = getPositional();
635
+ if (!target) {
636
+ console.error("[mmrc] Error: target path is required\n Usage: mmrc verify <file-or-dir> [options]");
637
+ process.exit(1);
638
+ }
639
+ const { verifyCommand } = await import("../verify-SEIXUGN4.mjs");
640
+ const result = await verifyCommand({
641
+ target,
642
+ static: hasFlag("--static"),
643
+ mutation: hasFlag("--mutation"),
644
+ generate: hasFlag("--generate"),
645
+ ci: hasFlag("--ci"),
646
+ minCoverage: getFlag("--min-coverage") ? parseFloat(getFlag("--min-coverage")) : void 0,
647
+ minMutationScore: getFlag("--min-mutation-score") ? parseFloat(getFlag("--min-mutation-score")) : void 0
648
+ });
649
+ if (!result.success) process.exit(1);
587
650
  } else if (command === "pull") {
588
651
  const slug = getPositional();
589
652
  const apiUrl = getFlag("--api-url") ?? "http://localhost:4200/api/v1";
@@ -600,20 +663,66 @@ async function main() {
600
663
  console.error(" 3. Set MMRC_TOKEN environment variable");
601
664
  process.exit(1);
602
665
  }
603
- const { pull } = await import("../pull-LD5ENLGY.mjs");
666
+ const { pull } = await import("../pull-P44LDRWB.mjs");
604
667
  await pull({ slug, apiUrl, token, outDir });
668
+ } else if (command === "config") {
669
+ const subcommand = args[1];
670
+ const { getConfig, getConfigValue, setConfigValue, flattenConfig, findConfigPath, writeConfigFile } = await import("../config-PL24KEWL.mjs");
671
+ if (subcommand === "get") {
672
+ const key = args[2];
673
+ if (!key) {
674
+ console.error("[mmrc] Usage: mmrc config get <key> (e.g., dev.port)");
675
+ process.exit(1);
676
+ }
677
+ const config = getConfig();
678
+ const value = getConfigValue(config, key);
679
+ if (value === void 0) {
680
+ console.error(`[mmrc] Config key "${key}" not found.`);
681
+ process.exit(1);
682
+ }
683
+ console.log(typeof value === "object" ? JSON.stringify(value, null, 2) : String(value));
684
+ } else if (subcommand === "set") {
685
+ const key = args[2];
686
+ const value = args[3];
687
+ if (!key || value === void 0) {
688
+ console.error("[mmrc] Usage: mmrc config set <key> <value> (e.g., dev.port 3000)");
689
+ process.exit(1);
690
+ }
691
+ const configPath = findConfigPath();
692
+ if (!configPath) {
693
+ console.error("[mmrc] No mmrc.config.ts found. Run `mmrc init` first.");
694
+ process.exit(1);
695
+ }
696
+ const config = getConfig();
697
+ setConfigValue(config, key, value);
698
+ writeConfigFile(configPath, config);
699
+ console.log(`[mmrc] Set ${key} = ${value}`);
700
+ } else if (subcommand === "list" || !subcommand) {
701
+ const config = getConfig();
702
+ const entries = flattenConfig(config);
703
+ const maxKeyLen = Math.max(...entries.map(([k]) => k.length));
704
+ for (const [k, v] of entries) {
705
+ console.log(` ${k.padEnd(maxKeyLen)} ${v}`);
706
+ }
707
+ } else {
708
+ console.error(`[mmrc] Unknown config subcommand: ${subcommand}`);
709
+ console.error(" Usage: mmrc config [get <key> | set <key> <value> | list]");
710
+ process.exit(1);
711
+ }
605
712
  } else {
606
713
  console.log(`
607
714
  MindMatrix React Compiler (mmrc)
608
715
 
609
716
  Commands:
610
717
  init Scaffold a new blueprint package
718
+ config View and modify mmrc.config.ts settings
611
719
  login Authenticate and save credentials
612
720
  logout Remove saved credentials
613
721
  whoami Show current authenticated user
614
722
  dev Start dev server with hot reload
615
723
  build Compile workflow files to Pure Form IR
616
724
  test Round-trip fidelity test (compile \u2192 decompile \u2192 recompile \u2192 compare)
725
+ verify Compile + run verification layers (structural, reachability, safety, liveness, etc.)
617
726
  deploy Compile + upload workflows to backend DB
618
727
  pull Fetch a definition from DB and scaffold local project
619
728
 
@@ -655,9 +764,18 @@ Usage:
655
764
  mmrc test [options]
656
765
  --src Source directory (default: current directory)
657
766
 
767
+ mmrc verify <file-or-dir> [options]
768
+ --static Static analysis only (skip conformance/property/mutation)
769
+ --mutation Include mutation analysis
770
+ --generate Output generated test file instead of running
771
+ --ci CI mode \u2014 exit with non-zero on any failure
772
+ --min-coverage N Minimum coverage percentage (requires --ci)
773
+ --min-mutation-score N Minimum mutation score (requires --ci)
774
+
658
775
  mmrc deploy [options]
659
- --api-url API base URL (default: http://localhost:4200/api/v1)
660
- --token Auth token (or use mmrc login / MMRC_TOKEN env var)
776
+ --target Deploy target from mmrc.config.ts environments (e.g., staging, production)
777
+ --api-url API base URL (overrides target; default: http://localhost:4200/api/v1)
778
+ --token Auth token (overrides all; or use mmrc login / MMRC_TOKEN env var)
661
779
  --dir Compiled workflows directory (default: dist/workflows)
662
780
  --src Source directory (used with --build)
663
781
  --build Compile first, then deploy (no separate build step needed)
@@ -0,0 +1,219 @@
1
+ import "./chunk-CIESM3BP.mjs";
2
+
3
+ // src/cli/config.ts
4
+ import { existsSync, readFileSync, writeFileSync } from "fs";
5
+ import { resolve, join } from "path";
6
+ var DEFAULT_CONFIG = {
7
+ dev: {
8
+ port: 5199,
9
+ apiPort: 4200,
10
+ db: "sqlite://mm-dev.db",
11
+ redis: "",
12
+ api: "http://localhost:4200/api/v1",
13
+ seed: false,
14
+ open: false
15
+ },
16
+ build: {
17
+ mode: "infer",
18
+ outDir: "dist/workflows",
19
+ skipTypeCheck: false
20
+ },
21
+ test: {
22
+ minCoverage: 80,
23
+ minMutationScore: 60,
24
+ integration: false
25
+ },
26
+ environments: {
27
+ local: { apiUrl: "http://localhost:4200/api/v1" },
28
+ dev: { apiUrl: "https://dev.mindmatrix.club/api/v1" }
29
+ },
30
+ defaultTarget: "dev"
31
+ };
32
+ function isPlainObject(val) {
33
+ return typeof val === "object" && val !== null && !Array.isArray(val);
34
+ }
35
+ function deepMerge(target, source) {
36
+ const result = { ...target };
37
+ for (const key of Object.keys(source)) {
38
+ const srcVal = source[key];
39
+ const tgtVal = target[key];
40
+ if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {
41
+ result[key] = deepMerge(tgtVal, srcVal);
42
+ } else if (srcVal !== void 0) {
43
+ result[key] = srcVal;
44
+ }
45
+ }
46
+ return result;
47
+ }
48
+ function findConfigPath(startDir) {
49
+ let dir = startDir ?? process.cwd();
50
+ const root = resolve("/");
51
+ while (true) {
52
+ for (const name of ["mmrc.config.ts", "mmrc.config.json"]) {
53
+ const candidate = join(dir, name);
54
+ if (existsSync(candidate)) return candidate;
55
+ }
56
+ const parent = resolve(dir, "..");
57
+ if (parent === dir || parent === root) break;
58
+ dir = parent;
59
+ }
60
+ return null;
61
+ }
62
+ function loadConfigFromFile(configPath) {
63
+ const content = readFileSync(configPath, "utf-8");
64
+ if (configPath.endsWith(".json")) {
65
+ try {
66
+ return JSON.parse(content);
67
+ } catch {
68
+ return {};
69
+ }
70
+ }
71
+ let js = content.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(?<![:'"])\/\/.*$/gm, "").replace(/^import\s+.*$/gm, "").replace(/^export\s+default\s+/m, "module.exports = ").replace(/^export\s+/gm, "").replace(/:\s*MmrcConfig/g, "").replace(/as\s+const/g, "").replace(/satisfies\s+\w+/g, "");
72
+ js = `function defineMmrc(c) { return c; }
73
+ ${js}`;
74
+ try {
75
+ const m = {};
76
+ const fn = new Function("module", "exports", "require", js);
77
+ fn(m, m, () => ({}));
78
+ const exported = m.exports ?? m;
79
+ return isPlainObject(exported) ? exported : {};
80
+ } catch {
81
+ return {};
82
+ }
83
+ }
84
+ function getConfig(startDir) {
85
+ const configPath = findConfigPath(startDir);
86
+ if (!configPath) return { ...DEFAULT_CONFIG };
87
+ const userConfig = loadConfigFromFile(configPath);
88
+ return deepMerge(DEFAULT_CONFIG, userConfig);
89
+ }
90
+ function getConfigValue(config, key) {
91
+ const parts = key.split(".");
92
+ let current = config;
93
+ for (const part of parts) {
94
+ if (!isPlainObject(current)) return void 0;
95
+ current = current[part];
96
+ }
97
+ return current;
98
+ }
99
+ function setConfigValue(config, key, value) {
100
+ const parts = key.split(".");
101
+ let current = config;
102
+ for (let i = 0; i < parts.length - 1; i++) {
103
+ const part = parts[i];
104
+ if (!isPlainObject(current[part])) {
105
+ current[part] = {};
106
+ }
107
+ current = current[part];
108
+ }
109
+ const last = parts[parts.length - 1];
110
+ if (value === "true") current[last] = true;
111
+ else if (value === "false") current[last] = false;
112
+ else if (/^\d+$/.test(value)) current[last] = parseInt(value, 10);
113
+ else current[last] = value;
114
+ }
115
+ function flattenConfig(obj, prefix = "") {
116
+ const entries = [];
117
+ if (!isPlainObject(obj)) {
118
+ entries.push([prefix, String(obj)]);
119
+ return entries;
120
+ }
121
+ for (const [key, val] of Object.entries(obj)) {
122
+ const fullKey = prefix ? `${prefix}.${key}` : key;
123
+ if (isPlainObject(val)) {
124
+ entries.push(...flattenConfig(val, fullKey));
125
+ } else {
126
+ entries.push([fullKey, String(val)]);
127
+ }
128
+ }
129
+ return entries;
130
+ }
131
+ function writeConfigFile(configPath, config) {
132
+ const json = JSON.stringify(config, null, 2);
133
+ const content = `/**
134
+ * mmrc.config.ts \u2014 MindMatrix React Compiler configuration.
135
+ *
136
+ * Configures the mmrc CLI for local dev, builds, tests, and deploy targets.
137
+ * Edit directly or run \`mmrc config set <key> <value>\`.
138
+ */
139
+
140
+ const config = ${json};
141
+
142
+ export default config;
143
+ `;
144
+ writeFileSync(configPath, content, "utf-8");
145
+ }
146
+ function resolveTarget(targetName, config, fallbackApiUrl) {
147
+ if (!config || !config.environments) {
148
+ return { name: targetName ?? "default", apiUrl: fallbackApiUrl, token: null };
149
+ }
150
+ const name = targetName ?? config.defaultTarget ?? "local";
151
+ const env = config.environments[name];
152
+ if (!env) {
153
+ const available = Object.keys(config.environments).join(", ");
154
+ throw new Error(`Unknown target "${name}". Available environments: ${available}`);
155
+ }
156
+ return { name, apiUrl: env.apiUrl, token: env.token ?? null };
157
+ }
158
+ function generateMmrcConfig() {
159
+ return `/**
160
+ * mmrc.config.ts \u2014 MindMatrix React Compiler configuration.
161
+ *
162
+ * Configures the mmrc CLI for local dev, builds, tests, and deploy targets.
163
+ * Edit directly or run \`mmrc config set <key> <value>\`.
164
+ */
165
+
166
+ const config = {
167
+ dev: {
168
+ port: 5199,
169
+ apiPort: 4200,
170
+ db: 'sqlite://mm-dev.db',
171
+ redis: '',
172
+ api: 'https://dev.mindmatrix.club/api/v1',
173
+ seed: false,
174
+ open: false,
175
+ },
176
+
177
+ build: {
178
+ mode: 'infer',
179
+ outDir: 'dist/workflows',
180
+ skipTypeCheck: false,
181
+ },
182
+
183
+ test: {
184
+ minCoverage: 80,
185
+ minMutationScore: 60,
186
+ integration: false,
187
+ },
188
+
189
+ environments: {
190
+ local: { apiUrl: 'http://localhost:4200/api/v1' },
191
+ dev: { apiUrl: 'https://dev.mindmatrix.club/api/v1' },
192
+ },
193
+
194
+ defaultTarget: 'dev',
195
+ };
196
+
197
+ export default config;
198
+ `;
199
+ }
200
+ function loadMmrcConfig(dir) {
201
+ const path = findConfigPath(dir);
202
+ if (!path) return null;
203
+ const partial = loadConfigFromFile(path);
204
+ return deepMerge(DEFAULT_CONFIG, partial);
205
+ }
206
+ export {
207
+ DEFAULT_CONFIG,
208
+ deepMerge,
209
+ findConfigPath,
210
+ flattenConfig,
211
+ generateMmrcConfig,
212
+ getConfig,
213
+ getConfigValue,
214
+ loadConfigFromFile,
215
+ loadMmrcConfig,
216
+ resolveTarget,
217
+ setConfigValue,
218
+ writeConfigFile
219
+ };