@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.
Files changed (78) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/dist/esm/bin/apply-metadata.js +15 -5
  3. package/dist/esm/bin/apply-metadata.js.map +1 -1
  4. package/dist/esm/bin/apply-schema.js +64 -0
  5. package/dist/esm/bin/apply-schema.js.map +1 -0
  6. package/dist/esm/bin/apply-schema.test.js +143 -0
  7. package/dist/esm/bin/apply-schema.test.js.map +1 -0
  8. package/dist/esm/bin/delete-removed-files.js +1 -1
  9. package/dist/esm/bin/delete-removed-files.js.map +1 -1
  10. package/dist/esm/bin/embed.js +265 -55
  11. package/dist/esm/bin/embed.js.map +1 -1
  12. package/dist/esm/bin/get-diff.js +5 -0
  13. package/dist/esm/bin/get-diff.js.map +1 -1
  14. package/dist/esm/create-command.js +186 -0
  15. package/dist/esm/create-command.js.map +1 -0
  16. package/dist/esm/delete-command.js +14 -2
  17. package/dist/esm/delete-command.js.map +1 -1
  18. package/dist/esm/delete-command.options.js +7 -31
  19. package/dist/esm/delete-command.options.js.map +1 -1
  20. package/dist/esm/delete-index-command.js +94 -0
  21. package/dist/esm/delete-index-command.js.map +1 -0
  22. package/dist/esm/embed-command.js +30 -0
  23. package/dist/esm/embed-command.js.map +1 -0
  24. package/dist/esm/embeddings-command.js +14 -17
  25. package/dist/esm/embeddings-command.js.map +1 -1
  26. package/dist/esm/embeddings-command.options.js +12 -43
  27. package/dist/esm/embeddings-command.options.js.map +1 -1
  28. package/dist/esm/index.js +12 -3
  29. package/dist/esm/index.js.map +1 -1
  30. package/dist/esm/schema.js +41 -0
  31. package/dist/esm/schema.js.map +1 -0
  32. package/dist/esm/search-command.js +17 -5
  33. package/dist/esm/search-command.js.map +1 -1
  34. package/dist/esm/utils/embedding-dimensions.js +37 -0
  35. package/dist/esm/utils/embedding-dimensions.js.map +1 -0
  36. package/dist/esm/utils/zod-to-azure-fields.js +120 -0
  37. package/dist/esm/utils/zod-to-azure-fields.js.map +1 -0
  38. package/dist/esm/utils/zod-to-azure-fields.test.js +112 -0
  39. package/dist/esm/utils/zod-to-azure-fields.test.js.map +1 -0
  40. package/dist/esm/version.js +1 -1
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/dist/types/bin/apply-metadata.d.ts +2 -1
  43. package/dist/types/bin/apply-schema.d.ts +22 -0
  44. package/dist/types/bin/apply-schema.test.d.ts +1 -0
  45. package/dist/types/config.d.ts +14 -0
  46. package/dist/types/create-command.d.ts +6 -0
  47. package/dist/types/delete-command.options.d.ts +10 -23
  48. package/dist/types/delete-index-command.d.ts +6 -0
  49. package/dist/types/embed-command.d.ts +12 -0
  50. package/dist/types/embeddings-command.options.d.ts +10 -28
  51. package/dist/types/index.d.ts +1 -0
  52. package/dist/types/schema.d.ts +137 -0
  53. package/dist/types/utils/embedding-dimensions.d.ts +13 -0
  54. package/dist/types/utils/zod-to-azure-fields.d.ts +61 -0
  55. package/dist/types/utils/zod-to-azure-fields.test.d.ts +1 -0
  56. package/dist/types/version.d.ts +1 -1
  57. package/package.json +5 -5
  58. package/src/bin/apply-metadata.ts +20 -4
  59. package/src/bin/apply-schema.test.ts +170 -0
  60. package/src/bin/apply-schema.ts +86 -0
  61. package/src/bin/delete-removed-files.ts +1 -1
  62. package/src/bin/embed.ts +325 -77
  63. package/src/bin/get-diff.ts +5 -0
  64. package/src/config.ts +15 -0
  65. package/src/create-command.ts +218 -0
  66. package/src/delete-command.options.ts +7 -37
  67. package/src/delete-command.ts +19 -2
  68. package/src/delete-index-command.ts +121 -0
  69. package/src/embed-command.ts +44 -0
  70. package/src/embeddings-command.options.ts +12 -50
  71. package/src/embeddings-command.ts +18 -18
  72. package/src/index.ts +12 -3
  73. package/src/schema.ts +149 -0
  74. package/src/search-command.ts +22 -5
  75. package/src/utils/embedding-dimensions.ts +39 -0
  76. package/src/utils/zod-to-azure-fields.test.ts +136 -0
  77. package/src/utils/zod-to-azure-fields.ts +177 -0
  78. 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.azureSearchIndexName) {
95
- throw new Error('Azure Search index name is required');
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.azureSearchIndexName}`);
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.getService('search', options.azureSearchIndexName);
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":"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"}
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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"}
@@ -1,3 +1,3 @@
1
1
  // Generated by genversion.
2
- export const version = '2.0.1';
2
+ export const version = '3.0.0';
3
3
  //# sourceMappingURL=version.js.map