@stackwright-pro/cli-data-explorer 1.0.0 → 1.0.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.
- package/dist/index.js +75 -48
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +75 -48
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -4
package/dist/index.js
CHANGED
|
@@ -196,11 +196,14 @@ function listEntities(options = {}) {
|
|
|
196
196
|
for (const file of schemaFiles) {
|
|
197
197
|
const result = loadZodSchemas(file);
|
|
198
198
|
if (result.entities.length > 0) {
|
|
199
|
-
|
|
199
|
+
const returnResult = {
|
|
200
200
|
success: true,
|
|
201
|
-
entities: result.entities
|
|
202
|
-
errors: result.errors.length > 0 ? result.errors : void 0
|
|
201
|
+
entities: result.entities
|
|
203
202
|
};
|
|
203
|
+
if (result.errors.length > 0) {
|
|
204
|
+
returnResult.errors = result.errors;
|
|
205
|
+
}
|
|
206
|
+
return returnResult;
|
|
204
207
|
}
|
|
205
208
|
}
|
|
206
209
|
}
|
|
@@ -210,11 +213,14 @@ function listEntities(options = {}) {
|
|
|
210
213
|
for (const file of schemaFiles) {
|
|
211
214
|
const result = loadZodSchemas(file);
|
|
212
215
|
if (result.entities.length > 0) {
|
|
213
|
-
|
|
216
|
+
const returnResult = {
|
|
214
217
|
success: true,
|
|
215
|
-
entities: result.entities
|
|
216
|
-
errors: result.errors.length > 0 ? result.errors : void 0
|
|
218
|
+
entities: result.entities
|
|
217
219
|
};
|
|
220
|
+
if (result.errors.length > 0) {
|
|
221
|
+
returnResult.errors = result.errors;
|
|
222
|
+
}
|
|
223
|
+
return returnResult;
|
|
218
224
|
}
|
|
219
225
|
}
|
|
220
226
|
}
|
|
@@ -245,11 +251,14 @@ function listEntities(options = {}) {
|
|
|
245
251
|
}
|
|
246
252
|
function listFromZodSchemas(schemaPath) {
|
|
247
253
|
const { entities, errors } = loadZodSchemas(schemaPath);
|
|
248
|
-
|
|
254
|
+
const returnResult = {
|
|
249
255
|
success: errors.length === 0,
|
|
250
|
-
entities
|
|
251
|
-
errors: errors.length > 0 ? errors : void 0
|
|
256
|
+
entities
|
|
252
257
|
};
|
|
258
|
+
if (errors.length > 0) {
|
|
259
|
+
returnResult.errors = errors;
|
|
260
|
+
}
|
|
261
|
+
return returnResult;
|
|
253
262
|
}
|
|
254
263
|
function listFromOpenAPISpec(specPath) {
|
|
255
264
|
const errors = [];
|
|
@@ -326,11 +335,14 @@ function listFromOpenAPISpec(specPath) {
|
|
|
326
335
|
});
|
|
327
336
|
seenPaths.add(pathStr);
|
|
328
337
|
}
|
|
329
|
-
|
|
338
|
+
const returnResult = {
|
|
330
339
|
success: true,
|
|
331
|
-
entities
|
|
332
|
-
errors: errors.length > 0 ? errors : void 0
|
|
340
|
+
entities
|
|
333
341
|
};
|
|
342
|
+
if (errors.length > 0) {
|
|
343
|
+
returnResult.errors = errors;
|
|
344
|
+
}
|
|
345
|
+
return returnResult;
|
|
334
346
|
} catch (err) {
|
|
335
347
|
return {
|
|
336
348
|
success: false,
|
|
@@ -344,8 +356,8 @@ function extractEntityNameFromPath(pathStr) {
|
|
|
344
356
|
path3 = path3.replace(/\{[^}]+\}/g, "");
|
|
345
357
|
const segments = path3.split("/").filter((s) => s.length > 0);
|
|
346
358
|
if (segments.length === 0) return "Root";
|
|
347
|
-
if (segments.length === 1) return segments[0];
|
|
348
|
-
const first = segments[0];
|
|
359
|
+
if (segments.length === 1) return segments[0] ?? "Root";
|
|
360
|
+
const first = segments[0] ?? "Root";
|
|
349
361
|
const second = segments[1];
|
|
350
362
|
if (second && /^[a-z]+$/i.test(second)) {
|
|
351
363
|
return first;
|
|
@@ -369,7 +381,8 @@ function isInternalPath(pathStr) {
|
|
|
369
381
|
}
|
|
370
382
|
function extractSchemaName(ref) {
|
|
371
383
|
const parts = ref.split("/");
|
|
372
|
-
|
|
384
|
+
const lastPart = parts[parts.length - 1];
|
|
385
|
+
return lastPart ?? ref;
|
|
373
386
|
}
|
|
374
387
|
function findSchemaFiles(dir, depth = 0) {
|
|
375
388
|
const files = [];
|
|
@@ -416,7 +429,7 @@ function toTitleCase2(str) {
|
|
|
416
429
|
return str.replace(/_/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
417
430
|
}
|
|
418
431
|
function toSlug2(str) {
|
|
419
|
-
|
|
432
|
+
const slug = str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
|
|
420
433
|
if (slug === "supply") {
|
|
421
434
|
return "supplies";
|
|
422
435
|
}
|
|
@@ -430,16 +443,19 @@ function toSlug2(str) {
|
|
|
430
443
|
}
|
|
431
444
|
function generateFilter(options) {
|
|
432
445
|
const warnings = [];
|
|
433
|
-
const
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
446
|
+
const listOptions = {};
|
|
447
|
+
if (options.specPath !== void 0) listOptions.specPath = options.specPath;
|
|
448
|
+
if (options.projectRoot !== void 0) listOptions.projectRoot = options.projectRoot;
|
|
449
|
+
const listResult = listEntities(listOptions);
|
|
437
450
|
if (!listResult.success) {
|
|
438
|
-
|
|
451
|
+
const result2 = {
|
|
439
452
|
success: false,
|
|
440
|
-
filter: { include: [], exclude: [] }
|
|
441
|
-
warnings: listResult.errors ?? []
|
|
453
|
+
filter: { include: [], exclude: [] }
|
|
442
454
|
};
|
|
455
|
+
if (listResult.errors !== void 0) {
|
|
456
|
+
result2.warnings = listResult.errors;
|
|
457
|
+
}
|
|
458
|
+
return result2;
|
|
443
459
|
}
|
|
444
460
|
const defaultExcludes = ["/admin/*", "/reports/*", "/*/delete", "/audit/*"];
|
|
445
461
|
const include = [];
|
|
@@ -484,32 +500,41 @@ function generateFilter(options) {
|
|
|
484
500
|
};
|
|
485
501
|
fs2__default.default.writeFileSync(outputFullPath, YAML__default.default.dump(config, { lineWidth: 120 }), "utf8");
|
|
486
502
|
}
|
|
487
|
-
|
|
503
|
+
const result = {
|
|
488
504
|
success: true,
|
|
489
|
-
filter: { include, exclude }
|
|
490
|
-
warnings: warnings.length > 0 ? warnings : void 0,
|
|
491
|
-
outputPath: options.outputPath
|
|
505
|
+
filter: { include, exclude }
|
|
492
506
|
};
|
|
507
|
+
if (warnings.length > 0) {
|
|
508
|
+
result.warnings = warnings;
|
|
509
|
+
}
|
|
510
|
+
if (options.outputPath !== void 0) {
|
|
511
|
+
result.outputPath = options.outputPath;
|
|
512
|
+
}
|
|
513
|
+
return result;
|
|
493
514
|
}
|
|
494
515
|
function discoverAndFilter(options) {
|
|
495
|
-
const
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
});
|
|
516
|
+
const listOptions = { specPath: options.specPath };
|
|
517
|
+
if (options.projectRoot !== void 0) listOptions.projectRoot = options.projectRoot;
|
|
518
|
+
const listResult = listEntities(listOptions);
|
|
499
519
|
if (!listResult.success) {
|
|
500
|
-
|
|
520
|
+
const result = {
|
|
501
521
|
success: false,
|
|
502
|
-
filter: { include: [], exclude: [] }
|
|
503
|
-
warnings: listResult.errors
|
|
522
|
+
filter: { include: [], exclude: [] }
|
|
504
523
|
};
|
|
524
|
+
if (listResult.errors !== void 0) {
|
|
525
|
+
result.warnings = listResult.errors;
|
|
526
|
+
}
|
|
527
|
+
return result;
|
|
505
528
|
}
|
|
506
|
-
|
|
529
|
+
const filterOptions = {
|
|
507
530
|
specPath: options.specPath,
|
|
508
|
-
selectedEntities: options.selectedEntities
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
531
|
+
selectedEntities: options.selectedEntities
|
|
532
|
+
};
|
|
533
|
+
if (options.excludePatterns !== void 0)
|
|
534
|
+
filterOptions.excludePatterns = options.excludePatterns;
|
|
535
|
+
if (options.outputPath !== void 0) filterOptions.outputPath = options.outputPath;
|
|
536
|
+
if (options.projectRoot !== void 0) filterOptions.projectRoot = options.projectRoot;
|
|
537
|
+
return generateFilter(filterOptions);
|
|
513
538
|
}
|
|
514
539
|
|
|
515
540
|
// src/index.ts
|
|
@@ -553,11 +578,10 @@ var registerCommands = (program) => {
|
|
|
553
578
|
}
|
|
554
579
|
program.command?.("data-explorer") || dataExplorerCmd;
|
|
555
580
|
const handleList = (opts) => {
|
|
556
|
-
const
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
});
|
|
581
|
+
const options = { projectRoot: process.cwd() };
|
|
582
|
+
if (opts.spec !== void 0) options.specPath = opts.spec;
|
|
583
|
+
if (opts.schema !== void 0) options.schemaPath = opts.schema;
|
|
584
|
+
const result = listEntities(options);
|
|
561
585
|
if (!result.success) {
|
|
562
586
|
console.error(chalk__default.default.red("Failed to list entities:"));
|
|
563
587
|
result.errors?.forEach((e) => console.error(` ${e}`));
|
|
@@ -594,12 +618,15 @@ Total: ${result.entities.length} entities
|
|
|
594
618
|
};
|
|
595
619
|
const handleFilter = (opts) => {
|
|
596
620
|
const entities = opts.entities.split(",").map((e) => e.trim());
|
|
597
|
-
const
|
|
621
|
+
const options = {
|
|
598
622
|
selectedEntities: entities,
|
|
599
|
-
excludePatterns: opts.exclude?.split(",").map((e) => e.trim()),
|
|
600
623
|
outputPath: opts.output || "./stackwright.yml",
|
|
601
624
|
projectRoot: process.cwd()
|
|
602
|
-
}
|
|
625
|
+
};
|
|
626
|
+
if (opts.exclude !== void 0) {
|
|
627
|
+
options.excludePatterns = opts.exclude.split(",").map((e) => e.trim());
|
|
628
|
+
}
|
|
629
|
+
const result = generateFilter(options);
|
|
603
630
|
if (!result.success) {
|
|
604
631
|
console.error(chalk__default.default.red("Failed to generate filter:"));
|
|
605
632
|
result.warnings?.forEach((w) => console.error(` ${w}`));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema-loader.ts","../src/list-entities.ts","../src/generate-filter.ts","../src/index.ts"],"names":["require","createRequire","fs","path","YAML","toSlug","content","toTitleCase","chalk"],"mappings":"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","file":"index.js","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Type for Zod schema objects (introspection via .def property).\n */\nexport interface ZodSchema {\n def: ZodDef;\n}\n\nexport interface ZodDef {\n type: string;\n innerType?: ZodSchema;\n shape?: Record<string, ZodSchema>;\n element?: ZodSchema;\n entries?: Record<string, unknown>;\n options?: ZodSchema[];\n getter?: () => ZodSchema;\n description?: string;\n values?: unknown[];\n value?: unknown;\n}\n\n/**\n * Field information extracted from Zod schema.\n */\nexport interface FieldInfo {\n name: string;\n type: string;\n required: boolean;\n description?: string;\n}\n\n/**\n * Entity information extracted from Zod schema.\n */\nexport interface EntityInfo {\n name: string;\n slug: string;\n endpoint: string;\n fieldCount: number;\n fields: FieldInfo[];\n sourceFile: string;\n}\n\n/**\n * Result of loading Zod schemas.\n */\nexport interface LoadZodSchemasResult {\n entities: EntityInfo[];\n errors: string[];\n}\n\n/**\n * Load and introspect Zod schemas from a compiled JS module.\n *\n * Works with both CommonJS and ESM modules.\n * Requires the schemas to be compiled (run 'pnpm build').\n */\nexport function loadZodSchemas(schemaPath: string): LoadZodSchemasResult {\n const errors: string[] = [];\n const entities: EntityInfo[] = [];\n\n try {\n // Check file exists\n if (!fs.existsSync(schemaPath)) {\n return {\n entities: [],\n errors: [`Schema file not found: ${schemaPath}`],\n };\n }\n\n // Try to require the schema module\n let schemaModule: Record<string, unknown>;\n\n try {\n schemaModule = require(schemaPath);\n } catch (e) {\n return {\n entities: [],\n errors: [\n `Failed to load schema module: ${schemaPath}`,\n 'Make sure schemas are compiled (run \"pnpm build\")',\n String(e),\n ],\n };\n }\n\n // Iterate through exports\n for (const [name, exported] of Object.entries(schemaModule)) {\n // Skip non-objects and non-schema exports\n if (!isZodSchema(exported)) continue;\n\n const schema = exported as ZodSchema;\n\n // Skip non-object schemas\n if (schema.def.type !== 'object') continue;\n\n // Extract entity name (remove Schema suffix)\n const entityName = name.replace(/Schema$/i, '');\n\n // Get shape\n const shape = schema.def.shape || {};\n\n // Build field list\n const fields: FieldInfo[] = Object.entries(shape).map(([fieldName, fieldSchema]) => {\n return {\n name: fieldName,\n type: inferZodType(fieldSchema as ZodSchema),\n required: !isOptional(fieldSchema as ZodSchema),\n description: (fieldSchema as ZodSchema).def.description,\n };\n });\n\n entities.push({\n name: toTitleCase(entityName),\n slug: toSlug(entityName),\n endpoint: `/${toSlug(entityName)}`,\n fieldCount: fields.length,\n fields,\n sourceFile: schemaPath,\n });\n }\n\n return { entities, errors };\n } catch (e) {\n return {\n entities: [],\n errors: [String(e)],\n };\n }\n}\n\n/**\n * Check if an object is a Zod schema.\n */\nexport function isZodSchema(obj: unknown): boolean {\n return typeof obj === 'object' && obj !== null && 'def' in obj;\n}\n\n/**\n * Check if a Zod schema is optional.\n */\nexport function isOptional(schema: ZodSchema): boolean {\n const def = schema.def;\n\n // Direct optional\n if (def.type === 'optional') return true;\n\n // Through lazy wrapper\n if (def.type === 'lazy') {\n const getter = def.getter;\n if (getter) {\n return isOptional(getter());\n }\n }\n\n // ZodOptional has innerType\n if (def.innerType) {\n return isOptional(def.innerType);\n }\n\n return false;\n}\n\n/**\n * Infer a human-readable type string from a Zod schema definition.\n */\nexport function inferZodType(schema: ZodSchema): string {\n const def = schema.def;\n\n switch (def.type) {\n case 'string':\n return 'string';\n\n case 'number':\n case 'bigint':\n return 'number';\n\n case 'boolean':\n return 'boolean';\n\n case 'date':\n return 'date';\n\n case 'enum':\n if (def.entries) {\n return Object.keys(def.entries).join(' | ');\n }\n if (def.values) {\n return def.values.map(String).join(' | ');\n }\n return 'enum';\n\n case 'literal':\n if (def.value !== undefined) {\n return JSON.stringify(def.value);\n }\n if (def.values) {\n return def.values.map((v) => JSON.stringify(v)).join(' | ');\n }\n return 'literal';\n\n case 'array':\n if (def.element) {\n return `${inferZodType(def.element)}[]`;\n }\n return 'array';\n\n case 'object':\n return 'object';\n\n case 'optional':\n if (def.innerType) {\n return inferZodType(def.innerType);\n }\n return 'optional';\n\n case 'nullable':\n if (def.innerType) {\n return `${inferZodType(def.innerType)} | null`;\n }\n return 'nullable';\n\n case 'union':\n if (def.options) {\n return def.options.map((opt) => inferZodType(opt)).join(' | ');\n }\n return 'union';\n\n case 'discriminated_union':\n if (def.options) {\n return def.options.map((opt) => inferZodType(opt)).join(' | ');\n }\n return 'union';\n\n case 'intersection':\n return 'object';\n\n case 'lazy':\n if (def.getter) {\n return inferZodType(def.getter());\n }\n return 'lazy';\n\n case 'any':\n case 'unknown':\n case 'never':\n case 'void':\n return def.type;\n\n case 'record':\n return 'Record<string, unknown>';\n\n case 'map':\n return 'Map<unknown, unknown>';\n\n case 'set':\n return 'Set<unknown>';\n\n case 'tuple':\n return 'tuple';\n\n default:\n return def.type || 'unknown';\n }\n}\n\n/**\n * Convert string to title case.\n */\nexport function toTitleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Convert string to URL-safe slug.\n */\nexport function toSlug(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n","import fs from 'fs';\nimport path from 'path';\nimport YAML from 'js-yaml';\nimport { loadZodSchemas } from './schema-loader';\nimport type { EntityInfo, FieldInfo, ListEntitiesResult, ListEntitiesOptions } from './types';\n\n/**\n * Discover available entities from Zod schemas or OpenAPI spec.\n *\n * Priority:\n * 1. schemaPath (explicit Zod schemas)\n * 2. specPath (explicit OpenAPI spec)\n * 3. Auto-detect (look for compiled schemas or OpenAPI spec)\n *\n * Pure function: same inputs → same outputs, no side effects.\n */\nexport function listEntities(options: ListEntitiesOptions = {}): ListEntitiesResult {\n const { specPath, schemaPath, projectRoot } = options;\n\n // Priority: schemaPath (Zod) > specPath (OpenAPI) > auto-detect\n if (schemaPath) {\n return listFromZodSchemas(schemaPath);\n }\n\n if (specPath) {\n return listFromOpenAPISpec(specPath);\n }\n\n // Auto-detect: look for compiled schemas or OpenAPI spec\n const root = projectRoot || process.cwd();\n const generatedDir = path.join(root, 'src', 'generated');\n\n // Try Zod schemas first (in generated directory)\n if (fs.existsSync(generatedDir)) {\n const schemaFiles = findSchemaFiles(generatedDir);\n\n for (const file of schemaFiles) {\n const result = loadZodSchemas(file);\n if (result.entities.length > 0) {\n return {\n success: true,\n entities: result.entities,\n errors: result.errors.length > 0 ? result.errors : undefined,\n };\n }\n }\n }\n\n // Try compiled dist files\n const distDir = path.join(root, 'dist');\n if (fs.existsSync(distDir)) {\n const schemaFiles = findCompiledSchemaFiles(distDir);\n\n for (const file of schemaFiles) {\n const result = loadZodSchemas(file);\n if (result.entities.length > 0) {\n return {\n success: true,\n entities: result.entities,\n errors: result.errors.length > 0 ? result.errors : undefined,\n };\n }\n }\n }\n\n // Try OpenAPI spec\n const specCandidates = [\n path.join(root, 'api.yaml'),\n path.join(root, 'api.yml'),\n path.join(root, 'openapi.yaml'),\n path.join(root, 'openapi.yml'),\n path.join(root, 'spec.yaml'),\n path.join(root, 'spec.yml'),\n ];\n\n for (const specFile of specCandidates) {\n if (fs.existsSync(specFile)) {\n return listFromOpenAPISpec(specFile);\n }\n }\n\n return {\n success: false,\n entities: [],\n errors: [\n 'No schema or spec found.',\n 'Options:',\n ' 1. Provide --schema-path to load compiled Zod schemas',\n ' 2. Provide --spec-path to parse an OpenAPI spec',\n ' 3. Ensure schemas are in src/generated/ or dist/',\n ],\n };\n}\n\n/**\n * Load entities from compiled Zod schema module.\n */\nfunction listFromZodSchemas(schemaPath: string): ListEntitiesResult {\n const { entities, errors } = loadZodSchemas(schemaPath);\n\n return {\n success: errors.length === 0,\n entities,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\n/**\n * List entities from an OpenAPI spec file.\n *\n * Strategy: Iterate through paths, not schemas.\n * Schemas often don't map to paths (especially for request/response models).\n */\nfunction listFromOpenAPISpec(specPath: string): ListEntitiesResult {\n const errors: string[] = [];\n\n try {\n if (!fs.existsSync(specPath)) {\n return {\n success: false,\n entities: [],\n errors: [`Spec file not found: ${specPath}`],\n };\n }\n\n const content = fs.readFileSync(specPath, 'utf8');\n const spec = YAML.load(content) as Record<string, unknown>;\n\n const paths = (spec.paths as Record<string, Record<string, unknown>>) || {};\n const schemas =\n ((spec.components as Record<string, unknown>)?.schemas as Record<string, unknown>) || {};\n\n const entities: EntityInfo[] = [];\n const seenPaths = new Set<string>();\n\n // Iterate through paths to find entity-like endpoints\n for (const [pathStr, pathItem] of Object.entries(paths)) {\n // Skip paths we've already processed\n if (seenPaths.has(pathStr)) continue;\n\n // Get the GET operation (usually the \"list\" or \"get\" endpoint)\n const getOp = pathItem.get as Record<string, unknown> | undefined;\n const postOp = pathItem.post as Record<string, unknown> | undefined;\n\n // Skip admin/internal paths\n if (isInternalPath(pathStr)) {\n continue;\n }\n\n // Extract entity name from path\n const entityName = extractEntityNameFromPath(pathStr);\n const slug = toSlug(entityName);\n\n // Find the response schema for this endpoint\n let responseSchema: Record<string, unknown> | null = null;\n let fields: FieldInfo[] = [];\n\n // Try GET response first, then POST\n const operation = getOp || postOp;\n if (operation) {\n const responses = operation.responses as Record<string, unknown> | undefined;\n if (responses) {\n const successResponse = responses['200'] || responses['201'] || responses['default'];\n if (successResponse) {\n const content = (successResponse as Record<string, unknown>).content as\n | Record<string, unknown>\n | undefined;\n if (content) {\n const json = content['application/json'] as Record<string, unknown> | undefined;\n if (json) {\n const schemaOrRef = (json.schema || json) as Record<string, unknown>;\n if (schemaOrRef.$ref) {\n // It's a reference to a component schema\n const refName = extractSchemaName(schemaOrRef.$ref as string);\n const foundSchema = schemas[refName] as Record<string, unknown> | undefined;\n if (foundSchema) responseSchema = foundSchema;\n } else if (\n schemaOrRef.type === 'array' &&\n (schemaOrRef.items as Record<string, unknown>)?.$ref\n ) {\n // Array response - get item schema\n const refName = extractSchemaName(\n (schemaOrRef.items as Record<string, unknown>).$ref as string\n );\n const foundSchema = schemas[refName] as Record<string, unknown> | undefined;\n if (foundSchema) responseSchema = foundSchema;\n } else {\n responseSchema = schemaOrRef;\n }\n }\n }\n }\n }\n }\n\n if (responseSchema) {\n const properties = (responseSchema.properties as Record<string, unknown>) || {};\n fields = Object.entries(properties).map(([fieldName, fieldDef]) => ({\n name: fieldName,\n type: inferOpenAPIType(fieldDef),\n required: isRequired(fieldName, responseSchema!),\n description: (fieldDef as Record<string, unknown>)?.description as string,\n }));\n }\n\n entities.push({\n name: toTitleCase(entityName),\n slug,\n endpoint: pathStr,\n fieldCount: fields.length,\n fields,\n sourceFile: specPath,\n });\n\n seenPaths.add(pathStr);\n }\n\n return {\n success: true,\n entities,\n errors: errors.length > 0 ? errors : undefined,\n };\n } catch (err) {\n return {\n success: false,\n entities: [],\n errors: [`Failed to parse OpenAPI spec: ${String(err)}`],\n };\n }\n}\n\n/**\n * Extract entity name from API path.\n *\n * /accounts → \"Accounts\"\n * /accounts/{id} → \"Account\"\n * /transactions/get → \"Transactions\"\n * /network/status → \"Network Status\"\n */\nfunction extractEntityNameFromPath(pathStr: string): string {\n // Remove leading slash\n let path = pathStr.replace(/^\\//, '');\n\n // Remove path parameters\n path = path.replace(/\\{[^}]+\\}/g, '');\n\n // Split by slash and take the first meaningful segment(s)\n const segments = path.split('/').filter((s) => s.length > 0);\n\n if (segments.length === 0) return 'Root';\n if (segments.length === 1) return segments[0];\n\n // For paths like /transactions/get, prefer the first segment (resource name)\n // /resource/id patterns also use first segment\n const first = segments[0];\n const second = segments[1];\n\n // If second segment is all lowercase letters, it's likely a verb/action - use first\n if (second && /^[a-z]+$/i.test(second)) {\n return first;\n }\n\n // Otherwise combine the segments for compound paths\n return `${first} ${second || ''}`.trim();\n}\n\n/**\n * Check if a path is internal/admin (should be filtered).\n */\nfunction isInternalPath(pathStr: string): boolean {\n const internalPrefixes = [\n '/admin',\n '/internal',\n '/debug',\n '/health',\n '/metrics',\n '/webhook',\n '/oauth',\n '/token',\n '/auth',\n ];\n\n const lower = pathStr.toLowerCase();\n return internalPrefixes.some((prefix) => lower.startsWith(prefix));\n}\n\n/**\n * Extract schema name from $ref.\n *\n * \"#/components/schemas/Equipment\" → \"Equipment\"\n */\nfunction extractSchemaName(ref: string): string {\n const parts = ref.split('/');\n return parts[parts.length - 1];\n}\n\n/**\n * Find TypeScript/JavaScript files that might contain Zod schemas.\n */\nfunction findSchemaFiles(dir: string, depth = 0): string[] {\n const files: string[] = [];\n\n if (!fs.existsSync(dir) || depth > 3) return files;\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n files.push(...findSchemaFiles(fullPath, depth + 1));\n } else if (entry.name.match(/\\.(js|ts|mjs|cjs)$/)) {\n // Skip test files\n if (!entry.name.match(/\\.(test|spec)\\.(js|ts)$/)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\n/**\n * Find compiled schema files in dist directory.\n */\nfunction findCompiledSchemaFiles(dir: string): string[] {\n const files: string[] = [];\n\n if (!fs.existsSync(dir)) return files;\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n files.push(...findCompiledSchemaFiles(fullPath));\n } else if (entry.name.match(/\\.(js|mjs|cjs)$/) && !entry.name.match(/^[A-Z]/)) {\n // Lowercase files often contain schema exports\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n/**\n * Infer type from OpenAPI field definition.\n */\nfunction inferOpenAPIType(fieldDef: unknown): string {\n if (typeof fieldDef !== 'object' || fieldDef === null) return 'unknown';\n\n const def = fieldDef as Record<string, unknown>;\n\n if (def.type) return String(def.type);\n if (def.$ref) return 'ref';\n if (def.oneOf || def.anyOf) return 'union';\n if (def.allOf) return 'intersection';\n\n return 'unknown';\n}\n\n/**\n * Check if a field is required in the schema.\n */\nfunction isRequired(fieldName: string, schema: Record<string, unknown>): boolean {\n const required = schema.required as string[] | undefined;\n return required ? required.includes(fieldName) : false;\n}\n\n/**\n * Convert string to title case.\n */\nexport function toTitleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Convert string to URL-safe slug.\n * Handles common English plural patterns to match OpenAPI conventions.\n *\n * Examples:\n * \"Supply\" → \"supplies\" (matches /supplies endpoint)\n * \"Equipment\" → \"equipment\" (matches /equipment endpoint)\n * \"Personnel\" → \"personnel\" (matches /personnel endpoint)\n */\nexport function toSlug(str: string): string {\n // First apply standard camelCase splitting\n let slug = str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n\n // Handle common irregular/special plurals that match OpenAPI conventions\n // \"supply\" → \"supplies\" (not \"supply\")\n if (slug === 'supply') {\n return 'supplies';\n }\n // \"category\" → \"categories\"\n if (slug === 'category') {\n return 'categories';\n }\n // \"history\" → \"histories\"\n if (slug === 'history') {\n return 'histories';\n }\n\n // Standard English pluralization: words ending in 'y' → 'ies'\n // But only for common API resource names, not acronyms or special cases\n // This is a simple heuristic - may need refinement\n\n return slug;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport YAML from 'js-yaml';\nimport type { EndpointFilter, GenerateFilterResult, GenerateFilterOptions } from './types';\nimport { listEntities } from './list-entities';\n\n/**\n * Generates endpoint filter configuration from selected entities.\n *\n * Pure function: same inputs → same outputs.\n *\n * Logic:\n * 1. For each selected entity, include: /entity and /entity/{id}\n * 2. Apply default exclusions (admin, reports, delete)\n * 3. Return filter config\n */\nexport function generateFilter(options: GenerateFilterOptions): GenerateFilterResult {\n const warnings: string[] = [];\n\n // Get entity list to validate selections\n const listResult = listEntities({\n specPath: options.specPath,\n projectRoot: options.projectRoot,\n });\n\n if (!listResult.success) {\n return {\n success: false,\n filter: { include: [], exclude: [] },\n warnings: listResult.errors ?? [],\n };\n }\n\n // Default exclusions\n const defaultExcludes = ['/admin/*', '/reports/*', '/*/delete', '/audit/*'];\n\n // Build include list from selected entities\n const include: string[] = [];\n const unknownEntities: string[] = [];\n\n for (const entitySlug of options.selectedEntities) {\n // Find entity in list - try multiple matching strategies\n const normalizedInput = entitySlug.toLowerCase();\n const entity = listResult.entities.find((e) => {\n // Match by slug\n if (e.slug === normalizedInput) return true;\n // Match by name\n if (e.name.toLowerCase() === normalizedInput) return true;\n // Match by endpoint path (handles /equipment, equipment, /equipment/{id})\n const normalizedEndpoint = e.endpoint.replace(/\\/$/, '').replace(/\\/\\{.*\\}$/, '');\n if (normalizedEndpoint.replace(/^\\//, '') === normalizedInput) return true;\n if (normalizedEndpoint === '/' + normalizedInput) return true;\n return false;\n });\n\n if (!entity) {\n unknownEntities.push(entitySlug);\n continue;\n }\n\n // Add list endpoint\n include.push(entity.endpoint);\n\n // Add single-item endpoint\n const singleEndpoint = entity.endpoint.endsWith('/')\n ? `${entity.endpoint}{id}`\n : `${entity.endpoint}/{id}`;\n include.push(singleEndpoint);\n }\n\n // Warn about unknown entities\n if (unknownEntities.length > 0) {\n warnings.push(\n `Unknown entities: ${unknownEntities.join(', ')}. Available: ${listResult.entities.map((e) => e.slug).join(', ')}`\n );\n }\n\n // Build exclude list\n const exclude = [...defaultExcludes, ...(options.excludePatterns || [])];\n\n // Write to stackwright.yml if output path provided\n if (options.outputPath) {\n const projectRoot = options.projectRoot || process.cwd();\n const outputFullPath = path.isAbsolute(options.outputPath)\n ? options.outputPath\n : path.join(projectRoot, options.outputPath);\n\n const config = {\n integrations: [\n {\n type: 'openapi',\n endpoints: {\n include,\n exclude,\n },\n },\n ],\n };\n\n fs.writeFileSync(outputFullPath, YAML.dump(config, { lineWidth: 120 }), 'utf8');\n }\n\n return {\n success: true,\n filter: { include, exclude },\n warnings: warnings.length > 0 ? warnings : undefined,\n outputPath: options.outputPath,\n };\n}\n\n/**\n * Discover entities from an OpenAPI spec and generate filter.\n * Single function for the common workflow.\n */\nexport function discoverAndFilter(options: {\n specPath: string;\n selectedEntities: string[];\n excludePatterns?: string[];\n outputPath?: string;\n projectRoot?: string;\n}): GenerateFilterResult {\n const listResult = listEntities({\n specPath: options.specPath,\n projectRoot: options.projectRoot,\n });\n\n if (!listResult.success) {\n return {\n success: false,\n filter: { include: [], exclude: [] },\n warnings: listResult.errors,\n };\n }\n\n return generateFilter({\n specPath: options.specPath,\n selectedEntities: options.selectedEntities,\n excludePatterns: options.excludePatterns,\n outputPath: options.outputPath,\n projectRoot: options.projectRoot,\n });\n}\n","import chalk from 'chalk';\nimport { listEntities } from './list-entities';\nimport { generateFilter, discoverAndFilter } from './generate-filter';\nimport type { PluginRegistrar } from './types';\n\n// Re-export types for consumers\nexport type { EntityInfo, FieldInfo, ListEntitiesResult, ListEntitiesOptions } from './types';\nexport type { EndpointFilter, GenerateFilterResult, GenerateFilterOptions } from './types';\n\n// Re-export pure functions for programmatic use\nexport { listEntities } from './list-entities';\nexport { generateFilter, discoverAndFilter } from './generate-filter';\n\n/**\n * CLI plugin registration.\n * Called by the OSS CLI when this package is installed.\n *\n * Usage in OSS CLI:\n * ```ts\n * // In cli-plugin-loader.ts\n * import { registerCommands } from '@stackwright-pro/cli-data-explorer';\n * registerCommands(program);\n * ```\n */\nexport const registerCommands: PluginRegistrar = (program) => {\n // Create a mock Command interface that works with basic commander patterns\n // The actual integration point depends on the OSS CLI's command structure\n\n const dataExplorerCmd = {\n command: (name?: string) => {\n if (name) {\n console.log(`Creating subcommand: ${name}`);\n }\n return dataExplorerCmd;\n },\n description: (text: string) => {\n console.log(`Setting description: ${text}`);\n return dataExplorerCmd;\n },\n option: (flags: string, description?: string) => {\n return dataExplorerCmd;\n },\n requiredOption: (flags: string, description?: string) => {\n return dataExplorerCmd;\n },\n action: (handler: (options: Record<string, unknown>) => void | Promise<void>) => {\n return dataExplorerCmd;\n },\n hook: (event: string, handler: () => void | Promise<void>) => {\n if (event === 'preAction') {\n // Execute the hook immediately when setting it up\n handler();\n }\n return dataExplorerCmd;\n },\n addHelpText: (position: string, text: string) => {\n return dataExplorerCmd;\n },\n };\n\n // Ensure @stackwright-pro/openapi is available\n try {\n require('@stackwright-pro/openapi');\n } catch {\n console.error(chalk.red('Error: @stackwright-pro/openapi is required for data-explorer.'));\n console.error(chalk.blue('Install it with: pnpm add @stackwright-pro/openapi'));\n process.exit(1);\n }\n\n // For now, create a simple command structure that can be detected\n // In a real integration, this would use the actual Commander program\n const cmd = program.command?.('data-explorer') || dataExplorerCmd;\n\n // This function handles the 'list' subcommand\n const handleList = (opts: { spec?: string; schema?: string; json?: boolean }) => {\n const result = listEntities({\n specPath: opts.spec,\n schemaPath: opts.schema,\n projectRoot: process.cwd(),\n });\n\n if (!result.success) {\n console.error(chalk.red('Failed to list entities:'));\n result.errors?.forEach((e) => console.error(` ${e}`));\n process.exit(1);\n }\n\n if (result.entities.length === 0) {\n console.log(chalk.yellow('\\nNo entities found.'));\n console.log(chalk.blue(' Options:'));\n console.log(chalk.blue(' --schema <path> Load compiled Zod schemas'));\n console.log(chalk.blue(' --spec <path> Parse OpenAPI spec'));\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\n📦 Available Entities:\\n'));\n\n for (const entity of result.entities) {\n console.log(` ${chalk.cyan(entity.name)} (${entity.slug})`);\n console.log(` Endpoint: ${entity.endpoint}`);\n console.log(` Fields: ${entity.fieldCount}`);\n\n // Show first 3 fields\n for (const field of entity.fields.slice(0, 3)) {\n const required = field.required ? '' : '?';\n console.log(` - ${field.name}${required}: ${field.type}`);\n }\n\n if (entity.fields.length > 3) {\n console.log(` ... and ${entity.fields.length - 3} more`);\n }\n console.log();\n }\n\n console.log(chalk.dim(`\\nTotal: ${result.entities.length} entities\\n`));\n };\n\n // This function handles the 'filter' subcommand\n const handleFilter = (opts: {\n entities: string;\n exclude?: string;\n output?: string;\n json?: boolean;\n }) => {\n const entities = opts.entities.split(',').map((e) => e.trim());\n\n const result = generateFilter({\n selectedEntities: entities,\n excludePatterns: opts.exclude?.split(',').map((e) => e.trim()),\n outputPath: opts.output || './stackwright.yml',\n projectRoot: process.cwd(),\n });\n\n if (!result.success) {\n console.error(chalk.red('Failed to generate filter:'));\n result.warnings?.forEach((w) => console.error(` ${w}`));\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\n🔐 Generated Endpoint Filter:\\n'));\n\n console.log(' Include:');\n for (const path of result.filter.include) {\n console.log(` ${chalk.green('✅')} ${path}`);\n }\n console.log();\n\n console.log(' Exclude:');\n for (const pattern of result.filter.exclude) {\n console.log(` ${chalk.red('❌')} ${pattern}`);\n }\n console.log();\n\n if (result.warnings && result.warnings.length > 0) {\n console.log(chalk.yellow(' Warnings:'));\n for (const warning of result.warnings) {\n console.log(` ${chalk.yellow('⚠️')} ${warning}`);\n }\n console.log();\n }\n\n if (result.outputPath) {\n console.log(chalk.green(`\\n📝 Written to: ${result.outputPath}\\n`));\n }\n };\n\n // Export handlers for integration with real CLI\n return {\n dataExplorer: dataExplorerCmd,\n handleList,\n handleFilter,\n };\n};\n\n// Default export for convenience\nexport default registerCommands;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/schema-loader.ts","../src/list-entities.ts","../src/generate-filter.ts","../src/index.ts"],"names":["require","createRequire","fs","path","YAML","toSlug","content","toTitleCase","result","chalk"],"mappings":"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","file":"index.js","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Type for Zod schema objects (introspection via .def property).\n */\nexport interface ZodSchema {\n def: ZodDef;\n}\n\nexport interface ZodDef {\n type: string;\n innerType?: ZodSchema;\n shape?: Record<string, ZodSchema>;\n element?: ZodSchema;\n entries?: Record<string, unknown>;\n options?: ZodSchema[];\n getter?: () => ZodSchema;\n description?: string;\n values?: unknown[];\n value?: unknown;\n}\n\n/**\n * Field information extracted from Zod schema.\n */\nexport interface FieldInfo {\n name: string;\n type: string;\n required: boolean;\n description?: string;\n}\n\n/**\n * Entity information extracted from Zod schema.\n */\nexport interface EntityInfo {\n name: string;\n slug: string;\n endpoint: string;\n fieldCount: number;\n fields: FieldInfo[];\n sourceFile: string;\n}\n\n/**\n * Result of loading Zod schemas.\n */\nexport interface LoadZodSchemasResult {\n entities: EntityInfo[];\n errors: string[];\n}\n\n/**\n * Load and introspect Zod schemas from a compiled JS module.\n *\n * Works with both CommonJS and ESM modules.\n * Requires the schemas to be compiled (run 'pnpm build').\n */\nexport function loadZodSchemas(schemaPath: string): LoadZodSchemasResult {\n const errors: string[] = [];\n const entities: EntityInfo[] = [];\n\n try {\n // Check file exists\n if (!fs.existsSync(schemaPath)) {\n return {\n entities: [],\n errors: [`Schema file not found: ${schemaPath}`],\n };\n }\n\n // Try to require the schema module\n let schemaModule: Record<string, unknown>;\n\n try {\n schemaModule = require(schemaPath);\n } catch (e) {\n return {\n entities: [],\n errors: [\n `Failed to load schema module: ${schemaPath}`,\n 'Make sure schemas are compiled (run \"pnpm build\")',\n String(e),\n ],\n };\n }\n\n // Iterate through exports\n for (const [name, exported] of Object.entries(schemaModule)) {\n // Skip non-objects and non-schema exports\n if (!isZodSchema(exported)) continue;\n\n const schema = exported as ZodSchema;\n\n // Skip non-object schemas\n if (schema.def.type !== 'object') continue;\n\n // Extract entity name (remove Schema suffix)\n const entityName = name.replace(/Schema$/i, '');\n\n // Get shape\n const shape = schema.def.shape || {};\n\n // Build field list\n const fields: FieldInfo[] = Object.entries(shape).map(([fieldName, fieldSchema]) => {\n return {\n name: fieldName,\n type: inferZodType(fieldSchema as ZodSchema),\n required: !isOptional(fieldSchema as ZodSchema),\n description: (fieldSchema as ZodSchema).def.description,\n };\n });\n\n entities.push({\n name: toTitleCase(entityName),\n slug: toSlug(entityName),\n endpoint: `/${toSlug(entityName)}`,\n fieldCount: fields.length,\n fields,\n sourceFile: schemaPath,\n });\n }\n\n return { entities, errors };\n } catch (e) {\n return {\n entities: [],\n errors: [String(e)],\n };\n }\n}\n\n/**\n * Check if an object is a Zod schema.\n */\nexport function isZodSchema(obj: unknown): boolean {\n return typeof obj === 'object' && obj !== null && 'def' in obj;\n}\n\n/**\n * Check if a Zod schema is optional.\n */\nexport function isOptional(schema: ZodSchema): boolean {\n const def = schema.def;\n\n // Direct optional\n if (def.type === 'optional') return true;\n\n // Through lazy wrapper\n if (def.type === 'lazy') {\n const getter = def.getter;\n if (getter) {\n return isOptional(getter());\n }\n }\n\n // ZodOptional has innerType\n if (def.innerType) {\n return isOptional(def.innerType);\n }\n\n return false;\n}\n\n/**\n * Infer a human-readable type string from a Zod schema definition.\n */\nexport function inferZodType(schema: ZodSchema): string {\n const def = schema.def;\n\n switch (def.type) {\n case 'string':\n return 'string';\n\n case 'number':\n case 'bigint':\n return 'number';\n\n case 'boolean':\n return 'boolean';\n\n case 'date':\n return 'date';\n\n case 'enum':\n if (def.entries) {\n return Object.keys(def.entries).join(' | ');\n }\n if (def.values) {\n return def.values.map(String).join(' | ');\n }\n return 'enum';\n\n case 'literal':\n if (def.value !== undefined) {\n return JSON.stringify(def.value);\n }\n if (def.values) {\n return def.values.map((v) => JSON.stringify(v)).join(' | ');\n }\n return 'literal';\n\n case 'array':\n if (def.element) {\n return `${inferZodType(def.element)}[]`;\n }\n return 'array';\n\n case 'object':\n return 'object';\n\n case 'optional':\n if (def.innerType) {\n return inferZodType(def.innerType);\n }\n return 'optional';\n\n case 'nullable':\n if (def.innerType) {\n return `${inferZodType(def.innerType)} | null`;\n }\n return 'nullable';\n\n case 'union':\n if (def.options) {\n return def.options.map((opt) => inferZodType(opt)).join(' | ');\n }\n return 'union';\n\n case 'discriminated_union':\n if (def.options) {\n return def.options.map((opt) => inferZodType(opt)).join(' | ');\n }\n return 'union';\n\n case 'intersection':\n return 'object';\n\n case 'lazy':\n if (def.getter) {\n return inferZodType(def.getter());\n }\n return 'lazy';\n\n case 'any':\n case 'unknown':\n case 'never':\n case 'void':\n return def.type;\n\n case 'record':\n return 'Record<string, unknown>';\n\n case 'map':\n return 'Map<unknown, unknown>';\n\n case 'set':\n return 'Set<unknown>';\n\n case 'tuple':\n return 'tuple';\n\n default:\n return def.type || 'unknown';\n }\n}\n\n/**\n * Convert string to title case.\n */\nexport function toTitleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Convert string to URL-safe slug.\n */\nexport function toSlug(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n","import fs from 'fs';\nimport path from 'path';\nimport YAML from 'js-yaml';\nimport { loadZodSchemas } from './schema-loader';\nimport type { EntityInfo, FieldInfo, ListEntitiesResult, ListEntitiesOptions } from './types';\n\n/**\n * Discover available entities from Zod schemas or OpenAPI spec.\n *\n * Priority:\n * 1. schemaPath (explicit Zod schemas)\n * 2. specPath (explicit OpenAPI spec)\n * 3. Auto-detect (look for compiled schemas or OpenAPI spec)\n *\n * Pure function: same inputs → same outputs, no side effects.\n */\nexport function listEntities(options: ListEntitiesOptions = {}): ListEntitiesResult {\n const { specPath, schemaPath, projectRoot } = options;\n\n // Priority: schemaPath (Zod) > specPath (OpenAPI) > auto-detect\n if (schemaPath) {\n return listFromZodSchemas(schemaPath);\n }\n\n if (specPath) {\n return listFromOpenAPISpec(specPath);\n }\n\n // Auto-detect: look for compiled schemas or OpenAPI spec\n const root = projectRoot || process.cwd();\n const generatedDir = path.join(root, 'src', 'generated');\n\n // Try Zod schemas first (in generated directory)\n if (fs.existsSync(generatedDir)) {\n const schemaFiles = findSchemaFiles(generatedDir);\n\n for (const file of schemaFiles) {\n const result = loadZodSchemas(file);\n if (result.entities.length > 0) {\n // Build result, conditionally including errors\n const returnResult: ListEntitiesResult = {\n success: true,\n entities: result.entities,\n };\n if (result.errors.length > 0) {\n returnResult.errors = result.errors;\n }\n return returnResult;\n }\n }\n }\n\n // Try compiled dist files\n const distDir = path.join(root, 'dist');\n if (fs.existsSync(distDir)) {\n const schemaFiles = findCompiledSchemaFiles(distDir);\n\n for (const file of schemaFiles) {\n const result = loadZodSchemas(file);\n if (result.entities.length > 0) {\n // Build result, conditionally including errors\n const returnResult: ListEntitiesResult = {\n success: true,\n entities: result.entities,\n };\n if (result.errors.length > 0) {\n returnResult.errors = result.errors;\n }\n return returnResult;\n }\n }\n }\n\n // Try OpenAPI spec\n const specCandidates = [\n path.join(root, 'api.yaml'),\n path.join(root, 'api.yml'),\n path.join(root, 'openapi.yaml'),\n path.join(root, 'openapi.yml'),\n path.join(root, 'spec.yaml'),\n path.join(root, 'spec.yml'),\n ];\n\n for (const specFile of specCandidates) {\n if (fs.existsSync(specFile)) {\n return listFromOpenAPISpec(specFile);\n }\n }\n\n return {\n success: false,\n entities: [],\n errors: [\n 'No schema or spec found.',\n 'Options:',\n ' 1. Provide --schema-path to load compiled Zod schemas',\n ' 2. Provide --spec-path to parse an OpenAPI spec',\n ' 3. Ensure schemas are in src/generated/ or dist/',\n ],\n };\n}\n\n/**\n * Load entities from compiled Zod schema module.\n */\nfunction listFromZodSchemas(schemaPath: string): ListEntitiesResult {\n const { entities, errors } = loadZodSchemas(schemaPath);\n\n // Build result, conditionally including errors\n const returnResult: ListEntitiesResult = {\n success: errors.length === 0,\n entities,\n };\n if (errors.length > 0) {\n returnResult.errors = errors;\n }\n return returnResult;\n}\n\n/**\n * List entities from an OpenAPI spec file.\n *\n * Strategy: Iterate through paths, not schemas.\n * Schemas often don't map to paths (especially for request/response models).\n */\nfunction listFromOpenAPISpec(specPath: string): ListEntitiesResult {\n const errors: string[] = [];\n\n try {\n if (!fs.existsSync(specPath)) {\n return {\n success: false,\n entities: [],\n errors: [`Spec file not found: ${specPath}`],\n };\n }\n\n const content = fs.readFileSync(specPath, 'utf8');\n const spec = YAML.load(content) as Record<string, unknown>;\n\n const paths = (spec.paths as Record<string, Record<string, unknown>>) || {};\n const schemas =\n ((spec.components as Record<string, unknown>)?.schemas as Record<string, unknown>) || {};\n\n const entities: EntityInfo[] = [];\n const seenPaths = new Set<string>();\n\n // Iterate through paths to find entity-like endpoints\n for (const [pathStr, pathItem] of Object.entries(paths)) {\n // Skip paths we've already processed\n if (seenPaths.has(pathStr)) continue;\n\n // Get the GET operation (usually the \"list\" or \"get\" endpoint)\n const getOp = pathItem.get as Record<string, unknown> | undefined;\n const postOp = pathItem.post as Record<string, unknown> | undefined;\n\n // Skip admin/internal paths\n if (isInternalPath(pathStr)) {\n continue;\n }\n\n // Extract entity name from path\n const entityName = extractEntityNameFromPath(pathStr);\n const slug = toSlug(entityName);\n\n // Find the response schema for this endpoint\n let responseSchema: Record<string, unknown> | null = null;\n let fields: FieldInfo[] = [];\n\n // Try GET response first, then POST\n const operation = getOp || postOp;\n if (operation) {\n const responses = operation.responses as Record<string, unknown> | undefined;\n if (responses) {\n const successResponse = responses['200'] || responses['201'] || responses['default'];\n if (successResponse) {\n const content = (successResponse as Record<string, unknown>).content as\n | Record<string, unknown>\n | undefined;\n if (content) {\n const json = content['application/json'] as Record<string, unknown> | undefined;\n if (json) {\n const schemaOrRef = (json.schema || json) as Record<string, unknown>;\n if (schemaOrRef.$ref) {\n // It's a reference to a component schema\n const refName = extractSchemaName(schemaOrRef.$ref as string);\n const foundSchema = schemas[refName] as Record<string, unknown> | undefined;\n if (foundSchema) responseSchema = foundSchema;\n } else if (\n schemaOrRef.type === 'array' &&\n (schemaOrRef.items as Record<string, unknown>)?.$ref\n ) {\n // Array response - get item schema\n const refName = extractSchemaName(\n (schemaOrRef.items as Record<string, unknown>).$ref as string\n );\n const foundSchema = schemas[refName] as Record<string, unknown> | undefined;\n if (foundSchema) responseSchema = foundSchema;\n } else {\n responseSchema = schemaOrRef;\n }\n }\n }\n }\n }\n }\n\n if (responseSchema) {\n const properties = (responseSchema.properties as Record<string, unknown>) || {};\n fields = Object.entries(properties).map(([fieldName, fieldDef]) => ({\n name: fieldName,\n type: inferOpenAPIType(fieldDef),\n required: isRequired(fieldName, responseSchema!),\n description: (fieldDef as Record<string, unknown>)?.description as string,\n }));\n }\n\n entities.push({\n name: toTitleCase(entityName),\n slug,\n endpoint: pathStr,\n fieldCount: fields.length,\n fields,\n sourceFile: specPath,\n });\n\n seenPaths.add(pathStr);\n }\n\n // Build result, conditionally including errors\n const returnResult: ListEntitiesResult = {\n success: true,\n entities,\n };\n if (errors.length > 0) {\n returnResult.errors = errors;\n }\n return returnResult;\n } catch (err) {\n return {\n success: false,\n entities: [],\n errors: [`Failed to parse OpenAPI spec: ${String(err)}`],\n };\n }\n}\n\n/**\n * Extract entity name from API path.\n *\n * /accounts → \"Accounts\"\n * /accounts/{id} → \"Account\"\n * /transactions/get → \"Transactions\"\n * /network/status → \"Network Status\"\n */\nfunction extractEntityNameFromPath(pathStr: string): string {\n // Remove leading slash\n let path = pathStr.replace(/^\\//, '');\n\n // Remove path parameters\n path = path.replace(/\\{[^}]+\\}/g, '');\n\n // Split by slash and take the first meaningful segment(s)\n const segments = path.split('/').filter((s) => s.length > 0);\n\n if (segments.length === 0) return 'Root';\n if (segments.length === 1) return segments[0] ?? 'Root';\n\n // For paths like /transactions/get, prefer the first segment (resource name)\n // /resource/id patterns also use first segment\n const first = segments[0] ?? 'Root';\n const second = segments[1];\n\n // If second segment is all lowercase letters, it's likely a verb/action - use first\n if (second && /^[a-z]+$/i.test(second)) {\n return first;\n }\n\n // Otherwise combine the segments for compound paths\n return `${first} ${second || ''}`.trim();\n}\n\n/**\n * Check if a path is internal/admin (should be filtered).\n */\nfunction isInternalPath(pathStr: string): boolean {\n const internalPrefixes = [\n '/admin',\n '/internal',\n '/debug',\n '/health',\n '/metrics',\n '/webhook',\n '/oauth',\n '/token',\n '/auth',\n ];\n\n const lower = pathStr.toLowerCase();\n return internalPrefixes.some((prefix) => lower.startsWith(prefix));\n}\n\n/**\n * Extract schema name from $ref.\n *\n * \"#/components/schemas/Equipment\" → \"Equipment\"\n */\nfunction extractSchemaName(ref: string): string {\n const parts = ref.split('/');\n const lastPart = parts[parts.length - 1];\n return lastPart ?? ref;\n}\n\n/**\n * Find TypeScript/JavaScript files that might contain Zod schemas.\n */\nfunction findSchemaFiles(dir: string, depth = 0): string[] {\n const files: string[] = [];\n\n if (!fs.existsSync(dir) || depth > 3) return files;\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n files.push(...findSchemaFiles(fullPath, depth + 1));\n } else if (entry.name.match(/\\.(js|ts|mjs|cjs)$/)) {\n // Skip test files\n if (!entry.name.match(/\\.(test|spec)\\.(js|ts)$/)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\n/**\n * Find compiled schema files in dist directory.\n */\nfunction findCompiledSchemaFiles(dir: string): string[] {\n const files: string[] = [];\n\n if (!fs.existsSync(dir)) return files;\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n files.push(...findCompiledSchemaFiles(fullPath));\n } else if (entry.name.match(/\\.(js|mjs|cjs)$/) && !entry.name.match(/^[A-Z]/)) {\n // Lowercase files often contain schema exports\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n/**\n * Infer type from OpenAPI field definition.\n */\nfunction inferOpenAPIType(fieldDef: unknown): string {\n if (typeof fieldDef !== 'object' || fieldDef === null) return 'unknown';\n\n const def = fieldDef as Record<string, unknown>;\n\n if (def.type) return String(def.type);\n if (def.$ref) return 'ref';\n if (def.oneOf || def.anyOf) return 'union';\n if (def.allOf) return 'intersection';\n\n return 'unknown';\n}\n\n/**\n * Check if a field is required in the schema.\n */\nfunction isRequired(fieldName: string, schema: Record<string, unknown>): boolean {\n const required = schema.required as string[] | undefined;\n return required ? required.includes(fieldName) : false;\n}\n\n/**\n * Convert string to title case.\n */\nexport function toTitleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Convert string to URL-safe slug.\n * Handles common English plural patterns to match OpenAPI conventions.\n *\n * Examples:\n * \"Supply\" → \"supplies\" (matches /supplies endpoint)\n * \"Equipment\" → \"equipment\" (matches /equipment endpoint)\n * \"Personnel\" → \"personnel\" (matches /personnel endpoint)\n */\nexport function toSlug(str: string): string {\n // First apply standard camelCase splitting\n const slug = str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n\n // Handle common irregular/special plurals that match OpenAPI conventions\n // \"supply\" → \"supplies\" (not \"supply\")\n if (slug === 'supply') {\n return 'supplies';\n }\n // \"category\" → \"categories\"\n if (slug === 'category') {\n return 'categories';\n }\n // \"history\" → \"histories\"\n if (slug === 'history') {\n return 'histories';\n }\n\n // Standard English pluralization: words ending in 'y' → 'ies'\n // But only for common API resource names, not acronyms or special cases\n // This is a simple heuristic - may need refinement\n\n return slug;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport YAML from 'js-yaml';\nimport type {\n EndpointFilter,\n GenerateFilterResult,\n GenerateFilterOptions,\n ListEntitiesOptions,\n} from './types';\nimport { listEntities } from './list-entities';\n\n/**\n * Generates endpoint filter configuration from selected entities.\n *\n * Pure function: same inputs → same outputs.\n *\n * Logic:\n * 1. For each selected entity, include: /entity and /entity/{id}\n * 2. Apply default exclusions (admin, reports, delete)\n * 3. Return filter config\n */\nexport function generateFilter(options: GenerateFilterOptions): GenerateFilterResult {\n const warnings: string[] = [];\n\n // Get entity list to validate selections - build options conditionally\n const listOptions: ListEntitiesOptions = {};\n if (options.specPath !== undefined) listOptions.specPath = options.specPath;\n if (options.projectRoot !== undefined) listOptions.projectRoot = options.projectRoot;\n\n const listResult = listEntities(listOptions);\n\n if (!listResult.success) {\n const result: GenerateFilterResult = {\n success: false,\n filter: { include: [], exclude: [] },\n };\n if (listResult.errors !== undefined) {\n result.warnings = listResult.errors;\n }\n return result;\n }\n\n // Default exclusions\n const defaultExcludes = ['/admin/*', '/reports/*', '/*/delete', '/audit/*'];\n\n // Build include list from selected entities\n const include: string[] = [];\n const unknownEntities: string[] = [];\n\n for (const entitySlug of options.selectedEntities) {\n // Find entity in list - try multiple matching strategies\n const normalizedInput = entitySlug.toLowerCase();\n const entity = listResult.entities.find((e) => {\n // Match by slug\n if (e.slug === normalizedInput) return true;\n // Match by name\n if (e.name.toLowerCase() === normalizedInput) return true;\n // Match by endpoint path (handles /equipment, equipment, /equipment/{id})\n const normalizedEndpoint = e.endpoint.replace(/\\/$/, '').replace(/\\/\\{.*\\}$/, '');\n if (normalizedEndpoint.replace(/^\\//, '') === normalizedInput) return true;\n if (normalizedEndpoint === '/' + normalizedInput) return true;\n return false;\n });\n\n if (!entity) {\n unknownEntities.push(entitySlug);\n continue;\n }\n\n // Add list endpoint\n include.push(entity.endpoint);\n\n // Add single-item endpoint\n const singleEndpoint = entity.endpoint.endsWith('/')\n ? `${entity.endpoint}{id}`\n : `${entity.endpoint}/{id}`;\n include.push(singleEndpoint);\n }\n\n // Warn about unknown entities\n if (unknownEntities.length > 0) {\n warnings.push(\n `Unknown entities: ${unknownEntities.join(', ')}. Available: ${listResult.entities.map((e) => e.slug).join(', ')}`\n );\n }\n\n // Build exclude list\n const exclude = [...defaultExcludes, ...(options.excludePatterns || [])];\n\n // Write to stackwright.yml if output path provided\n if (options.outputPath) {\n const projectRoot = options.projectRoot || process.cwd();\n const outputFullPath = path.isAbsolute(options.outputPath)\n ? options.outputPath\n : path.join(projectRoot, options.outputPath);\n\n const config = {\n integrations: [\n {\n type: 'openapi',\n endpoints: {\n include,\n exclude,\n },\n },\n ],\n };\n\n fs.writeFileSync(outputFullPath, YAML.dump(config, { lineWidth: 120 }), 'utf8');\n }\n\n // Build result, conditionally including optional properties\n const result: GenerateFilterResult = {\n success: true,\n filter: { include, exclude },\n };\n if (warnings.length > 0) {\n result.warnings = warnings;\n }\n if (options.outputPath !== undefined) {\n result.outputPath = options.outputPath;\n }\n return result;\n}\n\n/**\n * Discover entities from an OpenAPI spec and generate filter.\n * Single function for the common workflow.\n */\nexport function discoverAndFilter(options: {\n specPath: string;\n selectedEntities: string[];\n excludePatterns?: string[];\n outputPath?: string;\n projectRoot?: string;\n}): GenerateFilterResult {\n // Build list options conditionally\n const listOptions: ListEntitiesOptions = { specPath: options.specPath };\n if (options.projectRoot !== undefined) listOptions.projectRoot = options.projectRoot;\n\n const listResult = listEntities(listOptions);\n\n if (!listResult.success) {\n const result: GenerateFilterResult = {\n success: false,\n filter: { include: [], exclude: [] },\n };\n if (listResult.errors !== undefined) {\n result.warnings = listResult.errors;\n }\n return result;\n }\n\n // Build filter options conditionally\n const filterOptions: GenerateFilterOptions = {\n specPath: options.specPath,\n selectedEntities: options.selectedEntities,\n };\n if (options.excludePatterns !== undefined)\n filterOptions.excludePatterns = options.excludePatterns;\n if (options.outputPath !== undefined) filterOptions.outputPath = options.outputPath;\n if (options.projectRoot !== undefined) filterOptions.projectRoot = options.projectRoot;\n\n return generateFilter(filterOptions);\n}\n","import chalk from 'chalk';\nimport { listEntities } from './list-entities';\nimport { generateFilter, discoverAndFilter } from './generate-filter';\nimport type { PluginRegistrar, ListEntitiesOptions, GenerateFilterOptions } from './types';\n\n// Re-export types for consumers\nexport type { EntityInfo, FieldInfo, ListEntitiesResult, ListEntitiesOptions } from './types';\nexport type { EndpointFilter, GenerateFilterResult, GenerateFilterOptions } from './types';\n\n// Re-export pure functions for programmatic use\nexport { listEntities } from './list-entities';\nexport { generateFilter, discoverAndFilter } from './generate-filter';\n\n/**\n * CLI plugin registration.\n * Called by the OSS CLI when this package is installed.\n *\n * Usage in OSS CLI:\n * ```ts\n * // In cli-plugin-loader.ts\n * import { registerCommands } from '@stackwright-pro/cli-data-explorer';\n * registerCommands(program);\n * ```\n */\nexport const registerCommands: PluginRegistrar = (program) => {\n // Create a mock Command interface that works with basic commander patterns\n // The actual integration point depends on the OSS CLI's command structure\n\n const dataExplorerCmd = {\n command: (name?: string) => {\n if (name) {\n console.log(`Creating subcommand: ${name}`);\n }\n return dataExplorerCmd;\n },\n description: (text: string) => {\n console.log(`Setting description: ${text}`);\n return dataExplorerCmd;\n },\n option: (flags: string, description?: string) => {\n return dataExplorerCmd;\n },\n requiredOption: (flags: string, description?: string) => {\n return dataExplorerCmd;\n },\n action: (handler: (options: Record<string, unknown>) => void | Promise<void>) => {\n return dataExplorerCmd;\n },\n hook: (event: string, handler: () => void | Promise<void>) => {\n if (event === 'preAction') {\n // Execute the hook immediately when setting it up\n handler();\n }\n return dataExplorerCmd;\n },\n addHelpText: (position: string, text: string) => {\n return dataExplorerCmd;\n },\n };\n\n // Ensure @stackwright-pro/openapi is available\n try {\n require('@stackwright-pro/openapi');\n } catch {\n console.error(chalk.red('Error: @stackwright-pro/openapi is required for data-explorer.'));\n console.error(chalk.blue('Install it with: pnpm add @stackwright-pro/openapi'));\n process.exit(1);\n }\n\n // For now, create a simple command structure that can be detected\n // In a real integration, this would use the actual Commander program\n const cmd = program.command?.('data-explorer') || dataExplorerCmd;\n\n // This function handles the 'list' subcommand\n const handleList = (opts: { spec?: string; schema?: string; json?: boolean }) => {\n // Build options object, conditionally including optional properties\n // This avoids passing undefined to optional properties (exactOptionalPropertyTypes)\n const options: ListEntitiesOptions = { projectRoot: process.cwd() };\n if (opts.spec !== undefined) options.specPath = opts.spec;\n if (opts.schema !== undefined) options.schemaPath = opts.schema;\n\n const result = listEntities(options);\n\n if (!result.success) {\n console.error(chalk.red('Failed to list entities:'));\n result.errors?.forEach((e) => console.error(` ${e}`));\n process.exit(1);\n }\n\n if (result.entities.length === 0) {\n console.log(chalk.yellow('\\nNo entities found.'));\n console.log(chalk.blue(' Options:'));\n console.log(chalk.blue(' --schema <path> Load compiled Zod schemas'));\n console.log(chalk.blue(' --spec <path> Parse OpenAPI spec'));\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\n📦 Available Entities:\\n'));\n\n for (const entity of result.entities) {\n console.log(` ${chalk.cyan(entity.name)} (${entity.slug})`);\n console.log(` Endpoint: ${entity.endpoint}`);\n console.log(` Fields: ${entity.fieldCount}`);\n\n // Show first 3 fields\n for (const field of entity.fields.slice(0, 3)) {\n const required = field.required ? '' : '?';\n console.log(` - ${field.name}${required}: ${field.type}`);\n }\n\n if (entity.fields.length > 3) {\n console.log(` ... and ${entity.fields.length - 3} more`);\n }\n console.log();\n }\n\n console.log(chalk.dim(`\\nTotal: ${result.entities.length} entities\\n`));\n };\n\n // This function handles the 'filter' subcommand\n const handleFilter = (opts: {\n entities: string;\n exclude?: string;\n output?: string;\n json?: boolean;\n }) => {\n const entities = opts.entities.split(',').map((e) => e.trim());\n\n // Build options object, conditionally including optional properties\n const options: GenerateFilterOptions = {\n selectedEntities: entities,\n outputPath: opts.output || './stackwright.yml',\n projectRoot: process.cwd(),\n };\n if (opts.exclude !== undefined) {\n options.excludePatterns = opts.exclude.split(',').map((e) => e.trim());\n }\n\n const result = generateFilter(options);\n\n if (!result.success) {\n console.error(chalk.red('Failed to generate filter:'));\n result.warnings?.forEach((w) => console.error(` ${w}`));\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\n🔐 Generated Endpoint Filter:\\n'));\n\n console.log(' Include:');\n for (const path of result.filter.include) {\n console.log(` ${chalk.green('✅')} ${path}`);\n }\n console.log();\n\n console.log(' Exclude:');\n for (const pattern of result.filter.exclude) {\n console.log(` ${chalk.red('❌')} ${pattern}`);\n }\n console.log();\n\n if (result.warnings && result.warnings.length > 0) {\n console.log(chalk.yellow(' Warnings:'));\n for (const warning of result.warnings) {\n console.log(` ${chalk.yellow('⚠️')} ${warning}`);\n }\n console.log();\n }\n\n if (result.outputPath) {\n console.log(chalk.green(`\\n📝 Written to: ${result.outputPath}\\n`));\n }\n };\n\n // Export handlers for integration with real CLI\n return {\n dataExplorer: dataExplorerCmd,\n handleList,\n handleFilter,\n };\n};\n\n// Default export for convenience\nexport default registerCommands;\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -184,11 +184,14 @@ function listEntities(options = {}) {
|
|
|
184
184
|
for (const file of schemaFiles) {
|
|
185
185
|
const result = loadZodSchemas(file);
|
|
186
186
|
if (result.entities.length > 0) {
|
|
187
|
-
|
|
187
|
+
const returnResult = {
|
|
188
188
|
success: true,
|
|
189
|
-
entities: result.entities
|
|
190
|
-
errors: result.errors.length > 0 ? result.errors : void 0
|
|
189
|
+
entities: result.entities
|
|
191
190
|
};
|
|
191
|
+
if (result.errors.length > 0) {
|
|
192
|
+
returnResult.errors = result.errors;
|
|
193
|
+
}
|
|
194
|
+
return returnResult;
|
|
192
195
|
}
|
|
193
196
|
}
|
|
194
197
|
}
|
|
@@ -198,11 +201,14 @@ function listEntities(options = {}) {
|
|
|
198
201
|
for (const file of schemaFiles) {
|
|
199
202
|
const result = loadZodSchemas(file);
|
|
200
203
|
if (result.entities.length > 0) {
|
|
201
|
-
|
|
204
|
+
const returnResult = {
|
|
202
205
|
success: true,
|
|
203
|
-
entities: result.entities
|
|
204
|
-
errors: result.errors.length > 0 ? result.errors : void 0
|
|
206
|
+
entities: result.entities
|
|
205
207
|
};
|
|
208
|
+
if (result.errors.length > 0) {
|
|
209
|
+
returnResult.errors = result.errors;
|
|
210
|
+
}
|
|
211
|
+
return returnResult;
|
|
206
212
|
}
|
|
207
213
|
}
|
|
208
214
|
}
|
|
@@ -233,11 +239,14 @@ function listEntities(options = {}) {
|
|
|
233
239
|
}
|
|
234
240
|
function listFromZodSchemas(schemaPath) {
|
|
235
241
|
const { entities, errors } = loadZodSchemas(schemaPath);
|
|
236
|
-
|
|
242
|
+
const returnResult = {
|
|
237
243
|
success: errors.length === 0,
|
|
238
|
-
entities
|
|
239
|
-
errors: errors.length > 0 ? errors : void 0
|
|
244
|
+
entities
|
|
240
245
|
};
|
|
246
|
+
if (errors.length > 0) {
|
|
247
|
+
returnResult.errors = errors;
|
|
248
|
+
}
|
|
249
|
+
return returnResult;
|
|
241
250
|
}
|
|
242
251
|
function listFromOpenAPISpec(specPath) {
|
|
243
252
|
const errors = [];
|
|
@@ -314,11 +323,14 @@ function listFromOpenAPISpec(specPath) {
|
|
|
314
323
|
});
|
|
315
324
|
seenPaths.add(pathStr);
|
|
316
325
|
}
|
|
317
|
-
|
|
326
|
+
const returnResult = {
|
|
318
327
|
success: true,
|
|
319
|
-
entities
|
|
320
|
-
errors: errors.length > 0 ? errors : void 0
|
|
328
|
+
entities
|
|
321
329
|
};
|
|
330
|
+
if (errors.length > 0) {
|
|
331
|
+
returnResult.errors = errors;
|
|
332
|
+
}
|
|
333
|
+
return returnResult;
|
|
322
334
|
} catch (err) {
|
|
323
335
|
return {
|
|
324
336
|
success: false,
|
|
@@ -332,8 +344,8 @@ function extractEntityNameFromPath(pathStr) {
|
|
|
332
344
|
path3 = path3.replace(/\{[^}]+\}/g, "");
|
|
333
345
|
const segments = path3.split("/").filter((s) => s.length > 0);
|
|
334
346
|
if (segments.length === 0) return "Root";
|
|
335
|
-
if (segments.length === 1) return segments[0];
|
|
336
|
-
const first = segments[0];
|
|
347
|
+
if (segments.length === 1) return segments[0] ?? "Root";
|
|
348
|
+
const first = segments[0] ?? "Root";
|
|
337
349
|
const second = segments[1];
|
|
338
350
|
if (second && /^[a-z]+$/i.test(second)) {
|
|
339
351
|
return first;
|
|
@@ -357,7 +369,8 @@ function isInternalPath(pathStr) {
|
|
|
357
369
|
}
|
|
358
370
|
function extractSchemaName(ref) {
|
|
359
371
|
const parts = ref.split("/");
|
|
360
|
-
|
|
372
|
+
const lastPart = parts[parts.length - 1];
|
|
373
|
+
return lastPart ?? ref;
|
|
361
374
|
}
|
|
362
375
|
function findSchemaFiles(dir, depth = 0) {
|
|
363
376
|
const files = [];
|
|
@@ -404,7 +417,7 @@ function toTitleCase2(str) {
|
|
|
404
417
|
return str.replace(/_/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
405
418
|
}
|
|
406
419
|
function toSlug2(str) {
|
|
407
|
-
|
|
420
|
+
const slug = str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
|
|
408
421
|
if (slug === "supply") {
|
|
409
422
|
return "supplies";
|
|
410
423
|
}
|
|
@@ -418,16 +431,19 @@ function toSlug2(str) {
|
|
|
418
431
|
}
|
|
419
432
|
function generateFilter(options) {
|
|
420
433
|
const warnings = [];
|
|
421
|
-
const
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
434
|
+
const listOptions = {};
|
|
435
|
+
if (options.specPath !== void 0) listOptions.specPath = options.specPath;
|
|
436
|
+
if (options.projectRoot !== void 0) listOptions.projectRoot = options.projectRoot;
|
|
437
|
+
const listResult = listEntities(listOptions);
|
|
425
438
|
if (!listResult.success) {
|
|
426
|
-
|
|
439
|
+
const result2 = {
|
|
427
440
|
success: false,
|
|
428
|
-
filter: { include: [], exclude: [] }
|
|
429
|
-
warnings: listResult.errors ?? []
|
|
441
|
+
filter: { include: [], exclude: [] }
|
|
430
442
|
};
|
|
443
|
+
if (listResult.errors !== void 0) {
|
|
444
|
+
result2.warnings = listResult.errors;
|
|
445
|
+
}
|
|
446
|
+
return result2;
|
|
431
447
|
}
|
|
432
448
|
const defaultExcludes = ["/admin/*", "/reports/*", "/*/delete", "/audit/*"];
|
|
433
449
|
const include = [];
|
|
@@ -472,32 +488,41 @@ function generateFilter(options) {
|
|
|
472
488
|
};
|
|
473
489
|
fs2.writeFileSync(outputFullPath, YAML.dump(config, { lineWidth: 120 }), "utf8");
|
|
474
490
|
}
|
|
475
|
-
|
|
491
|
+
const result = {
|
|
476
492
|
success: true,
|
|
477
|
-
filter: { include, exclude }
|
|
478
|
-
warnings: warnings.length > 0 ? warnings : void 0,
|
|
479
|
-
outputPath: options.outputPath
|
|
493
|
+
filter: { include, exclude }
|
|
480
494
|
};
|
|
495
|
+
if (warnings.length > 0) {
|
|
496
|
+
result.warnings = warnings;
|
|
497
|
+
}
|
|
498
|
+
if (options.outputPath !== void 0) {
|
|
499
|
+
result.outputPath = options.outputPath;
|
|
500
|
+
}
|
|
501
|
+
return result;
|
|
481
502
|
}
|
|
482
503
|
function discoverAndFilter(options) {
|
|
483
|
-
const
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
});
|
|
504
|
+
const listOptions = { specPath: options.specPath };
|
|
505
|
+
if (options.projectRoot !== void 0) listOptions.projectRoot = options.projectRoot;
|
|
506
|
+
const listResult = listEntities(listOptions);
|
|
487
507
|
if (!listResult.success) {
|
|
488
|
-
|
|
508
|
+
const result = {
|
|
489
509
|
success: false,
|
|
490
|
-
filter: { include: [], exclude: [] }
|
|
491
|
-
warnings: listResult.errors
|
|
510
|
+
filter: { include: [], exclude: [] }
|
|
492
511
|
};
|
|
512
|
+
if (listResult.errors !== void 0) {
|
|
513
|
+
result.warnings = listResult.errors;
|
|
514
|
+
}
|
|
515
|
+
return result;
|
|
493
516
|
}
|
|
494
|
-
|
|
517
|
+
const filterOptions = {
|
|
495
518
|
specPath: options.specPath,
|
|
496
|
-
selectedEntities: options.selectedEntities
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
519
|
+
selectedEntities: options.selectedEntities
|
|
520
|
+
};
|
|
521
|
+
if (options.excludePatterns !== void 0)
|
|
522
|
+
filterOptions.excludePatterns = options.excludePatterns;
|
|
523
|
+
if (options.outputPath !== void 0) filterOptions.outputPath = options.outputPath;
|
|
524
|
+
if (options.projectRoot !== void 0) filterOptions.projectRoot = options.projectRoot;
|
|
525
|
+
return generateFilter(filterOptions);
|
|
501
526
|
}
|
|
502
527
|
|
|
503
528
|
// src/index.ts
|
|
@@ -541,11 +566,10 @@ var registerCommands = (program) => {
|
|
|
541
566
|
}
|
|
542
567
|
program.command?.("data-explorer") || dataExplorerCmd;
|
|
543
568
|
const handleList = (opts) => {
|
|
544
|
-
const
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
});
|
|
569
|
+
const options = { projectRoot: process.cwd() };
|
|
570
|
+
if (opts.spec !== void 0) options.specPath = opts.spec;
|
|
571
|
+
if (opts.schema !== void 0) options.schemaPath = opts.schema;
|
|
572
|
+
const result = listEntities(options);
|
|
549
573
|
if (!result.success) {
|
|
550
574
|
console.error(chalk.red("Failed to list entities:"));
|
|
551
575
|
result.errors?.forEach((e) => console.error(` ${e}`));
|
|
@@ -582,12 +606,15 @@ Total: ${result.entities.length} entities
|
|
|
582
606
|
};
|
|
583
607
|
const handleFilter = (opts) => {
|
|
584
608
|
const entities = opts.entities.split(",").map((e) => e.trim());
|
|
585
|
-
const
|
|
609
|
+
const options = {
|
|
586
610
|
selectedEntities: entities,
|
|
587
|
-
excludePatterns: opts.exclude?.split(",").map((e) => e.trim()),
|
|
588
611
|
outputPath: opts.output || "./stackwright.yml",
|
|
589
612
|
projectRoot: process.cwd()
|
|
590
|
-
}
|
|
613
|
+
};
|
|
614
|
+
if (opts.exclude !== void 0) {
|
|
615
|
+
options.excludePatterns = opts.exclude.split(",").map((e) => e.trim());
|
|
616
|
+
}
|
|
617
|
+
const result = generateFilter(options);
|
|
591
618
|
if (!result.success) {
|
|
592
619
|
console.error(chalk.red("Failed to generate filter:"));
|
|
593
620
|
result.warnings?.forEach((w) => console.error(` ${w}`));
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema-loader.ts","../src/list-entities.ts","../src/generate-filter.ts","../src/index.ts"],"names":["require","fs","toSlug","content","toTitleCase","path","YAML"],"mappings":"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","file":"index.mjs","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Type for Zod schema objects (introspection via .def property).\n */\nexport interface ZodSchema {\n def: ZodDef;\n}\n\nexport interface ZodDef {\n type: string;\n innerType?: ZodSchema;\n shape?: Record<string, ZodSchema>;\n element?: ZodSchema;\n entries?: Record<string, unknown>;\n options?: ZodSchema[];\n getter?: () => ZodSchema;\n description?: string;\n values?: unknown[];\n value?: unknown;\n}\n\n/**\n * Field information extracted from Zod schema.\n */\nexport interface FieldInfo {\n name: string;\n type: string;\n required: boolean;\n description?: string;\n}\n\n/**\n * Entity information extracted from Zod schema.\n */\nexport interface EntityInfo {\n name: string;\n slug: string;\n endpoint: string;\n fieldCount: number;\n fields: FieldInfo[];\n sourceFile: string;\n}\n\n/**\n * Result of loading Zod schemas.\n */\nexport interface LoadZodSchemasResult {\n entities: EntityInfo[];\n errors: string[];\n}\n\n/**\n * Load and introspect Zod schemas from a compiled JS module.\n *\n * Works with both CommonJS and ESM modules.\n * Requires the schemas to be compiled (run 'pnpm build').\n */\nexport function loadZodSchemas(schemaPath: string): LoadZodSchemasResult {\n const errors: string[] = [];\n const entities: EntityInfo[] = [];\n\n try {\n // Check file exists\n if (!fs.existsSync(schemaPath)) {\n return {\n entities: [],\n errors: [`Schema file not found: ${schemaPath}`],\n };\n }\n\n // Try to require the schema module\n let schemaModule: Record<string, unknown>;\n\n try {\n schemaModule = require(schemaPath);\n } catch (e) {\n return {\n entities: [],\n errors: [\n `Failed to load schema module: ${schemaPath}`,\n 'Make sure schemas are compiled (run \"pnpm build\")',\n String(e),\n ],\n };\n }\n\n // Iterate through exports\n for (const [name, exported] of Object.entries(schemaModule)) {\n // Skip non-objects and non-schema exports\n if (!isZodSchema(exported)) continue;\n\n const schema = exported as ZodSchema;\n\n // Skip non-object schemas\n if (schema.def.type !== 'object') continue;\n\n // Extract entity name (remove Schema suffix)\n const entityName = name.replace(/Schema$/i, '');\n\n // Get shape\n const shape = schema.def.shape || {};\n\n // Build field list\n const fields: FieldInfo[] = Object.entries(shape).map(([fieldName, fieldSchema]) => {\n return {\n name: fieldName,\n type: inferZodType(fieldSchema as ZodSchema),\n required: !isOptional(fieldSchema as ZodSchema),\n description: (fieldSchema as ZodSchema).def.description,\n };\n });\n\n entities.push({\n name: toTitleCase(entityName),\n slug: toSlug(entityName),\n endpoint: `/${toSlug(entityName)}`,\n fieldCount: fields.length,\n fields,\n sourceFile: schemaPath,\n });\n }\n\n return { entities, errors };\n } catch (e) {\n return {\n entities: [],\n errors: [String(e)],\n };\n }\n}\n\n/**\n * Check if an object is a Zod schema.\n */\nexport function isZodSchema(obj: unknown): boolean {\n return typeof obj === 'object' && obj !== null && 'def' in obj;\n}\n\n/**\n * Check if a Zod schema is optional.\n */\nexport function isOptional(schema: ZodSchema): boolean {\n const def = schema.def;\n\n // Direct optional\n if (def.type === 'optional') return true;\n\n // Through lazy wrapper\n if (def.type === 'lazy') {\n const getter = def.getter;\n if (getter) {\n return isOptional(getter());\n }\n }\n\n // ZodOptional has innerType\n if (def.innerType) {\n return isOptional(def.innerType);\n }\n\n return false;\n}\n\n/**\n * Infer a human-readable type string from a Zod schema definition.\n */\nexport function inferZodType(schema: ZodSchema): string {\n const def = schema.def;\n\n switch (def.type) {\n case 'string':\n return 'string';\n\n case 'number':\n case 'bigint':\n return 'number';\n\n case 'boolean':\n return 'boolean';\n\n case 'date':\n return 'date';\n\n case 'enum':\n if (def.entries) {\n return Object.keys(def.entries).join(' | ');\n }\n if (def.values) {\n return def.values.map(String).join(' | ');\n }\n return 'enum';\n\n case 'literal':\n if (def.value !== undefined) {\n return JSON.stringify(def.value);\n }\n if (def.values) {\n return def.values.map((v) => JSON.stringify(v)).join(' | ');\n }\n return 'literal';\n\n case 'array':\n if (def.element) {\n return `${inferZodType(def.element)}[]`;\n }\n return 'array';\n\n case 'object':\n return 'object';\n\n case 'optional':\n if (def.innerType) {\n return inferZodType(def.innerType);\n }\n return 'optional';\n\n case 'nullable':\n if (def.innerType) {\n return `${inferZodType(def.innerType)} | null`;\n }\n return 'nullable';\n\n case 'union':\n if (def.options) {\n return def.options.map((opt) => inferZodType(opt)).join(' | ');\n }\n return 'union';\n\n case 'discriminated_union':\n if (def.options) {\n return def.options.map((opt) => inferZodType(opt)).join(' | ');\n }\n return 'union';\n\n case 'intersection':\n return 'object';\n\n case 'lazy':\n if (def.getter) {\n return inferZodType(def.getter());\n }\n return 'lazy';\n\n case 'any':\n case 'unknown':\n case 'never':\n case 'void':\n return def.type;\n\n case 'record':\n return 'Record<string, unknown>';\n\n case 'map':\n return 'Map<unknown, unknown>';\n\n case 'set':\n return 'Set<unknown>';\n\n case 'tuple':\n return 'tuple';\n\n default:\n return def.type || 'unknown';\n }\n}\n\n/**\n * Convert string to title case.\n */\nexport function toTitleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Convert string to URL-safe slug.\n */\nexport function toSlug(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n","import fs from 'fs';\nimport path from 'path';\nimport YAML from 'js-yaml';\nimport { loadZodSchemas } from './schema-loader';\nimport type { EntityInfo, FieldInfo, ListEntitiesResult, ListEntitiesOptions } from './types';\n\n/**\n * Discover available entities from Zod schemas or OpenAPI spec.\n *\n * Priority:\n * 1. schemaPath (explicit Zod schemas)\n * 2. specPath (explicit OpenAPI spec)\n * 3. Auto-detect (look for compiled schemas or OpenAPI spec)\n *\n * Pure function: same inputs → same outputs, no side effects.\n */\nexport function listEntities(options: ListEntitiesOptions = {}): ListEntitiesResult {\n const { specPath, schemaPath, projectRoot } = options;\n\n // Priority: schemaPath (Zod) > specPath (OpenAPI) > auto-detect\n if (schemaPath) {\n return listFromZodSchemas(schemaPath);\n }\n\n if (specPath) {\n return listFromOpenAPISpec(specPath);\n }\n\n // Auto-detect: look for compiled schemas or OpenAPI spec\n const root = projectRoot || process.cwd();\n const generatedDir = path.join(root, 'src', 'generated');\n\n // Try Zod schemas first (in generated directory)\n if (fs.existsSync(generatedDir)) {\n const schemaFiles = findSchemaFiles(generatedDir);\n\n for (const file of schemaFiles) {\n const result = loadZodSchemas(file);\n if (result.entities.length > 0) {\n return {\n success: true,\n entities: result.entities,\n errors: result.errors.length > 0 ? result.errors : undefined,\n };\n }\n }\n }\n\n // Try compiled dist files\n const distDir = path.join(root, 'dist');\n if (fs.existsSync(distDir)) {\n const schemaFiles = findCompiledSchemaFiles(distDir);\n\n for (const file of schemaFiles) {\n const result = loadZodSchemas(file);\n if (result.entities.length > 0) {\n return {\n success: true,\n entities: result.entities,\n errors: result.errors.length > 0 ? result.errors : undefined,\n };\n }\n }\n }\n\n // Try OpenAPI spec\n const specCandidates = [\n path.join(root, 'api.yaml'),\n path.join(root, 'api.yml'),\n path.join(root, 'openapi.yaml'),\n path.join(root, 'openapi.yml'),\n path.join(root, 'spec.yaml'),\n path.join(root, 'spec.yml'),\n ];\n\n for (const specFile of specCandidates) {\n if (fs.existsSync(specFile)) {\n return listFromOpenAPISpec(specFile);\n }\n }\n\n return {\n success: false,\n entities: [],\n errors: [\n 'No schema or spec found.',\n 'Options:',\n ' 1. Provide --schema-path to load compiled Zod schemas',\n ' 2. Provide --spec-path to parse an OpenAPI spec',\n ' 3. Ensure schemas are in src/generated/ or dist/',\n ],\n };\n}\n\n/**\n * Load entities from compiled Zod schema module.\n */\nfunction listFromZodSchemas(schemaPath: string): ListEntitiesResult {\n const { entities, errors } = loadZodSchemas(schemaPath);\n\n return {\n success: errors.length === 0,\n entities,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\n/**\n * List entities from an OpenAPI spec file.\n *\n * Strategy: Iterate through paths, not schemas.\n * Schemas often don't map to paths (especially for request/response models).\n */\nfunction listFromOpenAPISpec(specPath: string): ListEntitiesResult {\n const errors: string[] = [];\n\n try {\n if (!fs.existsSync(specPath)) {\n return {\n success: false,\n entities: [],\n errors: [`Spec file not found: ${specPath}`],\n };\n }\n\n const content = fs.readFileSync(specPath, 'utf8');\n const spec = YAML.load(content) as Record<string, unknown>;\n\n const paths = (spec.paths as Record<string, Record<string, unknown>>) || {};\n const schemas =\n ((spec.components as Record<string, unknown>)?.schemas as Record<string, unknown>) || {};\n\n const entities: EntityInfo[] = [];\n const seenPaths = new Set<string>();\n\n // Iterate through paths to find entity-like endpoints\n for (const [pathStr, pathItem] of Object.entries(paths)) {\n // Skip paths we've already processed\n if (seenPaths.has(pathStr)) continue;\n\n // Get the GET operation (usually the \"list\" or \"get\" endpoint)\n const getOp = pathItem.get as Record<string, unknown> | undefined;\n const postOp = pathItem.post as Record<string, unknown> | undefined;\n\n // Skip admin/internal paths\n if (isInternalPath(pathStr)) {\n continue;\n }\n\n // Extract entity name from path\n const entityName = extractEntityNameFromPath(pathStr);\n const slug = toSlug(entityName);\n\n // Find the response schema for this endpoint\n let responseSchema: Record<string, unknown> | null = null;\n let fields: FieldInfo[] = [];\n\n // Try GET response first, then POST\n const operation = getOp || postOp;\n if (operation) {\n const responses = operation.responses as Record<string, unknown> | undefined;\n if (responses) {\n const successResponse = responses['200'] || responses['201'] || responses['default'];\n if (successResponse) {\n const content = (successResponse as Record<string, unknown>).content as\n | Record<string, unknown>\n | undefined;\n if (content) {\n const json = content['application/json'] as Record<string, unknown> | undefined;\n if (json) {\n const schemaOrRef = (json.schema || json) as Record<string, unknown>;\n if (schemaOrRef.$ref) {\n // It's a reference to a component schema\n const refName = extractSchemaName(schemaOrRef.$ref as string);\n const foundSchema = schemas[refName] as Record<string, unknown> | undefined;\n if (foundSchema) responseSchema = foundSchema;\n } else if (\n schemaOrRef.type === 'array' &&\n (schemaOrRef.items as Record<string, unknown>)?.$ref\n ) {\n // Array response - get item schema\n const refName = extractSchemaName(\n (schemaOrRef.items as Record<string, unknown>).$ref as string\n );\n const foundSchema = schemas[refName] as Record<string, unknown> | undefined;\n if (foundSchema) responseSchema = foundSchema;\n } else {\n responseSchema = schemaOrRef;\n }\n }\n }\n }\n }\n }\n\n if (responseSchema) {\n const properties = (responseSchema.properties as Record<string, unknown>) || {};\n fields = Object.entries(properties).map(([fieldName, fieldDef]) => ({\n name: fieldName,\n type: inferOpenAPIType(fieldDef),\n required: isRequired(fieldName, responseSchema!),\n description: (fieldDef as Record<string, unknown>)?.description as string,\n }));\n }\n\n entities.push({\n name: toTitleCase(entityName),\n slug,\n endpoint: pathStr,\n fieldCount: fields.length,\n fields,\n sourceFile: specPath,\n });\n\n seenPaths.add(pathStr);\n }\n\n return {\n success: true,\n entities,\n errors: errors.length > 0 ? errors : undefined,\n };\n } catch (err) {\n return {\n success: false,\n entities: [],\n errors: [`Failed to parse OpenAPI spec: ${String(err)}`],\n };\n }\n}\n\n/**\n * Extract entity name from API path.\n *\n * /accounts → \"Accounts\"\n * /accounts/{id} → \"Account\"\n * /transactions/get → \"Transactions\"\n * /network/status → \"Network Status\"\n */\nfunction extractEntityNameFromPath(pathStr: string): string {\n // Remove leading slash\n let path = pathStr.replace(/^\\//, '');\n\n // Remove path parameters\n path = path.replace(/\\{[^}]+\\}/g, '');\n\n // Split by slash and take the first meaningful segment(s)\n const segments = path.split('/').filter((s) => s.length > 0);\n\n if (segments.length === 0) return 'Root';\n if (segments.length === 1) return segments[0];\n\n // For paths like /transactions/get, prefer the first segment (resource name)\n // /resource/id patterns also use first segment\n const first = segments[0];\n const second = segments[1];\n\n // If second segment is all lowercase letters, it's likely a verb/action - use first\n if (second && /^[a-z]+$/i.test(second)) {\n return first;\n }\n\n // Otherwise combine the segments for compound paths\n return `${first} ${second || ''}`.trim();\n}\n\n/**\n * Check if a path is internal/admin (should be filtered).\n */\nfunction isInternalPath(pathStr: string): boolean {\n const internalPrefixes = [\n '/admin',\n '/internal',\n '/debug',\n '/health',\n '/metrics',\n '/webhook',\n '/oauth',\n '/token',\n '/auth',\n ];\n\n const lower = pathStr.toLowerCase();\n return internalPrefixes.some((prefix) => lower.startsWith(prefix));\n}\n\n/**\n * Extract schema name from $ref.\n *\n * \"#/components/schemas/Equipment\" → \"Equipment\"\n */\nfunction extractSchemaName(ref: string): string {\n const parts = ref.split('/');\n return parts[parts.length - 1];\n}\n\n/**\n * Find TypeScript/JavaScript files that might contain Zod schemas.\n */\nfunction findSchemaFiles(dir: string, depth = 0): string[] {\n const files: string[] = [];\n\n if (!fs.existsSync(dir) || depth > 3) return files;\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n files.push(...findSchemaFiles(fullPath, depth + 1));\n } else if (entry.name.match(/\\.(js|ts|mjs|cjs)$/)) {\n // Skip test files\n if (!entry.name.match(/\\.(test|spec)\\.(js|ts)$/)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\n/**\n * Find compiled schema files in dist directory.\n */\nfunction findCompiledSchemaFiles(dir: string): string[] {\n const files: string[] = [];\n\n if (!fs.existsSync(dir)) return files;\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n files.push(...findCompiledSchemaFiles(fullPath));\n } else if (entry.name.match(/\\.(js|mjs|cjs)$/) && !entry.name.match(/^[A-Z]/)) {\n // Lowercase files often contain schema exports\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n/**\n * Infer type from OpenAPI field definition.\n */\nfunction inferOpenAPIType(fieldDef: unknown): string {\n if (typeof fieldDef !== 'object' || fieldDef === null) return 'unknown';\n\n const def = fieldDef as Record<string, unknown>;\n\n if (def.type) return String(def.type);\n if (def.$ref) return 'ref';\n if (def.oneOf || def.anyOf) return 'union';\n if (def.allOf) return 'intersection';\n\n return 'unknown';\n}\n\n/**\n * Check if a field is required in the schema.\n */\nfunction isRequired(fieldName: string, schema: Record<string, unknown>): boolean {\n const required = schema.required as string[] | undefined;\n return required ? required.includes(fieldName) : false;\n}\n\n/**\n * Convert string to title case.\n */\nexport function toTitleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Convert string to URL-safe slug.\n * Handles common English plural patterns to match OpenAPI conventions.\n *\n * Examples:\n * \"Supply\" → \"supplies\" (matches /supplies endpoint)\n * \"Equipment\" → \"equipment\" (matches /equipment endpoint)\n * \"Personnel\" → \"personnel\" (matches /personnel endpoint)\n */\nexport function toSlug(str: string): string {\n // First apply standard camelCase splitting\n let slug = str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n\n // Handle common irregular/special plurals that match OpenAPI conventions\n // \"supply\" → \"supplies\" (not \"supply\")\n if (slug === 'supply') {\n return 'supplies';\n }\n // \"category\" → \"categories\"\n if (slug === 'category') {\n return 'categories';\n }\n // \"history\" → \"histories\"\n if (slug === 'history') {\n return 'histories';\n }\n\n // Standard English pluralization: words ending in 'y' → 'ies'\n // But only for common API resource names, not acronyms or special cases\n // This is a simple heuristic - may need refinement\n\n return slug;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport YAML from 'js-yaml';\nimport type { EndpointFilter, GenerateFilterResult, GenerateFilterOptions } from './types';\nimport { listEntities } from './list-entities';\n\n/**\n * Generates endpoint filter configuration from selected entities.\n *\n * Pure function: same inputs → same outputs.\n *\n * Logic:\n * 1. For each selected entity, include: /entity and /entity/{id}\n * 2. Apply default exclusions (admin, reports, delete)\n * 3. Return filter config\n */\nexport function generateFilter(options: GenerateFilterOptions): GenerateFilterResult {\n const warnings: string[] = [];\n\n // Get entity list to validate selections\n const listResult = listEntities({\n specPath: options.specPath,\n projectRoot: options.projectRoot,\n });\n\n if (!listResult.success) {\n return {\n success: false,\n filter: { include: [], exclude: [] },\n warnings: listResult.errors ?? [],\n };\n }\n\n // Default exclusions\n const defaultExcludes = ['/admin/*', '/reports/*', '/*/delete', '/audit/*'];\n\n // Build include list from selected entities\n const include: string[] = [];\n const unknownEntities: string[] = [];\n\n for (const entitySlug of options.selectedEntities) {\n // Find entity in list - try multiple matching strategies\n const normalizedInput = entitySlug.toLowerCase();\n const entity = listResult.entities.find((e) => {\n // Match by slug\n if (e.slug === normalizedInput) return true;\n // Match by name\n if (e.name.toLowerCase() === normalizedInput) return true;\n // Match by endpoint path (handles /equipment, equipment, /equipment/{id})\n const normalizedEndpoint = e.endpoint.replace(/\\/$/, '').replace(/\\/\\{.*\\}$/, '');\n if (normalizedEndpoint.replace(/^\\//, '') === normalizedInput) return true;\n if (normalizedEndpoint === '/' + normalizedInput) return true;\n return false;\n });\n\n if (!entity) {\n unknownEntities.push(entitySlug);\n continue;\n }\n\n // Add list endpoint\n include.push(entity.endpoint);\n\n // Add single-item endpoint\n const singleEndpoint = entity.endpoint.endsWith('/')\n ? `${entity.endpoint}{id}`\n : `${entity.endpoint}/{id}`;\n include.push(singleEndpoint);\n }\n\n // Warn about unknown entities\n if (unknownEntities.length > 0) {\n warnings.push(\n `Unknown entities: ${unknownEntities.join(', ')}. Available: ${listResult.entities.map((e) => e.slug).join(', ')}`\n );\n }\n\n // Build exclude list\n const exclude = [...defaultExcludes, ...(options.excludePatterns || [])];\n\n // Write to stackwright.yml if output path provided\n if (options.outputPath) {\n const projectRoot = options.projectRoot || process.cwd();\n const outputFullPath = path.isAbsolute(options.outputPath)\n ? options.outputPath\n : path.join(projectRoot, options.outputPath);\n\n const config = {\n integrations: [\n {\n type: 'openapi',\n endpoints: {\n include,\n exclude,\n },\n },\n ],\n };\n\n fs.writeFileSync(outputFullPath, YAML.dump(config, { lineWidth: 120 }), 'utf8');\n }\n\n return {\n success: true,\n filter: { include, exclude },\n warnings: warnings.length > 0 ? warnings : undefined,\n outputPath: options.outputPath,\n };\n}\n\n/**\n * Discover entities from an OpenAPI spec and generate filter.\n * Single function for the common workflow.\n */\nexport function discoverAndFilter(options: {\n specPath: string;\n selectedEntities: string[];\n excludePatterns?: string[];\n outputPath?: string;\n projectRoot?: string;\n}): GenerateFilterResult {\n const listResult = listEntities({\n specPath: options.specPath,\n projectRoot: options.projectRoot,\n });\n\n if (!listResult.success) {\n return {\n success: false,\n filter: { include: [], exclude: [] },\n warnings: listResult.errors,\n };\n }\n\n return generateFilter({\n specPath: options.specPath,\n selectedEntities: options.selectedEntities,\n excludePatterns: options.excludePatterns,\n outputPath: options.outputPath,\n projectRoot: options.projectRoot,\n });\n}\n","import chalk from 'chalk';\nimport { listEntities } from './list-entities';\nimport { generateFilter, discoverAndFilter } from './generate-filter';\nimport type { PluginRegistrar } from './types';\n\n// Re-export types for consumers\nexport type { EntityInfo, FieldInfo, ListEntitiesResult, ListEntitiesOptions } from './types';\nexport type { EndpointFilter, GenerateFilterResult, GenerateFilterOptions } from './types';\n\n// Re-export pure functions for programmatic use\nexport { listEntities } from './list-entities';\nexport { generateFilter, discoverAndFilter } from './generate-filter';\n\n/**\n * CLI plugin registration.\n * Called by the OSS CLI when this package is installed.\n *\n * Usage in OSS CLI:\n * ```ts\n * // In cli-plugin-loader.ts\n * import { registerCommands } from '@stackwright-pro/cli-data-explorer';\n * registerCommands(program);\n * ```\n */\nexport const registerCommands: PluginRegistrar = (program) => {\n // Create a mock Command interface that works with basic commander patterns\n // The actual integration point depends on the OSS CLI's command structure\n\n const dataExplorerCmd = {\n command: (name?: string) => {\n if (name) {\n console.log(`Creating subcommand: ${name}`);\n }\n return dataExplorerCmd;\n },\n description: (text: string) => {\n console.log(`Setting description: ${text}`);\n return dataExplorerCmd;\n },\n option: (flags: string, description?: string) => {\n return dataExplorerCmd;\n },\n requiredOption: (flags: string, description?: string) => {\n return dataExplorerCmd;\n },\n action: (handler: (options: Record<string, unknown>) => void | Promise<void>) => {\n return dataExplorerCmd;\n },\n hook: (event: string, handler: () => void | Promise<void>) => {\n if (event === 'preAction') {\n // Execute the hook immediately when setting it up\n handler();\n }\n return dataExplorerCmd;\n },\n addHelpText: (position: string, text: string) => {\n return dataExplorerCmd;\n },\n };\n\n // Ensure @stackwright-pro/openapi is available\n try {\n require('@stackwright-pro/openapi');\n } catch {\n console.error(chalk.red('Error: @stackwright-pro/openapi is required for data-explorer.'));\n console.error(chalk.blue('Install it with: pnpm add @stackwright-pro/openapi'));\n process.exit(1);\n }\n\n // For now, create a simple command structure that can be detected\n // In a real integration, this would use the actual Commander program\n const cmd = program.command?.('data-explorer') || dataExplorerCmd;\n\n // This function handles the 'list' subcommand\n const handleList = (opts: { spec?: string; schema?: string; json?: boolean }) => {\n const result = listEntities({\n specPath: opts.spec,\n schemaPath: opts.schema,\n projectRoot: process.cwd(),\n });\n\n if (!result.success) {\n console.error(chalk.red('Failed to list entities:'));\n result.errors?.forEach((e) => console.error(` ${e}`));\n process.exit(1);\n }\n\n if (result.entities.length === 0) {\n console.log(chalk.yellow('\\nNo entities found.'));\n console.log(chalk.blue(' Options:'));\n console.log(chalk.blue(' --schema <path> Load compiled Zod schemas'));\n console.log(chalk.blue(' --spec <path> Parse OpenAPI spec'));\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\n📦 Available Entities:\\n'));\n\n for (const entity of result.entities) {\n console.log(` ${chalk.cyan(entity.name)} (${entity.slug})`);\n console.log(` Endpoint: ${entity.endpoint}`);\n console.log(` Fields: ${entity.fieldCount}`);\n\n // Show first 3 fields\n for (const field of entity.fields.slice(0, 3)) {\n const required = field.required ? '' : '?';\n console.log(` - ${field.name}${required}: ${field.type}`);\n }\n\n if (entity.fields.length > 3) {\n console.log(` ... and ${entity.fields.length - 3} more`);\n }\n console.log();\n }\n\n console.log(chalk.dim(`\\nTotal: ${result.entities.length} entities\\n`));\n };\n\n // This function handles the 'filter' subcommand\n const handleFilter = (opts: {\n entities: string;\n exclude?: string;\n output?: string;\n json?: boolean;\n }) => {\n const entities = opts.entities.split(',').map((e) => e.trim());\n\n const result = generateFilter({\n selectedEntities: entities,\n excludePatterns: opts.exclude?.split(',').map((e) => e.trim()),\n outputPath: opts.output || './stackwright.yml',\n projectRoot: process.cwd(),\n });\n\n if (!result.success) {\n console.error(chalk.red('Failed to generate filter:'));\n result.warnings?.forEach((w) => console.error(` ${w}`));\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\n🔐 Generated Endpoint Filter:\\n'));\n\n console.log(' Include:');\n for (const path of result.filter.include) {\n console.log(` ${chalk.green('✅')} ${path}`);\n }\n console.log();\n\n console.log(' Exclude:');\n for (const pattern of result.filter.exclude) {\n console.log(` ${chalk.red('❌')} ${pattern}`);\n }\n console.log();\n\n if (result.warnings && result.warnings.length > 0) {\n console.log(chalk.yellow(' Warnings:'));\n for (const warning of result.warnings) {\n console.log(` ${chalk.yellow('⚠️')} ${warning}`);\n }\n console.log();\n }\n\n if (result.outputPath) {\n console.log(chalk.green(`\\n📝 Written to: ${result.outputPath}\\n`));\n }\n };\n\n // Export handlers for integration with real CLI\n return {\n dataExplorer: dataExplorerCmd,\n handleList,\n handleFilter,\n };\n};\n\n// Default export for convenience\nexport default registerCommands;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/schema-loader.ts","../src/list-entities.ts","../src/generate-filter.ts","../src/index.ts"],"names":["require","fs","toSlug","content","toTitleCase","path","result","YAML"],"mappings":";;;;;;;;;;;;AAIA,IAAMA,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AA0DtC,SAAS,eAAe,UAAA,EAA0C;AACvE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,WAAyB,EAAC;AAEhC,EAAA,IAAI;AAEF,IAAA,IAAI,CAACC,GAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,MAAA,OAAO;AAAA,QACL,UAAU,EAAC;AAAA,QACX,MAAA,EAAQ,CAAC,CAAA,uBAAA,EAA0B,UAAU,CAAA,CAAE;AAAA,OACjD;AAAA,IACF;AAGA,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI;AACF,MAAA,YAAA,GAAeD,SAAQ,UAAU,CAAA;AAAA,IACnC,SAAS,CAAA,EAAG;AACV,MAAA,OAAO;AAAA,QACL,UAAU,EAAC;AAAA,QACX,MAAA,EAAQ;AAAA,UACN,iCAAiC,UAAU,CAAA,CAAA;AAAA,UAC3C,mDAAA;AAAA,UACA,OAAO,CAAC;AAAA;AACV,OACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AAE3D,MAAA,IAAI,CAAC,WAAA,CAAY,QAAQ,CAAA,EAAG;AAE5B,MAAA,MAAM,MAAA,GAAS,QAAA;AAGf,MAAA,IAAI,MAAA,CAAO,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU;AAGlC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAG9C,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,EAAC;AAGnC,MAAA,MAAM,MAAA,GAAsB,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,SAAA,EAAW,WAAW,CAAA,KAAM;AAClF,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,aAAa,WAAwB,CAAA;AAAA,UAC3C,QAAA,EAAU,CAAC,UAAA,CAAW,WAAwB,CAAA;AAAA,UAC9C,WAAA,EAAc,YAA0B,GAAA,CAAI;AAAA,SAC9C;AAAA,MACF,CAAC,CAAA;AAED,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,YAAY,UAAU,CAAA;AAAA,QAC5B,IAAA,EAAM,OAAO,UAAU,CAAA;AAAA,QACvB,QAAA,EAAU,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA;AAAA,QAChC,YAAY,MAAA,CAAO,MAAA;AAAA,QACnB,MAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,EAAE,UAAU,MAAA,EAAO;AAAA,EAC5B,SAAS,CAAA,EAAG;AACV,IAAA,OAAO;AAAA,MACL,UAAU,EAAC;AAAA,MACX,MAAA,EAAQ,CAAC,MAAA,CAAO,CAAC,CAAC;AAAA,KACpB;AAAA,EACF;AACF;AAKO,SAAS,YAAY,GAAA,EAAuB;AACjD,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,KAAA,IAAS,GAAA;AAC7D;AAKO,SAAS,WAAW,MAAA,EAA4B;AACrD,EAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AAGnB,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,UAAA,EAAY,OAAO,IAAA;AAGpC,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,UAAA,CAAW,QAAQ,CAAA;AAAA,IAC5B;AAAA,EACF;AAGA,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,OAAO,UAAA,CAAW,IAAI,SAAS,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,aAAa,MAAA,EAA2B;AACtD,EAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AAEnB,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IAET,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IAET,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA,IAET,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IAET,KAAK,MAAA;AACH,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,OAAO,OAAO,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,MAC5C;AACA,MAAA,IAAI,IAAI,MAAA,EAAQ;AACd,QAAA,OAAO,IAAI,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,MAC1C;AACA,MAAA,OAAO,MAAA;AAAA,IAET,KAAK,SAAA;AACH,MAAA,IAAI,GAAA,CAAI,UAAU,MAAA,EAAW;AAC3B,QAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAAA,MACjC;AACA,MAAA,IAAI,IAAI,MAAA,EAAQ;AACd,QAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,MAC5D;AACA,MAAA,OAAO,SAAA;AAAA,IAET,KAAK,OAAA;AACH,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,OAAO,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,OAAO,CAAC,CAAA,EAAA,CAAA;AAAA,MACrC;AACA,MAAA,OAAO,OAAA;AAAA,IAET,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IAET,KAAK,UAAA;AACH,MAAA,IAAI,IAAI,SAAA,EAAW;AACjB,QAAA,OAAO,YAAA,CAAa,IAAI,SAAS,CAAA;AAAA,MACnC;AACA,MAAA,OAAO,UAAA;AAAA,IAET,KAAK,UAAA;AACH,MAAA,IAAI,IAAI,SAAA,EAAW;AACjB,QAAA,OAAO,CAAA,EAAG,YAAA,CAAa,GAAA,CAAI,SAAS,CAAC,CAAA,OAAA,CAAA;AAAA,MACvC;AACA,MAAA,OAAO,UAAA;AAAA,IAET,KAAK,OAAA;AACH,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,aAAa,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,MAC/D;AACA,MAAA,OAAO,OAAA;AAAA,IAET,KAAK,qBAAA;AACH,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,aAAa,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,MAC/D;AACA,MAAA,OAAO,OAAA;AAAA,IAET,KAAK,cAAA;AACH,MAAA,OAAO,QAAA;AAAA,IAET,KAAK,MAAA;AACH,MAAA,IAAI,IAAI,MAAA,EAAQ;AACd,QAAA,OAAO,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,CAAA;AAAA,MAClC;AACA,MAAA,OAAO,MAAA;AAAA,IAET,KAAK,KAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,GAAA,CAAI,IAAA;AAAA,IAEb,KAAK,QAAA;AACH,MAAA,OAAO,yBAAA;AAAA,IAET,KAAK,KAAA;AACH,MAAA,OAAO,uBAAA;AAAA,IAET,KAAK,KAAA;AACH,MAAA,OAAO,cAAA;AAAA,IAET,KAAK,OAAA;AACH,MAAA,OAAO,OAAA;AAAA,IAET;AACE,MAAA,OAAO,IAAI,IAAA,IAAQ,SAAA;AAAA;AAEzB;AAKO,SAAS,YAAY,GAAA,EAAqB;AAC/C,EAAA,OAAO,GAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,GAAG,EACjB,OAAA,CAAQ,iBAAA,EAAmB,OAAO,CAAA,CAClC,QAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AAC5C;AAKO,SAAS,OAAO,GAAA,EAAqB;AAC1C,EAAA,OAAO,GAAA,CACJ,QAAQ,iBAAA,EAAmB,OAAO,EAClC,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CACtB,WAAA,EAAY;AACjB;;;ACjRO,SAAS,YAAA,CAAa,OAAA,GAA+B,EAAC,EAAuB;AAClF,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,WAAA,EAAY,GAAI,OAAA;AAG9C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,mBAAmB,UAAU,CAAA;AAAA,EACtC;AAEA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,oBAAoB,QAAQ,CAAA;AAAA,EACrC;AAGA,EAAA,MAAM,IAAA,GAAO,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAI;AACxC,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,OAAO,WAAW,CAAA;AAGvD,EAAA,IAAIC,GAAAA,CAAG,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,IAAA,MAAM,WAAA,GAAc,gBAAgB,YAAY,CAAA;AAEhD,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAClC,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAE9B,QAAA,MAAM,YAAA,GAAmC;AAAA,UACvC,OAAA,EAAS,IAAA;AAAA,UACT,UAAU,MAAA,CAAO;AAAA,SACnB;AACA,QAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC5B,UAAA,YAAA,CAAa,SAAS,MAAA,CAAO,MAAA;AAAA,QAC/B;AACA,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AACtC,EAAA,IAAIA,GAAAA,CAAG,UAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,IAAA,MAAM,WAAA,GAAc,wBAAwB,OAAO,CAAA;AAEnD,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAClC,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAE9B,QAAA,MAAM,YAAA,GAAmC;AAAA,UACvC,OAAA,EAAS,IAAA;AAAA,UACT,UAAU,MAAA,CAAO;AAAA,SACnB;AACA,QAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC5B,UAAA,YAAA,CAAa,SAAS,MAAA,CAAO,MAAA;AAAA,QAC/B;AACA,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,UAAU,CAAA;AAAA,IAC1B,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AAAA,IACzB,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,cAAc,CAAA;AAAA,IAC9B,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,aAAa,CAAA;AAAA,IAC7B,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA;AAAA,IAC3B,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,UAAU;AAAA,GAC5B;AAEA,EAAA,KAAA,MAAW,YAAY,cAAA,EAAgB;AACrC,IAAA,IAAIA,GAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,MAAA,OAAO,oBAAoB,QAAQ,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,UAAU,EAAC;AAAA,IACX,MAAA,EAAQ;AAAA,MACN,0BAAA;AAAA,MACA,UAAA;AAAA,MACA,yDAAA;AAAA,MACA,mDAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;AAKA,SAAS,mBAAmB,UAAA,EAAwC;AAClE,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,eAAe,UAAU,CAAA;AAGtD,EAAA,MAAM,YAAA,GAAmC;AAAA,IACvC,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B;AAAA,GACF;AACA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,YAAA,CAAa,MAAA,GAAS,MAAA;AAAA,EACxB;AACA,EAAA,OAAO,YAAA;AACT;AAQA,SAAS,oBAAoB,QAAA,EAAsC;AACjE,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI;AACF,IAAA,IAAI,CAACA,GAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,UAAU,EAAC;AAAA,QACX,MAAA,EAAQ,CAAC,CAAA,qBAAA,EAAwB,QAAQ,CAAA,CAAE;AAAA,OAC7C;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAUA,GAAAA,CAAG,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAChD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAE9B,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,KAAA,IAAqD,EAAC;AAC1E,IAAA,MAAM,OAAA,GACF,IAAA,CAAK,UAAA,EAAwC,OAAA,IAAuC,EAAC;AAEzF,IAAA,MAAM,WAAyB,EAAC;AAChC,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAGlC,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAEvD,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG;AAG5B,MAAA,MAAM,QAAQ,QAAA,CAAS,GAAA;AACvB,MAAA,MAAM,SAAS,QAAA,CAAS,IAAA;AAGxB,MAAA,IAAI,cAAA,CAAe,OAAO,CAAA,EAAG;AAC3B,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,UAAA,GAAa,0BAA0B,OAAO,CAAA;AACpD,MAAA,MAAM,IAAA,GAAOC,QAAO,UAAU,CAAA;AAG9B,MAAA,IAAI,cAAA,GAAiD,IAAA;AACrD,MAAA,IAAI,SAAsB,EAAC;AAG3B,MAAA,MAAM,YAAY,KAAA,IAAS,MAAA;AAC3B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,YAAY,SAAA,CAAU,SAAA;AAC5B,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,eAAA,GAAkB,UAAU,KAAK,CAAA,IAAK,UAAU,KAAK,CAAA,IAAK,UAAU,SAAS,CAAA;AACnF,UAAA,IAAI,eAAA,EAAiB;AACnB,YAAA,MAAMC,WAAW,eAAA,CAA4C,OAAA;AAG7D,YAAA,IAAIA,QAAAA,EAAS;AACX,cAAA,MAAM,IAAA,GAAOA,SAAQ,kBAAkB,CAAA;AACvC,cAAA,IAAI,IAAA,EAAM;AACR,gBAAA,MAAM,WAAA,GAAe,KAAK,MAAA,IAAU,IAAA;AACpC,gBAAA,IAAI,YAAY,IAAA,EAAM;AAEpB,kBAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,WAAA,CAAY,IAAc,CAAA;AAC5D,kBAAA,MAAM,WAAA,GAAc,QAAQ,OAAO,CAAA;AACnC,kBAAA,IAAI,aAAa,cAAA,GAAiB,WAAA;AAAA,gBACpC,WACE,WAAA,CAAY,IAAA,KAAS,OAAA,IACpB,WAAA,CAAY,OAAmC,IAAA,EAChD;AAEA,kBAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,oBACb,YAAY,KAAA,CAAkC;AAAA,mBACjD;AACA,kBAAA,MAAM,WAAA,GAAc,QAAQ,OAAO,CAAA;AACnC,kBAAA,IAAI,aAAa,cAAA,GAAiB,WAAA;AAAA,gBACpC,CAAA,MAAO;AACL,kBAAA,cAAA,GAAiB,WAAA;AAAA,gBACnB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAM,UAAA,GAAc,cAAA,CAAe,UAAA,IAA0C,EAAC;AAC9E,QAAA,MAAA,GAAS,MAAA,CAAO,QAAQ,UAAU,CAAA,CAAE,IAAI,CAAC,CAAC,SAAA,EAAW,QAAQ,CAAA,MAAO;AAAA,UAClE,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,iBAAiB,QAAQ,CAAA;AAAA,UAC/B,QAAA,EAAU,UAAA,CAAW,SAAA,EAAW,cAAe,CAAA;AAAA,UAC/C,aAAc,QAAA,EAAsC;AAAA,SACtD,CAAE,CAAA;AAAA,MACJ;AAEA,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAMC,aAAY,UAAU,CAAA;AAAA,QAC5B,IAAA;AAAA,QACA,QAAA,EAAU,OAAA;AAAA,QACV,YAAY,MAAA,CAAO,MAAA;AAAA,QACnB,MAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACb,CAAA;AAED,MAAA,SAAA,CAAU,IAAI,OAAO,CAAA;AAAA,IACvB;AAGA,IAAA,MAAM,YAAA,GAAmC;AAAA,MACvC,OAAA,EAAS,IAAA;AAAA,MACT;AAAA,KACF;AACA,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,YAAA,CAAa,MAAA,GAAS,MAAA;AAAA,IACxB;AACA,IAAA,OAAO,YAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,UAAU,EAAC;AAAA,MACX,QAAQ,CAAC,CAAA,8BAAA,EAAiC,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE;AAAA,KACzD;AAAA,EACF;AACF;AAUA,SAAS,0BAA0B,OAAA,EAAyB;AAE1D,EAAA,IAAIC,KAAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAGpC,EAAAA,KAAAA,GAAOA,KAAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAGpC,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAE3D,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAClC,EAAA,IAAI,SAAS,MAAA,KAAW,CAAA,EAAG,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,MAAA;AAIjD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,CAAC,CAAA,IAAK,MAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,SAAS,CAAC,CAAA;AAGzB,EAAA,IAAI,MAAA,IAAU,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA,EAAG;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,GAAG,KAAK,CAAA,CAAA,EAAI,MAAA,IAAU,EAAE,GAAG,IAAA,EAAK;AACzC;AAKA,SAAS,eAAe,OAAA,EAA0B;AAChD,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,QAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAClC,EAAA,OAAO,iBAAiB,IAAA,CAAK,CAAC,WAAW,KAAA,CAAM,UAAA,CAAW,MAAM,CAAC,CAAA;AACnE;AAOA,SAAS,kBAAkB,GAAA,EAAqB;AAC9C,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACvC,EAAA,OAAO,QAAA,IAAY,GAAA;AACrB;AAKA,SAAS,eAAA,CAAgB,GAAA,EAAa,KAAA,GAAQ,CAAA,EAAa;AACzD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,CAACJ,GAAAA,CAAG,UAAA,CAAW,GAAG,CAAA,IAAK,KAAA,GAAQ,GAAG,OAAO,KAAA;AAE7C,EAAA,KAAA,MAAW,KAAA,IAASA,IAAG,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,EAAG;AAChE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,MAAM,IAAI,CAAA;AAE1C,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,KAAA,CAAM,KAAK,GAAG,eAAA,CAAgB,QAAA,EAAU,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,IACpD,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,oBAAoB,CAAA,EAAG;AAEjD,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA,EAAG;AAChD,QAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,wBAAwB,GAAA,EAAuB;AACtD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,CAACA,GAAAA,CAAG,UAAA,CAAW,GAAG,GAAG,OAAO,KAAA;AAEhC,EAAA,KAAA,MAAW,KAAA,IAASA,IAAG,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,EAAG;AAChE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,MAAM,IAAI,CAAA;AAE1C,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,uBAAA,CAAwB,QAAQ,CAAC,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,iBAAiB,CAAA,IAAK,CAAC,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAG;AAE7E,MAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,iBAAiB,QAAA,EAA2B;AACnD,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,MAAM,OAAO,SAAA;AAE9D,EAAA,MAAM,GAAA,GAAM,QAAA;AAEZ,EAAA,IAAI,GAAA,CAAI,IAAA,EAAM,OAAO,MAAA,CAAO,IAAI,IAAI,CAAA;AACpC,EAAA,IAAI,GAAA,CAAI,MAAM,OAAO,KAAA;AACrB,EAAA,IAAI,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,KAAA,EAAO,OAAO,OAAA;AACnC,EAAA,IAAI,GAAA,CAAI,OAAO,OAAO,cAAA;AAEtB,EAAA,OAAO,SAAA;AACT;AAKA,SAAS,UAAA,CAAW,WAAmB,MAAA,EAA0C;AAC/E,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,EAAA,OAAO,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,GAAI,KAAA;AACnD;AAKO,SAASG,aAAY,GAAA,EAAqB;AAC/C,EAAA,OAAO,GAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,GAAG,EACjB,OAAA,CAAQ,iBAAA,EAAmB,OAAO,CAAA,CAClC,QAAQ,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AAC5C;AAWO,SAASF,QAAO,GAAA,EAAqB;AAE1C,EAAA,MAAM,IAAA,GAAO,GAAA,CACV,OAAA,CAAQ,iBAAA,EAAmB,OAAO,EAClC,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CACtB,WAAA,EAAY;AAIf,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,OAAO,WAAA;AAAA,EACT;AAMA,EAAA,OAAO,IAAA;AACT;ACvZO,SAAS,eAAe,OAAA,EAAsD;AACnF,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,MAAM,cAAmC,EAAC;AAC1C,EAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,WAAA,CAAY,WAAW,OAAA,CAAQ,QAAA;AACnE,EAAA,IAAI,OAAA,CAAQ,WAAA,KAAgB,MAAA,EAAW,WAAA,CAAY,cAAc,OAAA,CAAQ,WAAA;AAEzE,EAAA,MAAM,UAAA,GAAa,aAAa,WAAW,CAAA;AAE3C,EAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,IAAA,MAAMI,OAAAA,GAA+B;AAAA,MACnC,OAAA,EAAS,KAAA;AAAA,MACT,QAAQ,EAAE,OAAA,EAAS,EAAC,EAAG,OAAA,EAAS,EAAC;AAAE,KACrC;AACA,IAAA,IAAI,UAAA,CAAW,WAAW,MAAA,EAAW;AACnC,MAAAA,OAAAA,CAAO,WAAW,UAAA,CAAW,MAAA;AAAA,IAC/B;AACA,IAAA,OAAOA,OAAAA;AAAA,EACT;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,UAAA,EAAY,YAAA,EAAc,aAAa,UAAU,CAAA;AAG1E,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,kBAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,UAAA,IAAc,QAAQ,gBAAA,EAAkB;AAEjD,IAAA,MAAM,eAAA,GAAkB,WAAW,WAAA,EAAY;AAC/C,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM;AAE7C,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,eAAA,EAAiB,OAAO,IAAA;AAEvC,MAAA,IAAI,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,KAAM,iBAAiB,OAAO,IAAA;AAErD,MAAA,MAAM,kBAAA,GAAqB,EAAE,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA;AAChF,MAAA,IAAI,mBAAmB,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,KAAM,iBAAiB,OAAO,IAAA;AACtE,MAAA,IAAI,kBAAA,KAAuB,GAAA,GAAM,eAAA,EAAiB,OAAO,IAAA;AACzD,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,eAAA,CAAgB,KAAK,UAAU,CAAA;AAC/B,MAAA;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,QAAQ,CAAA;AAG5B,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GAC/C,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,IAAA,CAAA,GAClB,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,KAAA,CAAA;AACtB,IAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAAA,EAC7B;AAGA,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,qBAAqB,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,gBAAgB,UAAA,CAAW,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAClH;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,eAAA,EAAiB,GAAI,OAAA,CAAQ,eAAA,IAAmB,EAAG,CAAA;AAGvE,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAI;AACvD,IAAA,MAAM,cAAA,GAAiBD,IAAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA,GACrD,OAAA,CAAQ,UAAA,GACRA,IAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,OAAA,CAAQ,UAAU,CAAA;AAE7C,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,YAAA,EAAc;AAAA,QACZ;AAAA,UACE,IAAA,EAAM,SAAA;AAAA,UACN,SAAA,EAAW;AAAA,YACT,OAAA;AAAA,YACA;AAAA;AACF;AACF;AACF,KACF;AAEA,IAAAJ,GAAAA,CAAG,aAAA,CAAc,cAAA,EAAgBM,IAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,EAAE,SAAA,EAAW,GAAA,EAAK,CAAA,EAAG,MAAM,CAAA;AAAA,EAChF;AAGA,EAAA,MAAM,MAAA,GAA+B;AAAA,IACnC,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,EAAE,OAAA,EAAS,OAAA;AAAQ,GAC7B;AACA,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAAA,EACpB;AACA,EAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAW;AACpC,IAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,UAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,kBAAkB,OAAA,EAMT;AAEvB,EAAA,MAAM,WAAA,GAAmC,EAAE,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAS;AACtE,EAAA,IAAI,OAAA,CAAQ,WAAA,KAAgB,MAAA,EAAW,WAAA,CAAY,cAAc,OAAA,CAAQ,WAAA;AAEzE,EAAA,MAAM,UAAA,GAAa,aAAa,WAAW,CAAA;AAE3C,EAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,IAAA,MAAM,MAAA,GAA+B;AAAA,MACnC,OAAA,EAAS,KAAA;AAAA,MACT,QAAQ,EAAE,OAAA,EAAS,EAAC,EAAG,OAAA,EAAS,EAAC;AAAE,KACrC;AACA,IAAA,IAAI,UAAA,CAAW,WAAW,MAAA,EAAW;AACnC,MAAA,MAAA,CAAO,WAAW,UAAA,CAAW,MAAA;AAAA,IAC/B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,aAAA,GAAuC;AAAA,IAC3C,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,kBAAkB,OAAA,CAAQ;AAAA,GAC5B;AACA,EAAA,IAAI,QAAQ,eAAA,KAAoB,MAAA;AAC9B,IAAA,aAAA,CAAc,kBAAkB,OAAA,CAAQ,eAAA;AAC1C,EAAA,IAAI,OAAA,CAAQ,UAAA,KAAe,MAAA,EAAW,aAAA,CAAc,aAAa,OAAA,CAAQ,UAAA;AACzE,EAAA,IAAI,OAAA,CAAQ,WAAA,KAAgB,MAAA,EAAW,aAAA,CAAc,cAAc,OAAA,CAAQ,WAAA;AAE3E,EAAA,OAAO,eAAe,aAAa,CAAA;AACrC;;;AC5IO,IAAM,gBAAA,GAAoC,CAAC,OAAA,KAAY;AAI5D,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,OAAA,EAAS,CAAC,IAAA,KAAkB;AAC1B,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AAAA,MAC5C;AACA,MAAA,OAAO,eAAA;AAAA,IACT,CAAA;AAAA,IACA,WAAA,EAAa,CAAC,IAAA,KAAiB;AAC7B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AAC1C,MAAA,OAAO,eAAA;AAAA,IACT,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,KAAA,EAAe,WAAA,KAAyB;AAC/C,MAAA,OAAO,eAAA;AAAA,IACT,CAAA;AAAA,IACA,cAAA,EAAgB,CAAC,KAAA,EAAe,WAAA,KAAyB;AACvD,MAAA,OAAO,eAAA;AAAA,IACT,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,OAAA,KAAwE;AAC/E,MAAA,OAAO,eAAA;AAAA,IACT,CAAA;AAAA,IACA,IAAA,EAAM,CAAC,KAAA,EAAe,OAAA,KAAwC;AAC5D,MAAA,IAAI,UAAU,WAAA,EAAa;AAEzB,QAAA,OAAA,EAAQ;AAAA,MACV;AACA,MAAA,OAAO,eAAA;AAAA,IACT,CAAA;AAAA,IACA,WAAA,EAAa,CAAC,QAAA,EAAkB,IAAA,KAAiB;AAC/C,MAAA,OAAO,eAAA;AAAA,IACT;AAAA,GACF;AAGA,EAAA,IAAI;AACF,IAAA,SAAA,CAAQ,0BAA0B,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,gEAAgE,CAAC,CAAA;AACzF,IAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,oDAAoD,CAAC,CAAA;AAC9E,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAIA,EAAY,OAAA,CAAQ,OAAA,GAAU,eAAe,CAAA,IAAK;AAGlD,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAA6D;AAG/E,IAAA,MAAM,OAAA,GAA+B,EAAE,WAAA,EAAa,OAAA,CAAQ,KAAI,EAAE;AAClE,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,WAAW,IAAA,CAAK,IAAA;AACrD,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,aAAa,IAAA,CAAK,MAAA;AAEzD,IAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AAEnC,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,0BAA0B,CAAC,CAAA;AACnD,MAAA,MAAA,CAAO,MAAA,EAAQ,QAAQ,CAAC,CAAA,KAAM,QAAQ,KAAA,CAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAC,CAAA;AACrD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,sBAAsB,CAAC,CAAA;AAChD,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AACpC,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,gDAAgD,CAAC,CAAA;AACxE,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,yCAAyC,CAAC,CAAA;AACjE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,mCAA4B,CAAC,CAAA;AAEpD,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,QAAA,EAAU;AACpC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAC3D,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA;AAC9C,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAG9C,MAAA,KAAA,MAAW,SAAS,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG;AAC7C,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,GAAW,EAAA,GAAK,GAAA;AACvC,QAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,KAAA,CAAM,IAAI,GAAG,QAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA,MAC/D;AAEA,MAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC5B,QAAA,OAAA,CAAQ,IAAI,CAAA,cAAA,EAAiB,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,MAC9D;AACA,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,GAAA,CAAI;AAAA,OAAA,EAAY,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,CAAa,CAAC,CAAA;AAAA,EACxE,CAAA;AAGA,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAKhB;AACJ,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAG7D,IAAA,MAAM,OAAA,GAAiC;AAAA,MACrC,gBAAA,EAAkB,QAAA;AAAA,MAClB,UAAA,EAAY,KAAK,MAAA,IAAU,mBAAA;AAAA,MAC3B,WAAA,EAAa,QAAQ,GAAA;AAAI,KAC3B;AACA,IAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAW;AAC9B,MAAA,OAAA,CAAQ,eAAA,GAAkB,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,IACvE;AAEA,IAAA,MAAM,MAAA,GAAS,eAAe,OAAO,CAAA;AAErC,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,4BAA4B,CAAC,CAAA;AACrD,MAAA,MAAA,CAAO,QAAA,EAAU,QAAQ,CAAC,CAAA,KAAM,QAAQ,KAAA,CAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAC,CAAA;AACvD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,0CAAmC,CAAC,CAAA;AAE3D,IAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AACxB,IAAA,KAAA,MAAWF,KAAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS;AACxC,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,KAAA,CAAM,KAAA,CAAM,QAAG,CAAC,CAAA,CAAA,EAAIA,KAAI,CAAA,CAAE,CAAA;AAAA,IAC/C;AACA,IAAA,OAAA,CAAQ,GAAA,EAAI;AAEZ,IAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AACxB,IAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS;AAC3C,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,KAAA,CAAM,GAAA,CAAI,QAAG,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,IAChD;AACA,IAAA,OAAA,CAAQ,GAAA,EAAI;AAEZ,IAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AACjD,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,aAAa,CAAC,CAAA;AACvC,MAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,QAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,KAAA,CAAM,MAAA,CAAO,cAAI,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,MACpD;AACA,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd;AAEA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,KAAA,CAAM;AAAA,sBAAA,EAAoB,OAAO,UAAU;AAAA,CAAI,CAAC,CAAA;AAAA,IACpE;AAAA,EACF,CAAA;AAGA,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,eAAA;AAAA,IACd,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAGA,IAAO,aAAA,GAAQ","file":"index.mjs","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Type for Zod schema objects (introspection via .def property).\n */\nexport interface ZodSchema {\n def: ZodDef;\n}\n\nexport interface ZodDef {\n type: string;\n innerType?: ZodSchema;\n shape?: Record<string, ZodSchema>;\n element?: ZodSchema;\n entries?: Record<string, unknown>;\n options?: ZodSchema[];\n getter?: () => ZodSchema;\n description?: string;\n values?: unknown[];\n value?: unknown;\n}\n\n/**\n * Field information extracted from Zod schema.\n */\nexport interface FieldInfo {\n name: string;\n type: string;\n required: boolean;\n description?: string;\n}\n\n/**\n * Entity information extracted from Zod schema.\n */\nexport interface EntityInfo {\n name: string;\n slug: string;\n endpoint: string;\n fieldCount: number;\n fields: FieldInfo[];\n sourceFile: string;\n}\n\n/**\n * Result of loading Zod schemas.\n */\nexport interface LoadZodSchemasResult {\n entities: EntityInfo[];\n errors: string[];\n}\n\n/**\n * Load and introspect Zod schemas from a compiled JS module.\n *\n * Works with both CommonJS and ESM modules.\n * Requires the schemas to be compiled (run 'pnpm build').\n */\nexport function loadZodSchemas(schemaPath: string): LoadZodSchemasResult {\n const errors: string[] = [];\n const entities: EntityInfo[] = [];\n\n try {\n // Check file exists\n if (!fs.existsSync(schemaPath)) {\n return {\n entities: [],\n errors: [`Schema file not found: ${schemaPath}`],\n };\n }\n\n // Try to require the schema module\n let schemaModule: Record<string, unknown>;\n\n try {\n schemaModule = require(schemaPath);\n } catch (e) {\n return {\n entities: [],\n errors: [\n `Failed to load schema module: ${schemaPath}`,\n 'Make sure schemas are compiled (run \"pnpm build\")',\n String(e),\n ],\n };\n }\n\n // Iterate through exports\n for (const [name, exported] of Object.entries(schemaModule)) {\n // Skip non-objects and non-schema exports\n if (!isZodSchema(exported)) continue;\n\n const schema = exported as ZodSchema;\n\n // Skip non-object schemas\n if (schema.def.type !== 'object') continue;\n\n // Extract entity name (remove Schema suffix)\n const entityName = name.replace(/Schema$/i, '');\n\n // Get shape\n const shape = schema.def.shape || {};\n\n // Build field list\n const fields: FieldInfo[] = Object.entries(shape).map(([fieldName, fieldSchema]) => {\n return {\n name: fieldName,\n type: inferZodType(fieldSchema as ZodSchema),\n required: !isOptional(fieldSchema as ZodSchema),\n description: (fieldSchema as ZodSchema).def.description,\n };\n });\n\n entities.push({\n name: toTitleCase(entityName),\n slug: toSlug(entityName),\n endpoint: `/${toSlug(entityName)}`,\n fieldCount: fields.length,\n fields,\n sourceFile: schemaPath,\n });\n }\n\n return { entities, errors };\n } catch (e) {\n return {\n entities: [],\n errors: [String(e)],\n };\n }\n}\n\n/**\n * Check if an object is a Zod schema.\n */\nexport function isZodSchema(obj: unknown): boolean {\n return typeof obj === 'object' && obj !== null && 'def' in obj;\n}\n\n/**\n * Check if a Zod schema is optional.\n */\nexport function isOptional(schema: ZodSchema): boolean {\n const def = schema.def;\n\n // Direct optional\n if (def.type === 'optional') return true;\n\n // Through lazy wrapper\n if (def.type === 'lazy') {\n const getter = def.getter;\n if (getter) {\n return isOptional(getter());\n }\n }\n\n // ZodOptional has innerType\n if (def.innerType) {\n return isOptional(def.innerType);\n }\n\n return false;\n}\n\n/**\n * Infer a human-readable type string from a Zod schema definition.\n */\nexport function inferZodType(schema: ZodSchema): string {\n const def = schema.def;\n\n switch (def.type) {\n case 'string':\n return 'string';\n\n case 'number':\n case 'bigint':\n return 'number';\n\n case 'boolean':\n return 'boolean';\n\n case 'date':\n return 'date';\n\n case 'enum':\n if (def.entries) {\n return Object.keys(def.entries).join(' | ');\n }\n if (def.values) {\n return def.values.map(String).join(' | ');\n }\n return 'enum';\n\n case 'literal':\n if (def.value !== undefined) {\n return JSON.stringify(def.value);\n }\n if (def.values) {\n return def.values.map((v) => JSON.stringify(v)).join(' | ');\n }\n return 'literal';\n\n case 'array':\n if (def.element) {\n return `${inferZodType(def.element)}[]`;\n }\n return 'array';\n\n case 'object':\n return 'object';\n\n case 'optional':\n if (def.innerType) {\n return inferZodType(def.innerType);\n }\n return 'optional';\n\n case 'nullable':\n if (def.innerType) {\n return `${inferZodType(def.innerType)} | null`;\n }\n return 'nullable';\n\n case 'union':\n if (def.options) {\n return def.options.map((opt) => inferZodType(opt)).join(' | ');\n }\n return 'union';\n\n case 'discriminated_union':\n if (def.options) {\n return def.options.map((opt) => inferZodType(opt)).join(' | ');\n }\n return 'union';\n\n case 'intersection':\n return 'object';\n\n case 'lazy':\n if (def.getter) {\n return inferZodType(def.getter());\n }\n return 'lazy';\n\n case 'any':\n case 'unknown':\n case 'never':\n case 'void':\n return def.type;\n\n case 'record':\n return 'Record<string, unknown>';\n\n case 'map':\n return 'Map<unknown, unknown>';\n\n case 'set':\n return 'Set<unknown>';\n\n case 'tuple':\n return 'tuple';\n\n default:\n return def.type || 'unknown';\n }\n}\n\n/**\n * Convert string to title case.\n */\nexport function toTitleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Convert string to URL-safe slug.\n */\nexport function toSlug(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n","import fs from 'fs';\nimport path from 'path';\nimport YAML from 'js-yaml';\nimport { loadZodSchemas } from './schema-loader';\nimport type { EntityInfo, FieldInfo, ListEntitiesResult, ListEntitiesOptions } from './types';\n\n/**\n * Discover available entities from Zod schemas or OpenAPI spec.\n *\n * Priority:\n * 1. schemaPath (explicit Zod schemas)\n * 2. specPath (explicit OpenAPI spec)\n * 3. Auto-detect (look for compiled schemas or OpenAPI spec)\n *\n * Pure function: same inputs → same outputs, no side effects.\n */\nexport function listEntities(options: ListEntitiesOptions = {}): ListEntitiesResult {\n const { specPath, schemaPath, projectRoot } = options;\n\n // Priority: schemaPath (Zod) > specPath (OpenAPI) > auto-detect\n if (schemaPath) {\n return listFromZodSchemas(schemaPath);\n }\n\n if (specPath) {\n return listFromOpenAPISpec(specPath);\n }\n\n // Auto-detect: look for compiled schemas or OpenAPI spec\n const root = projectRoot || process.cwd();\n const generatedDir = path.join(root, 'src', 'generated');\n\n // Try Zod schemas first (in generated directory)\n if (fs.existsSync(generatedDir)) {\n const schemaFiles = findSchemaFiles(generatedDir);\n\n for (const file of schemaFiles) {\n const result = loadZodSchemas(file);\n if (result.entities.length > 0) {\n // Build result, conditionally including errors\n const returnResult: ListEntitiesResult = {\n success: true,\n entities: result.entities,\n };\n if (result.errors.length > 0) {\n returnResult.errors = result.errors;\n }\n return returnResult;\n }\n }\n }\n\n // Try compiled dist files\n const distDir = path.join(root, 'dist');\n if (fs.existsSync(distDir)) {\n const schemaFiles = findCompiledSchemaFiles(distDir);\n\n for (const file of schemaFiles) {\n const result = loadZodSchemas(file);\n if (result.entities.length > 0) {\n // Build result, conditionally including errors\n const returnResult: ListEntitiesResult = {\n success: true,\n entities: result.entities,\n };\n if (result.errors.length > 0) {\n returnResult.errors = result.errors;\n }\n return returnResult;\n }\n }\n }\n\n // Try OpenAPI spec\n const specCandidates = [\n path.join(root, 'api.yaml'),\n path.join(root, 'api.yml'),\n path.join(root, 'openapi.yaml'),\n path.join(root, 'openapi.yml'),\n path.join(root, 'spec.yaml'),\n path.join(root, 'spec.yml'),\n ];\n\n for (const specFile of specCandidates) {\n if (fs.existsSync(specFile)) {\n return listFromOpenAPISpec(specFile);\n }\n }\n\n return {\n success: false,\n entities: [],\n errors: [\n 'No schema or spec found.',\n 'Options:',\n ' 1. Provide --schema-path to load compiled Zod schemas',\n ' 2. Provide --spec-path to parse an OpenAPI spec',\n ' 3. Ensure schemas are in src/generated/ or dist/',\n ],\n };\n}\n\n/**\n * Load entities from compiled Zod schema module.\n */\nfunction listFromZodSchemas(schemaPath: string): ListEntitiesResult {\n const { entities, errors } = loadZodSchemas(schemaPath);\n\n // Build result, conditionally including errors\n const returnResult: ListEntitiesResult = {\n success: errors.length === 0,\n entities,\n };\n if (errors.length > 0) {\n returnResult.errors = errors;\n }\n return returnResult;\n}\n\n/**\n * List entities from an OpenAPI spec file.\n *\n * Strategy: Iterate through paths, not schemas.\n * Schemas often don't map to paths (especially for request/response models).\n */\nfunction listFromOpenAPISpec(specPath: string): ListEntitiesResult {\n const errors: string[] = [];\n\n try {\n if (!fs.existsSync(specPath)) {\n return {\n success: false,\n entities: [],\n errors: [`Spec file not found: ${specPath}`],\n };\n }\n\n const content = fs.readFileSync(specPath, 'utf8');\n const spec = YAML.load(content) as Record<string, unknown>;\n\n const paths = (spec.paths as Record<string, Record<string, unknown>>) || {};\n const schemas =\n ((spec.components as Record<string, unknown>)?.schemas as Record<string, unknown>) || {};\n\n const entities: EntityInfo[] = [];\n const seenPaths = new Set<string>();\n\n // Iterate through paths to find entity-like endpoints\n for (const [pathStr, pathItem] of Object.entries(paths)) {\n // Skip paths we've already processed\n if (seenPaths.has(pathStr)) continue;\n\n // Get the GET operation (usually the \"list\" or \"get\" endpoint)\n const getOp = pathItem.get as Record<string, unknown> | undefined;\n const postOp = pathItem.post as Record<string, unknown> | undefined;\n\n // Skip admin/internal paths\n if (isInternalPath(pathStr)) {\n continue;\n }\n\n // Extract entity name from path\n const entityName = extractEntityNameFromPath(pathStr);\n const slug = toSlug(entityName);\n\n // Find the response schema for this endpoint\n let responseSchema: Record<string, unknown> | null = null;\n let fields: FieldInfo[] = [];\n\n // Try GET response first, then POST\n const operation = getOp || postOp;\n if (operation) {\n const responses = operation.responses as Record<string, unknown> | undefined;\n if (responses) {\n const successResponse = responses['200'] || responses['201'] || responses['default'];\n if (successResponse) {\n const content = (successResponse as Record<string, unknown>).content as\n | Record<string, unknown>\n | undefined;\n if (content) {\n const json = content['application/json'] as Record<string, unknown> | undefined;\n if (json) {\n const schemaOrRef = (json.schema || json) as Record<string, unknown>;\n if (schemaOrRef.$ref) {\n // It's a reference to a component schema\n const refName = extractSchemaName(schemaOrRef.$ref as string);\n const foundSchema = schemas[refName] as Record<string, unknown> | undefined;\n if (foundSchema) responseSchema = foundSchema;\n } else if (\n schemaOrRef.type === 'array' &&\n (schemaOrRef.items as Record<string, unknown>)?.$ref\n ) {\n // Array response - get item schema\n const refName = extractSchemaName(\n (schemaOrRef.items as Record<string, unknown>).$ref as string\n );\n const foundSchema = schemas[refName] as Record<string, unknown> | undefined;\n if (foundSchema) responseSchema = foundSchema;\n } else {\n responseSchema = schemaOrRef;\n }\n }\n }\n }\n }\n }\n\n if (responseSchema) {\n const properties = (responseSchema.properties as Record<string, unknown>) || {};\n fields = Object.entries(properties).map(([fieldName, fieldDef]) => ({\n name: fieldName,\n type: inferOpenAPIType(fieldDef),\n required: isRequired(fieldName, responseSchema!),\n description: (fieldDef as Record<string, unknown>)?.description as string,\n }));\n }\n\n entities.push({\n name: toTitleCase(entityName),\n slug,\n endpoint: pathStr,\n fieldCount: fields.length,\n fields,\n sourceFile: specPath,\n });\n\n seenPaths.add(pathStr);\n }\n\n // Build result, conditionally including errors\n const returnResult: ListEntitiesResult = {\n success: true,\n entities,\n };\n if (errors.length > 0) {\n returnResult.errors = errors;\n }\n return returnResult;\n } catch (err) {\n return {\n success: false,\n entities: [],\n errors: [`Failed to parse OpenAPI spec: ${String(err)}`],\n };\n }\n}\n\n/**\n * Extract entity name from API path.\n *\n * /accounts → \"Accounts\"\n * /accounts/{id} → \"Account\"\n * /transactions/get → \"Transactions\"\n * /network/status → \"Network Status\"\n */\nfunction extractEntityNameFromPath(pathStr: string): string {\n // Remove leading slash\n let path = pathStr.replace(/^\\//, '');\n\n // Remove path parameters\n path = path.replace(/\\{[^}]+\\}/g, '');\n\n // Split by slash and take the first meaningful segment(s)\n const segments = path.split('/').filter((s) => s.length > 0);\n\n if (segments.length === 0) return 'Root';\n if (segments.length === 1) return segments[0] ?? 'Root';\n\n // For paths like /transactions/get, prefer the first segment (resource name)\n // /resource/id patterns also use first segment\n const first = segments[0] ?? 'Root';\n const second = segments[1];\n\n // If second segment is all lowercase letters, it's likely a verb/action - use first\n if (second && /^[a-z]+$/i.test(second)) {\n return first;\n }\n\n // Otherwise combine the segments for compound paths\n return `${first} ${second || ''}`.trim();\n}\n\n/**\n * Check if a path is internal/admin (should be filtered).\n */\nfunction isInternalPath(pathStr: string): boolean {\n const internalPrefixes = [\n '/admin',\n '/internal',\n '/debug',\n '/health',\n '/metrics',\n '/webhook',\n '/oauth',\n '/token',\n '/auth',\n ];\n\n const lower = pathStr.toLowerCase();\n return internalPrefixes.some((prefix) => lower.startsWith(prefix));\n}\n\n/**\n * Extract schema name from $ref.\n *\n * \"#/components/schemas/Equipment\" → \"Equipment\"\n */\nfunction extractSchemaName(ref: string): string {\n const parts = ref.split('/');\n const lastPart = parts[parts.length - 1];\n return lastPart ?? ref;\n}\n\n/**\n * Find TypeScript/JavaScript files that might contain Zod schemas.\n */\nfunction findSchemaFiles(dir: string, depth = 0): string[] {\n const files: string[] = [];\n\n if (!fs.existsSync(dir) || depth > 3) return files;\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n files.push(...findSchemaFiles(fullPath, depth + 1));\n } else if (entry.name.match(/\\.(js|ts|mjs|cjs)$/)) {\n // Skip test files\n if (!entry.name.match(/\\.(test|spec)\\.(js|ts)$/)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\n/**\n * Find compiled schema files in dist directory.\n */\nfunction findCompiledSchemaFiles(dir: string): string[] {\n const files: string[] = [];\n\n if (!fs.existsSync(dir)) return files;\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n files.push(...findCompiledSchemaFiles(fullPath));\n } else if (entry.name.match(/\\.(js|mjs|cjs)$/) && !entry.name.match(/^[A-Z]/)) {\n // Lowercase files often contain schema exports\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n/**\n * Infer type from OpenAPI field definition.\n */\nfunction inferOpenAPIType(fieldDef: unknown): string {\n if (typeof fieldDef !== 'object' || fieldDef === null) return 'unknown';\n\n const def = fieldDef as Record<string, unknown>;\n\n if (def.type) return String(def.type);\n if (def.$ref) return 'ref';\n if (def.oneOf || def.anyOf) return 'union';\n if (def.allOf) return 'intersection';\n\n return 'unknown';\n}\n\n/**\n * Check if a field is required in the schema.\n */\nfunction isRequired(fieldName: string, schema: Record<string, unknown>): boolean {\n const required = schema.required as string[] | undefined;\n return required ? required.includes(fieldName) : false;\n}\n\n/**\n * Convert string to title case.\n */\nexport function toTitleCase(str: string): string {\n return str\n .replace(/_/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Convert string to URL-safe slug.\n * Handles common English plural patterns to match OpenAPI conventions.\n *\n * Examples:\n * \"Supply\" → \"supplies\" (matches /supplies endpoint)\n * \"Equipment\" → \"equipment\" (matches /equipment endpoint)\n * \"Personnel\" → \"personnel\" (matches /personnel endpoint)\n */\nexport function toSlug(str: string): string {\n // First apply standard camelCase splitting\n const slug = str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n\n // Handle common irregular/special plurals that match OpenAPI conventions\n // \"supply\" → \"supplies\" (not \"supply\")\n if (slug === 'supply') {\n return 'supplies';\n }\n // \"category\" → \"categories\"\n if (slug === 'category') {\n return 'categories';\n }\n // \"history\" → \"histories\"\n if (slug === 'history') {\n return 'histories';\n }\n\n // Standard English pluralization: words ending in 'y' → 'ies'\n // But only for common API resource names, not acronyms or special cases\n // This is a simple heuristic - may need refinement\n\n return slug;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport YAML from 'js-yaml';\nimport type {\n EndpointFilter,\n GenerateFilterResult,\n GenerateFilterOptions,\n ListEntitiesOptions,\n} from './types';\nimport { listEntities } from './list-entities';\n\n/**\n * Generates endpoint filter configuration from selected entities.\n *\n * Pure function: same inputs → same outputs.\n *\n * Logic:\n * 1. For each selected entity, include: /entity and /entity/{id}\n * 2. Apply default exclusions (admin, reports, delete)\n * 3. Return filter config\n */\nexport function generateFilter(options: GenerateFilterOptions): GenerateFilterResult {\n const warnings: string[] = [];\n\n // Get entity list to validate selections - build options conditionally\n const listOptions: ListEntitiesOptions = {};\n if (options.specPath !== undefined) listOptions.specPath = options.specPath;\n if (options.projectRoot !== undefined) listOptions.projectRoot = options.projectRoot;\n\n const listResult = listEntities(listOptions);\n\n if (!listResult.success) {\n const result: GenerateFilterResult = {\n success: false,\n filter: { include: [], exclude: [] },\n };\n if (listResult.errors !== undefined) {\n result.warnings = listResult.errors;\n }\n return result;\n }\n\n // Default exclusions\n const defaultExcludes = ['/admin/*', '/reports/*', '/*/delete', '/audit/*'];\n\n // Build include list from selected entities\n const include: string[] = [];\n const unknownEntities: string[] = [];\n\n for (const entitySlug of options.selectedEntities) {\n // Find entity in list - try multiple matching strategies\n const normalizedInput = entitySlug.toLowerCase();\n const entity = listResult.entities.find((e) => {\n // Match by slug\n if (e.slug === normalizedInput) return true;\n // Match by name\n if (e.name.toLowerCase() === normalizedInput) return true;\n // Match by endpoint path (handles /equipment, equipment, /equipment/{id})\n const normalizedEndpoint = e.endpoint.replace(/\\/$/, '').replace(/\\/\\{.*\\}$/, '');\n if (normalizedEndpoint.replace(/^\\//, '') === normalizedInput) return true;\n if (normalizedEndpoint === '/' + normalizedInput) return true;\n return false;\n });\n\n if (!entity) {\n unknownEntities.push(entitySlug);\n continue;\n }\n\n // Add list endpoint\n include.push(entity.endpoint);\n\n // Add single-item endpoint\n const singleEndpoint = entity.endpoint.endsWith('/')\n ? `${entity.endpoint}{id}`\n : `${entity.endpoint}/{id}`;\n include.push(singleEndpoint);\n }\n\n // Warn about unknown entities\n if (unknownEntities.length > 0) {\n warnings.push(\n `Unknown entities: ${unknownEntities.join(', ')}. Available: ${listResult.entities.map((e) => e.slug).join(', ')}`\n );\n }\n\n // Build exclude list\n const exclude = [...defaultExcludes, ...(options.excludePatterns || [])];\n\n // Write to stackwright.yml if output path provided\n if (options.outputPath) {\n const projectRoot = options.projectRoot || process.cwd();\n const outputFullPath = path.isAbsolute(options.outputPath)\n ? options.outputPath\n : path.join(projectRoot, options.outputPath);\n\n const config = {\n integrations: [\n {\n type: 'openapi',\n endpoints: {\n include,\n exclude,\n },\n },\n ],\n };\n\n fs.writeFileSync(outputFullPath, YAML.dump(config, { lineWidth: 120 }), 'utf8');\n }\n\n // Build result, conditionally including optional properties\n const result: GenerateFilterResult = {\n success: true,\n filter: { include, exclude },\n };\n if (warnings.length > 0) {\n result.warnings = warnings;\n }\n if (options.outputPath !== undefined) {\n result.outputPath = options.outputPath;\n }\n return result;\n}\n\n/**\n * Discover entities from an OpenAPI spec and generate filter.\n * Single function for the common workflow.\n */\nexport function discoverAndFilter(options: {\n specPath: string;\n selectedEntities: string[];\n excludePatterns?: string[];\n outputPath?: string;\n projectRoot?: string;\n}): GenerateFilterResult {\n // Build list options conditionally\n const listOptions: ListEntitiesOptions = { specPath: options.specPath };\n if (options.projectRoot !== undefined) listOptions.projectRoot = options.projectRoot;\n\n const listResult = listEntities(listOptions);\n\n if (!listResult.success) {\n const result: GenerateFilterResult = {\n success: false,\n filter: { include: [], exclude: [] },\n };\n if (listResult.errors !== undefined) {\n result.warnings = listResult.errors;\n }\n return result;\n }\n\n // Build filter options conditionally\n const filterOptions: GenerateFilterOptions = {\n specPath: options.specPath,\n selectedEntities: options.selectedEntities,\n };\n if (options.excludePatterns !== undefined)\n filterOptions.excludePatterns = options.excludePatterns;\n if (options.outputPath !== undefined) filterOptions.outputPath = options.outputPath;\n if (options.projectRoot !== undefined) filterOptions.projectRoot = options.projectRoot;\n\n return generateFilter(filterOptions);\n}\n","import chalk from 'chalk';\nimport { listEntities } from './list-entities';\nimport { generateFilter, discoverAndFilter } from './generate-filter';\nimport type { PluginRegistrar, ListEntitiesOptions, GenerateFilterOptions } from './types';\n\n// Re-export types for consumers\nexport type { EntityInfo, FieldInfo, ListEntitiesResult, ListEntitiesOptions } from './types';\nexport type { EndpointFilter, GenerateFilterResult, GenerateFilterOptions } from './types';\n\n// Re-export pure functions for programmatic use\nexport { listEntities } from './list-entities';\nexport { generateFilter, discoverAndFilter } from './generate-filter';\n\n/**\n * CLI plugin registration.\n * Called by the OSS CLI when this package is installed.\n *\n * Usage in OSS CLI:\n * ```ts\n * // In cli-plugin-loader.ts\n * import { registerCommands } from '@stackwright-pro/cli-data-explorer';\n * registerCommands(program);\n * ```\n */\nexport const registerCommands: PluginRegistrar = (program) => {\n // Create a mock Command interface that works with basic commander patterns\n // The actual integration point depends on the OSS CLI's command structure\n\n const dataExplorerCmd = {\n command: (name?: string) => {\n if (name) {\n console.log(`Creating subcommand: ${name}`);\n }\n return dataExplorerCmd;\n },\n description: (text: string) => {\n console.log(`Setting description: ${text}`);\n return dataExplorerCmd;\n },\n option: (flags: string, description?: string) => {\n return dataExplorerCmd;\n },\n requiredOption: (flags: string, description?: string) => {\n return dataExplorerCmd;\n },\n action: (handler: (options: Record<string, unknown>) => void | Promise<void>) => {\n return dataExplorerCmd;\n },\n hook: (event: string, handler: () => void | Promise<void>) => {\n if (event === 'preAction') {\n // Execute the hook immediately when setting it up\n handler();\n }\n return dataExplorerCmd;\n },\n addHelpText: (position: string, text: string) => {\n return dataExplorerCmd;\n },\n };\n\n // Ensure @stackwright-pro/openapi is available\n try {\n require('@stackwright-pro/openapi');\n } catch {\n console.error(chalk.red('Error: @stackwright-pro/openapi is required for data-explorer.'));\n console.error(chalk.blue('Install it with: pnpm add @stackwright-pro/openapi'));\n process.exit(1);\n }\n\n // For now, create a simple command structure that can be detected\n // In a real integration, this would use the actual Commander program\n const cmd = program.command?.('data-explorer') || dataExplorerCmd;\n\n // This function handles the 'list' subcommand\n const handleList = (opts: { spec?: string; schema?: string; json?: boolean }) => {\n // Build options object, conditionally including optional properties\n // This avoids passing undefined to optional properties (exactOptionalPropertyTypes)\n const options: ListEntitiesOptions = { projectRoot: process.cwd() };\n if (opts.spec !== undefined) options.specPath = opts.spec;\n if (opts.schema !== undefined) options.schemaPath = opts.schema;\n\n const result = listEntities(options);\n\n if (!result.success) {\n console.error(chalk.red('Failed to list entities:'));\n result.errors?.forEach((e) => console.error(` ${e}`));\n process.exit(1);\n }\n\n if (result.entities.length === 0) {\n console.log(chalk.yellow('\\nNo entities found.'));\n console.log(chalk.blue(' Options:'));\n console.log(chalk.blue(' --schema <path> Load compiled Zod schemas'));\n console.log(chalk.blue(' --spec <path> Parse OpenAPI spec'));\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\n📦 Available Entities:\\n'));\n\n for (const entity of result.entities) {\n console.log(` ${chalk.cyan(entity.name)} (${entity.slug})`);\n console.log(` Endpoint: ${entity.endpoint}`);\n console.log(` Fields: ${entity.fieldCount}`);\n\n // Show first 3 fields\n for (const field of entity.fields.slice(0, 3)) {\n const required = field.required ? '' : '?';\n console.log(` - ${field.name}${required}: ${field.type}`);\n }\n\n if (entity.fields.length > 3) {\n console.log(` ... and ${entity.fields.length - 3} more`);\n }\n console.log();\n }\n\n console.log(chalk.dim(`\\nTotal: ${result.entities.length} entities\\n`));\n };\n\n // This function handles the 'filter' subcommand\n const handleFilter = (opts: {\n entities: string;\n exclude?: string;\n output?: string;\n json?: boolean;\n }) => {\n const entities = opts.entities.split(',').map((e) => e.trim());\n\n // Build options object, conditionally including optional properties\n const options: GenerateFilterOptions = {\n selectedEntities: entities,\n outputPath: opts.output || './stackwright.yml',\n projectRoot: process.cwd(),\n };\n if (opts.exclude !== undefined) {\n options.excludePatterns = opts.exclude.split(',').map((e) => e.trim());\n }\n\n const result = generateFilter(options);\n\n if (!result.success) {\n console.error(chalk.red('Failed to generate filter:'));\n result.warnings?.forEach((w) => console.error(` ${w}`));\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(chalk.bold('\\n🔐 Generated Endpoint Filter:\\n'));\n\n console.log(' Include:');\n for (const path of result.filter.include) {\n console.log(` ${chalk.green('✅')} ${path}`);\n }\n console.log();\n\n console.log(' Exclude:');\n for (const pattern of result.filter.exclude) {\n console.log(` ${chalk.red('❌')} ${pattern}`);\n }\n console.log();\n\n if (result.warnings && result.warnings.length > 0) {\n console.log(chalk.yellow(' Warnings:'));\n for (const warning of result.warnings) {\n console.log(` ${chalk.yellow('⚠️')} ${warning}`);\n }\n console.log();\n }\n\n if (result.outputPath) {\n console.log(chalk.green(`\\n📝 Written to: ${result.outputPath}\\n`));\n }\n };\n\n // Export handlers for integration with real CLI\n return {\n dataExplorer: dataExplorerCmd,\n handleList,\n handleFilter,\n };\n};\n\n// Default export for convenience\nexport default registerCommands;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stackwright-pro/cli-data-explorer",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Data Explorer CLI - Explore API entities and generate endpoint filters",
|
|
5
5
|
"license": "PROPRIETARY",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"js-yaml": "^4.1.0"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
|
-
"@stackwright-pro/openapi": "0.2.
|
|
25
|
+
"@stackwright-pro/openapi": "0.2.1"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/js-yaml": "^4.0.9",
|
|
@@ -30,11 +30,12 @@
|
|
|
30
30
|
"tsup": "^8.5.0",
|
|
31
31
|
"typescript": "^5.8.3",
|
|
32
32
|
"vitest": "^4.0.18",
|
|
33
|
-
"@stackwright-pro/openapi": "0.2.
|
|
33
|
+
"@stackwright-pro/openapi": "0.2.1"
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"build": "tsup src/index.ts --format cjs,esm --dts --clean",
|
|
37
37
|
"dev": "tsup src/index.ts --format cjs,esm --dts --watch",
|
|
38
|
-
"test": "vitest"
|
|
38
|
+
"test": "vitest",
|
|
39
|
+
"test:coverage": "vitest run --coverage"
|
|
39
40
|
}
|
|
40
41
|
}
|