@jaypie/fabric 0.1.2 → 0.1.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/commander/createCommanderOptions.ts","../../../../../src/constants.ts","../../../../../src/resolve-date.ts","../../../../../src/resolve.ts","../../../../../src/service.ts","../../../../../src/resolveService.ts","../../../../../src/commander/parseCommanderOptions.ts","../../../../../src/commander/fabricCommand.ts","../../../../../src/commander/FabricCommander.ts"],"sourcesContent":["// Create Commander.js options from service config\n\nimport { Option } from \"commander\";\n\nimport type { ConversionType, InputFieldDefinition } from \"../types.js\";\nimport type {\n CommanderOptionOverride,\n CreateCommanderOptionsConfig,\n CreateCommanderOptionsResult,\n} from \"./types.js\";\n\n/**\n * Convert camelCase to kebab-case\n */\nfunction toKebabCase(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\n/**\n * Check if a type is a typed array (e.g., [String], [Number])\n */\nfunction isTypedArrayType(type: ConversionType): boolean {\n if (!Array.isArray(type)) {\n return false;\n }\n if (type.length === 0) {\n return true; // [] is untyped array\n }\n if (type.length !== 1) {\n return false;\n }\n const element = type[0];\n return (\n element === Boolean ||\n element === Number ||\n element === String ||\n element === Object ||\n element === \"boolean\" ||\n element === \"number\" ||\n element === \"string\" ||\n element === \"object\" ||\n element === \"\" ||\n (typeof element === \"object\" &&\n element !== null &&\n !(element instanceof RegExp) &&\n Object.keys(element as Record<string, unknown>).length === 0)\n );\n}\n\n/**\n * Check if a type represents a boolean\n */\nfunction isBooleanType(type: ConversionType): boolean {\n return type === Boolean || type === \"boolean\";\n}\n\n/**\n * Check if a type is variadic (array-like)\n */\nfunction isVariadicType(type: ConversionType): boolean {\n if (type === Array || type === \"array\") {\n return true;\n }\n return isTypedArrayType(type);\n}\n\n/**\n * Get default description for a field\n */\nfunction getDescription(\n fieldName: string,\n definition: InputFieldDefinition,\n override?: CommanderOptionOverride,\n): string {\n if (override?.description) {\n return override.description;\n }\n if (definition.description) {\n return definition.description;\n }\n return fieldName;\n}\n\n/**\n * Build the flags string for an option\n */\nfunction buildFlags(\n fieldName: string,\n definition: InputFieldDefinition,\n override?: CommanderOptionOverride,\n): string {\n if (override?.flags) {\n return override.flags;\n }\n\n // Priority: override.long > definition.flag > toKebabCase(fieldName)\n const long = override?.long ?? definition.flag ?? toKebabCase(fieldName);\n // Priority: override.short > definition.letter\n const short = override?.short ?? definition.letter;\n const isBoolean = isBooleanType(definition.type);\n const isVariadic = isVariadicType(definition.type);\n const isRequired =\n definition.required !== false && definition.default === undefined;\n\n let flags = \"\";\n if (short) {\n flags += `-${short}, `;\n }\n flags += `--${long}`;\n\n if (!isBoolean) {\n if (isVariadic) {\n // Variadic: can take multiple values\n if (isRequired) {\n flags += ` <${fieldName}...>`;\n } else {\n flags += ` [${fieldName}...]`;\n }\n } else {\n // Scalar value\n if (isRequired) {\n flags += ` <${fieldName}>`;\n } else {\n flags += ` [${fieldName}]`;\n }\n }\n }\n\n return flags;\n}\n\n/**\n * Create a Commander Option from a field definition\n */\nfunction createOption(\n fieldName: string,\n definition: InputFieldDefinition,\n override?: CommanderOptionOverride,\n): Option {\n const flags = buildFlags(fieldName, definition, override);\n const description = getDescription(fieldName, definition, override);\n\n const option = new Option(flags, description);\n\n // Set default value if provided\n if (definition.default !== undefined) {\n option.default(definition.default);\n }\n\n // Hide from help if specified\n if (override?.hidden) {\n option.hideHelp();\n }\n\n return option;\n}\n\n/**\n * Create Commander.js Option objects from a service config\n *\n * @param input - The input field definitions from a service config\n * @param config - Optional configuration for excluding fields or overriding options\n * @returns An object containing an array of Commander Option objects\n *\n * @example\n * ```typescript\n * const handler = createService({\n * input: {\n * name: { type: String, description: \"User name\" },\n * age: { type: Number, default: 25 },\n * verbose: { type: Boolean },\n * },\n * service: (input) => input,\n * });\n *\n * const { options } = createCommanderOptions(handler.input);\n * options.forEach(opt => command.addOption(opt));\n * ```\n */\nexport function createCommanderOptions(\n input?: Record<string, InputFieldDefinition>,\n config: CreateCommanderOptionsConfig = {},\n): CreateCommanderOptionsResult {\n if (!input) {\n return { options: [] };\n }\n\n const { exclude = [], overrides = {} } = config;\n const options: Option[] = [];\n\n for (const [fieldName, definition] of Object.entries(input)) {\n // Skip excluded fields\n if (exclude.includes(fieldName)) {\n continue;\n }\n\n const override = overrides[fieldName];\n const option = createOption(fieldName, definition, override);\n options.push(option);\n\n // For boolean fields, also create a --no-<flag> option for negation\n // Commander.js requires separate options for --flag and --no-flag\n if (isBooleanType(definition.type) && !override?.flags) {\n const long = override?.long ?? definition.flag ?? toKebabCase(fieldName);\n const negateOption = new Option(`--no-${long}`, `Disable ${fieldName}`);\n // Hide the negatable option from help to avoid clutter\n negateOption.hideHelp();\n options.push(negateOption);\n }\n }\n\n return { options };\n}\n","/**\n * Meta-modeling Constants\n */\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Root organizational unit */\nexport const APEX = \"@\";\n\n/** Fabric version - used to identify pre-instantiated Services */\nexport const FABRIC_VERSION = \"0.1.0\";\n\n/** Composite key separator */\nexport const SEPARATOR = \"#\";\n\n/** System-level models that describe other models */\nexport const SYSTEM_MODELS = [\"context\", \"field\", \"model\"] as const;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type SystemModel = (typeof SYSTEM_MODELS)[number];\n","/**\n * Date Type Conversion for @jaypie/fabric\n *\n * Adds Date as a supported type in the fabric type system.\n * Follows the same conversion patterns as String, Number, Boolean.\n */\n\nimport { BadRequestError } from \"@jaypie/errors\";\n\n/**\n * Check if a value is a valid Date\n */\nexport function isValidDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime());\n}\n\n/**\n * Convert a value to a Date\n *\n * Supported inputs:\n * - Date: returned as-is (validated)\n * - Number: treated as Unix timestamp (milliseconds)\n * - String: parsed via Date constructor (ISO 8601, etc.)\n * - Object with value property: unwrapped and converted\n *\n * @throws BadRequestError if value cannot be converted to valid Date\n */\nexport function fabricDate(value: unknown): Date {\n // Already a Date\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) {\n throw new BadRequestError(\"Invalid Date value\");\n }\n return value;\n }\n\n // Null/undefined\n if (value === null || value === undefined) {\n throw new BadRequestError(\"Cannot convert null or undefined to Date\");\n }\n\n // Object with value property (fabric pattern)\n if (typeof value === \"object\" && value !== null && \"value\" in value) {\n return fabricDate((value as { value: unknown }).value);\n }\n\n // Number (timestamp in milliseconds)\n if (typeof value === \"number\") {\n if (Number.isNaN(value)) {\n throw new BadRequestError(\"Cannot convert NaN to Date\");\n }\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new BadRequestError(`Cannot convert ${value} to Date`);\n }\n return date;\n }\n\n // String (ISO 8601 or parseable format)\n if (typeof value === \"string\") {\n // Empty string is invalid\n if (value.trim() === \"\") {\n throw new BadRequestError(\"Cannot convert empty string to Date\");\n }\n\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new BadRequestError(`Cannot convert \"${value}\" to Date`);\n }\n return date;\n }\n\n // Boolean cannot be converted to Date\n if (typeof value === \"boolean\") {\n throw new BadRequestError(\"Cannot convert boolean to Date\");\n }\n\n // Arrays - attempt single element extraction\n if (Array.isArray(value)) {\n if (value.length === 1) {\n return fabricDate(value[0]);\n }\n throw new BadRequestError(\n `Cannot convert array with ${value.length} elements to Date`,\n );\n }\n\n throw new BadRequestError(`Cannot convert ${typeof value} to Date`);\n}\n\n/**\n * Resolve a value from a Date to another type\n *\n * @param value - Date to convert\n * @param targetType - Target type (String, Number)\n */\nexport function resolveFromDate(\n value: Date,\n targetType: typeof Number | typeof String,\n): number | string {\n if (!isValidDate(value)) {\n throw new BadRequestError(\"Invalid Date value\");\n }\n\n if (targetType === String) {\n return value.toISOString();\n }\n\n if (targetType === Number) {\n return value.getTime();\n }\n\n throw new BadRequestError(`Cannot convert Date to ${targetType}`);\n}\n\n/**\n * Date type constant for use in fabricService input definitions\n *\n * Usage:\n * ```typescript\n * const handler = fabricService({\n * input: {\n * startDate: { type: Date },\n * endDate: { type: Date, default: undefined }\n * }\n * });\n * ```\n */\nexport const DateType = Date;\n\n/**\n * Type guard for Date type in schema definitions\n */\nexport function isDateType(type: unknown): type is typeof Date {\n return type === Date;\n}\n","// Fabric functions for @jaypie/fabric\n\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport { fabricDate, isDateType } from \"./resolve-date.js\";\nimport type { ConversionType, TypedArrayType } from \"./types.js\";\n\n/**\n * Try to parse a string as JSON if it looks like JSON\n * Returns the parsed value or the original string if not JSON\n */\nfunction tryParseJson(value: string): unknown {\n const trimmed = value.trim();\n if (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n ) {\n try {\n return JSON.parse(trimmed);\n } catch {\n // Not valid JSON, return original\n return value;\n }\n }\n return value;\n}\n\n/**\n * Unwrap arrays and objects to get to the scalar value\n * - Single-element arrays unwrap to their element\n * - Objects with value property unwrap to that value\n * - Recursively unwraps nested structures\n */\nfunction unwrapToScalar(value: unknown): unknown {\n if (value === undefined || value === null) {\n return value;\n }\n\n // Unwrap single-element arrays\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return undefined;\n }\n if (value.length === 1) {\n return unwrapToScalar(value[0]);\n }\n throw new BadRequestError(\"Cannot convert multi-value array to scalar\");\n }\n\n // Unwrap objects with value property\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n return unwrapToScalar(obj.value);\n }\n throw new BadRequestError(\"Object must have a value attribute\");\n }\n\n return value;\n}\n\n/**\n * Prepare a value for scalar conversion by parsing JSON strings and unwrapping\n */\nfunction prepareForScalarConversion(value: unknown): unknown {\n if (value === undefined || value === null) {\n return value;\n }\n\n // Try to parse JSON strings\n if (typeof value === \"string\") {\n const parsed = tryParseJson(value);\n if (parsed !== value) {\n // Successfully parsed, unwrap the result\n return unwrapToScalar(parsed);\n }\n return value;\n }\n\n // Unwrap arrays and objects\n if (Array.isArray(value) || typeof value === \"object\") {\n return unwrapToScalar(value);\n }\n\n return value;\n}\n\n/**\n * Convert a value to a boolean\n * - Arrays, objects, and JSON strings are unwrapped first\n * - String \"true\" becomes true\n * - String \"false\" becomes false\n * - Strings that parse to numbers: positive = true, zero or negative = false\n * - Numbers: positive = true, zero or negative = false\n * - Boolean passes through\n */\nexport function fabricBoolean(value: unknown): boolean | undefined {\n // Prepare value by parsing JSON and unwrapping arrays/objects\n const prepared = prepareForScalarConversion(value);\n\n if (prepared === undefined || prepared === null) {\n return undefined;\n }\n\n if (typeof prepared === \"boolean\") {\n return prepared;\n }\n\n if (typeof prepared === \"string\") {\n if (prepared === \"\") {\n return undefined;\n }\n const lower = prepared.toLowerCase();\n if (lower === \"true\") {\n return true;\n }\n if (lower === \"false\") {\n return false;\n }\n // Try to parse as number\n const num = parseFloat(prepared);\n if (isNaN(num)) {\n throw new BadRequestError(`Cannot convert \"${prepared}\" to Boolean`);\n }\n return num > 0;\n }\n\n if (typeof prepared === \"number\") {\n if (isNaN(prepared)) {\n throw new BadRequestError(\"Cannot convert NaN to Boolean\");\n }\n return prepared > 0;\n }\n\n throw new BadRequestError(`Cannot convert ${typeof prepared} to Boolean`);\n}\n\n/**\n * Convert a value to a number\n * - Arrays, objects, and JSON strings are unwrapped first\n * - String \"\" becomes undefined\n * - String \"true\" becomes 1\n * - String \"false\" becomes 0\n * - Strings that parse to numbers use those values\n * - Strings that parse to NaN throw BadRequestError\n * - Boolean true becomes 1, false becomes 0\n * - Number passes through\n */\nexport function fabricNumber(value: unknown): number | undefined {\n // Prepare value by parsing JSON and unwrapping arrays/objects\n const prepared = prepareForScalarConversion(value);\n\n if (prepared === undefined || prepared === null) {\n return undefined;\n }\n\n if (typeof prepared === \"number\") {\n if (isNaN(prepared)) {\n throw new BadRequestError(\"Cannot convert NaN to Number\");\n }\n return prepared;\n }\n\n if (typeof prepared === \"boolean\") {\n return prepared ? 1 : 0;\n }\n\n if (typeof prepared === \"string\") {\n if (prepared === \"\") {\n return undefined;\n }\n const lower = prepared.toLowerCase();\n if (lower === \"true\") {\n return 1;\n }\n if (lower === \"false\") {\n return 0;\n }\n const num = parseFloat(prepared);\n if (isNaN(num)) {\n throw new BadRequestError(`Cannot convert \"${prepared}\" to Number`);\n }\n return num;\n }\n\n throw new BadRequestError(`Cannot convert ${typeof prepared} to Number`);\n}\n\n/**\n * Convert a value to a string\n * - Arrays, objects, and JSON strings are unwrapped first\n * - String \"\" becomes undefined\n * - Boolean true becomes \"true\", false becomes \"false\"\n * - Number converts to string representation\n * - String passes through\n */\nexport function fabricString(value: unknown): string | undefined {\n // Prepare value by parsing JSON and unwrapping arrays/objects\n const prepared = prepareForScalarConversion(value);\n\n if (prepared === undefined || prepared === null) {\n return undefined;\n }\n\n if (typeof prepared === \"string\") {\n if (prepared === \"\") {\n return undefined;\n }\n return prepared;\n }\n\n if (typeof prepared === \"boolean\") {\n return prepared ? \"true\" : \"false\";\n }\n\n if (typeof prepared === \"number\") {\n if (isNaN(prepared)) {\n throw new BadRequestError(\"Cannot convert NaN to String\");\n }\n return String(prepared);\n }\n\n throw new BadRequestError(`Cannot convert ${typeof prepared} to String`);\n}\n\n/**\n * Convert a value to an array\n * - Non-arrays become arrays containing that value\n * - Arrays of a single value become that value (unwrapped)\n * - Multi-value arrays throw BadRequestError\n * - undefined/null become undefined\n */\nexport function fabricArray(value: unknown): unknown[] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n // Arrays pass through (single-element unwrapping happens when converting FROM array)\n return value;\n }\n\n // Non-arrays become single-element arrays\n return [value];\n}\n\n/**\n * Resolve a value from an array to a scalar\n * - Single-element arrays become that element\n * - Multi-element arrays throw BadRequestError\n * - Non-arrays pass through\n */\nexport function resolveFromArray(value: unknown): unknown {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return undefined;\n }\n if (value.length === 1) {\n return value[0];\n }\n throw new BadRequestError(\"Cannot convert multi-value array to scalar\");\n }\n\n return value;\n}\n\n/**\n * Convert a value to an object with a value property\n * - Scalars become { value: scalar }\n * - Arrays become { value: array }\n * - Objects with a value attribute pass through\n * - Objects without a value attribute throw BadRequestError\n * - undefined/null become undefined\n */\nexport function fabricObject(value: unknown): { value: unknown } | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n // Check if already an object (but not an array)\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n return obj as { value: unknown };\n }\n throw new BadRequestError(\"Object must have a value attribute\");\n }\n\n // Scalars and arrays become { value: ... }\n return { value };\n}\n\n/**\n * Resolve a value from an object to its value property\n * - Objects with a value property return that value\n * - Objects without a value throw BadRequestError\n * - Scalars pass through\n */\nexport function resolveFromObject(value: unknown): unknown {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n return obj.value;\n }\n throw new BadRequestError(\"Object must have a value attribute\");\n }\n\n return value;\n}\n\n/**\n * Check if a type is a typed array (e.g., [String], [Number], [], etc.)\n */\nfunction isTypedArrayType(type: ConversionType): type is TypedArrayType {\n return Array.isArray(type);\n}\n\n/**\n * Split a string on comma or tab delimiters for typed array conversion.\n * Only splits if the string contains commas or tabs.\n * Returns the original value if not a string or no delimiters found.\n */\nfunction splitStringForArray(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n\n // Check for comma or tab delimiters\n if (value.includes(\",\")) {\n return value.split(\",\").map((s) => s.trim());\n }\n if (value.includes(\"\\t\")) {\n return value.split(\"\\t\").map((s) => s.trim());\n }\n\n return value;\n}\n\n/**\n * Try to parse a string as JSON for array context.\n * Returns parsed value if it's an array, otherwise returns original.\n */\nfunction tryParseJsonArray(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n\n const trimmed = value.trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Not valid JSON, fall through\n }\n }\n\n return value;\n}\n\n/**\n * Get the element type from a typed array type\n * Returns undefined for untyped arrays ([])\n */\nfunction getArrayElementType(\n type: TypedArrayType,\n): \"boolean\" | \"number\" | \"object\" | \"string\" | undefined {\n if (type.length === 0) {\n return undefined; // Untyped array\n }\n\n const elementType = type[0];\n\n // Handle constructor types\n if (elementType === Boolean) return \"boolean\";\n if (elementType === Number) return \"number\";\n if (elementType === String) return \"string\";\n if (elementType === Object) return \"object\";\n\n // Handle string types\n if (elementType === \"boolean\") return \"boolean\";\n if (elementType === \"number\") return \"number\";\n if (elementType === \"string\") return \"string\";\n if (elementType === \"object\") return \"object\";\n\n // Handle shorthand types\n if (elementType === \"\") return \"string\"; // \"\" shorthand for String\n if (\n typeof elementType === \"object\" &&\n elementType !== null &&\n Object.keys(elementType).length === 0\n ) {\n return \"object\"; // {} shorthand for Object\n }\n\n throw new BadRequestError(\n `Unknown array element type: ${String(elementType)}`,\n );\n}\n\n/**\n * Convert a value to a typed array\n * - Tries to parse JSON arrays first\n * - Splits strings on comma/tab if present\n * - Wraps non-arrays in an array\n * - Converts each element to the specified element type\n */\nfunction fabricTypedArray(\n value: unknown,\n elementType: \"boolean\" | \"number\" | \"object\" | \"string\" | undefined,\n): unknown[] | undefined {\n // Try to parse JSON array first\n let processed = tryParseJsonArray(value);\n\n // If still a string, try to split on comma/tab\n processed = splitStringForArray(processed);\n\n // Convert to array (wraps non-arrays)\n const array = fabricArray(processed);\n\n if (array === undefined) {\n return undefined;\n }\n\n // If no element type specified, return as-is\n if (elementType === undefined) {\n return array;\n }\n\n // Convert each element to the element type\n return array.map((element, index) => {\n try {\n switch (elementType) {\n case \"boolean\":\n return fabricBoolean(element);\n case \"number\":\n return fabricNumber(element);\n case \"object\":\n return fabricObject(element);\n case \"string\":\n return fabricString(element);\n default:\n throw new BadRequestError(`Unknown element type: ${elementType}`);\n }\n } catch (error) {\n if (error instanceof BadRequestError) {\n throw new BadRequestError(\n `Cannot convert array element at index ${index}: ${error.message}`,\n );\n }\n throw error;\n }\n });\n}\n\n/**\n * Fabric a value to the specified type\n */\nexport function fabric(value: unknown, type: ConversionType): unknown {\n // Check for Date type first\n if (isDateType(type)) {\n return fabricDate(value);\n }\n\n // Check for typed array types\n if (isTypedArrayType(type)) {\n const elementType = getArrayElementType(type);\n return fabricTypedArray(value, elementType);\n }\n\n const normalizedType = normalizeType(type);\n\n switch (normalizedType) {\n case \"array\":\n return fabricArray(value);\n case \"boolean\":\n return fabricBoolean(value);\n case \"number\":\n return fabricNumber(value);\n case \"object\":\n return fabricObject(value);\n case \"string\":\n return fabricString(value);\n default:\n throw new BadRequestError(`Unknown type: ${String(type)}`);\n }\n}\n\n/**\n * Normalize type to string representation\n */\nfunction normalizeType(\n type: ConversionType,\n): \"array\" | \"boolean\" | \"number\" | \"object\" | \"string\" {\n if (type === Array || type === \"array\") {\n return \"array\";\n }\n if (type === Boolean || type === \"boolean\") {\n return \"boolean\";\n }\n if (type === Number || type === \"number\") {\n return \"number\";\n }\n if (type === Object || type === \"object\") {\n return \"object\";\n }\n if (type === String || type === \"string\") {\n return \"string\";\n }\n throw new BadRequestError(`Unknown type: ${String(type)}`);\n}\n","// Service for @jaypie/fabric\n\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport { FABRIC_VERSION } from \"./constants.js\";\nimport { fabric } from \"./resolve.js\";\nimport type {\n ConversionType,\n InputFieldDefinition,\n Service,\n ServiceConfig,\n ServiceContext,\n ValidateFunction,\n} from \"./types.js\";\n\n/**\n * Check if a single-element array is a typed array type constructor.\n */\nfunction isTypedArrayConstructor(element: unknown): boolean {\n return (\n element === Boolean ||\n element === Number ||\n element === String ||\n element === Object ||\n element === \"boolean\" ||\n element === \"number\" ||\n element === \"string\" ||\n element === \"object\" ||\n element === \"\" ||\n (typeof element === \"object\" &&\n element !== null &&\n !(element instanceof RegExp) &&\n Object.keys(element as Record<string, unknown>).length === 0)\n );\n}\n\n/**\n * Check if a type is a validated string type (array of string literals and/or RegExp).\n * Distinguishes from typed arrays like [String], [Number], etc.\n */\nfunction isValidatedStringType(\n type: ConversionType,\n): type is Array<string | RegExp> {\n if (!Array.isArray(type)) {\n return false;\n }\n\n // Empty array is untyped array, not validated string\n if (type.length === 0) {\n return false;\n }\n\n // Single-element arrays with type constructors are typed arrays\n if (type.length === 1 && isTypedArrayConstructor(type[0])) {\n return false;\n }\n\n // Check that all elements are strings or RegExp\n return type.every(\n (item) => typeof item === \"string\" || item instanceof RegExp,\n );\n}\n\n/**\n * Check if a type is a validated number type (array of number literals).\n * Distinguishes from typed arrays like [Number], etc.\n */\nfunction isValidatedNumberType(type: ConversionType): type is Array<number> {\n if (!Array.isArray(type)) {\n return false;\n }\n\n // Empty array is untyped array, not validated number\n if (type.length === 0) {\n return false;\n }\n\n // Single-element arrays with type constructors are typed arrays\n if (type.length === 1 && isTypedArrayConstructor(type[0])) {\n return false;\n }\n\n // Check that all elements are numbers\n return type.every((item) => typeof item === \"number\");\n}\n\n/**\n * Parse input string as JSON if it's a string\n */\nfunction parseInput(input: unknown): Record<string, unknown> {\n if (input === undefined || input === null) {\n return {};\n }\n\n if (typeof input === \"string\") {\n if (input === \"\") {\n return {};\n }\n try {\n const parsed = JSON.parse(input);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n throw new BadRequestError(\"Input must be an object\");\n }\n return parsed as Record<string, unknown>;\n } catch (error) {\n if (error instanceof BadRequestError) {\n throw error;\n }\n throw new BadRequestError(\"Invalid JSON input\");\n }\n }\n\n if (typeof input === \"object\" && !Array.isArray(input)) {\n return input as Record<string, unknown>;\n }\n\n throw new BadRequestError(\"Input must be an object or JSON string\");\n}\n\n/**\n * Run validation on a value (supports async validators)\n */\nasync function runValidation(\n value: unknown,\n validate: ValidateFunction | RegExp | Array<unknown>,\n fieldName: string,\n): Promise<void> {\n if (typeof validate === \"function\") {\n const result = await validate(value);\n if (result === false) {\n throw new BadRequestError(`Validation failed for field \"${fieldName}\"`);\n }\n } else if (validate instanceof RegExp) {\n if (typeof value !== \"string\" || !validate.test(value)) {\n throw new BadRequestError(`Validation failed for field \"${fieldName}\"`);\n }\n } else if (Array.isArray(validate)) {\n // Check if value matches any item in the array\n for (const item of validate) {\n if (item instanceof RegExp) {\n if (typeof value === \"string\" && item.test(value)) {\n return; // Match found\n }\n } else if (typeof item === \"function\") {\n try {\n const result = await (item as ValidateFunction)(value);\n if (result !== false) {\n return; // Match found\n }\n } catch {\n // Continue to next item\n }\n } else if (value === item) {\n return; // Scalar match found\n }\n }\n throw new BadRequestError(`Validation failed for field \"${fieldName}\"`);\n }\n}\n\n/**\n * Check if a field is required\n * A field is required unless it has a default OR required is explicitly false\n */\nfunction isFieldRequired(definition: InputFieldDefinition): boolean {\n if (definition.required === false) {\n return false;\n }\n if (definition.default !== undefined) {\n return false;\n }\n return true;\n}\n\n/**\n * Process a single field through conversion and validation\n */\nasync function processField(\n fieldName: string,\n value: unknown,\n definition: InputFieldDefinition,\n): Promise<unknown> {\n // Apply default if value is undefined\n let processedValue = value;\n if (processedValue === undefined && definition.default !== undefined) {\n processedValue = definition.default;\n }\n\n // Determine actual type and validation\n let actualType: ConversionType = definition.type;\n let validation = definition.validate;\n\n // Handle bare RegExp shorthand: /regex/\n if (definition.type instanceof RegExp) {\n actualType = String;\n validation = definition.type; // The RegExp becomes the validation\n }\n // Handle validated string shorthand: [\"value1\", \"value2\"] or [/regex/]\n else if (isValidatedStringType(definition.type)) {\n actualType = String;\n validation = definition.type; // The array becomes the validation\n }\n // Handle validated number shorthand: [1, 2, 3]\n else if (isValidatedNumberType(definition.type)) {\n actualType = Number;\n validation = definition.type; // The array becomes the validation\n }\n\n // Fabric to target type\n const convertedValue = fabric(processedValue, actualType);\n\n // Check if required field is missing\n if (convertedValue === undefined && isFieldRequired(definition)) {\n throw new BadRequestError(`Missing required field \"${fieldName}\"`);\n }\n\n // Run validation if provided\n if (validation !== undefined && convertedValue !== undefined) {\n await runValidation(convertedValue, validation, fieldName);\n }\n\n return convertedValue;\n}\n\n/**\n * Fabric a service function\n *\n * Service builds a function that initiates a \"controller\" step that:\n * - Parses the input if it is a string to object\n * - Fabrics each input field to its type\n * - Calls the validation function or regular expression or checks the array\n * - Calls the service function and returns the response\n *\n * The returned function has config properties for introspection.\n */\nexport function fabricService<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n>(config: ServiceConfig<TInput, TOutput>): Service<TInput, TOutput> {\n const { input: inputDefinitions, service } = config;\n\n const handler = async (\n rawInput?: Partial<TInput> | string,\n context?: ServiceContext,\n ): Promise<TOutput> => {\n // Parse input (handles string JSON)\n const parsedInput = parseInput(rawInput);\n\n // If no input definitions, pass through to service or return parsed input\n if (!inputDefinitions) {\n if (service) {\n return service(parsedInput as TInput, context);\n }\n return parsedInput as TOutput;\n }\n\n // Process all fields in parallel\n const entries = Object.entries(inputDefinitions);\n const processedValues = await Promise.all(\n entries.map(([fieldName, definition]) =>\n processField(fieldName, parsedInput[fieldName], definition),\n ),\n );\n\n // Build processed input object\n const processedInput: Record<string, unknown> = {};\n entries.forEach(([fieldName], index) => {\n processedInput[fieldName] = processedValues[index];\n });\n\n // Return processed input if no service, otherwise call service\n if (service) {\n return service(processedInput as TInput, context);\n }\n return processedInput as TOutput;\n };\n\n // Attach config properties directly to handler for flat access\n const typedHandler = handler as Service<TInput, TOutput>;\n typedHandler.$fabric = FABRIC_VERSION;\n if (config.alias !== undefined) typedHandler.alias = config.alias;\n if (config.description !== undefined)\n typedHandler.description = config.description;\n if (config.input !== undefined) typedHandler.input = config.input;\n if (config.service !== undefined) typedHandler.service = config.service;\n\n return typedHandler;\n}\n","// Resolve inline service definitions to full Service objects\n\nimport { fabricService } from \"./service.js\";\nimport type {\n InputFieldDefinition,\n Service,\n ServiceFunction,\n} from \"./types.js\";\n\n/**\n * Configuration for resolving a service\n */\nexport interface ResolveServiceConfig<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n> {\n /** Service alias (used as name for adapters) */\n alias?: string;\n /** Service description */\n description?: string;\n /** Input field definitions */\n input?: Record<string, InputFieldDefinition>;\n /** The service - either a pre-instantiated Service or an inline function */\n service: Service<TInput, TOutput> | ServiceFunction<TInput, TOutput>;\n}\n\n/**\n * Type guard to check if a value is a pre-instantiated Service\n * A Service is a function with the `$fabric` property set by fabricService\n */\nfunction isService<TInput extends Record<string, unknown>, TOutput>(\n value: Service<TInput, TOutput> | ServiceFunction<TInput, TOutput>,\n): value is Service<TInput, TOutput> {\n return typeof value === \"function\" && \"$fabric\" in value;\n}\n\n/**\n * Resolve a service configuration to a full Service object\n *\n * Supports two patterns:\n * 1. Inline service definition - pass a plain function as `service` along with\n * `alias`, `description`, and `input` in the config\n * 2. Pre-instantiated Service - pass a Service object as `service`\n *\n * When a pre-instantiated Service is passed, config fields act as overrides:\n * - `alias` overrides service.alias\n * - `description` overrides service.description\n * - `input` overrides service.input\n *\n * The original Service is never mutated - a new Service is created when overrides\n * are applied.\n *\n * @example\n * ```typescript\n * // Inline service definition\n * const service = resolveService({\n * alias: \"greet\",\n * description: \"Greet a user\",\n * input: { name: { type: String } },\n * service: ({ name }) => `Hello, ${name}!`,\n * });\n *\n * // Pre-instantiated with override\n * const baseService = fabricService({ alias: \"foo\", service: (x) => x });\n * const overridden = resolveService({\n * alias: \"bar\", // Override alias\n * service: baseService,\n * });\n * ```\n */\nexport function resolveService<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n>(config: ResolveServiceConfig<TInput, TOutput>): Service<TInput, TOutput> {\n const { alias, description, input, service } = config;\n\n if (isService(service)) {\n // Service is pre-instantiated - config fields act as overrides\n // Create new Service with merged properties (config overrides service)\n return fabricService({\n alias: alias ?? service.alias,\n description: description ?? service.description,\n input: input ?? service.input,\n service: service.service,\n });\n }\n\n // Service is an inline function - create Service from config\n return fabricService({\n alias,\n description,\n input,\n service,\n });\n}\n","// Parse Commander.js options back to handler input format\n\nimport { fabricDate, isDateType } from \"../resolve-date.js\";\nimport type { ConversionType } from \"../types.js\";\nimport type { ParseCommanderOptionsConfig } from \"./types.js\";\n\n/**\n * Convert kebab-case to camelCase\n */\nfunction toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, char) => char.toUpperCase());\n}\n\n/**\n * Convert camelCase to kebab-case\n */\nfunction toKebabCase(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\n/**\n * Check if a type is a typed array (e.g., [String], [Number])\n */\nfunction isTypedArrayType(type: ConversionType): boolean {\n if (!Array.isArray(type)) {\n return false;\n }\n if (type.length === 0) {\n return true; // [] is untyped array\n }\n if (type.length !== 1) {\n return false;\n }\n const element = type[0];\n return (\n element === Boolean ||\n element === Number ||\n element === String ||\n element === Object ||\n element === \"boolean\" ||\n element === \"number\" ||\n element === \"string\" ||\n element === \"object\" ||\n element === \"\" ||\n (typeof element === \"object\" &&\n element !== null &&\n !(element instanceof RegExp) &&\n Object.keys(element as Record<string, unknown>).length === 0)\n );\n}\n\n/**\n * Check if a type represents a number (scalar or validated)\n */\nfunction isNumberType(type: ConversionType): boolean {\n if (type === Number || type === \"number\") {\n return true;\n }\n // Check for validated number type [1, 2, 3]\n if (Array.isArray(type) && type.length > 0) {\n // If it's not a typed array and all elements are numbers, it's a validated number\n if (\n !isTypedArrayType(type) &&\n type.every((item) => typeof item === \"number\")\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a type represents a boolean\n */\nfunction isBooleanType(type: ConversionType): boolean {\n return type === Boolean || type === \"boolean\";\n}\n\n/**\n * Check if a type is an array type (Array, \"array\", or typed array)\n */\nfunction isArrayType(type: ConversionType): boolean {\n if (type === Array || type === \"array\") {\n return true;\n }\n return isTypedArrayType(type);\n}\n\n/**\n * Check if a type is an object type\n */\nfunction isObjectType(type: ConversionType): boolean {\n return type === Object || type === \"object\";\n}\n\n/**\n * Convert a single value based on its target type\n */\nfunction convertValue(value: unknown, type: ConversionType): unknown {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n // Boolean type - Commander handles this automatically\n if (isBooleanType(type)) {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"1\" || lower === \"yes\") {\n return true;\n }\n if (lower === \"false\" || lower === \"0\" || lower === \"no\") {\n return false;\n }\n }\n return Boolean(value);\n }\n\n // Number type\n if (isNumberType(type)) {\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n const num = Number(value);\n if (!isNaN(num)) {\n return num;\n }\n }\n return value;\n }\n\n // Date type\n if (isDateType(type)) {\n if (value instanceof Date) {\n return value;\n }\n try {\n return fabricDate(value);\n } catch {\n // If conversion fails, return as-is and let createService handle it\n return value;\n }\n }\n\n // Array types - handle variadic options\n if (isArrayType(type)) {\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n // Try to parse as JSON first\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Not JSON, check for comma or tab separated\n if (value.includes(\",\")) {\n return value.split(\",\").map((s) => s.trim());\n }\n if (value.includes(\"\\t\")) {\n return value.split(\"\\t\").map((s) => s.trim());\n }\n }\n // Single value becomes array\n return [value];\n }\n return [value];\n }\n\n // Object type - try to parse JSON\n if (isObjectType(type)) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n !Array.isArray(parsed)\n ) {\n return parsed;\n }\n } catch {\n // Not valid JSON\n }\n }\n return value;\n }\n\n // String type (default) - just return as-is\n return value;\n}\n\n/**\n * Parse Commander.js options back to handler input format\n *\n * This function converts the options object from Commander.js (which uses\n * kebab-case converted to camelCase) back to the expected handler input\n * format with proper type conversion based on the input definitions.\n *\n * @param options - The options object from Commander.js (program.opts())\n * @param config - Configuration including input field definitions\n * @returns An object suitable for passing to a service\n *\n * @example\n * ```typescript\n * const handler = createService({\n * input: {\n * userName: { type: String },\n * age: { type: Number },\n * tags: { type: [String] },\n * },\n * service: (input) => input,\n * });\n *\n * program.action((options) => {\n * const input = parseCommanderOptions(options, {\n * input: handler.input,\n * });\n * await handler(input);\n * });\n * ```\n */\nexport function parseCommanderOptions(\n options: Record<string, unknown>,\n config: ParseCommanderOptionsConfig = {},\n): Record<string, unknown> {\n const { exclude = [], input: inputDefinitions } = config;\n const result: Record<string, unknown> = {};\n\n // Build reverse mapping from flag name (camelCase) to field name\n // This handles cases where input.flag overrides the default flag name\n const flagToFieldMap = new Map<string, string>();\n if (inputDefinitions) {\n for (const [fieldName, definition] of Object.entries(inputDefinitions)) {\n if (definition.flag) {\n // Custom flag: map flag (as camelCase) -> fieldName\n const flagCamelCase = toCamelCase(definition.flag);\n flagToFieldMap.set(flagCamelCase, fieldName);\n } else {\n // Default: kebab-case of fieldName -> fieldName\n const defaultFlag = toKebabCase(fieldName);\n const defaultFlagCamelCase = toCamelCase(defaultFlag);\n flagToFieldMap.set(defaultFlagCamelCase, fieldName);\n }\n }\n }\n\n for (const [key, value] of Object.entries(options)) {\n // Skip excluded fields\n if (exclude.includes(key)) {\n continue;\n }\n\n // Convert kebab-case Commander option to camelCase\n const keyCamelCase = toCamelCase(key);\n\n // Look up the actual field name from our mapping\n const fieldName = flagToFieldMap.get(keyCamelCase) ?? keyCamelCase;\n\n // Skip if excluded after resolution\n if (exclude.includes(fieldName)) {\n continue;\n }\n\n // Get field definition for type conversion\n const definition = inputDefinitions?.[fieldName];\n\n if (definition) {\n // Convert based on type definition\n result[fieldName] = convertValue(value, definition.type);\n } else {\n // No definition, pass through as-is\n result[fieldName] = value;\n }\n }\n\n return result;\n}\n","// Fabric a service as a Commander command\n\nimport { resolveService } from \"../resolveService.js\";\nimport type { Message, ServiceContext } from \"../types.js\";\nimport { createCommanderOptions } from \"./createCommanderOptions.js\";\nimport { parseCommanderOptions } from \"./parseCommanderOptions.js\";\nimport type { FabricCommandConfig, FabricCommandResult } from \"./types.js\";\n\n/**\n * Fabric a service as a Commander.js command\n *\n * This function creates a command from a service, automatically:\n * - Creating the command with the service's alias (or custom name)\n * - Adding a description from the service's description (or custom)\n * - Converting input definitions to Commander options\n * - Wiring up the action to call the service with parsed input\n *\n * Error handling:\n * - Services can call context.onError() for recoverable errors\n * - Services can call context.onFatal() for fatal errors\n * - Any error that throws out of the service is treated as fatal\n *\n * @param config - Configuration including service, program, and optional overrides\n * @returns An object containing the created command\n *\n * @example\n * ```typescript\n * import { Command } from \"commander\";\n * import { fabricService } from \"@jaypie/fabric\";\n * import { fabricCommand } from \"@jaypie/fabric/commander\";\n *\n * const myService = fabricService({\n * alias: \"greet\",\n * description: \"Greet a user\",\n * input: {\n * userName: { type: String, description: \"User name\" },\n * loud: { type: Boolean, description: \"Shout greeting\" },\n * },\n * service: ({ userName, loud }) => {\n * const greeting = `Hello, ${userName}!`;\n * return loud ? greeting.toUpperCase() : greeting;\n * },\n * });\n *\n * const program = new Command();\n * fabricCommand({ program, service: myService });\n * program.parse();\n * ```\n */\n\nexport function fabricCommand({\n alias,\n description,\n exclude,\n input,\n name,\n onComplete,\n onError,\n onFatal,\n onMessage,\n overrides,\n program,\n service: serviceOrFunction,\n}: FabricCommandConfig): FabricCommandResult {\n // Resolve inline service or apply overrides to pre-instantiated service\n const service = resolveService({\n alias,\n description,\n input,\n service: serviceOrFunction,\n });\n\n // Determine command name (priority: name > service.alias > \"command\")\n const commandName = name ?? service.alias ?? \"command\";\n\n // Determine command description\n const commandDescription = service.description;\n\n // Create the command\n const command = program.command(commandName);\n\n // Add description if available\n if (commandDescription) {\n command.description(commandDescription);\n }\n\n // Create and add options from service input\n if (service.input) {\n const { options } = createCommanderOptions(service.input, {\n exclude,\n overrides,\n });\n options.forEach((opt) => command.addOption(opt));\n }\n\n // Wire up the action\n command.action(async (options): Promise<void> => {\n // Parse Commander options to service input format\n const input = parseCommanderOptions(options, {\n exclude,\n input: service.input,\n });\n\n // Create context callbacks that wrap the registration callbacks with error swallowing\n // Callback failures should never halt service execution\n const sendMessage = onMessage\n ? async (message: Message): Promise<void> => {\n try {\n await onMessage(message);\n } catch {\n // Swallow errors - messaging failures should not halt execution\n }\n }\n : undefined;\n\n const contextOnError = onError\n ? async (error: unknown): Promise<void> => {\n try {\n await onError(error);\n } catch {\n // Swallow errors - callback failures should not halt execution\n }\n }\n : undefined;\n\n const contextOnFatal = onFatal\n ? async (error: unknown): Promise<void> => {\n try {\n await onFatal(error);\n } catch {\n // Swallow errors - callback failures should not halt execution\n }\n }\n : undefined;\n\n // Create context for the service\n const context: ServiceContext = {\n onError: contextOnError,\n onFatal: contextOnFatal,\n sendMessage,\n };\n\n try {\n // Call the service with context\n const response = await service(input, context);\n\n // Call onComplete callback if provided\n if (onComplete) {\n await onComplete(response);\n }\n } catch (error) {\n // Any error that escapes the service is treated as fatal\n // Services should catch recoverable errors and call context.onError() explicitly\n if (onFatal) {\n await onFatal(error);\n } else if (onError) {\n // Fall back to onError if onFatal not provided\n await onError(error);\n } else {\n // No error callbacks provided, re-throw\n throw error;\n }\n }\n });\n\n return { command, onMessage };\n}\n","// FabricCommander - Convenient wrapper for multi-command CLIs\n\nimport { Command } from \"commander\";\n\nimport type {\n InputFieldDefinition,\n Service,\n ServiceFunction,\n} from \"../types.js\";\nimport { fabricCommand } from \"./fabricCommand.js\";\nimport type {\n OnCompleteCallback,\n OnErrorCallback,\n OnFatalCallback,\n OnMessageCallback,\n} from \"./types.js\";\n\n/**\n * Inline service definition for FabricCommander\n * Allows defining services directly in the services array\n */\nexport interface InlineServiceDefinition {\n /** Service alias (used as command name) */\n alias: string;\n /** Service description */\n description?: string;\n /** Input field definitions */\n input?: Record<string, InputFieldDefinition>;\n /** The service function */\n service: ServiceFunction<Record<string, unknown>, unknown>;\n}\n\n/**\n * Service entry - either a pre-instantiated Service or an inline definition\n */\nexport type ServiceEntry = Service | InlineServiceDefinition;\n\n/**\n * Configuration for FabricCommander\n */\nexport interface FabricCommanderConfig {\n /** CLI description */\n description?: string;\n /** CLI name (defaults to process.argv script name) */\n name?: string;\n /** Default callback called when any command completes successfully */\n onComplete?: OnCompleteCallback;\n /** Default callback called when any command encounters an error */\n onError?: OnErrorCallback;\n /** Default callback called when any command encounters a fatal error */\n onFatal?: OnFatalCallback;\n /** Default callback called to report progress messages */\n onMessage?: OnMessageCallback;\n /** Services to register as commands */\n services: ServiceEntry[];\n /** CLI version */\n version?: string;\n}\n\n/**\n * Type guard to check if config is an array of services\n */\nfunction isServicesArray(\n config: ServiceEntry[] | FabricCommanderConfig,\n): config is ServiceEntry[] {\n return Array.isArray(config);\n}\n\n/**\n * Type guard to check if a service entry is an inline definition\n */\nfunction isInlineDefinition(\n entry: ServiceEntry,\n): entry is InlineServiceDefinition {\n return (\n typeof entry === \"object\" &&\n entry !== null &&\n \"alias\" in entry &&\n \"service\" in entry &&\n !(\"$fabric\" in entry)\n );\n}\n\n/**\n * FabricCommander - Convenient wrapper for creating multi-command CLIs\n *\n * Creates a Commander program with multiple service commands in a single call.\n *\n * @example\n * ```typescript\n * // Array form - simple list of services\n * const cli = new FabricCommander([greetService, farewellService]);\n * cli.parse();\n *\n * // Config form - with description and version\n * const cli = new FabricCommander({\n * name: \"my-cli\",\n * description: \"My CLI application\",\n * version: \"1.0.0\",\n * services: [greetService, farewellService],\n * });\n * cli.parse();\n *\n * // With inline service definitions\n * const cli = new FabricCommander({\n * description: \"My CLI\",\n * version: \"1.0.0\",\n * services: [\n * existingService,\n * {\n * alias: \"greet\",\n * description: \"Greet a user\",\n * input: { name: { type: String } },\n * service: ({ name }) => `Hello, ${name}!`,\n * },\n * ],\n * });\n * cli.parse();\n * ```\n */\nexport class FabricCommander {\n /** The underlying Commander Command instance */\n public readonly command: Command;\n\n constructor(config: ServiceEntry[] | FabricCommanderConfig) {\n this.command = new Command();\n\n // Normalize config\n const normalizedConfig: FabricCommanderConfig = isServicesArray(config)\n ? { services: config }\n : config;\n\n const {\n description,\n name,\n onComplete,\n onError,\n onFatal,\n onMessage,\n services,\n version,\n } = normalizedConfig;\n\n // Set program metadata\n if (name) {\n this.command.name(name);\n }\n if (version) {\n this.command.version(version);\n }\n if (description) {\n this.command.description(description);\n }\n\n // Register each service as a command\n for (const entry of services) {\n if (isInlineDefinition(entry)) {\n // Inline service definition\n fabricCommand({\n alias: entry.alias,\n description: entry.description,\n input: entry.input,\n onComplete,\n onError,\n onFatal,\n onMessage,\n program: this.command,\n service: entry.service,\n });\n } else {\n // Pre-instantiated Service\n fabricCommand({\n onComplete,\n onError,\n onFatal,\n onMessage,\n program: this.command,\n service: entry,\n });\n }\n }\n }\n\n /**\n * Parse command-line arguments\n * Delegates to Commander's parse method\n */\n parse(argv?: readonly string[]): this {\n this.command.parse(argv);\n return this;\n }\n\n /**\n * Parse command-line arguments asynchronously\n * Delegates to Commander's parseAsync method\n */\n async parseAsync(argv?: readonly string[]): Promise<this> {\n await this.command.parseAsync(argv);\n return this;\n }\n}\n"],"names":["toKebabCase","isTypedArrayType","isBooleanType"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/commander/createCommanderOptions.ts","../../../../../src/constants.ts","../../../../../src/resolve-date.ts","../../../../../src/resolve.ts","../../../../../src/service.ts","../../../../../src/resolveService.ts","../../../../../src/commander/parseCommanderOptions.ts","../../../../../src/commander/fabricCommand.ts","../../../../../src/commander/FabricCommander.ts"],"sourcesContent":["// Create Commander.js options from service config\n\nimport { Option } from \"commander\";\n\nimport type { ConversionType, InputFieldDefinition } from \"../types.js\";\nimport type {\n CommanderOptionOverride,\n CreateCommanderOptionsConfig,\n CreateCommanderOptionsResult,\n} from \"./types.js\";\n\n/**\n * Convert camelCase to kebab-case\n */\nfunction toKebabCase(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\n/**\n * Check if a type is a typed array (e.g., [String], [Number])\n */\nfunction isTypedArrayType(type: ConversionType): boolean {\n if (!Array.isArray(type)) {\n return false;\n }\n if (type.length === 0) {\n return true; // [] is untyped array\n }\n if (type.length !== 1) {\n return false;\n }\n const element = type[0];\n return (\n element === Boolean ||\n element === Number ||\n element === String ||\n element === Object ||\n element === \"boolean\" ||\n element === \"number\" ||\n element === \"string\" ||\n element === \"object\" ||\n element === \"\" ||\n (typeof element === \"object\" &&\n element !== null &&\n !(element instanceof RegExp) &&\n Object.keys(element as Record<string, unknown>).length === 0)\n );\n}\n\n/**\n * Check if a type represents a boolean\n */\nfunction isBooleanType(type: ConversionType): boolean {\n return type === Boolean || type === \"boolean\";\n}\n\n/**\n * Check if a type is variadic (array-like)\n */\nfunction isVariadicType(type: ConversionType): boolean {\n if (type === Array || type === \"array\") {\n return true;\n }\n return isTypedArrayType(type);\n}\n\n/**\n * Get default description for a field\n */\nfunction getDescription(\n fieldName: string,\n definition: InputFieldDefinition,\n override?: CommanderOptionOverride,\n): string {\n if (override?.description) {\n return override.description;\n }\n if (definition.description) {\n return definition.description;\n }\n return fieldName;\n}\n\n/**\n * Build the flags string for an option\n */\nfunction buildFlags(\n fieldName: string,\n definition: InputFieldDefinition,\n override?: CommanderOptionOverride,\n): string {\n if (override?.flags) {\n return override.flags;\n }\n\n // Priority: override.long > definition.flag > toKebabCase(fieldName)\n const long = override?.long ?? definition.flag ?? toKebabCase(fieldName);\n // Priority: override.short > definition.letter\n const short = override?.short ?? definition.letter;\n const isBoolean = isBooleanType(definition.type);\n const isVariadic = isVariadicType(definition.type);\n const isRequired =\n definition.required !== false && definition.default === undefined;\n\n let flags = \"\";\n if (short) {\n flags += `-${short}, `;\n }\n flags += `--${long}`;\n\n if (!isBoolean) {\n if (isVariadic) {\n // Variadic: can take multiple values\n if (isRequired) {\n flags += ` <${fieldName}...>`;\n } else {\n flags += ` [${fieldName}...]`;\n }\n } else {\n // Scalar value\n if (isRequired) {\n flags += ` <${fieldName}>`;\n } else {\n flags += ` [${fieldName}]`;\n }\n }\n }\n\n return flags;\n}\n\n/**\n * Create a Commander Option from a field definition\n */\nfunction createOption(\n fieldName: string,\n definition: InputFieldDefinition,\n override?: CommanderOptionOverride,\n): Option {\n const flags = buildFlags(fieldName, definition, override);\n const description = getDescription(fieldName, definition, override);\n\n const option = new Option(flags, description);\n\n // Set default value if provided\n if (definition.default !== undefined) {\n option.default(definition.default);\n }\n\n // Hide from help if specified\n if (override?.hidden) {\n option.hideHelp();\n }\n\n return option;\n}\n\n/**\n * Create Commander.js Option objects from a service config\n *\n * @param input - The input field definitions from a service config\n * @param config - Optional configuration for excluding fields or overriding options\n * @returns An object containing an array of Commander Option objects\n *\n * @example\n * ```typescript\n * const handler = createService({\n * input: {\n * name: { type: String, description: \"User name\" },\n * age: { type: Number, default: 25 },\n * verbose: { type: Boolean },\n * },\n * service: (input) => input,\n * });\n *\n * const { options } = createCommanderOptions(handler.input);\n * options.forEach(opt => command.addOption(opt));\n * ```\n */\nexport function createCommanderOptions(\n input?: Record<string, InputFieldDefinition>,\n config: CreateCommanderOptionsConfig = {},\n): CreateCommanderOptionsResult {\n if (!input) {\n return { options: [] };\n }\n\n const { exclude = [], overrides = {} } = config;\n const options: Option[] = [];\n\n for (const [fieldName, definition] of Object.entries(input)) {\n // Skip excluded fields\n if (exclude.includes(fieldName)) {\n continue;\n }\n\n const override = overrides[fieldName];\n const option = createOption(fieldName, definition, override);\n options.push(option);\n\n // For boolean fields, also create a --no-<flag> option for negation\n // Commander.js requires separate options for --flag and --no-flag\n if (isBooleanType(definition.type) && !override?.flags) {\n const long = override?.long ?? definition.flag ?? toKebabCase(fieldName);\n const negateOption = new Option(`--no-${long}`, `Disable ${fieldName}`);\n // Hide the negatable option from help to avoid clutter\n negateOption.hideHelp();\n options.push(negateOption);\n }\n }\n\n return { options };\n}\n","/**\n * Meta-modeling Constants\n */\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Root organizational unit */\nexport const APEX = \"@\";\n\n/** Fabric version - used to identify pre-instantiated Services */\nexport const FABRIC_VERSION = \"0.1.0\";\n\n/** Composite key separator */\nexport const SEPARATOR = \"#\";\n\n/** System-level models that describe other models */\nexport const SYSTEM_MODELS = [\"context\", \"field\", \"model\"] as const;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type SystemModel = (typeof SYSTEM_MODELS)[number];\n","/**\n * Date Type Conversion for @jaypie/fabric\n *\n * Adds Date as a supported type in the fabric type system.\n * Follows the same conversion patterns as String, Number, Boolean.\n */\n\nimport { BadRequestError } from \"@jaypie/errors\";\n\n/**\n * Check if a value is a valid Date\n */\nexport function isValidDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime());\n}\n\n/**\n * Convert a value to a Date\n *\n * Supported inputs:\n * - Date: returned as-is (validated)\n * - Number: treated as Unix timestamp (milliseconds)\n * - String: parsed via Date constructor (ISO 8601, etc.)\n * - Object with value property: unwrapped and converted\n *\n * @throws BadRequestError if value cannot be converted to valid Date\n */\nexport function fabricDate(value: unknown): Date {\n // Already a Date\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) {\n throw new BadRequestError(\"Invalid Date value\");\n }\n return value;\n }\n\n // Null/undefined\n if (value === null || value === undefined) {\n throw new BadRequestError(\"Cannot convert null or undefined to Date\");\n }\n\n // Object with value property (fabric pattern)\n if (typeof value === \"object\" && value !== null && \"value\" in value) {\n return fabricDate((value as { value: unknown }).value);\n }\n\n // Number (timestamp in milliseconds)\n if (typeof value === \"number\") {\n if (Number.isNaN(value)) {\n throw new BadRequestError(\"Cannot convert NaN to Date\");\n }\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new BadRequestError(`Cannot convert ${value} to Date`);\n }\n return date;\n }\n\n // String (ISO 8601 or parseable format)\n if (typeof value === \"string\") {\n // Empty string is invalid\n if (value.trim() === \"\") {\n throw new BadRequestError(\"Cannot convert empty string to Date\");\n }\n\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new BadRequestError(`Cannot convert \"${value}\" to Date`);\n }\n return date;\n }\n\n // Boolean cannot be converted to Date\n if (typeof value === \"boolean\") {\n throw new BadRequestError(\"Cannot convert boolean to Date\");\n }\n\n // Arrays - attempt single element extraction\n if (Array.isArray(value)) {\n if (value.length === 1) {\n return fabricDate(value[0]);\n }\n throw new BadRequestError(\n `Cannot convert array with ${value.length} elements to Date`,\n );\n }\n\n throw new BadRequestError(`Cannot convert ${typeof value} to Date`);\n}\n\n/**\n * Resolve a value from a Date to another type\n *\n * @param value - Date to convert\n * @param targetType - Target type (String, Number)\n */\nexport function resolveFromDate(\n value: Date,\n targetType: typeof Number | typeof String,\n): number | string {\n if (!isValidDate(value)) {\n throw new BadRequestError(\"Invalid Date value\");\n }\n\n if (targetType === String) {\n return value.toISOString();\n }\n\n if (targetType === Number) {\n return value.getTime();\n }\n\n throw new BadRequestError(`Cannot convert Date to ${targetType}`);\n}\n\n/**\n * Date type constant for use in fabricService input definitions\n *\n * Usage:\n * ```typescript\n * const handler = fabricService({\n * input: {\n * startDate: { type: Date },\n * endDate: { type: Date, default: undefined }\n * }\n * });\n * ```\n */\nexport const DateType = Date;\n\n/**\n * Type guard for Date type in schema definitions\n */\nexport function isDateType(type: unknown): type is typeof Date {\n return type === Date;\n}\n","// Fabric functions for @jaypie/fabric\n\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport { fabricDate, isDateType } from \"./resolve-date.js\";\nimport type { ConversionType, TypedArrayType } from \"./types.js\";\n\n/**\n * Try to parse a string as JSON if it looks like JSON\n * Returns the parsed value or the original string if not JSON\n */\nfunction tryParseJson(value: string): unknown {\n const trimmed = value.trim();\n if (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n ) {\n try {\n return JSON.parse(trimmed);\n } catch {\n // Not valid JSON, return original\n return value;\n }\n }\n return value;\n}\n\n/**\n * Unwrap arrays and objects to get to the scalar value\n * - Single-element arrays unwrap to their element\n * - Objects with value property unwrap to that value\n * - Recursively unwraps nested structures\n */\nfunction unwrapToScalar(value: unknown): unknown {\n if (value === undefined || value === null) {\n return value;\n }\n\n // Unwrap single-element arrays\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return undefined;\n }\n if (value.length === 1) {\n return unwrapToScalar(value[0]);\n }\n throw new BadRequestError(\"Cannot convert multi-value array to scalar\");\n }\n\n // Unwrap objects with value property\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n return unwrapToScalar(obj.value);\n }\n throw new BadRequestError(\"Object must have a value attribute\");\n }\n\n return value;\n}\n\n/**\n * Prepare a value for scalar conversion by parsing JSON strings and unwrapping\n */\nfunction prepareForScalarConversion(value: unknown): unknown {\n if (value === undefined || value === null) {\n return value;\n }\n\n // Try to parse JSON strings\n if (typeof value === \"string\") {\n const parsed = tryParseJson(value);\n if (parsed !== value) {\n // Successfully parsed, unwrap the result\n return unwrapToScalar(parsed);\n }\n return value;\n }\n\n // Unwrap arrays and objects\n if (Array.isArray(value) || typeof value === \"object\") {\n return unwrapToScalar(value);\n }\n\n return value;\n}\n\n/**\n * Convert a value to a boolean\n * - Arrays, objects, and JSON strings are unwrapped first\n * - String \"true\" becomes true\n * - String \"false\" becomes false\n * - Strings that parse to numbers: positive = true, zero or negative = false\n * - Numbers: positive = true, zero or negative = false\n * - Boolean passes through\n */\nexport function fabricBoolean(value: unknown): boolean | undefined {\n // Prepare value by parsing JSON and unwrapping arrays/objects\n const prepared = prepareForScalarConversion(value);\n\n if (prepared === undefined || prepared === null) {\n return undefined;\n }\n\n if (typeof prepared === \"boolean\") {\n return prepared;\n }\n\n if (typeof prepared === \"string\") {\n if (prepared === \"\") {\n return undefined;\n }\n const lower = prepared.toLowerCase();\n if (lower === \"true\") {\n return true;\n }\n if (lower === \"false\") {\n return false;\n }\n // Try to parse as number\n const num = parseFloat(prepared);\n if (isNaN(num)) {\n throw new BadRequestError(`Cannot convert \"${prepared}\" to Boolean`);\n }\n return num > 0;\n }\n\n if (typeof prepared === \"number\") {\n if (isNaN(prepared)) {\n throw new BadRequestError(\"Cannot convert NaN to Boolean\");\n }\n return prepared > 0;\n }\n\n throw new BadRequestError(`Cannot convert ${typeof prepared} to Boolean`);\n}\n\n/**\n * Convert a value to a number\n * - Arrays, objects, and JSON strings are unwrapped first\n * - String \"\" becomes undefined\n * - String \"true\" becomes 1\n * - String \"false\" becomes 0\n * - Strings that parse to numbers use those values\n * - Strings that parse to NaN throw BadRequestError\n * - Boolean true becomes 1, false becomes 0\n * - Number passes through\n */\nexport function fabricNumber(value: unknown): number | undefined {\n // Prepare value by parsing JSON and unwrapping arrays/objects\n const prepared = prepareForScalarConversion(value);\n\n if (prepared === undefined || prepared === null) {\n return undefined;\n }\n\n if (typeof prepared === \"number\") {\n if (isNaN(prepared)) {\n throw new BadRequestError(\"Cannot convert NaN to Number\");\n }\n return prepared;\n }\n\n if (typeof prepared === \"boolean\") {\n return prepared ? 1 : 0;\n }\n\n if (typeof prepared === \"string\") {\n if (prepared === \"\") {\n return undefined;\n }\n const lower = prepared.toLowerCase();\n if (lower === \"true\") {\n return 1;\n }\n if (lower === \"false\") {\n return 0;\n }\n const num = parseFloat(prepared);\n if (isNaN(num)) {\n throw new BadRequestError(`Cannot convert \"${prepared}\" to Number`);\n }\n return num;\n }\n\n throw new BadRequestError(`Cannot convert ${typeof prepared} to Number`);\n}\n\n/**\n * Convert a value to a string\n * - Arrays, objects, and JSON strings are unwrapped first\n * - String \"\" becomes undefined\n * - Boolean true becomes \"true\", false becomes \"false\"\n * - Number converts to string representation\n * - String passes through\n */\nexport function fabricString(value: unknown): string | undefined {\n // Prepare value by parsing JSON and unwrapping arrays/objects\n const prepared = prepareForScalarConversion(value);\n\n if (prepared === undefined || prepared === null) {\n return undefined;\n }\n\n if (typeof prepared === \"string\") {\n if (prepared === \"\") {\n return undefined;\n }\n return prepared;\n }\n\n if (typeof prepared === \"boolean\") {\n return prepared ? \"true\" : \"false\";\n }\n\n if (typeof prepared === \"number\") {\n if (isNaN(prepared)) {\n throw new BadRequestError(\"Cannot convert NaN to String\");\n }\n return String(prepared);\n }\n\n throw new BadRequestError(`Cannot convert ${typeof prepared} to String`);\n}\n\n/**\n * Convert a value to an array\n * - Non-arrays become arrays containing that value\n * - Arrays of a single value become that value (unwrapped)\n * - Multi-value arrays throw BadRequestError\n * - undefined/null become undefined\n */\nexport function fabricArray(value: unknown): unknown[] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n // Arrays pass through (single-element unwrapping happens when converting FROM array)\n return value;\n }\n\n // Non-arrays become single-element arrays\n return [value];\n}\n\n/**\n * Resolve a value from an array to a scalar\n * - Single-element arrays become that element\n * - Multi-element arrays throw BadRequestError\n * - Non-arrays pass through\n */\nexport function resolveFromArray(value: unknown): unknown {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return undefined;\n }\n if (value.length === 1) {\n return value[0];\n }\n throw new BadRequestError(\"Cannot convert multi-value array to scalar\");\n }\n\n return value;\n}\n\n/**\n * Convert a value to an object with a value property\n * - Scalars become { value: scalar }\n * - Arrays become { value: array }\n * - Objects with a value attribute pass through\n * - Objects without a value attribute throw BadRequestError\n * - undefined/null become undefined\n */\nexport function fabricObject(value: unknown): { value: unknown } | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n // Check if already an object (but not an array)\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n return obj as { value: unknown };\n }\n throw new BadRequestError(\"Object must have a value attribute\");\n }\n\n // Scalars and arrays become { value: ... }\n return { value };\n}\n\n/**\n * Resolve a value from an object to its value property\n * - Objects with a value property return that value\n * - Objects without a value throw BadRequestError\n * - Scalars pass through\n */\nexport function resolveFromObject(value: unknown): unknown {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n if (\"value\" in obj) {\n return obj.value;\n }\n throw new BadRequestError(\"Object must have a value attribute\");\n }\n\n return value;\n}\n\n/**\n * Check if a type is a typed array (e.g., [String], [Number], [], etc.)\n */\nfunction isTypedArrayType(type: ConversionType): type is TypedArrayType {\n return Array.isArray(type);\n}\n\n/**\n * Split a string on comma or tab delimiters for typed array conversion.\n * Only splits if the string contains commas or tabs.\n * Returns the original value if not a string or no delimiters found.\n */\nfunction splitStringForArray(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n\n // Check for comma or tab delimiters\n if (value.includes(\",\")) {\n return value.split(\",\").map((s) => s.trim());\n }\n if (value.includes(\"\\t\")) {\n return value.split(\"\\t\").map((s) => s.trim());\n }\n\n return value;\n}\n\n/**\n * Try to parse a string as JSON for array context.\n * Returns parsed value if it's an array, otherwise returns original.\n */\nfunction tryParseJsonArray(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n\n const trimmed = value.trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Not valid JSON, fall through\n }\n }\n\n return value;\n}\n\n/**\n * Get the element type from a typed array type\n * Returns undefined for untyped arrays ([])\n */\nfunction getArrayElementType(\n type: TypedArrayType,\n): \"boolean\" | \"number\" | \"object\" | \"string\" | undefined {\n if (type.length === 0) {\n return undefined; // Untyped array\n }\n\n const elementType = type[0];\n\n // Handle constructor types\n if (elementType === Boolean) return \"boolean\";\n if (elementType === Number) return \"number\";\n if (elementType === String) return \"string\";\n if (elementType === Object) return \"object\";\n\n // Handle string types\n if (elementType === \"boolean\") return \"boolean\";\n if (elementType === \"number\") return \"number\";\n if (elementType === \"string\") return \"string\";\n if (elementType === \"object\") return \"object\";\n\n // Handle shorthand types\n if (elementType === \"\") return \"string\"; // \"\" shorthand for String\n if (\n typeof elementType === \"object\" &&\n elementType !== null &&\n Object.keys(elementType).length === 0\n ) {\n return \"object\"; // {} shorthand for Object\n }\n\n throw new BadRequestError(\n `Unknown array element type: ${String(elementType)}`,\n );\n}\n\n/**\n * Convert a value to a typed array\n * - Tries to parse JSON arrays first\n * - Splits strings on comma/tab if present\n * - Wraps non-arrays in an array\n * - Converts each element to the specified element type\n */\nfunction fabricTypedArray(\n value: unknown,\n elementType: \"boolean\" | \"number\" | \"object\" | \"string\" | undefined,\n): unknown[] | undefined {\n // Try to parse JSON array first\n let processed = tryParseJsonArray(value);\n\n // If still a string, try to split on comma/tab\n processed = splitStringForArray(processed);\n\n // Convert to array (wraps non-arrays)\n const array = fabricArray(processed);\n\n if (array === undefined) {\n return undefined;\n }\n\n // If no element type specified, return as-is\n if (elementType === undefined) {\n return array;\n }\n\n // Convert each element to the element type\n return array.map((element, index) => {\n try {\n switch (elementType) {\n case \"boolean\":\n return fabricBoolean(element);\n case \"number\":\n return fabricNumber(element);\n case \"object\":\n return fabricObject(element);\n case \"string\":\n return fabricString(element);\n default:\n throw new BadRequestError(`Unknown element type: ${elementType}`);\n }\n } catch (error) {\n if (error instanceof BadRequestError) {\n throw new BadRequestError(\n `Cannot convert array element at index ${index}: ${error.message}`,\n );\n }\n throw error;\n }\n });\n}\n\n/**\n * Fabric a value to the specified type\n */\nexport function fabric(value: unknown, type: ConversionType): unknown {\n // Check for Date type first\n if (isDateType(type)) {\n return fabricDate(value);\n }\n\n // Check for typed array types\n if (isTypedArrayType(type)) {\n const elementType = getArrayElementType(type);\n return fabricTypedArray(value, elementType);\n }\n\n const normalizedType = normalizeType(type);\n\n switch (normalizedType) {\n case \"array\":\n return fabricArray(value);\n case \"boolean\":\n return fabricBoolean(value);\n case \"number\":\n return fabricNumber(value);\n case \"object\":\n return fabricObject(value);\n case \"string\":\n return fabricString(value);\n default:\n throw new BadRequestError(`Unknown type: ${String(type)}`);\n }\n}\n\n/**\n * Normalize type to string representation\n */\nfunction normalizeType(\n type: ConversionType,\n): \"array\" | \"boolean\" | \"number\" | \"object\" | \"string\" {\n if (type === Array || type === \"array\") {\n return \"array\";\n }\n if (type === Boolean || type === \"boolean\") {\n return \"boolean\";\n }\n if (type === Number || type === \"number\") {\n return \"number\";\n }\n if (type === Object || type === \"object\") {\n return \"object\";\n }\n if (type === String || type === \"string\") {\n return \"string\";\n }\n throw new BadRequestError(`Unknown type: ${String(type)}`);\n}\n","// Service for @jaypie/fabric\n\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport { FABRIC_VERSION } from \"./constants.js\";\nimport { fabric } from \"./resolve.js\";\nimport type {\n ConversionType,\n InputFieldDefinition,\n Service,\n ServiceConfig,\n ServiceContext,\n ValidateFunction,\n} from \"./types.js\";\n\n/**\n * Check if a single-element array is a typed array type constructor.\n */\nfunction isTypedArrayConstructor(element: unknown): boolean {\n return (\n element === Boolean ||\n element === Number ||\n element === String ||\n element === Object ||\n element === \"boolean\" ||\n element === \"number\" ||\n element === \"string\" ||\n element === \"object\" ||\n element === \"\" ||\n (typeof element === \"object\" &&\n element !== null &&\n !(element instanceof RegExp) &&\n Object.keys(element as Record<string, unknown>).length === 0)\n );\n}\n\n/**\n * Check if a type is a validated string type (array of string literals and/or RegExp).\n * Distinguishes from typed arrays like [String], [Number], etc.\n */\nfunction isValidatedStringType(\n type: ConversionType,\n): type is Array<string | RegExp> {\n if (!Array.isArray(type)) {\n return false;\n }\n\n // Empty array is untyped array, not validated string\n if (type.length === 0) {\n return false;\n }\n\n // Single-element arrays with type constructors are typed arrays\n if (type.length === 1 && isTypedArrayConstructor(type[0])) {\n return false;\n }\n\n // Check that all elements are strings or RegExp\n return type.every(\n (item) => typeof item === \"string\" || item instanceof RegExp,\n );\n}\n\n/**\n * Check if a type is a validated number type (array of number literals).\n * Distinguishes from typed arrays like [Number], etc.\n */\nfunction isValidatedNumberType(type: ConversionType): type is Array<number> {\n if (!Array.isArray(type)) {\n return false;\n }\n\n // Empty array is untyped array, not validated number\n if (type.length === 0) {\n return false;\n }\n\n // Single-element arrays with type constructors are typed arrays\n if (type.length === 1 && isTypedArrayConstructor(type[0])) {\n return false;\n }\n\n // Check that all elements are numbers\n return type.every((item) => typeof item === \"number\");\n}\n\n/**\n * Parse input string as JSON if it's a string\n */\nfunction parseInput(input: unknown): Record<string, unknown> {\n if (input === undefined || input === null) {\n return {};\n }\n\n if (typeof input === \"string\") {\n if (input === \"\") {\n return {};\n }\n try {\n const parsed = JSON.parse(input);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n throw new BadRequestError(\"Input must be an object\");\n }\n return parsed as Record<string, unknown>;\n } catch (error) {\n if (error instanceof BadRequestError) {\n throw error;\n }\n throw new BadRequestError(\"Invalid JSON input\");\n }\n }\n\n if (typeof input === \"object\" && !Array.isArray(input)) {\n return input as Record<string, unknown>;\n }\n\n throw new BadRequestError(\"Input must be an object or JSON string\");\n}\n\n/**\n * Run validation on a value (supports async validators)\n */\nasync function runValidation(\n value: unknown,\n validate: ValidateFunction | RegExp | Array<unknown>,\n fieldName: string,\n): Promise<void> {\n if (typeof validate === \"function\") {\n const result = await validate(value);\n if (result === false) {\n throw new BadRequestError(`Validation failed for field \"${fieldName}\"`);\n }\n } else if (validate instanceof RegExp) {\n if (typeof value !== \"string\" || !validate.test(value)) {\n throw new BadRequestError(`Validation failed for field \"${fieldName}\"`);\n }\n } else if (Array.isArray(validate)) {\n // Check if value matches any item in the array\n for (const item of validate) {\n if (item instanceof RegExp) {\n if (typeof value === \"string\" && item.test(value)) {\n return; // Match found\n }\n } else if (typeof item === \"function\") {\n try {\n const result = await (item as ValidateFunction)(value);\n if (result !== false) {\n return; // Match found\n }\n } catch {\n // Continue to next item\n }\n } else if (value === item) {\n return; // Scalar match found\n }\n }\n throw new BadRequestError(`Validation failed for field \"${fieldName}\"`);\n }\n}\n\n/**\n * Check if a field is required\n * A field is required unless it has a default OR required is explicitly false\n */\nfunction isFieldRequired(definition: InputFieldDefinition): boolean {\n if (definition.required === false) {\n return false;\n }\n if (definition.default !== undefined) {\n return false;\n }\n return true;\n}\n\n/**\n * Process a single field through conversion and validation\n */\nasync function processField(\n fieldName: string,\n value: unknown,\n definition: InputFieldDefinition,\n): Promise<unknown> {\n // Apply default if value is undefined\n let processedValue = value;\n if (processedValue === undefined && definition.default !== undefined) {\n processedValue = definition.default;\n }\n\n // Determine actual type and validation\n let actualType: ConversionType = definition.type;\n let validation = definition.validate;\n\n // Handle bare RegExp shorthand: /regex/\n if (definition.type instanceof RegExp) {\n actualType = String;\n validation = definition.type; // The RegExp becomes the validation\n }\n // Handle validated string shorthand: [\"value1\", \"value2\"] or [/regex/]\n else if (isValidatedStringType(definition.type)) {\n actualType = String;\n validation = definition.type; // The array becomes the validation\n }\n // Handle validated number shorthand: [1, 2, 3]\n else if (isValidatedNumberType(definition.type)) {\n actualType = Number;\n validation = definition.type; // The array becomes the validation\n }\n\n // Fabric to target type\n const convertedValue = fabric(processedValue, actualType);\n\n // Check if required field is missing\n if (convertedValue === undefined && isFieldRequired(definition)) {\n throw new BadRequestError(`Missing required field \"${fieldName}\"`);\n }\n\n // Run validation if provided\n if (validation !== undefined && convertedValue !== undefined) {\n await runValidation(convertedValue, validation, fieldName);\n }\n\n return convertedValue;\n}\n\n/**\n * Type guard to check if a value is a pre-instantiated Service\n * A Service is a function with the `$fabric` property set by fabricService\n */\nexport function isService<TInput extends Record<string, unknown>, TOutput>(\n value: unknown,\n): value is Service<TInput, TOutput> {\n return typeof value === \"function\" && \"$fabric\" in value;\n}\n\n/**\n * Fabric a service function\n *\n * Service builds a function that initiates a \"controller\" step that:\n * - Parses the input if it is a string to object\n * - Fabrics each input field to its type\n * - Calls the validation function or regular expression or checks the array\n * - Calls the service function and returns the response\n *\n * The returned function has config properties for introspection.\n */\nexport function fabricService<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n>(config: ServiceConfig<TInput, TOutput>): Service<TInput, TOutput> {\n const { input: inputDefinitions, service } = config;\n\n const handler = async (\n rawInput?: Partial<TInput> | string,\n context?: ServiceContext,\n ): Promise<TOutput> => {\n // Parse input (handles string JSON)\n const parsedInput = parseInput(rawInput);\n\n // If no input definitions, pass through to service or return parsed input\n if (!inputDefinitions) {\n if (service) {\n return service(parsedInput as TInput, context);\n }\n return parsedInput as TOutput;\n }\n\n // Process all fields in parallel\n const entries = Object.entries(inputDefinitions);\n const processedValues = await Promise.all(\n entries.map(([fieldName, definition]) =>\n processField(fieldName, parsedInput[fieldName], definition),\n ),\n );\n\n // Build processed input object\n const processedInput: Record<string, unknown> = {};\n entries.forEach(([fieldName], index) => {\n processedInput[fieldName] = processedValues[index];\n });\n\n // Return processed input if no service, otherwise call service\n if (service) {\n return service(processedInput as TInput, context);\n }\n return processedInput as TOutput;\n };\n\n // Attach config properties directly to handler for flat access\n const typedHandler = handler as Service<TInput, TOutput>;\n typedHandler.$fabric = FABRIC_VERSION;\n if (config.alias !== undefined) typedHandler.alias = config.alias;\n if (config.description !== undefined)\n typedHandler.description = config.description;\n if (config.input !== undefined) typedHandler.input = config.input;\n if (config.service !== undefined) typedHandler.service = config.service;\n\n return typedHandler;\n}\n","// Resolve inline service definitions to full Service objects\n\nimport { fabricService, isService } from \"./service.js\";\nimport type {\n InputFieldDefinition,\n Service,\n ServiceFunction,\n} from \"./types.js\";\n\n/**\n * Configuration for resolving a service\n */\nexport interface ResolveServiceConfig<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n> {\n /** Service alias (used as name for adapters) */\n alias?: string;\n /** Service description */\n description?: string;\n /** Input field definitions */\n input?: Record<string, InputFieldDefinition>;\n /** The service - either a pre-instantiated Service or an inline function */\n service: Service<TInput, TOutput> | ServiceFunction<TInput, TOutput>;\n}\n\n/**\n * Resolve a service configuration to a full Service object\n *\n * Supports two patterns:\n * 1. Inline service definition - pass a plain function as `service` along with\n * `alias`, `description`, and `input` in the config\n * 2. Pre-instantiated Service - pass a Service object as `service`\n *\n * When a pre-instantiated Service is passed, config fields act as overrides:\n * - `alias` overrides service.alias\n * - `description` overrides service.description\n * - `input` overrides service.input\n *\n * The original Service is never mutated - a new Service is created when overrides\n * are applied.\n *\n * @example\n * ```typescript\n * // Inline service definition\n * const service = resolveService({\n * alias: \"greet\",\n * description: \"Greet a user\",\n * input: { name: { type: String } },\n * service: ({ name }) => `Hello, ${name}!`,\n * });\n *\n * // Pre-instantiated with override\n * const baseService = fabricService({ alias: \"foo\", service: (x) => x });\n * const overridden = resolveService({\n * alias: \"bar\", // Override alias\n * service: baseService,\n * });\n * ```\n */\nexport function resolveService<\n TInput extends Record<string, unknown> = Record<string, unknown>,\n TOutput = unknown,\n>(config: ResolveServiceConfig<TInput, TOutput>): Service<TInput, TOutput> {\n const { alias, description, input, service } = config;\n\n if (isService<TInput, TOutput>(service)) {\n // Service is pre-instantiated - config fields act as overrides\n // Create new Service with merged properties (config overrides service)\n return fabricService({\n alias: alias ?? service.alias,\n description: description ?? service.description,\n input: input ?? service.input,\n service: service.service,\n });\n }\n\n // Service is an inline function - create Service from config\n return fabricService({\n alias,\n description,\n input,\n service,\n });\n}\n","// Parse Commander.js options back to handler input format\n\nimport { fabricDate, isDateType } from \"../resolve-date.js\";\nimport type { ConversionType } from \"../types.js\";\nimport type { ParseCommanderOptionsConfig } from \"./types.js\";\n\n/**\n * Convert kebab-case to camelCase\n */\nfunction toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, char) => char.toUpperCase());\n}\n\n/**\n * Convert camelCase to kebab-case\n */\nfunction toKebabCase(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\n/**\n * Check if a type is a typed array (e.g., [String], [Number])\n */\nfunction isTypedArrayType(type: ConversionType): boolean {\n if (!Array.isArray(type)) {\n return false;\n }\n if (type.length === 0) {\n return true; // [] is untyped array\n }\n if (type.length !== 1) {\n return false;\n }\n const element = type[0];\n return (\n element === Boolean ||\n element === Number ||\n element === String ||\n element === Object ||\n element === \"boolean\" ||\n element === \"number\" ||\n element === \"string\" ||\n element === \"object\" ||\n element === \"\" ||\n (typeof element === \"object\" &&\n element !== null &&\n !(element instanceof RegExp) &&\n Object.keys(element as Record<string, unknown>).length === 0)\n );\n}\n\n/**\n * Check if a type represents a number (scalar or validated)\n */\nfunction isNumberType(type: ConversionType): boolean {\n if (type === Number || type === \"number\") {\n return true;\n }\n // Check for validated number type [1, 2, 3]\n if (Array.isArray(type) && type.length > 0) {\n // If it's not a typed array and all elements are numbers, it's a validated number\n if (\n !isTypedArrayType(type) &&\n type.every((item) => typeof item === \"number\")\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a type represents a boolean\n */\nfunction isBooleanType(type: ConversionType): boolean {\n return type === Boolean || type === \"boolean\";\n}\n\n/**\n * Check if a type is an array type (Array, \"array\", or typed array)\n */\nfunction isArrayType(type: ConversionType): boolean {\n if (type === Array || type === \"array\") {\n return true;\n }\n return isTypedArrayType(type);\n}\n\n/**\n * Check if a type is an object type\n */\nfunction isObjectType(type: ConversionType): boolean {\n return type === Object || type === \"object\";\n}\n\n/**\n * Convert a single value based on its target type\n */\nfunction convertValue(value: unknown, type: ConversionType): unknown {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n // Boolean type - Commander handles this automatically\n if (isBooleanType(type)) {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"1\" || lower === \"yes\") {\n return true;\n }\n if (lower === \"false\" || lower === \"0\" || lower === \"no\") {\n return false;\n }\n }\n return Boolean(value);\n }\n\n // Number type\n if (isNumberType(type)) {\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n const num = Number(value);\n if (!isNaN(num)) {\n return num;\n }\n }\n return value;\n }\n\n // Date type\n if (isDateType(type)) {\n if (value instanceof Date) {\n return value;\n }\n try {\n return fabricDate(value);\n } catch {\n // If conversion fails, return as-is and let createService handle it\n return value;\n }\n }\n\n // Array types - handle variadic options\n if (isArrayType(type)) {\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n // Try to parse as JSON first\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Not JSON, check for comma or tab separated\n if (value.includes(\",\")) {\n return value.split(\",\").map((s) => s.trim());\n }\n if (value.includes(\"\\t\")) {\n return value.split(\"\\t\").map((s) => s.trim());\n }\n }\n // Single value becomes array\n return [value];\n }\n return [value];\n }\n\n // Object type - try to parse JSON\n if (isObjectType(type)) {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n !Array.isArray(parsed)\n ) {\n return parsed;\n }\n } catch {\n // Not valid JSON\n }\n }\n return value;\n }\n\n // String type (default) - just return as-is\n return value;\n}\n\n/**\n * Parse Commander.js options back to handler input format\n *\n * This function converts the options object from Commander.js (which uses\n * kebab-case converted to camelCase) back to the expected handler input\n * format with proper type conversion based on the input definitions.\n *\n * @param options - The options object from Commander.js (program.opts())\n * @param config - Configuration including input field definitions\n * @returns An object suitable for passing to a service\n *\n * @example\n * ```typescript\n * const handler = createService({\n * input: {\n * userName: { type: String },\n * age: { type: Number },\n * tags: { type: [String] },\n * },\n * service: (input) => input,\n * });\n *\n * program.action((options) => {\n * const input = parseCommanderOptions(options, {\n * input: handler.input,\n * });\n * await handler(input);\n * });\n * ```\n */\nexport function parseCommanderOptions(\n options: Record<string, unknown>,\n config: ParseCommanderOptionsConfig = {},\n): Record<string, unknown> {\n const { exclude = [], input: inputDefinitions } = config;\n const result: Record<string, unknown> = {};\n\n // Build reverse mapping from flag name (camelCase) to field name\n // This handles cases where input.flag overrides the default flag name\n const flagToFieldMap = new Map<string, string>();\n if (inputDefinitions) {\n for (const [fieldName, definition] of Object.entries(inputDefinitions)) {\n if (definition.flag) {\n // Custom flag: map flag (as camelCase) -> fieldName\n const flagCamelCase = toCamelCase(definition.flag);\n flagToFieldMap.set(flagCamelCase, fieldName);\n } else {\n // Default: kebab-case of fieldName -> fieldName\n const defaultFlag = toKebabCase(fieldName);\n const defaultFlagCamelCase = toCamelCase(defaultFlag);\n flagToFieldMap.set(defaultFlagCamelCase, fieldName);\n }\n }\n }\n\n for (const [key, value] of Object.entries(options)) {\n // Skip excluded fields\n if (exclude.includes(key)) {\n continue;\n }\n\n // Convert kebab-case Commander option to camelCase\n const keyCamelCase = toCamelCase(key);\n\n // Look up the actual field name from our mapping\n const fieldName = flagToFieldMap.get(keyCamelCase) ?? keyCamelCase;\n\n // Skip if excluded after resolution\n if (exclude.includes(fieldName)) {\n continue;\n }\n\n // Get field definition for type conversion\n const definition = inputDefinitions?.[fieldName];\n\n if (definition) {\n // Convert based on type definition\n result[fieldName] = convertValue(value, definition.type);\n } else {\n // No definition, pass through as-is\n result[fieldName] = value;\n }\n }\n\n return result;\n}\n","// Fabric a service as a Commander command\n\nimport { resolveService } from \"../resolveService.js\";\nimport type { Message, ServiceContext } from \"../types.js\";\nimport { createCommanderOptions } from \"./createCommanderOptions.js\";\nimport { parseCommanderOptions } from \"./parseCommanderOptions.js\";\nimport type { FabricCommandConfig, FabricCommandResult } from \"./types.js\";\n\n/**\n * Fabric a service as a Commander.js command\n *\n * This function creates a command from a service, automatically:\n * - Creating the command with the service's alias (or custom name)\n * - Adding a description from the service's description (or custom)\n * - Converting input definitions to Commander options\n * - Wiring up the action to call the service with parsed input\n *\n * Error handling:\n * - Services can call context.onError() for recoverable errors\n * - Services can call context.onFatal() for fatal errors\n * - Any error that throws out of the service is treated as fatal\n *\n * @param config - Configuration including service, program, and optional overrides\n * @returns An object containing the created command\n *\n * @example\n * ```typescript\n * import { Command } from \"commander\";\n * import { fabricService } from \"@jaypie/fabric\";\n * import { fabricCommand } from \"@jaypie/fabric/commander\";\n *\n * const myService = fabricService({\n * alias: \"greet\",\n * description: \"Greet a user\",\n * input: {\n * userName: { type: String, description: \"User name\" },\n * loud: { type: Boolean, description: \"Shout greeting\" },\n * },\n * service: ({ userName, loud }) => {\n * const greeting = `Hello, ${userName}!`;\n * return loud ? greeting.toUpperCase() : greeting;\n * },\n * });\n *\n * const program = new Command();\n * fabricCommand({ program, service: myService });\n * program.parse();\n * ```\n */\n\nexport function fabricCommand({\n alias,\n description,\n exclude,\n input,\n name,\n onComplete,\n onError,\n onFatal,\n onMessage,\n overrides,\n program,\n service: serviceOrFunction,\n}: FabricCommandConfig): FabricCommandResult {\n // Resolve inline service or apply overrides to pre-instantiated service\n const service = resolveService({\n alias,\n description,\n input,\n service: serviceOrFunction,\n });\n\n // Determine command name (priority: name > service.alias > \"command\")\n const commandName = name ?? service.alias ?? \"command\";\n\n // Determine command description\n const commandDescription = service.description;\n\n // Create the command\n const command = program.command(commandName);\n\n // Add description if available\n if (commandDescription) {\n command.description(commandDescription);\n }\n\n // Create and add options from service input\n if (service.input) {\n const { options } = createCommanderOptions(service.input, {\n exclude,\n overrides,\n });\n options.forEach((opt) => command.addOption(opt));\n }\n\n // Wire up the action\n command.action(async (options): Promise<void> => {\n // Parse Commander options to service input format\n const input = parseCommanderOptions(options, {\n exclude,\n input: service.input,\n });\n\n // Create context callbacks that wrap the registration callbacks with error swallowing\n // Callback failures should never halt service execution\n const sendMessage = onMessage\n ? async (message: Message): Promise<void> => {\n try {\n await onMessage(message);\n } catch {\n // Swallow errors - messaging failures should not halt execution\n }\n }\n : undefined;\n\n const contextOnError = onError\n ? async (error: unknown): Promise<void> => {\n try {\n await onError(error);\n } catch {\n // Swallow errors - callback failures should not halt execution\n }\n }\n : undefined;\n\n const contextOnFatal = onFatal\n ? async (error: unknown): Promise<void> => {\n try {\n await onFatal(error);\n } catch {\n // Swallow errors - callback failures should not halt execution\n }\n }\n : undefined;\n\n // Create context for the service\n const context: ServiceContext = {\n onError: contextOnError,\n onFatal: contextOnFatal,\n sendMessage,\n };\n\n try {\n // Call the service with context\n const response = await service(input, context);\n\n // Call onComplete callback if provided\n if (onComplete) {\n await onComplete(response);\n }\n } catch (error) {\n // Any error that escapes the service is treated as fatal\n // Services should catch recoverable errors and call context.onError() explicitly\n if (onFatal) {\n await onFatal(error);\n } else if (onError) {\n // Fall back to onError if onFatal not provided\n await onError(error);\n } else {\n // No error callbacks provided, re-throw\n throw error;\n }\n }\n });\n\n return { command, onMessage };\n}\n","// FabricCommander - Convenient wrapper for multi-command CLIs\n\nimport { Command } from \"commander\";\n\nimport type {\n InputFieldDefinition,\n Service,\n ServiceFunction,\n} from \"../types.js\";\nimport { fabricCommand } from \"./fabricCommand.js\";\nimport type {\n OnCompleteCallback,\n OnErrorCallback,\n OnFatalCallback,\n OnMessageCallback,\n} from \"./types.js\";\n\n/**\n * Inline service definition for FabricCommander\n * Allows defining services directly in the services array\n */\nexport interface InlineServiceDefinition {\n /** Service alias (used as command name) */\n alias: string;\n /** Service description */\n description?: string;\n /** Input field definitions */\n input?: Record<string, InputFieldDefinition>;\n /** The service function */\n service: ServiceFunction<Record<string, unknown>, unknown>;\n}\n\n/**\n * Service entry - either a pre-instantiated Service or an inline definition\n */\nexport type ServiceEntry = Service | InlineServiceDefinition;\n\n/**\n * Configuration for FabricCommander\n */\nexport interface FabricCommanderConfig {\n /** CLI description */\n description?: string;\n /** CLI name (defaults to process.argv script name) */\n name?: string;\n /** Default callback called when any command completes successfully */\n onComplete?: OnCompleteCallback;\n /** Default callback called when any command encounters an error */\n onError?: OnErrorCallback;\n /** Default callback called when any command encounters a fatal error */\n onFatal?: OnFatalCallback;\n /** Default callback called to report progress messages */\n onMessage?: OnMessageCallback;\n /** Services to register as commands */\n services: ServiceEntry[];\n /** CLI version */\n version?: string;\n}\n\n/**\n * Type guard to check if config is an array of services\n */\nfunction isServicesArray(\n config: ServiceEntry[] | FabricCommanderConfig,\n): config is ServiceEntry[] {\n return Array.isArray(config);\n}\n\n/**\n * Type guard to check if a service entry is an inline definition\n */\nfunction isInlineDefinition(\n entry: ServiceEntry,\n): entry is InlineServiceDefinition {\n return (\n typeof entry === \"object\" &&\n entry !== null &&\n \"alias\" in entry &&\n \"service\" in entry &&\n !(\"$fabric\" in entry)\n );\n}\n\n/**\n * FabricCommander - Convenient wrapper for creating multi-command CLIs\n *\n * Creates a Commander program with multiple service commands in a single call.\n *\n * @example\n * ```typescript\n * // Array form - simple list of services\n * const cli = new FabricCommander([greetService, farewellService]);\n * cli.parse();\n *\n * // Config form - with description and version\n * const cli = new FabricCommander({\n * name: \"my-cli\",\n * description: \"My CLI application\",\n * version: \"1.0.0\",\n * services: [greetService, farewellService],\n * });\n * cli.parse();\n *\n * // With inline service definitions\n * const cli = new FabricCommander({\n * description: \"My CLI\",\n * version: \"1.0.0\",\n * services: [\n * existingService,\n * {\n * alias: \"greet\",\n * description: \"Greet a user\",\n * input: { name: { type: String } },\n * service: ({ name }) => `Hello, ${name}!`,\n * },\n * ],\n * });\n * cli.parse();\n * ```\n */\nexport class FabricCommander {\n /** The underlying Commander Command instance */\n public readonly command: Command;\n\n constructor(config: ServiceEntry[] | FabricCommanderConfig) {\n this.command = new Command();\n\n // Normalize config\n const normalizedConfig: FabricCommanderConfig = isServicesArray(config)\n ? { services: config }\n : config;\n\n const {\n description,\n name,\n onComplete,\n onError,\n onFatal,\n onMessage,\n services,\n version,\n } = normalizedConfig;\n\n // Set program metadata\n if (name) {\n this.command.name(name);\n }\n if (version) {\n this.command.version(version);\n }\n if (description) {\n this.command.description(description);\n }\n\n // Register each service as a command\n for (const entry of services) {\n if (isInlineDefinition(entry)) {\n // Inline service definition\n fabricCommand({\n alias: entry.alias,\n description: entry.description,\n input: entry.input,\n onComplete,\n onError,\n onFatal,\n onMessage,\n program: this.command,\n service: entry.service,\n });\n } else {\n // Pre-instantiated Service\n fabricCommand({\n onComplete,\n onError,\n onFatal,\n onMessage,\n program: this.command,\n service: entry,\n });\n }\n }\n }\n\n /**\n * Parse command-line arguments\n * Delegates to Commander's parse method\n */\n parse(argv?: readonly string[]): this {\n this.command.parse(argv);\n return this;\n }\n\n /**\n * Parse command-line arguments asynchronously\n * Delegates to Commander's parseAsync method\n */\n async parseAsync(argv?: readonly string[]): Promise<this> {\n await this.command.parseAsync(argv);\n return this;\n }\n}\n"],"names":["toKebabCase","isTypedArrayType","isBooleanType"],"mappings":"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"}