@atproto/lex-document 0.0.10 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/LICENSE.txt +1 -1
- package/dist/lexicon-document.d.ts +2414 -2395
- package/dist/lexicon-document.d.ts.map +1 -1
- package/dist/lexicon-document.js +59 -67
- package/dist/lexicon-document.js.map +1 -1
- package/dist/lexicon-schema-builder.d.ts +13 -15
- package/dist/lexicon-schema-builder.d.ts.map +1 -1
- package/dist/lexicon-schema-builder.js +16 -25
- package/dist/lexicon-schema-builder.js.map +1 -1
- package/package.json +3 -3
- package/src/lexicon-document.ts +59 -71
- package/src/lexicon-schema-builder.test.ts +2 -2
- package/src/lexicon-schema-builder.ts +17 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lexicon-schema-builder.js","sourceRoot":"","sources":["../src/lexicon-schema-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { l } from '@atproto/lex-schema'\nimport {\n LexiconArray,\n LexiconArrayItems,\n LexiconDocument,\n LexiconError,\n LexiconObject,\n LexiconParameters,\n LexiconPayload,\n LexiconRef,\n LexiconRefUnion,\n} from './lexicon-document.js'\nimport { LexiconIndexer } from './lexicon-indexer.js'\n\n/**\n * Builds a validator for a given lexicon \"ref\" from a lexicon indexer.\n *\n * @example\n *\n * ```ts\n * import { LexiconSchemaBuilder } from '@atproto/lex/doc'\n * import { LexiconStreamIndexer } from '@atproto/lex/doc'\n *\n * const indexer = new LexiconStreamIndexer(lexiconDocs)\n * const validator = await LexiconSchemaBuilder.build(indexer, 'com.example.foo#bar')\n * ```\n */\nexport class LexiconSchemaBuilder {\n static async build(\n indexer: LexiconIndexer,\n fullRef: string,\n ): Promise<l.Validator<unknown>> {\n const ctx = new LexiconSchemaBuilder(indexer)\n try {\n const result = await ctx.buildFullRef(fullRef)\n if (!(result instanceof l.Schema)) {\n throw new Error(`Ref ${fullRef} is not a schema type`)\n }\n return result\n } finally {\n await ctx.done()\n }\n }\n\n static async buildAll(indexer: LexiconIndexer) {\n const builder = new LexiconSchemaBuilder(indexer)\n const schemas = new Map<\n string,\n | l.Validator<unknown>\n | l.Query\n | l.Subscription\n | l.Procedure\n | l.PermissionSet\n >()\n if (!isAsyncIterableObject(indexer)) {\n throw new Error('An iterable indexer is required to build all schemas')\n }\n try {\n for await (const doc of indexer) {\n for (const hash of Object.keys(doc.defs)) {\n const fullRef = `${doc.id}#${hash}`\n const schema = await builder.buildFullRef(fullRef)\n schemas.set(fullRef, schema)\n }\n }\n return schemas\n } finally {\n await builder.done()\n }\n }\n\n #asyncTasks = new AsyncTasks()\n\n constructor(protected indexer: LexiconIndexer) {}\n\n async done(): Promise<void> {\n await this.#asyncTasks.done()\n }\n\n buildFullRef = memoize(async (fullRef: string) => {\n const { nsid, hash } = parseRef(fullRef)\n\n const doc = await this.indexer.get(nsid)\n\n return this.compileDef(doc, hash)\n })\n\n protected buildRefGetter(fullRef: string): () => l.Validator<unknown> {\n let validator: l.Validator<unknown>\n\n this.#asyncTasks.add(\n this.buildFullRef(fullRef).then((v) => {\n if (!(v instanceof l.Schema)) {\n throw new Error(`Only refs to schema types are allowed`)\n }\n validator = v\n }),\n )\n\n return () => {\n if (validator) return validator\n throw new Error('Validator not yet built. Did you await done()?')\n }\n }\n\n protected buildTypedRefGetter(\n fullRef: string,\n ): () => l.TypedObjectSchema | l.RecordSchema {\n let validator: l.TypedObjectSchema | l.RecordSchema\n\n this.#asyncTasks.add(\n this.buildFullRef(fullRef).then((v) => {\n if (v instanceof l.TypedObjectSchema || v instanceof l.RecordSchema) {\n validator = v\n } else {\n throw new Error(\n 'Only refs to records and object definitions are allowed',\n )\n }\n }),\n )\n\n return () => {\n if (validator) return validator\n throw new Error('Validator not yet built. Did you await done()?')\n }\n }\n\n protected compileDef(doc: LexiconDocument, hash: string) {\n const def = Object.hasOwn(doc.defs, hash) ? doc.defs[hash] : null\n if (!def) {\n throw new Error(\n `No definition found for hash \"${JSON.stringify(hash)}\" in ${doc.id}`,\n )\n }\n switch (def.type) {\n case 'permission-set':\n return l.permissionSet(\n doc.id,\n def.permissions.map(({ resource, type, ...p }) =>\n l.permission(resource, p),\n ),\n def,\n )\n case 'procedure':\n return l.procedure(\n doc.id,\n this.compileParams(doc, def.parameters),\n this.compilePayload(doc, def.input),\n this.compilePayload(doc, def.output),\n this.compileErrors(doc, def.errors),\n )\n case 'query':\n return l.query(\n doc.id,\n this.compileParams(doc, def.parameters),\n this.compilePayload(doc, def.output),\n this.compileErrors(doc, def.errors),\n )\n case 'subscription':\n return l.subscription(\n doc.id,\n this.compileParams(doc, def.parameters),\n this.compilePayloadSchema(doc, def.message.schema),\n this.compileErrors(doc, def.errors),\n )\n case 'token':\n return l.token(doc.id, hash)\n case 'record':\n return l.record(def.key, doc.id, this.compileObject(doc, def.record))\n case 'object':\n return l.typedObject(doc.id, hash, this.compileObject(doc, def))\n default:\n return this.compileLeaf(doc, def)\n }\n }\n\n protected compileLeaf(\n doc: LexiconDocument,\n def: LexiconArray | LexiconArrayItems,\n ): l.Validator<unknown> {\n if (\n 'const' in def &&\n 'enum' in def &&\n def.enum != null &&\n def.const !== undefined &&\n !(def.enum as readonly unknown[]).includes(def.const)\n ) {\n return l.never()\n }\n\n switch (def.type) {\n case 'string': {\n const schema = l.string(def)\n if (def.default != null) schema.check(def.default)\n if (def.const != null) schema.check(def.const)\n if (def.enum != null) for (const v of def.enum) schema.check(v)\n\n const result =\n def.const != null\n ? l.literal(def.const, def)\n : def.enum != null\n ? l.enum(def.enum, def)\n : schema\n\n if (def.default != null) result.check(def.default)\n return result\n }\n case 'integer': {\n const schema = l.integer(def)\n if (def.default != null) schema.check(def.default)\n if (def.const != null) schema.check(def.const)\n if (def.enum != null) for (const v of def.enum) schema.check(v)\n\n const result =\n def.const != null\n ? l.literal(def.const, def)\n : def.enum != null\n ? l.enum(def.enum, def)\n : schema\n\n if (def.default != null) result.check(def.default)\n return result\n }\n case 'boolean': {\n const result =\n def.const != null ? l.literal(def.const, def) : l.boolean(def)\n\n if (def.default != null) result.check(def.default)\n return result\n }\n case 'blob':\n return l.blob(def)\n case 'cid-link':\n return l.cidLink()\n case 'bytes':\n return l.bytes(def)\n case 'unknown':\n return l.unknown()\n case 'array':\n return l.array(this.compileLeaf(doc, def.items), def)\n default:\n return this.compileRef(doc, def)\n }\n }\n\n protected compileRef(\n doc: LexiconDocument,\n def: LexiconRef | LexiconRefUnion,\n ) {\n switch (def.type) {\n case 'ref':\n return l.ref(this.buildRefGetter(buildFullRef(doc, def.ref)))\n case 'union':\n return l.typedUnion(\n def.refs.map((r) =>\n l.typedRef(this.buildTypedRefGetter(buildFullRef(doc, r))),\n ),\n def.closed ?? false,\n )\n default:\n // @ts-expect-error\n throw new Error(`Unknown lexicon type: ${def.type}`)\n }\n }\n\n protected compileObject(\n doc: LexiconDocument,\n def: LexiconObject,\n ): l.ObjectSchema {\n const props: Record<string, l.Validator> = {}\n for (const [key, propDef] of Object.entries(def.properties)) {\n if (propDef === undefined) continue\n\n const isNullable = def.nullable?.includes(key)\n const isRequired = def.required?.includes(key)\n\n let schema = this.compileLeaf(doc, propDef)\n\n if (isNullable) {\n schema = l.nullable(schema)\n }\n\n if (!isRequired) {\n schema = l.optional(schema)\n }\n\n props[key] = schema\n }\n return l.object(props)\n }\n\n protected compilePayload(\n doc: LexiconDocument,\n def: LexiconPayload | undefined,\n ): l.Payload {\n return l.payload(\n def?.encoding,\n def?.schema ? this.compilePayloadSchema(doc, def.schema) : undefined,\n )\n }\n\n protected compileErrors(\n _doc: LexiconDocument,\n errors?: readonly LexiconError[],\n ): undefined | string[] {\n return errors?.map((e) => e.name)\n }\n\n protected compilePayloadSchema(\n doc: LexiconDocument,\n def: LexiconObject | LexiconRef | LexiconRefUnion,\n ) {\n switch (def.type) {\n case 'object':\n return this.compileObject(doc, def)\n default:\n return this.compileRef(doc, def)\n }\n }\n\n protected compileParams(doc: LexiconDocument, def?: LexiconParameters) {\n if (!def) return l.params()\n\n const props: Record<string, l.Validator> = {}\n for (const [key, propDef] of Object.entries(def.properties)) {\n if (propDef === undefined) continue\n\n const isRequired = def.required?.includes(key)\n\n let schema = this.compileLeaf(doc, propDef)\n\n if (!isRequired) {\n schema = l.optional(schema)\n }\n\n props[key] = schema\n }\n return l.params(props)\n }\n}\n\nclass AsyncTasks {\n /**\n * A set that, eventually, contains only rejected promises.\n */\n #promises = new Set<Promise<void>>()\n\n async done(): Promise<void> {\n do {\n // @NOTE this is going to throw on the first rejected promise (which is\n // what we want)\n for (const p of this.#promises) await p\n // At this point, all settled promises should have been removed. If\n // this.#promises is not empty, it means new promises were added during\n // the awaiting process, so we loop again.\n } while (this.#promises.size > 0)\n }\n\n add(p: Promise<void>) {\n const promise = Promise.resolve(p).then(() => {\n // No need to keep the promise any longer\n this.#promises.delete(promise)\n })\n\n void promise.catch((_err) => {\n // ignore errors here, they should be caught though done()\n })\n\n this.#promises.add(promise)\n }\n}\n\nfunction parseRef(fullRef: string) {\n const { length, 0: nsid, 1: hash } = fullRef.split('#')\n if (length !== 2) throw new Error('Uri can only have one hash segment')\n if (!nsid || !hash) throw new Error('Invalid ref, missing hash')\n return { nsid, hash }\n}\n\nfunction buildFullRef(from: LexiconDocument, ref: string) {\n if (ref.startsWith('#')) return `${from.id}${ref}`\n return ref\n}\n\nexport function memoize<Fn extends (arg: string) => unknown>(fn: Fn): Fn {\n const cache = new Map<string, ReturnType<Fn>>()\n return ((arg: string) => {\n if (cache.has(arg)) return cache.get(arg)!\n const result = fn(arg) as ReturnType<Fn>\n cache.set(arg, result)\n return result\n }) as Fn\n}\n\nfunction isAsyncIterableObject<T>(\n obj: T,\n): obj is T & object & AsyncIterable<unknown> {\n return (\n obj != null &&\n typeof obj === 'object' &&\n Symbol.asyncIterator in obj &&\n typeof obj[Symbol.asyncIterator] === 'function'\n )\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lexicon-schema-builder.js","sourceRoot":"","sources":["../src/lexicon-schema-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { l } from '@atproto/lex-schema'\nimport {\n LexiconArray,\n LexiconArrayItems,\n LexiconDocument,\n LexiconError,\n LexiconObject,\n LexiconParameters,\n LexiconPayload,\n LexiconRef,\n LexiconRefUnion,\n} from './lexicon-document.js'\nimport { LexiconIndexer } from './lexicon-indexer.js'\n\n/**\n * Builds a validator for a given lexicon \"ref\" from a lexicon indexer.\n *\n * @example\n *\n * ```ts\n * import { LexiconSchemaBuilder } from '@atproto/lex/doc'\n * import { LexiconStreamIndexer } from '@atproto/lex/doc'\n *\n * const indexer = new LexiconStreamIndexer(lexiconDocs)\n * const validator = await LexiconSchemaBuilder.build(indexer, 'com.example.foo#bar')\n * ```\n */\nexport class LexiconSchemaBuilder {\n static async build(\n indexer: LexiconIndexer,\n fullRef: string,\n ): Promise<l.Validator<unknown>> {\n const ctx = new LexiconSchemaBuilder(indexer)\n try {\n const result = await ctx.buildFullRef(fullRef)\n if (!(result instanceof l.Schema)) {\n throw new Error(`Ref ${fullRef} is not a schema type`)\n }\n return result\n } finally {\n await ctx.done()\n }\n }\n\n static async buildAll(indexer: LexiconIndexer) {\n const builder = new LexiconSchemaBuilder(indexer)\n const schemas = new Map<\n string,\n | l.Validator<unknown>\n | l.Query\n | l.Subscription\n | l.Procedure\n | l.PermissionSet\n >()\n if (!isAsyncIterableObject(indexer)) {\n throw new Error('An iterable indexer is required to build all schemas')\n }\n try {\n for await (const doc of indexer) {\n for (const hash of Object.keys(doc.defs)) {\n const fullRef = `${doc.id}#${hash}`\n const schema = await builder.buildFullRef(fullRef)\n schemas.set(fullRef, schema)\n }\n }\n return schemas\n } finally {\n await builder.done()\n }\n }\n\n #asyncTasks = new AsyncTasks()\n\n constructor(protected indexer: LexiconIndexer) {}\n\n async done(): Promise<void> {\n await this.#asyncTasks.done()\n }\n\n buildFullRef = memoize(async (fullRef: string) => {\n const { nsid, hash } = parseRef(fullRef)\n\n const doc = await this.indexer.get(nsid)\n\n return this.compileDef(doc, hash)\n })\n\n protected buildRefGetter(fullRef: string): () => l.Validator<unknown> {\n let validator: l.Validator<unknown>\n\n this.#asyncTasks.add(\n this.buildFullRef(fullRef).then((v) => {\n if (!(v instanceof l.Schema)) {\n throw new Error(`Only refs to schema types are allowed`)\n }\n validator = v\n }),\n )\n\n return () => {\n if (validator) return validator\n throw new Error('Validator not yet built. Did you await done()?')\n }\n }\n\n protected buildTypedRefGetter(\n fullRef: string,\n ): () => l.TypedObjectSchema | l.RecordSchema {\n let validator: l.TypedObjectSchema | l.RecordSchema\n\n this.#asyncTasks.add(\n this.buildFullRef(fullRef).then((v) => {\n if (v instanceof l.TypedObjectSchema || v instanceof l.RecordSchema) {\n validator = v\n } else {\n throw new Error(\n 'Only refs to records and object definitions are allowed',\n )\n }\n }),\n )\n\n return () => {\n if (validator) return validator\n throw new Error('Validator not yet built. Did you await done()?')\n }\n }\n\n protected compileDef(doc: LexiconDocument, hash: string) {\n const def = Object.hasOwn(doc.defs, hash) ? doc.defs[hash] : null\n if (!def) {\n throw new Error(\n `No definition found for hash \"${JSON.stringify(hash)}\" in ${doc.id}`,\n )\n }\n switch (def.type) {\n case 'permission-set':\n return l.permissionSet(\n doc.id,\n def.permissions.map(({ resource, type, ...p }) =>\n l.permission(resource, p),\n ),\n def,\n )\n case 'procedure':\n return l.procedure(\n doc.id,\n this.compileParams(doc, def.parameters),\n this.compilePayload(doc, def.input),\n this.compilePayload(doc, def.output),\n this.compileErrors(doc, def.errors),\n )\n case 'query':\n return l.query(\n doc.id,\n this.compileParams(doc, def.parameters),\n this.compilePayload(doc, def.output),\n this.compileErrors(doc, def.errors),\n )\n case 'subscription':\n return l.subscription(\n doc.id,\n this.compileParams(doc, def.parameters),\n this.compilePayloadSchema(doc, def.message.schema),\n this.compileErrors(doc, def.errors),\n )\n case 'token':\n return l.token(doc.id, hash)\n case 'record':\n return l.record(def.key, doc.id, this.compileObject(doc, def.record))\n case 'object':\n return l.typedObject(doc.id, hash, this.compileObject(doc, def))\n default:\n return this.compileLeaf(doc, def)\n }\n }\n\n protected compileLeaf(\n doc: LexiconDocument,\n def: LexiconArray | LexiconArrayItems,\n ): l.Validator<unknown> {\n if (\n 'const' in def &&\n 'enum' in def &&\n def.enum != null &&\n def.const !== undefined &&\n !(def.enum as readonly unknown[]).includes(def.const)\n ) {\n return l.never()\n }\n\n switch (def.type) {\n case 'string': {\n const schema = l.string(def)\n if (def.default != null) schema.check(def.default)\n if (def.const != null) schema.check(def.const)\n if (def.enum != null) for (const v of def.enum) schema.check(v)\n\n const result =\n def.const != null\n ? l.literal(def.const)\n : def.enum != null\n ? l.enum(def.enum)\n : schema\n\n return def.default != null ? l.withDefault(result, def.default) : result\n }\n case 'integer': {\n const schema = l.integer(def)\n if (def.default != null) schema.check(def.default)\n if (def.const != null) schema.check(def.const)\n if (def.enum != null) for (const v of def.enum) schema.check(v)\n\n const result =\n def.const != null\n ? l.literal(def.const)\n : def.enum != null\n ? l.enum(def.enum)\n : schema\n\n return def.default != null ? l.withDefault(result, def.default) : result\n }\n case 'boolean': {\n const result = def.const != null ? l.literal(def.const) : l.boolean()\n\n return def.default != null ? l.withDefault(result, def.default) : result\n }\n case 'blob':\n return l.blob(def)\n case 'cid-link':\n return l.cid()\n case 'bytes':\n return l.bytes(def)\n case 'unknown':\n return l.unknown()\n case 'array':\n return l.array(this.compileLeaf(doc, def.items), def)\n default:\n return this.compileRef(doc, def)\n }\n }\n\n protected compileRef(\n doc: LexiconDocument,\n def: LexiconRef | LexiconRefUnion,\n ) {\n switch (def.type) {\n case 'ref':\n return l.ref(this.buildRefGetter(buildFullRef(doc, def.ref)))\n case 'union':\n return l.typedUnion(\n def.refs.map((r) =>\n l.typedRef(this.buildTypedRefGetter(buildFullRef(doc, r))),\n ),\n def.closed ?? false,\n )\n default:\n // @ts-expect-error\n throw new Error(`Unknown lexicon type: ${def.type}`)\n }\n }\n\n protected compileObject(\n doc: LexiconDocument,\n def: LexiconObject,\n ): l.ObjectSchema {\n const props: Record<string, l.Validator> = {}\n for (const [key, propDef] of Object.entries(def.properties)) {\n if (propDef === undefined) continue\n\n const isNullable = def.nullable?.includes(key)\n const isRequired = def.required?.includes(key)\n\n let schema = this.compileLeaf(doc, propDef)\n\n if (isNullable) {\n schema = l.nullable(schema)\n }\n\n if (!isRequired) {\n schema = l.optional(schema)\n }\n\n props[key] = schema\n }\n return l.object(props)\n }\n\n protected compilePayload(\n doc: LexiconDocument,\n def: LexiconPayload | undefined,\n ): l.Payload {\n return l.payload(\n def?.encoding,\n def?.schema ? this.compilePayloadSchema(doc, def.schema) : undefined,\n )\n }\n\n protected compileErrors(\n _doc: LexiconDocument,\n errors?: readonly LexiconError[],\n ): undefined | string[] {\n return errors?.map((e) => e.name)\n }\n\n protected compilePayloadSchema(\n doc: LexiconDocument,\n def: LexiconObject | LexiconRef | LexiconRefUnion,\n ) {\n switch (def.type) {\n case 'object':\n return this.compileObject(doc, def)\n default:\n return this.compileRef(doc, def)\n }\n }\n\n protected compileParams(doc: LexiconDocument, def?: LexiconParameters) {\n if (!def) return l.params()\n\n const shape: l.ParamsSchemaShape = {}\n for (const [paramName, paramDef] of Object.entries(def.properties)) {\n if (paramDef === undefined) continue\n\n const isRequired = def.required?.includes(paramName)\n\n const propSchema = this.compileLeaf(doc, paramDef) as l.Validator<l.Param>\n\n shape[paramName] = isRequired ? propSchema : l.optional(propSchema)\n }\n\n return l.params(shape)\n }\n}\n\nclass AsyncTasks {\n /**\n * A set that, eventually, contains only rejected promises.\n */\n #promises = new Set<Promise<void>>()\n\n async done(): Promise<void> {\n do {\n // @NOTE this is going to throw on the first rejected promise (which is\n // what we want)\n for (const p of this.#promises) await p\n // At this point, all settled promises should have been removed. If\n // this.#promises is not empty, it means new promises were added during\n // the awaiting process, so we loop again.\n } while (this.#promises.size > 0)\n }\n\n add(p: Promise<void>) {\n const promise = Promise.resolve(p).then(() => {\n // No need to keep the promise any longer\n this.#promises.delete(promise)\n })\n\n void promise.catch((_err) => {\n // ignore errors here, they should be caught though done()\n })\n\n this.#promises.add(promise)\n }\n}\n\nfunction parseRef(fullRef: string) {\n const { length, 0: nsid, 1: hash } = fullRef.split('#')\n if (length !== 2) throw new Error('Uri can only have one hash segment')\n if (!nsid || !hash) throw new Error('Invalid ref, missing hash')\n return { nsid, hash }\n}\n\nfunction buildFullRef(from: LexiconDocument, ref: string) {\n if (ref.startsWith('#')) return `${from.id}${ref}`\n return ref\n}\n\nexport function memoize<Fn extends (arg: string) => unknown>(fn: Fn): Fn {\n const cache = new Map<string, ReturnType<Fn>>()\n return ((arg: string) => {\n if (cache.has(arg)) return cache.get(arg)!\n const result = fn(arg) as ReturnType<Fn>\n cache.set(arg, result)\n return result\n }) as Fn\n}\n\nfunction isAsyncIterableObject<T>(\n obj: T,\n): obj is T & object & AsyncIterable<unknown> {\n return (\n obj != null &&\n typeof obj === 'object' &&\n Symbol.asyncIterator in obj &&\n typeof obj[Symbol.asyncIterator] === 'function'\n )\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/lex-document",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.12",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Lexicon document validation tools for AT",
|
|
6
6
|
"keywords": [
|
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"core-js": "^3",
|
|
40
40
|
"tslib": "^2.8.1",
|
|
41
|
-
"@atproto/lex-schema": "0.0.
|
|
41
|
+
"@atproto/lex-schema": "^0.0.11"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"vitest": "^4.0.16",
|
|
45
|
-
"@atproto/lex-data": "0.0.
|
|
45
|
+
"@atproto/lex-data": "^0.0.10"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
48
|
"build": "tsc --build tsconfig.build.json",
|
package/src/lexicon-document.ts
CHANGED
|
@@ -1,74 +1,62 @@
|
|
|
1
1
|
import { l } from '@atproto/lex-schema'
|
|
2
2
|
|
|
3
|
-
// Re-usable shortcuts (avoid creating too many schemas)
|
|
4
|
-
|
|
5
|
-
const bool = l.boolean()
|
|
6
|
-
const int = l.integer()
|
|
7
|
-
const str = l.string()
|
|
8
|
-
|
|
9
|
-
const boopOpt = l.optional(bool)
|
|
10
|
-
const intOpt = l.optional(int)
|
|
11
|
-
const strOpt = l.optional(str)
|
|
12
|
-
|
|
13
|
-
const strArrOpt = l.optional(l.array(str))
|
|
14
|
-
|
|
15
3
|
// https://atproto.com/specs/lexicon
|
|
16
4
|
|
|
17
5
|
// "Concrete" Types
|
|
18
6
|
|
|
19
7
|
export const lexiconBooleanSchema = l.object({
|
|
20
8
|
type: l.literal('boolean'),
|
|
21
|
-
default:
|
|
22
|
-
const:
|
|
23
|
-
description:
|
|
9
|
+
default: l.optional(l.boolean()),
|
|
10
|
+
const: l.optional(l.boolean()),
|
|
11
|
+
description: l.optional(l.string()),
|
|
24
12
|
})
|
|
25
13
|
export type LexiconBoolean = l.Infer<typeof lexiconBooleanSchema>
|
|
26
14
|
|
|
27
15
|
export const lexiconIntegerSchema = l.object({
|
|
28
16
|
type: l.literal('integer'),
|
|
29
|
-
default:
|
|
30
|
-
minimum:
|
|
31
|
-
maximum:
|
|
17
|
+
default: l.optional(l.integer()),
|
|
18
|
+
minimum: l.optional(l.integer()),
|
|
19
|
+
maximum: l.optional(l.integer()),
|
|
32
20
|
enum: l.optional(l.array(l.integer())),
|
|
33
|
-
const:
|
|
34
|
-
description:
|
|
21
|
+
const: l.optional(l.integer()),
|
|
22
|
+
description: l.optional(l.string()),
|
|
35
23
|
})
|
|
36
24
|
export type LexiconInteger = l.Infer<typeof lexiconIntegerSchema>
|
|
37
25
|
|
|
38
26
|
export const lexiconStringSchema = l.object({
|
|
39
27
|
type: l.literal('string'),
|
|
40
28
|
format: l.optional(l.enum<l.StringFormat>(l.STRING_FORMATS)),
|
|
41
|
-
default:
|
|
42
|
-
minLength:
|
|
43
|
-
maxLength:
|
|
44
|
-
minGraphemes:
|
|
45
|
-
maxGraphemes:
|
|
46
|
-
enum:
|
|
47
|
-
const:
|
|
48
|
-
knownValues:
|
|
49
|
-
description:
|
|
29
|
+
default: l.optional(l.string()),
|
|
30
|
+
minLength: l.optional(l.integer()),
|
|
31
|
+
maxLength: l.optional(l.integer()),
|
|
32
|
+
minGraphemes: l.optional(l.integer()),
|
|
33
|
+
maxGraphemes: l.optional(l.integer()),
|
|
34
|
+
enum: l.optional(l.array(l.string())),
|
|
35
|
+
const: l.optional(l.string()),
|
|
36
|
+
knownValues: l.optional(l.array(l.string())),
|
|
37
|
+
description: l.optional(l.string()),
|
|
50
38
|
})
|
|
51
39
|
export type LexiconString = l.Infer<typeof lexiconStringSchema>
|
|
52
40
|
|
|
53
41
|
export const lexiconBytesSchema = l.object({
|
|
54
42
|
type: l.literal('bytes'),
|
|
55
|
-
maxLength:
|
|
56
|
-
minLength:
|
|
57
|
-
description:
|
|
43
|
+
maxLength: l.optional(l.integer()),
|
|
44
|
+
minLength: l.optional(l.integer()),
|
|
45
|
+
description: l.optional(l.string()),
|
|
58
46
|
})
|
|
59
47
|
export type LexiconBytes = l.Infer<typeof lexiconBytesSchema>
|
|
60
48
|
|
|
61
49
|
export const lexiconCidLinkSchema = l.object({
|
|
62
50
|
type: l.literal('cid-link'),
|
|
63
|
-
description:
|
|
51
|
+
description: l.optional(l.string()),
|
|
64
52
|
})
|
|
65
53
|
export type LexiconCid = l.Infer<typeof lexiconCidLinkSchema>
|
|
66
54
|
|
|
67
55
|
export const lexiconBlobSchema = l.object({
|
|
68
56
|
type: l.literal('blob'),
|
|
69
|
-
accept:
|
|
70
|
-
maxSize:
|
|
71
|
-
description:
|
|
57
|
+
accept: l.optional(l.array(l.string())),
|
|
58
|
+
maxSize: l.optional(l.integer()),
|
|
59
|
+
description: l.optional(l.string()),
|
|
72
60
|
})
|
|
73
61
|
export type LexiconBlob = l.Infer<typeof lexiconBlobSchema>
|
|
74
62
|
|
|
@@ -87,28 +75,28 @@ const CONCRETE_TYPES = [
|
|
|
87
75
|
|
|
88
76
|
export const lexiconUnknownSchema = l.object({
|
|
89
77
|
type: l.literal('unknown'),
|
|
90
|
-
description:
|
|
78
|
+
description: l.optional(l.string()),
|
|
91
79
|
})
|
|
92
80
|
export type LexiconUnknown = l.Infer<typeof lexiconUnknownSchema>
|
|
93
81
|
|
|
94
82
|
export const lexiconTokenSchema = l.object({
|
|
95
83
|
type: l.literal('token'),
|
|
96
|
-
description:
|
|
84
|
+
description: l.optional(l.string()),
|
|
97
85
|
})
|
|
98
86
|
export type LexiconToken = l.Infer<typeof lexiconTokenSchema>
|
|
99
87
|
|
|
100
88
|
export const lexiconRefSchema = l.object({
|
|
101
89
|
type: l.literal('ref'),
|
|
102
|
-
ref:
|
|
103
|
-
description:
|
|
90
|
+
ref: l.string(),
|
|
91
|
+
description: l.optional(l.string()),
|
|
104
92
|
})
|
|
105
93
|
export type LexiconRef = l.Infer<typeof lexiconRefSchema>
|
|
106
94
|
|
|
107
95
|
export const lexiconRefUnionSchema = l.object({
|
|
108
96
|
type: l.literal('union'),
|
|
109
|
-
refs: l.array(
|
|
110
|
-
closed:
|
|
111
|
-
description:
|
|
97
|
+
refs: l.array(l.string()),
|
|
98
|
+
closed: l.optional(l.boolean()),
|
|
99
|
+
description: l.optional(l.string()),
|
|
112
100
|
})
|
|
113
101
|
export type LexiconRefUnion = l.Infer<typeof lexiconRefUnionSchema>
|
|
114
102
|
|
|
@@ -127,9 +115,9 @@ export type LexiconArrayItems = l.Infer<(typeof ARRAY_ITEMS_SCHEMAS)[number]>
|
|
|
127
115
|
export const lexiconArraySchema = l.object({
|
|
128
116
|
type: l.literal('array'),
|
|
129
117
|
items: l.discriminatedUnion('type', ARRAY_ITEMS_SCHEMAS),
|
|
130
|
-
minLength:
|
|
131
|
-
maxLength:
|
|
132
|
-
description:
|
|
118
|
+
minLength: l.optional(l.integer()),
|
|
119
|
+
maxLength: l.optional(l.integer()),
|
|
120
|
+
description: l.optional(l.string()),
|
|
133
121
|
})
|
|
134
122
|
export type LexiconArray = l.Infer<typeof lexiconArraySchema>
|
|
135
123
|
|
|
@@ -146,15 +134,15 @@ export const lexiconObjectSchema = l.refine(
|
|
|
146
134
|
l.object({
|
|
147
135
|
type: l.literal('object'),
|
|
148
136
|
properties: l.dict(
|
|
149
|
-
|
|
137
|
+
l.string(),
|
|
150
138
|
l.discriminatedUnion('type', [
|
|
151
139
|
...ARRAY_ITEMS_SCHEMAS,
|
|
152
140
|
lexiconArraySchema,
|
|
153
141
|
]),
|
|
154
142
|
),
|
|
155
|
-
required:
|
|
156
|
-
nullable:
|
|
157
|
-
description:
|
|
143
|
+
required: l.optional(l.array(l.string())),
|
|
144
|
+
nullable: l.optional(l.array(l.string())),
|
|
145
|
+
description: l.optional(l.string()),
|
|
158
146
|
}),
|
|
159
147
|
requirePropertiesRefinement,
|
|
160
148
|
)
|
|
@@ -172,7 +160,7 @@ export type LexiconRecordKey = l.LexiconRecordKey
|
|
|
172
160
|
export const lexiconRecordSchema = l.object({
|
|
173
161
|
type: l.literal('record'),
|
|
174
162
|
record: lexiconObjectSchema,
|
|
175
|
-
description:
|
|
163
|
+
description: l.optional(l.string()),
|
|
176
164
|
key: lexiconRecordKeySchema,
|
|
177
165
|
})
|
|
178
166
|
export type LexiconRecord = l.Infer<typeof lexiconRecordSchema>
|
|
@@ -183,7 +171,7 @@ export const lexiconParameters = l.refine(
|
|
|
183
171
|
l.object({
|
|
184
172
|
type: l.literal('params'),
|
|
185
173
|
properties: l.dict(
|
|
186
|
-
|
|
174
|
+
l.string(),
|
|
187
175
|
l.discriminatedUnion('type', [
|
|
188
176
|
lexiconBooleanSchema,
|
|
189
177
|
lexiconIntegerSchema,
|
|
@@ -195,21 +183,21 @@ export const lexiconParameters = l.refine(
|
|
|
195
183
|
lexiconIntegerSchema,
|
|
196
184
|
lexiconStringSchema,
|
|
197
185
|
]),
|
|
198
|
-
minLength:
|
|
199
|
-
maxLength:
|
|
200
|
-
description:
|
|
186
|
+
minLength: l.optional(l.integer()),
|
|
187
|
+
maxLength: l.optional(l.integer()),
|
|
188
|
+
description: l.optional(l.string()),
|
|
201
189
|
}),
|
|
202
190
|
]),
|
|
203
191
|
),
|
|
204
|
-
required:
|
|
205
|
-
description:
|
|
192
|
+
required: l.optional(l.array(l.string())),
|
|
193
|
+
description: l.optional(l.string()),
|
|
206
194
|
}),
|
|
207
195
|
requirePropertiesRefinement,
|
|
208
196
|
)
|
|
209
197
|
export type LexiconParameters = l.Infer<typeof lexiconParameters>
|
|
210
198
|
|
|
211
199
|
export const lexiconPayload = l.object({
|
|
212
|
-
encoding:
|
|
200
|
+
encoding: l.string(),
|
|
213
201
|
schema: l.optional(
|
|
214
202
|
l.discriminatedUnion('type', [
|
|
215
203
|
lexiconRefSchema,
|
|
@@ -217,13 +205,13 @@ export const lexiconPayload = l.object({
|
|
|
217
205
|
lexiconObjectSchema,
|
|
218
206
|
]),
|
|
219
207
|
),
|
|
220
|
-
description:
|
|
208
|
+
description: l.optional(l.string()),
|
|
221
209
|
})
|
|
222
210
|
export type LexiconPayload = l.Infer<typeof lexiconPayload>
|
|
223
211
|
|
|
224
212
|
export const lexiconError = l.object({
|
|
225
213
|
name: l.string({ minLength: 1 }),
|
|
226
|
-
description:
|
|
214
|
+
description: l.optional(l.string()),
|
|
227
215
|
})
|
|
228
216
|
export type LexiconError = l.Infer<typeof lexiconError>
|
|
229
217
|
|
|
@@ -232,7 +220,7 @@ export const lexiconQuerySchema = l.object({
|
|
|
232
220
|
parameters: l.optional(lexiconParameters),
|
|
233
221
|
output: l.optional(lexiconPayload),
|
|
234
222
|
errors: l.optional(l.array(lexiconError)),
|
|
235
|
-
description:
|
|
223
|
+
description: l.optional(l.string()),
|
|
236
224
|
})
|
|
237
225
|
export type LexiconQuery = l.Infer<typeof lexiconQuerySchema>
|
|
238
226
|
|
|
@@ -242,16 +230,16 @@ export const lexiconProcedureSchema = l.object({
|
|
|
242
230
|
input: l.optional(lexiconPayload),
|
|
243
231
|
output: l.optional(lexiconPayload),
|
|
244
232
|
errors: l.optional(l.array(lexiconError)),
|
|
245
|
-
description:
|
|
233
|
+
description: l.optional(l.string()),
|
|
246
234
|
})
|
|
247
235
|
export type LexiconProcedure = l.Infer<typeof lexiconProcedureSchema>
|
|
248
236
|
|
|
249
237
|
export const lexiconSubscriptionSchema = l.object({
|
|
250
238
|
type: l.literal('subscription'),
|
|
251
|
-
description:
|
|
239
|
+
description: l.optional(l.string()),
|
|
252
240
|
parameters: l.optional(lexiconParameters),
|
|
253
241
|
message: l.object({
|
|
254
|
-
description:
|
|
242
|
+
description: l.optional(l.string()),
|
|
255
243
|
schema: lexiconRefUnionSchema,
|
|
256
244
|
}),
|
|
257
245
|
errors: l.optional(l.array(lexiconError)),
|
|
@@ -265,7 +253,7 @@ const lexiconLanguageSchema = l.string({ format: 'language' })
|
|
|
265
253
|
|
|
266
254
|
export type LexiconLanguage = l.Infer<typeof lexiconLanguageSchema>
|
|
267
255
|
|
|
268
|
-
const lexiconLanguageDict = l.dict(lexiconLanguageSchema,
|
|
256
|
+
const lexiconLanguageDict = l.dict(lexiconLanguageSchema, l.string())
|
|
269
257
|
|
|
270
258
|
export type LexiconLanguageDict = l.Infer<typeof lexiconLanguageDict>
|
|
271
259
|
|
|
@@ -274,7 +262,7 @@ const lexiconPermissionSchema = l.intersection(
|
|
|
274
262
|
type: l.literal('permission'),
|
|
275
263
|
resource: l.string({ minLength: 1 }),
|
|
276
264
|
}),
|
|
277
|
-
l.
|
|
265
|
+
l.dict(l.string(), l.paramSchema),
|
|
278
266
|
)
|
|
279
267
|
|
|
280
268
|
export type LexiconPermission = l.Infer<typeof lexiconPermissionSchema>
|
|
@@ -282,11 +270,11 @@ export type LexiconPermission = l.Infer<typeof lexiconPermissionSchema>
|
|
|
282
270
|
const lexiconPermissionSetSchema = l.object({
|
|
283
271
|
type: l.literal('permission-set'),
|
|
284
272
|
permissions: l.array(lexiconPermissionSchema),
|
|
285
|
-
title:
|
|
273
|
+
title: l.optional(l.string()),
|
|
286
274
|
'title:lang': l.optional(lexiconLanguageDict),
|
|
287
|
-
detail:
|
|
275
|
+
detail: l.optional(l.string()),
|
|
288
276
|
'detail:lang': l.optional(lexiconLanguageDict),
|
|
289
|
-
description:
|
|
277
|
+
description: l.optional(l.string()),
|
|
290
278
|
})
|
|
291
279
|
|
|
292
280
|
export type LexiconPermissionSet = l.Infer<typeof lexiconPermissionSetSchema>
|
|
@@ -323,8 +311,8 @@ export type LexiconIdentifier = l.Infer<typeof lexiconIdentifierSchema>
|
|
|
323
311
|
export const lexiconDocumentSchema = l.object({
|
|
324
312
|
lexicon: l.literal(1),
|
|
325
313
|
id: lexiconIdentifierSchema,
|
|
326
|
-
revision:
|
|
327
|
-
description:
|
|
314
|
+
revision: l.optional(l.integer()),
|
|
315
|
+
description: l.optional(l.string()),
|
|
328
316
|
defs: l.intersection(
|
|
329
317
|
l.object({
|
|
330
318
|
main: l.optional(l.discriminatedUnion('type', MAIN_LEXICON_SCHEMAS)),
|
|
@@ -173,7 +173,7 @@ describe('LexiconSchemaBuilder', () => {
|
|
|
173
173
|
})
|
|
174
174
|
})
|
|
175
175
|
|
|
176
|
-
it('does not apply defaults when
|
|
176
|
+
it('does not apply defaults when validating', () => {
|
|
177
177
|
const schema = getSchema(
|
|
178
178
|
'com.example.kitchenSink#object',
|
|
179
179
|
l.TypedObjectSchema,
|
|
@@ -187,7 +187,7 @@ describe('LexiconSchemaBuilder', () => {
|
|
|
187
187
|
string: 'string',
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
expect(schema.
|
|
190
|
+
expect(schema.safeValidate(value)).toStrictEqual({
|
|
191
191
|
success: true,
|
|
192
192
|
value: {
|
|
193
193
|
object: { boolean: true },
|
|
@@ -198,13 +198,12 @@ export class LexiconSchemaBuilder {
|
|
|
198
198
|
|
|
199
199
|
const result =
|
|
200
200
|
def.const != null
|
|
201
|
-
? l.literal(def.const
|
|
201
|
+
? l.literal(def.const)
|
|
202
202
|
: def.enum != null
|
|
203
|
-
? l.enum(def.enum
|
|
203
|
+
? l.enum(def.enum)
|
|
204
204
|
: schema
|
|
205
205
|
|
|
206
|
-
|
|
207
|
-
return result
|
|
206
|
+
return def.default != null ? l.withDefault(result, def.default) : result
|
|
208
207
|
}
|
|
209
208
|
case 'integer': {
|
|
210
209
|
const schema = l.integer(def)
|
|
@@ -214,25 +213,22 @@ export class LexiconSchemaBuilder {
|
|
|
214
213
|
|
|
215
214
|
const result =
|
|
216
215
|
def.const != null
|
|
217
|
-
? l.literal(def.const
|
|
216
|
+
? l.literal(def.const)
|
|
218
217
|
: def.enum != null
|
|
219
|
-
? l.enum(def.enum
|
|
218
|
+
? l.enum(def.enum)
|
|
220
219
|
: schema
|
|
221
220
|
|
|
222
|
-
|
|
223
|
-
return result
|
|
221
|
+
return def.default != null ? l.withDefault(result, def.default) : result
|
|
224
222
|
}
|
|
225
223
|
case 'boolean': {
|
|
226
|
-
const result =
|
|
227
|
-
def.const != null ? l.literal(def.const, def) : l.boolean(def)
|
|
224
|
+
const result = def.const != null ? l.literal(def.const) : l.boolean()
|
|
228
225
|
|
|
229
|
-
|
|
230
|
-
return result
|
|
226
|
+
return def.default != null ? l.withDefault(result, def.default) : result
|
|
231
227
|
}
|
|
232
228
|
case 'blob':
|
|
233
229
|
return l.blob(def)
|
|
234
230
|
case 'cid-link':
|
|
235
|
-
return l.
|
|
231
|
+
return l.cid()
|
|
236
232
|
case 'bytes':
|
|
237
233
|
return l.bytes(def)
|
|
238
234
|
case 'unknown':
|
|
@@ -322,21 +318,18 @@ export class LexiconSchemaBuilder {
|
|
|
322
318
|
protected compileParams(doc: LexiconDocument, def?: LexiconParameters) {
|
|
323
319
|
if (!def) return l.params()
|
|
324
320
|
|
|
325
|
-
const
|
|
326
|
-
for (const [
|
|
327
|
-
if (
|
|
328
|
-
|
|
329
|
-
const isRequired = def.required?.includes(key)
|
|
321
|
+
const shape: l.ParamsSchemaShape = {}
|
|
322
|
+
for (const [paramName, paramDef] of Object.entries(def.properties)) {
|
|
323
|
+
if (paramDef === undefined) continue
|
|
330
324
|
|
|
331
|
-
|
|
325
|
+
const isRequired = def.required?.includes(paramName)
|
|
332
326
|
|
|
333
|
-
|
|
334
|
-
schema = l.optional(schema)
|
|
335
|
-
}
|
|
327
|
+
const propSchema = this.compileLeaf(doc, paramDef) as l.Validator<l.Param>
|
|
336
328
|
|
|
337
|
-
|
|
329
|
+
shape[paramName] = isRequired ? propSchema : l.optional(propSchema)
|
|
338
330
|
}
|
|
339
|
-
|
|
331
|
+
|
|
332
|
+
return l.params(shape)
|
|
340
333
|
}
|
|
341
334
|
}
|
|
342
335
|
|