@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.
Files changed (314) hide show
  1. package/README.md +107 -0
  2. package/compile-blueprint-chat.mjs +99 -0
  3. package/compile-blueprint-glass-console.mjs +98 -0
  4. package/compile-chat-defs.mjs +92 -0
  5. package/dist/babel/index.d.mts +3 -0
  6. package/dist/babel/index.d.ts +3 -0
  7. package/dist/babel/index.js +4851 -0
  8. package/dist/babel/index.mjs +7 -0
  9. package/dist/chunk-26U577GB.mjs +3465 -0
  10. package/dist/chunk-2FBDFAX6.mjs +2362 -0
  11. package/dist/chunk-2L4QSMXG.mjs +175 -0
  12. package/dist/chunk-2REDFOER.mjs +931 -0
  13. package/dist/chunk-46YKSHQR.mjs +175 -0
  14. package/dist/chunk-4XHK6FWL.mjs +2058 -0
  15. package/dist/chunk-5M7DKKBC.mjs +215 -0
  16. package/dist/chunk-5VNJ7C6N.mjs +154 -0
  17. package/dist/chunk-6CQOAAMV.mjs +1803 -0
  18. package/dist/chunk-6SEVAAVT.mjs +3516 -0
  19. package/dist/chunk-6YLR5ZDA.mjs +2829 -0
  20. package/dist/chunk-AOGY2GK6.mjs +3292 -0
  21. package/dist/chunk-AXXUXRNA.mjs +1434 -0
  22. package/dist/chunk-CHLVKMQW.mjs +175 -0
  23. package/dist/chunk-CKGOZAB7.mjs +939 -0
  24. package/dist/chunk-D34RAZUX.mjs +2223 -0
  25. package/dist/chunk-EQGA6A6D.mjs +121 -0
  26. package/dist/chunk-EY2CSXYA.mjs +822 -0
  27. package/dist/chunk-FIQ65CDR.mjs +925 -0
  28. package/dist/chunk-FOZXJFAR.mjs +186 -0
  29. package/dist/chunk-FX6URXWN.mjs +186 -0
  30. package/dist/chunk-G7SMOWOL.mjs +828 -0
  31. package/dist/chunk-GGB4G5YY.mjs +175 -0
  32. package/dist/chunk-HLRGCCIL.mjs +4839 -0
  33. package/dist/chunk-HOIUP6IF.mjs +690 -0
  34. package/dist/chunk-I3AU7GRD.mjs +120 -0
  35. package/dist/chunk-ILFGMUVD.mjs +1933 -0
  36. package/dist/chunk-IPTX5MJU.mjs +3223 -0
  37. package/dist/chunk-ITGUSH2Z.mjs +2783 -0
  38. package/dist/chunk-IXHBCAMF.mjs +3306 -0
  39. package/dist/chunk-J7TWJ3TM.mjs +2784 -0
  40. package/dist/chunk-JDPLDGVF.mjs +4810 -0
  41. package/dist/chunk-K53XP2DL.mjs +148 -0
  42. package/dist/chunk-K5HX2SVL.mjs +1902 -0
  43. package/dist/chunk-KFGYOOVS.mjs +214 -0
  44. package/dist/chunk-KFVVOS5N.mjs +925 -0
  45. package/dist/chunk-L2OZ4CDV.mjs +113 -0
  46. package/dist/chunk-MIZV3TAN.mjs +3293 -0
  47. package/dist/chunk-NKKLQE5V.mjs +148 -0
  48. package/dist/chunk-NOW23XFZ.mjs +186 -0
  49. package/dist/chunk-NRXQKQ74.mjs +148 -0
  50. package/dist/chunk-OWI6XWCD.mjs +3375 -0
  51. package/dist/chunk-PRUMNNDI.mjs +3192 -0
  52. package/dist/chunk-QTBD5B3F.mjs +148 -0
  53. package/dist/chunk-SKSDPPNT.mjs +3788 -0
  54. package/dist/chunk-SP2YUS33.mjs +186 -0
  55. package/dist/chunk-SU4E6E7B.mjs +3153 -0
  56. package/dist/chunk-SYUUKW5A.mjs +3379 -0
  57. package/dist/chunk-UL2XZEMA.mjs +3128 -0
  58. package/dist/chunk-XMWUHQVV.mjs +939 -0
  59. package/dist/chunk-XZNEDRGN.mjs +3876 -0
  60. package/dist/chunk-Y6FXYEAI.mjs +10 -0
  61. package/dist/chunk-YFS6JMYO.mjs +3342 -0
  62. package/dist/chunk-Z6AIQ4KL.mjs +113 -0
  63. package/dist/cli/index.d.mts +1 -0
  64. package/dist/cli/index.d.ts +1 -0
  65. package/dist/cli/index.js +11585 -0
  66. package/dist/cli/index.mjs +701 -0
  67. package/dist/codemod/cli.d.mts +1 -0
  68. package/dist/codemod/cli.d.ts +1 -0
  69. package/dist/codemod/cli.js +1104 -0
  70. package/dist/codemod/cli.mjs +157 -0
  71. package/dist/codemod/index.d.mts +148 -0
  72. package/dist/codemod/index.d.ts +148 -0
  73. package/dist/codemod/index.js +981 -0
  74. package/dist/codemod/index.mjs +25 -0
  75. package/dist/dev-server-Bs_sz2DG.d.mts +111 -0
  76. package/dist/dev-server-Bs_sz2DG.d.ts +111 -0
  77. package/dist/dev-server-CjoufJ-u.d.mts +109 -0
  78. package/dist/dev-server-CjoufJ-u.d.ts +109 -0
  79. package/dist/dev-server.d.mts +3 -0
  80. package/dist/dev-server.d.ts +3 -0
  81. package/dist/dev-server.js +7603 -0
  82. package/dist/dev-server.mjs +11 -0
  83. package/dist/envelope-DD7v0v6E.d.mts +265 -0
  84. package/dist/envelope-DD7v0v6E.d.ts +265 -0
  85. package/dist/envelope-vCVjrHlo.d.mts +265 -0
  86. package/dist/envelope-vCVjrHlo.d.ts +265 -0
  87. package/dist/envelope.d.mts +2 -0
  88. package/dist/envelope.d.ts +2 -0
  89. package/dist/envelope.js +5184 -0
  90. package/dist/envelope.mjs +9 -0
  91. package/dist/index-B5gSgvnd.d.mts +44 -0
  92. package/dist/index-B5gSgvnd.d.ts +44 -0
  93. package/dist/index-Bs0MnR54.d.mts +103 -0
  94. package/dist/index-Bs0MnR54.d.ts +103 -0
  95. package/dist/index-DR0nNc_f.d.mts +101 -0
  96. package/dist/index-DR0nNc_f.d.ts +101 -0
  97. package/dist/index-revho_gS.d.mts +104 -0
  98. package/dist/index-revho_gS.d.ts +104 -0
  99. package/dist/index.d.mts +1099 -0
  100. package/dist/index.d.ts +1099 -0
  101. package/dist/index.js +10162 -0
  102. package/dist/index.mjs +372 -0
  103. package/dist/init-IXEE2RCF.mjs +340 -0
  104. package/dist/project-compiler-EGJUTAJU.mjs +10 -0
  105. package/dist/project-compiler-VFR6CSDX.mjs +10 -0
  106. package/dist/project-decompiler-5GY2KSG4.mjs +7 -0
  107. package/dist/pull-A2QUHW4K.mjs +109 -0
  108. package/dist/pull-JBEQWVPE.mjs +109 -0
  109. package/dist/testing/index.d.mts +211 -0
  110. package/dist/testing/index.d.ts +211 -0
  111. package/dist/testing/index.js +5106 -0
  112. package/dist/testing/index.mjs +247 -0
  113. package/dist/vite/index.d.mts +59 -0
  114. package/dist/vite/index.d.ts +59 -0
  115. package/dist/vite/index.js +5023 -0
  116. package/dist/vite/index.mjs +8 -0
  117. package/examples/README.md +72 -0
  118. package/examples/authentication/main.workflow.tsx +139 -0
  119. package/examples/authentication/mm.config.ts +22 -0
  120. package/examples/authentication/models/auth.ts +45 -0
  121. package/examples/authentication/pages/LoginPage.tsx +79 -0
  122. package/examples/authentication/pages/SignupPage.tsx +87 -0
  123. package/examples/counter.workflow.tsx +65 -0
  124. package/examples/dashboard.workflow.tsx +419 -0
  125. package/examples/invoice-approval/actions/invoice.server.ts +72 -0
  126. package/examples/invoice-approval/main.workflow.tsx +168 -0
  127. package/examples/invoice-approval/mm.config.ts +18 -0
  128. package/examples/invoice-approval/models/invoice.ts +46 -0
  129. package/examples/invoice-approval/pages/InvoiceDetailPage.tsx +175 -0
  130. package/examples/invoice-approval/pages/InvoiceFormPage.tsx +198 -0
  131. package/examples/invoice-approval/pages/InvoiceListPage.tsx +141 -0
  132. package/examples/todo-app.workflow.tsx +131 -0
  133. package/examples/uber-app/actions/matching.server.ts +177 -0
  134. package/examples/uber-app/actions/notifications.server.ts +176 -0
  135. package/examples/uber-app/actions/payments.server.ts +184 -0
  136. package/examples/uber-app/actions/pricing.server.ts +176 -0
  137. package/examples/uber-app/app/admin/analytics.tsx +102 -0
  138. package/examples/uber-app/app/admin/fleet.tsx +102 -0
  139. package/examples/uber-app/app/admin/surge-pricing.tsx +95 -0
  140. package/examples/uber-app/app/driver/dashboard.tsx +87 -0
  141. package/examples/uber-app/app/driver/earnings.tsx +101 -0
  142. package/examples/uber-app/app/driver/navigation.tsx +94 -0
  143. package/examples/uber-app/app/driver/ride-acceptance.tsx +103 -0
  144. package/examples/uber-app/app/rider/home.tsx +109 -0
  145. package/examples/uber-app/app/rider/payment-methods.tsx +134 -0
  146. package/examples/uber-app/app/rider/ride-history.tsx +90 -0
  147. package/examples/uber-app/app/rider/ride-tracking.tsx +108 -0
  148. package/examples/uber-app/components/DriverCard.tsx +176 -0
  149. package/examples/uber-app/components/MapView.tsx +216 -0
  150. package/examples/uber-app/components/RatingStars.tsx +227 -0
  151. package/examples/uber-app/components/RideCard.tsx +167 -0
  152. package/examples/uber-app/mm.config.ts +30 -0
  153. package/examples/uber-app/models/location.model.ts +70 -0
  154. package/examples/uber-app/models/payment.model.ts +87 -0
  155. package/examples/uber-app/models/rating.model.ts +54 -0
  156. package/examples/uber-app/models/ride.model.ts +118 -0
  157. package/examples/uber-app/models/user.model.ts +66 -0
  158. package/examples/uber-app/models/vehicle.model.ts +63 -0
  159. package/examples/uber-app/tests/payment.test.tsx +129 -0
  160. package/examples/uber-app/tests/ride-flow.test.tsx +123 -0
  161. package/examples/uber-app/workflows/dispute-resolution.workflow.tsx +205 -0
  162. package/examples/uber-app/workflows/driver-onboarding.workflow.tsx +227 -0
  163. package/examples/uber-app/workflows/payment-processing.workflow.tsx +223 -0
  164. package/examples/uber-app/workflows/ride-request.workflow.tsx +194 -0
  165. package/package.json +77 -0
  166. package/package.json.backup +86 -0
  167. package/scripts/decompile.ts +226 -0
  168. package/scripts/seed-auth.ts +267 -0
  169. package/scripts/seed-uber.ts +248 -0
  170. package/scripts/validate-uber.ts +119 -0
  171. package/seed-blueprint-chat.mjs +444 -0
  172. package/seed-blueprint-glass-console.mjs +445 -0
  173. package/seed-compiled.mjs +318 -0
  174. package/src/RoundTripValidator.ts +400 -0
  175. package/src/__tests__/atom-rendering-coverage.test.ts +680 -0
  176. package/src/__tests__/auth-module-compilation.test.ts +247 -0
  177. package/src/__tests__/auth-template-compilation.test.ts +589 -0
  178. package/src/__tests__/change-extractor.test.ts +142 -0
  179. package/src/__tests__/cli-pull.test.ts +73 -0
  180. package/src/__tests__/cli-test.test.ts +72 -0
  181. package/src/__tests__/component-extractor.test.ts +331 -0
  182. package/src/__tests__/context-extractor.test.ts +145 -0
  183. package/src/__tests__/decompiler.test.ts +718 -0
  184. package/src/__tests__/define-blueprint.test.ts +133 -0
  185. package/src/__tests__/definition-validator.test.ts +519 -0
  186. package/src/__tests__/during-extractor.test.ts +152 -0
  187. package/src/__tests__/effect-extractor.test.ts +107 -0
  188. package/src/__tests__/event-emission.test.ts +127 -0
  189. package/src/__tests__/examples.test.ts +236 -0
  190. package/src/__tests__/full-blueprint-coverage.test.ts +1221 -0
  191. package/src/__tests__/golden-suite.test.ts +403 -0
  192. package/src/__tests__/grammar-island-extractor.test.ts +289 -0
  193. package/src/__tests__/instance-key.test.ts +82 -0
  194. package/src/__tests__/ir-migration.test.ts +255 -0
  195. package/src/__tests__/lock-file.test.ts +117 -0
  196. package/src/__tests__/model-extractor.test.ts +195 -0
  197. package/src/__tests__/model-field-acl.test.ts +237 -0
  198. package/src/__tests__/model-hooks.test.ts +130 -0
  199. package/src/__tests__/model-ref-resolution.test.ts +268 -0
  200. package/src/__tests__/model-roundtrip.test.ts +502 -0
  201. package/src/__tests__/model-runtime.test.ts +112 -0
  202. package/src/__tests__/model-transitions.test.ts +183 -0
  203. package/src/__tests__/nrt-action-trace.test.ts +391 -0
  204. package/src/__tests__/pipeline-hardening.test.ts +413 -0
  205. package/src/__tests__/project-compiler.test.ts +546 -0
  206. package/src/__tests__/project-decompiler.test.ts +343 -0
  207. package/src/__tests__/query-compilation.test.ts +145 -0
  208. package/src/__tests__/round-trip/PLAN.md +158 -0
  209. package/src/__tests__/round-trip/README.md +52 -0
  210. package/src/__tests__/round-trip/RESULTS.md +86 -0
  211. package/src/__tests__/round-trip/fixtures/data-heavy/main.workflow.tsx +55 -0
  212. package/src/__tests__/round-trip/fixtures/data-heavy/mm.config.ts +11 -0
  213. package/src/__tests__/round-trip/fixtures/data-heavy/models/contact.ts +54 -0
  214. package/src/__tests__/round-trip/fixtures/full-workflow/main.workflow.tsx +79 -0
  215. package/src/__tests__/round-trip/fixtures/full-workflow/mm.config.ts +12 -0
  216. package/src/__tests__/round-trip/fixtures/full-workflow/models/order.ts +50 -0
  217. package/src/__tests__/round-trip/fixtures/simple-crud/main.workflow.tsx +25 -0
  218. package/src/__tests__/round-trip/fixtures/simple-crud/mm.config.ts +11 -0
  219. package/src/__tests__/round-trip/fixtures/simple-crud/models/task.ts +32 -0
  220. package/src/__tests__/round-trip/fixtures/view-heavy/main.workflow.tsx +79 -0
  221. package/src/__tests__/round-trip/fixtures/view-heavy/mm.config.ts +10 -0
  222. package/src/__tests__/round-trip/round-trip.test.ts +2598 -0
  223. package/src/__tests__/round-trip-ir.test.ts +300 -0
  224. package/src/__tests__/round-trip.test.ts +1212 -0
  225. package/src/__tests__/route-merging.test.ts +372 -0
  226. package/src/__tests__/router-composition.test.ts +489 -0
  227. package/src/__tests__/router-extractor.test.ts +176 -0
  228. package/src/__tests__/server-action-extractor.test.ts +128 -0
  229. package/src/__tests__/smart-type-inference.test.ts +365 -0
  230. package/src/__tests__/source-envelope.test.ts +284 -0
  231. package/src/__tests__/source-fidelity.test.ts +516 -0
  232. package/src/__tests__/state-extractor.test.ts +115 -0
  233. package/src/__tests__/strict-mode.test.ts +227 -0
  234. package/src/__tests__/transition-effect-extractor.test.ts +119 -0
  235. package/src/__tests__/transition-extractor.test.ts +68 -0
  236. package/src/__tests__/ts-to-expression.test.ts +462 -0
  237. package/src/__tests__/type-generator.test.ts +201 -0
  238. package/src/__tests__/uber-validation.test.ts +502 -0
  239. package/src/action-compiler.ts +361 -0
  240. package/src/babel/emitters/experience-transform.ts +199 -0
  241. package/src/babel/emitters/ir-to-tsx-emitter.ts +110 -0
  242. package/src/babel/emitters/pure-form-emitter.ts +1023 -0
  243. package/src/babel/emitters/runtime-glue-emitter.ts +39 -0
  244. package/src/babel/extractors/change-extractor.ts +199 -0
  245. package/src/babel/extractors/component-extractor.ts +907 -0
  246. package/src/babel/extractors/computed-extractor.ts +262 -0
  247. package/src/babel/extractors/context-extractor.ts +277 -0
  248. package/src/babel/extractors/during-extractor.ts +295 -0
  249. package/src/babel/extractors/effect-extractor.ts +340 -0
  250. package/src/babel/extractors/event-extractor.ts +235 -0
  251. package/src/babel/extractors/grammar-island-extractor.ts +302 -0
  252. package/src/babel/extractors/model-extractor.ts +1018 -0
  253. package/src/babel/extractors/router-extractor.ts +303 -0
  254. package/src/babel/extractors/server-action-extractor.ts +173 -0
  255. package/src/babel/extractors/server-action-hook-extractor.ts +72 -0
  256. package/src/babel/extractors/server-state-extractor.ts +88 -0
  257. package/src/babel/extractors/state-extractor.ts +214 -0
  258. package/src/babel/extractors/transition-effect-extractor.ts +176 -0
  259. package/src/babel/extractors/transition-extractor.ts +143 -0
  260. package/src/babel/index.ts +24 -0
  261. package/src/babel/transpilers/ts-to-expression.ts +674 -0
  262. package/src/babel/visitor.ts +807 -0
  263. package/src/cli/auth.ts +255 -0
  264. package/src/cli/build.ts +288 -0
  265. package/src/cli/deploy.ts +206 -0
  266. package/src/cli/index.ts +328 -0
  267. package/src/cli/init.ts +388 -0
  268. package/src/cli/installer.ts +261 -0
  269. package/src/cli/lock-file.ts +94 -0
  270. package/src/cli/mmrc.ts +22 -0
  271. package/src/cli/pull.ts +172 -0
  272. package/src/cli/registry-client.ts +175 -0
  273. package/src/cli/test.ts +397 -0
  274. package/src/cli/type-generator.ts +243 -0
  275. package/src/codemod/__tests__/forward.test.ts +239 -0
  276. package/src/codemod/__tests__/reverse.test.ts +145 -0
  277. package/src/codemod/__tests__/round-trip.test.ts +137 -0
  278. package/src/codemod/annotation.ts +97 -0
  279. package/src/codemod/classify.ts +197 -0
  280. package/src/codemod/cli.ts +207 -0
  281. package/src/codemod/control-flow.ts +409 -0
  282. package/src/codemod/forward.ts +244 -0
  283. package/src/codemod/import-manager.ts +171 -0
  284. package/src/codemod/index.ts +120 -0
  285. package/src/codemod/reverse.ts +197 -0
  286. package/src/codemod/rules.ts +174 -0
  287. package/src/codemod/state-transform.ts +126 -0
  288. package/src/decompiler/ast-builder.ts +538 -0
  289. package/src/decompiler/config-generator.ts +151 -0
  290. package/src/decompiler/index.ts +315 -0
  291. package/src/decompiler/project-decompiler.ts +1776 -0
  292. package/src/decompiler/project.ts +862 -0
  293. package/src/decompiler/split-strategy.ts +140 -0
  294. package/src/decompiler/state-emitter.ts +1053 -0
  295. package/src/decompiler/sx-emitter.ts +318 -0
  296. package/src/decompiler/workspace-hydrator.ts +189 -0
  297. package/src/dev-server.ts +238 -0
  298. package/src/envelope/fs-tree.ts +217 -0
  299. package/src/envelope/source-envelope.ts +264 -0
  300. package/src/envelope.ts +315 -0
  301. package/src/incremental-compiler.ts +401 -0
  302. package/src/index.ts +99 -0
  303. package/src/model-compiler.ts +277 -0
  304. package/src/project-compiler.ts +1629 -0
  305. package/src/route-extractor.ts +333 -0
  306. package/src/testing/index.ts +32 -0
  307. package/src/testing/snapshot.ts +252 -0
  308. package/src/testing/test-utils.ts +226 -0
  309. package/src/types.ts +68 -0
  310. package/src/vite/index.ts +288 -0
  311. package/test-compile.mjs +142 -0
  312. package/tsconfig.json +25 -0
  313. package/tsup.config.ts +23 -0
  314. package/vitest.config.ts +9 -0
@@ -0,0 +1,10 @@
1
+ import {
2
+ IncrementalProjectCompiler,
3
+ compileProject
4
+ } from "./chunk-ILFGMUVD.mjs";
5
+ import "./chunk-HLRGCCIL.mjs";
6
+ import "./chunk-Y6FXYEAI.mjs";
7
+ export {
8
+ IncrementalProjectCompiler,
9
+ compileProject
10
+ };
@@ -0,0 +1,10 @@
1
+ import {
2
+ IncrementalProjectCompiler,
3
+ compileProject
4
+ } from "./chunk-6CQOAAMV.mjs";
5
+ import "./chunk-JDPLDGVF.mjs";
6
+ import "./chunk-Y6FXYEAI.mjs";
7
+ export {
8
+ IncrementalProjectCompiler,
9
+ compileProject
10
+ };
@@ -0,0 +1,7 @@
1
+ import {
2
+ decompileProjectEnhanced
3
+ } from "./chunk-SU4E6E7B.mjs";
4
+ import "./chunk-Y6FXYEAI.mjs";
5
+ export {
6
+ decompileProjectEnhanced
7
+ };
@@ -0,0 +1,109 @@
1
+ import {
2
+ decompileProjectEnhanced
3
+ } from "./chunk-UL2XZEMA.mjs";
4
+ import "./chunk-Y6FXYEAI.mjs";
5
+
6
+ // src/cli/pull.ts
7
+ import { mkdirSync, writeFileSync } from "fs";
8
+ import { join, dirname } from "path";
9
+ async function pull(options) {
10
+ const { slug, apiUrl, token } = options;
11
+ const outDir = options.outDir ?? slug;
12
+ console.log(`[mmrc pull] Fetching "${slug}" from ${apiUrl}...`);
13
+ const ir = await fetchDefinition(apiUrl, token, slug);
14
+ if (!ir) {
15
+ throw new Error(`Definition "${slug}" not found`);
16
+ }
17
+ console.log(` Found: ${ir.name || ir.slug} (${ir.category || "workflow"}, v${ir.version || "1.0.0"})`);
18
+ console.log(` Fields: ${ir.fields?.length ?? 0}, States: ${ir.states?.length ?? 0}, Transitions: ${ir.transitions?.length ?? 0}`);
19
+ const result = decompileProjectEnhanced(ir);
20
+ mkdirSync(outDir, { recursive: true });
21
+ const filesWritten = [];
22
+ for (const file of result.files) {
23
+ const filePath = join(outDir, file.path);
24
+ mkdirSync(dirname(filePath), { recursive: true });
25
+ writeFileSync(filePath, file.content, "utf-8");
26
+ filesWritten.push(file.path);
27
+ console.log(` + ${file.path}`);
28
+ }
29
+ console.log(`
30
+ [mmrc pull] Scaffolded ${filesWritten.length} files in ${outDir}/`);
31
+ console.log(` Entry: ${result.entryFile}`);
32
+ console.log(`
33
+ Next steps:`);
34
+ console.log(` cd ${outDir}`);
35
+ console.log(` mmrc dev --src .`);
36
+ console.log(` # Edit files, then deploy back:`);
37
+ console.log(` mmrc deploy --src . --api-url ${apiUrl} --token <token>`);
38
+ return { slug, filesWritten, outDir };
39
+ }
40
+ async function fetchDefinition(apiUrl, token, slug) {
41
+ const bySlug = await tryFetch(`${apiUrl}/workflow/definitions?slug=${encodeURIComponent(slug)}`, token);
42
+ if (bySlug) return bySlug;
43
+ const bySearch = await tryFetch(`${apiUrl}/workflow/catalog/search?q=${encodeURIComponent(slug)}`, token);
44
+ if (bySearch) return bySearch;
45
+ const modulesRes = await fetch(`${apiUrl}/modules`, {
46
+ headers: { Authorization: `Bearer ${token}` }
47
+ });
48
+ if (modulesRes.ok) {
49
+ const modules = await modulesRes.json();
50
+ const mod = modules.find((m) => m.module_id === slug || m.name?.toLowerCase() === slug.toLowerCase());
51
+ if (mod) {
52
+ const fullRes = await fetch(`${apiUrl}/workflow/definitions/${mod.module_id}`, {
53
+ headers: { Authorization: `Bearer ${token}` }
54
+ });
55
+ if (fullRes.ok) {
56
+ return normalizeApiResponse(await fullRes.json());
57
+ }
58
+ }
59
+ }
60
+ return null;
61
+ }
62
+ async function tryFetch(url, token) {
63
+ try {
64
+ const res = await fetch(url, {
65
+ headers: { Authorization: `Bearer ${token}` }
66
+ });
67
+ if (!res.ok) return null;
68
+ const data = await res.json();
69
+ if (Array.isArray(data)) {
70
+ if (data.length === 0) return null;
71
+ return normalizeApiResponse(data[0]);
72
+ }
73
+ const items = data.items ?? data.data;
74
+ if (items && Array.isArray(items)) {
75
+ if (items.length === 0) return null;
76
+ return normalizeApiResponse(items[0]);
77
+ }
78
+ return normalizeApiResponse(data);
79
+ } catch {
80
+ return null;
81
+ }
82
+ }
83
+ function normalizeApiResponse(def) {
84
+ const ir = {
85
+ slug: def.slug,
86
+ name: def.name,
87
+ version: def.version || "1.0.0",
88
+ description: def.description || "",
89
+ category: def.category || "workflow",
90
+ fields: def.fields || [],
91
+ states: def.states || [],
92
+ transitions: def.transitions || [],
93
+ roles: def.roles || [],
94
+ on_event: def.on_event || [],
95
+ metadata: {
96
+ ...def.metadata || {}
97
+ }
98
+ };
99
+ const experience = def.view || def.experience || def.metadata?.experience;
100
+ if (experience) {
101
+ ir.experience = experience;
102
+ ir.metadata.experience = experience;
103
+ ir.view = experience;
104
+ }
105
+ return ir;
106
+ }
107
+ export {
108
+ pull
109
+ };
@@ -0,0 +1,109 @@
1
+ import {
2
+ decompileProjectEnhanced
3
+ } from "./chunk-SU4E6E7B.mjs";
4
+ import "./chunk-Y6FXYEAI.mjs";
5
+
6
+ // src/cli/pull.ts
7
+ import { mkdirSync, writeFileSync } from "fs";
8
+ import { join, dirname } from "path";
9
+ async function pull(options) {
10
+ const { slug, apiUrl, token } = options;
11
+ const outDir = options.outDir ?? slug;
12
+ console.log(`[mmrc pull] Fetching "${slug}" from ${apiUrl}...`);
13
+ const ir = await fetchDefinition(apiUrl, token, slug);
14
+ if (!ir) {
15
+ throw new Error(`Definition "${slug}" not found`);
16
+ }
17
+ console.log(` Found: ${ir.name || ir.slug} (${ir.category || "workflow"}, v${ir.version || "1.0.0"})`);
18
+ console.log(` Fields: ${ir.fields?.length ?? 0}, States: ${ir.states?.length ?? 0}, Transitions: ${ir.transitions?.length ?? 0}`);
19
+ const result = decompileProjectEnhanced(ir);
20
+ mkdirSync(outDir, { recursive: true });
21
+ const filesWritten = [];
22
+ for (const file of result.files) {
23
+ const filePath = join(outDir, file.path);
24
+ mkdirSync(dirname(filePath), { recursive: true });
25
+ writeFileSync(filePath, file.content, "utf-8");
26
+ filesWritten.push(file.path);
27
+ console.log(` + ${file.path}`);
28
+ }
29
+ console.log(`
30
+ [mmrc pull] Scaffolded ${filesWritten.length} files in ${outDir}/`);
31
+ console.log(` Entry: ${result.entryFile}`);
32
+ console.log(`
33
+ Next steps:`);
34
+ console.log(` cd ${outDir}`);
35
+ console.log(` mmrc dev --src .`);
36
+ console.log(` # Edit files, then deploy back:`);
37
+ console.log(` mmrc deploy --src . --api-url ${apiUrl} --token <token>`);
38
+ return { slug, filesWritten, outDir };
39
+ }
40
+ async function fetchDefinition(apiUrl, token, slug) {
41
+ const bySlug = await tryFetch(`${apiUrl}/workflow/definitions?slug=${encodeURIComponent(slug)}`, token);
42
+ if (bySlug) return bySlug;
43
+ const bySearch = await tryFetch(`${apiUrl}/workflow/catalog/search?q=${encodeURIComponent(slug)}`, token);
44
+ if (bySearch) return bySearch;
45
+ const modulesRes = await fetch(`${apiUrl}/modules`, {
46
+ headers: { Authorization: `Bearer ${token}` }
47
+ });
48
+ if (modulesRes.ok) {
49
+ const modules = await modulesRes.json();
50
+ const mod = modules.find((m) => m.module_id === slug || m.name?.toLowerCase() === slug.toLowerCase());
51
+ if (mod) {
52
+ const fullRes = await fetch(`${apiUrl}/workflow/definitions/${mod.module_id}`, {
53
+ headers: { Authorization: `Bearer ${token}` }
54
+ });
55
+ if (fullRes.ok) {
56
+ return normalizeApiResponse(await fullRes.json());
57
+ }
58
+ }
59
+ }
60
+ return null;
61
+ }
62
+ async function tryFetch(url, token) {
63
+ try {
64
+ const res = await fetch(url, {
65
+ headers: { Authorization: `Bearer ${token}` }
66
+ });
67
+ if (!res.ok) return null;
68
+ const data = await res.json();
69
+ if (Array.isArray(data)) {
70
+ if (data.length === 0) return null;
71
+ return normalizeApiResponse(data[0]);
72
+ }
73
+ const items = data.items ?? data.data;
74
+ if (items && Array.isArray(items)) {
75
+ if (items.length === 0) return null;
76
+ return normalizeApiResponse(items[0]);
77
+ }
78
+ return normalizeApiResponse(data);
79
+ } catch {
80
+ return null;
81
+ }
82
+ }
83
+ function normalizeApiResponse(def) {
84
+ const ir = {
85
+ slug: def.slug,
86
+ name: def.name,
87
+ version: def.version || "1.0.0",
88
+ description: def.description || "",
89
+ category: def.category || "workflow",
90
+ fields: def.fields || [],
91
+ states: def.states || [],
92
+ transitions: def.transitions || [],
93
+ roles: def.roles || [],
94
+ on_event: def.on_event || [],
95
+ metadata: {
96
+ ...def.metadata || {}
97
+ }
98
+ };
99
+ const experience = def.view || def.experience || def.metadata?.experience;
100
+ if (experience) {
101
+ ir.experience = experience;
102
+ ir.metadata.experience = experience;
103
+ ir.view = experience;
104
+ }
105
+ return ir;
106
+ }
107
+ export {
108
+ pull
109
+ };
@@ -0,0 +1,211 @@
1
+ import * as _mindmatrix_player_core from '@mindmatrix/player-core';
2
+ import { IRWorkflowDefinition } from '@mindmatrix/player-core';
3
+
4
+ interface CompileOptions {
5
+ /** Compilation mode. Default: 'infer' */
6
+ mode?: 'strict' | 'infer';
7
+ /** Override filename (affects file-type detection). */
8
+ filename?: string;
9
+ }
10
+ /**
11
+ * Compile a .workflow.tsx source string to IR.
12
+ * Returns the full IRWorkflowDefinition extracted by the Babel plugin.
13
+ */
14
+ declare function compileWorkflow(code: string, options?: CompileOptions): IRWorkflowDefinition;
15
+ /**
16
+ * Compile a model file (models/*.ts) to IR.
17
+ * Model files use interface-based extraction (no JSX).
18
+ */
19
+ declare function compileModel(code: string, options?: CompileOptions): IRWorkflowDefinition;
20
+ /**
21
+ * Compile a server action file (*.server.ts) to IR.
22
+ */
23
+ declare function compileServerAction(code: string, options?: CompileOptions): IRWorkflowDefinition;
24
+ /**
25
+ * Extract raw Babel metadata from compilation (IR + warnings + errors).
26
+ */
27
+ declare function compileRaw(code: string, options?: CompileOptions): {
28
+ ir: IRWorkflowDefinition | undefined;
29
+ code: string | null;
30
+ warnings: Array<{
31
+ message: string;
32
+ code?: string;
33
+ }>;
34
+ errors: Array<{
35
+ message: string;
36
+ code?: string;
37
+ }>;
38
+ };
39
+ /**
40
+ * Mock blueprint context for testing workflow components.
41
+ *
42
+ * Provides the minimal context shape that @mindmatrix/react hooks expect.
43
+ * Does NOT render React — this is a data-only mock for unit testing IR output.
44
+ */
45
+ interface MockBlueprintProviderProps {
46
+ /** Blueprint slug. Default: 'test-blueprint' */
47
+ slug?: string;
48
+ /** Blueprint version. Default: '1.0.0' */
49
+ version?: string;
50
+ /** Initial state data for the workflow instance. */
51
+ initialState?: Record<string, unknown>;
52
+ /** Mock definitions available in context. */
53
+ definitions?: IRWorkflowDefinition[];
54
+ }
55
+ /**
56
+ * Creates a mock blueprint context value.
57
+ *
58
+ * Use this to provide context when testing hooks or components that
59
+ * read from BlueprintContext.
60
+ */
61
+ declare function createMockBlueprintContext(props?: MockBlueprintProviderProps): {
62
+ slug: string;
63
+ version: string;
64
+ definitions: IRWorkflowDefinition[];
65
+ activeDefinition: IRWorkflowDefinition;
66
+ instanceState: Record<string, unknown>;
67
+ dispatch: () => void;
68
+ navigate: () => void;
69
+ };
70
+ /**
71
+ * Mock workflow provider props for testing individual workflow components.
72
+ */
73
+ interface MockWorkflowProviderProps {
74
+ /** Workflow slug. Default: 'test-workflow' */
75
+ slug?: string;
76
+ /** Current state name. Default: 'draft' */
77
+ currentState?: string;
78
+ /** Field values. */
79
+ fields?: Record<string, unknown>;
80
+ /** Available transitions from current state. */
81
+ transitions?: string[];
82
+ /** Mock transition handler. */
83
+ onTransition?: (name: string, data?: Record<string, unknown>) => void;
84
+ }
85
+ /**
86
+ * Creates a mock workflow context value.
87
+ *
88
+ * Provides the shape expected by useWorkflow(), useTransition(), etc.
89
+ */
90
+ declare function createMockWorkflowContext(props?: MockWorkflowProviderProps): {
91
+ slug: string;
92
+ currentState: string;
93
+ fields: Record<string, unknown>;
94
+ availableTransitions: string[];
95
+ transition: (name: string, data?: Record<string, unknown>) => void;
96
+ setField: (name: string, value: unknown) => void;
97
+ getField: (name: string) => unknown;
98
+ };
99
+ /**
100
+ * Convenience: compile + extract specific parts of the IR.
101
+ */
102
+ declare function extractFields(code: string, options?: CompileOptions): _mindmatrix_player_core.IRFieldDefinition[];
103
+ declare function extractStates(code: string, options?: CompileOptions): _mindmatrix_player_core.IRStateDefinition[];
104
+ declare function extractTransitions(code: string, options?: CompileOptions): _mindmatrix_player_core.IRTransitionDefinition[];
105
+
106
+ /**
107
+ * IR Snapshot Utilities — snapshot and compare compiled IR for regression testing.
108
+ *
109
+ * snapshotIR() compiles a .workflow.tsx source and returns a stable, serializable
110
+ * IR representation suitable for vitest's toMatchSnapshot() or the custom
111
+ * toMatchIR() matcher.
112
+ *
113
+ * Usage:
114
+ * import { snapshotIR, installIRMatchers } from '@mindmatrix/react-compiler/testing';
115
+ *
116
+ * // In vitest setup or test file:
117
+ * installIRMatchers();
118
+ *
119
+ * it('counter IR is stable', () => {
120
+ * const snapshot = snapshotIR(`
121
+ * import { useState } from 'react';
122
+ * export function Counter() {
123
+ * const [count, setCount] = useState(0);
124
+ * return <div>{count}</div>;
125
+ * }
126
+ * `);
127
+ * expect(snapshot).toMatchSnapshot();
128
+ * });
129
+ *
130
+ * it('IR matches expected shape', () => {
131
+ * const ir = compileWorkflow(`...`);
132
+ * expect(ir).toMatchIR({
133
+ * fields: [{ name: 'count', type: 'number' }],
134
+ * states: expect.arrayContaining([expect.objectContaining({ name: 'draft' })]),
135
+ * });
136
+ * });
137
+ */
138
+
139
+ interface IRSnapshot {
140
+ /** Workflow slug. */
141
+ slug: string;
142
+ /** Version. */
143
+ version: string;
144
+ /** Category. */
145
+ category: string;
146
+ /** Field names and types. */
147
+ fields: Array<{
148
+ name: string;
149
+ type: string;
150
+ required?: boolean;
151
+ }>;
152
+ /** State names and types. */
153
+ states: Array<{
154
+ name: string;
155
+ type: string;
156
+ enterActions: number;
157
+ exitActions: number;
158
+ }>;
159
+ /** Transition names with from→to. */
160
+ transitions: Array<{
161
+ name: string;
162
+ from: string | string[];
163
+ to: string;
164
+ conditions: number;
165
+ }>;
166
+ /** Whether experience (JSX) is present. */
167
+ hasExperience: boolean;
168
+ /** Extension tags present (cedar, cron, etc.). */
169
+ extensionTags: string[];
170
+ /** Number of data sources. */
171
+ dataSourceCount: number;
172
+ /** Number of mutation targets. */
173
+ mutationTargetCount: number;
174
+ /** Error count. */
175
+ errorCount: number;
176
+ }
177
+ /**
178
+ * Compile workflow source and extract a stable snapshot of its IR structure.
179
+ *
180
+ * The snapshot omits volatile data (action IDs, generated code) and keeps only
181
+ * the structural shape — making it safe for snapshot testing across refactors.
182
+ */
183
+ declare function snapshotIR(code: string, options?: CompileOptions): IRSnapshot;
184
+ /**
185
+ * Convert an already-compiled IR to a snapshot.
186
+ */
187
+ declare function irToSnapshot(ir: IRWorkflowDefinition): IRSnapshot;
188
+ /**
189
+ * Partial IR shape for matching.
190
+ * Every field is optional — only specified fields are checked.
191
+ */
192
+ interface IRMatcher {
193
+ slug?: string;
194
+ version?: string;
195
+ category?: string;
196
+ fields?: Array<Record<string, unknown>>;
197
+ states?: Array<Record<string, unknown>>;
198
+ transitions?: Array<Record<string, unknown>>;
199
+ description?: string;
200
+ [key: string]: unknown;
201
+ }
202
+ /**
203
+ * Install the toMatchIR() custom matcher into vitest's expect.
204
+ *
205
+ * Call this once in your test setup file or at the top of a test file:
206
+ * import { installIRMatchers } from '@mindmatrix/react-compiler/testing';
207
+ * installIRMatchers();
208
+ */
209
+ declare function installIRMatchers(): void;
210
+
211
+ export { type CompileOptions, type IRMatcher, type IRSnapshot, type MockBlueprintProviderProps, type MockWorkflowProviderProps, compileModel, compileRaw, compileServerAction, compileWorkflow, createMockBlueprintContext, createMockWorkflowContext, extractFields, extractStates, extractTransitions, installIRMatchers, irToSnapshot, snapshotIR };
@@ -0,0 +1,211 @@
1
+ import * as _mindmatrix_player_core from '@mindmatrix/player-core';
2
+ import { IRWorkflowDefinition } from '@mindmatrix/player-core';
3
+
4
+ interface CompileOptions {
5
+ /** Compilation mode. Default: 'infer' */
6
+ mode?: 'strict' | 'infer';
7
+ /** Override filename (affects file-type detection). */
8
+ filename?: string;
9
+ }
10
+ /**
11
+ * Compile a .workflow.tsx source string to IR.
12
+ * Returns the full IRWorkflowDefinition extracted by the Babel plugin.
13
+ */
14
+ declare function compileWorkflow(code: string, options?: CompileOptions): IRWorkflowDefinition;
15
+ /**
16
+ * Compile a model file (models/*.ts) to IR.
17
+ * Model files use interface-based extraction (no JSX).
18
+ */
19
+ declare function compileModel(code: string, options?: CompileOptions): IRWorkflowDefinition;
20
+ /**
21
+ * Compile a server action file (*.server.ts) to IR.
22
+ */
23
+ declare function compileServerAction(code: string, options?: CompileOptions): IRWorkflowDefinition;
24
+ /**
25
+ * Extract raw Babel metadata from compilation (IR + warnings + errors).
26
+ */
27
+ declare function compileRaw(code: string, options?: CompileOptions): {
28
+ ir: IRWorkflowDefinition | undefined;
29
+ code: string | null;
30
+ warnings: Array<{
31
+ message: string;
32
+ code?: string;
33
+ }>;
34
+ errors: Array<{
35
+ message: string;
36
+ code?: string;
37
+ }>;
38
+ };
39
+ /**
40
+ * Mock blueprint context for testing workflow components.
41
+ *
42
+ * Provides the minimal context shape that @mindmatrix/react hooks expect.
43
+ * Does NOT render React — this is a data-only mock for unit testing IR output.
44
+ */
45
+ interface MockBlueprintProviderProps {
46
+ /** Blueprint slug. Default: 'test-blueprint' */
47
+ slug?: string;
48
+ /** Blueprint version. Default: '1.0.0' */
49
+ version?: string;
50
+ /** Initial state data for the workflow instance. */
51
+ initialState?: Record<string, unknown>;
52
+ /** Mock definitions available in context. */
53
+ definitions?: IRWorkflowDefinition[];
54
+ }
55
+ /**
56
+ * Creates a mock blueprint context value.
57
+ *
58
+ * Use this to provide context when testing hooks or components that
59
+ * read from BlueprintContext.
60
+ */
61
+ declare function createMockBlueprintContext(props?: MockBlueprintProviderProps): {
62
+ slug: string;
63
+ version: string;
64
+ definitions: IRWorkflowDefinition[];
65
+ activeDefinition: IRWorkflowDefinition;
66
+ instanceState: Record<string, unknown>;
67
+ dispatch: () => void;
68
+ navigate: () => void;
69
+ };
70
+ /**
71
+ * Mock workflow provider props for testing individual workflow components.
72
+ */
73
+ interface MockWorkflowProviderProps {
74
+ /** Workflow slug. Default: 'test-workflow' */
75
+ slug?: string;
76
+ /** Current state name. Default: 'draft' */
77
+ currentState?: string;
78
+ /** Field values. */
79
+ fields?: Record<string, unknown>;
80
+ /** Available transitions from current state. */
81
+ transitions?: string[];
82
+ /** Mock transition handler. */
83
+ onTransition?: (name: string, data?: Record<string, unknown>) => void;
84
+ }
85
+ /**
86
+ * Creates a mock workflow context value.
87
+ *
88
+ * Provides the shape expected by useWorkflow(), useTransition(), etc.
89
+ */
90
+ declare function createMockWorkflowContext(props?: MockWorkflowProviderProps): {
91
+ slug: string;
92
+ currentState: string;
93
+ fields: Record<string, unknown>;
94
+ availableTransitions: string[];
95
+ transition: (name: string, data?: Record<string, unknown>) => void;
96
+ setField: (name: string, value: unknown) => void;
97
+ getField: (name: string) => unknown;
98
+ };
99
+ /**
100
+ * Convenience: compile + extract specific parts of the IR.
101
+ */
102
+ declare function extractFields(code: string, options?: CompileOptions): _mindmatrix_player_core.IRFieldDefinition[];
103
+ declare function extractStates(code: string, options?: CompileOptions): _mindmatrix_player_core.IRStateDefinition[];
104
+ declare function extractTransitions(code: string, options?: CompileOptions): _mindmatrix_player_core.IRTransitionDefinition[];
105
+
106
+ /**
107
+ * IR Snapshot Utilities — snapshot and compare compiled IR for regression testing.
108
+ *
109
+ * snapshotIR() compiles a .workflow.tsx source and returns a stable, serializable
110
+ * IR representation suitable for vitest's toMatchSnapshot() or the custom
111
+ * toMatchIR() matcher.
112
+ *
113
+ * Usage:
114
+ * import { snapshotIR, installIRMatchers } from '@mindmatrix/react-compiler/testing';
115
+ *
116
+ * // In vitest setup or test file:
117
+ * installIRMatchers();
118
+ *
119
+ * it('counter IR is stable', () => {
120
+ * const snapshot = snapshotIR(`
121
+ * import { useState } from 'react';
122
+ * export function Counter() {
123
+ * const [count, setCount] = useState(0);
124
+ * return <div>{count}</div>;
125
+ * }
126
+ * `);
127
+ * expect(snapshot).toMatchSnapshot();
128
+ * });
129
+ *
130
+ * it('IR matches expected shape', () => {
131
+ * const ir = compileWorkflow(`...`);
132
+ * expect(ir).toMatchIR({
133
+ * fields: [{ name: 'count', type: 'number' }],
134
+ * states: expect.arrayContaining([expect.objectContaining({ name: 'draft' })]),
135
+ * });
136
+ * });
137
+ */
138
+
139
+ interface IRSnapshot {
140
+ /** Workflow slug. */
141
+ slug: string;
142
+ /** Version. */
143
+ version: string;
144
+ /** Category. */
145
+ category: string;
146
+ /** Field names and types. */
147
+ fields: Array<{
148
+ name: string;
149
+ type: string;
150
+ required?: boolean;
151
+ }>;
152
+ /** State names and types. */
153
+ states: Array<{
154
+ name: string;
155
+ type: string;
156
+ enterActions: number;
157
+ exitActions: number;
158
+ }>;
159
+ /** Transition names with from→to. */
160
+ transitions: Array<{
161
+ name: string;
162
+ from: string | string[];
163
+ to: string;
164
+ conditions: number;
165
+ }>;
166
+ /** Whether experience (JSX) is present. */
167
+ hasExperience: boolean;
168
+ /** Extension tags present (cedar, cron, etc.). */
169
+ extensionTags: string[];
170
+ /** Number of data sources. */
171
+ dataSourceCount: number;
172
+ /** Number of mutation targets. */
173
+ mutationTargetCount: number;
174
+ /** Error count. */
175
+ errorCount: number;
176
+ }
177
+ /**
178
+ * Compile workflow source and extract a stable snapshot of its IR structure.
179
+ *
180
+ * The snapshot omits volatile data (action IDs, generated code) and keeps only
181
+ * the structural shape — making it safe for snapshot testing across refactors.
182
+ */
183
+ declare function snapshotIR(code: string, options?: CompileOptions): IRSnapshot;
184
+ /**
185
+ * Convert an already-compiled IR to a snapshot.
186
+ */
187
+ declare function irToSnapshot(ir: IRWorkflowDefinition): IRSnapshot;
188
+ /**
189
+ * Partial IR shape for matching.
190
+ * Every field is optional — only specified fields are checked.
191
+ */
192
+ interface IRMatcher {
193
+ slug?: string;
194
+ version?: string;
195
+ category?: string;
196
+ fields?: Array<Record<string, unknown>>;
197
+ states?: Array<Record<string, unknown>>;
198
+ transitions?: Array<Record<string, unknown>>;
199
+ description?: string;
200
+ [key: string]: unknown;
201
+ }
202
+ /**
203
+ * Install the toMatchIR() custom matcher into vitest's expect.
204
+ *
205
+ * Call this once in your test setup file or at the top of a test file:
206
+ * import { installIRMatchers } from '@mindmatrix/react-compiler/testing';
207
+ * installIRMatchers();
208
+ */
209
+ declare function installIRMatchers(): void;
210
+
211
+ export { type CompileOptions, type IRMatcher, type IRSnapshot, type MockBlueprintProviderProps, type MockWorkflowProviderProps, compileModel, compileRaw, compileServerAction, compileWorkflow, createMockBlueprintContext, createMockWorkflowContext, extractFields, extractStates, extractTransitions, installIRMatchers, irToSnapshot, snapshotIR };