@mmapp/react-compiler 0.1.0-alpha.1 → 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.
- package/ATOM-PIPELINE.md +144 -0
- package/README.md +88 -40
- package/dist/babel/index.js +2814 -277
- package/dist/babel/index.mjs +2 -2
- package/dist/chunk-3USIFFE4.mjs +2190 -0
- package/dist/chunk-45YMGEVT.mjs +186 -0
- package/dist/chunk-4FN2AISW.mjs +148 -0
- package/dist/chunk-4OPI5L7G.mjs +2593 -0
- package/dist/chunk-4RYTKOOJ.mjs +186 -0
- package/dist/chunk-52XHYD2V.mjs +214 -0
- package/dist/chunk-5GUFFFGL.mjs +148 -0
- package/dist/chunk-5RKTOVR5.mjs +244 -0
- package/dist/chunk-5YDMOO4X.mjs +214 -0
- package/dist/chunk-64ZWEMLJ.mjs +148 -0
- package/dist/chunk-6XP4KSWQ.mjs +2190 -0
- package/dist/chunk-72QWL54I.mjs +175 -0
- package/dist/chunk-7B4TRI7C.mjs +4835 -0
- package/dist/chunk-7ZKGHTNB.mjs +4952 -0
- package/dist/chunk-CIESM3BP.mjs +33 -0
- package/dist/chunk-DE3ZGQAC.mjs +148 -0
- package/dist/chunk-DMCY3BBG.mjs +1933 -0
- package/dist/chunk-DPIK3PJS.mjs +244 -0
- package/dist/chunk-E5IVH4RE.mjs +186 -0
- package/dist/chunk-E6FZNUR5.mjs +4953 -0
- package/dist/chunk-EJRBDQDP.mjs +2607 -0
- package/dist/chunk-ELO4TXJL.mjs +186 -0
- package/dist/chunk-EO6SYNCG.mjs +175 -0
- package/dist/chunk-FKRO52XH.mjs +3446 -0
- package/dist/chunk-FL4YAKU6.mjs +4941 -0
- package/dist/chunk-FYT47UBU.mjs +5076 -0
- package/dist/chunk-GCLGPOJZ.mjs +148 -0
- package/dist/chunk-GXB4JOP7.mjs +5072 -0
- package/dist/chunk-HFXOUMTD.mjs +175 -0
- package/dist/chunk-HWIZ47US.mjs +214 -0
- package/dist/chunk-IB7MNPQL.mjs +4953 -0
- package/dist/chunk-ICSIHQCG.mjs +148 -0
- package/dist/chunk-J7JUAHS4.mjs +186 -0
- package/dist/chunk-JLA5VNQ3.mjs +186 -0
- package/dist/chunk-JQLWFCTM.mjs +214 -0
- package/dist/chunk-KFJJCQAL.mjs +148 -0
- package/dist/chunk-KJUIIEQE.mjs +186 -0
- package/dist/chunk-KNWTHRVQ.mjs +175 -0
- package/dist/chunk-KSG4XSZF.mjs +175 -0
- package/dist/chunk-LF5N6DOU.mjs +175 -0
- package/dist/chunk-LJQCM2IM.mjs +214 -0
- package/dist/chunk-NTB7OEX2.mjs +2918 -0
- package/dist/chunk-NW6555WJ.mjs +186 -0
- package/dist/chunk-OMZE6VLQ.mjs +214 -0
- package/dist/chunk-OPJKP747.mjs +7506 -0
- package/dist/chunk-P4BR7WVO.mjs +2190 -0
- package/dist/chunk-QQHVYH2X.mjs +244 -0
- package/dist/chunk-S5QLWLLT.mjs +186 -0
- package/dist/chunk-SCWGT2FY.mjs +2190 -0
- package/dist/chunk-SMKJUSB3.mjs +2190 -0
- package/dist/chunk-THFYE5ZX.mjs +244 -0
- package/dist/chunk-VCAY2KGM.mjs +175 -0
- package/dist/chunk-WBYMW4NQ.mjs +3450 -0
- package/dist/chunk-WECAV6QB.mjs +148 -0
- package/dist/chunk-WMKBXUCE.mjs +3228 -0
- package/dist/chunk-XAJ5BKKL.mjs +4947 -0
- package/dist/chunk-XG2X7AEA.mjs +175 -0
- package/dist/chunk-XG7Z23NQ.mjs +148 -0
- package/dist/chunk-XWZAOCQ7.mjs +2607 -0
- package/dist/chunk-Y6MA7ULW.mjs +148 -0
- package/dist/chunk-YMS7Q7LG.mjs +214 -0
- package/dist/chunk-ZA37XTGA.mjs +175 -0
- package/dist/cli/index.js +13189 -6838
- package/dist/cli/index.mjs +140 -22
- package/dist/codemod/cli.mjs +1 -1
- package/dist/codemod/index.mjs +1 -1
- package/dist/config-PL24KEWL.mjs +219 -0
- package/dist/dev-server-RmGHIntF.d.mts +113 -0
- package/dist/dev-server-RmGHIntF.d.ts +113 -0
- package/dist/dev-server.d.mts +1 -1
- package/dist/dev-server.d.ts +1 -1
- package/dist/dev-server.js +4135 -440
- package/dist/dev-server.mjs +5 -5
- package/dist/envelope.js +2812 -275
- package/dist/envelope.mjs +3 -3
- package/dist/index.d.mts +161 -2
- package/dist/index.d.ts +161 -2
- package/dist/index.js +4429 -428
- package/dist/index.mjs +217 -9
- package/{src/cli/init.ts → dist/init-7JQMAAXS.mjs} +70 -95
- package/dist/init-DQDX3QK6.mjs +369 -0
- package/dist/init-EHO4VQ22.mjs +369 -0
- package/dist/init-UC3FWPIW.mjs +367 -0
- package/dist/init-UNSMVKIK.mjs +366 -0
- package/dist/init-UNV5XIDE.mjs +367 -0
- package/dist/project-compiler-2P4N4DR7.mjs +10 -0
- package/dist/project-compiler-D2LCC27O.mjs +10 -0
- package/dist/project-compiler-EJ3GANJE.mjs +10 -0
- package/dist/project-compiler-LOQKVRZJ.mjs +10 -0
- package/dist/project-compiler-OP2VVGJQ.mjs +10 -0
- package/dist/project-compiler-RQ6OQKRM.mjs +10 -0
- package/dist/project-compiler-VWNNCHGO.mjs +10 -0
- package/dist/project-compiler-XVAAU4C5.mjs +10 -0
- package/dist/project-compiler-YES5FGMD.mjs +10 -0
- package/dist/project-compiler-ZKMQDLGU.mjs +10 -0
- package/dist/project-decompiler-FLXCEJHS.mjs +7 -0
- package/dist/project-decompiler-US7GAVIC.mjs +7 -0
- package/dist/project-decompiler-VLPR22QF.mjs +7 -0
- package/dist/pull-FUS5QYZS.mjs +109 -0
- package/dist/pull-LD5ENLGY.mjs +109 -0
- package/dist/pull-P44LDRWB.mjs +109 -0
- package/dist/testing/index.js +2822 -285
- package/dist/testing/index.mjs +2 -2
- package/dist/verify-SEIXUGN4.mjs +1833 -0
- package/dist/vite/index.js +2815 -278
- package/dist/vite/index.mjs +3 -3
- package/examples/uber-app/app/admin/fleet.tsx +19 -19
- package/package.json +16 -6
- package/compile-blueprint-chat.mjs +0 -99
- package/compile-blueprint-glass-console.mjs +0 -98
- package/compile-chat-defs.mjs +0 -92
- package/examples/uber-app/tests/payment.test.tsx +0 -129
- package/examples/uber-app/tests/ride-flow.test.tsx +0 -123
- package/package.json.backup +0 -86
- package/scripts/decompile.ts +0 -226
- package/scripts/seed-auth.ts +0 -267
- package/scripts/seed-uber.ts +0 -248
- package/scripts/validate-uber.ts +0 -119
- package/seed-blueprint-chat.mjs +0 -444
- package/seed-blueprint-glass-console.mjs +0 -445
- package/seed-compiled.mjs +0 -318
- package/src/RoundTripValidator.ts +0 -400
- package/src/__tests__/atom-rendering-coverage.test.ts +0 -680
- package/src/__tests__/auth-module-compilation.test.ts +0 -247
- package/src/__tests__/auth-template-compilation.test.ts +0 -589
- package/src/__tests__/change-extractor.test.ts +0 -142
- package/src/__tests__/cli-pull.test.ts +0 -73
- package/src/__tests__/cli-test.test.ts +0 -72
- package/src/__tests__/component-extractor.test.ts +0 -331
- package/src/__tests__/context-extractor.test.ts +0 -145
- package/src/__tests__/decompiler.test.ts +0 -718
- package/src/__tests__/define-blueprint.test.ts +0 -133
- package/src/__tests__/definition-validator.test.ts +0 -519
- package/src/__tests__/during-extractor.test.ts +0 -152
- package/src/__tests__/effect-extractor.test.ts +0 -107
- package/src/__tests__/event-emission.test.ts +0 -127
- package/src/__tests__/examples.test.ts +0 -236
- package/src/__tests__/full-blueprint-coverage.test.ts +0 -1221
- package/src/__tests__/golden-suite.test.ts +0 -403
- package/src/__tests__/grammar-island-extractor.test.ts +0 -289
- package/src/__tests__/instance-key.test.ts +0 -82
- package/src/__tests__/ir-migration.test.ts +0 -255
- package/src/__tests__/lock-file.test.ts +0 -117
- package/src/__tests__/model-extractor.test.ts +0 -195
- package/src/__tests__/model-field-acl.test.ts +0 -237
- package/src/__tests__/model-hooks.test.ts +0 -130
- package/src/__tests__/model-ref-resolution.test.ts +0 -268
- package/src/__tests__/model-roundtrip.test.ts +0 -502
- package/src/__tests__/model-runtime.test.ts +0 -112
- package/src/__tests__/model-transitions.test.ts +0 -183
- package/src/__tests__/nrt-action-trace.test.ts +0 -391
- package/src/__tests__/pipeline-hardening.test.ts +0 -413
- package/src/__tests__/project-compiler.test.ts +0 -546
- package/src/__tests__/project-decompiler.test.ts +0 -343
- package/src/__tests__/query-compilation.test.ts +0 -145
- package/src/__tests__/round-trip/PLAN.md +0 -158
- package/src/__tests__/round-trip/README.md +0 -52
- package/src/__tests__/round-trip/RESULTS.md +0 -86
- package/src/__tests__/round-trip/fixtures/data-heavy/main.workflow.tsx +0 -55
- package/src/__tests__/round-trip/fixtures/data-heavy/mm.config.ts +0 -11
- package/src/__tests__/round-trip/fixtures/data-heavy/models/contact.ts +0 -54
- package/src/__tests__/round-trip/fixtures/full-workflow/main.workflow.tsx +0 -79
- package/src/__tests__/round-trip/fixtures/full-workflow/mm.config.ts +0 -12
- package/src/__tests__/round-trip/fixtures/full-workflow/models/order.ts +0 -50
- package/src/__tests__/round-trip/fixtures/simple-crud/main.workflow.tsx +0 -25
- package/src/__tests__/round-trip/fixtures/simple-crud/mm.config.ts +0 -11
- package/src/__tests__/round-trip/fixtures/simple-crud/models/task.ts +0 -32
- package/src/__tests__/round-trip/fixtures/view-heavy/main.workflow.tsx +0 -79
- package/src/__tests__/round-trip/fixtures/view-heavy/mm.config.ts +0 -10
- package/src/__tests__/round-trip/round-trip.test.ts +0 -2598
- package/src/__tests__/round-trip-ir.test.ts +0 -300
- package/src/__tests__/round-trip.test.ts +0 -1212
- package/src/__tests__/route-merging.test.ts +0 -372
- package/src/__tests__/router-composition.test.ts +0 -489
- package/src/__tests__/router-extractor.test.ts +0 -176
- package/src/__tests__/server-action-extractor.test.ts +0 -128
- package/src/__tests__/smart-type-inference.test.ts +0 -365
- package/src/__tests__/source-envelope.test.ts +0 -284
- package/src/__tests__/source-fidelity.test.ts +0 -516
- package/src/__tests__/state-extractor.test.ts +0 -115
- package/src/__tests__/strict-mode.test.ts +0 -227
- package/src/__tests__/transition-effect-extractor.test.ts +0 -119
- package/src/__tests__/transition-extractor.test.ts +0 -68
- package/src/__tests__/ts-to-expression.test.ts +0 -462
- package/src/__tests__/type-generator.test.ts +0 -201
- package/src/__tests__/uber-validation.test.ts +0 -502
- package/src/action-compiler.ts +0 -361
- package/src/babel/emitters/experience-transform.ts +0 -199
- package/src/babel/emitters/ir-to-tsx-emitter.ts +0 -110
- package/src/babel/emitters/pure-form-emitter.ts +0 -1023
- package/src/babel/emitters/runtime-glue-emitter.ts +0 -39
- package/src/babel/extractors/change-extractor.ts +0 -199
- package/src/babel/extractors/component-extractor.ts +0 -907
- package/src/babel/extractors/computed-extractor.ts +0 -262
- package/src/babel/extractors/context-extractor.ts +0 -277
- package/src/babel/extractors/during-extractor.ts +0 -295
- package/src/babel/extractors/effect-extractor.ts +0 -340
- package/src/babel/extractors/event-extractor.ts +0 -235
- package/src/babel/extractors/grammar-island-extractor.ts +0 -302
- package/src/babel/extractors/model-extractor.ts +0 -1018
- package/src/babel/extractors/router-extractor.ts +0 -303
- package/src/babel/extractors/server-action-extractor.ts +0 -173
- package/src/babel/extractors/server-action-hook-extractor.ts +0 -72
- package/src/babel/extractors/server-state-extractor.ts +0 -88
- package/src/babel/extractors/state-extractor.ts +0 -214
- package/src/babel/extractors/transition-effect-extractor.ts +0 -176
- package/src/babel/extractors/transition-extractor.ts +0 -143
- package/src/babel/index.ts +0 -24
- package/src/babel/transpilers/ts-to-expression.ts +0 -674
- package/src/babel/visitor.ts +0 -807
- package/src/cli/auth.ts +0 -255
- package/src/cli/build.ts +0 -288
- package/src/cli/deploy.ts +0 -206
- package/src/cli/index.ts +0 -328
- package/src/cli/installer.ts +0 -261
- package/src/cli/lock-file.ts +0 -94
- package/src/cli/mmrc.ts +0 -22
- package/src/cli/pull.ts +0 -172
- package/src/cli/registry-client.ts +0 -175
- package/src/cli/test.ts +0 -397
- package/src/cli/type-generator.ts +0 -243
- package/src/codemod/__tests__/forward.test.ts +0 -239
- package/src/codemod/__tests__/reverse.test.ts +0 -145
- package/src/codemod/__tests__/round-trip.test.ts +0 -137
- package/src/codemod/annotation.ts +0 -97
- package/src/codemod/classify.ts +0 -197
- package/src/codemod/cli.ts +0 -207
- package/src/codemod/control-flow.ts +0 -409
- package/src/codemod/forward.ts +0 -244
- package/src/codemod/import-manager.ts +0 -171
- package/src/codemod/index.ts +0 -120
- package/src/codemod/reverse.ts +0 -197
- package/src/codemod/rules.ts +0 -174
- package/src/codemod/state-transform.ts +0 -126
- package/src/decompiler/ast-builder.ts +0 -538
- package/src/decompiler/config-generator.ts +0 -151
- package/src/decompiler/index.ts +0 -315
- package/src/decompiler/project-decompiler.ts +0 -1776
- package/src/decompiler/project.ts +0 -862
- package/src/decompiler/split-strategy.ts +0 -140
- package/src/decompiler/state-emitter.ts +0 -1053
- package/src/decompiler/sx-emitter.ts +0 -318
- package/src/decompiler/workspace-hydrator.ts +0 -189
- package/src/dev-server.ts +0 -238
- package/src/envelope/fs-tree.ts +0 -217
- package/src/envelope/source-envelope.ts +0 -264
- package/src/envelope.ts +0 -315
- package/src/incremental-compiler.ts +0 -401
- package/src/index.ts +0 -99
- package/src/model-compiler.ts +0 -277
- package/src/project-compiler.ts +0 -1629
- package/src/route-extractor.ts +0 -333
- package/src/testing/index.ts +0 -32
- package/src/testing/snapshot.ts +0 -252
- package/src/testing/test-utils.ts +0 -226
- package/src/types.ts +0 -68
- package/src/vite/index.ts +0 -288
- package/test-compile.mjs +0 -142
- package/tsconfig.json +0 -25
- package/tsup.config.ts +0 -23
- package/vitest.config.ts +0 -9
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth Module Compilation Tests
|
|
3
|
-
*
|
|
4
|
-
* Verifies the authentication module (examples/authentication/) compiles
|
|
5
|
-
* through the project compiler and produces correct IR:
|
|
6
|
-
*
|
|
7
|
-
* 1. All files compile without errors
|
|
8
|
-
* 2. Correct fields extracted (config + runtime)
|
|
9
|
-
* 3. Correct states and transitions (auth state machine)
|
|
10
|
-
* 4. Experience tree has Router/Route structure
|
|
11
|
-
* 5. Category is 'module' (not 'blueprint')
|
|
12
|
-
* 6. Compiled output can be used as a DB seed
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { describe, it, expect } from 'vitest';
|
|
16
|
-
import { readFileSync } from 'fs';
|
|
17
|
-
import { resolve } from 'path';
|
|
18
|
-
import { compileProject } from '../project-compiler';
|
|
19
|
-
import type { IRExperienceNode } from '@mindmatrix/player-core';
|
|
20
|
-
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
// Load source files from disk
|
|
23
|
-
// ---------------------------------------------------------------------------
|
|
24
|
-
|
|
25
|
-
const EXAMPLES_DIR = resolve(__dirname, '../../examples/authentication');
|
|
26
|
-
|
|
27
|
-
function readExample(relativePath: string): string {
|
|
28
|
-
return readFileSync(resolve(EXAMPLES_DIR, relativePath), 'utf-8');
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function findAllByComponent(node: IRExperienceNode, component: string): IRExperienceNode[] {
|
|
32
|
-
const results: IRExperienceNode[] = [];
|
|
33
|
-
if (node.component === component) results.push(node);
|
|
34
|
-
for (const child of node.children ?? []) {
|
|
35
|
-
results.push(...findAllByComponent(child, component));
|
|
36
|
-
}
|
|
37
|
-
return results;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// ---------------------------------------------------------------------------
|
|
41
|
-
// Tests
|
|
42
|
-
// ---------------------------------------------------------------------------
|
|
43
|
-
|
|
44
|
-
describe('Auth Module — Project Compilation', () => {
|
|
45
|
-
// Compile once, share across tests
|
|
46
|
-
const files: Record<string, string> = {
|
|
47
|
-
'mm.config.ts': readExample('mm.config.ts'),
|
|
48
|
-
'main.workflow.tsx': readExample('main.workflow.tsx'),
|
|
49
|
-
'pages/LoginPage.tsx': readExample('pages/LoginPage.tsx'),
|
|
50
|
-
'pages/SignupPage.tsx': readExample('pages/SignupPage.tsx'),
|
|
51
|
-
'models/auth.ts': readExample('models/auth.ts'),
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const result = compileProject(files);
|
|
55
|
-
const ir = result.ir;
|
|
56
|
-
|
|
57
|
-
it('compiles all files without errors', () => {
|
|
58
|
-
const errors = result.errors.filter(e => e.severity === 'error');
|
|
59
|
-
if (errors.length > 0) {
|
|
60
|
-
console.log('Compilation errors:');
|
|
61
|
-
for (const err of errors) {
|
|
62
|
-
console.log(` ${err.file} (line ${err.line}): ${err.message}`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
expect(errors).toHaveLength(0);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('produces file IRs for all source files', () => {
|
|
69
|
-
expect(result.fileIRs['main.workflow.tsx']).toBeDefined();
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('extracts slug from @workflow annotation', () => {
|
|
73
|
-
expect(ir.slug).toBe('mod-authentication');
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it('extracts category as module', () => {
|
|
77
|
-
expect(ir.category).toBe('module');
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it('extracts version', () => {
|
|
81
|
-
expect(ir.version).toBe('1.0.0');
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('extracts config fields from useState', () => {
|
|
85
|
-
const fieldNames = ir.fields.map(f => f.name);
|
|
86
|
-
expect(fieldNames).toContain('appName');
|
|
87
|
-
expect(fieldNames).toContain('layout');
|
|
88
|
-
expect(fieldNames).toContain('showSignup');
|
|
89
|
-
expect(fieldNames).toContain('showForgotPassword');
|
|
90
|
-
expect(fieldNames).toContain('redirectPath');
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it('extracts runtime fields from useState', () => {
|
|
94
|
-
const fieldNames = ir.fields.map(f => f.name);
|
|
95
|
-
expect(fieldNames).toContain('email');
|
|
96
|
-
expect(fieldNames).toContain('password');
|
|
97
|
-
expect(fieldNames).toContain('confirmPassword');
|
|
98
|
-
expect(fieldNames).toContain('firstName');
|
|
99
|
-
expect(fieldNames).toContain('lastName');
|
|
100
|
-
expect(fieldNames).toContain('errorMessage');
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('infers correct field types', () => {
|
|
104
|
-
const appName = ir.fields.find(f => f.name === 'appName');
|
|
105
|
-
expect(appName?.type).toBe('text');
|
|
106
|
-
|
|
107
|
-
const showSignup = ir.fields.find(f => f.name === 'showSignup');
|
|
108
|
-
expect(showSignup?.type).toBe('boolean');
|
|
109
|
-
|
|
110
|
-
const layout = ir.fields.find(f => f.name === 'layout');
|
|
111
|
-
// Compiler may infer 'text' or 'select' depending on usage context
|
|
112
|
-
expect(['text', 'select']).toContain(layout?.type);
|
|
113
|
-
|
|
114
|
-
const email = ir.fields.find(f => f.name === 'email');
|
|
115
|
-
expect(email?.type).toBe('text');
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
it('extracts auth state machine states', () => {
|
|
119
|
-
const stateNames = ir.states.map(s => s.name);
|
|
120
|
-
expect(stateNames).toContain('unauthenticated');
|
|
121
|
-
expect(stateNames).toContain('error');
|
|
122
|
-
expect(stateNames).toContain('authenticated');
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it('extracts state enter hooks', () => {
|
|
126
|
-
const unauthenticated = ir.states.find(s => s.name === 'unauthenticated');
|
|
127
|
-
expect(unauthenticated?.on_enter.length).toBeGreaterThanOrEqual(1);
|
|
128
|
-
|
|
129
|
-
const error = ir.states.find(s => s.name === 'error');
|
|
130
|
-
expect(error?.on_enter.length).toBeGreaterThanOrEqual(1);
|
|
131
|
-
|
|
132
|
-
const authenticated = ir.states.find(s => s.name === 'authenticated');
|
|
133
|
-
expect(authenticated?.on_enter.length).toBeGreaterThanOrEqual(1);
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it('extracts 8 transitions', () => {
|
|
137
|
-
expect(ir.transitions.length).toBe(8);
|
|
138
|
-
const names = ir.transitions.map(t => t.name);
|
|
139
|
-
expect(names).toContain('login');
|
|
140
|
-
expect(names).toContain('login_success');
|
|
141
|
-
expect(names).toContain('login_error');
|
|
142
|
-
expect(names).toContain('signup');
|
|
143
|
-
expect(names).toContain('signup_success');
|
|
144
|
-
expect(names).toContain('signup_error');
|
|
145
|
-
expect(names).toContain('logout');
|
|
146
|
-
expect(names).toContain('retry');
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it('transitions have correct from/to states', () => {
|
|
150
|
-
const login = ir.transitions.find(t => t.name === 'login');
|
|
151
|
-
// from can be string or array depending on compiler output
|
|
152
|
-
const loginFrom = Array.isArray(login?.from) ? login.from[0] : login?.from;
|
|
153
|
-
expect(loginFrom).toBe('unauthenticated');
|
|
154
|
-
expect(login?.to).toBe('authenticating');
|
|
155
|
-
|
|
156
|
-
const loginSuccess = ir.transitions.find(t => t.name === 'login_success');
|
|
157
|
-
const lsFrom = Array.isArray(loginSuccess?.from) ? loginSuccess.from[0] : loginSuccess?.from;
|
|
158
|
-
expect(lsFrom).toBe('authenticating');
|
|
159
|
-
expect(loginSuccess?.to).toBe('authenticated');
|
|
160
|
-
|
|
161
|
-
const logout = ir.transitions.find(t => t.name === 'logout');
|
|
162
|
-
const logoutFrom = Array.isArray(logout?.from) ? logout.from[0] : logout?.from;
|
|
163
|
-
expect(logoutFrom).toBe('authenticated');
|
|
164
|
-
expect(logout?.to).toBe('unauthenticated');
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it('login transition has required fields', () => {
|
|
168
|
-
const login = ir.transitions.find(t => t.name === 'login');
|
|
169
|
-
// required_fields may be stored in different places depending on compiler version
|
|
170
|
-
const reqFields = login?.required_fields ?? (login as any)?.requiredFields ?? [];
|
|
171
|
-
expect(reqFields).toContain('email');
|
|
172
|
-
expect(reqFields).toContain('password');
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
it('produces an experience tree', () => {
|
|
176
|
-
const exp = ir.view ?? (ir.metadata as any)?.experience;
|
|
177
|
-
expect(exp).toBeDefined();
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it('experience tree has Route components', () => {
|
|
181
|
-
const exp = ir.view ?? (ir.metadata as any)?.experience;
|
|
182
|
-
if (exp) {
|
|
183
|
-
const routes = findAllByComponent(exp, 'Route');
|
|
184
|
-
expect(routes.length).toBeGreaterThanOrEqual(1);
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it('experience tree has child page references or inlined components', () => {
|
|
189
|
-
const exp = ir.view ?? (ir.metadata as any)?.experience;
|
|
190
|
-
if (exp) {
|
|
191
|
-
// Pages may be inlined or referenced — either way the tree should have children
|
|
192
|
-
const allChildren: IRExperienceNode[] = [];
|
|
193
|
-
function collect(node: IRExperienceNode) {
|
|
194
|
-
allChildren.push(node);
|
|
195
|
-
for (const child of node.children ?? []) collect(child);
|
|
196
|
-
}
|
|
197
|
-
collect(exp);
|
|
198
|
-
// The tree should have at least root + some children (Route, Card, etc.)
|
|
199
|
-
expect(allChildren.length).toBeGreaterThanOrEqual(2);
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
describe('Auth Module — Seed Payload Generation', () => {
|
|
205
|
-
const files: Record<string, string> = {
|
|
206
|
-
'mm.config.ts': readExample('mm.config.ts'),
|
|
207
|
-
'main.workflow.tsx': readExample('main.workflow.tsx'),
|
|
208
|
-
'pages/LoginPage.tsx': readExample('pages/LoginPage.tsx'),
|
|
209
|
-
'pages/SignupPage.tsx': readExample('pages/SignupPage.tsx'),
|
|
210
|
-
'models/auth.ts': readExample('models/auth.ts'),
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
const result = compileProject(files);
|
|
214
|
-
const ir = result.ir;
|
|
215
|
-
|
|
216
|
-
it('IR can be serialized to JSON for DB storage', () => {
|
|
217
|
-
const json = JSON.stringify(ir);
|
|
218
|
-
expect(json).toBeTruthy();
|
|
219
|
-
const parsed = JSON.parse(json);
|
|
220
|
-
expect(parsed.slug).toBe('mod-authentication');
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
it('fields array is valid JSONB for workflow_definitions.fields', () => {
|
|
224
|
-
const fieldsJson = JSON.stringify(ir.fields);
|
|
225
|
-
const parsed = JSON.parse(fieldsJson);
|
|
226
|
-
expect(Array.isArray(parsed)).toBe(true);
|
|
227
|
-
expect(parsed.length).toBeGreaterThanOrEqual(11); // 5 config + 6 runtime
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
it('states array is valid JSONB for workflow_definitions.states', () => {
|
|
231
|
-
const statesJson = JSON.stringify(ir.states);
|
|
232
|
-
const parsed = JSON.parse(statesJson);
|
|
233
|
-
expect(Array.isArray(parsed)).toBe(true);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
it('transitions array is valid JSONB for workflow_definitions.transitions', () => {
|
|
237
|
-
const transitionsJson = JSON.stringify(ir.transitions);
|
|
238
|
-
const parsed = JSON.parse(transitionsJson);
|
|
239
|
-
expect(Array.isArray(parsed)).toBe(true);
|
|
240
|
-
expect(parsed.length).toBe(8);
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
it('metadata includes system_module flag', () => {
|
|
244
|
-
// The seed process should add this; verify IR has metadata we can augment
|
|
245
|
-
expect(ir.metadata).toBeDefined();
|
|
246
|
-
});
|
|
247
|
-
});
|