@atproto/lex-schema 0.0.1 → 0.0.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.
@@ -2,6 +2,6 @@ import { ValidationResult, Validator, ValidatorContext } from '../validation.js'
2
2
  export declare class LiteralSchema<Output extends null | string | number | boolean = any> extends Validator<Output> {
3
3
  readonly value: Output;
4
4
  constructor(value: Output);
5
- validateInContext(input: unknown, ctx: ValidatorContext): ValidationResult<Output>;
5
+ validateInContext(input: unknown | undefined, ctx: ValidatorContext): ValidationResult<Output>;
6
6
  }
7
7
  //# sourceMappingURL=literal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/schema/literal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,qBAAa,aAAa,CACxB,MAAM,SAAS,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,GAAG,CACrD,SAAQ,SAAS,CAAC,MAAM,CAAC;IACb,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;IAIzB,iBAAiB,CACxB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,CAAC;CAO5B"}
1
+ {"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/schema/literal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,qBAAa,aAAa,CACxB,MAAM,SAAS,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,GAAG,CACrD,SAAQ,SAAS,CAAC,MAAM,CAAC;IACb,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;IAIzB,iBAAiB,CACxB,KAAK,EAAE,OAAO,YAAa,EAC3B,GAAG,EAAE,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,CAAC;CAO5B"}
@@ -8,7 +8,7 @@ class LiteralSchema extends validation_js_1.Validator {
8
8
  super();
9
9
  this.value = value;
10
10
  }
11
- validateInContext(input, ctx) {
11
+ validateInContext(input = this.value, ctx) {
12
12
  if (input !== this.value) {
13
13
  return ctx.issueInvalidValue(input, [this.value]);
14
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"literal.js","sourceRoot":"","sources":["../../src/schema/literal.ts"],"names":[],"mappings":";;;AAAA,oDAAgF;AAEhF,MAAa,aAEX,SAAQ,yBAAiB;IACJ;IAArB,YAAqB,KAAa;QAChC,KAAK,EAAE,CAAA;QADY,UAAK,GAAL,KAAK,CAAQ;IAElC,CAAC;IAEQ,iBAAiB,CACxB,KAAc,EACd,GAAqB;QAErB,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACnD,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;CACF;AAjBD,sCAiBC","sourcesContent":["import { ValidationResult, Validator, ValidatorContext } from '../validation.js'\n\nexport class LiteralSchema<\n Output extends null | string | number | boolean = any,\n> extends Validator<Output> {\n constructor(readonly value: Output) {\n super()\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<Output> {\n if (input !== this.value) {\n return ctx.issueInvalidValue(input, [this.value])\n }\n\n return ctx.success(this.value)\n }\n}\n"]}
1
+ {"version":3,"file":"literal.js","sourceRoot":"","sources":["../../src/schema/literal.ts"],"names":[],"mappings":";;;AAAA,oDAAgF;AAEhF,MAAa,aAEX,SAAQ,yBAAiB;IACJ;IAArB,YAAqB,KAAa;QAChC,KAAK,EAAE,CAAA;QADY,UAAK,GAAL,KAAK,CAAQ;IAElC,CAAC;IAEQ,iBAAiB,CACxB,QAAiB,IAAI,CAAC,KAAK,EAC3B,GAAqB;QAErB,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACnD,CAAC;QAED,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;CACF;AAjBD,sCAiBC","sourcesContent":["import { ValidationResult, Validator, ValidatorContext } from '../validation.js'\n\nexport class LiteralSchema<\n Output extends null | string | number | boolean = any,\n> extends Validator<Output> {\n constructor(readonly value: Output) {\n super()\n }\n\n override validateInContext(\n input: unknown = this.value,\n ctx: ValidatorContext,\n ): ValidationResult<Output> {\n if (input !== this.value) {\n return ctx.issueInvalidValue(input, [this.value])\n }\n\n return ctx.success(this.value)\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/schema/object.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/schema/object.ts"],"names":[],"mappings":"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"}
@@ -47,20 +47,13 @@ class ObjectSchema extends validation_js_1.Validator {
47
47
  }
48
48
  return result;
49
49
  }
50
- else if (result.value === undefined) {
51
- // Special case for validators that output "undefined" values (typically
52
- // UnknownSchema) since they cannot differentiate between "missing key"
53
- // and "key with undefined value"
54
- if (!(key in input)) {
55
- // Input was missing the key (was "undefined")
56
- if (this.options.required?.includes(key)) {
57
- return ctx.issueRequiredKey(input, key);
58
- }
59
- // Ignore missing non-required key
60
- continue;
50
+ // Skip copying if key is not present in input (and value is undefined)
51
+ if (result.value === undefined && !(key in input)) {
52
+ // Except if the key is required
53
+ if (this.options.required?.includes(key)) {
54
+ return ctx.issueRequiredKey(input, key);
61
55
  }
62
- // if "key" existed in input (would typically be "undefined"), we keep
63
- // it as-is by continuing processing as if it was any other value.
56
+ continue;
64
57
  }
65
58
  if (result.value !== input[key]) {
66
59
  copy ??= { ...input };
@@ -1 +1 @@
1
- {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/schema/object.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport { Simplify } from '../core.js'\nimport {\n Infer,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { DictSchema } from './dict.js'\n\nexport type ObjectSchemaProperties = { [_ in string]: Validator<any> }\nexport type ObjectSchemaOptions = {\n required?: readonly string[]\n nullable?: readonly string[]\n unknownProperties?: 'strict' | DictSchema\n}\n\nexport type ObjectSchemaNullValue<\n O extends ObjectSchemaOptions,\n K extends string,\n> = O extends { nullable: readonly (infer N extends string)[] }\n ? K extends N\n ? null\n : never\n : never\n\nexport type ObjectSchemaPropertiesOutput<\n P extends ObjectSchemaProperties,\n O extends ObjectSchemaOptions,\n> = O extends { required: readonly (infer R extends string)[] }\n ? {\n -readonly [K in string & keyof P & R]-?:\n | Infer<P[K]>\n | ObjectSchemaNullValue<O, K>\n } & {\n -readonly [K in Exclude<string & keyof P, R>]?:\n | Infer<P[K]>\n | ObjectSchemaNullValue<O, K>\n }\n : {\n -readonly [K in string & keyof P]?:\n | Infer<P[K]>\n | ObjectSchemaNullValue<O, K>\n }\n\n/**\n * Allows to more accurately represent the intersection of two object types\n * where both types may share some keys, and one of them uses an index\n * signature.\n *\n * @see {@link https://www.typescriptlang.org/play/?#code/C4TwDgpgBAglC8UDeUBmB7dAuKByARgIYBOuUAvlAGTJQDaA+lAJYB2UAzsMWwOYC6OVgFcAtvgjEKAKGkATCAGMANiWiL0rLlEI4YsjVuBQA1hBA4uPVrwRQARBnT2Dm7QDdCy4dESE6ZiD8UAD0IVAi4pJQABQcABbowspyUBIORMT2AJSyEAAeYOjExqCQUACSrMCSHErAzJoAPNJQsFAFNaxyHFAASkrFck1WfAA0UMKsJqzoAO6sAHxjrVAAQh35XT39g8TDozYTUzPzSyuLdqtwVKttMYHoqO00j88bnRDdvawQ7pJ3NpQAD860BbRwSHBQLadAA0ix2G91oJ1vDggAfWABcxPF5QOH8aFtci5aRlaAwVDMfIQVKIKo1Yh1RQNZq0Jw4AgkMjkCYoRiIzjcPioyISKTkRayBQqNRQQzaQgAMRpdL01NpclcRignm8EFVWrsKrVchxQVC4XF0SxmSAA Playground link}\n */\ntype Intersect<\n A extends Record<string, unknown>,\n B extends Record<string, unknown>,\n> = B[keyof B] extends never\n ? A\n : keyof A & keyof B extends never\n ? // If A and B don't overlap, just return A & B\n A & B\n : // Otherwise, properly represent the fact that accessing using an\n // index signature could return a value from either A or B\n A & { [K in keyof B]: B[K] | A[keyof A & K] }\n\nexport type ObjectSchemaOutput<\n P extends ObjectSchemaProperties,\n O extends ObjectSchemaOptions,\n> = O extends {\n unknownProperties: Validator<infer D extends Record<string, unknown>>\n}\n ? Simplify<Intersect<ObjectSchemaPropertiesOutput<P, O>, D>>\n : Simplify<ObjectSchemaPropertiesOutput<P, O>>\n\nexport class ObjectSchema<\n const Validators extends ObjectSchemaProperties = any,\n const Options extends ObjectSchemaOptions = any,\n const Output extends ObjectSchemaOutput<\n Validators,\n Options\n > = ObjectSchemaOutput<Validators, Options>,\n> extends Validator<Output> {\n constructor(\n readonly validators: Validators,\n readonly options: Options,\n ) {\n super()\n }\n\n get validatorsMap(): Map<string, Validator> {\n const map = new Map(Object.entries(this.validators))\n\n // Cache the map on the instance (to avoid re-creating it)\n Object.defineProperty(this, 'validatorsMap', {\n value: map,\n writable: false,\n enumerable: false,\n configurable: true,\n })\n\n return map\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<Output> {\n if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, ['object'])\n }\n\n // Lazily copy value\n let copy: undefined | Record<string, unknown>\n\n for (const [key, propDef] of this.validatorsMap) {\n if (input[key] === null && this.options.nullable?.includes(key)) {\n continue\n }\n\n const result = ctx.validateChild(input, key, propDef)\n if (!result.success) {\n // Because default values are provided by child validators, we need to\n // run the validator to get the default value and, in case of failure,\n // ignore validation error that were caused by missing keys.\n if (!(key in input)) {\n if (this.options.required?.includes(key)) {\n // Transform into \"required key\" issue\n return ctx.issueRequiredKey(input, key)\n }\n\n // Ignore missing non-required key\n continue\n }\n\n return result\n } else if (result.value === undefined) {\n // Special case for validators that output \"undefined\" values (typically\n // UnknownSchema) since they cannot differentiate between \"missing key\"\n // and \"key with undefined value\"\n\n if (!(key in input)) {\n // Input was missing the key (was \"undefined\")\n if (this.options.required?.includes(key)) {\n return ctx.issueRequiredKey(input, key)\n }\n\n // Ignore missing non-required key\n continue\n }\n\n // if \"key\" existed in input (would typically be \"undefined\"), we keep\n // it as-is by continuing processing as if it was any other value.\n }\n\n if (result.value !== input[key]) {\n copy ??= { ...input }\n copy[key] = result.value\n }\n }\n\n if (this.options.unknownProperties === 'strict') {\n for (const key of Object.keys(input)) {\n if (!this.validatorsMap.has(key)) {\n return ctx.issueInvalidPropertyType(input, key, 'undefined')\n }\n }\n } else if (this.options.unknownProperties) {\n const result = this.options.unknownProperties.validateInContext(\n copy ?? input,\n ctx,\n { ignoredKeys: this.validatorsMap },\n )\n if (!result.success) return result\n if (result.value !== input) copy = result.value\n }\n\n const output = (copy ?? input) as Output\n\n return ctx.success(output)\n }\n}\n"]}
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/schema/object.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPlainObject } from '@atproto/lex-data'\nimport { Simplify } from '../core.js'\nimport {\n Infer,\n ValidationResult,\n Validator,\n ValidatorContext,\n} from '../validation.js'\nimport { DictSchema } from './dict.js'\n\nexport type ObjectSchemaProperties = { [_ in string]: Validator<any> }\nexport type ObjectSchemaOptions = {\n required?: readonly string[]\n nullable?: readonly string[]\n unknownProperties?: 'strict' | DictSchema\n}\n\nexport type ObjectSchemaNullValue<\n O extends ObjectSchemaOptions,\n K extends string,\n> = O extends { nullable: readonly (infer N extends string)[] }\n ? K extends N\n ? null\n : never\n : never\n\nexport type ObjectSchemaPropertiesOutput<\n P extends ObjectSchemaProperties,\n O extends ObjectSchemaOptions,\n> = O extends { required: readonly (infer R extends string)[] }\n ? {\n -readonly [K in string & keyof P & R]-?:\n | Infer<P[K]>\n | ObjectSchemaNullValue<O, K>\n } & {\n -readonly [K in Exclude<string & keyof P, R>]?:\n | Infer<P[K]>\n | ObjectSchemaNullValue<O, K>\n }\n : {\n -readonly [K in string & keyof P]?:\n | Infer<P[K]>\n | ObjectSchemaNullValue<O, K>\n }\n\n/**\n * Allows to more accurately represent the intersection of two object types\n * where both types may share some keys, and one of them uses an index\n * signature.\n *\n * @see {@link https://www.typescriptlang.org/play/?#code/C4TwDgpgBAglC8UDeUBmB7dAuKByARgIYBOuUAvlAGTJQDaA+lAJYB2UAzsMWwOYC6OVgFcAtvgjEKAKGkATCAGMANiWiL0rLlEI4YsjVuBQA1hBA4uPVrwRQARBnT2Dm7QDdCy4dESE6ZiD8UAD0IVAi4pJQABQcABbowspyUBIORMT2AJSyEAAeYOjExqCQUACSrMCSHErAzJoAPNJQsFAFNaxyHFAASkrFck1WfAA0UMKsJqzoAO6sAHxjrVAAQh35XT39g8TDozYTUzPzSyuLdqtwVKttMYHoqO00j88bnRDdvawQ7pJ3NpQAD860BbRwSHBQLadAA0ix2G91oJ1vDggAfWABcxPF5QOH8aFtci5aRlaAwVDMfIQVKIKo1Yh1RQNZq0Jw4AgkMjkCYoRiIzjcPioyISKTkRayBQqNRQQzaQgAMRpdL01NpclcRignm8EFVWrsKrVchxQVC4XF0SxmSAA Playground link}\n */\ntype Intersect<\n A extends Record<string, unknown>,\n B extends Record<string, unknown>,\n> = B[keyof B] extends never\n ? A\n : keyof A & keyof B extends never\n ? // If A and B don't overlap, just return A & B\n A & B\n : // Otherwise, properly represent the fact that accessing using an\n // index signature could return a value from either A or B\n A & { [K in keyof B]: B[K] | A[keyof A & K] }\n\nexport type ObjectSchemaOutput<\n P extends ObjectSchemaProperties,\n O extends ObjectSchemaOptions,\n> = O extends {\n unknownProperties: Validator<infer D extends Record<string, unknown>>\n}\n ? Simplify<Intersect<ObjectSchemaPropertiesOutput<P, O>, D>>\n : Simplify<ObjectSchemaPropertiesOutput<P, O>>\n\nexport class ObjectSchema<\n const Validators extends ObjectSchemaProperties = any,\n const Options extends ObjectSchemaOptions = any,\n const Output extends ObjectSchemaOutput<\n Validators,\n Options\n > = ObjectSchemaOutput<Validators, Options>,\n> extends Validator<Output> {\n constructor(\n readonly validators: Validators,\n readonly options: Options,\n ) {\n super()\n }\n\n get validatorsMap(): Map<string, Validator> {\n const map = new Map(Object.entries(this.validators))\n\n // Cache the map on the instance (to avoid re-creating it)\n Object.defineProperty(this, 'validatorsMap', {\n value: map,\n writable: false,\n enumerable: false,\n configurable: true,\n })\n\n return map\n }\n\n override validateInContext(\n input: unknown,\n ctx: ValidatorContext,\n ): ValidationResult<Output> {\n if (!isPlainObject(input)) {\n return ctx.issueInvalidType(input, ['object'])\n }\n\n // Lazily copy value\n let copy: undefined | Record<string, unknown>\n\n for (const [key, propDef] of this.validatorsMap) {\n if (input[key] === null && this.options.nullable?.includes(key)) {\n continue\n }\n\n const result = ctx.validateChild(input, key, propDef)\n if (!result.success) {\n // Because default values are provided by child validators, we need to\n // run the validator to get the default value and, in case of failure,\n // ignore validation error that were caused by missing keys.\n if (!(key in input)) {\n if (this.options.required?.includes(key)) {\n // Transform into \"required key\" issue\n return ctx.issueRequiredKey(input, key)\n }\n\n // Ignore missing non-required key\n continue\n }\n\n return result\n }\n\n // Skip copying if key is not present in input (and value is undefined)\n if (result.value === undefined && !(key in input)) {\n // Except if the key is required\n if (this.options.required?.includes(key)) {\n return ctx.issueRequiredKey(input, key)\n }\n\n continue\n }\n\n if (result.value !== input[key]) {\n copy ??= { ...input }\n copy[key] = result.value\n }\n }\n\n if (this.options.unknownProperties === 'strict') {\n for (const key of Object.keys(input)) {\n if (!this.validatorsMap.has(key)) {\n return ctx.issueInvalidPropertyType(input, key, 'undefined')\n }\n }\n } else if (this.options.unknownProperties) {\n const result = this.options.unknownProperties.validateInContext(\n copy ?? input,\n ctx,\n { ignoredKeys: this.validatorsMap },\n )\n if (!result.success) return result\n if (result.value !== input) copy = result.value\n }\n\n const output = (copy ?? input) as Output\n\n return ctx.success(output)\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/lex-schema",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "license": "MIT",
5
5
  "description": "Lexicon schema system for AT Lexicons",
6
6
  "keywords": [
@@ -8,7 +8,7 @@ export class LiteralSchema<
8
8
  }
9
9
 
10
10
  override validateInContext(
11
- input: unknown,
11
+ input: unknown = this.value,
12
12
  ctx: ValidatorContext,
13
13
  ): ValidationResult<Output> {
14
14
  if (input !== this.value) {
@@ -132,23 +132,16 @@ export class ObjectSchema<
132
132
  }
133
133
 
134
134
  return result
135
- } else if (result.value === undefined) {
136
- // Special case for validators that output "undefined" values (typically
137
- // UnknownSchema) since they cannot differentiate between "missing key"
138
- // and "key with undefined value"
139
-
140
- if (!(key in input)) {
141
- // Input was missing the key (was "undefined")
142
- if (this.options.required?.includes(key)) {
143
- return ctx.issueRequiredKey(input, key)
144
- }
135
+ }
145
136
 
146
- // Ignore missing non-required key
147
- continue
137
+ // Skip copying if key is not present in input (and value is undefined)
138
+ if (result.value === undefined && !(key in input)) {
139
+ // Except if the key is required
140
+ if (this.options.required?.includes(key)) {
141
+ return ctx.issueRequiredKey(input, key)
148
142
  }
149
143
 
150
- // if "key" existed in input (would typically be "undefined"), we keep
151
- // it as-is by continuing processing as if it was any other value.
144
+ continue
152
145
  }
153
146
 
154
147
  if (result.value !== input[key]) {