@stackwright-pro/cli-data-explorer 0.1.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 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
- return {
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
- return {
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
- return {
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
- return {
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
- return parts[parts.length - 1];
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
- let slug = str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
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 listResult = listEntities({
434
- specPath: options.specPath,
435
- projectRoot: options.projectRoot
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
- return {
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
- return {
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 listResult = listEntities({
496
- specPath: options.specPath,
497
- projectRoot: options.projectRoot
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
- return {
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
- return generateFilter({
529
+ const filterOptions = {
507
530
  specPath: options.specPath,
508
- selectedEntities: options.selectedEntities,
509
- excludePatterns: options.excludePatterns,
510
- outputPath: options.outputPath,
511
- projectRoot: options.projectRoot
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 result = listEntities({
557
- specPath: opts.spec,
558
- schemaPath: opts.schema,
559
- projectRoot: process.cwd()
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 result = generateFilter({
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
- return {
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
- return {
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
- return {
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
- return {
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
- return parts[parts.length - 1];
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
- let slug = str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
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 listResult = listEntities({
422
- specPath: options.specPath,
423
- projectRoot: options.projectRoot
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
- return {
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
- return {
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 listResult = listEntities({
484
- specPath: options.specPath,
485
- projectRoot: options.projectRoot
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
- return {
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
- return generateFilter({
517
+ const filterOptions = {
495
518
  specPath: options.specPath,
496
- selectedEntities: options.selectedEntities,
497
- excludePatterns: options.excludePatterns,
498
- outputPath: options.outputPath,
499
- projectRoot: options.projectRoot
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 result = listEntities({
545
- specPath: opts.spec,
546
- schemaPath: opts.schema,
547
- projectRoot: process.cwd()
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 result = generateFilter({
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}`));
@@ -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":"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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 // 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": "0.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.1.0"
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.1.0"
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
  }