@proofkit/fmodata 0.1.0-alpha.2 → 0.1.0-alpha.20
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/README.md +1250 -377
- package/dist/esm/client/batch-builder.d.ts +56 -0
- package/dist/esm/client/batch-builder.js +238 -0
- package/dist/esm/client/batch-builder.js.map +1 -0
- package/dist/esm/client/batch-request.d.ts +61 -0
- package/dist/esm/client/batch-request.js +252 -0
- package/dist/esm/client/batch-request.js.map +1 -0
- package/dist/esm/client/builders/default-select.d.ts +10 -0
- package/dist/esm/client/builders/default-select.js +43 -0
- package/dist/esm/client/builders/default-select.js.map +1 -0
- package/dist/esm/client/builders/expand-builder.d.ts +45 -0
- package/dist/esm/client/builders/expand-builder.js +174 -0
- package/dist/esm/client/builders/expand-builder.js.map +1 -0
- package/dist/esm/client/builders/index.d.ts +8 -0
- package/dist/esm/client/builders/query-string-builder.d.ts +18 -0
- package/dist/esm/client/builders/query-string-builder.js +25 -0
- package/dist/esm/client/builders/query-string-builder.js.map +1 -0
- package/dist/esm/client/builders/response-processor.d.ts +43 -0
- package/dist/esm/client/builders/response-processor.js +176 -0
- package/dist/esm/client/builders/response-processor.js.map +1 -0
- package/dist/esm/client/builders/select-mixin.d.ts +32 -0
- package/dist/esm/client/builders/select-mixin.js +30 -0
- package/dist/esm/client/builders/select-mixin.js.map +1 -0
- package/dist/esm/client/builders/select-utils.d.ts +18 -0
- package/dist/esm/client/builders/select-utils.js +23 -0
- package/dist/esm/client/builders/select-utils.js.map +1 -0
- package/dist/esm/client/builders/shared-types.d.ts +40 -0
- package/dist/esm/client/builders/table-utils.d.ts +35 -0
- package/dist/esm/client/builders/table-utils.js +45 -0
- package/dist/esm/client/builders/table-utils.js.map +1 -0
- package/dist/esm/client/database.d.ts +68 -15
- package/dist/esm/client/database.js +88 -34
- package/dist/esm/client/database.js.map +1 -1
- package/dist/esm/client/delete-builder.d.ts +31 -17
- package/dist/esm/client/delete-builder.js +114 -47
- package/dist/esm/client/delete-builder.js.map +1 -1
- package/dist/esm/client/entity-set.d.ts +33 -27
- package/dist/esm/client/entity-set.js +123 -45
- package/dist/esm/client/entity-set.js.map +1 -1
- package/dist/esm/client/error-parser.d.ts +12 -0
- package/dist/esm/client/error-parser.js +30 -0
- package/dist/esm/client/error-parser.js.map +1 -0
- package/dist/esm/client/filemaker-odata.d.ts +44 -6
- package/dist/esm/client/filemaker-odata.js +172 -28
- package/dist/esm/client/filemaker-odata.js.map +1 -1
- package/dist/esm/client/insert-builder.d.ts +39 -9
- package/dist/esm/client/insert-builder.js +265 -36
- package/dist/esm/client/insert-builder.js.map +1 -1
- package/dist/esm/client/query/expand-builder.d.ts +35 -0
- package/dist/esm/client/query/index.d.ts +3 -0
- package/dist/esm/client/query/query-builder.d.ts +139 -0
- package/dist/esm/client/query/query-builder.js +481 -0
- package/dist/esm/client/query/query-builder.js.map +1 -0
- package/dist/esm/client/query/response-processor.d.ts +25 -0
- package/dist/esm/client/query/types.d.ts +77 -0
- package/dist/esm/client/query/url-builder.d.ts +71 -0
- package/dist/esm/client/query/url-builder.js +107 -0
- package/dist/esm/client/query/url-builder.js.map +1 -0
- package/dist/esm/client/query-builder.d.ts +1 -94
- package/dist/esm/client/record-builder.d.ts +107 -22
- package/dist/esm/client/record-builder.js +342 -64
- package/dist/esm/client/record-builder.js.map +1 -1
- package/dist/esm/client/response-processor.d.ts +33 -0
- package/dist/esm/client/sanitize-json.d.ts +35 -0
- package/dist/esm/client/sanitize-json.js +27 -0
- package/dist/esm/client/sanitize-json.js.map +1 -0
- package/dist/esm/client/schema-manager.d.ts +57 -0
- package/dist/esm/client/schema-manager.js +132 -0
- package/dist/esm/client/schema-manager.js.map +1 -0
- package/dist/esm/client/update-builder.d.ts +42 -25
- package/dist/esm/client/update-builder.js +179 -46
- package/dist/esm/client/update-builder.js.map +1 -1
- package/dist/esm/client/webhook-builder.d.ts +126 -0
- package/dist/esm/client/webhook-builder.js +197 -0
- package/dist/esm/client/webhook-builder.js.map +1 -0
- package/dist/esm/errors.d.ts +90 -0
- package/dist/esm/errors.js +180 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +12 -4
- package/dist/esm/index.js +59 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/logger.d.ts +47 -0
- package/dist/esm/logger.js +72 -0
- package/dist/esm/logger.js.map +1 -0
- package/dist/esm/logger.test.d.ts +1 -0
- package/dist/esm/orm/column.d.ts +62 -0
- package/dist/esm/orm/column.js +62 -0
- package/dist/esm/orm/column.js.map +1 -0
- package/dist/esm/orm/field-builders.d.ts +164 -0
- package/dist/esm/orm/field-builders.js +168 -0
- package/dist/esm/orm/field-builders.js.map +1 -0
- package/dist/esm/orm/index.d.ts +4 -0
- package/dist/esm/orm/operators.d.ts +175 -0
- package/dist/esm/orm/operators.js +242 -0
- package/dist/esm/orm/operators.js.map +1 -0
- package/dist/esm/orm/table.d.ts +355 -0
- package/dist/esm/orm/table.js +200 -0
- package/dist/esm/orm/table.js.map +1 -0
- package/dist/esm/transform.d.ts +64 -0
- package/dist/esm/transform.js +110 -0
- package/dist/esm/transform.js.map +1 -0
- package/dist/esm/types.d.ts +157 -7
- package/dist/esm/types.js +7 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/validation.d.ts +22 -9
- package/dist/esm/validation.js +195 -50
- package/dist/esm/validation.js.map +1 -1
- package/package.json +19 -4
- package/src/client/batch-builder.ts +334 -0
- package/src/client/batch-request.ts +485 -0
- package/src/client/builders/default-select.ts +80 -0
- package/src/client/builders/expand-builder.ts +245 -0
- package/src/client/builders/index.ts +11 -0
- package/src/client/builders/query-string-builder.ts +49 -0
- package/src/client/builders/response-processor.ts +286 -0
- package/src/client/builders/select-mixin.ts +75 -0
- package/src/client/builders/select-utils.ts +56 -0
- package/src/client/builders/shared-types.ts +42 -0
- package/src/client/builders/table-utils.ts +87 -0
- package/src/client/database.ts +147 -89
- package/src/client/delete-builder.ts +189 -87
- package/src/client/entity-set.ts +316 -205
- package/src/client/error-parser.ts +59 -0
- package/src/client/filemaker-odata.ts +254 -41
- package/src/client/insert-builder.ts +420 -49
- package/src/client/query/expand-builder.ts +164 -0
- package/src/client/query/index.ts +13 -0
- package/src/client/query/query-builder.ts +905 -0
- package/src/client/query/response-processor.ts +236 -0
- package/src/client/query/types.ts +128 -0
- package/src/client/query/url-builder.ts +179 -0
- package/src/client/query-builder.ts +8 -1076
- package/src/client/record-builder.ts +704 -139
- package/src/client/response-processor.ts +89 -0
- package/src/client/sanitize-json.ts +66 -0
- package/src/client/schema-manager.ts +246 -0
- package/src/client/update-builder.ts +318 -90
- package/src/client/webhook-builder.ts +285 -0
- package/src/errors.ts +261 -0
- package/src/index.ts +122 -14
- package/src/logger.test.ts +34 -0
- package/src/logger.ts +140 -0
- package/src/orm/column.ts +106 -0
- package/src/orm/field-builders.ts +318 -0
- package/src/orm/index.ts +60 -0
- package/src/orm/operators.ts +487 -0
- package/src/orm/table.ts +759 -0
- package/src/transform.ts +263 -0
- package/src/types.ts +275 -55
- package/src/validation.ts +255 -55
- package/dist/esm/client/base-table.d.ts +0 -13
- package/dist/esm/client/base-table.js +0 -19
- package/dist/esm/client/base-table.js.map +0 -1
- package/dist/esm/client/query-builder.js +0 -649
- package/dist/esm/client/query-builder.js.map +0 -1
- package/dist/esm/client/table-occurrence.d.ts +0 -25
- package/dist/esm/client/table-occurrence.js +0 -47
- package/dist/esm/client/table-occurrence.js.map +0 -1
- package/dist/esm/filter-types.d.ts +0 -76
- package/src/client/base-table.ts +0 -25
- package/src/client/table-occurrence.ts +0 -100
- package/src/filter-types.ts +0 -97
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query-builder.js","sources":["../../../src/client/query-builder.ts"],"sourcesContent":["import { QueryOptions } from \"odata-query\";\nimport buildQuery from \"odata-query\";\nimport type {\n ExecutionContext,\n ExecutableBuilder,\n WithSystemFields,\n ODataRecordMetadata,\n Result,\n InferSchemaType,\n ExecuteOptions,\n ConditionallyWithODataAnnotations,\n ExtractSchemaFromOccurrence,\n} from \"../types\";\nimport type { Filter } from \"../filter-types\";\nimport type { TableOccurrence } from \"./table-occurrence\";\nimport type { BaseTable } from \"./base-table\";\nimport { validateListResponse, validateSingleResponse } from \"../validation\";\nimport { type FFetchOptions } from \"@fetchkit/ffetch\";\nimport { z } from \"zod/v4\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\n// Helper type to extract navigation relation names from an occurrence\ntype ExtractNavigationNames<\n O extends TableOccurrence<any, any, any, any> | undefined,\n> =\n O extends TableOccurrence<any, any, infer Nav, any>\n ? Nav extends Record<string, any>\n ? keyof Nav & string\n : never\n : never;\n\n// Helper type to resolve a navigation item (handles both direct and lazy-loaded)\ntype ResolveNavigationItem<T> = T extends () => infer R ? R : T;\n\n// Helper type to find target occurrence by relation name\ntype FindNavigationTarget<\n O extends TableOccurrence<any, any, any, any> | undefined,\n Name extends string,\n> =\n O extends TableOccurrence<any, any, infer Nav, any>\n ? Nav extends Record<string, any>\n ? Name extends keyof Nav\n ? ResolveNavigationItem<Nav[Name]>\n : TableOccurrence<\n BaseTable<Record<string, z.ZodTypeAny>, any>,\n any,\n any,\n any\n >\n : TableOccurrence<\n BaseTable<Record<string, z.ZodTypeAny>, any>,\n any,\n any,\n any\n >\n : TableOccurrence<\n BaseTable<Record<string, z.ZodTypeAny>, any>,\n any,\n any,\n any\n >;\n\n// Helper type to get the inferred schema type from a target occurrence\ntype GetTargetSchemaType<\n O extends TableOccurrence<any, any, any, any> | undefined,\n Rel extends string,\n> = [FindNavigationTarget<O, Rel>] extends [\n TableOccurrence<infer BT, any, any, any>,\n]\n ? [BT] extends [BaseTable<infer S, any>]\n ? [S] extends [Record<string, StandardSchemaV1>]\n ? InferSchemaType<S>\n : Record<string, any>\n : Record<string, any>\n : Record<string, any>;\n\n// Internal type for expand configuration\ntype ExpandConfig = {\n relation: string;\n options?: Partial<QueryOptions<any>>;\n};\n\n// Type to represent expanded relations\ntype ExpandedRelations = Record<string, { schema: any; selected: any }>;\n\nexport class QueryBuilder<\n T extends Record<string, any>,\n Selected extends keyof T = keyof T,\n SingleMode extends \"exact\" | \"maybe\" | false = false,\n IsCount extends boolean = false,\n Occ extends TableOccurrence<any, any, any, any> | undefined = undefined,\n Expands extends ExpandedRelations = {},\n> {\n private queryOptions: Partial<QueryOptions<T>> = {};\n private expandConfigs: ExpandConfig[] = [];\n private singleMode: SingleMode = false as SingleMode;\n private isCountMode = false as IsCount;\n private occurrence?: Occ;\n private tableName: string;\n private databaseName: string;\n private context: ExecutionContext;\n private isNavigate?: boolean;\n private navigateRecordId?: string | number;\n private navigateRelation?: string;\n private navigateSourceTableName?: string;\n private navigateBaseRelation?: string;\n constructor(config: {\n occurrence?: Occ;\n tableName: string;\n databaseName: string;\n context: ExecutionContext;\n }) {\n this.occurrence = config.occurrence;\n this.tableName = config.tableName;\n this.databaseName = config.databaseName;\n this.context = config.context;\n }\n\n /**\n * Helper to conditionally strip OData annotations based on options\n */\n private stripODataAnnotationsIfNeeded<T extends Record<string, any>>(\n data: T,\n options?: ExecuteOptions,\n ): T {\n // Only include annotations if explicitly requested\n if (options?.includeODataAnnotations === true) {\n return data;\n }\n\n // Strip OData annotations\n const { \"@id\": _id, \"@editLink\": _editLink, ...rest } = data;\n return rest as T;\n }\n\n select<K extends keyof T>(\n ...fields: K[]\n ): QueryBuilder<T, K, SingleMode, IsCount, Occ, Expands> {\n const uniqueFields = [...new Set(fields)];\n const newBuilder = new QueryBuilder<\n T,\n K,\n SingleMode,\n IsCount,\n Occ,\n Expands\n >({\n occurrence: this.occurrence,\n tableName: this.tableName,\n databaseName: this.databaseName,\n context: this.context,\n });\n newBuilder.queryOptions = {\n ...this.queryOptions,\n select: uniqueFields as string[],\n };\n newBuilder.expandConfigs = [...this.expandConfigs];\n newBuilder.singleMode = this.singleMode;\n newBuilder.isCountMode = this.isCountMode;\n // Preserve navigation metadata\n newBuilder.isNavigate = this.isNavigate;\n newBuilder.navigateRecordId = this.navigateRecordId;\n newBuilder.navigateRelation = this.navigateRelation;\n newBuilder.navigateSourceTableName = this.navigateSourceTableName;\n newBuilder.navigateBaseRelation = this.navigateBaseRelation;\n return newBuilder;\n }\n\n /**\n * Transforms our filter format to odata-query's expected format\n * - Arrays of operators are converted to AND conditions\n * - Single operator objects pass through as-is\n * - Shorthand values are handled by odata-query\n */\n private transformFilter(\n filter: Filter<ExtractSchemaFromOccurrence<Occ>>,\n ): QueryOptions<T>[\"filter\"] {\n if (typeof filter === \"string\") {\n // Raw string filters pass through\n return filter;\n }\n\n if (Array.isArray(filter)) {\n // Array of filters - odata-query handles this as implicit AND\n return filter.map((f) => this.transformFilter(f as any)) as any;\n }\n\n // Check if it's a logical filter (and/or/not)\n if (\"and\" in filter || \"or\" in filter || \"not\" in filter) {\n const result: any = {};\n if (\"and\" in filter && Array.isArray(filter.and)) {\n result.and = filter.and.map((f: any) => this.transformFilter(f));\n }\n if (\"or\" in filter && Array.isArray(filter.or)) {\n result.or = filter.or.map((f: any) => this.transformFilter(f));\n }\n if (\"not\" in filter && filter.not) {\n result.not = this.transformFilter(filter.not as any);\n }\n return result;\n }\n\n // Transform field filters\n const result: any = {};\n const andConditions: any[] = [];\n\n for (const [field, value] of Object.entries(filter)) {\n if (Array.isArray(value)) {\n // Array of operators - convert to AND conditions\n if (value.length === 1) {\n // Single operator in array - unwrap it\n result[field] = value[0];\n } else {\n // Multiple operators - combine with AND\n // Create separate conditions for each operator\n for (const op of value) {\n andConditions.push({ [field]: op });\n }\n }\n } else if (\n value &&\n typeof value === \"object\" &&\n !(value instanceof Date) &&\n !Array.isArray(value)\n ) {\n // Check if it's an operator object (has operator keys like eq, gt, etc.)\n const operatorKeys = [\n \"eq\",\n \"ne\",\n \"gt\",\n \"ge\",\n \"lt\",\n \"le\",\n \"contains\",\n \"startswith\",\n \"endswith\",\n \"in\",\n ];\n const isOperatorObject = operatorKeys.some((key) => key in value);\n\n if (isOperatorObject) {\n // Single operator object - pass through\n result[field] = value;\n } else {\n // Regular object - might be nested filter, pass through\n result[field] = value;\n }\n } else {\n // Primitive value (shorthand) - pass through\n result[field] = value;\n }\n }\n\n // If we have AND conditions from arrays, combine them\n if (andConditions.length > 0) {\n if (Object.keys(result).length > 0) {\n // We have both regular fields and array-derived AND conditions\n // Combine everything with AND\n return { and: [...andConditions, result] };\n } else {\n // Only array-derived AND conditions\n return { and: andConditions };\n }\n }\n\n return result;\n }\n\n filter(\n filter: Filter<ExtractSchemaFromOccurrence<Occ>>,\n ): QueryBuilder<T, Selected, SingleMode, IsCount, Occ, Expands> {\n // Transform our filter format to odata-query's expected format\n this.queryOptions.filter = this.transformFilter(filter) as any;\n return this;\n }\n\n orderBy(\n orderBy: QueryOptions<T>[\"orderBy\"],\n ): QueryBuilder<T, Selected, SingleMode, IsCount, Occ, Expands> {\n this.queryOptions.orderBy = orderBy;\n return this;\n }\n\n top(\n count: number,\n ): QueryBuilder<T, Selected, SingleMode, IsCount, Occ, Expands> {\n this.queryOptions.top = count;\n return this;\n }\n\n skip(\n count: number,\n ): QueryBuilder<T, Selected, SingleMode, IsCount, Occ, Expands> {\n this.queryOptions.skip = count;\n return this;\n }\n\n /**\n * Formats select fields for use in query strings.\n * - Wraps \"id\" fields in double quotes\n * - URL-encodes special characters but preserves spaces\n */\n private formatSelectFields(select: QueryOptions<any>[\"select\"]): string {\n if (!select) return \"\";\n const selectFieldsArray = Array.isArray(select) ? select : [select];\n return selectFieldsArray\n .map((field) => {\n if (field === \"id\") return `\"id\"`;\n const encodedField = encodeURIComponent(String(field));\n return encodedField.replace(/%20/g, \" \");\n })\n .join(\",\");\n }\n\n /**\n * Builds expand validation configs from internal expand configurations.\n * These are used to validate expanded navigation properties.\n */\n private buildExpandValidationConfigs(\n configs: ExpandConfig[],\n ): import(\"../validation\").ExpandValidationConfig[] {\n return configs.map((config) => {\n // Look up target occurrence from navigation\n const targetOccurrence = this.occurrence?.navigation[config.relation];\n const targetSchema = targetOccurrence?.baseTable?.schema;\n\n // Extract selected fields from options\n const selectedFields = config.options?.select\n ? Array.isArray(config.options.select)\n ? config.options.select.map((f) => String(f))\n : [String(config.options.select)]\n : undefined;\n\n return {\n relation: config.relation,\n targetSchema: targetSchema,\n targetOccurrence: targetOccurrence,\n selectedFields: selectedFields,\n nestedExpands: undefined, // TODO: Handle nested expands if needed\n };\n });\n }\n\n /**\n * Builds OData expand query string from expand configurations.\n * Handles nested expands recursively.\n */\n private buildExpandString(configs: ExpandConfig[]): string {\n if (configs.length === 0) {\n return \"\";\n }\n\n return configs\n .map((config) => {\n if (!config.options || Object.keys(config.options).length === 0) {\n // Simple expand without options\n return config.relation;\n }\n\n // Build query options for this expand\n const parts: string[] = [];\n\n if (config.options.select) {\n const selectFields = this.formatSelectFields(config.options.select);\n parts.push(`$select=${selectFields}`);\n }\n\n if (config.options.filter) {\n // Use odata-query to build filter string\n const filterQuery = buildQuery({ filter: config.options.filter });\n const filterMatch = filterQuery.match(/\\$filter=([^&]+)/);\n if (filterMatch) {\n parts.push(`$filter=${filterMatch[1]}`);\n }\n }\n\n if (config.options.orderBy) {\n const orderByValue = Array.isArray(config.options.orderBy)\n ? config.options.orderBy.join(\",\")\n : config.options.orderBy;\n parts.push(`$orderby=${String(orderByValue)}`);\n }\n\n if (config.options.top !== undefined) {\n parts.push(`$top=${config.options.top}`);\n }\n\n if (config.options.skip !== undefined) {\n parts.push(`$skip=${config.options.skip}`);\n }\n\n // Handle nested expands (from expand configs)\n if (config.options.expand) {\n // If expand is a string, it's already been built\n if (typeof config.options.expand === \"string\") {\n parts.push(`$expand=${config.options.expand}`);\n }\n }\n\n if (parts.length === 0) {\n return config.relation;\n }\n\n return `${config.relation}(${parts.join(\";\")})`;\n })\n .join(\",\");\n }\n\n expand<\n Rel extends ExtractNavigationNames<Occ> | (string & {}),\n TargetOcc extends FindNavigationTarget<Occ, Rel> = FindNavigationTarget<\n Occ,\n Rel\n >,\n TargetSchema extends GetTargetSchemaType<Occ, Rel> = GetTargetSchemaType<\n Occ,\n Rel\n >,\n TargetSelected extends keyof TargetSchema = keyof TargetSchema,\n >(\n relation: Rel,\n callback?: (\n builder: QueryBuilder<\n TargetSchema,\n keyof TargetSchema,\n false,\n false,\n TargetOcc extends TableOccurrence<any, any, any, any>\n ? TargetOcc\n : undefined\n >,\n ) => QueryBuilder<\n WithSystemFields<TargetSchema>,\n TargetSelected,\n any,\n any,\n any\n >,\n ): QueryBuilder<\n T,\n Selected,\n SingleMode,\n IsCount,\n Occ,\n Expands & {\n [K in Rel]: { schema: TargetSchema; selected: TargetSelected };\n }\n > {\n // Look up target occurrence from navigation\n const targetOccurrence = this.occurrence?.navigation[relation as string];\n\n if (callback) {\n // Create a new QueryBuilder for the target occurrence\n const targetBuilder = new QueryBuilder<any>({\n occurrence: targetOccurrence,\n tableName: targetOccurrence?.name ?? (relation as string),\n databaseName: this.databaseName,\n context: this.context,\n });\n\n // Cast to the expected type for the callback\n // At runtime, the builder is untyped (any), but at compile-time we enforce proper types\n const typedBuilder = targetBuilder as QueryBuilder<\n TargetSchema,\n keyof TargetSchema,\n false,\n false,\n TargetOcc extends TableOccurrence<any, any, any, any>\n ? TargetOcc\n : undefined\n >;\n\n // Pass to callback and get configured builder\n const configuredBuilder = callback(typedBuilder);\n\n // Extract the builder's query options\n const expandOptions: Partial<QueryOptions<any>> = {\n ...configuredBuilder.queryOptions,\n };\n\n // If the configured builder has nested expands, we need to include them\n if (configuredBuilder.expandConfigs.length > 0) {\n // Build nested expand string from the configured builder's expand configs\n const nestedExpandString = this.buildExpandString(\n configuredBuilder.expandConfigs,\n );\n if (nestedExpandString) {\n // Add nested expand to options\n expandOptions.expand = nestedExpandString as any;\n }\n }\n\n const expandConfig: ExpandConfig = {\n relation: relation as string,\n options: expandOptions,\n };\n\n this.expandConfigs.push(expandConfig);\n } else {\n // Simple expand without callback\n this.expandConfigs.push({ relation: relation as string });\n }\n\n return this as any;\n }\n\n single(): QueryBuilder<T, Selected, \"exact\", IsCount, Occ, Expands> {\n const newBuilder = new QueryBuilder<\n T,\n Selected,\n \"exact\",\n IsCount,\n Occ,\n Expands\n >({\n occurrence: this.occurrence,\n tableName: this.tableName,\n databaseName: this.databaseName,\n context: this.context,\n });\n newBuilder.queryOptions = { ...this.queryOptions };\n newBuilder.expandConfigs = [...this.expandConfigs];\n newBuilder.singleMode = \"exact\";\n newBuilder.isCountMode = this.isCountMode;\n // Preserve navigation metadata\n newBuilder.isNavigate = this.isNavigate;\n newBuilder.navigateRecordId = this.navigateRecordId;\n newBuilder.navigateRelation = this.navigateRelation;\n newBuilder.navigateSourceTableName = this.navigateSourceTableName;\n newBuilder.navigateBaseRelation = this.navigateBaseRelation;\n return newBuilder;\n }\n\n maybeSingle(): QueryBuilder<T, Selected, \"maybe\", IsCount, Occ, Expands> {\n const newBuilder = new QueryBuilder<\n T,\n Selected,\n \"maybe\",\n IsCount,\n Occ,\n Expands\n >({\n occurrence: this.occurrence,\n tableName: this.tableName,\n databaseName: this.databaseName,\n context: this.context,\n });\n newBuilder.queryOptions = { ...this.queryOptions };\n newBuilder.expandConfigs = [...this.expandConfigs];\n newBuilder.singleMode = \"maybe\";\n newBuilder.isCountMode = this.isCountMode;\n // Preserve navigation metadata\n newBuilder.isNavigate = this.isNavigate;\n newBuilder.navigateRecordId = this.navigateRecordId;\n newBuilder.navigateRelation = this.navigateRelation;\n newBuilder.navigateSourceTableName = this.navigateSourceTableName;\n newBuilder.navigateBaseRelation = this.navigateBaseRelation;\n return newBuilder;\n }\n\n count(): QueryBuilder<T, Selected, SingleMode, true, Occ, Expands> {\n const newBuilder = new QueryBuilder<\n T,\n Selected,\n SingleMode,\n true,\n Occ,\n Expands\n >({\n occurrence: this.occurrence,\n tableName: this.tableName,\n databaseName: this.databaseName,\n context: this.context,\n });\n newBuilder.queryOptions = { ...this.queryOptions, count: true };\n newBuilder.expandConfigs = [...this.expandConfigs];\n newBuilder.singleMode = this.singleMode;\n newBuilder.isCountMode = true as true;\n // Preserve navigation metadata\n newBuilder.isNavigate = this.isNavigate;\n newBuilder.navigateRecordId = this.navigateRecordId;\n newBuilder.navigateRelation = this.navigateRelation;\n newBuilder.navigateSourceTableName = this.navigateSourceTableName;\n newBuilder.navigateBaseRelation = this.navigateBaseRelation;\n return newBuilder;\n }\n\n async execute<EO extends ExecuteOptions>(\n options?: RequestInit & FFetchOptions & EO,\n ): Promise<\n Result<\n IsCount extends true\n ? number\n : SingleMode extends \"exact\"\n ? ConditionallyWithODataAnnotations<\n Pick<T, Selected> & {\n [K in keyof Expands]: Pick<\n Expands[K][\"schema\"],\n Expands[K][\"selected\"]\n >[];\n },\n EO[\"includeODataAnnotations\"] extends true ? true : false\n >\n : SingleMode extends \"maybe\"\n ? ConditionallyWithODataAnnotations<\n Pick<T, Selected> & {\n [K in keyof Expands]: Pick<\n Expands[K][\"schema\"],\n Expands[K][\"selected\"]\n >[];\n },\n EO[\"includeODataAnnotations\"] extends true ? true : false\n > | null\n : ConditionallyWithODataAnnotations<\n Pick<T, Selected> & {\n [K in keyof Expands]: Pick<\n Expands[K][\"schema\"],\n Expands[K][\"selected\"]\n >[];\n },\n EO[\"includeODataAnnotations\"] extends true ? true : false\n >[]\n >\n > {\n try {\n // Build query without expand (we'll add it manually)\n const queryOptionsWithoutExpand = { ...this.queryOptions };\n delete queryOptionsWithoutExpand.expand;\n\n // Format select fields before building query\n if (queryOptionsWithoutExpand.select) {\n queryOptionsWithoutExpand.select = this.formatSelectFields(\n queryOptionsWithoutExpand.select,\n ) as any;\n }\n\n let queryString = buildQuery(queryOptionsWithoutExpand);\n\n // Build custom expand string\n const expandString = this.buildExpandString(this.expandConfigs);\n if (expandString) {\n const separator = queryString.includes(\"?\") ? \"&\" : \"?\";\n queryString = `${queryString}${separator}$expand=${expandString}`;\n }\n\n // Handle navigation from RecordBuilder\n if (\n this.isNavigate &&\n this.navigateRecordId &&\n this.navigateRelation &&\n this.navigateSourceTableName\n ) {\n let url: string;\n if (this.navigateBaseRelation) {\n // Navigation from a navigated EntitySet: /sourceTable/baseRelation('recordId')/relation\n url = `/${this.databaseName}/${this.navigateSourceTableName}/${this.navigateBaseRelation}('${this.navigateRecordId}')/${this.navigateRelation}${queryString}`;\n } else {\n // Normal navigation: /sourceTable('recordId')/relation\n url = `/${this.databaseName}/${this.navigateSourceTableName}('${this.navigateRecordId}')/${this.navigateRelation}${queryString}`;\n }\n const response = await this.context._makeRequest(url, options);\n\n // Skip validation if requested\n if (options?.skipValidation === true) {\n const resp = response as any;\n if (this.singleMode !== false) {\n const records = resp.value ?? [resp];\n const count = Array.isArray(records) ? records.length : 1;\n\n if (count > 1) {\n return {\n data: undefined,\n error: new Error(\n `Expected ${this.singleMode === \"exact\" ? \"exactly one\" : \"at most one\"} record, but received ${count}`,\n ),\n };\n }\n\n if (count === 0) {\n if (this.singleMode === \"exact\") {\n return {\n data: undefined,\n error: new Error(\n \"Expected exactly one record, but received none\",\n ),\n };\n }\n return { data: null as any, error: undefined };\n }\n\n const record = Array.isArray(records) ? records[0] : records;\n const stripped = this.stripODataAnnotationsIfNeeded(\n record,\n options,\n );\n return { data: stripped as any, error: undefined };\n } else {\n const records = resp.value ?? [];\n const stripped = records.map((record: any) =>\n this.stripODataAnnotationsIfNeeded(record, options),\n );\n return { data: stripped as any, error: undefined };\n }\n }\n\n // Get schema from occurrence if available\n const schema = this.occurrence?.baseTable?.schema;\n const selectedFields = this.queryOptions.select as\n | (keyof T)[]\n | undefined;\n const expandValidationConfigs = this.buildExpandValidationConfigs(\n this.expandConfigs,\n );\n\n if (this.singleMode !== false) {\n const validation = await validateSingleResponse<T>(\n response,\n schema,\n selectedFields,\n expandValidationConfigs,\n this.singleMode,\n );\n if (!validation.valid) {\n return { data: undefined, error: validation.error };\n }\n const stripped = validation.data\n ? this.stripODataAnnotationsIfNeeded(validation.data, options)\n : null;\n return { data: stripped as any, error: undefined };\n } else {\n const validation = await validateListResponse<T>(\n response,\n schema,\n selectedFields,\n expandValidationConfigs,\n );\n if (!validation.valid) {\n return { data: undefined, error: validation.error };\n }\n const stripped = validation.data.map((record) =>\n this.stripODataAnnotationsIfNeeded(record, options),\n );\n return { data: stripped as any, error: undefined };\n }\n }\n\n // Handle navigation from EntitySet (without record ID)\n if (\n this.isNavigate &&\n !this.navigateRecordId &&\n this.navigateRelation &&\n this.navigateSourceTableName\n ) {\n const response = await this.context._makeRequest(\n `/${this.databaseName}/${this.navigateSourceTableName}/${this.navigateRelation}${queryString}`,\n options,\n );\n\n // Skip validation if requested\n if (options?.skipValidation === true) {\n const resp = response as any;\n if (this.singleMode !== false) {\n const records = resp.value ?? [resp];\n const count = Array.isArray(records) ? records.length : 1;\n\n if (count > 1) {\n return {\n data: undefined,\n error: new Error(\n `Expected ${this.singleMode === \"exact\" ? \"exactly one\" : \"at most one\"} record, but received ${count}`,\n ),\n };\n }\n\n if (count === 0) {\n if (this.singleMode === \"exact\") {\n return {\n data: undefined,\n error: new Error(\n \"Expected exactly one record, but received none\",\n ),\n };\n }\n return { data: null as any, error: undefined };\n }\n\n const record = Array.isArray(records) ? records[0] : records;\n const stripped = this.stripODataAnnotationsIfNeeded(\n record,\n options,\n );\n return { data: stripped as any, error: undefined };\n } else {\n const records = resp.value ?? [];\n const stripped = records.map((record: any) =>\n this.stripODataAnnotationsIfNeeded(record, options),\n );\n return { data: stripped as any, error: undefined };\n }\n }\n\n // Get schema from occurrence if available\n const schema = this.occurrence?.baseTable?.schema;\n const selectedFields = this.queryOptions.select as\n | (keyof T)[]\n | undefined;\n const expandValidationConfigs = this.buildExpandValidationConfigs(\n this.expandConfigs,\n );\n\n if (this.singleMode !== false) {\n const validation = await validateSingleResponse<T>(\n response,\n schema,\n selectedFields,\n expandValidationConfigs,\n this.singleMode,\n );\n if (!validation.valid) {\n return { data: undefined, error: validation.error };\n }\n const stripped = validation.data\n ? this.stripODataAnnotationsIfNeeded(validation.data, options)\n : null;\n return { data: stripped as any, error: undefined };\n } else {\n const validation = await validateListResponse<T>(\n response,\n schema,\n selectedFields,\n expandValidationConfigs,\n );\n if (!validation.valid) {\n return { data: undefined, error: validation.error };\n }\n const stripped = validation.data.map((record) =>\n this.stripODataAnnotationsIfNeeded(record, options),\n );\n return { data: stripped as any, error: undefined };\n }\n }\n\n // Handle $count endpoint\n if (this.isCountMode) {\n const result = await this.context._makeRequest(\n `/${this.databaseName}/${this.tableName}/$count${queryString}`,\n options,\n );\n // OData returns count as a string, convert to number\n const count = typeof result === \"string\" ? Number(result) : result;\n return { data: count as number, error: undefined } as any;\n }\n\n const response = await this.context._makeRequest(\n `/${this.databaseName}/${this.tableName}${queryString}`,\n options,\n );\n\n // Skip validation if requested\n if (options?.skipValidation === true) {\n const resp = response as any;\n if (this.singleMode !== false) {\n const records = resp.value ?? [resp];\n const count = Array.isArray(records) ? records.length : 1;\n\n if (count > 1) {\n return {\n data: undefined,\n error: new Error(\n `Expected ${this.singleMode === \"exact\" ? \"exactly one\" : \"at most one\"} record, but received ${count}`,\n ),\n };\n }\n\n if (count === 0) {\n if (this.singleMode === \"exact\") {\n return {\n data: undefined,\n error: new Error(\n \"Expected exactly one record, but received none\",\n ),\n };\n }\n return { data: null as any, error: undefined };\n }\n\n const record = Array.isArray(records) ? records[0] : records;\n const stripped = this.stripODataAnnotationsIfNeeded(record, options);\n return { data: stripped as any, error: undefined };\n } else {\n // Handle list response structure\n const records = resp.value ?? [];\n const stripped = records.map((record: any) =>\n this.stripODataAnnotationsIfNeeded(record, options),\n );\n return { data: stripped as any, error: undefined };\n }\n }\n\n // Get schema from occurrence if available\n const schema = this.occurrence?.baseTable?.schema;\n const selectedFields = this.queryOptions.select as\n | (keyof T)[]\n | undefined;\n const expandValidationConfigs = this.buildExpandValidationConfigs(\n this.expandConfigs,\n );\n\n if (this.singleMode !== false) {\n const validation = await validateSingleResponse<T>(\n response,\n schema,\n selectedFields,\n expandValidationConfigs,\n this.singleMode,\n );\n if (!validation.valid) {\n return { data: undefined, error: validation.error };\n }\n const stripped = validation.data\n ? this.stripODataAnnotationsIfNeeded(validation.data, options)\n : null;\n return {\n data: stripped as any,\n error: undefined,\n };\n } else {\n const validation = await validateListResponse<T>(\n response,\n schema,\n selectedFields,\n expandValidationConfigs,\n );\n if (!validation.valid) {\n return { data: undefined, error: validation.error };\n }\n const stripped = validation.data.map((record) =>\n this.stripODataAnnotationsIfNeeded(record, options),\n );\n return {\n data: stripped as any,\n error: undefined,\n };\n }\n } catch (error) {\n return {\n data: undefined,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n getQueryString(): string {\n // Build query without expand (we'll add it manually)\n const queryOptionsWithoutExpand = { ...this.queryOptions };\n delete queryOptionsWithoutExpand.expand;\n\n // Format select fields before building query - buildQuery treats & as separator,\n // so we need to pre-encode special characters. buildQuery preserves encoded values.\n if (queryOptionsWithoutExpand.select) {\n queryOptionsWithoutExpand.select = this.formatSelectFields(\n queryOptionsWithoutExpand.select,\n ) as any;\n }\n\n let queryParams = buildQuery(queryOptionsWithoutExpand);\n\n // Post-process: buildQuery encodes spaces as %20, but we want to preserve spaces\n // Replace %20 with spaces in the $select part\n if (this.queryOptions.select) {\n queryParams = queryParams.replace(\n /\\$select=([^&]*)/,\n (match, selectValue) => {\n return `$select=${selectValue.replace(/%20/g, \" \")}`;\n },\n );\n }\n const expandString = this.buildExpandString(this.expandConfigs);\n if (expandString) {\n const separator = queryParams.includes(\"?\") ? \"&\" : \"?\";\n queryParams = `${queryParams}${separator}$expand=${expandString}`;\n }\n\n // Handle navigation from RecordBuilder (with record ID)\n if (\n this.isNavigate &&\n this.navigateRecordId &&\n this.navigateRelation &&\n this.navigateSourceTableName\n ) {\n let path: string;\n if (this.navigateBaseRelation) {\n // Navigation from a navigated EntitySet: /sourceTable/baseRelation('recordId')/relation\n path = `/${this.navigateSourceTableName}/${this.navigateBaseRelation}('${this.navigateRecordId}')/${this.navigateRelation}`;\n } else {\n // Normal navigation: /sourceTableName('recordId')/relationName\n path = `/${this.navigateSourceTableName}('${this.navigateRecordId}')/${this.navigateRelation}`;\n }\n // Append query params if any exist\n return queryParams ? `${path}${queryParams}` : path;\n }\n\n // Handle navigation from EntitySet (without record ID)\n if (\n this.isNavigate &&\n !this.navigateRecordId &&\n this.navigateRelation &&\n this.navigateSourceTableName\n ) {\n // Return the path portion: /sourceTableName/relationName\n const path = `/${this.navigateSourceTableName}/${this.navigateRelation}`;\n // Append query params if any exist\n return queryParams ? `${path}${queryParams}` : path;\n }\n\n // Default case: return table name with query params\n return `/${this.tableName}${queryParams}`;\n }\n\n getRequestConfig(): { method: string; url: string; body?: any } {\n // Build query without expand (we'll add it manually)\n const queryOptionsWithoutExpand = { ...this.queryOptions };\n delete queryOptionsWithoutExpand.expand;\n\n // Format select fields before building query\n if (queryOptionsWithoutExpand.select) {\n queryOptionsWithoutExpand.select = this.formatSelectFields(\n queryOptionsWithoutExpand.select,\n ) as any;\n }\n\n let queryString = buildQuery(queryOptionsWithoutExpand);\n\n // Build custom expand string\n const expandString = this.buildExpandString(this.expandConfigs);\n if (expandString) {\n const separator = queryString.includes(\"?\") ? \"&\" : \"?\";\n queryString = `${queryString}${separator}$expand=${expandString}`;\n }\n\n let url: string;\n\n // Handle navigation from RecordBuilder (with record ID)\n if (\n this.isNavigate &&\n this.navigateRecordId &&\n this.navigateRelation &&\n this.navigateSourceTableName\n ) {\n if (this.navigateBaseRelation) {\n // Navigation from a navigated EntitySet: /sourceTable/baseRelation('recordId')/relation\n url = `/${this.databaseName}/${this.navigateSourceTableName}/${this.navigateBaseRelation}('${this.navigateRecordId}')/${this.navigateRelation}${queryString}`;\n } else {\n // Normal navigation: /sourceTable('recordId')/relation\n url = `/${this.databaseName}/${this.navigateSourceTableName}('${this.navigateRecordId}')/${this.navigateRelation}${queryString}`;\n }\n } else if (\n this.isNavigate &&\n !this.navigateRecordId &&\n this.navigateRelation &&\n this.navigateSourceTableName\n ) {\n // Handle navigation from EntitySet (without record ID)\n url = `/${this.databaseName}/${this.navigateSourceTableName}/${this.navigateRelation}${queryString}`;\n } else if (this.isCountMode) {\n url = `/${this.databaseName}/${this.tableName}/$count${queryString}`;\n } else {\n url = `/${this.databaseName}/${this.tableName}${queryString}`;\n }\n\n return {\n method: \"GET\",\n url,\n };\n }\n}\n"],"names":["result","response","schema","selectedFields","expandValidationConfigs"],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { BaseTable } from './base-table.js';
|
|
2
|
-
type ExtractSchema<BT> = BT extends BaseTable<infer S, any, any, any> ? S : never;
|
|
3
|
-
type ResolveNavigation<T> = {
|
|
4
|
-
[K in keyof T]: T[K] extends () => infer R ? R : T[K];
|
|
5
|
-
};
|
|
6
|
-
export declare class TableOccurrence<BT extends BaseTable<any, any, any, any> = any, Name extends string = string, Nav extends Record<string, TableOccurrence<any, any, any, any> | (() => TableOccurrence<any, any, any, any>)> = {}, DefSelect extends "all" | "schema" | readonly (keyof ExtractSchema<BT>)[] = "schema"> {
|
|
7
|
-
readonly name: Name;
|
|
8
|
-
readonly baseTable: BT;
|
|
9
|
-
private _navigationConfig;
|
|
10
|
-
readonly navigation: ResolveNavigation<Nav>;
|
|
11
|
-
readonly defaultSelect: DefSelect;
|
|
12
|
-
constructor(config: {
|
|
13
|
-
readonly name: Name;
|
|
14
|
-
readonly baseTable: BT;
|
|
15
|
-
readonly navigation?: Nav;
|
|
16
|
-
readonly defaultSelect?: DefSelect;
|
|
17
|
-
});
|
|
18
|
-
addNavigation<NewNav extends Record<string, TableOccurrence<any, any, any, any> | (() => TableOccurrence<any, any, any, any>)>>(nav: NewNav): TableOccurrence<BT, Name, Nav & NewNav, DefSelect>;
|
|
19
|
-
}
|
|
20
|
-
export declare function createTableOccurrence<const Name extends string, BT extends BaseTable<any, any, any, any>, DefSelect extends "all" | "schema" | readonly (keyof ExtractSchema<BT>)[] = "schema">(config: {
|
|
21
|
-
name: Name;
|
|
22
|
-
baseTable: BT;
|
|
23
|
-
defaultSelect?: DefSelect;
|
|
24
|
-
}): TableOccurrence<BT, Name, {}, DefSelect>;
|
|
25
|
-
export {};
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
-
function createNavigationGetters(navConfig) {
|
|
5
|
-
const result = {};
|
|
6
|
-
for (const key in navConfig) {
|
|
7
|
-
Object.defineProperty(result, key, {
|
|
8
|
-
get() {
|
|
9
|
-
const navItem = navConfig[key];
|
|
10
|
-
return typeof navItem === "function" ? navItem() : navItem;
|
|
11
|
-
},
|
|
12
|
-
enumerable: true,
|
|
13
|
-
configurable: true
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
return result;
|
|
17
|
-
}
|
|
18
|
-
class TableOccurrence {
|
|
19
|
-
constructor(config) {
|
|
20
|
-
__publicField(this, "name");
|
|
21
|
-
__publicField(this, "baseTable");
|
|
22
|
-
__publicField(this, "_navigationConfig");
|
|
23
|
-
__publicField(this, "navigation");
|
|
24
|
-
__publicField(this, "defaultSelect");
|
|
25
|
-
this.name = config.name;
|
|
26
|
-
this.baseTable = config.baseTable;
|
|
27
|
-
this._navigationConfig = config.navigation ?? {};
|
|
28
|
-
this.defaultSelect = config.defaultSelect ?? "schema";
|
|
29
|
-
this.navigation = createNavigationGetters(this._navigationConfig);
|
|
30
|
-
}
|
|
31
|
-
addNavigation(nav) {
|
|
32
|
-
return new TableOccurrence({
|
|
33
|
-
name: this.name,
|
|
34
|
-
baseTable: this.baseTable,
|
|
35
|
-
navigation: { ...this._navigationConfig, ...nav },
|
|
36
|
-
defaultSelect: this.defaultSelect
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
function createTableOccurrence(config) {
|
|
41
|
-
return new TableOccurrence(config);
|
|
42
|
-
}
|
|
43
|
-
export {
|
|
44
|
-
TableOccurrence,
|
|
45
|
-
createTableOccurrence
|
|
46
|
-
};
|
|
47
|
-
//# sourceMappingURL=table-occurrence.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"table-occurrence.js","sources":["../../../src/client/table-occurrence.ts"],"sourcesContent":["import { BaseTable } from \"./base-table\";\n\n// Helper type to extract schema from BaseTable\ntype ExtractSchema<BT> =\n BT extends BaseTable<infer S, any, any, any> ? S : never;\n\n// Helper type to resolve navigation functions to their return types\ntype ResolveNavigation<T> = {\n [K in keyof T]: T[K] extends () => infer R ? R : T[K];\n};\n\n// Helper to create a getter-based navigation object\nfunction createNavigationGetters<\n Nav extends Record<\n string,\n | TableOccurrence<any, any, any, any>\n | (() => TableOccurrence<any, any, any, any>)\n >,\n>(navConfig: Nav): ResolveNavigation<Nav> {\n const result: any = {};\n\n for (const key in navConfig) {\n Object.defineProperty(result, key, {\n get() {\n const navItem = navConfig[key];\n return typeof navItem === \"function\" ? navItem() : navItem;\n },\n enumerable: true,\n configurable: true,\n });\n }\n\n return result as ResolveNavigation<Nav>;\n}\n\nexport class TableOccurrence<\n BT extends BaseTable<any, any, any, any> = any,\n Name extends string = string,\n Nav extends Record<\n string,\n | TableOccurrence<any, any, any, any>\n | (() => TableOccurrence<any, any, any, any>)\n > = {},\n DefSelect extends\n | \"all\"\n | \"schema\"\n | readonly (keyof ExtractSchema<BT>)[] = \"schema\",\n> {\n public readonly name: Name;\n public readonly baseTable: BT;\n private _navigationConfig: Nav;\n public readonly navigation: ResolveNavigation<Nav>;\n public readonly defaultSelect: DefSelect;\n\n constructor(config: {\n readonly name: Name;\n readonly baseTable: BT;\n readonly navigation?: Nav;\n readonly defaultSelect?: DefSelect;\n }) {\n this.name = config.name;\n this.baseTable = config.baseTable;\n this._navigationConfig = (config.navigation ?? {}) as Nav;\n this.defaultSelect = (config.defaultSelect ?? \"schema\") as DefSelect;\n\n // Create navigation getters that lazily resolve functions\n this.navigation = createNavigationGetters(this._navigationConfig);\n }\n\n addNavigation<\n NewNav extends Record<\n string,\n | TableOccurrence<any, any, any, any>\n | (() => TableOccurrence<any, any, any, any>)\n >,\n >(nav: NewNav): TableOccurrence<BT, Name, Nav & NewNav, DefSelect> {\n return new TableOccurrence({\n name: this.name,\n baseTable: this.baseTable,\n navigation: { ...this._navigationConfig, ...nav } as Nav & NewNav,\n defaultSelect: this.defaultSelect,\n });\n }\n}\n\n// Helper function to create TableOccurrence with proper type inference\nexport function createTableOccurrence<\n const Name extends string,\n BT extends BaseTable<any, any, any, any>,\n DefSelect extends\n | \"all\"\n | \"schema\"\n | readonly (keyof ExtractSchema<BT>)[] = \"schema\",\n>(config: {\n name: Name;\n baseTable: BT;\n defaultSelect?: DefSelect;\n}): TableOccurrence<BT, Name, {}, DefSelect> {\n return new TableOccurrence(config);\n}\n"],"names":[],"mappings":";;;AAYA,SAAS,wBAMP,WAAwC;AACxC,QAAM,SAAc,CAAC;AAErB,aAAW,OAAO,WAAW;AACpB,WAAA,eAAe,QAAQ,KAAK;AAAA,MACjC,MAAM;AACE,cAAA,UAAU,UAAU,GAAG;AAC7B,eAAO,OAAO,YAAY,aAAa,QAAY,IAAA;AAAA,MACrD;AAAA,MACA,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AAAA,EAAA;AAGI,SAAA;AACT;AAEO,MAAM,gBAYX;AAAA,EAOA,YAAY,QAKT;AAXa;AACA;AACR;AACQ;AACA;AAQd,SAAK,OAAO,OAAO;AACnB,SAAK,YAAY,OAAO;AACnB,SAAA,oBAAqB,OAAO,cAAc,CAAC;AAC3C,SAAA,gBAAiB,OAAO,iBAAiB;AAGzC,SAAA,aAAa,wBAAwB,KAAK,iBAAiB;AAAA,EAAA;AAAA,EAGlE,cAME,KAAiE;AACjE,WAAO,IAAI,gBAAgB;AAAA,MACzB,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,MAChB,YAAY,EAAE,GAAG,KAAK,mBAAmB,GAAG,IAAI;AAAA,MAChD,eAAe,KAAK;AAAA,IAAA,CACrB;AAAA,EAAA;AAEL;AAGO,SAAS,sBAOd,QAI2C;AACpC,SAAA,IAAI,gBAAgB,MAAM;AACnC;"}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { StandardSchemaV1 } from '@standard-schema/spec';
|
|
2
|
-
export type StringOperators = {
|
|
3
|
-
eq: string | null;
|
|
4
|
-
} | {
|
|
5
|
-
ne: string | null;
|
|
6
|
-
} | {
|
|
7
|
-
gt: string;
|
|
8
|
-
} | {
|
|
9
|
-
ge: string;
|
|
10
|
-
} | {
|
|
11
|
-
lt: string;
|
|
12
|
-
} | {
|
|
13
|
-
le: string;
|
|
14
|
-
} | {
|
|
15
|
-
contains: string;
|
|
16
|
-
} | {
|
|
17
|
-
startswith: string;
|
|
18
|
-
} | {
|
|
19
|
-
endswith: string;
|
|
20
|
-
} | {
|
|
21
|
-
in: string[];
|
|
22
|
-
};
|
|
23
|
-
export type NumberOperators = {
|
|
24
|
-
eq: number | null;
|
|
25
|
-
} | {
|
|
26
|
-
ne: number | null;
|
|
27
|
-
} | {
|
|
28
|
-
gt: number;
|
|
29
|
-
} | {
|
|
30
|
-
ge: number;
|
|
31
|
-
} | {
|
|
32
|
-
lt: number;
|
|
33
|
-
} | {
|
|
34
|
-
le: number;
|
|
35
|
-
} | {
|
|
36
|
-
in: number[];
|
|
37
|
-
};
|
|
38
|
-
export type BooleanOperators = {
|
|
39
|
-
eq: boolean | null;
|
|
40
|
-
} | {
|
|
41
|
-
ne: boolean | null;
|
|
42
|
-
};
|
|
43
|
-
export type DateOperators = {
|
|
44
|
-
eq: Date | null;
|
|
45
|
-
} | {
|
|
46
|
-
ne: Date | null;
|
|
47
|
-
} | {
|
|
48
|
-
gt: Date;
|
|
49
|
-
} | {
|
|
50
|
-
ge: Date;
|
|
51
|
-
} | {
|
|
52
|
-
lt: Date;
|
|
53
|
-
} | {
|
|
54
|
-
le: Date;
|
|
55
|
-
} | {
|
|
56
|
-
in: Date[];
|
|
57
|
-
};
|
|
58
|
-
export type InferOutput<S> = S extends StandardSchemaV1<any, infer Output> ? Output : never;
|
|
59
|
-
export type OperatorsForType<T> = T extends string | null | undefined ? StringOperators : T extends number | null | undefined ? NumberOperators : T extends boolean | null | undefined ? BooleanOperators : T extends Date | null | undefined ? DateOperators : never;
|
|
60
|
-
export type OperatorsForSchemaField<S extends StandardSchemaV1> = OperatorsForType<InferOutput<S>>;
|
|
61
|
-
export type FieldFilter<S extends StandardSchemaV1> = InferOutput<S> | OperatorsForSchemaField<S> | Array<OperatorsForSchemaField<S>>;
|
|
62
|
-
export type LogicalFilter<Schema extends Record<string, StandardSchemaV1>> = {
|
|
63
|
-
and?: Array<TypedFilter<Schema>>;
|
|
64
|
-
or?: Array<TypedFilter<Schema>>;
|
|
65
|
-
not?: TypedFilter<Schema>;
|
|
66
|
-
};
|
|
67
|
-
type IsUntypedSchema<Schema> = [
|
|
68
|
-
Record<string, StandardSchemaV1>
|
|
69
|
-
] extends [Schema] ? [Schema] extends [Record<string, StandardSchemaV1>] ? true : false : false;
|
|
70
|
-
export type TypedFilter<Schema extends Record<string, StandardSchemaV1>> = LogicalFilter<Schema> | (IsUntypedSchema<Schema> extends true ? {
|
|
71
|
-
[key: string]: FieldFilter<any> | any;
|
|
72
|
-
} & {} : {
|
|
73
|
-
[K in keyof Schema]?: FieldFilter<Schema[K]>;
|
|
74
|
-
});
|
|
75
|
-
export type Filter<Schema extends Record<string, StandardSchemaV1>> = TypedFilter<Schema> | Array<TypedFilter<Schema>> | string;
|
|
76
|
-
export {};
|
package/src/client/base-table.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
-
|
|
3
|
-
export class BaseTable<
|
|
4
|
-
Schema extends Record<string, StandardSchemaV1> = any,
|
|
5
|
-
IdField extends keyof Schema | undefined = undefined,
|
|
6
|
-
InsertRequired extends readonly (keyof Schema)[] = readonly [],
|
|
7
|
-
UpdateRequired extends readonly (keyof Schema)[] = readonly [],
|
|
8
|
-
> {
|
|
9
|
-
public readonly schema: Schema;
|
|
10
|
-
public readonly idField?: IdField;
|
|
11
|
-
public readonly insertRequired?: InsertRequired;
|
|
12
|
-
public readonly updateRequired?: UpdateRequired;
|
|
13
|
-
|
|
14
|
-
constructor(config: {
|
|
15
|
-
schema: Schema;
|
|
16
|
-
idField?: IdField;
|
|
17
|
-
insertRequired?: InsertRequired;
|
|
18
|
-
updateRequired?: UpdateRequired;
|
|
19
|
-
}) {
|
|
20
|
-
this.schema = config.schema;
|
|
21
|
-
this.idField = config.idField;
|
|
22
|
-
this.insertRequired = config.insertRequired;
|
|
23
|
-
this.updateRequired = config.updateRequired;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { BaseTable } from "./base-table";
|
|
2
|
-
|
|
3
|
-
// Helper type to extract schema from BaseTable
|
|
4
|
-
type ExtractSchema<BT> =
|
|
5
|
-
BT extends BaseTable<infer S, any, any, any> ? S : never;
|
|
6
|
-
|
|
7
|
-
// Helper type to resolve navigation functions to their return types
|
|
8
|
-
type ResolveNavigation<T> = {
|
|
9
|
-
[K in keyof T]: T[K] extends () => infer R ? R : T[K];
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
// Helper to create a getter-based navigation object
|
|
13
|
-
function createNavigationGetters<
|
|
14
|
-
Nav extends Record<
|
|
15
|
-
string,
|
|
16
|
-
| TableOccurrence<any, any, any, any>
|
|
17
|
-
| (() => TableOccurrence<any, any, any, any>)
|
|
18
|
-
>,
|
|
19
|
-
>(navConfig: Nav): ResolveNavigation<Nav> {
|
|
20
|
-
const result: any = {};
|
|
21
|
-
|
|
22
|
-
for (const key in navConfig) {
|
|
23
|
-
Object.defineProperty(result, key, {
|
|
24
|
-
get() {
|
|
25
|
-
const navItem = navConfig[key];
|
|
26
|
-
return typeof navItem === "function" ? navItem() : navItem;
|
|
27
|
-
},
|
|
28
|
-
enumerable: true,
|
|
29
|
-
configurable: true,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return result as ResolveNavigation<Nav>;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export class TableOccurrence<
|
|
37
|
-
BT extends BaseTable<any, any, any, any> = any,
|
|
38
|
-
Name extends string = string,
|
|
39
|
-
Nav extends Record<
|
|
40
|
-
string,
|
|
41
|
-
| TableOccurrence<any, any, any, any>
|
|
42
|
-
| (() => TableOccurrence<any, any, any, any>)
|
|
43
|
-
> = {},
|
|
44
|
-
DefSelect extends
|
|
45
|
-
| "all"
|
|
46
|
-
| "schema"
|
|
47
|
-
| readonly (keyof ExtractSchema<BT>)[] = "schema",
|
|
48
|
-
> {
|
|
49
|
-
public readonly name: Name;
|
|
50
|
-
public readonly baseTable: BT;
|
|
51
|
-
private _navigationConfig: Nav;
|
|
52
|
-
public readonly navigation: ResolveNavigation<Nav>;
|
|
53
|
-
public readonly defaultSelect: DefSelect;
|
|
54
|
-
|
|
55
|
-
constructor(config: {
|
|
56
|
-
readonly name: Name;
|
|
57
|
-
readonly baseTable: BT;
|
|
58
|
-
readonly navigation?: Nav;
|
|
59
|
-
readonly defaultSelect?: DefSelect;
|
|
60
|
-
}) {
|
|
61
|
-
this.name = config.name;
|
|
62
|
-
this.baseTable = config.baseTable;
|
|
63
|
-
this._navigationConfig = (config.navigation ?? {}) as Nav;
|
|
64
|
-
this.defaultSelect = (config.defaultSelect ?? "schema") as DefSelect;
|
|
65
|
-
|
|
66
|
-
// Create navigation getters that lazily resolve functions
|
|
67
|
-
this.navigation = createNavigationGetters(this._navigationConfig);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
addNavigation<
|
|
71
|
-
NewNav extends Record<
|
|
72
|
-
string,
|
|
73
|
-
| TableOccurrence<any, any, any, any>
|
|
74
|
-
| (() => TableOccurrence<any, any, any, any>)
|
|
75
|
-
>,
|
|
76
|
-
>(nav: NewNav): TableOccurrence<BT, Name, Nav & NewNav, DefSelect> {
|
|
77
|
-
return new TableOccurrence({
|
|
78
|
-
name: this.name,
|
|
79
|
-
baseTable: this.baseTable,
|
|
80
|
-
navigation: { ...this._navigationConfig, ...nav } as Nav & NewNav,
|
|
81
|
-
defaultSelect: this.defaultSelect,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Helper function to create TableOccurrence with proper type inference
|
|
87
|
-
export function createTableOccurrence<
|
|
88
|
-
const Name extends string,
|
|
89
|
-
BT extends BaseTable<any, any, any, any>,
|
|
90
|
-
DefSelect extends
|
|
91
|
-
| "all"
|
|
92
|
-
| "schema"
|
|
93
|
-
| readonly (keyof ExtractSchema<BT>)[] = "schema",
|
|
94
|
-
>(config: {
|
|
95
|
-
name: Name;
|
|
96
|
-
baseTable: BT;
|
|
97
|
-
defaultSelect?: DefSelect;
|
|
98
|
-
}): TableOccurrence<BT, Name, {}, DefSelect> {
|
|
99
|
-
return new TableOccurrence(config);
|
|
100
|
-
}
|
package/src/filter-types.ts
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
-
|
|
3
|
-
// Operator types for each value type
|
|
4
|
-
export type StringOperators =
|
|
5
|
-
| { eq: string | null }
|
|
6
|
-
| { ne: string | null }
|
|
7
|
-
| { gt: string }
|
|
8
|
-
| { ge: string }
|
|
9
|
-
| { lt: string }
|
|
10
|
-
| { le: string }
|
|
11
|
-
| { contains: string }
|
|
12
|
-
| { startswith: string }
|
|
13
|
-
| { endswith: string }
|
|
14
|
-
| { in: string[] };
|
|
15
|
-
|
|
16
|
-
export type NumberOperators =
|
|
17
|
-
| { eq: number | null }
|
|
18
|
-
| { ne: number | null }
|
|
19
|
-
| { gt: number }
|
|
20
|
-
| { ge: number }
|
|
21
|
-
| { lt: number }
|
|
22
|
-
| { le: number }
|
|
23
|
-
| { in: number[] };
|
|
24
|
-
|
|
25
|
-
export type BooleanOperators =
|
|
26
|
-
| { eq: boolean | null }
|
|
27
|
-
| { ne: boolean | null };
|
|
28
|
-
|
|
29
|
-
export type DateOperators =
|
|
30
|
-
| { eq: Date | null }
|
|
31
|
-
| { ne: Date | null }
|
|
32
|
-
| { gt: Date }
|
|
33
|
-
| { ge: Date }
|
|
34
|
-
| { lt: Date }
|
|
35
|
-
| { le: Date }
|
|
36
|
-
| { in: Date[] };
|
|
37
|
-
|
|
38
|
-
// Infer output type from StandardSchemaV1
|
|
39
|
-
export type InferOutput<S> = S extends StandardSchemaV1<any, infer Output>
|
|
40
|
-
? Output
|
|
41
|
-
: never;
|
|
42
|
-
|
|
43
|
-
// Map inferred types to their operators
|
|
44
|
-
export type OperatorsForType<T> =
|
|
45
|
-
T extends string | null | undefined ? StringOperators :
|
|
46
|
-
T extends number | null | undefined ? NumberOperators :
|
|
47
|
-
T extends boolean | null | undefined ? BooleanOperators :
|
|
48
|
-
T extends Date | null | undefined ? DateOperators :
|
|
49
|
-
never;
|
|
50
|
-
|
|
51
|
-
// Get operators for a schema field
|
|
52
|
-
export type OperatorsForSchemaField<S extends StandardSchemaV1> =
|
|
53
|
-
OperatorsForType<InferOutput<S>>;
|
|
54
|
-
|
|
55
|
-
// Field filter: shorthand, single operator, or operator array
|
|
56
|
-
export type FieldFilter<S extends StandardSchemaV1> =
|
|
57
|
-
| InferOutput<S> // Shorthand: { name: "John" }
|
|
58
|
-
| OperatorsForSchemaField<S> // Single operator: { age: { gt: 18 } }
|
|
59
|
-
| Array<OperatorsForSchemaField<S>>; // Multiple operators: { age: [{ gt: 18 }, { lt: 65 }] }
|
|
60
|
-
|
|
61
|
-
// Logical operators (recursive)
|
|
62
|
-
export type LogicalFilter<Schema extends Record<string, StandardSchemaV1>> = {
|
|
63
|
-
and?: Array<TypedFilter<Schema>>;
|
|
64
|
-
or?: Array<TypedFilter<Schema>>;
|
|
65
|
-
not?: TypedFilter<Schema>;
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
// Helper to check if Schema is exactly Record<string, StandardSchemaV1> (untyped)
|
|
69
|
-
// Uses double extends check to ensure Schema is exactly the generic type, not a more specific type
|
|
70
|
-
type IsUntypedSchema<Schema> =
|
|
71
|
-
[Record<string, StandardSchemaV1>] extends [Schema]
|
|
72
|
-
? [Schema] extends [Record<string, StandardSchemaV1>]
|
|
73
|
-
? true
|
|
74
|
-
: false
|
|
75
|
-
: false;
|
|
76
|
-
|
|
77
|
-
// Main filter type
|
|
78
|
-
export type TypedFilter<Schema extends Record<string, StandardSchemaV1>> =
|
|
79
|
-
| LogicalFilter<Schema>
|
|
80
|
-
| (
|
|
81
|
-
IsUntypedSchema<Schema> extends true
|
|
82
|
-
? {
|
|
83
|
-
// For untyped schemas, allow arbitrary string keys with empty object intersection (preserves autocomplete)
|
|
84
|
-
[key: string]: FieldFilter<any> | any;
|
|
85
|
-
} & {}
|
|
86
|
-
: {
|
|
87
|
-
// For typed schemas, use specific keys (preserves autocomplete)
|
|
88
|
-
[K in keyof Schema]?: FieldFilter<Schema[K]>;
|
|
89
|
-
}
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
// Top-level filter (can be array for implicit AND)
|
|
93
|
-
export type Filter<Schema extends Record<string, StandardSchemaV1>> =
|
|
94
|
-
| TypedFilter<Schema>
|
|
95
|
-
| Array<TypedFilter<Schema>>
|
|
96
|
-
| string; // Escape hatch for raw OData expressions
|
|
97
|
-
|