@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.
- package/dist/cjs/ServiceSuite.d.ts +4 -0
- package/dist/cjs/commander/index.cjs +7 -7
- package/dist/cjs/commander/index.cjs.map +1 -1
- package/dist/cjs/data/index.cjs.map +1 -1
- package/dist/cjs/http/index.cjs.map +1 -1
- package/dist/cjs/index.cjs +16 -7
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/lambda/index.cjs +7 -7
- package/dist/cjs/lambda/index.cjs.map +1 -1
- package/dist/cjs/llm/index.cjs +7 -7
- package/dist/cjs/llm/index.cjs.map +1 -1
- package/dist/cjs/mcp/FabricMcpServer.d.ts +81 -0
- package/dist/cjs/mcp/index.cjs +187 -7
- package/dist/cjs/mcp/index.cjs.map +1 -1
- package/dist/cjs/mcp/index.d.ts +3 -1
- package/dist/cjs/mcp/types.d.ts +66 -0
- package/dist/cjs/service.d.ts +5 -0
- package/dist/esm/commander/index.js +7 -7
- package/dist/esm/commander/index.js.map +1 -1
- package/dist/esm/data/index.js.map +1 -1
- package/dist/esm/http/index.js.map +1 -1
- package/dist/esm/index.js +16 -8
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lambda/index.js +7 -7
- package/dist/esm/lambda/index.js.map +1 -1
- package/dist/esm/llm/index.js +7 -7
- package/dist/esm/llm/index.js.map +1 -1
- package/dist/esm/mcp/FabricMcpServer.d.ts +81 -0
- package/dist/esm/mcp/index.d.ts +3 -1
- package/dist/esm/mcp/index.js +185 -8
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/types.d.ts +66 -0
- package/package.json +1 -1
package/dist/cjs/index.cjs
CHANGED
|
@@ -1452,6 +1452,13 @@ async function processField(fieldName, value, definition) {
|
|
|
1452
1452
|
}
|
|
1453
1453
|
return convertedValue;
|
|
1454
1454
|
}
|
|
1455
|
+
/**
|
|
1456
|
+
* Type guard to check if a value is a pre-instantiated Service
|
|
1457
|
+
* A Service is a function with the `$fabric` property set by fabricService
|
|
1458
|
+
*/
|
|
1459
|
+
function isService(value) {
|
|
1460
|
+
return typeof value === "function" && "$fabric" in value;
|
|
1461
|
+
}
|
|
1455
1462
|
/**
|
|
1456
1463
|
* Fabric a service function
|
|
1457
1464
|
*
|
|
@@ -1504,13 +1511,6 @@ function fabricService(config) {
|
|
|
1504
1511
|
}
|
|
1505
1512
|
|
|
1506
1513
|
// Resolve inline service definitions to full Service objects
|
|
1507
|
-
/**
|
|
1508
|
-
* Type guard to check if a value is a pre-instantiated Service
|
|
1509
|
-
* A Service is a function with the `$fabric` property set by fabricService
|
|
1510
|
-
*/
|
|
1511
|
-
function isService(value) {
|
|
1512
|
-
return typeof value === "function" && "$fabric" in value;
|
|
1513
|
-
}
|
|
1514
1514
|
/**
|
|
1515
1515
|
* Resolve a service configuration to a full Service object
|
|
1516
1516
|
*
|
|
@@ -1712,6 +1712,14 @@ function createServiceSuite(config) {
|
|
|
1712
1712
|
serviceRegistry.set(serviceName, { service, meta });
|
|
1713
1713
|
categorySet.add(category);
|
|
1714
1714
|
},
|
|
1715
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1716
|
+
getServiceFunctions() {
|
|
1717
|
+
return Array.from(serviceRegistry.values()).map((entry) => entry.service);
|
|
1718
|
+
},
|
|
1719
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1720
|
+
getServiceFunction(serviceName) {
|
|
1721
|
+
return serviceRegistry.get(serviceName)?.service;
|
|
1722
|
+
},
|
|
1715
1723
|
};
|
|
1716
1724
|
return suite;
|
|
1717
1725
|
}
|
|
@@ -1810,6 +1818,7 @@ exports.isElementaryType = isElementaryType;
|
|
|
1810
1818
|
exports.isFabricModel = isFabricModel;
|
|
1811
1819
|
exports.isFieldDefinition = isFieldDefinition;
|
|
1812
1820
|
exports.isModelRegistered = isModelRegistered;
|
|
1821
|
+
exports.isService = isService;
|
|
1813
1822
|
exports.isStatus = isStatus;
|
|
1814
1823
|
exports.isTimestampField = isTimestampField;
|
|
1815
1824
|
exports.isValidDate = isValidDate;
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/models/base.ts","../../../src/constants.ts","../../../src/resolve-date.ts","../../../src/resolve.ts","../../../src/helpers/fallback.ts","../../../src/helpers/resolvedName.ts","../../../src/index/types.ts","../../../src/index/keyBuilder.ts","../../../src/index/registry.ts","../../../src/types/elementaryTypes.ts","../../../src/types/fieldDefinition.ts","../../../src/service.ts","../../../src/resolveService.ts","../../../src/ServiceSuite.ts","../../../src/status.ts"],"sourcesContent":["/**\n * FabricModel - Core model vocabulary for @jaypie/fabric\n *\n * Defines the standard fields and structure for all fabric models.\n * Provides a consistent, reusable vocabulary across applications.\n */\n\n// =============================================================================\n// History\n// =============================================================================\n\n/**\n * FabricHistoryEntry - Reverse delta recording previous values of changed fields\n *\n * Stores the previous state of fields before an update was applied.\n * Walk backwards through history to reconstruct earlier versions.\n */\nexport interface FabricHistoryEntry {\n /** Previous values of fields that were changed */\n delta: Record<string, unknown>;\n /** When this change was recorded (the updatedAt from before the change) */\n timestamp: Date;\n}\n\n// =============================================================================\n// FabricModel\n// =============================================================================\n\n/**\n * FabricModel - Base type for all fabric models\n *\n * All fields are part of the standard vocabulary for high reuse.\n * Optional fields may be omitted when not applicable.\n *\n * Field Groups:\n * - Identity (required): id\n * - Identity (optional): name, label, abbreviation, alias, xid, description\n * - Schema: model, class, type\n * - Content: content, metadata\n * - Display: emoji, icon\n * - Time: createdAt, updatedAt, archivedAt, deletedAt\n * - History: history\n */\nexport interface FabricModel {\n // -------------------------------------------------------------------------\n // Identity (required)\n // -------------------------------------------------------------------------\n\n /** UUID - unique identifier */\n id: string;\n\n // -------------------------------------------------------------------------\n // Identity (optional)\n // -------------------------------------------------------------------------\n\n /** Shortest form, even imprecise (e.g., \"12/12\") */\n abbreviation?: string;\n\n /** Slug/key for human lookup (e.g., \"2026-12-12\", \"my-project\") */\n alias?: string;\n\n /** What this entity is about */\n description?: string;\n\n /** Short name, second reference (e.g., \"December 12\") */\n label?: string;\n\n /** Full name, first reference (e.g., \"December 12, 2026 Session\") */\n name?: string;\n\n /** External identifier for machine lookup (e.g., file path, external UUID) */\n xid?: string;\n\n // -------------------------------------------------------------------------\n // Schema\n // -------------------------------------------------------------------------\n\n /** Varies by model (e.g., \"memory\", \"reflection\", \"session\") */\n class?: string;\n\n /** Schema reference (e.g., \"record\", \"job\", \"person\") */\n model: string;\n\n /** Varies by model (e.g., \"assistant\", \"user\", \"system\") */\n type?: string;\n\n // -------------------------------------------------------------------------\n // Storage (optional - only when persisted to DynamoDB)\n // -------------------------------------------------------------------------\n\n /** Scope: APEX (\"@\") or \"{parent.model}#{parent.id}\" */\n scope?: string;\n\n /** Timestamp for chronological ordering (Date.now()) */\n sequence?: number;\n\n // -------------------------------------------------------------------------\n // Content\n // -------------------------------------------------------------------------\n\n /** The actual content */\n content?: string;\n\n /** Extensible data */\n metadata?: Record<string, unknown>;\n\n // -------------------------------------------------------------------------\n // Display\n // -------------------------------------------------------------------------\n\n /** Emoji representation */\n emoji?: string;\n\n /** Icon identifier (e.g., Lucide icon name) */\n icon?: string;\n\n // -------------------------------------------------------------------------\n // Time\n // -------------------------------------------------------------------------\n\n /** Archived timestamp (hidden but recoverable) */\n archivedAt?: Date | null;\n\n /** Creation timestamp */\n createdAt: Date;\n\n /** Soft delete timestamp */\n deletedAt?: Date | null;\n\n /** Last modified timestamp */\n updatedAt: Date;\n\n // -------------------------------------------------------------------------\n // History\n // -------------------------------------------------------------------------\n\n /** Reverse deltas tracking changes over time */\n history?: FabricHistoryEntry[];\n}\n\n// =============================================================================\n// FabricMessage\n// =============================================================================\n\n/**\n * FabricMessage - A message model that extends FabricModel\n *\n * Used for chat messages, notifications, logs, and other content-focused models.\n * The content field contains the actual message text.\n */\nexport interface FabricMessage extends FabricModel {\n /** The actual message content (inherited from FabricModel) */\n content: string;\n\n /** Message type (e.g., \"assistant\", \"user\", \"system\") */\n type?: string;\n}\n\n// =============================================================================\n// FabricProgress\n// =============================================================================\n\n/**\n * FabricProgress - Tracks job execution progress\n */\nexport interface FabricProgress {\n /** Time elapsed in milliseconds */\n elapsedTime?: number;\n\n /** Estimated total time in milliseconds */\n estimatedTime?: number;\n\n /** Next percentage milestone to report (e.g., 25, 50, 75, 100) */\n nextPercentageCheckpoint?: number;\n\n /** Current completion percentage (0-100) */\n percentageComplete?: number;\n}\n\n// =============================================================================\n// FabricJob\n// =============================================================================\n\n/**\n * FabricJob - A job model that extends FabricModel\n *\n * Used for tracking asynchronous tasks, background processes, and batch operations.\n */\nexport interface FabricJob extends FabricModel {\n /** Job class (e.g., \"evaluation\", \"export\", \"import\") */\n class?: string;\n\n /** When the job finished (success or failure) */\n completedAt?: Date | null;\n\n /** Messages generated during job execution */\n messages?: FabricMessage[];\n\n /** Job execution progress */\n progress?: FabricProgress;\n\n /** When the job started processing */\n startedAt?: Date | null;\n\n /** Current job status */\n status: string;\n\n /** Job type (e.g., \"batch\", \"realtime\", \"scheduled\") */\n type?: string;\n}\n\n// =============================================================================\n// Input/Update/Filter Types\n// =============================================================================\n\n/**\n * Input for creating a new FabricModel\n * Omits auto-generated fields: id, createdAt, updatedAt, history\n */\nexport type FabricModelInput = Omit<\n FabricModel,\n \"createdAt\" | \"history\" | \"id\" | \"updatedAt\"\n>;\n\n/**\n * Partial input for updating a FabricModel\n * History is managed automatically by the store\n */\nexport type FabricModelUpdate = Partial<\n Omit<FabricModel, \"createdAt\" | \"history\" | \"id\">\n>;\n\n/**\n * Filter options for listing models\n */\nexport interface FabricModelFilter {\n alias?: string;\n class?: string;\n model?: string;\n type?: string;\n xid?: string;\n}\n\n// =============================================================================\n// Field Name Constants\n// =============================================================================\n\n/**\n * FabricModel field names as constants\n * Useful for building queries, validation, and serialization\n */\nexport const FABRIC_MODEL_FIELDS = {\n // Content\n CONTENT: \"content\",\n METADATA: \"metadata\",\n\n // Display\n EMOJI: \"emoji\",\n ICON: \"icon\",\n\n // History\n HISTORY: \"history\",\n\n // Identity (optional)\n ABBREVIATION: \"abbreviation\",\n ALIAS: \"alias\",\n DESCRIPTION: \"description\",\n LABEL: \"label\",\n NAME: \"name\",\n XID: \"xid\",\n\n // Identity (required)\n ID: \"id\",\n\n // Schema\n CLASS: \"class\",\n MODEL: \"model\",\n TYPE: \"type\",\n\n // Storage\n SCOPE: \"scope\",\n SEQUENCE: \"sequence\",\n\n // Time\n ARCHIVED_AT: \"archivedAt\",\n CREATED_AT: \"createdAt\",\n DELETED_AT: \"deletedAt\",\n UPDATED_AT: \"updatedAt\",\n} as const;\n\n/**\n * Required fields for FabricModel\n */\nexport const FABRIC_MODEL_REQUIRED_FIELDS = [\n FABRIC_MODEL_FIELDS.CREATED_AT,\n FABRIC_MODEL_FIELDS.ID,\n FABRIC_MODEL_FIELDS.MODEL,\n FABRIC_MODEL_FIELDS.UPDATED_AT,\n] as const;\n\n/**\n * Auto-generated fields (set by store, not by user)\n */\nexport const FABRIC_MODEL_AUTO_FIELDS = [\n FABRIC_MODEL_FIELDS.CREATED_AT,\n FABRIC_MODEL_FIELDS.HISTORY,\n FABRIC_MODEL_FIELDS.ID,\n FABRIC_MODEL_FIELDS.UPDATED_AT,\n] as const;\n\n/**\n * Timestamp fields\n */\nexport const FABRIC_MODEL_TIMESTAMP_FIELDS = [\n FABRIC_MODEL_FIELDS.ARCHIVED_AT,\n FABRIC_MODEL_FIELDS.CREATED_AT,\n FABRIC_MODEL_FIELDS.DELETED_AT,\n FABRIC_MODEL_FIELDS.UPDATED_AT,\n] as const;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Check if a value is a FabricModel\n */\nexport function isFabricModel(value: unknown): value is FabricModel {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n return (\n obj.createdAt instanceof Date &&\n typeof obj.id === \"string\" &&\n typeof obj.model === \"string\" &&\n obj.updatedAt instanceof Date\n );\n}\n\n/**\n * Check if a value has the minimum FabricModel shape (for partial objects)\n */\nexport function hasFabricModelShape(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n return typeof obj.id === \"string\" && typeof obj.model === \"string\";\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Create a minimal FabricModelInput with required fields\n */\nexport function createFabricModelInput(\n overrides: Partial<FabricModelInput> & {\n model: string;\n },\n): FabricModelInput {\n return {\n ...overrides,\n };\n}\n\n/**\n * Extract only FabricModel fields from an object\n * Useful for sanitizing input or preparing for storage\n */\nexport function pickFabricModelFields<T extends Partial<FabricModel>>(\n obj: T,\n): Partial<FabricModel> {\n const fields = Object.values(FABRIC_MODEL_FIELDS);\n const result: Partial<FabricModel> = {};\n\n for (const field of fields) {\n if (field in obj) {\n (result as Record<string, unknown>)[field] = (\n obj as Record<string, unknown>\n )[field];\n }\n }\n\n return result;\n}\n\n/**\n * Check if a field name is a timestamp field\n */\nexport function isTimestampField(\n field: string,\n): field is (typeof FABRIC_MODEL_TIMESTAMP_FIELDS)[number] {\n return (FABRIC_MODEL_TIMESTAMP_FIELDS as readonly string[]).includes(field);\n}\n\n/**\n * Check if a field name is auto-generated\n */\nexport function isAutoField(\n field: string,\n): field is (typeof FABRIC_MODEL_AUTO_FIELDS)[number] {\n return (FABRIC_MODEL_AUTO_FIELDS as readonly string[]).includes(field);\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","/**\n * Fallback Resolution Helper\n *\n * Resolves a field value with a fallback chain.\n */\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Resolve a field value with fallbacks\n *\n * @param entity - The entity to read from\n * @param field - The primary field name\n * @param fallbacks - Fallback field names in priority order\n * @returns First defined value, or undefined\n *\n * @example\n * ```typescript\n * const model = { title: undefined, name: \"My Model\", description: \"A description\" };\n * resolveWithFallback(model, \"title\", [\"name\", \"description\"]);\n * // Returns \"My Model\"\n * ```\n */\nexport function resolveWithFallback(\n entity: Record<string, unknown>,\n field: string,\n fallbacks: string[] = [],\n): unknown {\n // Check primary field\n if (entity[field] !== undefined) {\n return entity[field];\n }\n\n // Check fallbacks in order\n for (const fallback of fallbacks) {\n if (entity[fallback] !== undefined) {\n return entity[fallback];\n }\n }\n\n return undefined;\n}\n","/**\n * Resolved Name Helper\n *\n * Computes a resolved name from model fields using a priority chain.\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Model with optional name fields\n */\nexport interface ResolvedNameModel {\n abbreviation?: string;\n alias?: string;\n description?: string;\n name?: string;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Compute resolved name from model fields\n *\n * Priority: name > alias > abbreviation > description\n * Result is lowercase for consistent sorting/indexing\n *\n * @param model - The model to compute the resolved name from\n * @returns The resolved name (lowercase) or undefined if no name fields exist\n */\nexport function computeResolvedName(\n model: ResolvedNameModel,\n): string | undefined {\n const value =\n model.name || model.alias || model.abbreviation || model.description;\n return value?.toLowerCase();\n}\n","/**\n * Index Types for @jaypie/fabric\n *\n * Declarative index definitions for DynamoDB single-table design.\n * Models can specify their own indexes, and dynamodb will create\n * GSIs and auto-detect which index to use for queries.\n */\n\nimport type { FabricModel } from \"../models/base.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Index field - can be a FabricModel field name or custom field\n */\nexport type IndexField = keyof FabricModel | string;\n\n/**\n * Single index definition\n *\n * pk fields are combined with SEPARATOR to form the partition key.\n * sk fields are combined with SEPARATOR to form the sort key.\n */\nexport interface IndexDefinition {\n /** Name of the index (auto-generated from pk fields if not provided) */\n name?: string;\n /** Partition key fields - combined with SEPARATOR */\n pk: IndexField[];\n /** Sort key fields - combined with SEPARATOR (default: [\"sequence\"]) */\n sk?: IndexField[];\n /** Only create index key when ALL pk fields are present on model */\n sparse?: boolean;\n}\n\n/**\n * Model schema with index definitions\n */\nexport interface ModelSchema {\n /** The model name (e.g., \"record\", \"message\", \"chat\") */\n model: string;\n /** Custom indexes for this model (uses DEFAULT_INDEXES if not specified) */\n indexes?: IndexDefinition[];\n}\n\n// =============================================================================\n// Default Indexes\n// =============================================================================\n\n/**\n * Default indexes for the DynamoDB GSI pattern.\n * These are used when a model does not specify custom indexes.\n */\nexport const DEFAULT_INDEXES: IndexDefinition[] = [\n { name: \"indexScope\", pk: [\"scope\", \"model\"], sk: [\"sequence\"] },\n {\n name: \"indexAlias\",\n pk: [\"scope\", \"model\", \"alias\"],\n sk: [\"sequence\"],\n sparse: true,\n },\n {\n name: \"indexClass\",\n pk: [\"scope\", \"model\", \"class\"],\n sk: [\"sequence\"],\n sparse: true,\n },\n {\n name: \"indexType\",\n pk: [\"scope\", \"model\", \"type\"],\n sk: [\"sequence\"],\n sparse: true,\n },\n {\n name: \"indexXid\",\n pk: [\"scope\", \"model\", \"xid\"],\n sk: [\"sequence\"],\n sparse: true,\n },\n];\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/**\n * Default sort key fields when sk is not specified\n */\nexport const DEFAULT_SORT_KEY: IndexField[] = [\"sequence\"];\n\n/**\n * Suffix appended to index keys when model is archived\n */\nexport const ARCHIVED_SUFFIX = \"#archived\";\n\n/**\n * Suffix appended to index keys when model is deleted\n */\nexport const DELETED_SUFFIX = \"#deleted\";\n","/**\n * Key Builder for @jaypie/fabric\n *\n * Builds composite keys from model fields and index definitions.\n */\n\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport { SEPARATOR } from \"../constants.js\";\n\nimport {\n ARCHIVED_SUFFIX,\n DELETED_SUFFIX,\n type IndexDefinition,\n type IndexField,\n} from \"./types.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Model with fields for indexing.\n *\n * Does not extend FabricModel to allow flexibility with timestamp types\n * (DynamoDB uses string timestamps, FabricModel uses Date objects).\n */\nexport interface IndexableModel {\n /** Schema reference (required for indexing) */\n model: string;\n /** Scope (optional) */\n scope?: string;\n /** Chronological ordering timestamp (optional) */\n sequence?: number;\n /** Archived timestamp - presence triggers #archived suffix */\n archivedAt?: Date | string | null;\n /** Deleted timestamp - presence triggers #deleted suffix */\n deletedAt?: Date | string | null;\n /** Allow any additional fields */\n [key: string]: unknown;\n}\n\n// =============================================================================\n// Key Builders\n// =============================================================================\n\n/**\n * Build a composite key from model fields\n *\n * @param model - Model with fields to extract\n * @param fields - Field names to combine\n * @param suffix - Optional suffix to append (e.g., \"#deleted\")\n * @returns Composite key string (e.g., \"@#record#my-alias\")\n * @throws ConfigurationError if a required field is missing\n */\nexport function buildCompositeKey(\n model: IndexableModel,\n fields: IndexField[],\n suffix?: string,\n): string {\n const parts = fields.map((field) => {\n const value = model[field as keyof typeof model];\n if (value === undefined || value === null) {\n throw new ConfigurationError(`Missing field for index key: ${field}`);\n }\n return String(value);\n });\n\n const key = parts.join(SEPARATOR);\n return suffix ? key + suffix : key;\n}\n\n/**\n * Try to build a composite key, returning undefined if fields are missing\n *\n * @param model - Model with fields to extract\n * @param fields - Field names to combine\n * @param suffix - Optional suffix to append\n * @returns Composite key string or undefined if fields missing\n */\nexport function tryBuildCompositeKey(\n model: IndexableModel,\n fields: IndexField[],\n suffix?: string,\n): string | undefined {\n for (const field of fields) {\n const value = model[field as keyof typeof model];\n if (value === undefined || value === null) {\n return undefined;\n }\n }\n return buildCompositeKey(model, fields, suffix);\n}\n\n/**\n * Generate an index name from partition key fields\n *\n * @param pk - Partition key field names\n * @returns Generated index name (e.g., \"indexOuModelAlias\")\n */\nexport function generateIndexName(pk: IndexField[]): string {\n const suffix = pk\n .map((field) => {\n const str = String(field);\n return str.charAt(0).toUpperCase() + str.slice(1);\n })\n .join(\"\");\n return `index${suffix}`;\n}\n\n/**\n * Calculate the suffix for index keys based on model state\n *\n * @param model - Model to check for archived/deleted state\n * @returns Suffix string (e.g., \"\", \"#archived\", \"#deleted\", \"#archived#deleted\")\n */\nexport function calculateIndexSuffix(model: IndexableModel): string {\n let suffix = \"\";\n if (model.archivedAt !== undefined && model.archivedAt !== null) {\n suffix += ARCHIVED_SUFFIX;\n }\n if (model.deletedAt !== undefined && model.deletedAt !== null) {\n suffix += DELETED_SUFFIX;\n }\n return suffix;\n}\n\n/**\n * Populate index keys on a model based on index definitions\n *\n * Only the partition key composite is stored on the model (e.g., indexOu).\n * The sort key (e.g., sequence) is a regular field that the GSI references directly.\n *\n * @param model - Model to populate index keys on\n * @param indexes - Index definitions to use\n * @param suffix - Optional suffix to append to all index keys\n * @returns Model with index keys populated\n */\nexport function populateIndexKeys<T extends IndexableModel>(\n model: T,\n indexes: IndexDefinition[],\n suffix?: string,\n): T {\n const result = { ...model };\n const appliedSuffix = suffix ?? calculateIndexSuffix(model);\n\n for (const index of indexes) {\n const indexName = index.name ?? generateIndexName(index.pk);\n const pkKey = indexName as keyof T;\n\n // For sparse indexes, only populate if all pk fields are present\n if (index.sparse) {\n const pkValue = tryBuildCompositeKey(model, index.pk, appliedSuffix);\n if (pkValue !== undefined) {\n (result as Record<string, unknown>)[pkKey as string] = pkValue;\n }\n } else {\n // For non-sparse indexes, always try to populate (will throw if fields missing)\n const pkValue = tryBuildCompositeKey(model, index.pk, appliedSuffix);\n if (pkValue !== undefined) {\n (result as Record<string, unknown>)[pkKey as string] = pkValue;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Calculate scope from parent reference\n *\n * @param parent - Parent model with model and id\n * @returns Scope string (\"{parent.model}#{parent.id}\") or APEX (\"@\") if no parent\n */\nexport function calculateScope(parent?: { id: string; model: string }): string {\n if (!parent) {\n return \"@\"; // APEX\n }\n return `${parent.model}${SEPARATOR}${parent.id}`;\n}\n","/**\n * Model Registry for @jaypie/fabric\n *\n * Stores model schemas with their index definitions.\n * DynamoDB reads from this registry to create GSIs and select indexes for queries.\n */\n\nimport {\n DEFAULT_INDEXES,\n type IndexDefinition,\n type ModelSchema,\n} from \"./types.js\";\n\n// =============================================================================\n// Registry\n// =============================================================================\n\n/**\n * Global model registry - maps model names to their schemas\n */\nconst MODEL_REGISTRY = new Map<string, ModelSchema>();\n\n// =============================================================================\n// Functions\n// =============================================================================\n\n/**\n * Register a model schema with its index definitions\n *\n * @param schema - Model schema with model name and optional indexes\n */\nexport function registerModel(schema: ModelSchema): void {\n MODEL_REGISTRY.set(schema.model, schema);\n}\n\n/**\n * Get a model schema by name\n *\n * @param model - Model name to look up\n * @returns Model schema or undefined if not registered\n */\nexport function getModelSchema(model: string): ModelSchema | undefined {\n return MODEL_REGISTRY.get(model);\n}\n\n/**\n * Get index definitions for a model\n *\n * Returns the model's custom indexes if registered,\n * otherwise returns DEFAULT_INDEXES.\n *\n * @param model - Model name to get indexes for\n * @returns Array of index definitions\n */\nexport function getModelIndexes(model: string): IndexDefinition[] {\n const schema = MODEL_REGISTRY.get(model);\n return schema?.indexes ?? DEFAULT_INDEXES;\n}\n\n/**\n * Get all registered models\n *\n * @returns Array of model names\n */\nexport function getRegisteredModels(): string[] {\n return Array.from(MODEL_REGISTRY.keys());\n}\n\n/**\n * Get all unique indexes across all registered models\n *\n * Used by createTable to collect all GSIs that need to be created.\n * Deduplicates by index name.\n *\n * @returns Array of unique index definitions\n */\nexport function getAllRegisteredIndexes(): IndexDefinition[] {\n const indexMap = new Map<string, IndexDefinition>();\n\n // Collect indexes from all registered models\n for (const schema of MODEL_REGISTRY.values()) {\n const indexes = schema.indexes ?? [];\n for (const index of indexes) {\n const name = index.name ?? generateIndexNameFromPk(index.pk);\n if (!indexMap.has(name)) {\n indexMap.set(name, { ...index, name });\n }\n }\n }\n\n return Array.from(indexMap.values());\n}\n\n/**\n * Check if a model is registered\n *\n * @param model - Model name to check\n * @returns true if model is registered\n */\nexport function isModelRegistered(model: string): boolean {\n return MODEL_REGISTRY.has(model);\n}\n\n/**\n * Clear the model registry (for testing)\n */\nexport function clearRegistry(): void {\n MODEL_REGISTRY.clear();\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Generate an index name from pk fields (used when index.name is not set)\n */\nfunction generateIndexNameFromPk(pk: string[]): string {\n const suffix = pk\n .map((field) => {\n const str = String(field);\n return str.charAt(0).toUpperCase() + str.slice(1);\n })\n .join(\"\");\n return `index${suffix}`;\n}\n","/**\n * Elementary Field Types\n *\n * Defines the 10 elementary field types for the Fabric vocabulary.\n * Each type has: alias, name, icon, and optional validation/format rules.\n */\n\nimport type { FieldDefinition } from \"./fieldDefinition.js\";\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Elementary type aliases */\nexport const ELEMENTARY_TYPES = [\n \"boolean\",\n \"date\",\n \"datetime\",\n \"dollars\",\n \"multiselect\",\n \"number\",\n \"reference\",\n \"select\",\n \"text\",\n \"textarea\",\n] as const;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type ElementaryType = (typeof ELEMENTARY_TYPES)[number];\n\n/**\n * Extended field definition for elementary types\n */\nexport interface ElementaryTypeDefinition extends FieldDefinition {\n /** The elementary type alias */\n alias: ElementaryType;\n /** Display format pattern */\n formatPattern?: string;\n /** Input component type (for UI rendering) */\n inputComponent?: string;\n /** Options for select/multiselect types */\n options?: Array<{ label: string; value: string }>;\n /** Reference model for reference types */\n referenceModel?: string;\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Check if a string is an elementary type\n */\nexport function isElementaryType(value: unknown): value is ElementaryType {\n return (\n typeof value === \"string\" &&\n ELEMENTARY_TYPES.includes(value as ElementaryType)\n );\n}\n\n// =============================================================================\n// Elementary Type Definitions\n// =============================================================================\n\n/**\n * Boolean - True/false toggle\n */\nexport const BOOLEAN_TYPE: ElementaryTypeDefinition = {\n alias: \"boolean\",\n defaultValue: false,\n description: \"True/false toggle\",\n icon: \"lucide#toggle-left\",\n inputComponent: \"checkbox\",\n name: \"Boolean\",\n type: \"boolean\",\n};\n\n/**\n * Date - Date picker (ISO format)\n */\nexport const DATE_TYPE: ElementaryTypeDefinition = {\n alias: \"date\",\n description: \"Date value (YYYY-MM-DD)\",\n formatPattern: \"YYYY-MM-DD\",\n icon: \"lucide#calendar\",\n inputComponent: \"date-picker\",\n name: \"Date\",\n type: \"date\",\n};\n\n/**\n * Datetime - Date + time picker\n */\nexport const DATETIME_TYPE: ElementaryTypeDefinition = {\n alias: \"datetime\",\n description: \"Date and time value (ISO 8601)\",\n formatPattern: \"YYYY-MM-DDTHH:mm:ssZ\",\n icon: \"lucide#calendar-clock\",\n inputComponent: \"datetime-picker\",\n name: \"Date & Time\",\n type: \"datetime\",\n};\n\n/**\n * Dollars - Currency with formatting\n */\nexport const DOLLARS_TYPE: ElementaryTypeDefinition = {\n alias: \"dollars\",\n description: \"Currency value formatted as $X.XX\",\n formatPattern: \"$0,0.00\",\n icon: \"lucide#dollar-sign\",\n inputComponent: \"currency-input\",\n name: \"Dollars\",\n type: \"dollars\",\n validation: [\n { message: \"Must be a valid number\", type: \"numeric\" },\n { message: \"Cannot be negative\", type: \"min\", value: 0 },\n ],\n};\n\n/**\n * Multiselect - Multiple selections from options\n */\nexport const MULTISELECT_TYPE: ElementaryTypeDefinition = {\n alias: \"multiselect\",\n description: \"Multiple selections from predefined options\",\n icon: \"lucide#list-checks\",\n inputComponent: \"multiselect\",\n name: \"Multi-Select\",\n options: [], // Populated per-field\n type: \"multiselect\",\n};\n\n/**\n * Number - Numeric input (integer or float)\n */\nexport const NUMBER_TYPE: ElementaryTypeDefinition = {\n alias: \"number\",\n description: \"Numeric value (integer or decimal)\",\n icon: \"lucide#hash\",\n inputComponent: \"input[type=number]\",\n name: \"Number\",\n type: \"number\",\n validation: [{ message: \"Must be a valid number\", type: \"numeric\" }],\n};\n\n/**\n * Reference - Link to another model\n */\nexport const REFERENCE_TYPE: ElementaryTypeDefinition = {\n alias: \"reference\",\n description: \"Link to another model by id or alias\",\n icon: \"lucide#link\",\n inputComponent: \"entity-picker\",\n name: \"Reference\",\n referenceModel: undefined, // Set per-field\n type: \"reference\",\n};\n\n/**\n * Select - Single selection from options\n */\nexport const SELECT_TYPE: ElementaryTypeDefinition = {\n alias: \"select\",\n description: \"Single selection from predefined options\",\n icon: \"lucide#list\",\n inputComponent: \"select\",\n name: \"Select\",\n options: [], // Populated per-field\n type: \"select\",\n};\n\n/**\n * Text - Single-line string input\n */\nexport const TEXT_TYPE: ElementaryTypeDefinition = {\n alias: \"text\",\n description: \"Single-line text input\",\n icon: \"lucide#type\",\n inputComponent: \"input\",\n name: \"Text\",\n type: \"text\",\n};\n\n/**\n * Textarea - Multi-line string input\n */\nexport const TEXTAREA_TYPE: ElementaryTypeDefinition = {\n alias: \"textarea\",\n description: \"Multi-line text input\",\n icon: \"lucide#align-left\",\n inputComponent: \"textarea\",\n name: \"Text Area\",\n type: \"textarea\",\n};\n\n// =============================================================================\n// Type Registry\n// =============================================================================\n\n/**\n * Registry of all elementary types\n */\nexport const ELEMENTARY_TYPE_REGISTRY: Record<\n ElementaryType,\n ElementaryTypeDefinition\n> = {\n boolean: BOOLEAN_TYPE,\n date: DATE_TYPE,\n datetime: DATETIME_TYPE,\n dollars: DOLLARS_TYPE,\n multiselect: MULTISELECT_TYPE,\n number: NUMBER_TYPE,\n reference: REFERENCE_TYPE,\n select: SELECT_TYPE,\n text: TEXT_TYPE,\n textarea: TEXTAREA_TYPE,\n};\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Get an elementary type definition by alias\n */\nexport function getElementaryType(\n alias: ElementaryType,\n): ElementaryTypeDefinition {\n return ELEMENTARY_TYPE_REGISTRY[alias];\n}\n\n/**\n * Get all elementary type definitions\n */\nexport function getAllElementaryTypes(): ElementaryTypeDefinition[] {\n return Object.values(ELEMENTARY_TYPE_REGISTRY);\n}\n","/**\n * Field Definition - Describes a field's structure and behavior\n *\n * Field definitions are the building blocks of model definitions,\n * specifying type, validation, and metadata for each field.\n */\n\n// =============================================================================\n// Interfaces\n// =============================================================================\n\n/**\n * Validation rule for a field\n */\nexport interface ValidationRule {\n /** Error message if validation fails */\n message?: string;\n /** Rule type (required, min, max, pattern, etc.) */\n type: string;\n /** Rule value (varies by type) */\n value?: unknown;\n}\n\n/**\n * Field definition - describes a field's structure and behavior\n */\nexport interface FieldDefinition {\n /** Field identifier (unique within model) */\n alias: string;\n /** Default value */\n defaultValue?: unknown;\n /** Description */\n description?: string;\n /** Fallback chain for value resolution */\n fallback?: string[];\n /** Icon (lucide name or custom) */\n icon?: string;\n /** Display name */\n name: string;\n /** Field type (text, number, dollars, etc.) */\n type: string;\n /** Validation rules */\n validation?: ValidationRule[];\n}\n\n/**\n * Field reference - either an alias string or inline definition\n */\nexport type FieldRef = FieldDefinition | string;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Check if a field ref is an inline definition\n */\nexport function isFieldDefinition(ref: FieldRef): ref is FieldDefinition {\n return typeof ref === \"object\" && \"alias\" in ref && \"type\" in ref;\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","// ServiceSuite for @jaypie/fabric\n// Groups fabricService instances for discovery, metadata export, and direct execution\n\nimport type { InputFieldDefinition, Service } from \"./types.js\";\n\n/**\n * Describes a single input parameter for a service\n */\nexport interface ServiceInput {\n name: string;\n type: string;\n required: boolean;\n description: string;\n enum?: string[];\n}\n\n/**\n * Describes a service's metadata for discovery and documentation\n */\nexport interface ServiceMeta {\n /** Service name (from alias) */\n name: string;\n /** Human-readable description */\n description: string;\n /** Category for grouping (e.g., \"record\", \"aws\", \"docs\") */\n category: string;\n /** Input parameter definitions */\n inputs: ServiceInput[];\n /** Whether the service can be executed with no inputs */\n executable?: boolean;\n}\n\n/**\n * A collection of services with metadata and execution capabilities\n */\nexport interface ServiceSuite {\n /** Suite name (e.g., \"nostrus\", \"jaypie\") */\n name: string;\n /** Suite version */\n version: string;\n /** Available categories */\n categories: string[];\n /** All registered services */\n services: ServiceMeta[];\n\n /** Get a service by name */\n getService(name: string): ServiceMeta | undefined;\n /** Get services by category */\n getServicesByCategory(category: string): ServiceMeta[];\n\n /** Execute a service by name */\n execute(name: string, inputs: Record<string, unknown>): Promise<unknown>;\n\n /** Register a fabricService into the suite */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(service: Service<any, any>, category: string): void;\n}\n\n/**\n * Configuration for creating a ServiceSuite\n */\nexport interface CreateServiceSuiteConfig {\n name: string;\n version: string;\n}\n\n/**\n * Derive type string from InputFieldDefinition.type\n */\nfunction deriveTypeString(type: InputFieldDefinition[\"type\"]): string {\n // Handle constructors\n if (type === String || type === \"string\") return \"string\";\n if (type === Number || type === \"number\") return \"number\";\n if (type === Boolean || type === \"boolean\") return \"boolean\";\n if (type === Object || type === \"object\") return \"object\";\n if (type === Array || type === \"array\") return \"array\";\n if (type === Date) return \"string\"; // Dates are passed as strings\n\n // Handle typed arrays: [String], [Number], etc.\n if (Array.isArray(type)) {\n if (type.length === 0) return \"array\";\n const first = type[0];\n // If it's a type constructor, it's a typed array\n if (\n first === String ||\n first === Number ||\n first === Boolean ||\n first === Object ||\n first === \"string\" ||\n first === \"number\" ||\n first === \"boolean\" ||\n first === \"object\" ||\n first === \"\"\n ) {\n return \"array\";\n }\n // If all elements are strings (or RegExp), it's a validated string enum\n if (type.every((item) => typeof item === \"string\" || item instanceof RegExp)) {\n return \"string\";\n }\n // If all elements are numbers, it's a validated number enum\n if (type.every((item) => typeof item === \"number\")) {\n return \"number\";\n }\n return \"array\";\n }\n\n // Handle RegExp (validated string)\n if (type instanceof RegExp) {\n return \"string\";\n }\n\n return \"string\"; // Default fallback\n}\n\n/**\n * Extract enum values if the type is a validated string/number array\n */\nfunction extractEnumValues(type: InputFieldDefinition[\"type\"]): string[] | undefined {\n if (!Array.isArray(type)) return undefined;\n if (type.length === 0) return undefined;\n\n // Check if it's a validated string enum (array of strings, possibly with RegExp)\n const stringValues = type.filter((item): item is string => typeof item === \"string\");\n if (stringValues.length > 0 && stringValues.length === type.filter((item) => typeof item === \"string\").length) {\n // All non-RegExp items are strings\n return stringValues;\n }\n\n // Check if it's a validated number enum\n if (type.every((item) => typeof item === \"number\")) {\n return type.map((n) => String(n));\n }\n\n return undefined;\n}\n\n/**\n * Convert fabricService input definitions to ServiceInput array\n */\nfunction extractInputs(\n inputDefinitions?: Record<string, InputFieldDefinition>,\n): ServiceInput[] {\n if (!inputDefinitions) return [];\n\n return Object.entries(inputDefinitions).map(([name, def]) => {\n const required =\n def.required !== false && def.default === undefined;\n const enumValues = extractEnumValues(def.type);\n\n return {\n name,\n type: deriveTypeString(def.type),\n required,\n description: def.description || \"\",\n ...(enumValues && { enum: enumValues }),\n };\n });\n}\n\n/**\n * Check if a service has any required inputs\n */\nfunction hasRequiredInputs(inputs: ServiceInput[]): boolean {\n return inputs.some((input) => input.required);\n}\n\n/**\n * Create a ServiceSuite instance\n */\nexport function createServiceSuite(config: CreateServiceSuiteConfig): ServiceSuite {\n const { name, version } = config;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const serviceRegistry = new Map<string, {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n service: Service<any, any>;\n meta: ServiceMeta;\n }>();\n const categorySet = new Set<string>();\n\n const suite: ServiceSuite = {\n name,\n version,\n\n get categories(): string[] {\n return Array.from(categorySet).sort();\n },\n\n get services(): ServiceMeta[] {\n return Array.from(serviceRegistry.values()).map((entry) => entry.meta);\n },\n\n getService(serviceName: string): ServiceMeta | undefined {\n return serviceRegistry.get(serviceName)?.meta;\n },\n\n getServicesByCategory(category: string): ServiceMeta[] {\n return Array.from(serviceRegistry.values())\n .filter((entry) => entry.meta.category === category)\n .map((entry) => entry.meta);\n },\n\n async execute(\n serviceName: string,\n inputs: Record<string, unknown>,\n ): Promise<unknown> {\n const entry = serviceRegistry.get(serviceName);\n if (!entry) {\n throw new Error(`Service \"${serviceName}\" not found in suite \"${name}\"`);\n }\n return entry.service(inputs);\n },\n\n register(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n service: Service<any, any>,\n category: string,\n ): void {\n const serviceName = service.alias;\n if (!serviceName) {\n throw new Error(\"Service must have an alias to be registered\");\n }\n\n const inputs = extractInputs(service.input);\n const meta: ServiceMeta = {\n name: serviceName,\n description: service.description || \"\",\n category,\n inputs,\n executable: !hasRequiredInputs(inputs),\n };\n\n serviceRegistry.set(serviceName, { service, meta });\n categorySet.add(category);\n },\n };\n\n return suite;\n}\n","/**\n * Status Type for @jaypie/fabric\n *\n * Standard status values for fields that track processing state.\n */\n\n/**\n * Valid status values for status fields\n */\nexport const STATUS_VALUES = [\n \"canceled\",\n \"complete\",\n \"error\",\n \"pending\",\n \"processing\",\n \"queued\",\n \"sending\",\n] as const;\n\n/**\n * TypeScript type for status values\n */\nexport type Status = (typeof STATUS_VALUES)[number];\n\n/**\n * Status type for use in createService input definitions\n *\n * Usage:\n * ```typescript\n * const handler = createService({\n * input: {\n * status: { type: StatusType, description: \"Current status\" },\n * },\n * });\n * ```\n */\nexport const StatusType = [...STATUS_VALUES] as (\n | \"canceled\"\n | \"complete\"\n | \"error\"\n | \"pending\"\n | \"processing\"\n | \"queued\"\n | \"sending\"\n)[];\n\n/**\n * Check if a value is a valid status\n */\nexport function isStatus(value: unknown): value is Status {\n return (\n typeof value === \"string\" &&\n STATUS_VALUES.includes(value as (typeof STATUS_VALUES)[number])\n );\n}\n"],"names":["BadRequestError","ConfigurationError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/models/base.ts","../../../src/constants.ts","../../../src/resolve-date.ts","../../../src/resolve.ts","../../../src/helpers/fallback.ts","../../../src/helpers/resolvedName.ts","../../../src/index/types.ts","../../../src/index/keyBuilder.ts","../../../src/index/registry.ts","../../../src/types/elementaryTypes.ts","../../../src/types/fieldDefinition.ts","../../../src/service.ts","../../../src/resolveService.ts","../../../src/ServiceSuite.ts","../../../src/status.ts"],"sourcesContent":["/**\n * FabricModel - Core model vocabulary for @jaypie/fabric\n *\n * Defines the standard fields and structure for all fabric models.\n * Provides a consistent, reusable vocabulary across applications.\n */\n\n// =============================================================================\n// History\n// =============================================================================\n\n/**\n * FabricHistoryEntry - Reverse delta recording previous values of changed fields\n *\n * Stores the previous state of fields before an update was applied.\n * Walk backwards through history to reconstruct earlier versions.\n */\nexport interface FabricHistoryEntry {\n /** Previous values of fields that were changed */\n delta: Record<string, unknown>;\n /** When this change was recorded (the updatedAt from before the change) */\n timestamp: Date;\n}\n\n// =============================================================================\n// FabricModel\n// =============================================================================\n\n/**\n * FabricModel - Base type for all fabric models\n *\n * All fields are part of the standard vocabulary for high reuse.\n * Optional fields may be omitted when not applicable.\n *\n * Field Groups:\n * - Identity (required): id\n * - Identity (optional): name, label, abbreviation, alias, xid, description\n * - Schema: model, class, type\n * - Content: content, metadata\n * - Display: emoji, icon\n * - Time: createdAt, updatedAt, archivedAt, deletedAt\n * - History: history\n */\nexport interface FabricModel {\n // -------------------------------------------------------------------------\n // Identity (required)\n // -------------------------------------------------------------------------\n\n /** UUID - unique identifier */\n id: string;\n\n // -------------------------------------------------------------------------\n // Identity (optional)\n // -------------------------------------------------------------------------\n\n /** Shortest form, even imprecise (e.g., \"12/12\") */\n abbreviation?: string;\n\n /** Slug/key for human lookup (e.g., \"2026-12-12\", \"my-project\") */\n alias?: string;\n\n /** What this entity is about */\n description?: string;\n\n /** Short name, second reference (e.g., \"December 12\") */\n label?: string;\n\n /** Full name, first reference (e.g., \"December 12, 2026 Session\") */\n name?: string;\n\n /** External identifier for machine lookup (e.g., file path, external UUID) */\n xid?: string;\n\n // -------------------------------------------------------------------------\n // Schema\n // -------------------------------------------------------------------------\n\n /** Varies by model (e.g., \"memory\", \"reflection\", \"session\") */\n class?: string;\n\n /** Schema reference (e.g., \"record\", \"job\", \"person\") */\n model: string;\n\n /** Varies by model (e.g., \"assistant\", \"user\", \"system\") */\n type?: string;\n\n // -------------------------------------------------------------------------\n // Storage (optional - only when persisted to DynamoDB)\n // -------------------------------------------------------------------------\n\n /** Scope: APEX (\"@\") or \"{parent.model}#{parent.id}\" */\n scope?: string;\n\n /** Timestamp for chronological ordering (Date.now()) */\n sequence?: number;\n\n // -------------------------------------------------------------------------\n // Content\n // -------------------------------------------------------------------------\n\n /** The actual content */\n content?: string;\n\n /** Extensible data */\n metadata?: Record<string, unknown>;\n\n // -------------------------------------------------------------------------\n // Display\n // -------------------------------------------------------------------------\n\n /** Emoji representation */\n emoji?: string;\n\n /** Icon identifier (e.g., Lucide icon name) */\n icon?: string;\n\n // -------------------------------------------------------------------------\n // Time\n // -------------------------------------------------------------------------\n\n /** Archived timestamp (hidden but recoverable) */\n archivedAt?: Date | null;\n\n /** Creation timestamp */\n createdAt: Date;\n\n /** Soft delete timestamp */\n deletedAt?: Date | null;\n\n /** Last modified timestamp */\n updatedAt: Date;\n\n // -------------------------------------------------------------------------\n // History\n // -------------------------------------------------------------------------\n\n /** Reverse deltas tracking changes over time */\n history?: FabricHistoryEntry[];\n}\n\n// =============================================================================\n// FabricMessage\n// =============================================================================\n\n/**\n * FabricMessage - A message model that extends FabricModel\n *\n * Used for chat messages, notifications, logs, and other content-focused models.\n * The content field contains the actual message text.\n */\nexport interface FabricMessage extends FabricModel {\n /** The actual message content (inherited from FabricModel) */\n content: string;\n\n /** Message type (e.g., \"assistant\", \"user\", \"system\") */\n type?: string;\n}\n\n// =============================================================================\n// FabricProgress\n// =============================================================================\n\n/**\n * FabricProgress - Tracks job execution progress\n */\nexport interface FabricProgress {\n /** Time elapsed in milliseconds */\n elapsedTime?: number;\n\n /** Estimated total time in milliseconds */\n estimatedTime?: number;\n\n /** Next percentage milestone to report (e.g., 25, 50, 75, 100) */\n nextPercentageCheckpoint?: number;\n\n /** Current completion percentage (0-100) */\n percentageComplete?: number;\n}\n\n// =============================================================================\n// FabricJob\n// =============================================================================\n\n/**\n * FabricJob - A job model that extends FabricModel\n *\n * Used for tracking asynchronous tasks, background processes, and batch operations.\n */\nexport interface FabricJob extends FabricModel {\n /** Job class (e.g., \"evaluation\", \"export\", \"import\") */\n class?: string;\n\n /** When the job finished (success or failure) */\n completedAt?: Date | null;\n\n /** Messages generated during job execution */\n messages?: FabricMessage[];\n\n /** Job execution progress */\n progress?: FabricProgress;\n\n /** When the job started processing */\n startedAt?: Date | null;\n\n /** Current job status */\n status: string;\n\n /** Job type (e.g., \"batch\", \"realtime\", \"scheduled\") */\n type?: string;\n}\n\n// =============================================================================\n// Input/Update/Filter Types\n// =============================================================================\n\n/**\n * Input for creating a new FabricModel\n * Omits auto-generated fields: id, createdAt, updatedAt, history\n */\nexport type FabricModelInput = Omit<\n FabricModel,\n \"createdAt\" | \"history\" | \"id\" | \"updatedAt\"\n>;\n\n/**\n * Partial input for updating a FabricModel\n * History is managed automatically by the store\n */\nexport type FabricModelUpdate = Partial<\n Omit<FabricModel, \"createdAt\" | \"history\" | \"id\">\n>;\n\n/**\n * Filter options for listing models\n */\nexport interface FabricModelFilter {\n alias?: string;\n class?: string;\n model?: string;\n type?: string;\n xid?: string;\n}\n\n// =============================================================================\n// Field Name Constants\n// =============================================================================\n\n/**\n * FabricModel field names as constants\n * Useful for building queries, validation, and serialization\n */\nexport const FABRIC_MODEL_FIELDS = {\n // Content\n CONTENT: \"content\",\n METADATA: \"metadata\",\n\n // Display\n EMOJI: \"emoji\",\n ICON: \"icon\",\n\n // History\n HISTORY: \"history\",\n\n // Identity (optional)\n ABBREVIATION: \"abbreviation\",\n ALIAS: \"alias\",\n DESCRIPTION: \"description\",\n LABEL: \"label\",\n NAME: \"name\",\n XID: \"xid\",\n\n // Identity (required)\n ID: \"id\",\n\n // Schema\n CLASS: \"class\",\n MODEL: \"model\",\n TYPE: \"type\",\n\n // Storage\n SCOPE: \"scope\",\n SEQUENCE: \"sequence\",\n\n // Time\n ARCHIVED_AT: \"archivedAt\",\n CREATED_AT: \"createdAt\",\n DELETED_AT: \"deletedAt\",\n UPDATED_AT: \"updatedAt\",\n} as const;\n\n/**\n * Required fields for FabricModel\n */\nexport const FABRIC_MODEL_REQUIRED_FIELDS = [\n FABRIC_MODEL_FIELDS.CREATED_AT,\n FABRIC_MODEL_FIELDS.ID,\n FABRIC_MODEL_FIELDS.MODEL,\n FABRIC_MODEL_FIELDS.UPDATED_AT,\n] as const;\n\n/**\n * Auto-generated fields (set by store, not by user)\n */\nexport const FABRIC_MODEL_AUTO_FIELDS = [\n FABRIC_MODEL_FIELDS.CREATED_AT,\n FABRIC_MODEL_FIELDS.HISTORY,\n FABRIC_MODEL_FIELDS.ID,\n FABRIC_MODEL_FIELDS.UPDATED_AT,\n] as const;\n\n/**\n * Timestamp fields\n */\nexport const FABRIC_MODEL_TIMESTAMP_FIELDS = [\n FABRIC_MODEL_FIELDS.ARCHIVED_AT,\n FABRIC_MODEL_FIELDS.CREATED_AT,\n FABRIC_MODEL_FIELDS.DELETED_AT,\n FABRIC_MODEL_FIELDS.UPDATED_AT,\n] as const;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Check if a value is a FabricModel\n */\nexport function isFabricModel(value: unknown): value is FabricModel {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n return (\n obj.createdAt instanceof Date &&\n typeof obj.id === \"string\" &&\n typeof obj.model === \"string\" &&\n obj.updatedAt instanceof Date\n );\n}\n\n/**\n * Check if a value has the minimum FabricModel shape (for partial objects)\n */\nexport function hasFabricModelShape(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n return typeof obj.id === \"string\" && typeof obj.model === \"string\";\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Create a minimal FabricModelInput with required fields\n */\nexport function createFabricModelInput(\n overrides: Partial<FabricModelInput> & {\n model: string;\n },\n): FabricModelInput {\n return {\n ...overrides,\n };\n}\n\n/**\n * Extract only FabricModel fields from an object\n * Useful for sanitizing input or preparing for storage\n */\nexport function pickFabricModelFields<T extends Partial<FabricModel>>(\n obj: T,\n): Partial<FabricModel> {\n const fields = Object.values(FABRIC_MODEL_FIELDS);\n const result: Partial<FabricModel> = {};\n\n for (const field of fields) {\n if (field in obj) {\n (result as Record<string, unknown>)[field] = (\n obj as Record<string, unknown>\n )[field];\n }\n }\n\n return result;\n}\n\n/**\n * Check if a field name is a timestamp field\n */\nexport function isTimestampField(\n field: string,\n): field is (typeof FABRIC_MODEL_TIMESTAMP_FIELDS)[number] {\n return (FABRIC_MODEL_TIMESTAMP_FIELDS as readonly string[]).includes(field);\n}\n\n/**\n * Check if a field name is auto-generated\n */\nexport function isAutoField(\n field: string,\n): field is (typeof FABRIC_MODEL_AUTO_FIELDS)[number] {\n return (FABRIC_MODEL_AUTO_FIELDS as readonly string[]).includes(field);\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","/**\n * Fallback Resolution Helper\n *\n * Resolves a field value with a fallback chain.\n */\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Resolve a field value with fallbacks\n *\n * @param entity - The entity to read from\n * @param field - The primary field name\n * @param fallbacks - Fallback field names in priority order\n * @returns First defined value, or undefined\n *\n * @example\n * ```typescript\n * const model = { title: undefined, name: \"My Model\", description: \"A description\" };\n * resolveWithFallback(model, \"title\", [\"name\", \"description\"]);\n * // Returns \"My Model\"\n * ```\n */\nexport function resolveWithFallback(\n entity: Record<string, unknown>,\n field: string,\n fallbacks: string[] = [],\n): unknown {\n // Check primary field\n if (entity[field] !== undefined) {\n return entity[field];\n }\n\n // Check fallbacks in order\n for (const fallback of fallbacks) {\n if (entity[fallback] !== undefined) {\n return entity[fallback];\n }\n }\n\n return undefined;\n}\n","/**\n * Resolved Name Helper\n *\n * Computes a resolved name from model fields using a priority chain.\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Model with optional name fields\n */\nexport interface ResolvedNameModel {\n abbreviation?: string;\n alias?: string;\n description?: string;\n name?: string;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Compute resolved name from model fields\n *\n * Priority: name > alias > abbreviation > description\n * Result is lowercase for consistent sorting/indexing\n *\n * @param model - The model to compute the resolved name from\n * @returns The resolved name (lowercase) or undefined if no name fields exist\n */\nexport function computeResolvedName(\n model: ResolvedNameModel,\n): string | undefined {\n const value =\n model.name || model.alias || model.abbreviation || model.description;\n return value?.toLowerCase();\n}\n","/**\n * Index Types for @jaypie/fabric\n *\n * Declarative index definitions for DynamoDB single-table design.\n * Models can specify their own indexes, and dynamodb will create\n * GSIs and auto-detect which index to use for queries.\n */\n\nimport type { FabricModel } from \"../models/base.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Index field - can be a FabricModel field name or custom field\n */\nexport type IndexField = keyof FabricModel | string;\n\n/**\n * Single index definition\n *\n * pk fields are combined with SEPARATOR to form the partition key.\n * sk fields are combined with SEPARATOR to form the sort key.\n */\nexport interface IndexDefinition {\n /** Name of the index (auto-generated from pk fields if not provided) */\n name?: string;\n /** Partition key fields - combined with SEPARATOR */\n pk: IndexField[];\n /** Sort key fields - combined with SEPARATOR (default: [\"sequence\"]) */\n sk?: IndexField[];\n /** Only create index key when ALL pk fields are present on model */\n sparse?: boolean;\n}\n\n/**\n * Model schema with index definitions\n */\nexport interface ModelSchema {\n /** The model name (e.g., \"record\", \"message\", \"chat\") */\n model: string;\n /** Custom indexes for this model (uses DEFAULT_INDEXES if not specified) */\n indexes?: IndexDefinition[];\n}\n\n// =============================================================================\n// Default Indexes\n// =============================================================================\n\n/**\n * Default indexes for the DynamoDB GSI pattern.\n * These are used when a model does not specify custom indexes.\n */\nexport const DEFAULT_INDEXES: IndexDefinition[] = [\n { name: \"indexScope\", pk: [\"scope\", \"model\"], sk: [\"sequence\"] },\n {\n name: \"indexAlias\",\n pk: [\"scope\", \"model\", \"alias\"],\n sk: [\"sequence\"],\n sparse: true,\n },\n {\n name: \"indexClass\",\n pk: [\"scope\", \"model\", \"class\"],\n sk: [\"sequence\"],\n sparse: true,\n },\n {\n name: \"indexType\",\n pk: [\"scope\", \"model\", \"type\"],\n sk: [\"sequence\"],\n sparse: true,\n },\n {\n name: \"indexXid\",\n pk: [\"scope\", \"model\", \"xid\"],\n sk: [\"sequence\"],\n sparse: true,\n },\n];\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/**\n * Default sort key fields when sk is not specified\n */\nexport const DEFAULT_SORT_KEY: IndexField[] = [\"sequence\"];\n\n/**\n * Suffix appended to index keys when model is archived\n */\nexport const ARCHIVED_SUFFIX = \"#archived\";\n\n/**\n * Suffix appended to index keys when model is deleted\n */\nexport const DELETED_SUFFIX = \"#deleted\";\n","/**\n * Key Builder for @jaypie/fabric\n *\n * Builds composite keys from model fields and index definitions.\n */\n\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport { SEPARATOR } from \"../constants.js\";\n\nimport {\n ARCHIVED_SUFFIX,\n DELETED_SUFFIX,\n type IndexDefinition,\n type IndexField,\n} from \"./types.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Model with fields for indexing.\n *\n * Does not extend FabricModel to allow flexibility with timestamp types\n * (DynamoDB uses string timestamps, FabricModel uses Date objects).\n */\nexport interface IndexableModel {\n /** Schema reference (required for indexing) */\n model: string;\n /** Scope (optional) */\n scope?: string;\n /** Chronological ordering timestamp (optional) */\n sequence?: number;\n /** Archived timestamp - presence triggers #archived suffix */\n archivedAt?: Date | string | null;\n /** Deleted timestamp - presence triggers #deleted suffix */\n deletedAt?: Date | string | null;\n /** Allow any additional fields */\n [key: string]: unknown;\n}\n\n// =============================================================================\n// Key Builders\n// =============================================================================\n\n/**\n * Build a composite key from model fields\n *\n * @param model - Model with fields to extract\n * @param fields - Field names to combine\n * @param suffix - Optional suffix to append (e.g., \"#deleted\")\n * @returns Composite key string (e.g., \"@#record#my-alias\")\n * @throws ConfigurationError if a required field is missing\n */\nexport function buildCompositeKey(\n model: IndexableModel,\n fields: IndexField[],\n suffix?: string,\n): string {\n const parts = fields.map((field) => {\n const value = model[field as keyof typeof model];\n if (value === undefined || value === null) {\n throw new ConfigurationError(`Missing field for index key: ${field}`);\n }\n return String(value);\n });\n\n const key = parts.join(SEPARATOR);\n return suffix ? key + suffix : key;\n}\n\n/**\n * Try to build a composite key, returning undefined if fields are missing\n *\n * @param model - Model with fields to extract\n * @param fields - Field names to combine\n * @param suffix - Optional suffix to append\n * @returns Composite key string or undefined if fields missing\n */\nexport function tryBuildCompositeKey(\n model: IndexableModel,\n fields: IndexField[],\n suffix?: string,\n): string | undefined {\n for (const field of fields) {\n const value = model[field as keyof typeof model];\n if (value === undefined || value === null) {\n return undefined;\n }\n }\n return buildCompositeKey(model, fields, suffix);\n}\n\n/**\n * Generate an index name from partition key fields\n *\n * @param pk - Partition key field names\n * @returns Generated index name (e.g., \"indexOuModelAlias\")\n */\nexport function generateIndexName(pk: IndexField[]): string {\n const suffix = pk\n .map((field) => {\n const str = String(field);\n return str.charAt(0).toUpperCase() + str.slice(1);\n })\n .join(\"\");\n return `index${suffix}`;\n}\n\n/**\n * Calculate the suffix for index keys based on model state\n *\n * @param model - Model to check for archived/deleted state\n * @returns Suffix string (e.g., \"\", \"#archived\", \"#deleted\", \"#archived#deleted\")\n */\nexport function calculateIndexSuffix(model: IndexableModel): string {\n let suffix = \"\";\n if (model.archivedAt !== undefined && model.archivedAt !== null) {\n suffix += ARCHIVED_SUFFIX;\n }\n if (model.deletedAt !== undefined && model.deletedAt !== null) {\n suffix += DELETED_SUFFIX;\n }\n return suffix;\n}\n\n/**\n * Populate index keys on a model based on index definitions\n *\n * Only the partition key composite is stored on the model (e.g., indexOu).\n * The sort key (e.g., sequence) is a regular field that the GSI references directly.\n *\n * @param model - Model to populate index keys on\n * @param indexes - Index definitions to use\n * @param suffix - Optional suffix to append to all index keys\n * @returns Model with index keys populated\n */\nexport function populateIndexKeys<T extends IndexableModel>(\n model: T,\n indexes: IndexDefinition[],\n suffix?: string,\n): T {\n const result = { ...model };\n const appliedSuffix = suffix ?? calculateIndexSuffix(model);\n\n for (const index of indexes) {\n const indexName = index.name ?? generateIndexName(index.pk);\n const pkKey = indexName as keyof T;\n\n // For sparse indexes, only populate if all pk fields are present\n if (index.sparse) {\n const pkValue = tryBuildCompositeKey(model, index.pk, appliedSuffix);\n if (pkValue !== undefined) {\n (result as Record<string, unknown>)[pkKey as string] = pkValue;\n }\n } else {\n // For non-sparse indexes, always try to populate (will throw if fields missing)\n const pkValue = tryBuildCompositeKey(model, index.pk, appliedSuffix);\n if (pkValue !== undefined) {\n (result as Record<string, unknown>)[pkKey as string] = pkValue;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Calculate scope from parent reference\n *\n * @param parent - Parent model with model and id\n * @returns Scope string (\"{parent.model}#{parent.id}\") or APEX (\"@\") if no parent\n */\nexport function calculateScope(parent?: { id: string; model: string }): string {\n if (!parent) {\n return \"@\"; // APEX\n }\n return `${parent.model}${SEPARATOR}${parent.id}`;\n}\n","/**\n * Model Registry for @jaypie/fabric\n *\n * Stores model schemas with their index definitions.\n * DynamoDB reads from this registry to create GSIs and select indexes for queries.\n */\n\nimport {\n DEFAULT_INDEXES,\n type IndexDefinition,\n type ModelSchema,\n} from \"./types.js\";\n\n// =============================================================================\n// Registry\n// =============================================================================\n\n/**\n * Global model registry - maps model names to their schemas\n */\nconst MODEL_REGISTRY = new Map<string, ModelSchema>();\n\n// =============================================================================\n// Functions\n// =============================================================================\n\n/**\n * Register a model schema with its index definitions\n *\n * @param schema - Model schema with model name and optional indexes\n */\nexport function registerModel(schema: ModelSchema): void {\n MODEL_REGISTRY.set(schema.model, schema);\n}\n\n/**\n * Get a model schema by name\n *\n * @param model - Model name to look up\n * @returns Model schema or undefined if not registered\n */\nexport function getModelSchema(model: string): ModelSchema | undefined {\n return MODEL_REGISTRY.get(model);\n}\n\n/**\n * Get index definitions for a model\n *\n * Returns the model's custom indexes if registered,\n * otherwise returns DEFAULT_INDEXES.\n *\n * @param model - Model name to get indexes for\n * @returns Array of index definitions\n */\nexport function getModelIndexes(model: string): IndexDefinition[] {\n const schema = MODEL_REGISTRY.get(model);\n return schema?.indexes ?? DEFAULT_INDEXES;\n}\n\n/**\n * Get all registered models\n *\n * @returns Array of model names\n */\nexport function getRegisteredModels(): string[] {\n return Array.from(MODEL_REGISTRY.keys());\n}\n\n/**\n * Get all unique indexes across all registered models\n *\n * Used by createTable to collect all GSIs that need to be created.\n * Deduplicates by index name.\n *\n * @returns Array of unique index definitions\n */\nexport function getAllRegisteredIndexes(): IndexDefinition[] {\n const indexMap = new Map<string, IndexDefinition>();\n\n // Collect indexes from all registered models\n for (const schema of MODEL_REGISTRY.values()) {\n const indexes = schema.indexes ?? [];\n for (const index of indexes) {\n const name = index.name ?? generateIndexNameFromPk(index.pk);\n if (!indexMap.has(name)) {\n indexMap.set(name, { ...index, name });\n }\n }\n }\n\n return Array.from(indexMap.values());\n}\n\n/**\n * Check if a model is registered\n *\n * @param model - Model name to check\n * @returns true if model is registered\n */\nexport function isModelRegistered(model: string): boolean {\n return MODEL_REGISTRY.has(model);\n}\n\n/**\n * Clear the model registry (for testing)\n */\nexport function clearRegistry(): void {\n MODEL_REGISTRY.clear();\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Generate an index name from pk fields (used when index.name is not set)\n */\nfunction generateIndexNameFromPk(pk: string[]): string {\n const suffix = pk\n .map((field) => {\n const str = String(field);\n return str.charAt(0).toUpperCase() + str.slice(1);\n })\n .join(\"\");\n return `index${suffix}`;\n}\n","/**\n * Elementary Field Types\n *\n * Defines the 10 elementary field types for the Fabric vocabulary.\n * Each type has: alias, name, icon, and optional validation/format rules.\n */\n\nimport type { FieldDefinition } from \"./fieldDefinition.js\";\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Elementary type aliases */\nexport const ELEMENTARY_TYPES = [\n \"boolean\",\n \"date\",\n \"datetime\",\n \"dollars\",\n \"multiselect\",\n \"number\",\n \"reference\",\n \"select\",\n \"text\",\n \"textarea\",\n] as const;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type ElementaryType = (typeof ELEMENTARY_TYPES)[number];\n\n/**\n * Extended field definition for elementary types\n */\nexport interface ElementaryTypeDefinition extends FieldDefinition {\n /** The elementary type alias */\n alias: ElementaryType;\n /** Display format pattern */\n formatPattern?: string;\n /** Input component type (for UI rendering) */\n inputComponent?: string;\n /** Options for select/multiselect types */\n options?: Array<{ label: string; value: string }>;\n /** Reference model for reference types */\n referenceModel?: string;\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Check if a string is an elementary type\n */\nexport function isElementaryType(value: unknown): value is ElementaryType {\n return (\n typeof value === \"string\" &&\n ELEMENTARY_TYPES.includes(value as ElementaryType)\n );\n}\n\n// =============================================================================\n// Elementary Type Definitions\n// =============================================================================\n\n/**\n * Boolean - True/false toggle\n */\nexport const BOOLEAN_TYPE: ElementaryTypeDefinition = {\n alias: \"boolean\",\n defaultValue: false,\n description: \"True/false toggle\",\n icon: \"lucide#toggle-left\",\n inputComponent: \"checkbox\",\n name: \"Boolean\",\n type: \"boolean\",\n};\n\n/**\n * Date - Date picker (ISO format)\n */\nexport const DATE_TYPE: ElementaryTypeDefinition = {\n alias: \"date\",\n description: \"Date value (YYYY-MM-DD)\",\n formatPattern: \"YYYY-MM-DD\",\n icon: \"lucide#calendar\",\n inputComponent: \"date-picker\",\n name: \"Date\",\n type: \"date\",\n};\n\n/**\n * Datetime - Date + time picker\n */\nexport const DATETIME_TYPE: ElementaryTypeDefinition = {\n alias: \"datetime\",\n description: \"Date and time value (ISO 8601)\",\n formatPattern: \"YYYY-MM-DDTHH:mm:ssZ\",\n icon: \"lucide#calendar-clock\",\n inputComponent: \"datetime-picker\",\n name: \"Date & Time\",\n type: \"datetime\",\n};\n\n/**\n * Dollars - Currency with formatting\n */\nexport const DOLLARS_TYPE: ElementaryTypeDefinition = {\n alias: \"dollars\",\n description: \"Currency value formatted as $X.XX\",\n formatPattern: \"$0,0.00\",\n icon: \"lucide#dollar-sign\",\n inputComponent: \"currency-input\",\n name: \"Dollars\",\n type: \"dollars\",\n validation: [\n { message: \"Must be a valid number\", type: \"numeric\" },\n { message: \"Cannot be negative\", type: \"min\", value: 0 },\n ],\n};\n\n/**\n * Multiselect - Multiple selections from options\n */\nexport const MULTISELECT_TYPE: ElementaryTypeDefinition = {\n alias: \"multiselect\",\n description: \"Multiple selections from predefined options\",\n icon: \"lucide#list-checks\",\n inputComponent: \"multiselect\",\n name: \"Multi-Select\",\n options: [], // Populated per-field\n type: \"multiselect\",\n};\n\n/**\n * Number - Numeric input (integer or float)\n */\nexport const NUMBER_TYPE: ElementaryTypeDefinition = {\n alias: \"number\",\n description: \"Numeric value (integer or decimal)\",\n icon: \"lucide#hash\",\n inputComponent: \"input[type=number]\",\n name: \"Number\",\n type: \"number\",\n validation: [{ message: \"Must be a valid number\", type: \"numeric\" }],\n};\n\n/**\n * Reference - Link to another model\n */\nexport const REFERENCE_TYPE: ElementaryTypeDefinition = {\n alias: \"reference\",\n description: \"Link to another model by id or alias\",\n icon: \"lucide#link\",\n inputComponent: \"entity-picker\",\n name: \"Reference\",\n referenceModel: undefined, // Set per-field\n type: \"reference\",\n};\n\n/**\n * Select - Single selection from options\n */\nexport const SELECT_TYPE: ElementaryTypeDefinition = {\n alias: \"select\",\n description: \"Single selection from predefined options\",\n icon: \"lucide#list\",\n inputComponent: \"select\",\n name: \"Select\",\n options: [], // Populated per-field\n type: \"select\",\n};\n\n/**\n * Text - Single-line string input\n */\nexport const TEXT_TYPE: ElementaryTypeDefinition = {\n alias: \"text\",\n description: \"Single-line text input\",\n icon: \"lucide#type\",\n inputComponent: \"input\",\n name: \"Text\",\n type: \"text\",\n};\n\n/**\n * Textarea - Multi-line string input\n */\nexport const TEXTAREA_TYPE: ElementaryTypeDefinition = {\n alias: \"textarea\",\n description: \"Multi-line text input\",\n icon: \"lucide#align-left\",\n inputComponent: \"textarea\",\n name: \"Text Area\",\n type: \"textarea\",\n};\n\n// =============================================================================\n// Type Registry\n// =============================================================================\n\n/**\n * Registry of all elementary types\n */\nexport const ELEMENTARY_TYPE_REGISTRY: Record<\n ElementaryType,\n ElementaryTypeDefinition\n> = {\n boolean: BOOLEAN_TYPE,\n date: DATE_TYPE,\n datetime: DATETIME_TYPE,\n dollars: DOLLARS_TYPE,\n multiselect: MULTISELECT_TYPE,\n number: NUMBER_TYPE,\n reference: REFERENCE_TYPE,\n select: SELECT_TYPE,\n text: TEXT_TYPE,\n textarea: TEXTAREA_TYPE,\n};\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Get an elementary type definition by alias\n */\nexport function getElementaryType(\n alias: ElementaryType,\n): ElementaryTypeDefinition {\n return ELEMENTARY_TYPE_REGISTRY[alias];\n}\n\n/**\n * Get all elementary type definitions\n */\nexport function getAllElementaryTypes(): ElementaryTypeDefinition[] {\n return Object.values(ELEMENTARY_TYPE_REGISTRY);\n}\n","/**\n * Field Definition - Describes a field's structure and behavior\n *\n * Field definitions are the building blocks of model definitions,\n * specifying type, validation, and metadata for each field.\n */\n\n// =============================================================================\n// Interfaces\n// =============================================================================\n\n/**\n * Validation rule for a field\n */\nexport interface ValidationRule {\n /** Error message if validation fails */\n message?: string;\n /** Rule type (required, min, max, pattern, etc.) */\n type: string;\n /** Rule value (varies by type) */\n value?: unknown;\n}\n\n/**\n * Field definition - describes a field's structure and behavior\n */\nexport interface FieldDefinition {\n /** Field identifier (unique within model) */\n alias: string;\n /** Default value */\n defaultValue?: unknown;\n /** Description */\n description?: string;\n /** Fallback chain for value resolution */\n fallback?: string[];\n /** Icon (lucide name or custom) */\n icon?: string;\n /** Display name */\n name: string;\n /** Field type (text, number, dollars, etc.) */\n type: string;\n /** Validation rules */\n validation?: ValidationRule[];\n}\n\n/**\n * Field reference - either an alias string or inline definition\n */\nexport type FieldRef = FieldDefinition | string;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Check if a field ref is an inline definition\n */\nexport function isFieldDefinition(ref: FieldRef): ref is FieldDefinition {\n return typeof ref === \"object\" && \"alias\" in ref && \"type\" in ref;\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","// ServiceSuite for @jaypie/fabric\n// Groups fabricService instances for discovery, metadata export, and direct execution\n\nimport type { InputFieldDefinition, Service } from \"./types.js\";\n\n/**\n * Describes a single input parameter for a service\n */\nexport interface ServiceInput {\n name: string;\n type: string;\n required: boolean;\n description: string;\n enum?: string[];\n}\n\n/**\n * Describes a service's metadata for discovery and documentation\n */\nexport interface ServiceMeta {\n /** Service name (from alias) */\n name: string;\n /** Human-readable description */\n description: string;\n /** Category for grouping (e.g., \"record\", \"aws\", \"docs\") */\n category: string;\n /** Input parameter definitions */\n inputs: ServiceInput[];\n /** Whether the service can be executed with no inputs */\n executable?: boolean;\n}\n\n/**\n * A collection of services with metadata and execution capabilities\n */\nexport interface ServiceSuite {\n /** Suite name (e.g., \"nostrus\", \"jaypie\") */\n name: string;\n /** Suite version */\n version: string;\n /** Available categories */\n categories: string[];\n /** All registered services */\n services: ServiceMeta[];\n\n /** Get a service by name */\n getService(name: string): ServiceMeta | undefined;\n /** Get services by category */\n getServicesByCategory(category: string): ServiceMeta[];\n\n /** Execute a service by name */\n execute(name: string, inputs: Record<string, unknown>): Promise<unknown>;\n\n /** Register a fabricService into the suite */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(service: Service<any, any>, category: string): void;\n\n /** Get all registered service functions (for transport adapters like FabricMcpServer) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getServiceFunctions(): Service<any, any>[];\n\n /** Get a specific service function by name */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getServiceFunction(name: string): Service<any, any> | undefined;\n}\n\n/**\n * Configuration for creating a ServiceSuite\n */\nexport interface CreateServiceSuiteConfig {\n name: string;\n version: string;\n}\n\n/**\n * Derive type string from InputFieldDefinition.type\n */\nfunction deriveTypeString(type: InputFieldDefinition[\"type\"]): string {\n // Handle constructors\n if (type === String || type === \"string\") return \"string\";\n if (type === Number || type === \"number\") return \"number\";\n if (type === Boolean || type === \"boolean\") return \"boolean\";\n if (type === Object || type === \"object\") return \"object\";\n if (type === Array || type === \"array\") return \"array\";\n if (type === Date) return \"string\"; // Dates are passed as strings\n\n // Handle typed arrays: [String], [Number], etc.\n if (Array.isArray(type)) {\n if (type.length === 0) return \"array\";\n const first = type[0];\n // If it's a type constructor, it's a typed array\n if (\n first === String ||\n first === Number ||\n first === Boolean ||\n first === Object ||\n first === \"string\" ||\n first === \"number\" ||\n first === \"boolean\" ||\n first === \"object\" ||\n first === \"\"\n ) {\n return \"array\";\n }\n // If all elements are strings (or RegExp), it's a validated string enum\n if (type.every((item) => typeof item === \"string\" || item instanceof RegExp)) {\n return \"string\";\n }\n // If all elements are numbers, it's a validated number enum\n if (type.every((item) => typeof item === \"number\")) {\n return \"number\";\n }\n return \"array\";\n }\n\n // Handle RegExp (validated string)\n if (type instanceof RegExp) {\n return \"string\";\n }\n\n return \"string\"; // Default fallback\n}\n\n/**\n * Extract enum values if the type is a validated string/number array\n */\nfunction extractEnumValues(type: InputFieldDefinition[\"type\"]): string[] | undefined {\n if (!Array.isArray(type)) return undefined;\n if (type.length === 0) return undefined;\n\n // Check if it's a validated string enum (array of strings, possibly with RegExp)\n const stringValues = type.filter((item): item is string => typeof item === \"string\");\n if (stringValues.length > 0 && stringValues.length === type.filter((item) => typeof item === \"string\").length) {\n // All non-RegExp items are strings\n return stringValues;\n }\n\n // Check if it's a validated number enum\n if (type.every((item) => typeof item === \"number\")) {\n return type.map((n) => String(n));\n }\n\n return undefined;\n}\n\n/**\n * Convert fabricService input definitions to ServiceInput array\n */\nfunction extractInputs(\n inputDefinitions?: Record<string, InputFieldDefinition>,\n): ServiceInput[] {\n if (!inputDefinitions) return [];\n\n return Object.entries(inputDefinitions).map(([name, def]) => {\n const required =\n def.required !== false && def.default === undefined;\n const enumValues = extractEnumValues(def.type);\n\n return {\n name,\n type: deriveTypeString(def.type),\n required,\n description: def.description || \"\",\n ...(enumValues && { enum: enumValues }),\n };\n });\n}\n\n/**\n * Check if a service has any required inputs\n */\nfunction hasRequiredInputs(inputs: ServiceInput[]): boolean {\n return inputs.some((input) => input.required);\n}\n\n/**\n * Create a ServiceSuite instance\n */\nexport function createServiceSuite(config: CreateServiceSuiteConfig): ServiceSuite {\n const { name, version } = config;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const serviceRegistry = new Map<string, {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n service: Service<any, any>;\n meta: ServiceMeta;\n }>();\n const categorySet = new Set<string>();\n\n const suite: ServiceSuite = {\n name,\n version,\n\n get categories(): string[] {\n return Array.from(categorySet).sort();\n },\n\n get services(): ServiceMeta[] {\n return Array.from(serviceRegistry.values()).map((entry) => entry.meta);\n },\n\n getService(serviceName: string): ServiceMeta | undefined {\n return serviceRegistry.get(serviceName)?.meta;\n },\n\n getServicesByCategory(category: string): ServiceMeta[] {\n return Array.from(serviceRegistry.values())\n .filter((entry) => entry.meta.category === category)\n .map((entry) => entry.meta);\n },\n\n async execute(\n serviceName: string,\n inputs: Record<string, unknown>,\n ): Promise<unknown> {\n const entry = serviceRegistry.get(serviceName);\n if (!entry) {\n throw new Error(`Service \"${serviceName}\" not found in suite \"${name}\"`);\n }\n return entry.service(inputs);\n },\n\n register(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n service: Service<any, any>,\n category: string,\n ): void {\n const serviceName = service.alias;\n if (!serviceName) {\n throw new Error(\"Service must have an alias to be registered\");\n }\n\n const inputs = extractInputs(service.input);\n const meta: ServiceMeta = {\n name: serviceName,\n description: service.description || \"\",\n category,\n inputs,\n executable: !hasRequiredInputs(inputs),\n };\n\n serviceRegistry.set(serviceName, { service, meta });\n categorySet.add(category);\n },\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getServiceFunctions(): Service<any, any>[] {\n return Array.from(serviceRegistry.values()).map((entry) => entry.service);\n },\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getServiceFunction(serviceName: string): Service<any, any> | undefined {\n return serviceRegistry.get(serviceName)?.service;\n },\n };\n\n return suite;\n}\n","/**\n * Status Type for @jaypie/fabric\n *\n * Standard status values for fields that track processing state.\n */\n\n/**\n * Valid status values for status fields\n */\nexport const STATUS_VALUES = [\n \"canceled\",\n \"complete\",\n \"error\",\n \"pending\",\n \"processing\",\n \"queued\",\n \"sending\",\n] as const;\n\n/**\n * TypeScript type for status values\n */\nexport type Status = (typeof STATUS_VALUES)[number];\n\n/**\n * Status type for use in createService input definitions\n *\n * Usage:\n * ```typescript\n * const handler = createService({\n * input: {\n * status: { type: StatusType, description: \"Current status\" },\n * },\n * });\n * ```\n */\nexport const StatusType = [...STATUS_VALUES] as (\n | \"canceled\"\n | \"complete\"\n | \"error\"\n | \"pending\"\n | \"processing\"\n | \"queued\"\n | \"sending\"\n)[];\n\n/**\n * Check if a value is a valid status\n */\nexport function isStatus(value: unknown): value is Status {\n return (\n typeof value === \"string\" &&\n STATUS_VALUES.includes(value as (typeof STATUS_VALUES)[number])\n );\n}\n"],"names":["BadRequestError","ConfigurationError"],"mappings":"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"}
|