@bigmistqke/lexicon-to-valibot 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -198,6 +198,8 @@ interface LexiconInput {
198
198
  interface LexiconToValibotOptions {
199
199
  /** External ref schemas (e.g., com.atproto.repo.strongRef) */
200
200
  externalRefs?: Record<string, v.GenericSchema>;
201
+ /** Format for blob validation: 'sdk' for parsing fetched records, 'wire' for outgoing. Default: 'sdk' */
202
+ format?: 'sdk' | 'wire';
201
203
  }
202
204
 
203
205
  type InferSchemaOutputs<T extends Record<string, v.GenericSchema>> = {
@@ -209,6 +211,7 @@ type InferSchemaOutputs<T extends Record<string, v.GenericSchema>> = {
209
211
  */
210
212
  declare function lexiconToValibot<T extends LexiconInput, ExtRefs extends Record<string, v.GenericSchema> = {}>(lexicon: T, options?: {
211
213
  externalRefs?: ExtRefs;
214
+ format?: 'sdk' | 'wire';
212
215
  }): InferLexiconValidators<T, InferSchemaOutputs<ExtRefs>>;
213
216
  /**
214
217
  * Convert a lexicon to valibot validators for XRPC endpoints.
@@ -216,6 +219,7 @@ declare function lexiconToValibot<T extends LexiconInput, ExtRefs extends Record
216
219
  */
217
220
  declare function xrpcToValibot<T extends LexiconInput, ExtRefs extends Record<string, v.GenericSchema> = {}>(lexicon: T, options?: {
218
221
  externalRefs?: ExtRefs;
222
+ format?: 'sdk' | 'wire';
219
223
  }): InferXrpcValidators<T, InferSchemaOutputs<ExtRefs>>;
220
224
 
221
225
  export { type AtprotoRefs, type InferLexType, type InferLexiconOutput, type InferLexiconValidators, type LexiconInput, type LexiconToValibotOptions, type ProcedureValidators, type QueryValidators, type SubscriptionValidators, atprotoRefs, lexiconToValibot, xrpcToValibot };
package/dist/index.js CHANGED
@@ -3,19 +3,31 @@ import * as v6 from "valibot";
3
3
 
4
4
  // src/converters/atproto.ts
5
5
  import * as v from "valibot";
6
- var typedBlobRef = v.object({
7
- $type: v.literal("blob"),
8
- ref: v.object({ $link: v.string() }),
9
- mimeType: v.string(),
10
- size: v.number()
11
- });
12
- var untypedBlobRef = v.object({
13
- cid: v.string(),
14
- mimeType: v.string()
15
- });
16
- var blobRefSchema = v.union([typedBlobRef, untypedBlobRef]);
17
- function convertBlob(schema) {
18
- return blobRefSchema;
6
+ function isWireBlobRef(value) {
7
+ if (typeof value !== "object" || value === null) return false;
8
+ const obj = value;
9
+ return obj.$type === "blob" && typeof obj.ref === "object" && obj.ref !== null && typeof obj.ref.$link === "string" && typeof obj.mimeType === "string" && typeof obj.size === "number";
10
+ }
11
+ function isSdkBlobRef(value) {
12
+ if (typeof value !== "object" || value === null) return false;
13
+ const obj = value;
14
+ return typeof obj.ref === "object" && obj.ref !== null && typeof obj.mimeType === "string" && typeof obj.size === "number";
15
+ }
16
+ function isUntypedBlobRef(value) {
17
+ if (typeof value !== "object" || value === null) return false;
18
+ const obj = value;
19
+ return typeof obj.cid === "string" && typeof obj.mimeType === "string";
20
+ }
21
+ var blobSdkSchema = v.custom(
22
+ (value) => isSdkBlobRef(value) || isUntypedBlobRef(value),
23
+ "Expected BlobRef (SDK format)"
24
+ );
25
+ var blobWireSchema = v.custom(
26
+ (value) => isWireBlobRef(value) || isUntypedBlobRef(value),
27
+ "Expected BlobRef (wire format)"
28
+ );
29
+ function convertBlob(schema, format) {
30
+ return format === "sdk" ? blobSdkSchema : blobWireSchema;
19
31
  }
20
32
  var cidLinkSchema = v.object({
21
33
  $link: v.string()
@@ -286,7 +298,7 @@ function convertType(schema, ctx) {
286
298
  return convertCidLink(schema);
287
299
  // AT Protocol types
288
300
  case "blob":
289
- return convertBlob(schema);
301
+ return convertBlob(schema, ctx.blobFormat);
290
302
  case "token":
291
303
  return convertToken(schema);
292
304
  // Complex types
@@ -326,7 +338,11 @@ function isXrpcDef(schema) {
326
338
  const type = schema.type;
327
339
  return type === "query" || type === "procedure" || type === "subscription";
328
340
  }
329
- function createRefResolver(lexiconId, defs, cache, externalRefs = {}) {
341
+ function isRecordDef(schema) {
342
+ if (typeof schema !== "object" || schema === null) return false;
343
+ return schema.type === "record";
344
+ }
345
+ function createRefResolver(lexiconId, defs, cache, externalRefs = {}, blobFormat = "sdk") {
330
346
  return (ref) => {
331
347
  let resolvedRef = ref;
332
348
  if (ref.startsWith("#")) {
@@ -357,7 +373,8 @@ function createRefResolver(lexiconId, defs, cache, externalRefs = {}) {
357
373
  const ctx = {
358
374
  lexiconId,
359
375
  defs,
360
- resolveRef: createRefResolver(lexiconId, defs, cache, externalRefs)
376
+ resolveRef: createRefResolver(lexiconId, defs, cache, externalRefs, blobFormat),
377
+ blobFormat
361
378
  };
362
379
  const schema = convertType(def, ctx);
363
380
  cache.set(resolvedRef, schema);
@@ -365,37 +382,51 @@ function createRefResolver(lexiconId, defs, cache, externalRefs = {}) {
365
382
  };
366
383
  }
367
384
  function lexiconToValibot(lexicon, options = {}) {
385
+ const blobFormat = options.format ?? "sdk";
368
386
  const cache = /* @__PURE__ */ new Map();
369
387
  const resolveRef = createRefResolver(
370
388
  lexicon.id,
371
389
  lexicon.defs,
372
390
  cache,
373
- options.externalRefs ?? {}
391
+ options.externalRefs ?? {},
392
+ blobFormat
374
393
  );
375
394
  const ctx = {
376
395
  lexiconId: lexicon.id,
377
396
  defs: lexicon.defs,
378
- resolveRef
397
+ resolveRef,
398
+ blobFormat
379
399
  };
380
400
  const result = {};
381
401
  for (const [defName, def] of Object.entries(lexicon.defs)) {
382
402
  if (isXrpcDef(def)) continue;
383
- result[defName] = convertType(def, ctx);
403
+ let schema = convertType(def, ctx);
404
+ if (blobFormat === "wire" && isRecordDef(def)) {
405
+ const $type = defName === "main" ? lexicon.id : `${lexicon.id}#${defName}`;
406
+ schema = v6.object({
407
+ $type: v6.literal($type),
408
+ ..."entries" in schema ? schema.entries : {}
409
+ });
410
+ }
411
+ result[defName] = schema;
384
412
  }
385
413
  return result;
386
414
  }
387
415
  function xrpcToValibot(lexicon, options = {}) {
416
+ const blobFormat = options.format ?? "sdk";
388
417
  const cache = /* @__PURE__ */ new Map();
389
418
  const resolveRef = createRefResolver(
390
419
  lexicon.id,
391
420
  lexicon.defs,
392
421
  cache,
393
- options.externalRefs ?? {}
422
+ options.externalRefs ?? {},
423
+ blobFormat
394
424
  );
395
425
  const ctx = {
396
426
  lexiconId: lexicon.id,
397
427
  defs: lexicon.defs,
398
- resolveRef
428
+ resolveRef,
429
+ blobFormat
399
430
  };
400
431
  const result = {};
401
432
  for (const [defName, def] of Object.entries(lexicon.defs)) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/converters/atproto.ts","../src/converters/complex.ts","../src/converters/primitives.ts","../src/converters/xrpc.ts","../src/atproto-refs.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { convertBlob, convertCidLink, convertToken } from \"./converters/atproto.js\";\nimport { convertArray, convertObject, convertRef, convertUnion } from \"./converters/complex.js\";\nimport {\n convertBoolean,\n convertBytes,\n convertInteger,\n convertString,\n convertUnknown,\n} from \"./converters/primitives.js\";\nimport {\n convertProcedure,\n convertQuery,\n convertSubscription,\n type ProcedureValidators,\n type QueryValidators,\n type SubscriptionValidators,\n} from \"./converters/xrpc.js\";\nimport type {\n ConverterContext,\n LexArray,\n LexBlob,\n LexBoolean,\n LexBytes,\n LexCidLink,\n LexInteger,\n LexObject,\n LexRecord,\n LexRef,\n LexRefUnion,\n LexString,\n LexToken,\n LexUnknown,\n LexUserType,\n LexXrpcProcedure,\n LexXrpcQuery,\n LexXrpcSubscription\n} from \"./types.js\";\n\n// Flexible input type that accepts both LexiconDoc and const objects\nexport interface LexiconInput {\n lexicon: 1;\n id: string;\n defs: Record<string, unknown>;\n description?: string;\n revision?: number;\n}\n\n// Options for lexiconToValibot\nexport interface LexiconToValibotOptions {\n /** External ref schemas (e.g., com.atproto.repo.strongRef) */\n externalRefs?: Record<string, v.GenericSchema>;\n}\n\nexport type { ProcedureValidators, QueryValidators, SubscriptionValidators };\n\ntype XrpcResult = QueryValidators | ProcedureValidators | SubscriptionValidators;\n\nfunction convertType(schema: unknown, ctx: ConverterContext): v.GenericSchema {\n if (typeof schema !== \"object\" || schema === null) {\n throw new Error(`Invalid schema: expected object, got ${typeof schema}`);\n }\n\n const schemaObj = schema as { type?: string };\n\n switch (schemaObj.type) {\n // Primitives\n case \"boolean\":\n return convertBoolean(schema as LexBoolean);\n case \"integer\":\n return convertInteger(schema as LexInteger);\n case \"string\":\n return convertString(schema as LexString);\n case \"unknown\":\n return convertUnknown(schema as LexUnknown);\n\n // IPLD types\n case \"bytes\":\n return convertBytes(schema as LexBytes);\n case \"cid-link\":\n return convertCidLink(schema as LexCidLink);\n\n // AT Protocol types\n case \"blob\":\n return convertBlob(schema as LexBlob);\n case \"token\":\n return convertToken(schema as LexToken);\n\n // Complex types\n case \"array\":\n return convertArray(schema as LexArray, ctx, convertType);\n case \"object\":\n return convertObject(schema as LexObject, ctx, convertType);\n case \"ref\":\n return convertRef(schema as LexRef, ctx);\n case \"union\":\n return convertUnion(schema as LexRefUnion, ctx);\n\n // Record type\n case \"record\":\n return convertObject((schema as LexRecord).record, ctx, convertType);\n\n default:\n throw new Error(`Unknown schema type: ${schemaObj.type}`);\n }\n}\n\n// Convert XRPC def - returns validators object\nfunction convertXrpcDef(schema: unknown, ctx: ConverterContext): XrpcResult {\n if (typeof schema !== \"object\" || schema === null) {\n throw new Error(`Invalid schema: expected object, got ${typeof schema}`);\n }\n\n const schemaObj = schema as { type?: string };\n\n switch (schemaObj.type) {\n case \"query\":\n return convertQuery(schema as LexXrpcQuery, ctx, convertType);\n case \"procedure\":\n return convertProcedure(schema as LexXrpcProcedure, ctx, convertType);\n case \"subscription\":\n return convertSubscription(schema as LexXrpcSubscription, ctx, convertType);\n default:\n throw new Error(`Not an XRPC type: ${schemaObj.type}`);\n }\n}\n\n// Check if a def is an XRPC type\nfunction isXrpcDef(schema: unknown): boolean {\n if (typeof schema !== \"object\" || schema === null) return false;\n const type = (schema as { type?: string }).type;\n return type === \"query\" || type === \"procedure\" || type === \"subscription\";\n}\n\nfunction createRefResolver(\n lexiconId: string,\n defs: Record<string, LexUserType>,\n cache: Map<string, v.GenericSchema>,\n externalRefs: Record<string, v.GenericSchema> = {}\n): (ref: string) => v.GenericSchema {\n return (ref: string) => {\n // Parse the ref - could be:\n // - \"#defName\" (local ref)\n // - \"com.example.lexicon#defName\" (external ref)\n // - \"com.example.lexicon\" (main def of external lexicon)\n\n let resolvedRef = ref;\n\n if (ref.startsWith(\"#\")) {\n // Local ref\n resolvedRef = `${lexiconId}${ref}`;\n } else if (!ref.includes(\"#\")) {\n // External ref to main def\n resolvedRef = `${ref}#main`;\n }\n\n // Check cache first\n if (cache.has(resolvedRef)) {\n return cache.get(resolvedRef)!;\n }\n\n // Check external refs (try both original and resolved)\n if (externalRefs[ref]) {\n cache.set(resolvedRef, externalRefs[ref]);\n return externalRefs[ref];\n }\n if (externalRefs[resolvedRef]) {\n cache.set(resolvedRef, externalRefs[resolvedRef]);\n return externalRefs[resolvedRef];\n }\n\n // Parse the full ref\n const [nsid, defName] = resolvedRef.includes(\"#\")\n ? resolvedRef.split(\"#\")\n : [resolvedRef, \"main\"];\n\n // Only handle local refs\n if (nsid !== lexiconId) {\n // External ref not found in externalRefs\n console.warn(`External ref not resolved: ${ref} - provide it in externalRefs option`);\n return v.unknown();\n }\n\n const def = defs[defName];\n if (!def) {\n throw new Error(`Ref not found: ${ref} (resolved to ${resolvedRef})`);\n }\n\n // Create context for conversion\n const ctx: ConverterContext = {\n lexiconId,\n defs,\n resolveRef: createRefResolver(lexiconId, defs, cache, externalRefs),\n };\n\n // Convert and cache\n const schema = convertType(def, ctx);\n cache.set(resolvedRef, schema);\n return schema;\n };\n}\n\nimport type { InferLexiconValidators, InferXrpcValidators } from \"./infer.js\";\n\n// Helper type to convert schema map to output type map\ntype InferSchemaOutputs<T extends Record<string, v.GenericSchema>> = {\n [K in keyof T]: v.InferOutput<T[K]>;\n};\n\n/**\n * Convert a lexicon to valibot schemas for records and objects.\n * Skips XRPC types (query, procedure, subscription) - use xrpcToValibot for those.\n */\nexport function lexiconToValibot<\n T extends LexiconInput,\n ExtRefs extends Record<string, v.GenericSchema> = {}\n>(\n lexicon: T,\n options: { externalRefs?: ExtRefs } = {}\n): InferLexiconValidators<T, InferSchemaOutputs<ExtRefs>> {\n const cache = new Map<string, v.GenericSchema>();\n const resolveRef = createRefResolver(\n lexicon.id,\n lexicon.defs as Record<string, LexUserType>,\n cache,\n options.externalRefs ?? {}\n );\n\n const ctx: ConverterContext = {\n lexiconId: lexicon.id,\n defs: lexicon.defs,\n resolveRef,\n };\n\n const result: Record<string, v.GenericSchema> = {};\n\n for (const [defName, def] of Object.entries(lexicon.defs)) {\n // Skip XRPC types\n if (isXrpcDef(def)) continue;\n result[defName] = convertType(def, ctx);\n }\n\n return result as InferLexiconValidators<T, InferSchemaOutputs<ExtRefs>>;\n}\n\n/**\n * Convert a lexicon to valibot validators for XRPC endpoints.\n * Only handles query, procedure, and subscription types.\n */\nexport function xrpcToValibot<\n T extends LexiconInput,\n ExtRefs extends Record<string, v.GenericSchema> = {}\n>(\n lexicon: T,\n options: { externalRefs?: ExtRefs } = {}\n): InferXrpcValidators<T, InferSchemaOutputs<ExtRefs>> {\n const cache = new Map<string, v.GenericSchema>();\n const resolveRef = createRefResolver(\n lexicon.id,\n lexicon.defs as Record<string, LexUserType>,\n cache,\n options.externalRefs ?? {}\n );\n\n const ctx: ConverterContext = {\n lexiconId: lexicon.id,\n defs: lexicon.defs,\n resolveRef,\n };\n\n const result: Record<string, XrpcResult> = {};\n\n for (const [defName, def] of Object.entries(lexicon.defs)) {\n // Only handle XRPC types\n if (!isXrpcDef(def)) continue;\n result[defName] = convertXrpcDef(def, ctx);\n }\n\n return result as InferXrpcValidators<T, InferSchemaOutputs<ExtRefs>>;\n}\n\n// Re-export valibot's InferOutput for convenience\nexport type { InferOutput } from \"valibot\";\n// Re-export built-in AT Protocol refs\nexport { atprotoRefs, type AtprotoRefs } from \"./atproto-refs.js\";\n\n// Re-export inference types\nexport type { InferLexiconOutput, InferLexiconValidators, InferLexType } from \"./infer.js\";\n// Re-export types\nexport type { LexiconDoc, LexUserType } from \"./types.js\";\n","import * as v from \"valibot\";\nimport type { LexBlob, LexCidLink, LexToken } from \"../types.js\";\n\n// Blob reference structure used by AT Protocol\n// Can be either typed (with $type: \"blob\") or untyped (legacy format)\nconst typedBlobRef = v.object({\n $type: v.literal(\"blob\"),\n ref: v.object({ $link: v.string() }),\n mimeType: v.string(),\n size: v.number(),\n});\n\nconst untypedBlobRef = v.object({\n cid: v.string(),\n mimeType: v.string(),\n});\n\nconst blobRefSchema = v.union([typedBlobRef, untypedBlobRef]);\n\nexport function convertBlob(schema: LexBlob): v.GenericSchema {\n // For now, we validate the structure but don't enforce accept/maxSize at runtime\n // Those would require access to the actual blob data\n return blobRefSchema;\n}\n\n// CID link is represented as an object with $link property containing the CID string\nconst cidLinkSchema = v.object({\n $link: v.string(),\n});\n\nexport function convertCidLink(_schema: LexCidLink): v.GenericSchema {\n return cidLinkSchema;\n}\n\nexport function convertToken(schema: LexToken): v.GenericSchema {\n // Token is essentially a string literal representing a constant identifier\n // The value should be the full NSID#name reference\n return v.string();\n}\n","import * as v from \"valibot\";\nimport type { LexArray, LexObject, LexRef, LexRefUnion, ConverterContext } from \"../types.js\";\n\nexport function convertArray(\n schema: LexArray,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): v.GenericSchema {\n const itemsSchema = convertType(schema.items, ctx);\n\n const checks: v.PipeItem<unknown[], unknown[], v.BaseIssue<unknown>>[] = [];\n\n if (schema.minLength !== undefined) {\n checks.push(v.minLength(schema.minLength));\n }\n if (schema.maxLength !== undefined) {\n checks.push(v.maxLength(schema.maxLength));\n }\n\n if (checks.length === 0) {\n return v.array(itemsSchema);\n }\n\n return v.pipe(v.array(itemsSchema), ...checks);\n}\n\nexport function convertObject(\n schema: LexObject,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): v.GenericSchema {\n const properties: Record<string, v.GenericSchema> = {};\n const requiredSet = new Set(schema.required ?? []);\n const nullableSet = new Set(schema.nullable ?? []);\n\n if (schema.properties) {\n for (const [key, prop] of Object.entries(schema.properties)) {\n let propSchema = convertType(prop, ctx);\n\n // Handle nullable\n if (nullableSet.has(key)) {\n propSchema = v.nullable(propSchema);\n }\n\n // Handle optional (not in required list)\n if (!requiredSet.has(key)) {\n propSchema = v.optional(propSchema);\n }\n\n properties[key] = propSchema;\n }\n }\n\n return v.object(properties);\n}\n\nexport function convertRef(schema: LexRef, ctx: ConverterContext): v.GenericSchema {\n return v.lazy(() => ctx.resolveRef(schema.ref));\n}\n\nexport function convertUnion(\n schema: LexRefUnion,\n ctx: ConverterContext\n): v.GenericSchema {\n if (schema.refs.length === 0) {\n return v.never();\n }\n\n if (schema.refs.length === 1) {\n return v.lazy(() => ctx.resolveRef(schema.refs[0]));\n }\n\n // Create a union of lazy refs - we know there are at least 2 refs from the check above\n const [first, second, ...rest] = schema.refs.map((ref) =>\n v.lazy(() => ctx.resolveRef(ref))\n );\n\n return v.union([first, second, ...rest]);\n}\n","import * as v from \"valibot\";\nimport type { LexBoolean, LexInteger, LexString, LexUnknown, LexBytes } from \"../types.js\";\n\nexport function convertBoolean(schema: LexBoolean): v.GenericSchema {\n if (schema.const !== undefined) {\n return v.literal(schema.const);\n }\n return v.boolean();\n}\n\nexport function convertInteger(schema: LexInteger): v.GenericSchema {\n const checks: v.PipeItem<number, number, v.BaseIssue<unknown>>[] = [v.integer()];\n\n if (schema.minimum !== undefined) {\n checks.push(v.minValue(schema.minimum));\n }\n if (schema.maximum !== undefined) {\n checks.push(v.maxValue(schema.maximum));\n }\n\n if (schema.enum !== undefined && schema.enum.length > 0) {\n return v.picklist(schema.enum);\n }\n\n if (schema.const !== undefined) {\n return v.literal(schema.const);\n }\n\n return v.pipe(v.number(), ...checks);\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(\"en\", { granularity: \"grapheme\" });\n\nfunction countGraphemes(str: string): number {\n return [...graphemeSegmenter.segment(str)].length;\n}\n\nexport function convertString(schema: LexString): v.GenericSchema {\n const checks: v.PipeItem<string, string, v.BaseIssue<unknown>>[] = [];\n\n if (schema.minLength !== undefined) {\n checks.push(v.minLength(schema.minLength));\n }\n if (schema.maxLength !== undefined) {\n checks.push(v.maxLength(schema.maxLength));\n }\n\n if (schema.minGraphemes !== undefined) {\n const min = schema.minGraphemes;\n checks.push(\n v.check(\n (value) => countGraphemes(value) >= min,\n `String must have at least ${min} grapheme(s)`\n )\n );\n }\n if (schema.maxGraphemes !== undefined) {\n const max = schema.maxGraphemes;\n checks.push(\n v.check(\n (value) => countGraphemes(value) <= max,\n `String must have at most ${max} grapheme(s)`\n )\n );\n }\n\n if (schema.enum !== undefined && schema.enum.length > 0) {\n return v.picklist(schema.enum);\n }\n\n if (schema.const !== undefined) {\n return v.literal(schema.const);\n }\n\n if (schema.format !== undefined) {\n switch (schema.format) {\n case \"datetime\":\n checks.push(v.isoTimestamp());\n break;\n case \"uri\":\n checks.push(v.url());\n break;\n case \"at-uri\":\n checks.push(v.regex(/^at:\\/\\/[a-zA-Z0-9._:%-]+\\/[a-zA-Z0-9.]+\\/[a-zA-Z0-9._~:@!$&')(*+,;=-]+$/));\n break;\n case \"did\":\n checks.push(v.regex(/^did:[a-z]+:[a-zA-Z0-9._:%-]*[a-zA-Z0-9._-]$/));\n break;\n case \"handle\":\n checks.push(v.regex(/^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/));\n break;\n case \"nsid\":\n checks.push(v.regex(/^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\\.[a-zA-Z]([a-zA-Z]{0,61}[a-zA-Z])?)$/));\n break;\n case \"cid\":\n checks.push(v.regex(/^[a-zA-Z0-9+/=]+$/));\n break;\n case \"tid\":\n checks.push(v.regex(/^[234567abcdefghijklmnopqrstuvwxyz]{13}$/));\n break;\n case \"record-key\":\n checks.push(v.regex(/^[a-zA-Z0-9._:~-]+$/));\n break;\n case \"language\":\n checks.push(v.regex(/^[a-zA-Z]{2,3}(-[a-zA-Z0-9]+)*$/));\n break;\n case \"at-identifier\":\n // at-identifier can be a handle or a DID\n checks.push(v.regex(/^(did:[a-z]+:[a-zA-Z0-9._:%-]*[a-zA-Z0-9._-]|([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)$/));\n break;\n }\n }\n\n if (checks.length === 0) {\n return v.string();\n }\n\n return v.pipe(v.string(), ...checks);\n}\n\nexport function convertUnknown(_schema: LexUnknown): v.GenericSchema {\n return v.unknown();\n}\n\nexport function convertBytes(schema: LexBytes): v.GenericSchema {\n const baseSchema = v.instance(Uint8Array);\n\n if (schema.minLength === undefined && schema.maxLength === undefined) {\n return baseSchema;\n }\n\n return v.pipe(\n baseSchema,\n v.check((value) => {\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n return false;\n }\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n return false;\n }\n return true;\n }, `Bytes length must be between ${schema.minLength ?? 0} and ${schema.maxLength ?? \"∞\"}`)\n );\n}\n","import * as v from \"valibot\";\nimport type { LexXrpcQuery, LexXrpcProcedure, LexXrpcSubscription, ConverterContext } from \"../types.js\";\n\nexport interface QueryValidators {\n parameters: v.GenericSchema;\n output: v.GenericSchema;\n}\n\nexport interface ProcedureValidators {\n parameters: v.GenericSchema;\n input: v.GenericSchema;\n output: v.GenericSchema;\n}\n\nexport interface SubscriptionValidators {\n parameters: v.GenericSchema;\n message: v.GenericSchema;\n}\n\n// Convert params object to valibot schema\nfunction convertParams(\n params: { type: \"params\"; required?: string[]; properties?: Record<string, unknown> } | undefined,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): v.GenericSchema {\n if (!params?.properties) {\n return v.object({});\n }\n\n const properties: Record<string, v.GenericSchema> = {};\n const requiredSet = new Set(params.required ?? []);\n\n for (const [key, prop] of Object.entries(params.properties)) {\n let propSchema = convertType(prop, ctx);\n\n if (!requiredSet.has(key)) {\n propSchema = v.optional(propSchema);\n }\n\n properties[key] = propSchema;\n }\n\n return v.object(properties);\n}\n\n// Convert body (input/output/message) to valibot schema\nfunction convertBody(\n body: { schema?: unknown } | undefined,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): v.GenericSchema {\n if (!body?.schema) {\n return v.unknown();\n }\n return convertType(body.schema, ctx);\n}\n\nexport function convertQuery(\n schema: LexXrpcQuery,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): QueryValidators {\n return {\n parameters: convertParams(schema.parameters, ctx, convertType),\n output: convertBody(schema.output, ctx, convertType),\n };\n}\n\nexport function convertProcedure(\n schema: LexXrpcProcedure,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): ProcedureValidators {\n return {\n parameters: convertParams(schema.parameters, ctx, convertType),\n input: convertBody(schema.input, ctx, convertType),\n output: convertBody(schema.output, ctx, convertType),\n };\n}\n\nexport function convertSubscription(\n schema: LexXrpcSubscription,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): SubscriptionValidators {\n return {\n parameters: convertParams(schema.parameters, ctx, convertType),\n message: convertBody(schema.message, ctx, convertType),\n };\n}\n","// Built-in AT Protocol type validators\n// Users can spread these into externalRefs option\n\nimport * as v from \"valibot\";\n\n// com.atproto.repo.strongRef - reference to another record\nconst strongRef = v.object({\n uri: v.string(),\n cid: v.string(),\n});\n\n// com.atproto.label.selfLabel\nconst selfLabel = v.object({\n val: v.string(),\n});\n\n// com.atproto.label.selfLabels\nconst selfLabels = v.object({\n values: v.array(selfLabel),\n});\n\nexport const atprotoRefs = {\n \"com.atproto.repo.strongRef\": strongRef,\n \"com.atproto.repo.strongRef#main\": strongRef,\n \"com.atproto.label.defs#selfLabel\": selfLabel,\n \"com.atproto.label.defs#selfLabels\": selfLabels,\n} as const;\n\nexport type AtprotoRefs = typeof atprotoRefs;"],"mappings":"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","names":["v","v","convertType","v","v","convertType","v"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/converters/atproto.ts","../src/converters/complex.ts","../src/converters/primitives.ts","../src/converters/xrpc.ts","../src/atproto-refs.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { convertBlob, convertCidLink, convertToken } from \"./converters/atproto.js\";\nimport { convertArray, convertObject, convertRef, convertUnion } from \"./converters/complex.js\";\nimport {\n convertBoolean,\n convertBytes,\n convertInteger,\n convertString,\n convertUnknown,\n} from \"./converters/primitives.js\";\nimport {\n convertProcedure,\n convertQuery,\n convertSubscription,\n type ProcedureValidators,\n type QueryValidators,\n type SubscriptionValidators,\n} from \"./converters/xrpc.js\";\nimport type {\n ConverterContext,\n LexArray,\n LexBlob,\n LexBoolean,\n LexBytes,\n LexCidLink,\n LexInteger,\n LexObject,\n LexRecord,\n LexRef,\n LexRefUnion,\n LexString,\n LexToken,\n LexUnknown,\n LexUserType,\n LexXrpcProcedure,\n LexXrpcQuery,\n LexXrpcSubscription\n} from \"./types.js\";\n\n// Flexible input type that accepts both LexiconDoc and const objects\nexport interface LexiconInput {\n lexicon: 1;\n id: string;\n defs: Record<string, unknown>;\n description?: string;\n revision?: number;\n}\n\n// Options for lexiconToValibot\nexport interface LexiconToValibotOptions {\n /** External ref schemas (e.g., com.atproto.repo.strongRef) */\n externalRefs?: Record<string, v.GenericSchema>;\n /** Format for blob validation: 'sdk' for parsing fetched records, 'wire' for outgoing. Default: 'sdk' */\n format?: 'sdk' | 'wire';\n}\n\nexport type { ProcedureValidators, QueryValidators, SubscriptionValidators };\n\ntype XrpcResult = QueryValidators | ProcedureValidators | SubscriptionValidators;\n\nfunction convertType(schema: unknown, ctx: ConverterContext): v.GenericSchema {\n if (typeof schema !== \"object\" || schema === null) {\n throw new Error(`Invalid schema: expected object, got ${typeof schema}`);\n }\n\n const schemaObj = schema as { type?: string };\n\n switch (schemaObj.type) {\n // Primitives\n case \"boolean\":\n return convertBoolean(schema as LexBoolean);\n case \"integer\":\n return convertInteger(schema as LexInteger);\n case \"string\":\n return convertString(schema as LexString);\n case \"unknown\":\n return convertUnknown(schema as LexUnknown);\n\n // IPLD types\n case \"bytes\":\n return convertBytes(schema as LexBytes);\n case \"cid-link\":\n return convertCidLink(schema as LexCidLink);\n\n // AT Protocol types\n case \"blob\":\n return convertBlob(schema as LexBlob, ctx.blobFormat);\n case \"token\":\n return convertToken(schema as LexToken);\n\n // Complex types\n case \"array\":\n return convertArray(schema as LexArray, ctx, convertType);\n case \"object\":\n return convertObject(schema as LexObject, ctx, convertType);\n case \"ref\":\n return convertRef(schema as LexRef, ctx);\n case \"union\":\n return convertUnion(schema as LexRefUnion, ctx);\n\n // Record type\n case \"record\":\n return convertObject((schema as LexRecord).record, ctx, convertType);\n\n default:\n throw new Error(`Unknown schema type: ${schemaObj.type}`);\n }\n}\n\n// Convert XRPC def - returns validators object\nfunction convertXrpcDef(schema: unknown, ctx: ConverterContext): XrpcResult {\n if (typeof schema !== \"object\" || schema === null) {\n throw new Error(`Invalid schema: expected object, got ${typeof schema}`);\n }\n\n const schemaObj = schema as { type?: string };\n\n switch (schemaObj.type) {\n case \"query\":\n return convertQuery(schema as LexXrpcQuery, ctx, convertType);\n case \"procedure\":\n return convertProcedure(schema as LexXrpcProcedure, ctx, convertType);\n case \"subscription\":\n return convertSubscription(schema as LexXrpcSubscription, ctx, convertType);\n default:\n throw new Error(`Not an XRPC type: ${schemaObj.type}`);\n }\n}\n\n// Check if a def is an XRPC type\nfunction isXrpcDef(schema: unknown): boolean {\n if (typeof schema !== \"object\" || schema === null) return false;\n const type = (schema as { type?: string }).type;\n return type === \"query\" || type === \"procedure\" || type === \"subscription\";\n}\n\n// Check if a def is a record type\nfunction isRecordDef(schema: unknown): boolean {\n if (typeof schema !== \"object\" || schema === null) return false;\n return (schema as { type?: string }).type === \"record\";\n}\n\nfunction createRefResolver(\n lexiconId: string,\n defs: Record<string, LexUserType>,\n cache: Map<string, v.GenericSchema>,\n externalRefs: Record<string, v.GenericSchema> = {},\n blobFormat: 'sdk' | 'wire' = 'sdk'\n): (ref: string) => v.GenericSchema {\n return (ref: string) => {\n // Parse the ref - could be:\n // - \"#defName\" (local ref)\n // - \"com.example.lexicon#defName\" (external ref)\n // - \"com.example.lexicon\" (main def of external lexicon)\n\n let resolvedRef = ref;\n\n if (ref.startsWith(\"#\")) {\n // Local ref\n resolvedRef = `${lexiconId}${ref}`;\n } else if (!ref.includes(\"#\")) {\n // External ref to main def\n resolvedRef = `${ref}#main`;\n }\n\n // Check cache first\n if (cache.has(resolvedRef)) {\n return cache.get(resolvedRef)!;\n }\n\n // Check external refs (try both original and resolved)\n if (externalRefs[ref]) {\n cache.set(resolvedRef, externalRefs[ref]);\n return externalRefs[ref];\n }\n if (externalRefs[resolvedRef]) {\n cache.set(resolvedRef, externalRefs[resolvedRef]);\n return externalRefs[resolvedRef];\n }\n\n // Parse the full ref\n const [nsid, defName] = resolvedRef.includes(\"#\")\n ? resolvedRef.split(\"#\")\n : [resolvedRef, \"main\"];\n\n // Only handle local refs\n if (nsid !== lexiconId) {\n // External ref not found in externalRefs\n console.warn(`External ref not resolved: ${ref} - provide it in externalRefs option`);\n return v.unknown();\n }\n\n const def = defs[defName];\n if (!def) {\n throw new Error(`Ref not found: ${ref} (resolved to ${resolvedRef})`);\n }\n\n // Create context for conversion\n const ctx: ConverterContext = {\n lexiconId,\n defs,\n resolveRef: createRefResolver(lexiconId, defs, cache, externalRefs, blobFormat),\n blobFormat,\n };\n\n // Convert and cache\n const schema = convertType(def, ctx);\n cache.set(resolvedRef, schema);\n return schema;\n };\n}\n\nimport type { InferLexiconValidators, InferXrpcValidators } from \"./infer.js\";\n\n// Helper type to convert schema map to output type map\ntype InferSchemaOutputs<T extends Record<string, v.GenericSchema>> = {\n [K in keyof T]: v.InferOutput<T[K]>;\n};\n\n/**\n * Convert a lexicon to valibot schemas for records and objects.\n * Skips XRPC types (query, procedure, subscription) - use xrpcToValibot for those.\n */\nexport function lexiconToValibot<\n T extends LexiconInput,\n ExtRefs extends Record<string, v.GenericSchema> = {}\n>(\n lexicon: T,\n options: { externalRefs?: ExtRefs; format?: 'sdk' | 'wire' } = {}\n): InferLexiconValidators<T, InferSchemaOutputs<ExtRefs>> {\n const blobFormat = options.format ?? 'sdk';\n const cache = new Map<string, v.GenericSchema>();\n const resolveRef = createRefResolver(\n lexicon.id,\n lexicon.defs as Record<string, LexUserType>,\n cache,\n options.externalRefs ?? {},\n blobFormat\n );\n\n const ctx: ConverterContext = {\n lexiconId: lexicon.id,\n defs: lexicon.defs,\n resolveRef,\n blobFormat,\n };\n\n const result: Record<string, v.GenericSchema> = {};\n\n for (const [defName, def] of Object.entries(lexicon.defs)) {\n // Skip XRPC types\n if (isXrpcDef(def)) continue;\n\n let schema = convertType(def, ctx);\n\n // For wire format, wrap record types with $type\n if (blobFormat === 'wire' && isRecordDef(def)) {\n const $type = defName === 'main' ? lexicon.id : `${lexicon.id}#${defName}`;\n schema = v.object({\n $type: v.literal($type),\n ...('entries' in schema ? (schema as v.ObjectSchema<v.ObjectEntries, undefined>).entries : {}),\n });\n }\n\n result[defName] = schema;\n }\n\n return result as InferLexiconValidators<T, InferSchemaOutputs<ExtRefs>>;\n}\n\n/**\n * Convert a lexicon to valibot validators for XRPC endpoints.\n * Only handles query, procedure, and subscription types.\n */\nexport function xrpcToValibot<\n T extends LexiconInput,\n ExtRefs extends Record<string, v.GenericSchema> = {}\n>(\n lexicon: T,\n options: { externalRefs?: ExtRefs; format?: 'sdk' | 'wire' } = {}\n): InferXrpcValidators<T, InferSchemaOutputs<ExtRefs>> {\n const blobFormat = options.format ?? 'sdk';\n const cache = new Map<string, v.GenericSchema>();\n const resolveRef = createRefResolver(\n lexicon.id,\n lexicon.defs as Record<string, LexUserType>,\n cache,\n options.externalRefs ?? {},\n blobFormat\n );\n\n const ctx: ConverterContext = {\n lexiconId: lexicon.id,\n defs: lexicon.defs,\n resolveRef,\n blobFormat,\n };\n\n const result: Record<string, XrpcResult> = {};\n\n for (const [defName, def] of Object.entries(lexicon.defs)) {\n // Only handle XRPC types\n if (!isXrpcDef(def)) continue;\n result[defName] = convertXrpcDef(def, ctx);\n }\n\n return result as InferXrpcValidators<T, InferSchemaOutputs<ExtRefs>>;\n}\n\n// Re-export valibot's InferOutput for convenience\nexport type { InferOutput } from \"valibot\";\n// Re-export built-in AT Protocol refs\nexport { atprotoRefs, type AtprotoRefs } from \"./atproto-refs.js\";\n\n// Re-export inference types\nexport type { InferLexiconOutput, InferLexiconValidators, InferLexType } from \"./infer.js\";\n// Re-export types\nexport type { LexiconDoc, LexUserType } from \"./types.js\";\n","import * as v from \"valibot\";\nimport type { BlobFormat, LexBlob, LexCidLink, LexToken } from \"../types.js\";\n\n// Blob reference types for AT Protocol\n\n// Wire format: what gets sent to/from PDS\ntype WireBlobRef = {\n $type: \"blob\";\n ref: { $link: string };\n mimeType: string;\n size: number;\n};\n\n// SDK format: what the SDK deserializes to (class instances)\ntype SdkBlobRef = {\n ref: object; // _CID instance\n mimeType: string;\n size: number;\n};\n\n// Untyped/legacy format\ntype UntypedBlobRef = {\n cid: string;\n mimeType: string;\n};\n\ntype BlobRef = WireBlobRef | SdkBlobRef | UntypedBlobRef;\n\n// Check for wire format: { $type: \"blob\", ref: { $link: string }, ... }\nfunction isWireBlobRef(value: unknown): value is WireBlobRef {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n obj.$type === \"blob\" &&\n typeof obj.ref === \"object\" &&\n obj.ref !== null &&\n typeof (obj.ref as Record<string, unknown>).$link === \"string\" &&\n typeof obj.mimeType === \"string\" &&\n typeof obj.size === \"number\"\n );\n}\n\n// Check for SDK BlobRef class: { ref: CID, mimeType: string, size: number }\nfunction isSdkBlobRef(value: unknown): value is SdkBlobRef {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.ref === \"object\" &&\n obj.ref !== null &&\n typeof obj.mimeType === \"string\" &&\n typeof obj.size === \"number\"\n );\n}\n\nfunction isUntypedBlobRef(value: unknown): value is UntypedBlobRef {\n if (typeof value !== \"object\" || value === null) return false;\n const obj = value as Record<string, unknown>;\n return typeof obj.cid === \"string\" && typeof obj.mimeType === \"string\";\n}\n\n// Validator for SDK format (incoming from PDS via SDK)\nconst blobSdkSchema = v.custom<SdkBlobRef | UntypedBlobRef>(\n (value) => isSdkBlobRef(value) || isUntypedBlobRef(value),\n \"Expected BlobRef (SDK format)\"\n);\n\n// Validator for wire format (outgoing to PDS)\nconst blobWireSchema = v.custom<WireBlobRef | UntypedBlobRef>(\n (value) => isWireBlobRef(value) || isUntypedBlobRef(value),\n \"Expected BlobRef (wire format)\"\n);\n\nexport function convertBlob(schema: LexBlob, format: BlobFormat): v.GenericSchema {\n // For now, we validate the structure but don't enforce accept/maxSize at runtime\n // Those would require access to the actual blob data\n return format === 'sdk' ? blobSdkSchema : blobWireSchema;\n}\n\n// CID link is represented as an object with $link property containing the CID string\nconst cidLinkSchema = v.object({\n $link: v.string(),\n});\n\nexport function convertCidLink(_schema: LexCidLink): v.GenericSchema {\n return cidLinkSchema;\n}\n\nexport function convertToken(schema: LexToken): v.GenericSchema {\n // Token is essentially a string literal representing a constant identifier\n // The value should be the full NSID#name reference\n return v.string();\n}\n","import * as v from \"valibot\";\nimport type { LexArray, LexObject, LexRef, LexRefUnion, ConverterContext } from \"../types.js\";\n\nexport function convertArray(\n schema: LexArray,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): v.GenericSchema {\n const itemsSchema = convertType(schema.items, ctx);\n\n const checks: v.PipeItem<unknown[], unknown[], v.BaseIssue<unknown>>[] = [];\n\n if (schema.minLength !== undefined) {\n checks.push(v.minLength(schema.minLength));\n }\n if (schema.maxLength !== undefined) {\n checks.push(v.maxLength(schema.maxLength));\n }\n\n if (checks.length === 0) {\n return v.array(itemsSchema);\n }\n\n return v.pipe(v.array(itemsSchema), ...checks);\n}\n\nexport function convertObject(\n schema: LexObject,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): v.GenericSchema {\n const properties: Record<string, v.GenericSchema> = {};\n const requiredSet = new Set(schema.required ?? []);\n const nullableSet = new Set(schema.nullable ?? []);\n\n if (schema.properties) {\n for (const [key, prop] of Object.entries(schema.properties)) {\n let propSchema = convertType(prop, ctx);\n\n // Handle nullable\n if (nullableSet.has(key)) {\n propSchema = v.nullable(propSchema);\n }\n\n // Handle optional (not in required list)\n if (!requiredSet.has(key)) {\n propSchema = v.optional(propSchema);\n }\n\n properties[key] = propSchema;\n }\n }\n\n return v.object(properties);\n}\n\nexport function convertRef(schema: LexRef, ctx: ConverterContext): v.GenericSchema {\n return v.lazy(() => ctx.resolveRef(schema.ref));\n}\n\nexport function convertUnion(\n schema: LexRefUnion,\n ctx: ConverterContext\n): v.GenericSchema {\n if (schema.refs.length === 0) {\n return v.never();\n }\n\n if (schema.refs.length === 1) {\n return v.lazy(() => ctx.resolveRef(schema.refs[0]));\n }\n\n // Create a union of lazy refs - we know there are at least 2 refs from the check above\n const [first, second, ...rest] = schema.refs.map((ref) =>\n v.lazy(() => ctx.resolveRef(ref))\n );\n\n return v.union([first, second, ...rest]);\n}\n","import * as v from \"valibot\";\nimport type { LexBoolean, LexInteger, LexString, LexUnknown, LexBytes } from \"../types.js\";\n\nexport function convertBoolean(schema: LexBoolean): v.GenericSchema {\n if (schema.const !== undefined) {\n return v.literal(schema.const);\n }\n return v.boolean();\n}\n\nexport function convertInteger(schema: LexInteger): v.GenericSchema {\n const checks: v.PipeItem<number, number, v.BaseIssue<unknown>>[] = [v.integer()];\n\n if (schema.minimum !== undefined) {\n checks.push(v.minValue(schema.minimum));\n }\n if (schema.maximum !== undefined) {\n checks.push(v.maxValue(schema.maximum));\n }\n\n if (schema.enum !== undefined && schema.enum.length > 0) {\n return v.picklist(schema.enum);\n }\n\n if (schema.const !== undefined) {\n return v.literal(schema.const);\n }\n\n return v.pipe(v.number(), ...checks);\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(\"en\", { granularity: \"grapheme\" });\n\nfunction countGraphemes(str: string): number {\n return [...graphemeSegmenter.segment(str)].length;\n}\n\nexport function convertString(schema: LexString): v.GenericSchema {\n const checks: v.PipeItem<string, string, v.BaseIssue<unknown>>[] = [];\n\n if (schema.minLength !== undefined) {\n checks.push(v.minLength(schema.minLength));\n }\n if (schema.maxLength !== undefined) {\n checks.push(v.maxLength(schema.maxLength));\n }\n\n if (schema.minGraphemes !== undefined) {\n const min = schema.minGraphemes;\n checks.push(\n v.check(\n (value) => countGraphemes(value) >= min,\n `String must have at least ${min} grapheme(s)`\n )\n );\n }\n if (schema.maxGraphemes !== undefined) {\n const max = schema.maxGraphemes;\n checks.push(\n v.check(\n (value) => countGraphemes(value) <= max,\n `String must have at most ${max} grapheme(s)`\n )\n );\n }\n\n if (schema.enum !== undefined && schema.enum.length > 0) {\n return v.picklist(schema.enum);\n }\n\n if (schema.const !== undefined) {\n return v.literal(schema.const);\n }\n\n if (schema.format !== undefined) {\n switch (schema.format) {\n case \"datetime\":\n checks.push(v.isoTimestamp());\n break;\n case \"uri\":\n checks.push(v.url());\n break;\n case \"at-uri\":\n checks.push(v.regex(/^at:\\/\\/[a-zA-Z0-9._:%-]+\\/[a-zA-Z0-9.]+\\/[a-zA-Z0-9._~:@!$&')(*+,;=-]+$/));\n break;\n case \"did\":\n checks.push(v.regex(/^did:[a-z]+:[a-zA-Z0-9._:%-]*[a-zA-Z0-9._-]$/));\n break;\n case \"handle\":\n checks.push(v.regex(/^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/));\n break;\n case \"nsid\":\n checks.push(v.regex(/^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\\.[a-zA-Z]([a-zA-Z]{0,61}[a-zA-Z])?)$/));\n break;\n case \"cid\":\n checks.push(v.regex(/^[a-zA-Z0-9+/=]+$/));\n break;\n case \"tid\":\n checks.push(v.regex(/^[234567abcdefghijklmnopqrstuvwxyz]{13}$/));\n break;\n case \"record-key\":\n checks.push(v.regex(/^[a-zA-Z0-9._:~-]+$/));\n break;\n case \"language\":\n checks.push(v.regex(/^[a-zA-Z]{2,3}(-[a-zA-Z0-9]+)*$/));\n break;\n case \"at-identifier\":\n // at-identifier can be a handle or a DID\n checks.push(v.regex(/^(did:[a-z]+:[a-zA-Z0-9._:%-]*[a-zA-Z0-9._-]|([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)$/));\n break;\n }\n }\n\n if (checks.length === 0) {\n return v.string();\n }\n\n return v.pipe(v.string(), ...checks);\n}\n\nexport function convertUnknown(_schema: LexUnknown): v.GenericSchema {\n return v.unknown();\n}\n\nexport function convertBytes(schema: LexBytes): v.GenericSchema {\n const baseSchema = v.instance(Uint8Array);\n\n if (schema.minLength === undefined && schema.maxLength === undefined) {\n return baseSchema;\n }\n\n return v.pipe(\n baseSchema,\n v.check((value) => {\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n return false;\n }\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n return false;\n }\n return true;\n }, `Bytes length must be between ${schema.minLength ?? 0} and ${schema.maxLength ?? \"∞\"}`)\n );\n}\n","import * as v from \"valibot\";\nimport type { LexXrpcQuery, LexXrpcProcedure, LexXrpcSubscription, ConverterContext } from \"../types.js\";\n\nexport interface QueryValidators {\n parameters: v.GenericSchema;\n output: v.GenericSchema;\n}\n\nexport interface ProcedureValidators {\n parameters: v.GenericSchema;\n input: v.GenericSchema;\n output: v.GenericSchema;\n}\n\nexport interface SubscriptionValidators {\n parameters: v.GenericSchema;\n message: v.GenericSchema;\n}\n\n// Convert params object to valibot schema\nfunction convertParams(\n params: { type: \"params\"; required?: string[]; properties?: Record<string, unknown> } | undefined,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): v.GenericSchema {\n if (!params?.properties) {\n return v.object({});\n }\n\n const properties: Record<string, v.GenericSchema> = {};\n const requiredSet = new Set(params.required ?? []);\n\n for (const [key, prop] of Object.entries(params.properties)) {\n let propSchema = convertType(prop, ctx);\n\n if (!requiredSet.has(key)) {\n propSchema = v.optional(propSchema);\n }\n\n properties[key] = propSchema;\n }\n\n return v.object(properties);\n}\n\n// Convert body (input/output/message) to valibot schema\nfunction convertBody(\n body: { schema?: unknown } | undefined,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): v.GenericSchema {\n if (!body?.schema) {\n return v.unknown();\n }\n return convertType(body.schema, ctx);\n}\n\nexport function convertQuery(\n schema: LexXrpcQuery,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): QueryValidators {\n return {\n parameters: convertParams(schema.parameters, ctx, convertType),\n output: convertBody(schema.output, ctx, convertType),\n };\n}\n\nexport function convertProcedure(\n schema: LexXrpcProcedure,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): ProcedureValidators {\n return {\n parameters: convertParams(schema.parameters, ctx, convertType),\n input: convertBody(schema.input, ctx, convertType),\n output: convertBody(schema.output, ctx, convertType),\n };\n}\n\nexport function convertSubscription(\n schema: LexXrpcSubscription,\n ctx: ConverterContext,\n convertType: (type: unknown, ctx: ConverterContext) => v.GenericSchema\n): SubscriptionValidators {\n return {\n parameters: convertParams(schema.parameters, ctx, convertType),\n message: convertBody(schema.message, ctx, convertType),\n };\n}\n","// Built-in AT Protocol type validators\n// Users can spread these into externalRefs option\n\nimport * as v from \"valibot\";\n\n// com.atproto.repo.strongRef - reference to another record\nconst strongRef = v.object({\n uri: v.string(),\n cid: v.string(),\n});\n\n// com.atproto.label.selfLabel\nconst selfLabel = v.object({\n val: v.string(),\n});\n\n// com.atproto.label.selfLabels\nconst selfLabels = v.object({\n values: v.array(selfLabel),\n});\n\nexport const atprotoRefs = {\n \"com.atproto.repo.strongRef\": strongRef,\n \"com.atproto.repo.strongRef#main\": strongRef,\n \"com.atproto.label.defs#selfLabel\": selfLabel,\n \"com.atproto.label.defs#selfLabels\": selfLabels,\n} as const;\n\nexport type AtprotoRefs = typeof atprotoRefs;"],"mappings":"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","names":["v","v","convertType","v","v","convertType","v"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigmistqke/lexicon-to-valibot",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Convert AT Protocol Lexicon schemas to Valibot validators",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -27,6 +27,7 @@
27
27
  },
28
28
  "devDependencies": {
29
29
  "@atproto/lexicon": "^0.4.0",
30
+ "bumpp": "^9.0.0",
30
31
  "tsup": "^8.0.0",
31
32
  "typescript": "^5.0.0",
32
33
  "valibot": "^1.0.0",
@@ -36,6 +37,7 @@
36
37
  "build": "tsup",
37
38
  "dev": "tsup --watch",
38
39
  "test": "vitest run",
39
- "test:watch": "vitest"
40
+ "test:watch": "vitest",
41
+ "bump": "bumpp"
40
42
  }
41
43
  }