@promptlycms/prompts 0.1.1 → 0.1.2-canary.29d0c36

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 CHANGED
@@ -1,11 +1,12 @@
1
1
  # @promptlycms/prompts
2
2
 
3
- TypeScript SDK for the [Promptly CMS](https://promptlycms.com) API. Fetch prompts at runtime, get typed template variables via codegen, and integrate with the [Vercel AI SDK](https://sdk.vercel.ai).
3
+ TypeScript SDK for the [Promptly CMS](https://promptlycms.com) API. Stop hardcoding prompts in your codebase manage them in a purpose-built CMS with versioning and instant publishing, then fetch them at runtime with full type safety.
4
4
 
5
- - **Runtime client** — `getPrompt()`, `getPrompts()`, `aiParams()` with full TypeScript support
5
+ - **Zero hardcoded prompts** — fetch prompts at runtime; update wording, models, and settings from the [CMS](https://promptlycms.com) without code changes or redeploys
6
+ - **Runtime client** — `getPrompt()` and `getPrompts()` with full TypeScript support
6
7
  - **Codegen CLI** — generates typed template variables via declaration merging
7
- - **AI SDK integration** — spread-ready params for `generateText` / `streamText`
8
- - **Model auto-detection** — resolves Anthropic, OpenAI, Google, and Mistral models automatically
8
+ - **AI SDK integration** — destructure directly into [Vercel AI SDK](https://ai-sdk.dev/) `generateText` / `streamText`
9
+ - **Any AI provider** — supports [all providers](https://ai-sdk.dev/providers/ai-sdk-providers#provider-support) supported by the Vercel AI SDK
9
10
  - **Structured output** — Zod schemas built from CMS-defined output schemas
10
11
 
11
12
  ## Install
@@ -117,22 +118,22 @@ welcomePrompt.userMessage({ email: 'a@b.com', subject: 'Hi' });
117
118
 
118
119
  ## AI SDK integration
119
120
 
120
- `aiParams()` returns an object you can spread directly into Vercel AI SDK functions:
121
+ Destructure `getPrompt()` and pass the properties directly to Vercel AI SDK functions:
121
122
 
122
123
  ```typescript
123
124
  import { generateText } from 'ai';
124
125
 
125
- const params = await promptly.aiParams('my-prompt', {
126
- variables: { name: 'Alice', task: 'coding' },
127
- });
126
+ const { userMessage, systemMessage, temperature, model } = await promptly.getPrompt('my-prompt');
128
127
 
129
128
  const { text } = await generateText({
130
- ...params,
131
- // model is already included from your CMS prompt config
129
+ model,
130
+ system: systemMessage,
131
+ prompt: userMessage({ name: 'Alice', task: 'coding' }),
132
+ temperature,
132
133
  });
133
134
  ```
134
135
 
135
- The model configured in the CMS is auto-resolved to the correct AI SDK provider. If the prompt has a structured output schema defined in the CMS, `params.output` is automatically populated with a Zod schema wrapped in `Output.object()`.
136
+ The model configured in the CMS is auto-resolved to the correct AI SDK provider.
136
137
 
137
138
  ## Model auto-detection
138
139
 
@@ -145,7 +146,7 @@ The SDK automatically resolves models configured in the CMS to the correct AI SD
145
146
  | `gemini-*` | Google | `@ai-sdk/google` |
146
147
  | `mistral-*`, `mixtral-*`, `codestral-*` | Mistral | `@ai-sdk/mistral` |
147
148
 
148
- CMS model display names (e.g. `claude-sonnet-4.5`) are mapped to their full API model IDs automatically.
149
+ CMS model display names (e.g. `claude-sonnet-4.6`) are mapped to their full API model IDs automatically.
149
150
 
150
151
  ### Custom model resolver
151
152
 
@@ -156,7 +157,7 @@ import { anthropic } from '@ai-sdk/anthropic';
156
157
 
157
158
  const promptly = createPromptlyClient({
158
159
  apiKey: process.env.PROMPTLY_API_KEY,
159
- model: (modelId) => anthropic('claude-sonnet-4-5-20250929'),
160
+ model: (modelId) => anthropic('claude-sonnet-4-6'),
160
161
  });
161
162
  ```
162
163
 
@@ -220,7 +221,7 @@ try {
220
221
  | `baseUrl` | `string` | No | API base URL (default: `https://api.promptlycms.com`) |
221
222
  | `model` | `(modelId: string) => LanguageModel` | No | Custom model resolver — overrides auto-detection |
222
223
 
223
- Returns a `PromptlyClient` with `getPrompt()`, `getPrompts()`, and `aiParams()` methods.
224
+ Returns a `PromptlyClient` with `getPrompt()` and `getPrompts()` methods.
224
225
 
225
226
  ### `client.getPrompt(promptId, options?)`
226
227
 
@@ -234,15 +235,6 @@ Fetch a single prompt. Returns `PromptResult` with typed `userMessage` when code
234
235
 
235
236
  Fetch multiple prompts in parallel. Accepts `PromptRequest[]` and returns a typed tuple matching the input order.
236
237
 
237
- ### `client.aiParams(promptId, options?)`
238
-
239
- Fetch a prompt and return params ready to spread into AI SDK functions (`system`, `prompt`, `temperature`, `model`, and optionally `output`).
240
-
241
- | Option | Type | Description |
242
- |-------------|-------------------------|--------------------------------|
243
- | `version` | `string` | Specific version to fetch |
244
- | `variables` | `Record<string, string>` | Template variables to interpolate |
245
-
246
238
  ### `@promptlycms/prompts/schema`
247
239
 
248
240
  Subpath export for working with Zod schemas from CMS schema fields:
package/dist/cli.js CHANGED
@@ -43,9 +43,6 @@ var createErrorFromResponse = async (response) => {
43
43
  import { writeFile } from "fs/promises";
44
44
  import { createRequire } from "module";
45
45
 
46
- // src/schema/builder.ts
47
- import { z } from "zod";
48
-
49
46
  // src/client.ts
50
47
  var PROVIDER_PREFIXES = [
51
48
  ["claude", "anthropic"],
package/dist/index.cjs CHANGED
@@ -71,291 +71,12 @@ var createErrorFromResponse = async (response) => {
71
71
  }
72
72
  };
73
73
 
74
- // src/schema/builder.ts
75
- var import_zod = require("zod");
76
- var resolveTypeString = (typeStr) => {
77
- const builder = TYPE_BUILDERS.get(typeStr);
78
- if (builder) {
79
- return builder({
80
- id: "",
81
- name: "",
82
- type: typeStr,
83
- validations: [],
84
- params: {}
85
- });
86
- }
87
- return import_zod.z.string();
88
- };
89
- var buildCoercible = (params, coerced, standard) => {
90
- if (params.coerce) {
91
- return coerced;
92
- }
93
- return standard;
94
- };
95
- var TYPE_BUILDERS = /* @__PURE__ */ new Map([
96
- ["string", (f) => buildCoercible(f.params, import_zod.z.coerce.string(), import_zod.z.string())],
97
- ["number", (f) => buildCoercible(f.params, import_zod.z.coerce.number(), import_zod.z.number())],
98
- ["boolean", (f) => buildCoercible(f.params, import_zod.z.coerce.boolean(), import_zod.z.boolean())],
99
- ["date", (f) => buildCoercible(f.params, import_zod.z.coerce.date(), import_zod.z.date())],
100
- ["bigint", (f) => buildCoercible(f.params, import_zod.z.coerce.bigint(), import_zod.z.bigint())],
101
- ["null", () => import_zod.z.null()],
102
- ["undefined", () => import_zod.z.undefined()],
103
- ["void", () => import_zod.z.void()],
104
- ["any", () => import_zod.z.any()],
105
- ["unknown", () => import_zod.z.unknown()],
106
- ["never", () => import_zod.z.never()],
107
- ["nan", () => import_zod.z.nan()],
108
- ["symbol", () => import_zod.z.symbol()],
109
- [
110
- "enum",
111
- (f) => {
112
- const values = f.params.enumValues ?? [];
113
- return import_zod.z.enum(values);
114
- }
115
- ],
116
- [
117
- "literal",
118
- (f) => {
119
- const value = f.params.enumValues?.[0] ?? "";
120
- return import_zod.z.literal(value);
121
- }
122
- ],
123
- [
124
- "array",
125
- (f) => {
126
- if (f.params.isTuple && f.params.tupleTypes) {
127
- const types = f.params.tupleTypes.map(resolveTypeString);
128
- return import_zod.z.tuple(types);
129
- }
130
- const elementSchema = f.params.elementType ? resolveTypeString(f.params.elementType) : import_zod.z.unknown();
131
- return import_zod.z.array(elementSchema);
132
- }
133
- ],
134
- [
135
- "object",
136
- (f) => {
137
- const schema = import_zod.z.object({});
138
- if (f.params.isStrict) {
139
- return schema.strict();
140
- }
141
- if (f.params.isPassthrough) {
142
- return schema.passthrough();
143
- }
144
- return schema;
145
- }
146
- ],
147
- [
148
- "record",
149
- (f) => {
150
- const keySchema = f.params.keyType ? resolveTypeString(f.params.keyType) : import_zod.z.string();
151
- const valueSchema = f.params.valueType ? resolveTypeString(f.params.valueType) : import_zod.z.unknown();
152
- return import_zod.z.record(keySchema, valueSchema);
153
- }
154
- ],
155
- [
156
- "map",
157
- (f) => {
158
- const keySchema = f.params.keyType ? resolveTypeString(f.params.keyType) : import_zod.z.string();
159
- const valueSchema = f.params.valueType ? resolveTypeString(f.params.valueType) : import_zod.z.unknown();
160
- return import_zod.z.map(keySchema, valueSchema);
161
- }
162
- ],
163
- [
164
- "set",
165
- (f) => {
166
- const elementSchema = f.params.elementType ? resolveTypeString(f.params.elementType) : import_zod.z.unknown();
167
- return import_zod.z.set(elementSchema);
168
- }
169
- ],
170
- [
171
- "union",
172
- (f) => {
173
- if (f.params.isDiscriminatedUnion && f.params.discriminatedUnion) {
174
- const { discriminator, cases } = f.params.discriminatedUnion;
175
- const schemas = Object.values(cases).map(
176
- (c) => import_zod.z.object({
177
- [discriminator]: import_zod.z.literal(c.value),
178
- ...Object.fromEntries(
179
- c.fields.map((field) => [field.name, buildFieldSchema(field)])
180
- )
181
- })
182
- );
183
- return import_zod.z.discriminatedUnion(
184
- discriminator,
185
- schemas
186
- );
187
- }
188
- const types = (f.params.unionTypes ?? []).map(resolveTypeString);
189
- return import_zod.z.union(types);
190
- }
191
- ],
192
- [
193
- "intersection",
194
- (f) => {
195
- const types = (f.params.unionTypes ?? []).map(resolveTypeString);
196
- return import_zod.z.intersection(types[0] ?? import_zod.z.unknown(), types[1] ?? import_zod.z.unknown());
197
- }
198
- ]
199
- ]);
200
- var coerceDefaultValue = (value, fieldType) => {
201
- const coercers = /* @__PURE__ */ new Map([
202
- ["number", (v) => Number(v)],
203
- ["boolean", (v) => v === "true"],
204
- ["bigint", (v) => BigInt(v)]
205
- ]);
206
- const coercer = coercers.get(fieldType);
207
- if (coercer) {
208
- return coercer(value);
209
- }
210
- return value;
211
- };
212
- var applySizeValidation = (schema, type, value, message) => {
213
- const num = Number(value);
214
- if (schema instanceof import_zod.z.ZodString) {
215
- const methods = {
216
- min: (n, m) => schema.min(n, m),
217
- max: (n, m) => schema.max(n, m),
218
- length: (n, m) => schema.length(n, m)
219
- };
220
- return methods[type]?.(num, message) ?? schema;
221
- }
222
- if (schema instanceof import_zod.z.ZodNumber) {
223
- const methods = {
224
- min: (n, m) => schema.min(n, m),
225
- max: (n, m) => schema.max(n, m)
226
- };
227
- return methods[type]?.(num, message) ?? schema;
228
- }
229
- if (schema instanceof import_zod.z.ZodArray) {
230
- const methods = {
231
- min: (n) => schema.min(n),
232
- max: (n) => schema.max(n),
233
- length: (n) => schema.length(n)
234
- };
235
- return methods[type]?.(num) ?? schema;
236
- }
237
- return schema;
238
- };
239
- var VALIDATION_APPLICATORS = /* @__PURE__ */ new Map([
240
- // Size validations
241
- ["min", (s, r) => applySizeValidation(s, "min", r.value, r.message)],
242
- ["max", (s, r) => applySizeValidation(s, "max", r.value, r.message)],
243
- ["length", (s, r) => applySizeValidation(s, "length", r.value, r.message)],
244
- // String validations
245
- ["email", (s, r) => s instanceof import_zod.z.ZodString ? s.email(r.message) : s],
246
- ["url", (s, r) => s instanceof import_zod.z.ZodString ? s.url(r.message) : s],
247
- ["uuid", (s, r) => s instanceof import_zod.z.ZodString ? s.uuid(r.message) : s],
248
- ["cuid", (s, r) => s instanceof import_zod.z.ZodString ? s.cuid(r.message) : s],
249
- ["cuid2", (s, r) => s instanceof import_zod.z.ZodString ? s.cuid2(r.message) : s],
250
- ["ulid", (s, r) => s instanceof import_zod.z.ZodString ? s.ulid(r.message) : s],
251
- [
252
- "regex",
253
- (s, r) => s instanceof import_zod.z.ZodString ? s.regex(new RegExp(r.value), r.message) : s
254
- ],
255
- [
256
- "startsWith",
257
- (s, r) => s instanceof import_zod.z.ZodString ? s.startsWith(r.value, r.message) : s
258
- ],
259
- [
260
- "endsWith",
261
- (s, r) => s instanceof import_zod.z.ZodString ? s.endsWith(r.value, r.message) : s
262
- ],
263
- [
264
- "datetime",
265
- (s, _r, f) => {
266
- if (!(s instanceof import_zod.z.ZodString)) {
267
- return s;
268
- }
269
- const opts = f.params.stringOptions?.datetime;
270
- return s.datetime(opts);
271
- }
272
- ],
273
- [
274
- "ip",
275
- (s, _r, f) => {
276
- if (!(s instanceof import_zod.z.ZodString)) {
277
- return s;
278
- }
279
- const version = f.params.stringOptions?.ip?.version;
280
- if (version === "v6") {
281
- return s.ipv6();
282
- }
283
- return s.ipv4();
284
- }
285
- ],
286
- // String transforms
287
- ["trim", (s) => s instanceof import_zod.z.ZodString ? s.trim() : s],
288
- ["toLowerCase", (s) => s instanceof import_zod.z.ZodString ? s.toLowerCase() : s],
289
- ["toUpperCase", (s) => s instanceof import_zod.z.ZodString ? s.toUpperCase() : s],
290
- // Number validations
291
- ["int", (s, r) => s instanceof import_zod.z.ZodNumber ? s.int(r.message) : s],
292
- [
293
- "positive",
294
- (s, r) => s instanceof import_zod.z.ZodNumber ? s.positive(r.message) : s
295
- ],
296
- [
297
- "negative",
298
- (s, r) => s instanceof import_zod.z.ZodNumber ? s.negative(r.message) : s
299
- ],
300
- [
301
- "multipleOf",
302
- (s, r) => s instanceof import_zod.z.ZodNumber ? s.multipleOf(Number(r.value), r.message) : s
303
- ],
304
- ["finite", (s, r) => s instanceof import_zod.z.ZodNumber ? s.finite(r.message) : s],
305
- ["safe", (s, r) => s instanceof import_zod.z.ZodNumber ? s.safe(r.message) : s],
306
- // Collection
307
- [
308
- "nonempty",
309
- (s) => {
310
- if (s instanceof import_zod.z.ZodString) {
311
- return s.min(1);
312
- }
313
- if (s instanceof import_zod.z.ZodArray) {
314
- return s.nonempty();
315
- }
316
- return s;
317
- }
318
- ],
319
- // Wrapping modifiers
320
- ["optional", (s) => s.optional()],
321
- ["nullable", (s) => s.nullable()],
322
- ["nullish", (s) => s.nullish()],
323
- // Default & catch
324
- ["default", (s, r, f) => s.default(coerceDefaultValue(r.value, f.type))],
325
- ["catch", (s, r, f) => s.catch(coerceDefaultValue(r.value, f.type))],
326
- // Readonly
327
- ["readonly", (s) => s.readonly()]
328
- ]);
329
- var buildFieldSchema = (field) => {
330
- const builder = TYPE_BUILDERS.get(field.type);
331
- if (!builder) {
332
- return import_zod.z.unknown();
333
- }
334
- let schema = builder(field);
335
- for (const rule of field.validations) {
336
- const applicator = VALIDATION_APPLICATORS.get(rule.type);
337
- if (applicator) {
338
- schema = applicator(schema, rule, field);
339
- }
340
- }
341
- if (field.params.description) {
342
- schema = schema.describe(field.params.description);
343
- }
344
- return schema;
345
- };
346
- var buildZodSchema = (fields) => {
347
- const shape = {};
348
- for (const field of fields) {
349
- shape[field.name] = buildFieldSchema(field);
350
- }
351
- return import_zod.z.object(shape);
352
- };
353
-
354
74
  // src/client.ts
355
75
  var DEFAULT_BASE_URL = "https://api.promptlycms.com";
356
76
  var MODEL_ID_MAP = {
357
77
  // Anthropic: CMS display IDs → API model IDs
358
78
  "claude-opus-4.6": "claude-opus-4-6-20250917",
79
+ "claude-sonnet-4.6": "claude-sonnet-4-6",
359
80
  "claude-sonnet-4.5": "claude-sonnet-4-5-20250929",
360
81
  "claude-haiku-4.5": "claude-haiku-4-5-20251001",
361
82
  "claude-opus-4": "claude-opus-4-20250514",
@@ -503,26 +224,7 @@ var createPromptlyClient = (config) => {
503
224
  );
504
225
  return results;
505
226
  };
506
- const aiParams = async (promptId, options) => {
507
- const prompt = await fetchPrompt(promptId, {
508
- version: options?.version
509
- });
510
- const userMessage = options?.variables ? interpolate(prompt.userMessage, options.variables) : prompt.userMessage;
511
- const model = await modelResolver(prompt.config.model);
512
- const result = {
513
- system: prompt.systemMessage,
514
- prompt: userMessage,
515
- temperature: prompt.config.temperature,
516
- model
517
- };
518
- if (prompt.config.schema && prompt.config.schema.length > 0) {
519
- const schema = buildZodSchema(prompt.config.schema);
520
- const { Output } = await import("ai");
521
- result.output = Output.object({ schema });
522
- }
523
- return result;
524
- };
525
- return { getPrompt, getPrompts, aiParams };
227
+ return { getPrompt, getPrompts };
526
228
  };
527
229
  // Annotate the CommonJS export names for ESM import in node:
528
230
  0 && (module.exports = {
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as PromptlyClientConfig, a as PromptlyClient, E as ErrorCode } from './types-W-omtl43.cjs';
2
- export { A as AiParams, b as AiParamsOptions, c as ErrorResponse, G as GetOptions, d as PromptConfig, e as PromptId, f as PromptMessage, g as PromptRequest, h as PromptResponse, i as PromptResult, j as PromptVariableMap, k as PromptVersion, l as PublishedVersion, S as SchemaField, m as SchemaFieldParams, V as ValidationRule } from './types-W-omtl43.cjs';
1
+ import { P as PromptlyClientConfig, a as PromptlyClient, E as ErrorCode } from './types-BbNpKJej.cjs';
2
+ export { b as ErrorResponse, G as GetOptions, c as PromptConfig, d as PromptId, e as PromptMessage, f as PromptRequest, g as PromptResponse, h as PromptResult, i as PromptVariableMap, j as PromptVersion, k as PublishedVersion, S as SchemaField, l as SchemaFieldParams, V as ValidationRule } from './types-BbNpKJej.cjs';
3
3
  import 'ai';
4
4
 
5
5
  declare const getSdkModelId: (modelId: string) => string;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as PromptlyClientConfig, a as PromptlyClient, E as ErrorCode } from './types-W-omtl43.js';
2
- export { A as AiParams, b as AiParamsOptions, c as ErrorResponse, G as GetOptions, d as PromptConfig, e as PromptId, f as PromptMessage, g as PromptRequest, h as PromptResponse, i as PromptResult, j as PromptVariableMap, k as PromptVersion, l as PublishedVersion, S as SchemaField, m as SchemaFieldParams, V as ValidationRule } from './types-W-omtl43.js';
1
+ import { P as PromptlyClientConfig, a as PromptlyClient, E as ErrorCode } from './types-BbNpKJej.js';
2
+ export { b as ErrorResponse, G as GetOptions, c as PromptConfig, d as PromptId, e as PromptMessage, f as PromptRequest, g as PromptResponse, h as PromptResult, i as PromptVariableMap, j as PromptVersion, k as PublishedVersion, S as SchemaField, l as SchemaFieldParams, V as ValidationRule } from './types-BbNpKJej.js';
3
3
  import 'ai';
4
4
 
5
5
  declare const getSdkModelId: (modelId: string) => string;
package/dist/index.js CHANGED
@@ -1,7 +1,3 @@
1
- import {
2
- buildZodSchema
3
- } from "./chunk-GZIUWN6H.js";
4
-
5
1
  // src/errors.ts
6
2
  var PromptlyError = class extends Error {
7
3
  code;
@@ -41,6 +37,7 @@ var DEFAULT_BASE_URL = "https://api.promptlycms.com";
41
37
  var MODEL_ID_MAP = {
42
38
  // Anthropic: CMS display IDs → API model IDs
43
39
  "claude-opus-4.6": "claude-opus-4-6-20250917",
40
+ "claude-sonnet-4.6": "claude-sonnet-4-6",
44
41
  "claude-sonnet-4.5": "claude-sonnet-4-5-20250929",
45
42
  "claude-haiku-4.5": "claude-haiku-4-5-20251001",
46
43
  "claude-opus-4": "claude-opus-4-20250514",
@@ -188,26 +185,7 @@ var createPromptlyClient = (config) => {
188
185
  );
189
186
  return results;
190
187
  };
191
- const aiParams = async (promptId, options) => {
192
- const prompt = await fetchPrompt(promptId, {
193
- version: options?.version
194
- });
195
- const userMessage = options?.variables ? interpolate(prompt.userMessage, options.variables) : prompt.userMessage;
196
- const model = await modelResolver(prompt.config.model);
197
- const result = {
198
- system: prompt.systemMessage,
199
- prompt: userMessage,
200
- temperature: prompt.config.temperature,
201
- model
202
- };
203
- if (prompt.config.schema && prompt.config.schema.length > 0) {
204
- const schema = buildZodSchema(prompt.config.schema);
205
- const { Output } = await import("ai");
206
- result.output = Output.object({ schema });
207
- }
208
- return result;
209
- };
210
- return { getPrompt, getPrompts, aiParams };
188
+ return { getPrompt, getPrompts };
211
189
  };
212
190
  export {
213
191
  PromptlyError,
package/dist/schema.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { S as SchemaField } from './types-W-omtl43.cjs';
2
+ import { S as SchemaField } from './types-BbNpKJej.cjs';
3
3
  import 'ai';
4
4
 
5
5
  declare const buildFieldSchema: (field: SchemaField) => z.ZodTypeAny;
package/dist/schema.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { S as SchemaField } from './types-W-omtl43.js';
2
+ import { S as SchemaField } from './types-BbNpKJej.js';
3
3
  import 'ai';
4
4
 
5
5
  declare const buildFieldSchema: (field: SchemaField) => z.ZodTypeAny;
package/dist/schema.js CHANGED
@@ -1,7 +1,282 @@
1
- import {
2
- buildFieldSchema,
3
- buildZodSchema
4
- } from "./chunk-GZIUWN6H.js";
1
+ // src/schema/builder.ts
2
+ import { z } from "zod";
3
+ var resolveTypeString = (typeStr) => {
4
+ const builder = TYPE_BUILDERS.get(typeStr);
5
+ if (builder) {
6
+ return builder({
7
+ id: "",
8
+ name: "",
9
+ type: typeStr,
10
+ validations: [],
11
+ params: {}
12
+ });
13
+ }
14
+ return z.string();
15
+ };
16
+ var buildCoercible = (params, coerced, standard) => {
17
+ if (params.coerce) {
18
+ return coerced;
19
+ }
20
+ return standard;
21
+ };
22
+ var TYPE_BUILDERS = /* @__PURE__ */ new Map([
23
+ ["string", (f) => buildCoercible(f.params, z.coerce.string(), z.string())],
24
+ ["number", (f) => buildCoercible(f.params, z.coerce.number(), z.number())],
25
+ ["boolean", (f) => buildCoercible(f.params, z.coerce.boolean(), z.boolean())],
26
+ ["date", (f) => buildCoercible(f.params, z.coerce.date(), z.date())],
27
+ ["bigint", (f) => buildCoercible(f.params, z.coerce.bigint(), z.bigint())],
28
+ ["null", () => z.null()],
29
+ ["undefined", () => z.undefined()],
30
+ ["void", () => z.void()],
31
+ ["any", () => z.any()],
32
+ ["unknown", () => z.unknown()],
33
+ ["never", () => z.never()],
34
+ ["nan", () => z.nan()],
35
+ ["symbol", () => z.symbol()],
36
+ [
37
+ "enum",
38
+ (f) => {
39
+ const values = f.params.enumValues ?? [];
40
+ return z.enum(values);
41
+ }
42
+ ],
43
+ [
44
+ "literal",
45
+ (f) => {
46
+ const value = f.params.enumValues?.[0] ?? "";
47
+ return z.literal(value);
48
+ }
49
+ ],
50
+ [
51
+ "array",
52
+ (f) => {
53
+ if (f.params.isTuple && f.params.tupleTypes) {
54
+ const types = f.params.tupleTypes.map(resolveTypeString);
55
+ return z.tuple(types);
56
+ }
57
+ const elementSchema = f.params.elementType ? resolveTypeString(f.params.elementType) : z.unknown();
58
+ return z.array(elementSchema);
59
+ }
60
+ ],
61
+ [
62
+ "object",
63
+ (f) => {
64
+ const schema = z.object({});
65
+ if (f.params.isStrict) {
66
+ return schema.strict();
67
+ }
68
+ if (f.params.isPassthrough) {
69
+ return schema.passthrough();
70
+ }
71
+ return schema;
72
+ }
73
+ ],
74
+ [
75
+ "record",
76
+ (f) => {
77
+ const keySchema = f.params.keyType ? resolveTypeString(f.params.keyType) : z.string();
78
+ const valueSchema = f.params.valueType ? resolveTypeString(f.params.valueType) : z.unknown();
79
+ return z.record(keySchema, valueSchema);
80
+ }
81
+ ],
82
+ [
83
+ "map",
84
+ (f) => {
85
+ const keySchema = f.params.keyType ? resolveTypeString(f.params.keyType) : z.string();
86
+ const valueSchema = f.params.valueType ? resolveTypeString(f.params.valueType) : z.unknown();
87
+ return z.map(keySchema, valueSchema);
88
+ }
89
+ ],
90
+ [
91
+ "set",
92
+ (f) => {
93
+ const elementSchema = f.params.elementType ? resolveTypeString(f.params.elementType) : z.unknown();
94
+ return z.set(elementSchema);
95
+ }
96
+ ],
97
+ [
98
+ "union",
99
+ (f) => {
100
+ if (f.params.isDiscriminatedUnion && f.params.discriminatedUnion) {
101
+ const { discriminator, cases } = f.params.discriminatedUnion;
102
+ const schemas = Object.values(cases).map(
103
+ (c) => z.object({
104
+ [discriminator]: z.literal(c.value),
105
+ ...Object.fromEntries(
106
+ c.fields.map((field) => [field.name, buildFieldSchema(field)])
107
+ )
108
+ })
109
+ );
110
+ return z.discriminatedUnion(
111
+ discriminator,
112
+ schemas
113
+ );
114
+ }
115
+ const types = (f.params.unionTypes ?? []).map(resolveTypeString);
116
+ return z.union(types);
117
+ }
118
+ ],
119
+ [
120
+ "intersection",
121
+ (f) => {
122
+ const types = (f.params.unionTypes ?? []).map(resolveTypeString);
123
+ return z.intersection(types[0] ?? z.unknown(), types[1] ?? z.unknown());
124
+ }
125
+ ]
126
+ ]);
127
+ var coerceDefaultValue = (value, fieldType) => {
128
+ const coercers = /* @__PURE__ */ new Map([
129
+ ["number", (v) => Number(v)],
130
+ ["boolean", (v) => v === "true"],
131
+ ["bigint", (v) => BigInt(v)]
132
+ ]);
133
+ const coercer = coercers.get(fieldType);
134
+ if (coercer) {
135
+ return coercer(value);
136
+ }
137
+ return value;
138
+ };
139
+ var applySizeValidation = (schema, type, value, message) => {
140
+ const num = Number(value);
141
+ if (schema instanceof z.ZodString) {
142
+ const methods = {
143
+ min: (n, m) => schema.min(n, m),
144
+ max: (n, m) => schema.max(n, m),
145
+ length: (n, m) => schema.length(n, m)
146
+ };
147
+ return methods[type]?.(num, message) ?? schema;
148
+ }
149
+ if (schema instanceof z.ZodNumber) {
150
+ const methods = {
151
+ min: (n, m) => schema.min(n, m),
152
+ max: (n, m) => schema.max(n, m)
153
+ };
154
+ return methods[type]?.(num, message) ?? schema;
155
+ }
156
+ if (schema instanceof z.ZodArray) {
157
+ const methods = {
158
+ min: (n) => schema.min(n),
159
+ max: (n) => schema.max(n),
160
+ length: (n) => schema.length(n)
161
+ };
162
+ return methods[type]?.(num) ?? schema;
163
+ }
164
+ return schema;
165
+ };
166
+ var VALIDATION_APPLICATORS = /* @__PURE__ */ new Map([
167
+ // Size validations
168
+ ["min", (s, r) => applySizeValidation(s, "min", r.value, r.message)],
169
+ ["max", (s, r) => applySizeValidation(s, "max", r.value, r.message)],
170
+ ["length", (s, r) => applySizeValidation(s, "length", r.value, r.message)],
171
+ // String validations
172
+ ["email", (s, r) => s instanceof z.ZodString ? s.email(r.message) : s],
173
+ ["url", (s, r) => s instanceof z.ZodString ? s.url(r.message) : s],
174
+ ["uuid", (s, r) => s instanceof z.ZodString ? s.uuid(r.message) : s],
175
+ ["cuid", (s, r) => s instanceof z.ZodString ? s.cuid(r.message) : s],
176
+ ["cuid2", (s, r) => s instanceof z.ZodString ? s.cuid2(r.message) : s],
177
+ ["ulid", (s, r) => s instanceof z.ZodString ? s.ulid(r.message) : s],
178
+ [
179
+ "regex",
180
+ (s, r) => s instanceof z.ZodString ? s.regex(new RegExp(r.value), r.message) : s
181
+ ],
182
+ [
183
+ "startsWith",
184
+ (s, r) => s instanceof z.ZodString ? s.startsWith(r.value, r.message) : s
185
+ ],
186
+ [
187
+ "endsWith",
188
+ (s, r) => s instanceof z.ZodString ? s.endsWith(r.value, r.message) : s
189
+ ],
190
+ [
191
+ "datetime",
192
+ (s, _r, f) => {
193
+ if (!(s instanceof z.ZodString)) {
194
+ return s;
195
+ }
196
+ const opts = f.params.stringOptions?.datetime;
197
+ return s.datetime(opts);
198
+ }
199
+ ],
200
+ [
201
+ "ip",
202
+ (s, _r, f) => {
203
+ if (!(s instanceof z.ZodString)) {
204
+ return s;
205
+ }
206
+ const version = f.params.stringOptions?.ip?.version;
207
+ if (version === "v6") {
208
+ return s.ipv6();
209
+ }
210
+ return s.ipv4();
211
+ }
212
+ ],
213
+ // String transforms
214
+ ["trim", (s) => s instanceof z.ZodString ? s.trim() : s],
215
+ ["toLowerCase", (s) => s instanceof z.ZodString ? s.toLowerCase() : s],
216
+ ["toUpperCase", (s) => s instanceof z.ZodString ? s.toUpperCase() : s],
217
+ // Number validations
218
+ ["int", (s, r) => s instanceof z.ZodNumber ? s.int(r.message) : s],
219
+ [
220
+ "positive",
221
+ (s, r) => s instanceof z.ZodNumber ? s.positive(r.message) : s
222
+ ],
223
+ [
224
+ "negative",
225
+ (s, r) => s instanceof z.ZodNumber ? s.negative(r.message) : s
226
+ ],
227
+ [
228
+ "multipleOf",
229
+ (s, r) => s instanceof z.ZodNumber ? s.multipleOf(Number(r.value), r.message) : s
230
+ ],
231
+ ["finite", (s, r) => s instanceof z.ZodNumber ? s.finite(r.message) : s],
232
+ ["safe", (s, r) => s instanceof z.ZodNumber ? s.safe(r.message) : s],
233
+ // Collection
234
+ [
235
+ "nonempty",
236
+ (s) => {
237
+ if (s instanceof z.ZodString) {
238
+ return s.min(1);
239
+ }
240
+ if (s instanceof z.ZodArray) {
241
+ return s.nonempty();
242
+ }
243
+ return s;
244
+ }
245
+ ],
246
+ // Wrapping modifiers
247
+ ["optional", (s) => s.optional()],
248
+ ["nullable", (s) => s.nullable()],
249
+ ["nullish", (s) => s.nullish()],
250
+ // Default & catch
251
+ ["default", (s, r, f) => s.default(coerceDefaultValue(r.value, f.type))],
252
+ ["catch", (s, r, f) => s.catch(coerceDefaultValue(r.value, f.type))],
253
+ // Readonly
254
+ ["readonly", (s) => s.readonly()]
255
+ ]);
256
+ var buildFieldSchema = (field) => {
257
+ const builder = TYPE_BUILDERS.get(field.type);
258
+ if (!builder) {
259
+ return z.unknown();
260
+ }
261
+ let schema = builder(field);
262
+ for (const rule of field.validations) {
263
+ const applicator = VALIDATION_APPLICATORS.get(rule.type);
264
+ if (applicator) {
265
+ schema = applicator(schema, rule, field);
266
+ }
267
+ }
268
+ if (field.params.description) {
269
+ schema = schema.describe(field.params.description);
270
+ }
271
+ return schema;
272
+ };
273
+ var buildZodSchema = (fields) => {
274
+ const shape = {};
275
+ for (const field of fields) {
276
+ shape[field.name] = buildFieldSchema(field);
277
+ }
278
+ return z.object(shape);
279
+ };
5
280
 
6
281
  // src/schema/codegen.ts
7
282
  var escapeString = (str) => str.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/\n/g, "\\n");
@@ -110,24 +110,9 @@ type PromptlyClientConfig = {
110
110
  type GetOptions<V extends string = string> = {
111
111
  version?: V;
112
112
  };
113
- type AiParamsOptions = {
114
- version?: string;
115
- variables?: Record<string, string>;
116
- };
117
- type AiParams = {
118
- system: string;
119
- prompt: string;
120
- temperature: number;
121
- model: ai.LanguageModel;
122
- output?: ReturnType<typeof ai.Output.object>;
123
- };
124
113
  type PromptlyClient = {
125
114
  getPrompt: <T extends string, V extends PromptVersion<T> | 'latest' = 'latest'>(promptId: T, options?: GetOptions<V>) => Promise<PromptResult<VariablesFor<T, V>>>;
126
115
  getPrompts: <const T extends readonly PromptRequest[]>(entries: T) => Promise<GetPromptsResults<T>>;
127
- aiParams: <T extends string, V extends PromptVersion<T> | 'latest' = 'latest'>(promptId: T, options?: {
128
- version?: V;
129
- variables?: VariablesFor<T, V>;
130
- }) => Promise<AiParams>;
131
116
  };
132
117
 
133
- export type { AiParams as A, ErrorCode as E, GetOptions as G, PromptlyClientConfig as P, SchemaField as S, ValidationRule as V, PromptlyClient as a, AiParamsOptions as b, ErrorResponse as c, PromptConfig as d, PromptId as e, PromptMessage as f, PromptRequest as g, PromptResponse as h, PromptResult as i, PromptVariableMap as j, PromptVersion as k, PublishedVersion as l, SchemaFieldParams as m };
118
+ export type { ErrorCode as E, GetOptions as G, PromptlyClientConfig as P, SchemaField as S, ValidationRule as V, PromptlyClient as a, ErrorResponse as b, PromptConfig as c, PromptId as d, PromptMessage as e, PromptRequest as f, PromptResponse as g, PromptResult as h, PromptVariableMap as i, PromptVersion as j, PublishedVersion as k, SchemaFieldParams as l };
@@ -110,24 +110,9 @@ type PromptlyClientConfig = {
110
110
  type GetOptions<V extends string = string> = {
111
111
  version?: V;
112
112
  };
113
- type AiParamsOptions = {
114
- version?: string;
115
- variables?: Record<string, string>;
116
- };
117
- type AiParams = {
118
- system: string;
119
- prompt: string;
120
- temperature: number;
121
- model: ai.LanguageModel;
122
- output?: ReturnType<typeof ai.Output.object>;
123
- };
124
113
  type PromptlyClient = {
125
114
  getPrompt: <T extends string, V extends PromptVersion<T> | 'latest' = 'latest'>(promptId: T, options?: GetOptions<V>) => Promise<PromptResult<VariablesFor<T, V>>>;
126
115
  getPrompts: <const T extends readonly PromptRequest[]>(entries: T) => Promise<GetPromptsResults<T>>;
127
- aiParams: <T extends string, V extends PromptVersion<T> | 'latest' = 'latest'>(promptId: T, options?: {
128
- version?: V;
129
- variables?: VariablesFor<T, V>;
130
- }) => Promise<AiParams>;
131
116
  };
132
117
 
133
- export type { AiParams as A, ErrorCode as E, GetOptions as G, PromptlyClientConfig as P, SchemaField as S, ValidationRule as V, PromptlyClient as a, AiParamsOptions as b, ErrorResponse as c, PromptConfig as d, PromptId as e, PromptMessage as f, PromptRequest as g, PromptResponse as h, PromptResult as i, PromptVariableMap as j, PromptVersion as k, PublishedVersion as l, SchemaFieldParams as m };
118
+ export type { ErrorCode as E, GetOptions as G, PromptlyClientConfig as P, SchemaField as S, ValidationRule as V, PromptlyClient as a, ErrorResponse as b, PromptConfig as c, PromptId as d, PromptMessage as e, PromptRequest as f, PromptResponse as g, PromptResult as h, PromptVariableMap as i, PromptVersion as j, PublishedVersion as k, SchemaFieldParams as l };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promptlycms/prompts",
3
- "version": "0.1.1",
3
+ "version": "0.1.2-canary.29d0c36",
4
4
  "description": "TypeScript SDK for Promptly CMS — fetch prompts, build Zod schemas, generate typed code",
5
5
  "type": "module",
6
6
  "exports": {
@@ -36,23 +36,23 @@
36
36
  "citty": "^0.2.1"
37
37
  },
38
38
  "devDependencies": {
39
- "@ai-sdk/anthropic": "^3.0.44",
39
+ "@ai-sdk/anthropic": "^3.0.45",
40
40
  "@ai-sdk/google": "^3.0.29",
41
41
  "@ai-sdk/mistral": "^3.0.20",
42
42
  "@ai-sdk/openai": "^3.0.29",
43
- "@biomejs/biome": "^2.3.15",
43
+ "@biomejs/biome": "^2.4.2",
44
44
  "@changesets/changelog-github": "^0.5.2",
45
45
  "@changesets/cli": "^2.29.8",
46
46
  "@types/bun": "latest",
47
- "@typescript/native-preview": "^7.0.0-dev.20260214.1",
48
- "ai": "^6.0",
47
+ "@typescript/native-preview": "^7.0.0-dev.20260217.1",
48
+ "ai": "^6.0.89",
49
49
  "tsup": "^8.5.1",
50
50
  "zod": "^4.3.6"
51
51
  },
52
52
  "peerDependencies": {
53
53
  "typescript": "^5",
54
54
  "zod": "^4.0.0",
55
- "ai": "^4.0 || ^5.0 || ^6.0"
55
+ "ai": "^6.0.89"
56
56
  },
57
57
  "peerDependenciesMeta": {
58
58
  "@ai-sdk/anthropic": {
@@ -1,284 +0,0 @@
1
- // src/schema/builder.ts
2
- import { z } from "zod";
3
- var resolveTypeString = (typeStr) => {
4
- const builder = TYPE_BUILDERS.get(typeStr);
5
- if (builder) {
6
- return builder({
7
- id: "",
8
- name: "",
9
- type: typeStr,
10
- validations: [],
11
- params: {}
12
- });
13
- }
14
- return z.string();
15
- };
16
- var buildCoercible = (params, coerced, standard) => {
17
- if (params.coerce) {
18
- return coerced;
19
- }
20
- return standard;
21
- };
22
- var TYPE_BUILDERS = /* @__PURE__ */ new Map([
23
- ["string", (f) => buildCoercible(f.params, z.coerce.string(), z.string())],
24
- ["number", (f) => buildCoercible(f.params, z.coerce.number(), z.number())],
25
- ["boolean", (f) => buildCoercible(f.params, z.coerce.boolean(), z.boolean())],
26
- ["date", (f) => buildCoercible(f.params, z.coerce.date(), z.date())],
27
- ["bigint", (f) => buildCoercible(f.params, z.coerce.bigint(), z.bigint())],
28
- ["null", () => z.null()],
29
- ["undefined", () => z.undefined()],
30
- ["void", () => z.void()],
31
- ["any", () => z.any()],
32
- ["unknown", () => z.unknown()],
33
- ["never", () => z.never()],
34
- ["nan", () => z.nan()],
35
- ["symbol", () => z.symbol()],
36
- [
37
- "enum",
38
- (f) => {
39
- const values = f.params.enumValues ?? [];
40
- return z.enum(values);
41
- }
42
- ],
43
- [
44
- "literal",
45
- (f) => {
46
- const value = f.params.enumValues?.[0] ?? "";
47
- return z.literal(value);
48
- }
49
- ],
50
- [
51
- "array",
52
- (f) => {
53
- if (f.params.isTuple && f.params.tupleTypes) {
54
- const types = f.params.tupleTypes.map(resolveTypeString);
55
- return z.tuple(types);
56
- }
57
- const elementSchema = f.params.elementType ? resolveTypeString(f.params.elementType) : z.unknown();
58
- return z.array(elementSchema);
59
- }
60
- ],
61
- [
62
- "object",
63
- (f) => {
64
- const schema = z.object({});
65
- if (f.params.isStrict) {
66
- return schema.strict();
67
- }
68
- if (f.params.isPassthrough) {
69
- return schema.passthrough();
70
- }
71
- return schema;
72
- }
73
- ],
74
- [
75
- "record",
76
- (f) => {
77
- const keySchema = f.params.keyType ? resolveTypeString(f.params.keyType) : z.string();
78
- const valueSchema = f.params.valueType ? resolveTypeString(f.params.valueType) : z.unknown();
79
- return z.record(keySchema, valueSchema);
80
- }
81
- ],
82
- [
83
- "map",
84
- (f) => {
85
- const keySchema = f.params.keyType ? resolveTypeString(f.params.keyType) : z.string();
86
- const valueSchema = f.params.valueType ? resolveTypeString(f.params.valueType) : z.unknown();
87
- return z.map(keySchema, valueSchema);
88
- }
89
- ],
90
- [
91
- "set",
92
- (f) => {
93
- const elementSchema = f.params.elementType ? resolveTypeString(f.params.elementType) : z.unknown();
94
- return z.set(elementSchema);
95
- }
96
- ],
97
- [
98
- "union",
99
- (f) => {
100
- if (f.params.isDiscriminatedUnion && f.params.discriminatedUnion) {
101
- const { discriminator, cases } = f.params.discriminatedUnion;
102
- const schemas = Object.values(cases).map(
103
- (c) => z.object({
104
- [discriminator]: z.literal(c.value),
105
- ...Object.fromEntries(
106
- c.fields.map((field) => [field.name, buildFieldSchema(field)])
107
- )
108
- })
109
- );
110
- return z.discriminatedUnion(
111
- discriminator,
112
- schemas
113
- );
114
- }
115
- const types = (f.params.unionTypes ?? []).map(resolveTypeString);
116
- return z.union(types);
117
- }
118
- ],
119
- [
120
- "intersection",
121
- (f) => {
122
- const types = (f.params.unionTypes ?? []).map(resolveTypeString);
123
- return z.intersection(types[0] ?? z.unknown(), types[1] ?? z.unknown());
124
- }
125
- ]
126
- ]);
127
- var coerceDefaultValue = (value, fieldType) => {
128
- const coercers = /* @__PURE__ */ new Map([
129
- ["number", (v) => Number(v)],
130
- ["boolean", (v) => v === "true"],
131
- ["bigint", (v) => BigInt(v)]
132
- ]);
133
- const coercer = coercers.get(fieldType);
134
- if (coercer) {
135
- return coercer(value);
136
- }
137
- return value;
138
- };
139
- var applySizeValidation = (schema, type, value, message) => {
140
- const num = Number(value);
141
- if (schema instanceof z.ZodString) {
142
- const methods = {
143
- min: (n, m) => schema.min(n, m),
144
- max: (n, m) => schema.max(n, m),
145
- length: (n, m) => schema.length(n, m)
146
- };
147
- return methods[type]?.(num, message) ?? schema;
148
- }
149
- if (schema instanceof z.ZodNumber) {
150
- const methods = {
151
- min: (n, m) => schema.min(n, m),
152
- max: (n, m) => schema.max(n, m)
153
- };
154
- return methods[type]?.(num, message) ?? schema;
155
- }
156
- if (schema instanceof z.ZodArray) {
157
- const methods = {
158
- min: (n) => schema.min(n),
159
- max: (n) => schema.max(n),
160
- length: (n) => schema.length(n)
161
- };
162
- return methods[type]?.(num) ?? schema;
163
- }
164
- return schema;
165
- };
166
- var VALIDATION_APPLICATORS = /* @__PURE__ */ new Map([
167
- // Size validations
168
- ["min", (s, r) => applySizeValidation(s, "min", r.value, r.message)],
169
- ["max", (s, r) => applySizeValidation(s, "max", r.value, r.message)],
170
- ["length", (s, r) => applySizeValidation(s, "length", r.value, r.message)],
171
- // String validations
172
- ["email", (s, r) => s instanceof z.ZodString ? s.email(r.message) : s],
173
- ["url", (s, r) => s instanceof z.ZodString ? s.url(r.message) : s],
174
- ["uuid", (s, r) => s instanceof z.ZodString ? s.uuid(r.message) : s],
175
- ["cuid", (s, r) => s instanceof z.ZodString ? s.cuid(r.message) : s],
176
- ["cuid2", (s, r) => s instanceof z.ZodString ? s.cuid2(r.message) : s],
177
- ["ulid", (s, r) => s instanceof z.ZodString ? s.ulid(r.message) : s],
178
- [
179
- "regex",
180
- (s, r) => s instanceof z.ZodString ? s.regex(new RegExp(r.value), r.message) : s
181
- ],
182
- [
183
- "startsWith",
184
- (s, r) => s instanceof z.ZodString ? s.startsWith(r.value, r.message) : s
185
- ],
186
- [
187
- "endsWith",
188
- (s, r) => s instanceof z.ZodString ? s.endsWith(r.value, r.message) : s
189
- ],
190
- [
191
- "datetime",
192
- (s, _r, f) => {
193
- if (!(s instanceof z.ZodString)) {
194
- return s;
195
- }
196
- const opts = f.params.stringOptions?.datetime;
197
- return s.datetime(opts);
198
- }
199
- ],
200
- [
201
- "ip",
202
- (s, _r, f) => {
203
- if (!(s instanceof z.ZodString)) {
204
- return s;
205
- }
206
- const version = f.params.stringOptions?.ip?.version;
207
- if (version === "v6") {
208
- return s.ipv6();
209
- }
210
- return s.ipv4();
211
- }
212
- ],
213
- // String transforms
214
- ["trim", (s) => s instanceof z.ZodString ? s.trim() : s],
215
- ["toLowerCase", (s) => s instanceof z.ZodString ? s.toLowerCase() : s],
216
- ["toUpperCase", (s) => s instanceof z.ZodString ? s.toUpperCase() : s],
217
- // Number validations
218
- ["int", (s, r) => s instanceof z.ZodNumber ? s.int(r.message) : s],
219
- [
220
- "positive",
221
- (s, r) => s instanceof z.ZodNumber ? s.positive(r.message) : s
222
- ],
223
- [
224
- "negative",
225
- (s, r) => s instanceof z.ZodNumber ? s.negative(r.message) : s
226
- ],
227
- [
228
- "multipleOf",
229
- (s, r) => s instanceof z.ZodNumber ? s.multipleOf(Number(r.value), r.message) : s
230
- ],
231
- ["finite", (s, r) => s instanceof z.ZodNumber ? s.finite(r.message) : s],
232
- ["safe", (s, r) => s instanceof z.ZodNumber ? s.safe(r.message) : s],
233
- // Collection
234
- [
235
- "nonempty",
236
- (s) => {
237
- if (s instanceof z.ZodString) {
238
- return s.min(1);
239
- }
240
- if (s instanceof z.ZodArray) {
241
- return s.nonempty();
242
- }
243
- return s;
244
- }
245
- ],
246
- // Wrapping modifiers
247
- ["optional", (s) => s.optional()],
248
- ["nullable", (s) => s.nullable()],
249
- ["nullish", (s) => s.nullish()],
250
- // Default & catch
251
- ["default", (s, r, f) => s.default(coerceDefaultValue(r.value, f.type))],
252
- ["catch", (s, r, f) => s.catch(coerceDefaultValue(r.value, f.type))],
253
- // Readonly
254
- ["readonly", (s) => s.readonly()]
255
- ]);
256
- var buildFieldSchema = (field) => {
257
- const builder = TYPE_BUILDERS.get(field.type);
258
- if (!builder) {
259
- return z.unknown();
260
- }
261
- let schema = builder(field);
262
- for (const rule of field.validations) {
263
- const applicator = VALIDATION_APPLICATORS.get(rule.type);
264
- if (applicator) {
265
- schema = applicator(schema, rule, field);
266
- }
267
- }
268
- if (field.params.description) {
269
- schema = schema.describe(field.params.description);
270
- }
271
- return schema;
272
- };
273
- var buildZodSchema = (fields) => {
274
- const shape = {};
275
- for (const field of fields) {
276
- shape[field.name] = buildFieldSchema(field);
277
- }
278
- return z.object(shape);
279
- };
280
-
281
- export {
282
- buildFieldSchema,
283
- buildZodSchema
284
- };