@molecule/api-mock-server 1.0.0

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 (67) hide show
  1. package/LICENSE +115 -0
  2. package/README.md +853 -0
  3. package/dist/browser-guard.d.ts +2 -0
  4. package/dist/browser-guard.d.ts.map +1 -0
  5. package/dist/browser-guard.js +19 -0
  6. package/dist/browser-guard.js.map +1 -0
  7. package/dist/cli.d.ts +11 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +152 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/fixtures/app-fixtures.d.ts +54 -0
  12. package/dist/fixtures/app-fixtures.d.ts.map +1 -0
  13. package/dist/fixtures/app-fixtures.js +601 -0
  14. package/dist/fixtures/app-fixtures.js.map +1 -0
  15. package/dist/fixtures/index.d.ts +9 -0
  16. package/dist/fixtures/index.d.ts.map +1 -0
  17. package/dist/fixtures/index.js +9 -0
  18. package/dist/fixtures/index.js.map +1 -0
  19. package/dist/fixtures/seed.d.ts +74 -0
  20. package/dist/fixtures/seed.d.ts.map +1 -0
  21. package/dist/fixtures/seed.js +112 -0
  22. package/dist/fixtures/seed.js.map +1 -0
  23. package/dist/fixtures/semantic-generator.d.ts +20 -0
  24. package/dist/fixtures/semantic-generator.d.ts.map +1 -0
  25. package/dist/fixtures/semantic-generator.js +539 -0
  26. package/dist/fixtures/semantic-generator.js.map +1 -0
  27. package/dist/fixtures/zod-walker.d.ts +34 -0
  28. package/dist/fixtures/zod-walker.d.ts.map +1 -0
  29. package/dist/fixtures/zod-walker.js +183 -0
  30. package/dist/fixtures/zod-walker.js.map +1 -0
  31. package/dist/index.d.ts +78 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +78 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/scanner/index.d.ts +6 -0
  36. package/dist/scanner/index.d.ts.map +1 -0
  37. package/dist/scanner/index.js +6 -0
  38. package/dist/scanner/index.js.map +1 -0
  39. package/dist/scanner/scanner.d.ts +21 -0
  40. package/dist/scanner/scanner.d.ts.map +1 -0
  41. package/dist/scanner/scanner.js +463 -0
  42. package/dist/scanner/scanner.js.map +1 -0
  43. package/dist/server/index.d.ts +7 -0
  44. package/dist/server/index.d.ts.map +1 -0
  45. package/dist/server/index.js +7 -0
  46. package/dist/server/index.js.map +1 -0
  47. package/dist/server/middleware.d.ts +51 -0
  48. package/dist/server/middleware.d.ts.map +1 -0
  49. package/dist/server/middleware.js +124 -0
  50. package/dist/server/middleware.js.map +1 -0
  51. package/dist/server/server.d.ts +29 -0
  52. package/dist/server/server.d.ts.map +1 -0
  53. package/dist/server/server.js +314 -0
  54. package/dist/server/server.js.map +1 -0
  55. package/dist/states/index.d.ts +6 -0
  56. package/dist/states/index.d.ts.map +1 -0
  57. package/dist/states/index.js +6 -0
  58. package/dist/states/index.js.map +1 -0
  59. package/dist/states/states.d.ts +57 -0
  60. package/dist/states/states.d.ts.map +1 -0
  61. package/dist/states/states.js +89 -0
  62. package/dist/states/states.js.map +1 -0
  63. package/dist/types.d.ts +214 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +6 -0
  66. package/dist/types.js.map +1 -0
  67. package/package.json +66 -0
@@ -0,0 +1,601 @@
1
+ /**
2
+ * Fixture loading from JSON files in a directory.
3
+ * Each JSON file becomes a resource or endpoint group.
4
+ * No hardcoded app-specific data — all data lives in template fixture directories.
5
+ */
6
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
7
+ import { basename, join } from 'node:path';
8
+ import { createSeededRandom, randomInt, recentDate, seededUUID, seedFromPath } from './seed.js';
9
+ import { applySemanticRules } from './semantic-generator.js';
10
+ /* ------------------------------------------------------------------ */
11
+ /* Single-object response synthesis */
12
+ /* ------------------------------------------------------------------ */
13
+ /** Field names that should resolve to an array of records (top-N lists, recent activity, etc.). */
14
+ const ARRAY_FIELD_RE = /^(points|items|data|results|rows|recent|top|history|entries|list|series|breakdown|timeline|activity|feed|chart|buckets|labels|datasets|trend|trends|posts|orders|transactions|events|notifications|messages|members|users|categories|tags|reviews|sessions|logs)/i;
15
+ /** Field names that are a time/value series for a chart (one point per day). */
16
+ const CHART_SERIES_RE = /^(points|series|trend|trends|history|timeline|chart|chartData|graph|daily|weekly|monthly|overTime|byDay)/i;
17
+ /**
18
+ * Build a small array of generic records. Each record carries a grab-bag of
19
+ * the most common field names so whatever a list/chart component reads, it
20
+ * finds a plausible value rather than `undefined`.
21
+ * @param field
22
+ * @param rng
23
+ */
24
+ function generateRecordArray(field, rng) {
25
+ const isChart = CHART_SERIES_RE.test(field);
26
+ const count = isChart ? 7 : 5;
27
+ const out = [];
28
+ for (let i = 0; i < count; i++) {
29
+ if (isChart) {
30
+ const v = randomInt(rng, 20, 4000);
31
+ const d = new Date(Date.UTC(2026, 3, 16 - (count - 1 - i)));
32
+ out.push({
33
+ date: d.toISOString().slice(0, 10),
34
+ label: d.toISOString().slice(5, 10),
35
+ value: v,
36
+ views: v,
37
+ count: v,
38
+ amount: v,
39
+ total: v,
40
+ revenue: v,
41
+ });
42
+ }
43
+ else {
44
+ const n = randomInt(rng, 10, 9000);
45
+ out.push({
46
+ id: seededUUID(rng),
47
+ title: `Sample ${field} ${i + 1}`,
48
+ name: `Sample ${field} ${i + 1}`,
49
+ label: `Item ${i + 1}`,
50
+ status: 'published',
51
+ date: recentDate(rng),
52
+ createdAt: recentDate(rng),
53
+ views: n,
54
+ count: n,
55
+ value: n,
56
+ amount: n,
57
+ total: n,
58
+ });
59
+ }
60
+ }
61
+ return out;
62
+ }
63
+ /**
64
+ * Synthesize a realistic value for a single response field, by name.
65
+ * Array-ish names yield a small array of generic records (chart points or
66
+ * list rows); everything else goes through the semantic rules with
67
+ * type-flavoured fallbacks.
68
+ * @param field
69
+ * @param rng
70
+ * @param index
71
+ */
72
+ function generateFieldValue(field, rng, index) {
73
+ if (ARRAY_FIELD_RE.test(field))
74
+ return generateRecordArray(field, rng);
75
+ const semantic = applySemanticRules(field, rng, index);
76
+ if (semantic !== undefined)
77
+ return semantic;
78
+ if (/(_id$|^id$)/i.test(field))
79
+ return seededUUID(rng);
80
+ if (/(at$|date$|_date|timestamp)/i.test(field))
81
+ return recentDate(rng);
82
+ if (/^(is|has|can|show|enable|enabled|allow|allowed)[A-Z]?|active$|visible$|verified$|public$/i.test(field)) {
83
+ return rng() > 0.5;
84
+ }
85
+ if (/(url$|link$|image$|avatar$|icon$|photo$)/i.test(field)) {
86
+ return `https://picsum.photos/seed/${index}/400/400`;
87
+ }
88
+ if (/(name|title|label|slug|description|bio|message|summary|text|subject|note|headline)$/i.test(field)) {
89
+ return `Sample ${field}`;
90
+ }
91
+ if (/(theme|mode|status|state|type|tier|plan|role|level|visibility)$/i.test(field)) {
92
+ return 'active';
93
+ }
94
+ // Nested-object fields (preferences, settings, metadata, …) — `{}` is the
95
+ // safe shape; callers read sub-keys with optional chaining + defaults.
96
+ if (/(preferences|settings|config|metadata|^meta$|options|oauthdata|profile|address|location)$/i.test(field)) {
97
+ return {};
98
+ }
99
+ // Dashboard/analytics fields are overwhelmingly numeric — default to a count.
100
+ return randomInt(rng, 1, 1200);
101
+ }
102
+ /**
103
+ * Build a single-object success response from a list of field names
104
+ * discovered by the handler scanner (`res.json({ a, b, c })`).
105
+ * @param fields
106
+ * @param appType
107
+ * @param path
108
+ */
109
+ function synthesizeSingleObject(fields, appType, path) {
110
+ const rng = createSeededRandom(seedFromPath(appType, path));
111
+ const obj = {};
112
+ fields.forEach((f, i) => {
113
+ obj[f] = generateFieldValue(f, rng, i);
114
+ });
115
+ return obj;
116
+ }
117
+ /* ================================================================== */
118
+ /* Directory-based fixture loading */
119
+ /* ================================================================== */
120
+ /**
121
+ * Load an AppDataPool from a directory of JSON fixture files.
122
+ *
123
+ * File naming conventions:
124
+ * - Array files (e.g. `products.json` containing `[...]`) become CRUD resources
125
+ * - Object files (e.g. `reports.json` containing `{key: ...}`) become sub-endpoint groups
126
+ * where each key maps to a GET endpoint
127
+ *
128
+ * Special filenames are treated as report/sub-endpoint groups (object shape expected):
129
+ * `reports.json`, `storefront.json`, `admin.json`
130
+ *
131
+ * All other files are treated as array resources by default.
132
+ *
133
+ * @param fixturesDir - Absolute path to the fixtures directory
134
+ * @param appType - App type label (for the returned pool metadata)
135
+ * @returns An AppDataPool, or undefined if the directory doesn't exist or is empty
136
+ */
137
+ export function loadFixturesFromDirectory(fixturesDir, appType) {
138
+ if (!existsSync(fixturesDir))
139
+ return undefined;
140
+ const files = readdirSync(fixturesDir).filter((f) => f.endsWith('.json'));
141
+ if (files.length === 0)
142
+ return undefined;
143
+ const resources = {};
144
+ const reports = {};
145
+ // Filenames that are always treated as sub-endpoint groups (object with key → data)
146
+ const subEndpointFiles = new Set(['reports', 'storefront', 'admin']);
147
+ // Sub-endpoint files where arrays become CRUD resources (not just GET endpoints)
148
+ const crudSubEndpointFiles = new Set(['admin']);
149
+ for (const file of files) {
150
+ const name = basename(file, '.json');
151
+ const raw = readFileSync(join(fixturesDir, file), 'utf-8');
152
+ let data;
153
+ try {
154
+ data = JSON.parse(raw);
155
+ }
156
+ catch (error) {
157
+ // A bare SyntaxError ("Unexpected token } at position 47") doesn't say
158
+ // WHICH of the fixture files is malformed — name it.
159
+ throw new Error(`Invalid JSON in fixture file ${join(fixturesDir, file)}: ${error.message}`, { cause: error });
160
+ }
161
+ if (Array.isArray(data)) {
162
+ // Array → CRUD resource
163
+ resources[name] = data;
164
+ }
165
+ else if (typeof data === 'object' && data !== null) {
166
+ if (subEndpointFiles.has(name)) {
167
+ // Known sub-endpoint group: each key becomes a report/custom endpoint or CRUD resource
168
+ for (const [key, value] of Object.entries(data)) {
169
+ const fullKey = `${name === 'reports' ? '' : name + '/'}${key}`.replace(/^\//, '');
170
+ if (Array.isArray(value) && crudSubEndpointFiles.has(name)) {
171
+ // Array values in CRUD sub-endpoint files → CRUD resources at /api/{name}/{key}
172
+ resources[fullKey] = value;
173
+ }
174
+ else {
175
+ // Everything else → report-style GET endpoints (including arrays in reports/storefront)
176
+ reports[fullKey] = value;
177
+ }
178
+ }
179
+ }
180
+ else {
181
+ // Unknown object file — wrap as single-record resource array
182
+ resources[name] = [data];
183
+ }
184
+ }
185
+ }
186
+ return {
187
+ appType,
188
+ resources,
189
+ reports: Object.keys(reports).length > 0 ? reports : undefined,
190
+ };
191
+ }
192
+ /* ================================================================== */
193
+ /* Pool cache (keyed by fixturesDir path) */
194
+ /* ================================================================== */
195
+ const poolCache = new Map();
196
+ /**
197
+ * Cheap change-detection fingerprint for a fixtures directory: the sorted
198
+ * `*.json` file names with their mtime + size. Used to invalidate the pool
199
+ * cache — an unconditional path-keyed cache silently served STALE rows when a
200
+ * caller edited a fixture file and re-created the server in the same process.
201
+ * @param fixturesDir - Absolute path to the fixtures directory
202
+ */
203
+ function fixturesFingerprint(fixturesDir) {
204
+ if (!existsSync(fixturesDir))
205
+ return '';
206
+ try {
207
+ return readdirSync(fixturesDir)
208
+ .filter((f) => f.endsWith('.json'))
209
+ .sort()
210
+ .map((f) => {
211
+ const stats = statSync(join(fixturesDir, f));
212
+ return `${f}:${stats.mtimeMs}:${stats.size}`;
213
+ })
214
+ .join('|');
215
+ }
216
+ catch (error) {
217
+ // Listing/stat raced with a concurrent file change — return a
218
+ // never-matching fingerprint so the loader re-reads the directory (and
219
+ // surfaces any real filesystem error itself).
220
+ return `unstable:${Date.now()}:${error.message}`;
221
+ }
222
+ }
223
+ /**
224
+ * Get an AppDataPool for a fixtures directory, with fingerprint-validated
225
+ * caching: editing/adding/removing a `*.json` fixture file (mtime or size
226
+ * change) invalidates the cached pool, so a mock server re-created in the
227
+ * same process serves the fresh data instead of the first load.
228
+ * @param fixturesDir - Absolute path to the fixtures directory
229
+ * @param appType - App type label
230
+ * @returns The loaded pool, or undefined if directory missing/empty
231
+ */
232
+ export function getAppDataPool(fixturesDir, appType) {
233
+ const key = `${appType}${fixturesDir}`;
234
+ const fingerprint = fixturesFingerprint(fixturesDir);
235
+ const cached = poolCache.get(key);
236
+ if (cached && cached.fingerprint === fingerprint)
237
+ return cached.pool;
238
+ const pool = loadFixturesFromDirectory(fixturesDir, appType);
239
+ if (pool)
240
+ poolCache.set(key, { fingerprint, pool });
241
+ else
242
+ poolCache.delete(key);
243
+ return pool;
244
+ }
245
+ /**
246
+ * Build a complete fixture set for an app type by combining
247
+ * data pool records with endpoint definitions.
248
+ * @param appType - The app type
249
+ * @param endpoints - The discovered endpoints from scanning
250
+ * @param fixturesDir - Path to the fixtures directory
251
+ * @returns A complete fixture set, or undefined if no data available
252
+ */
253
+ export function buildFixtureSet(appType, endpoints, fixturesDir) {
254
+ if (!fixturesDir)
255
+ return undefined;
256
+ const pool = getAppDataPool(fixturesDir, appType);
257
+ if (!pool)
258
+ return undefined;
259
+ const fixtureMap = new Map();
260
+ for (const endpoint of endpoints) {
261
+ const key = `${endpoint.method} ${endpoint.path}`;
262
+ const fixture = buildEndpointFixture(endpoint, pool);
263
+ fixtureMap.set(key, fixture);
264
+ }
265
+ return { appType, endpoints: fixtureMap };
266
+ }
267
+ /**
268
+ * Build fixture data for a single endpoint based on the data pool.
269
+ * @param endpoint
270
+ * @param pool
271
+ */
272
+ function buildEndpointFixture(endpoint, pool) {
273
+ const { method, path, responseHints } = endpoint;
274
+ const resourceName = responseHints.resourceName;
275
+ // Check for report endpoints first
276
+ if (pool.reports) {
277
+ // Match report paths like /reports/spending-by-category -> 'spending-by-category'
278
+ const reportMatch = path.match(/\/reports\/(.+)$/);
279
+ if (reportMatch) {
280
+ const reportKey = reportMatch[1];
281
+ if (pool.reports[reportKey]) {
282
+ return {
283
+ endpoint,
284
+ successResponse: pool.reports[reportKey],
285
+ emptyResponse: [],
286
+ errorResponse: { error: 'Internal server error' },
287
+ };
288
+ }
289
+ }
290
+ // Check storefront endpoints
291
+ const storefrontMatch = path.match(/\/storefront\/(.+)$/);
292
+ if (storefrontMatch) {
293
+ const key = storefrontMatch[1];
294
+ const fullKey = `storefront/${key}`;
295
+ if (pool.reports[fullKey]) {
296
+ return {
297
+ endpoint,
298
+ successResponse: pool.reports[fullKey],
299
+ emptyResponse: key === 'categories' ? [] : { data: [] },
300
+ errorResponse: { error: 'Internal server error' },
301
+ };
302
+ }
303
+ }
304
+ }
305
+ // Cart endpoint (special shape)
306
+ if (path.endsWith('/cart') && method === 'GET' && pool.reports?.['storefront/cart-summary']) {
307
+ return {
308
+ endpoint,
309
+ successResponse: pool.reports['storefront/cart-summary'],
310
+ emptyResponse: { items: [], subtotal: 0 },
311
+ errorResponse: { error: 'Internal server error' },
312
+ };
313
+ }
314
+ // Single-object endpoints — `res.json({ a, b, c })` with no fixture file
315
+ // (e.g. /analytics/summary, /profile/me). Synthesize a semantic object
316
+ // from the field names the scanner extracted, so dashboard KPI cards and
317
+ // detail panels render real values instead of zeros/empty states.
318
+ if (method === 'GET' &&
319
+ responseHints.isSingleObject &&
320
+ responseHints.responseFields &&
321
+ responseHints.responseFields.length > 0) {
322
+ return {
323
+ endpoint,
324
+ successResponse: synthesizeSingleObject(responseHints.responseFields, pool.appType, path),
325
+ emptyResponse: {},
326
+ errorResponse: { error: 'Internal server error' },
327
+ };
328
+ }
329
+ const records = pool.resources[resourceName] ?? pool.resources[resourceName + 's'] ?? [];
330
+ if (method === 'GET') {
331
+ if (path.includes(':id') || path.includes(':itemId') || path.includes(':productId')) {
332
+ // Single resource GET
333
+ const item = records[0] ?? {};
334
+ return {
335
+ endpoint,
336
+ successResponse: item,
337
+ emptyResponse: null,
338
+ errorResponse: { error: 'Internal server error' },
339
+ };
340
+ }
341
+ // List GET
342
+ if (responseHints.isPaginated) {
343
+ return {
344
+ endpoint,
345
+ successResponse: { data: records, total: records.length, page: 1, limit: 20 },
346
+ emptyResponse: { data: [], total: 0, page: 1, limit: 20 },
347
+ errorResponse: { error: 'Internal server error' },
348
+ };
349
+ }
350
+ return {
351
+ endpoint,
352
+ successResponse: records,
353
+ emptyResponse: [],
354
+ errorResponse: { error: 'Internal server error' },
355
+ };
356
+ }
357
+ if (method === 'POST') {
358
+ const created = records[0] ?? { id: 'new-id' };
359
+ return {
360
+ endpoint,
361
+ successResponse: created,
362
+ emptyResponse: created,
363
+ errorResponse: { error: 'Internal server error' },
364
+ };
365
+ }
366
+ if (method === 'PUT' || method === 'PATCH') {
367
+ const updated = records[0] ?? { id: 'updated-id' };
368
+ return {
369
+ endpoint,
370
+ successResponse: updated,
371
+ emptyResponse: updated,
372
+ errorResponse: { error: 'Internal server error' },
373
+ };
374
+ }
375
+ // DELETE
376
+ return {
377
+ endpoint,
378
+ successResponse: null,
379
+ emptyResponse: null,
380
+ errorResponse: { error: 'Internal server error' },
381
+ };
382
+ }
383
+ /**
384
+ * Generate fixtures from a directory of JSON files without scanning handlers.
385
+ * Builds standard CRUD endpoints for each resource file and custom endpoints
386
+ * for each sub-endpoint group.
387
+ *
388
+ * @param fixturesDir - Absolute path to the fixtures directory
389
+ * @param appType - App type label (default: derived from directory name)
390
+ * @returns A fixture set with standard CRUD endpoints, or undefined if no data
391
+ */
392
+ export function generateFixtures(fixturesDir, appType) {
393
+ const resolvedAppType = appType ?? basename(fixturesDir);
394
+ const pool = getAppDataPool(fixturesDir, resolvedAppType);
395
+ if (!pool)
396
+ return undefined;
397
+ const fixtureMap = new Map();
398
+ // Generate standard CRUD endpoints for each resource
399
+ for (const [resourceName, records] of Object.entries(pool.resources)) {
400
+ const basePath = `/api/${resourceName}`;
401
+ // Cart is special: UI expects { items, subtotal, shipping?, tax?, total? }
402
+ // not a flat list. Synthesize the envelope from line-item records so the
403
+ // existing fixture file (a flat array of cart-line records) drives both
404
+ // the cart and checkout pages without duplication.
405
+ if (resourceName === 'cart') {
406
+ const subtotal = records.reduce((sum, r) => {
407
+ const item = r;
408
+ const qty = typeof item.quantity === 'number' ? item.quantity : 1;
409
+ const product = item.product;
410
+ const price = product && typeof product.price === 'number' ? product.price : 0;
411
+ return sum + qty * price;
412
+ }, 0);
413
+ const shipping = subtotal > 0 ? 500 : 0;
414
+ const tax = Math.round(subtotal * 0.08);
415
+ const total = subtotal + shipping + tax;
416
+ const cartEnvelope = { items: records, subtotal, shipping, tax, total };
417
+ const cartEndpoint = {
418
+ method: 'GET',
419
+ path: basePath,
420
+ requiresAuth: true,
421
+ responseHints: {
422
+ isList: false,
423
+ isPaginated: false,
424
+ hasNestedResources: false,
425
+ resourceName,
426
+ },
427
+ };
428
+ fixtureMap.set(`GET ${basePath}`, {
429
+ endpoint: cartEndpoint,
430
+ successResponse: cartEnvelope,
431
+ emptyResponse: { items: [], subtotal: 0, shipping: 0, tax: 0, total: 0 },
432
+ errorResponse: { error: 'Internal server error' },
433
+ });
434
+ // Also expose mutation endpoints (POST add, DELETE clear, POST promo)
435
+ // so the cart page's add/remove/promo flows return reasonable shapes.
436
+ fixtureMap.set(`POST ${basePath}`, {
437
+ endpoint: {
438
+ method: 'POST',
439
+ path: basePath,
440
+ requiresAuth: true,
441
+ responseHints: {
442
+ isList: false,
443
+ isPaginated: false,
444
+ hasNestedResources: false,
445
+ resourceName,
446
+ },
447
+ },
448
+ successResponse: cartEnvelope,
449
+ emptyResponse: cartEnvelope,
450
+ errorResponse: { error: 'Internal server error' },
451
+ });
452
+ fixtureMap.set(`POST ${basePath}/promo`, {
453
+ endpoint: {
454
+ method: 'POST',
455
+ path: `${basePath}/promo`,
456
+ requiresAuth: true,
457
+ responseHints: {
458
+ isList: false,
459
+ isPaginated: false,
460
+ hasNestedResources: false,
461
+ resourceName,
462
+ },
463
+ },
464
+ successResponse: {
465
+ ...cartEnvelope,
466
+ promoApplied: true,
467
+ discount: Math.round(subtotal * 0.1),
468
+ },
469
+ emptyResponse: cartEnvelope,
470
+ errorResponse: { error: 'Invalid promo code' },
471
+ });
472
+ fixtureMap.set(`DELETE ${basePath}/:id`, {
473
+ endpoint: {
474
+ method: 'DELETE',
475
+ path: `${basePath}/:id`,
476
+ requiresAuth: true,
477
+ responseHints: {
478
+ isList: false,
479
+ isPaginated: false,
480
+ hasNestedResources: false,
481
+ resourceName,
482
+ },
483
+ },
484
+ successResponse: { items: [], subtotal: 0, shipping: 0, tax: 0, total: 0 },
485
+ emptyResponse: { items: [], subtotal: 0, shipping: 0, tax: 0, total: 0 },
486
+ errorResponse: { error: 'Internal server error' },
487
+ });
488
+ continue;
489
+ }
490
+ // GET list — bare array by default. createMockServer reconciles this
491
+ // against the handler scanner: endpoints whose handler returns a
492
+ // `{ data: [...] }` envelope get re-wrapped (see reconcileListShapes).
493
+ const listEndpoint = {
494
+ method: 'GET',
495
+ path: basePath,
496
+ requiresAuth: true,
497
+ responseHints: { isList: true, isPaginated: false, hasNestedResources: false, resourceName },
498
+ };
499
+ fixtureMap.set(`GET ${basePath}`, {
500
+ endpoint: listEndpoint,
501
+ successResponse: records,
502
+ emptyResponse: [],
503
+ errorResponse: { error: 'Internal server error' },
504
+ });
505
+ // GET single
506
+ const singleEndpoint = {
507
+ method: 'GET',
508
+ path: `${basePath}/:id`,
509
+ requiresAuth: true,
510
+ responseHints: { isList: false, isPaginated: false, hasNestedResources: false, resourceName },
511
+ };
512
+ fixtureMap.set(`GET ${basePath}/:id`, {
513
+ endpoint: singleEndpoint,
514
+ successResponse: records[0] ?? {},
515
+ emptyResponse: null,
516
+ errorResponse: { error: 'Internal server error' },
517
+ });
518
+ // POST
519
+ const createEndpoint = {
520
+ method: 'POST',
521
+ path: basePath,
522
+ requiresAuth: true,
523
+ responseHints: { isList: false, isPaginated: false, hasNestedResources: false, resourceName },
524
+ };
525
+ fixtureMap.set(`POST ${basePath}`, {
526
+ endpoint: createEndpoint,
527
+ successResponse: records[0] ?? {},
528
+ emptyResponse: records[0] ?? {},
529
+ errorResponse: { error: 'Internal server error' },
530
+ });
531
+ // PUT
532
+ const updateEndpoint = {
533
+ method: 'PUT',
534
+ path: `${basePath}/:id`,
535
+ requiresAuth: true,
536
+ responseHints: { isList: false, isPaginated: false, hasNestedResources: false, resourceName },
537
+ };
538
+ fixtureMap.set(`PUT ${basePath}/:id`, {
539
+ endpoint: updateEndpoint,
540
+ successResponse: records[0] ?? {},
541
+ emptyResponse: records[0] ?? {},
542
+ errorResponse: { error: 'Internal server error' },
543
+ });
544
+ // PATCH — partial update, same fixture shape as PUT. Fleet template
545
+ // handlers use router.patch for profile/settings updates; without this
546
+ // endpoint a PATCH fell through to the unmatched catch-all and returned
547
+ // `{}`, so the page's update flow silently "succeeded" with no data.
548
+ const patchEndpoint = {
549
+ method: 'PATCH',
550
+ path: `${basePath}/:id`,
551
+ requiresAuth: true,
552
+ responseHints: { isList: false, isPaginated: false, hasNestedResources: false, resourceName },
553
+ };
554
+ fixtureMap.set(`PATCH ${basePath}/:id`, {
555
+ endpoint: patchEndpoint,
556
+ successResponse: records[0] ?? {},
557
+ emptyResponse: records[0] ?? {},
558
+ errorResponse: { error: 'Internal server error' },
559
+ });
560
+ // DELETE
561
+ const deleteEndpoint = {
562
+ method: 'DELETE',
563
+ path: `${basePath}/:id`,
564
+ requiresAuth: true,
565
+ responseHints: { isList: false, isPaginated: false, hasNestedResources: false, resourceName },
566
+ };
567
+ fixtureMap.set(`DELETE ${basePath}/:id`, {
568
+ endpoint: deleteEndpoint,
569
+ successResponse: null,
570
+ emptyResponse: null,
571
+ errorResponse: { error: 'Internal server error' },
572
+ });
573
+ }
574
+ // Add report/custom endpoints
575
+ if (pool.reports) {
576
+ for (const [reportKey, reportData] of Object.entries(pool.reports)) {
577
+ // If key contains '/' it's a custom path (e.g. 'admin/dashboard' -> /api/admin/dashboard)
578
+ // Otherwise it's a report (e.g. 'spending-by-category' -> /api/reports/spending-by-category)
579
+ const reportPath = reportKey.includes('/') ? `/api/${reportKey}` : `/api/reports/${reportKey}`;
580
+ const reportEndpoint = {
581
+ method: 'GET',
582
+ path: reportPath,
583
+ requiresAuth: true,
584
+ responseHints: {
585
+ isList: false,
586
+ isPaginated: false,
587
+ hasNestedResources: false,
588
+ resourceName: 'reports',
589
+ },
590
+ };
591
+ fixtureMap.set(`GET ${reportPath}`, {
592
+ endpoint: reportEndpoint,
593
+ successResponse: reportData,
594
+ emptyResponse: Array.isArray(reportData) ? [] : {},
595
+ errorResponse: { error: 'Internal server error' },
596
+ });
597
+ }
598
+ }
599
+ return { appType: resolvedAppType, endpoints: fixtureMap };
600
+ }
601
+ //# sourceMappingURL=app-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-fixtures.js","sourceRoot":"","sources":["../../src/fixtures/app-fixtures.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACzE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAS1C,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,mGAAmG;AACnG,MAAM,cAAc,GAClB,mQAAmQ,CAAA;AAErQ,gFAAgF;AAChF,MAAM,eAAe,GACnB,2GAA2G,CAAA;AAE7G;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,KAAa,EAAE,GAAiB;IAC3D,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7B,MAAM,GAAG,GAAc,EAAE,CAAA;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;YAClC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YAC3D,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAClC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBACnC,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,CAAC;aACX,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;YAClC,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE,EAAE,UAAU,CAAC,GAAG,CAAC;gBACnB,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE;gBACjC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE;gBAChC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACtB,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC;gBACrB,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC;gBAC1B,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,CAAC;aACT,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CAAC,KAAa,EAAE,GAAiB,EAAE,KAAa;IACzE,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACtE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IACtD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAA;IAC3C,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAA;IACtD,IAAI,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAA;IACtE,IACE,2FAA2F,CAAC,IAAI,CAC9F,KAAK,CACN,EACD,CAAC;QACD,OAAO,GAAG,EAAE,GAAG,GAAG,CAAA;IACpB,CAAC;IACD,IAAI,2CAA2C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,8BAA8B,KAAK,UAAU,CAAA;IACtD,CAAC;IACD,IACE,sFAAsF,CAAC,IAAI,CACzF,KAAK,CACN,EACD,CAAC;QACD,OAAO,UAAU,KAAK,EAAE,CAAA;IAC1B,CAAC;IACD,IAAI,kEAAkE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnF,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,0EAA0E;IAC1E,uEAAuE;IACvE,IACE,4FAA4F,CAAC,IAAI,CAC/F,KAAK,CACN,EACD,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IACD,8EAA8E;IAC9E,OAAO,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;AAChC,CAAC;AAED;;;;;;GAMG;AACH,SAAS,sBAAsB,CAC7B,MAAgB,EAChB,OAAe,EACf,IAAY;IAEZ,MAAM,GAAG,GAAG,kBAAkB,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;IAC3D,MAAM,GAAG,GAA4B,EAAE,CAAA;IACvC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAAmB,EACnB,OAAe;IAEf,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAA;IAE9C,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;IACzE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAExC,MAAM,SAAS,GAAoC,EAAE,CAAA;IACrD,MAAM,OAAO,GAA4B,EAAE,CAAA;IAE3C,oFAAoF;IACpF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAA;IACpE,iFAAiF;IACjF,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IAE/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACpC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;QAC1D,IAAI,IAAa,CAAA;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uEAAuE;YACvE,qDAAqD;YACrD,MAAM,IAAI,KAAK,CACb,gCAAgC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAM,KAAe,CAAC,OAAO,EAAE,EACtF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAA;QACH,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,wBAAwB;YACxB,SAAS,CAAC,IAAI,CAAC,GAAG,IAAuB,CAAA;QAC3C,CAAC;aAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACrD,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,uFAAuF;gBACvF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,EAAE,CAAC;oBAC3E,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;oBAClF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC3D,gFAAgF;wBAChF,SAAS,CAAC,OAAO,CAAC,GAAG,KAAwB,CAAA;oBAC/C,CAAC;yBAAM,CAAC;wBACN,wFAAwF;wBACxF,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,CAAA;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,6DAA6D;gBAC7D,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAqB,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,SAAS;QACT,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;KAC/D,CAAA;AACH,CAAC;AAED,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAsD,CAAA;AAE/E;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,WAAmB;IAC9C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAA;IACvC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,WAAW,CAAC;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAClC,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAA;YAC5C,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAA;QAC9C,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,8DAA8D;QAC9D,uEAAuE;QACvE,8CAA8C;QAC9C,OAAO,YAAY,IAAI,CAAC,GAAG,EAAE,IAAK,KAAe,CAAC,OAAO,EAAE,CAAA;IAC7D,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,OAAe;IACjE,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,WAAW,EAAE,CAAA;IACvC,MAAM,WAAW,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAA;IACpD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC,IAAI,CAAA;IAEpE,MAAM,IAAI,GAAG,yBAAyB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAC5D,IAAI,IAAI;QAAE,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;;QAC9C,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC1B,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,SAA+B,EAC/B,WAAoB;IAEpB,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAA;IAClC,MAAM,IAAI,GAAG,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IACjD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAA;IAE3B,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAA;IAErD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAA;QACjD,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QACpD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAA;AAC3C,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,QAA4B,EAAE,IAAiB;IAC3E,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAA;IAChD,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAA;IAE/C,mCAAmC;IACnC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,kFAAkF;QAClF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;QAClD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;YAChC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5B,OAAO;oBACL,QAAQ;oBACR,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;oBACxC,aAAa,EAAE,EAAE;oBACjB,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;iBAClD,CAAA;YACH,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACzD,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;YAC9B,MAAM,OAAO,GAAG,cAAc,GAAG,EAAE,CAAA;YACnC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACL,QAAQ;oBACR,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;oBACtC,aAAa,EAAE,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;oBACvD,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;iBAClD,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,yBAAyB,CAAC,EAAE,CAAC;QAC5F,OAAO;YACL,QAAQ;YACR,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC;YACxD,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;YACzC,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;SAClD,CAAA;IACH,CAAC;IAED,yEAAyE;IACzE,uEAAuE;IACvE,yEAAyE;IACzE,kEAAkE;IAClE,IACE,MAAM,KAAK,KAAK;QAChB,aAAa,CAAC,cAAc;QAC5B,aAAa,CAAC,cAAc;QAC5B,aAAa,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EACvC,CAAC;QACD,OAAO;YACL,QAAQ;YACR,eAAe,EAAE,sBAAsB,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;YACzF,aAAa,EAAE,EAAE;YACjB,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;SAClD,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IAExF,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACpF,sBAAsB;YACtB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAC7B,OAAO;gBACL,QAAQ;gBACR,eAAe,EAAE,IAAI;gBACrB,aAAa,EAAE,IAAI;gBACnB,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;aAClD,CAAA;QACH,CAAC;QAED,WAAW;QACX,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;YAC9B,OAAO;gBACL,QAAQ;gBACR,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC7E,aAAa,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;gBACzD,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;aAClD,CAAA;QACH,CAAC;QAED,OAAO;YACL,QAAQ;YACR,eAAe,EAAE,OAAO;YACxB,aAAa,EAAE,EAAE;YACjB,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;SAClD,CAAA;IACH,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAA;QAC9C,OAAO;YACL,QAAQ;YACR,eAAe,EAAE,OAAO;YACxB,aAAa,EAAE,OAAO;YACtB,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;SAClD,CAAA;IACH,CAAC;IAED,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,CAAA;QAClD,OAAO;YACL,QAAQ;YACR,eAAe,EAAE,OAAO;YACxB,aAAa,EAAE,OAAO;YACtB,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;SAClD,CAAA;IACH,CAAC;IAED,SAAS;IACT,OAAO;QACL,QAAQ;QACR,eAAe,EAAE,IAAI;QACrB,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;KAClD,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,OAAgB;IACpE,MAAM,eAAe,GAAG,OAAO,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAA;IACxD,MAAM,IAAI,GAAG,cAAc,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAA;IAE3B,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAA;IAErD,qDAAqD;IACrD,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACrE,MAAM,QAAQ,GAAG,QAAQ,YAAY,EAAE,CAAA;QAEvC,2EAA2E;QAC3E,yEAAyE;QACzE,wEAAwE;QACxE,mDAAmD;QACnD,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;gBACzC,MAAM,IAAI,GAAG,CAA4B,CAAA;gBACzC,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;gBACjE,MAAM,OAAO,GAAG,IAAI,CAAC,OAA8C,CAAA;gBACnE,MAAM,KAAK,GAAG,OAAO,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC9E,OAAO,GAAG,GAAG,GAAG,GAAG,KAAK,CAAA;YAC1B,CAAC,EAAE,CAAC,CAAC,CAAA;YACL,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;YACvC,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,GAAG,CAAA;YACvC,MAAM,YAAY,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;YACvE,MAAM,YAAY,GAAuB;gBACvC,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,QAAQ;gBACd,YAAY,EAAE,IAAI;gBAClB,aAAa,EAAE;oBACb,MAAM,EAAE,KAAK;oBACb,WAAW,EAAE,KAAK;oBAClB,kBAAkB,EAAE,KAAK;oBACzB,YAAY;iBACb;aACF,CAAA;YACD,UAAU,CAAC,GAAG,CAAC,OAAO,QAAQ,EAAE,EAAE;gBAChC,QAAQ,EAAE,YAAY;gBACtB,eAAe,EAAE,YAAY;gBAC7B,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;gBACxE,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;aAClD,CAAC,CAAA;YACF,sEAAsE;YACtE,sEAAsE;YACtE,UAAU,CAAC,GAAG,CAAC,QAAQ,QAAQ,EAAE,EAAE;gBACjC,QAAQ,EAAE;oBACR,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,QAAQ;oBACd,YAAY,EAAE,IAAI;oBAClB,aAAa,EAAE;wBACb,MAAM,EAAE,KAAK;wBACb,WAAW,EAAE,KAAK;wBAClB,kBAAkB,EAAE,KAAK;wBACzB,YAAY;qBACb;iBACF;gBACD,eAAe,EAAE,YAAY;gBAC7B,aAAa,EAAE,YAAY;gBAC3B,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;aAClD,CAAC,CAAA;YACF,UAAU,CAAC,GAAG,CAAC,QAAQ,QAAQ,QAAQ,EAAE;gBACvC,QAAQ,EAAE;oBACR,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,GAAG,QAAQ,QAAQ;oBACzB,YAAY,EAAE,IAAI;oBAClB,aAAa,EAAE;wBACb,MAAM,EAAE,KAAK;wBACb,WAAW,EAAE,KAAK;wBAClB,kBAAkB,EAAE,KAAK;wBACzB,YAAY;qBACb;iBACF;gBACD,eAAe,EAAE;oBACf,GAAG,YAAY;oBACf,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC;iBACrC;gBACD,aAAa,EAAE,YAAY;gBAC3B,aAAa,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE;aAC/C,CAAC,CAAA;YACF,UAAU,CAAC,GAAG,CAAC,UAAU,QAAQ,MAAM,EAAE;gBACvC,QAAQ,EAAE;oBACR,MAAM,EAAE,QAAQ;oBAChB,IAAI,EAAE,GAAG,QAAQ,MAAM;oBACvB,YAAY,EAAE,IAAI;oBAClB,aAAa,EAAE;wBACb,MAAM,EAAE,KAAK;wBACb,WAAW,EAAE,KAAK;wBAClB,kBAAkB,EAAE,KAAK;wBACzB,YAAY;qBACb;iBACF;gBACD,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC1E,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;gBACxE,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;aAClD,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QAED,qEAAqE;QACrE,iEAAiE;QACjE,uEAAuE;QACvE,MAAM,YAAY,GAAuB;YACvC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE;SAC7F,CAAA;QACD,UAAU,CAAC,GAAG,CAAC,OAAO,QAAQ,EAAE,EAAE;YAChC,QAAQ,EAAE,YAAY;YACtB,eAAe,EAAE,OAAO;YACxB,aAAa,EAAE,EAAE;YACjB,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;SAClD,CAAC,CAAA;QAEF,aAAa;QACb,MAAM,cAAc,GAAuB;YACzC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,GAAG,QAAQ,MAAM;YACvB,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE;SAC9F,CAAA;QACD,UAAU,CAAC,GAAG,CAAC,OAAO,QAAQ,MAAM,EAAE;YACpC,QAAQ,EAAE,cAAc;YACxB,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;YACjC,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;SAClD,CAAC,CAAA;QAEF,OAAO;QACP,MAAM,cAAc,GAAuB;YACzC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE;SAC9F,CAAA;QACD,UAAU,CAAC,GAAG,CAAC,QAAQ,QAAQ,EAAE,EAAE;YACjC,QAAQ,EAAE,cAAc;YACxB,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;YACjC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;YAC/B,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;SAClD,CAAC,CAAA;QAEF,MAAM;QACN,MAAM,cAAc,GAAuB;YACzC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,GAAG,QAAQ,MAAM;YACvB,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE;SAC9F,CAAA;QACD,UAAU,CAAC,GAAG,CAAC,OAAO,QAAQ,MAAM,EAAE;YACpC,QAAQ,EAAE,cAAc;YACxB,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;YACjC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;YAC/B,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;SAClD,CAAC,CAAA;QAEF,oEAAoE;QACpE,uEAAuE;QACvE,wEAAwE;QACxE,qEAAqE;QACrE,MAAM,aAAa,GAAuB;YACxC,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,GAAG,QAAQ,MAAM;YACvB,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE;SAC9F,CAAA;QACD,UAAU,CAAC,GAAG,CAAC,SAAS,QAAQ,MAAM,EAAE;YACtC,QAAQ,EAAE,aAAa;YACvB,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;YACjC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;YAC/B,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;SAClD,CAAC,CAAA;QAEF,SAAS;QACT,MAAM,cAAc,GAAuB;YACzC,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,GAAG,QAAQ,MAAM;YACvB,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE;SAC9F,CAAA;QACD,UAAU,CAAC,GAAG,CAAC,UAAU,QAAQ,MAAM,EAAE;YACvC,QAAQ,EAAE,cAAc;YACxB,eAAe,EAAE,IAAI;YACrB,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;SAClD,CAAC,CAAA;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACnE,0FAA0F;YAC1F,6FAA6F;YAC7F,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC,CAAC,gBAAgB,SAAS,EAAE,CAAA;YAC9F,MAAM,cAAc,GAAuB;gBACzC,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,UAAU;gBAChB,YAAY,EAAE,IAAI;gBAClB,aAAa,EAAE;oBACb,MAAM,EAAE,KAAK;oBACb,WAAW,EAAE,KAAK;oBAClB,kBAAkB,EAAE,KAAK;oBACzB,YAAY,EAAE,SAAS;iBACxB;aACF,CAAA;YACD,UAAU,CAAC,GAAG,CAAC,OAAO,UAAU,EAAE,EAAE;gBAClC,QAAQ,EAAE,cAAc;gBACxB,eAAe,EAAE,UAAU;gBAC3B,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;gBAClD,aAAa,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;aAClD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,CAAA;AAC5D,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Fixture generation modules for deterministic, realistic test data.
3
+ * @module
4
+ */
5
+ export * from './app-fixtures.js';
6
+ export * from './seed.js';
7
+ export * from './semantic-generator.js';
8
+ export * from './zod-walker.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fixtures/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAA;AACjC,cAAc,WAAW,CAAA;AACzB,cAAc,yBAAyB,CAAA;AACvC,cAAc,iBAAiB,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Fixture generation modules for deterministic, realistic test data.
3
+ * @module
4
+ */
5
+ export * from './app-fixtures.js';
6
+ export * from './seed.js';
7
+ export * from './semantic-generator.js';
8
+ export * from './zod-walker.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fixtures/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAA;AACjC,cAAc,WAAW,CAAA;AACzB,cAAc,yBAAyB,CAAA;AACvC,cAAc,iBAAiB,CAAA"}