@equinor/fusion-framework-cli-plugin-ai-index 2.0.1 → 3.0.0
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/CHANGELOG.md +66 -0
- package/dist/esm/bin/apply-metadata.js +15 -5
- package/dist/esm/bin/apply-metadata.js.map +1 -1
- package/dist/esm/bin/apply-schema.js +64 -0
- package/dist/esm/bin/apply-schema.js.map +1 -0
- package/dist/esm/bin/apply-schema.test.js +143 -0
- package/dist/esm/bin/apply-schema.test.js.map +1 -0
- package/dist/esm/bin/delete-removed-files.js +1 -1
- package/dist/esm/bin/delete-removed-files.js.map +1 -1
- package/dist/esm/bin/embed.js +265 -55
- package/dist/esm/bin/embed.js.map +1 -1
- package/dist/esm/bin/get-diff.js +5 -0
- package/dist/esm/bin/get-diff.js.map +1 -1
- package/dist/esm/create-command.js +186 -0
- package/dist/esm/create-command.js.map +1 -0
- package/dist/esm/delete-command.js +14 -2
- package/dist/esm/delete-command.js.map +1 -1
- package/dist/esm/delete-command.options.js +7 -31
- package/dist/esm/delete-command.options.js.map +1 -1
- package/dist/esm/delete-index-command.js +94 -0
- package/dist/esm/delete-index-command.js.map +1 -0
- package/dist/esm/embed-command.js +30 -0
- package/dist/esm/embed-command.js.map +1 -0
- package/dist/esm/embeddings-command.js +14 -17
- package/dist/esm/embeddings-command.js.map +1 -1
- package/dist/esm/embeddings-command.options.js +12 -43
- package/dist/esm/embeddings-command.options.js.map +1 -1
- package/dist/esm/index.js +12 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/schema.js +41 -0
- package/dist/esm/schema.js.map +1 -0
- package/dist/esm/search-command.js +17 -5
- package/dist/esm/search-command.js.map +1 -1
- package/dist/esm/utils/embedding-dimensions.js +37 -0
- package/dist/esm/utils/embedding-dimensions.js.map +1 -0
- package/dist/esm/utils/zod-to-azure-fields.js +120 -0
- package/dist/esm/utils/zod-to-azure-fields.js.map +1 -0
- package/dist/esm/utils/zod-to-azure-fields.test.js +112 -0
- package/dist/esm/utils/zod-to-azure-fields.test.js.map +1 -0
- package/dist/esm/version.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/bin/apply-metadata.d.ts +2 -1
- package/dist/types/bin/apply-schema.d.ts +22 -0
- package/dist/types/bin/apply-schema.test.d.ts +1 -0
- package/dist/types/config.d.ts +14 -0
- package/dist/types/create-command.d.ts +6 -0
- package/dist/types/delete-command.options.d.ts +10 -23
- package/dist/types/delete-index-command.d.ts +6 -0
- package/dist/types/embed-command.d.ts +12 -0
- package/dist/types/embeddings-command.options.d.ts +10 -28
- package/dist/types/index.d.ts +1 -0
- package/dist/types/schema.d.ts +137 -0
- package/dist/types/utils/embedding-dimensions.d.ts +13 -0
- package/dist/types/utils/zod-to-azure-fields.d.ts +61 -0
- package/dist/types/utils/zod-to-azure-fields.test.d.ts +1 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +5 -5
- package/src/bin/apply-metadata.ts +20 -4
- package/src/bin/apply-schema.test.ts +170 -0
- package/src/bin/apply-schema.ts +86 -0
- package/src/bin/delete-removed-files.ts +1 -1
- package/src/bin/embed.ts +325 -77
- package/src/bin/get-diff.ts +5 -0
- package/src/config.ts +15 -0
- package/src/create-command.ts +218 -0
- package/src/delete-command.options.ts +7 -37
- package/src/delete-command.ts +19 -2
- package/src/delete-index-command.ts +121 -0
- package/src/embed-command.ts +44 -0
- package/src/embeddings-command.options.ts +12 -50
- package/src/embeddings-command.ts +18 -18
- package/src/index.ts +12 -3
- package/src/schema.ts +149 -0
- package/src/search-command.ts +22 -5
- package/src/utils/embedding-dimensions.ts +39 -0
- package/src/utils/zod-to-azure-fields.test.ts +136 -0
- package/src/utils/zod-to-azure-fields.ts +177 -0
- package/src/version.ts +1 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe factory for creating an {@link IndexSchemaConfig}.
|
|
3
|
+
*
|
|
4
|
+
* Infers `T` from the Zod shape and constrains both the
|
|
5
|
+
* `prepareAttributes` parameter types and the `resolve` return type,
|
|
6
|
+
* providing compile-time safety that attribute processing and resolution
|
|
7
|
+
* match the declared schema.
|
|
8
|
+
*
|
|
9
|
+
* @template T - Zod object schema type, inferred from `config.shape`.
|
|
10
|
+
* @param config - Schema configuration with a Zod shape, optional typed
|
|
11
|
+
* attribute processor, and a resolver function.
|
|
12
|
+
* @returns The same config object, narrowed to the inferred generic type.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { z } from 'zod';
|
|
17
|
+
* import { defineIndexSchema } from '@equinor/fusion-framework-cli-plugin-ai-index';
|
|
18
|
+
*
|
|
19
|
+
* const schema = defineIndexSchema({
|
|
20
|
+
* shape: z.object({
|
|
21
|
+
* tags: z.array(z.string()).default([]),
|
|
22
|
+
* type: z.string(),
|
|
23
|
+
* }),
|
|
24
|
+
* prepareAttributes: (attrs, doc) => {
|
|
25
|
+
* attrs.tags ??= []; // string[] | undefined — type-safe ✅
|
|
26
|
+
* if (doc.metadata.source.includes('cookbooks/')) {
|
|
27
|
+
* attrs.tags.push('cookbook');
|
|
28
|
+
* }
|
|
29
|
+
* return attrs;
|
|
30
|
+
* },
|
|
31
|
+
* resolve: (doc) => ({
|
|
32
|
+
* tags: (doc.metadata.attributes?.tags as string[]) ?? [],
|
|
33
|
+
* type: (doc.metadata.attributes?.type as string) ?? 'raw',
|
|
34
|
+
* }),
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export function defineIndexSchema(config) {
|
|
39
|
+
return config;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AA2GA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA4B;IAE5B,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createCommand, createOption } from 'commander';
|
|
2
2
|
import { inspect } from 'node:util';
|
|
3
|
-
import { setupFramework } from '@equinor/fusion-framework-cli-plugin-ai-base';
|
|
3
|
+
import { loadFusionAIConfig, setupFramework } from '@equinor/fusion-framework-cli-plugin-ai-base';
|
|
4
4
|
import { withOptions as withAiOptions, } from '@equinor/fusion-framework-cli-plugin-ai-base/command-options';
|
|
5
5
|
/**
|
|
6
6
|
* Flatten Azure Cognitive Search metadata attributes into a plain object.
|
|
@@ -75,6 +75,7 @@ const normalizeMetadata = (metadata) => {
|
|
|
75
75
|
*/
|
|
76
76
|
const _command = createCommand('search')
|
|
77
77
|
.description('Search the vector store to validate embeddings and retrieve relevant documents')
|
|
78
|
+
.addOption(createOption('--config <config>', 'Path to a config file').default('fusion-ai.config'))
|
|
78
79
|
.addOption(createOption('--limit <number>', 'Maximum number of results to return')
|
|
79
80
|
.default(10)
|
|
80
81
|
.argParser(parseInt))
|
|
@@ -86,17 +87,28 @@ const _command = createCommand('search')
|
|
|
86
87
|
.addOption(createOption('--raw', 'Output raw metadata without normalization').default(false))
|
|
87
88
|
.addOption(createOption('--verbose', 'Enable verbose output').default(false))
|
|
88
89
|
.argument('<query>', 'Search query string')
|
|
90
|
+
.hook('preAction', async (thisCommand) => {
|
|
91
|
+
const opts = thisCommand.opts();
|
|
92
|
+
const config = await loadFusionAIConfig(opts.config ?? 'fusion-ai.config', { baseDir: process.cwd() });
|
|
93
|
+
const indexConfig = config.index ?? {};
|
|
94
|
+
if (indexConfig.name && !opts.indexName?.trim()) {
|
|
95
|
+
thisCommand.setOptionValue('indexName', indexConfig.name);
|
|
96
|
+
}
|
|
97
|
+
if (indexConfig.model && !opts.embedModel?.trim()) {
|
|
98
|
+
thisCommand.setOptionValue('embedModel', indexConfig.model);
|
|
99
|
+
}
|
|
100
|
+
})
|
|
89
101
|
.action(async (query, options) => {
|
|
90
102
|
if (options.verbose) {
|
|
91
103
|
console.log('🔍 Initializing framework...');
|
|
92
104
|
}
|
|
93
105
|
const framework = await setupFramework(options);
|
|
94
|
-
if (!options.
|
|
95
|
-
throw new Error('
|
|
106
|
+
if (!options.indexName) {
|
|
107
|
+
throw new Error('Index name is required');
|
|
96
108
|
}
|
|
97
109
|
if (options.verbose) {
|
|
98
110
|
console.log('✅ Framework initialized successfully');
|
|
99
|
-
console.log(`📇 Index: ${options.
|
|
111
|
+
console.log(`📇 Index: ${options.indexName}`);
|
|
100
112
|
console.log(`🔎 Searching for: "${query}"`);
|
|
101
113
|
console.log(`📊 Limit: ${options.limit}`);
|
|
102
114
|
console.log(`🔍 Search type: ${options.searchType}`);
|
|
@@ -105,7 +117,7 @@ const _command = createCommand('search')
|
|
|
105
117
|
}
|
|
106
118
|
console.log('');
|
|
107
119
|
}
|
|
108
|
-
const vectorStoreService = framework.ai.
|
|
120
|
+
const vectorStoreService = framework.ai.useIndex(options.indexName);
|
|
109
121
|
try {
|
|
110
122
|
const filter = options.filter ? { filterExpression: options.filter } : undefined;
|
|
111
123
|
const retrieverOptions = options.searchType === 'mmr'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-command.js","sourceRoot":"","sources":["../../src/search-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;
|
|
1
|
+
{"version":3,"file":"search-command.js","sourceRoot":"","sources":["../../src/search-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Known OpenAI embedding model names and their output vector dimensions.
|
|
3
|
+
*
|
|
4
|
+
* Used by the `ffc ai index create` command to set the `dimensions`
|
|
5
|
+
* property on the `content_vector` field in the Azure AI Search schema.
|
|
6
|
+
*
|
|
7
|
+
* @see https://platform.openai.com/docs/guides/embeddings
|
|
8
|
+
*/
|
|
9
|
+
const KNOWN_MODEL_DIMENSIONS = new Map([
|
|
10
|
+
['text-embedding-3-large', 3072],
|
|
11
|
+
['text-embedding-3-small', 1536],
|
|
12
|
+
['text-embedding-ada-002', 1536],
|
|
13
|
+
]);
|
|
14
|
+
/**
|
|
15
|
+
* Resolve the embedding vector dimensions for a given model name.
|
|
16
|
+
*
|
|
17
|
+
* Checks the known model→dimensions map first. Falls back to an explicit
|
|
18
|
+
* `dimensions` override from the config. Throws if neither is available.
|
|
19
|
+
*
|
|
20
|
+
* @param model - The embedding model name (e.g. `'text-embedding-3-large'`).
|
|
21
|
+
* @param configDimensions - Optional explicit dimensions from config, used
|
|
22
|
+
* when the model is not in the known map.
|
|
23
|
+
* @returns The number of dimensions for the embedding vector.
|
|
24
|
+
* @throws {Error} When the model is unknown and no explicit dimensions are configured.
|
|
25
|
+
*/
|
|
26
|
+
export function resolveEmbeddingDimensions(model, configDimensions) {
|
|
27
|
+
const known = KNOWN_MODEL_DIMENSIONS.get(model);
|
|
28
|
+
if (known !== undefined)
|
|
29
|
+
return known;
|
|
30
|
+
if (configDimensions !== undefined)
|
|
31
|
+
return configDimensions;
|
|
32
|
+
const knownModels = [...KNOWN_MODEL_DIMENSIONS.keys()].join(', ');
|
|
33
|
+
throw new Error(`Unknown embedding model "${model}". ` +
|
|
34
|
+
`Known models: ${knownModels}. ` +
|
|
35
|
+
'For custom models, set `index.embedding.dimensions` in the config.');
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=embedding-dimensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-dimensions.js","sourceRoot":"","sources":["../../../src/utils/embedding-dimensions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,sBAAsB,GAAgC,IAAI,GAAG,CAAC;IAClE,CAAC,wBAAwB,EAAE,IAAI,CAAC;IAChC,CAAC,wBAAwB,EAAE,IAAI,CAAC;IAChC,CAAC,wBAAwB,EAAE,IAAI,CAAC;CACjC,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,0BAA0B,CAAC,KAAa,EAAE,gBAAyB;IACjF,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAEtC,IAAI,gBAAgB,KAAK,SAAS;QAAE,OAAO,gBAAgB,CAAC;IAE5D,MAAM,WAAW,GAAG,CAAC,GAAG,sBAAsB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,KAAK;QACpC,iBAAiB,WAAW,IAAI;QAChC,oEAAoE,CACvE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { ZodString, ZodNumber, ZodBoolean, ZodArray, ZodEnum, ZodOptional, ZodDefault, ZodNullable, } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Unwrap wrapper types (optional, default, nullable) to reach the
|
|
4
|
+
* underlying concrete Zod type.
|
|
5
|
+
*
|
|
6
|
+
* Uses public `instanceof` checks and `unwrap()` methods to avoid
|
|
7
|
+
* reliance on Zod's private `_zod.def` internals.
|
|
8
|
+
*
|
|
9
|
+
* @param schema - A Zod schema node, possibly wrapped.
|
|
10
|
+
* @returns The innermost non-wrapper schema.
|
|
11
|
+
*/
|
|
12
|
+
function unwrapSchema(schema) {
|
|
13
|
+
let current = schema;
|
|
14
|
+
// Walk through wrapper layers until we reach a concrete type
|
|
15
|
+
while (current instanceof ZodOptional ||
|
|
16
|
+
current instanceof ZodDefault ||
|
|
17
|
+
current instanceof ZodNullable) {
|
|
18
|
+
current = current.unwrap();
|
|
19
|
+
}
|
|
20
|
+
return current;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Map a concrete (unwrapped) Zod schema to its Azure EDM field type.
|
|
24
|
+
*
|
|
25
|
+
* Uses public `instanceof` checks against Zod's exported class hierarchy
|
|
26
|
+
* for forward-compatible type mapping.
|
|
27
|
+
*
|
|
28
|
+
* @param schema - The unwrapped Zod schema node.
|
|
29
|
+
* @returns The corresponding Azure EDM type string.
|
|
30
|
+
* @throws {Error} When the Zod type cannot be mapped to an Azure EDM type.
|
|
31
|
+
*/
|
|
32
|
+
function zodToEdmType(schema) {
|
|
33
|
+
if (schema instanceof ZodString || schema instanceof ZodEnum) {
|
|
34
|
+
return 'Edm.String';
|
|
35
|
+
}
|
|
36
|
+
if (schema instanceof ZodNumber) {
|
|
37
|
+
return 'Edm.Double';
|
|
38
|
+
}
|
|
39
|
+
if (schema instanceof ZodBoolean) {
|
|
40
|
+
return 'Edm.Boolean';
|
|
41
|
+
}
|
|
42
|
+
if (schema instanceof ZodArray) {
|
|
43
|
+
const elementSchema = unwrapSchema(schema.element);
|
|
44
|
+
if (elementSchema instanceof ZodString || elementSchema instanceof ZodEnum) {
|
|
45
|
+
return 'Collection(Edm.String)';
|
|
46
|
+
}
|
|
47
|
+
throw new Error(`Unsupported array element type "${elementSchema.constructor.name}". Only string arrays are supported for Azure Search fields.`);
|
|
48
|
+
}
|
|
49
|
+
throw new Error(`Unsupported Zod type "${schema.constructor.name}" for Azure Search field mapping. ` +
|
|
50
|
+
'Supported types: ZodString, ZodNumber, ZodBoolean, ZodEnum, ZodArray(ZodString).');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Derive default field capabilities from an Azure EDM type.
|
|
54
|
+
*
|
|
55
|
+
* All promoted fields are filterable. Strings and string collections are
|
|
56
|
+
* also facetable. Numbers are sortable.
|
|
57
|
+
*
|
|
58
|
+
* @param edmType - The Azure EDM type of the field.
|
|
59
|
+
* @returns Default capability flags for the field.
|
|
60
|
+
*/
|
|
61
|
+
function defaultCapabilities(edmType) {
|
|
62
|
+
switch (edmType) {
|
|
63
|
+
case 'Edm.String':
|
|
64
|
+
return { filterable: true, sortable: false, facetable: true, searchable: false };
|
|
65
|
+
case 'Collection(Edm.String)':
|
|
66
|
+
return { filterable: true, sortable: false, facetable: true, searchable: false };
|
|
67
|
+
case 'Edm.Double':
|
|
68
|
+
case 'Edm.Int32':
|
|
69
|
+
case 'Edm.Int64':
|
|
70
|
+
return { filterable: true, sortable: true, facetable: false, searchable: false };
|
|
71
|
+
case 'Edm.Boolean':
|
|
72
|
+
return { filterable: true, sortable: false, facetable: false, searchable: false };
|
|
73
|
+
default:
|
|
74
|
+
return { filterable: true, sortable: false, facetable: false, searchable: false };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Convert a Zod object schema into an array of Azure AI Search field
|
|
79
|
+
* definitions.
|
|
80
|
+
*
|
|
81
|
+
* Walks the Zod shape, maps each field to its Azure EDM type, and assigns
|
|
82
|
+
* default capabilities (filterable, facetable, sortable). Used by the
|
|
83
|
+
* `ffc ai index create` command to generate the index schema.
|
|
84
|
+
*
|
|
85
|
+
* Uses public `instanceof` checks and `unwrap()` methods to avoid
|
|
86
|
+
* reliance on Zod's private `_zod.def` internals, ensuring compatibility
|
|
87
|
+
* across Zod versions.
|
|
88
|
+
*
|
|
89
|
+
* @param schema - A Zod object schema whose keys define the promoted fields.
|
|
90
|
+
* @returns An array of Azure AI Search field definitions.
|
|
91
|
+
* @throws {Error} When a field type cannot be mapped to an Azure EDM type.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* import { z } from 'zod';
|
|
96
|
+
* import { zodToAzureFields } from './zod-to-azure-fields.js';
|
|
97
|
+
*
|
|
98
|
+
* const fields = zodToAzureFields(
|
|
99
|
+
* z.object({
|
|
100
|
+
* pkg_name: z.string().optional(),
|
|
101
|
+
* tags: z.array(z.string()).default([]),
|
|
102
|
+
* }),
|
|
103
|
+
* );
|
|
104
|
+
* // [
|
|
105
|
+
* // { name: 'pkg_name', type: 'Edm.String', filterable: true, facetable: true, ... },
|
|
106
|
+
* // { name: 'tags', type: 'Collection(Edm.String)', filterable: true, facetable: true, ... },
|
|
107
|
+
* // ]
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export function zodToAzureFields(schema) {
|
|
111
|
+
const shape = schema.shape;
|
|
112
|
+
return Object.entries(shape).map(([name, fieldSchema]) => {
|
|
113
|
+
// Unwrap wrapper types to reach the concrete type
|
|
114
|
+
const innerSchema = unwrapSchema(fieldSchema);
|
|
115
|
+
const edmType = zodToEdmType(innerSchema);
|
|
116
|
+
const capabilities = defaultCapabilities(edmType);
|
|
117
|
+
return { name, type: edmType, ...capabilities };
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=zod-to-azure-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-to-azure-fields.js","sourceRoot":"","sources":["../../../src/utils/zod-to-azure-fields.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { zodToAzureFields } from './zod-to-azure-fields.js';
|
|
4
|
+
describe('zodToAzureFields', () => {
|
|
5
|
+
it('maps z.string() to Edm.String with filterable + facetable', () => {
|
|
6
|
+
const schema = z.object({ pkg_name: z.string() });
|
|
7
|
+
const fields = zodToAzureFields(schema);
|
|
8
|
+
expect(fields).toEqual([
|
|
9
|
+
{
|
|
10
|
+
name: 'pkg_name',
|
|
11
|
+
type: 'Edm.String',
|
|
12
|
+
filterable: true,
|
|
13
|
+
sortable: false,
|
|
14
|
+
facetable: true,
|
|
15
|
+
searchable: false,
|
|
16
|
+
},
|
|
17
|
+
]);
|
|
18
|
+
});
|
|
19
|
+
it('maps z.number() to Edm.Double with filterable + sortable', () => {
|
|
20
|
+
const schema = z.object({ score: z.number() });
|
|
21
|
+
const fields = zodToAzureFields(schema);
|
|
22
|
+
expect(fields).toEqual([
|
|
23
|
+
{
|
|
24
|
+
name: 'score',
|
|
25
|
+
type: 'Edm.Double',
|
|
26
|
+
filterable: true,
|
|
27
|
+
sortable: true,
|
|
28
|
+
facetable: false,
|
|
29
|
+
searchable: false,
|
|
30
|
+
},
|
|
31
|
+
]);
|
|
32
|
+
});
|
|
33
|
+
it('maps z.boolean() to Edm.Boolean with filterable', () => {
|
|
34
|
+
const schema = z.object({ active: z.boolean() });
|
|
35
|
+
const fields = zodToAzureFields(schema);
|
|
36
|
+
expect(fields).toEqual([
|
|
37
|
+
{
|
|
38
|
+
name: 'active',
|
|
39
|
+
type: 'Edm.Boolean',
|
|
40
|
+
filterable: true,
|
|
41
|
+
sortable: false,
|
|
42
|
+
facetable: false,
|
|
43
|
+
searchable: false,
|
|
44
|
+
},
|
|
45
|
+
]);
|
|
46
|
+
});
|
|
47
|
+
it('maps z.array(z.string()) to Collection(Edm.String) with filterable + facetable', () => {
|
|
48
|
+
const schema = z.object({ tags: z.array(z.string()) });
|
|
49
|
+
const fields = zodToAzureFields(schema);
|
|
50
|
+
expect(fields).toEqual([
|
|
51
|
+
{
|
|
52
|
+
name: 'tags',
|
|
53
|
+
type: 'Collection(Edm.String)',
|
|
54
|
+
filterable: true,
|
|
55
|
+
sortable: false,
|
|
56
|
+
facetable: true,
|
|
57
|
+
searchable: false,
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
60
|
+
});
|
|
61
|
+
it('maps z.enum() to Edm.String', () => {
|
|
62
|
+
const schema = z.object({ status: z.enum(['draft', 'published']) });
|
|
63
|
+
const fields = zodToAzureFields(schema);
|
|
64
|
+
expect(fields[0]).toMatchObject({ name: 'status', type: 'Edm.String' });
|
|
65
|
+
});
|
|
66
|
+
it('unwraps z.optional() to the inner type', () => {
|
|
67
|
+
const schema = z.object({ pkg_name: z.string().optional() });
|
|
68
|
+
const fields = zodToAzureFields(schema);
|
|
69
|
+
expect(fields[0]).toMatchObject({ name: 'pkg_name', type: 'Edm.String' });
|
|
70
|
+
});
|
|
71
|
+
it('unwraps z.default() to the inner type', () => {
|
|
72
|
+
const schema = z.object({ tags: z.array(z.string()).default([]) });
|
|
73
|
+
const fields = zodToAzureFields(schema);
|
|
74
|
+
expect(fields[0]).toMatchObject({ name: 'tags', type: 'Collection(Edm.String)' });
|
|
75
|
+
});
|
|
76
|
+
it('unwraps z.nullable() to the inner type', () => {
|
|
77
|
+
const schema = z.object({ name: z.string().nullable() });
|
|
78
|
+
const fields = zodToAzureFields(schema);
|
|
79
|
+
expect(fields[0]).toMatchObject({ name: 'name', type: 'Edm.String' });
|
|
80
|
+
});
|
|
81
|
+
it('unwraps nested wrappers (optional + default)', () => {
|
|
82
|
+
const schema = z.object({ tags: z.array(z.string()).default([]).optional() });
|
|
83
|
+
const fields = zodToAzureFields(schema);
|
|
84
|
+
expect(fields[0]).toMatchObject({ name: 'tags', type: 'Collection(Edm.String)' });
|
|
85
|
+
});
|
|
86
|
+
it('handles multiple fields in a single schema', () => {
|
|
87
|
+
const schema = z.object({
|
|
88
|
+
pkg_name: z.string().optional(),
|
|
89
|
+
type: z.string(),
|
|
90
|
+
tags: z.array(z.string()).default([]),
|
|
91
|
+
source_dir: z.string(),
|
|
92
|
+
});
|
|
93
|
+
const fields = zodToAzureFields(schema);
|
|
94
|
+
expect(fields).toHaveLength(4);
|
|
95
|
+
expect(fields.map((f) => f.name)).toEqual(['pkg_name', 'type', 'tags', 'source_dir']);
|
|
96
|
+
expect(fields.map((f) => f.type)).toEqual([
|
|
97
|
+
'Edm.String',
|
|
98
|
+
'Edm.String',
|
|
99
|
+
'Collection(Edm.String)',
|
|
100
|
+
'Edm.String',
|
|
101
|
+
]);
|
|
102
|
+
});
|
|
103
|
+
it('throws for unsupported Zod types (z.object)', () => {
|
|
104
|
+
const schema = z.object({ nested: z.object({ a: z.string() }) });
|
|
105
|
+
expect(() => zodToAzureFields(schema)).toThrow(/Unsupported Zod type/);
|
|
106
|
+
});
|
|
107
|
+
it('throws for unsupported array element types (z.array(z.number()))', () => {
|
|
108
|
+
const schema = z.object({ nums: z.array(z.number()) });
|
|
109
|
+
expect(() => zodToAzureFields(schema)).toThrow(/Unsupported array element type/);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=zod-to-azure-fields.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-to-azure-fields.test.js","sourceRoot":"","sources":["../../../src/utils/zod-to-azure-fields.test.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/version.js
CHANGED