@jfdevelops/create-error 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,6 +11,9 @@ const protectedPropertyNames = new Set([
11
11
  function isObjectLike(value) {
12
12
  return value !== null && (typeof value === "object" || typeof value === "function");
13
13
  }
14
+ function isPromiseLike(value) {
15
+ return isObjectLike(value) && typeof Reflect.get(value, "then") === "function";
16
+ }
14
17
  function isPlainObject(value) {
15
18
  if (!isObjectLike(value)) return false;
16
19
  const prototype = Object.getPrototypeOf(value);
@@ -28,8 +31,17 @@ function validateStandardSchema(schema, subject) {
28
31
  const standard = Reflect.get(schema, "~standard");
29
32
  if (!isObjectLike(standard) || Reflect.get(standard, "version") !== 1 || typeof Reflect.get(standard, "vendor") !== "string" || typeof Reflect.get(standard, "validate") !== "function") throw new TypeError(`${subject} must implement Standard Schema V1`);
30
33
  }
34
+ function validateCallback(value, subject, optional = false) {
35
+ if (optional && value === void 0) return;
36
+ if (typeof value !== "function") throw new TypeError(`${subject} must be a function`);
37
+ }
31
38
  function validateBlueprint(config) {
32
39
  validateStandardSchema(config.definition, "definition");
40
+ if (!isObjectLike(config.data)) throw new TypeError("data must be an object");
41
+ validateCallback(config.data.resolve, "data.resolve");
42
+ validateCallback(config.message, "message");
43
+ validateCallback(config.properties, "properties", true);
44
+ validateCallback(config.toJSON, "toJSON", true);
33
45
  if (typeof config.data.property !== "string" || config.data.property.length === 0) throw new TypeError("data.property must be a non-empty string");
34
46
  if (protectedPropertyNames.has(config.data.property)) throw new TypeError(`data.property cannot overwrite protected property "${config.data.property}"`);
35
47
  }
@@ -39,7 +51,7 @@ function formatIssuePath(path) {
39
51
  }
40
52
  function parseSchema(schema, input, subject) {
41
53
  const result = schema["~standard"].validate(input);
42
- if (result instanceof Promise) throw new TypeError(`${subject} schema validation must be synchronous`);
54
+ if (isPromiseLike(result)) throw new TypeError(`${subject} schema validation must be synchronous`);
43
55
  if (result.issues) {
44
56
  const details = result.issues.map((issue) => `${formatIssuePath(issue.path)}${issue.message}`).join("; ");
45
57
  throw new TypeError(`Invalid error ${subject}: ${details}`);
@@ -60,13 +72,36 @@ function assignProperties(error, properties, dataProperty, data) {
60
72
  Object.defineProperty(error, key, descriptor);
61
73
  }
62
74
  }
75
+ function throwUnless(ErrorClass, condition, input, options) {
76
+ if (condition) return;
77
+ throw new ErrorClass(typeof input === "function" ? input() : input, options);
78
+ }
79
+ /**
80
+ * Throws `ErrorClass` when `condition` is falsy.
81
+ *
82
+ * Works like the static `ErrorClass.invariant`, but can also be used with
83
+ * classes stored in a `const`, where TypeScript does not allow assertion
84
+ * methods. A function can be supplied as `input` to avoid constructing error
85
+ * data unless the invariant fails.
86
+ *
87
+ * @example
88
+ * ```ts
89
+ * const MissingUserError = createRequestError({ code: 'missingUser' })
90
+ * .implement(({ code }) => `${code}: user was not found`);
91
+ *
92
+ * invariant(MissingUserError, user, () => ({ userId }));
93
+ *
94
+ * user.id; // narrowed to the truthy branch
95
+ * ```
96
+ */
97
+ function invariant(ErrorClass, condition, input, options) {
98
+ throwUnless(ErrorClass, condition, input, options);
99
+ }
63
100
  function createError(config) {
64
101
  validateBlueprint(config);
65
102
  class FamilyError extends Error {
66
103
  static invariant(condition, input, options) {
67
- if (condition) return;
68
- const resolvedInput = typeof input === "function" ? input() : input;
69
- throw new this(resolvedInput, options);
104
+ throwUnless(this, condition, input, options);
70
105
  }
71
106
  constructor(message, options) {
72
107
  super(message, options);
@@ -83,9 +118,12 @@ function createError(config) {
83
118
  });
84
119
  function createDefinition(definition) {
85
120
  const parsedDefinition = parseDefinition(config.definition, definition);
86
- function createImplementation(implementation, contextSchema) {
87
- return class extends FamilyError {
88
- constructor(input, options) {
121
+ function createImplementation(implementation, options, contextSchema) {
122
+ validateCallback(implementation, "implementation");
123
+ const name = options?.name;
124
+ if (name !== void 0 && (typeof name !== "string" || name.length === 0)) throw new TypeError("name must be a non-empty string");
125
+ const ImplementedError = class extends FamilyError {
126
+ constructor(input, options$1) {
89
127
  const resolvedData = config.data.resolve({
90
128
  definition: parsedDefinition,
91
129
  input
@@ -97,7 +135,7 @@ function createError(config) {
97
135
  definition: parsedDefinition,
98
136
  implementation: implementationWithDefinition
99
137
  });
100
- super(message, options);
138
+ super(message, options$1);
101
139
  Object.defineProperty(this, config.data.property, {
102
140
  configurable: true,
103
141
  enumerable: true,
@@ -112,14 +150,19 @@ function createError(config) {
112
150
  if (properties) assignProperties(this, properties, config.data.property, data);
113
151
  }
114
152
  };
153
+ Object.defineProperty(ImplementedError, "name", {
154
+ configurable: true,
155
+ value: name ?? ""
156
+ });
157
+ return ImplementedError;
115
158
  }
116
- function implement(implementation) {
117
- return createImplementation(implementation);
159
+ function implement(implementation, options) {
160
+ return createImplementation(implementation, options);
118
161
  }
119
162
  function defineContext(contextSchema) {
120
163
  validateStandardSchema(contextSchema, "context");
121
- return { implement(implementation) {
122
- return createImplementation(implementation, contextSchema);
164
+ return { implement(implementation, options) {
165
+ return createImplementation(implementation, options, contextSchema);
123
166
  } };
124
167
  }
125
168
  return {
@@ -127,9 +170,13 @@ function createError(config) {
127
170
  implement
128
171
  };
129
172
  }
130
- return Object.assign(createDefinition, { Error: FamilyError });
173
+ return Object.assign(createDefinition, {
174
+ Error: FamilyError,
175
+ is: (value) => value instanceof FamilyError
176
+ });
131
177
  }
132
178
 
133
179
  //#endregion
134
180
  exports.createError = createError;
181
+ exports.invariant = invariant;
135
182
  //# sourceMappingURL=create-error.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-error.cjs","names":["implementationWithDefinition: RuntimeImplementation"],"sources":["../src/create-error.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\r\n\r\nimport type {\r\n BlueprintContext,\r\n BlueprintErrorTemplate,\r\n CreateErrorConfig,\r\n ErrorFamilyFactory,\r\n} from './types.js';\r\n\r\ntype RuntimeImplementation = (argument: unknown) => string;\r\n\r\ntype ErrorConfigBody<\r\n Schema extends StandardSchemaV1,\r\n DataConfig extends CreateErrorConfig<Schema>['data'],\r\n MessageCallback extends CreateErrorConfig<Schema>['message'],\r\n> = {\r\n data: DataConfig;\r\n message: MessageCallback;\r\n};\r\n\r\ntype ErrorConfigWithProperties<\r\n Schema extends StandardSchemaV1,\r\n DataConfig extends CreateErrorConfig<Schema>['data'],\r\n MessageCallback extends CreateErrorConfig<Schema>['message'],\r\n Properties extends object,\r\n> = ErrorConfigBody<Schema, DataConfig, MessageCallback> & {\r\n properties(context: BlueprintContext<Schema>): Properties;\r\n};\r\n\r\ntype ErrorConfigWithoutProperties<\r\n Schema extends StandardSchemaV1,\r\n DataConfig extends CreateErrorConfig<Schema>['data'],\r\n MessageCallback extends CreateErrorConfig<Schema>['message'],\r\n> = ErrorConfigBody<Schema, DataConfig, MessageCallback> & {\r\n properties?: never;\r\n};\r\n\r\ntype ExactCreateErrorConfig<\r\n Schema extends StandardSchemaV1,\r\n Config extends object,\r\n> = {\r\n definition: Schema;\r\n} & Config &\r\n (StandardSchemaV1.InferOutput<Schema> extends object\r\n ? unknown\r\n : { definition: never });\r\n\r\ntype SerializedCreateErrorConfig<\r\n Schema extends StandardSchemaV1,\r\n Config extends object,\r\n Json,\r\n> = ExactCreateErrorConfig<\r\n Schema,\r\n Config & {\r\n toJSON(error: BlueprintErrorTemplate<NoInfer<Config>>): Json;\r\n }\r\n>;\r\n\r\nconst protectedPropertyNames = new Set([\r\n 'name',\r\n 'message',\r\n 'stack',\r\n 'cause',\r\n 'constructor',\r\n 'prototype',\r\n]);\r\n\r\nfunction isObjectLike(value: unknown): value is object {\r\n return (\r\n value !== null && (typeof value === 'object' || typeof value === 'function')\r\n );\r\n}\r\n\r\nfunction isPlainObject(value: unknown): value is Record<PropertyKey, unknown> {\r\n if (!isObjectLike(value)) {\r\n return false;\r\n }\r\n\r\n const prototype = Object.getPrototypeOf(value);\r\n\r\n return prototype === Object.prototype || prototype === null;\r\n}\r\n\r\nfunction includeDefinition(\r\n argument: unknown,\r\n definition: object,\r\n): unknown {\r\n if (!isPlainObject(argument)) {\r\n return argument;\r\n }\r\n\r\n return { ...definition, ...argument };\r\n}\r\n\r\nfunction validateStandardSchema(schema: unknown, subject: string) {\r\n if (!isObjectLike(schema)) {\r\n throw new TypeError(`${subject} must be a Standard Schema object`);\r\n }\r\n\r\n const standard = Reflect.get(schema, '~standard') as unknown;\r\n\r\n if (\r\n !isObjectLike(standard) ||\r\n Reflect.get(standard, 'version') !== 1 ||\r\n typeof Reflect.get(standard, 'vendor') !== 'string' ||\r\n typeof Reflect.get(standard, 'validate') !== 'function'\r\n ) {\r\n throw new TypeError(`${subject} must implement Standard Schema V1`);\r\n }\r\n}\r\n\r\nfunction validateBlueprint(config: CreateErrorConfig<StandardSchemaV1>) {\r\n validateStandardSchema(config.definition, 'definition');\r\n\r\n if (\r\n typeof config.data.property !== 'string' ||\r\n config.data.property.length === 0\r\n ) {\r\n throw new TypeError('data.property must be a non-empty string');\r\n }\r\n\r\n if (protectedPropertyNames.has(config.data.property)) {\r\n throw new TypeError(\r\n `data.property cannot overwrite protected property \"${config.data.property}\"`,\r\n );\r\n }\r\n}\r\n\r\nfunction formatIssuePath(path: StandardSchemaV1.Issue['path']) {\r\n if (!path?.length) {\r\n return '';\r\n }\r\n\r\n const keys = path.map((segment) =>\r\n typeof segment === 'object' ? segment.key : segment,\r\n );\r\n\r\n return `${keys.map(String).join('.')}: `;\r\n}\r\n\r\nfunction parseSchema<Schema extends StandardSchemaV1>(\r\n schema: Schema,\r\n input: StandardSchemaV1.InferInput<Schema>,\r\n subject: string,\r\n) {\r\n const result = schema['~standard'].validate(input);\r\n\r\n if (result instanceof Promise) {\r\n throw new TypeError(`${subject} schema validation must be synchronous`);\r\n }\r\n\r\n if (result.issues) {\r\n const details = result.issues\r\n .map((issue) => `${formatIssuePath(issue.path)}${issue.message}`)\r\n .join('; ');\r\n\r\n throw new TypeError(`Invalid error ${subject}: ${details}`);\r\n }\r\n\r\n return result.value;\r\n}\r\n\r\nfunction parseDefinition<Schema extends StandardSchemaV1>(\r\n schema: Schema,\r\n definition: StandardSchemaV1.InferInput<Schema>,\r\n) {\r\n const parsedDefinition = parseSchema(schema, definition, 'definition');\r\n\r\n if (!isObjectLike(parsedDefinition)) {\r\n throw new TypeError('definition schema must produce an object');\r\n }\r\n\r\n return parsedDefinition;\r\n}\r\n\r\nfunction assignProperties(\r\n error: Error & Record<string, unknown>,\r\n properties: object,\r\n dataProperty: string,\r\n data: unknown,\r\n) {\r\n for (const key of Reflect.ownKeys(properties)) {\r\n if (typeof key === 'string' && protectedPropertyNames.has(key)) {\r\n throw new TypeError(`Cannot overwrite protected error property \"${key}\"`);\r\n }\r\n\r\n const descriptor = Object.getOwnPropertyDescriptor(properties, key);\r\n\r\n if (!descriptor) {\r\n continue;\r\n }\r\n\r\n if (\r\n key === dataProperty &&\r\n (!('value' in descriptor) || descriptor.value !== data)\r\n ) {\r\n throw new TypeError(`Cannot overwrite resolved data property \"${dataProperty}\"`);\r\n }\r\n\r\n Object.defineProperty(error, key, descriptor);\r\n }\r\n}\r\n\r\n/**\r\n * Creates an error family with additional instance properties and typed JSON\r\n * serialization.\r\n *\r\n * @param config Defines the family, its public properties, and its serialized\r\n * representation.\r\n * @returns A callable factory with a shared `.Error` base class.\r\n *\r\n * @example\r\n * ```ts\r\n * const createApiError = createError({\r\n * definition: z.object({ code: z.string() }),\r\n * data: {\r\n * property: 'context',\r\n * resolve: ({ input }) => input,\r\n * },\r\n * message: ({ data, implementation }) => implementation(data),\r\n * properties: ({ definition }) => ({ code: definition.code }),\r\n * toJSON: (error) => ({\r\n * code: error.code,\r\n * context: error.context,\r\n * message: error.message,\r\n * }),\r\n * });\r\n * ```\r\n */\r\nexport function createError<\r\n const Schema extends StandardSchemaV1,\r\n const DataConfig extends CreateErrorConfig<Schema>['data'],\r\n const MessageCallback extends CreateErrorConfig<Schema>['message'],\r\n const Properties extends object,\r\n Json,\r\n>(\r\n config: SerializedCreateErrorConfig<\r\n Schema,\r\n ErrorConfigWithProperties<\r\n Schema,\r\n DataConfig,\r\n MessageCallback,\r\n Properties\r\n >,\r\n Json\r\n >,\r\n): ErrorFamilyFactory<Schema, typeof config>;\r\n\r\n/**\r\n * Creates an error family with typed JSON serialization and no additional\r\n * instance properties.\r\n *\r\n * @param config Defines the family and its serialized representation.\r\n * @returns A callable factory with a shared `.Error` base class.\r\n *\r\n * @example\r\n * ```ts\r\n * const createLogError = createError({\r\n * definition: z.object({ code: z.string() }),\r\n * data: {\r\n * property: 'details',\r\n * resolve: ({ input }) => input,\r\n * },\r\n * message: ({ data, implementation }) => implementation(data),\r\n * toJSON: (error) => ({\r\n * details: error.details,\r\n * message: error.message,\r\n * }),\r\n * });\r\n * ```\r\n */\r\nexport function createError<\r\n const Schema extends StandardSchemaV1,\r\n const DataConfig extends CreateErrorConfig<Schema>['data'],\r\n const MessageCallback extends CreateErrorConfig<Schema>['message'],\r\n Json,\r\n>(\r\n config: SerializedCreateErrorConfig<\r\n Schema,\r\n ErrorConfigWithoutProperties<Schema, DataConfig, MessageCallback>,\r\n Json\r\n >,\r\n): ErrorFamilyFactory<Schema, typeof config>;\r\n\r\n/**\r\n * Creates a configurable family of strongly typed error classes.\r\n *\r\n * Callback execution order is `data.resolve`, optional context validation,\r\n * `message`, then `properties`. Parsed definition output and constructor data\r\n * are inferred without explicit generic arguments or `as const`.\r\n *\r\n * @param config Defines the family's schema, data lifecycle, message, and\r\n * optional public properties.\r\n * @returns A callable factory with a shared `.Error` base class.\r\n *\r\n * @example\r\n * ```ts\r\n * const createRequestError = createError({\r\n * definition: z.object({ code: z.string() }),\r\n * data: {\r\n * property: 'context',\r\n * resolve: ({ input }) => input,\r\n * },\r\n * message: ({ data, implementation }) => implementation(data),\r\n * properties: ({ definition }) => ({ code: definition.code }),\r\n * });\r\n * ```\r\n */\r\nexport function createError<\r\n const Schema extends StandardSchemaV1,\r\n const Config extends Omit<CreateErrorConfig<Schema>, 'definition'>,\r\n>(\r\n config: ExactCreateErrorConfig<Schema, Config>,\r\n): ErrorFamilyFactory<Schema, typeof config>;\r\nexport function createError<\r\n const Schema extends StandardSchemaV1,\r\n const Config extends Omit<CreateErrorConfig<Schema>, 'definition'>,\r\n>(\r\n config: ExactCreateErrorConfig<Schema, Config>,\r\n): ErrorFamilyFactory<Schema, typeof config> {\r\n validateBlueprint(config as CreateErrorConfig<StandardSchemaV1>);\r\n\r\n class FamilyError extends Error {\r\n static invariant<Condition, Input>(\r\n this: new (input: Input, options?: ErrorOptions) => Error,\r\n condition: Condition,\r\n input: Input | (() => Input),\r\n options?: ErrorOptions,\r\n ): asserts condition {\r\n if (condition) {\r\n return;\r\n }\r\n\r\n const resolvedInput =\r\n typeof input === 'function' ? (input as () => Input)() : input;\r\n\r\n throw new this(resolvedInput, options);\r\n }\r\n\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n const name = new.target.name;\r\n if (name) {\r\n this.name = name;\r\n }\r\n }\r\n }\r\n\r\n if (config.toJSON) {\r\n Object.defineProperty(FamilyError.prototype, 'toJSON', {\r\n configurable: true,\r\n value: function toJSON(this: Error & Record<string, unknown>) {\r\n return config.toJSON?.(this as never);\r\n },\r\n writable: true,\r\n });\r\n }\r\n\r\n function createDefinition<\r\n const Definition extends StandardSchemaV1.InferInput<Schema>,\r\n >(definition: Definition) {\r\n const parsedDefinition = parseDefinition(config.definition, definition);\r\n\r\n function createImplementation(\r\n implementation: RuntimeImplementation,\r\n contextSchema?: StandardSchemaV1,\r\n ) {\r\n return class extends FamilyError {\r\n constructor(input: unknown, options?: ErrorOptions) {\r\n const resolvedData = config.data.resolve({\r\n definition: parsedDefinition,\r\n input,\r\n } as never);\r\n const data = contextSchema\r\n ? parseSchema(contextSchema, resolvedData, 'context')\r\n : resolvedData;\r\n const implementationWithDefinition: RuntimeImplementation = (\r\n argument,\r\n ) =>\r\n implementation(\r\n argument === data\r\n ? argument\r\n : includeDefinition(argument, parsedDefinition),\r\n );\r\n const message = config.message({\r\n data,\r\n definition: parsedDefinition,\r\n implementation: implementationWithDefinition,\r\n } as never);\r\n\r\n super(message, options);\r\n\r\n Object.defineProperty(this, config.data.property, {\r\n configurable: true,\r\n enumerable: true,\r\n value: data,\r\n writable: true,\r\n });\r\n\r\n const properties = config.properties?.({\r\n data,\r\n definition: parsedDefinition,\r\n implementation: implementationWithDefinition,\r\n } as never);\r\n\r\n if (properties) {\r\n assignProperties(\r\n this as Error & Record<string, unknown>,\r\n properties,\r\n config.data.property,\r\n data,\r\n );\r\n }\r\n }\r\n };\r\n }\r\n\r\n function implement(implementation: RuntimeImplementation) {\r\n return createImplementation(implementation);\r\n }\r\n\r\n function defineContext<ContextSchema extends StandardSchemaV1>(\r\n contextSchema: ContextSchema,\r\n ) {\r\n validateStandardSchema(contextSchema, 'context');\r\n\r\n return {\r\n implement(implementation: RuntimeImplementation) {\r\n return createImplementation(implementation, contextSchema);\r\n },\r\n };\r\n }\r\n\r\n return {\r\n defineContext,\r\n implement,\r\n };\r\n }\r\n\r\n return Object.assign(createDefinition, {\r\n Error: FamilyError,\r\n }) as unknown as ErrorFamilyFactory<Schema, typeof config>;\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"create-error.cjs","names":["implementationWithDefinition: RuntimeImplementation","options"],"sources":["../src/create-error.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\n\nimport type {\n BlueprintContext,\n BlueprintErrorTemplate,\n CreateErrorConfig,\n ErrorFamilyFactory,\n ImplementOptions,\n InvariantInput,\n} from './types.js';\n\ntype RuntimeImplementation = (argument: unknown) => string;\n\ntype ErrorConfigBody<\n Schema extends StandardSchemaV1,\n DataConfig extends CreateErrorConfig<Schema>['data'],\n MessageCallback extends CreateErrorConfig<Schema>['message'],\n> = {\n data: DataConfig;\n message: MessageCallback;\n};\n\ntype ErrorConfigWithProperties<\n Schema extends StandardSchemaV1,\n DataConfig extends CreateErrorConfig<Schema>['data'],\n MessageCallback extends CreateErrorConfig<Schema>['message'],\n Properties extends object,\n> = ErrorConfigBody<Schema, DataConfig, MessageCallback> & {\n properties(context: BlueprintContext<Schema>): Properties;\n};\n\ntype ErrorConfigWithoutProperties<\n Schema extends StandardSchemaV1,\n DataConfig extends CreateErrorConfig<Schema>['data'],\n MessageCallback extends CreateErrorConfig<Schema>['message'],\n> = ErrorConfigBody<Schema, DataConfig, MessageCallback> & {\n properties?: never;\n};\n\ntype ExactCreateErrorConfig<\n Schema extends StandardSchemaV1,\n Config extends object,\n> = {\n definition: Schema;\n} & Config &\n (StandardSchemaV1.InferOutput<Schema> extends object\n ? unknown\n : { definition: never });\n\ntype SerializedCreateErrorConfig<\n Schema extends StandardSchemaV1,\n Config extends object,\n Json,\n> = ExactCreateErrorConfig<\n Schema,\n Config & {\n toJSON(error: BlueprintErrorTemplate<NoInfer<Config>>): Json;\n }\n>;\n\nconst protectedPropertyNames = new Set([\n 'name',\n 'message',\n 'stack',\n 'cause',\n 'constructor',\n 'prototype',\n]);\n\nfunction isObjectLike(value: unknown): value is object {\n return (\n value !== null && (typeof value === 'object' || typeof value === 'function')\n );\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return isObjectLike(value) && typeof Reflect.get(value, 'then') === 'function';\n}\n\nfunction isPlainObject(value: unknown): value is Record<PropertyKey, unknown> {\n if (!isObjectLike(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction includeDefinition(\n argument: unknown,\n definition: object,\n): unknown {\n if (!isPlainObject(argument)) {\n return argument;\n }\n\n return { ...definition, ...argument };\n}\n\nfunction validateStandardSchema(schema: unknown, subject: string) {\n if (!isObjectLike(schema)) {\n throw new TypeError(`${subject} must be a Standard Schema object`);\n }\n\n const standard = Reflect.get(schema, '~standard') as unknown;\n\n if (\n !isObjectLike(standard) ||\n Reflect.get(standard, 'version') !== 1 ||\n typeof Reflect.get(standard, 'vendor') !== 'string' ||\n typeof Reflect.get(standard, 'validate') !== 'function'\n ) {\n throw new TypeError(`${subject} must implement Standard Schema V1`);\n }\n}\n\nfunction validateCallback(value: unknown, subject: string, optional = false) {\n if (optional && value === undefined) {\n return;\n }\n\n if (typeof value !== 'function') {\n throw new TypeError(`${subject} must be a function`);\n }\n}\n\nfunction validateBlueprint(config: CreateErrorConfig<StandardSchemaV1>) {\n validateStandardSchema(config.definition, 'definition');\n\n if (!isObjectLike(config.data)) {\n throw new TypeError('data must be an object');\n }\n\n validateCallback(config.data.resolve, 'data.resolve');\n validateCallback(config.message, 'message');\n validateCallback(config.properties, 'properties', true);\n validateCallback(config.toJSON, 'toJSON', true);\n\n if (\n typeof config.data.property !== 'string' ||\n config.data.property.length === 0\n ) {\n throw new TypeError('data.property must be a non-empty string');\n }\n\n if (protectedPropertyNames.has(config.data.property)) {\n throw new TypeError(\n `data.property cannot overwrite protected property \"${config.data.property}\"`,\n );\n }\n}\n\nfunction formatIssuePath(path: StandardSchemaV1.Issue['path']) {\n if (!path?.length) {\n return '';\n }\n\n const keys = path.map((segment) =>\n typeof segment === 'object' ? segment.key : segment,\n );\n\n return `${keys.map(String).join('.')}: `;\n}\n\nfunction parseSchema<Schema extends StandardSchemaV1>(\n schema: Schema,\n input: StandardSchemaV1.InferInput<Schema>,\n subject: string,\n) {\n const result = schema['~standard'].validate(input);\n\n if (isPromiseLike(result)) {\n throw new TypeError(`${subject} schema validation must be synchronous`);\n }\n\n if (result.issues) {\n const details = result.issues\n .map((issue) => `${formatIssuePath(issue.path)}${issue.message}`)\n .join('; ');\n\n throw new TypeError(`Invalid error ${subject}: ${details}`);\n }\n\n return result.value;\n}\n\nfunction parseDefinition<Schema extends StandardSchemaV1>(\n schema: Schema,\n definition: StandardSchemaV1.InferInput<Schema>,\n) {\n const parsedDefinition = parseSchema(schema, definition, 'definition');\n\n if (!isObjectLike(parsedDefinition)) {\n throw new TypeError('definition schema must produce an object');\n }\n\n return parsedDefinition;\n}\n\nfunction assignProperties(\n error: Error & Record<string, unknown>,\n properties: object,\n dataProperty: string,\n data: unknown,\n) {\n for (const key of Reflect.ownKeys(properties)) {\n if (typeof key === 'string' && protectedPropertyNames.has(key)) {\n throw new TypeError(`Cannot overwrite protected error property \"${key}\"`);\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(properties, key);\n\n if (!descriptor) {\n continue;\n }\n\n if (\n key === dataProperty &&\n (!('value' in descriptor) || descriptor.value !== data)\n ) {\n throw new TypeError(`Cannot overwrite resolved data property \"${dataProperty}\"`);\n }\n\n Object.defineProperty(error, key, descriptor);\n }\n}\n\nfunction throwUnless<Input>(\n ErrorClass: new (input: Input, options?: ErrorOptions) => Error,\n condition: unknown,\n input: InvariantInput<Input>,\n options: ErrorOptions | undefined,\n) {\n if (condition) {\n return;\n }\n\n const resolvedInput =\n typeof input === 'function' ? (input as () => Input)() : (input as Input);\n\n throw new ErrorClass(resolvedInput, options);\n}\n\n/**\n * Throws `ErrorClass` when `condition` is falsy.\n *\n * Works like the static `ErrorClass.invariant`, but can also be used with\n * classes stored in a `const`, where TypeScript does not allow assertion\n * methods. A function can be supplied as `input` to avoid constructing error\n * data unless the invariant fails.\n *\n * @example\n * ```ts\n * const MissingUserError = createRequestError({ code: 'missingUser' })\n * .implement(({ code }) => `${code}: user was not found`);\n *\n * invariant(MissingUserError, user, () => ({ userId }));\n *\n * user.id; // narrowed to the truthy branch\n * ```\n */\nexport function invariant<Condition, Input>(\n ErrorClass: new (input: Input, options?: ErrorOptions) => Error,\n condition: Condition,\n input: InvariantInput<Input>,\n options?: ErrorOptions,\n): asserts condition {\n throwUnless(ErrorClass, condition, input, options);\n}\n\n/**\n * Creates an error family with additional instance properties and typed JSON\n * serialization.\n *\n * @param config Defines the family, its public properties, and its serialized\n * representation.\n * @returns A callable factory with a shared `.Error` base class.\n *\n * @example\n * ```ts\n * const createApiError = createError({\n * definition: z.object({ code: z.string() }),\n * data: {\n * property: 'context',\n * resolve: ({ input }) => input,\n * },\n * message: ({ data, implementation }) => implementation(data),\n * properties: ({ definition }) => ({ code: definition.code }),\n * toJSON: (error) => ({\n * code: error.code,\n * context: error.context,\n * message: error.message,\n * }),\n * });\n * ```\n */\nexport function createError<\n const Schema extends StandardSchemaV1,\n const DataConfig extends CreateErrorConfig<Schema>['data'],\n const MessageCallback extends CreateErrorConfig<Schema>['message'],\n const Properties extends object,\n Json,\n>(\n config: SerializedCreateErrorConfig<\n Schema,\n ErrorConfigWithProperties<\n Schema,\n DataConfig,\n MessageCallback,\n Properties\n >,\n Json\n >,\n): ErrorFamilyFactory<Schema, typeof config>;\n\n/**\n * Creates an error family with typed JSON serialization and no additional\n * instance properties.\n *\n * @param config Defines the family and its serialized representation.\n * @returns A callable factory with a shared `.Error` base class.\n *\n * @example\n * ```ts\n * const createLogError = createError({\n * definition: z.object({ code: z.string() }),\n * data: {\n * property: 'details',\n * resolve: ({ input }) => input,\n * },\n * message: ({ data, implementation }) => implementation(data),\n * toJSON: (error) => ({\n * details: error.details,\n * message: error.message,\n * }),\n * });\n * ```\n */\nexport function createError<\n const Schema extends StandardSchemaV1,\n const DataConfig extends CreateErrorConfig<Schema>['data'],\n const MessageCallback extends CreateErrorConfig<Schema>['message'],\n Json,\n>(\n config: SerializedCreateErrorConfig<\n Schema,\n ErrorConfigWithoutProperties<Schema, DataConfig, MessageCallback>,\n Json\n >,\n): ErrorFamilyFactory<Schema, typeof config>;\n\n/**\n * Creates a configurable family of strongly typed error classes.\n *\n * Callback execution order is `data.resolve`, optional context validation,\n * `message`, then `properties`. Parsed definition output and constructor data\n * are inferred without explicit generic arguments or `as const`.\n *\n * @param config Defines the family's schema, data lifecycle, message, and\n * optional public properties.\n * @returns A callable factory with a shared `.Error` base class.\n *\n * @example\n * ```ts\n * const createRequestError = createError({\n * definition: z.object({ code: z.string() }),\n * data: {\n * property: 'context',\n * resolve: ({ input }) => input,\n * },\n * message: ({ data, implementation }) => implementation(data),\n * properties: ({ definition }) => ({ code: definition.code }),\n * });\n * ```\n */\nexport function createError<\n const Schema extends StandardSchemaV1,\n const Config extends Omit<CreateErrorConfig<Schema>, 'definition'>,\n>(\n config: ExactCreateErrorConfig<Schema, Config>,\n): ErrorFamilyFactory<Schema, typeof config>;\nexport function createError<\n const Schema extends StandardSchemaV1,\n const Config extends Omit<CreateErrorConfig<Schema>, 'definition'>,\n>(\n config: ExactCreateErrorConfig<Schema, Config>,\n): ErrorFamilyFactory<Schema, typeof config> {\n validateBlueprint(config as CreateErrorConfig<StandardSchemaV1>);\n\n class FamilyError extends Error {\n static invariant<Condition, Input>(\n this: new (input: Input, options?: ErrorOptions) => Error,\n condition: Condition,\n input: InvariantInput<Input>,\n options?: ErrorOptions,\n ): asserts condition {\n throwUnless(this, condition, input, options);\n }\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n const name = new.target.name;\n if (name) {\n this.name = name;\n }\n }\n }\n\n if (config.toJSON) {\n Object.defineProperty(FamilyError.prototype, 'toJSON', {\n configurable: true,\n value: function toJSON(this: Error & Record<string, unknown>) {\n return config.toJSON?.(this as never);\n },\n writable: true,\n });\n }\n\n function createDefinition<\n const Definition extends StandardSchemaV1.InferInput<Schema>,\n >(definition: Definition) {\n const parsedDefinition = parseDefinition(config.definition, definition);\n\n function createImplementation(\n implementation: RuntimeImplementation,\n options: ImplementOptions | undefined,\n contextSchema?: StandardSchemaV1,\n ) {\n validateCallback(implementation, 'implementation');\n\n const name = options?.name;\n\n if (name !== undefined && (typeof name !== 'string' || name.length === 0)) {\n throw new TypeError('name must be a non-empty string');\n }\n\n const ImplementedError = class extends FamilyError {\n constructor(input: unknown, options?: ErrorOptions) {\n const resolvedData = config.data.resolve({\n definition: parsedDefinition,\n input,\n } as never);\n const data = contextSchema\n ? parseSchema(contextSchema, resolvedData, 'context')\n : resolvedData;\n const implementationWithDefinition: RuntimeImplementation = (\n argument,\n ) =>\n implementation(\n argument === data\n ? argument\n : includeDefinition(argument, parsedDefinition),\n );\n const message = config.message({\n data,\n definition: parsedDefinition,\n implementation: implementationWithDefinition,\n } as never);\n\n super(message, options);\n\n Object.defineProperty(this, config.data.property, {\n configurable: true,\n enumerable: true,\n value: data,\n writable: true,\n });\n\n const properties = config.properties?.({\n data,\n definition: parsedDefinition,\n implementation: implementationWithDefinition,\n } as never);\n\n if (properties) {\n assignProperties(\n this as Error & Record<string, unknown>,\n properties,\n config.data.property,\n data,\n );\n }\n }\n };\n\n // Replace the name inferred from the local binding; unnamed classes fall\n // back to the native \"Error\" name.\n Object.defineProperty(ImplementedError, 'name', {\n configurable: true,\n value: name ?? '',\n });\n\n return ImplementedError;\n }\n\n function implement(\n implementation: RuntimeImplementation,\n options?: ImplementOptions,\n ) {\n return createImplementation(implementation, options);\n }\n\n function defineContext<ContextSchema extends StandardSchemaV1>(\n contextSchema: ContextSchema,\n ) {\n validateStandardSchema(contextSchema, 'context');\n\n return {\n implement(\n implementation: RuntimeImplementation,\n options?: ImplementOptions,\n ) {\n return createImplementation(implementation, options, contextSchema);\n },\n };\n }\n\n return {\n defineContext,\n implement,\n };\n }\n\n return Object.assign(createDefinition, {\n Error: FamilyError,\n is: (value: unknown) => value instanceof FamilyError,\n }) as unknown as ErrorFamilyFactory<Schema, typeof config>;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { BlueprintContext, BlueprintErrorTemplate, CreateErrorConfig, ErrorFamilyFactory } from "./types.cjs";
1
+ import { BlueprintContext, BlueprintErrorTemplate, CreateErrorConfig, ErrorFamilyFactory, InvariantInput } from "./types.cjs";
2
2
  import { StandardSchemaV1 } from "@standard-schema/spec";
3
3
 
4
4
  //#region src/create-error.d.ts
@@ -20,6 +20,25 @@ type ExactCreateErrorConfig<Schema extends StandardSchemaV1, Config extends obje
20
20
  type SerializedCreateErrorConfig<Schema extends StandardSchemaV1, Config extends object, Json> = ExactCreateErrorConfig<Schema, Config & {
21
21
  toJSON(error: BlueprintErrorTemplate<NoInfer<Config>>): Json;
22
22
  }>;
23
+ /**
24
+ * Throws `ErrorClass` when `condition` is falsy.
25
+ *
26
+ * Works like the static `ErrorClass.invariant`, but can also be used with
27
+ * classes stored in a `const`, where TypeScript does not allow assertion
28
+ * methods. A function can be supplied as `input` to avoid constructing error
29
+ * data unless the invariant fails.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const MissingUserError = createRequestError({ code: 'missingUser' })
34
+ * .implement(({ code }) => `${code}: user was not found`);
35
+ *
36
+ * invariant(MissingUserError, user, () => ({ userId }));
37
+ *
38
+ * user.id; // narrowed to the truthy branch
39
+ * ```
40
+ */
41
+ declare function invariant<Condition, Input>(ErrorClass: new (input: Input, options?: ErrorOptions) => Error, condition: Condition, input: InvariantInput<Input>, options?: ErrorOptions): asserts condition;
23
42
  /**
24
43
  * Creates an error family with additional instance properties and typed JSON
25
44
  * serialization.
@@ -97,5 +116,5 @@ declare function createError<const Schema extends StandardSchemaV1, const DataCo
97
116
  */
98
117
  declare function createError<const Schema extends StandardSchemaV1, const Config extends Omit<CreateErrorConfig<Schema>, 'definition'>>(config: ExactCreateErrorConfig<Schema, Config>): ErrorFamilyFactory<Schema, typeof config>;
99
118
  //#endregion
100
- export { createError };
119
+ export { createError, invariant };
101
120
  //# sourceMappingURL=create-error.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-error.d.cts","names":[],"sources":["../src/create-error.ts"],"sourcesContent":[],"mappings":";;;;KAWK,+BACY,qCACI,kBAAkB,yCACb,kBAAkB;QAEpC;EALH,OAAA,EAMM,eANS;CACH;KAQZ,yBAPkC,CAAA,eAQtB,gBARsB,EAAA,mBASlB,iBATkB,CASA,MATA,CAAA,CAAA,MAAA,CAAA,EAAA,wBAUb,iBAVa,CAUK,MAVL,CAAA,CAAA,SAAA,CAAA,EAAA,mBAAA,MAAA,CAAA,GAYnC,eAZmC,CAYnB,MAZmB,EAYX,UAZW,EAYC,eAZD,CAAA,GAAA;EAAlB,UAAA,CAAA,OAAA,EAaC,gBAbD,CAakB,MAblB,CAAA,CAAA,EAa4B,UAb5B;CACuB;KAevC,4BAfqB,CAAA,eAgBT,gBAhBS,EAAA,mBAiBL,iBAjBK,CAiBa,MAjBb,CAAA,CAAA,MAAA,CAAA,EAAA,wBAkBA,iBAlBA,CAkBkB,MAlBlB,CAAA,CAAA,SAAA,CAAA,CAAA,GAmBtB,eAnBsB,CAmBN,MAnBM,EAmBE,UAnBF,EAmBc,eAnBd,CAAA,GAAA;EAElB,UAAA,CAAA,EAAA,KAAA;CACG;KAoBN,sBApBqB,CAAA,eAqBT,gBArBS,EAAA,eAAA,MAAA,CAAA,GAAA;EAGrB,UAAA,EAqBS,MArBT;CACY,GAqBb,MArBa,GAAA,CAsBd,gBAAA,CAAiB,WAtBH,CAsBe,MAtBf,CAAA,SAAA,MAAA,GAAA,OAAA,GAAA;EACsB,UAAA,EAAA,KAAA;CAAlB,CAAA;KAyBhB,2BAxBuC,CAAA,eAyB3B,gBAzB2B,EAAA,eAAA,MAAA,EAAA,IAAA,CAAA,GA4BxC,sBA5BwC,CA6B1C,MA7B0C,EA8B1C,MA9B0C,GAAA;EAAlB,MAAA,CAAA,KAAA,EA+BR,sBA/BQ,CA+Be,OA/Bf,CA+BuB,MA/BvB,CAAA,CAAA,CAAA,EA+BkC,IA/BlC;CAEN,CAAA;;;;;;;;AACuC;;;;;;;;;;;AAOxC;;;;;;;AAUY;AAKd,iBAqLD,WArLC,CAAA,qBAsLM,gBAtLN,EAAA,yBAuLU,iBAvLV,CAuL4B,MAvL5B,CAAA,CAAA,MAAA,CAAA,EAAA,8BAwLe,iBAxLf,CAwLiC,MAxLjC,CAAA,CAAA,SAAA,CAAA,EAAA,yBAAA,MAAA,EAAA,IAAA,CAAA,CAAA,MAAA,EA4LP,2BA5LO,CA6Lb,MA7La,EA8Lb,yBA9La,CA+LX,MA/LW,EAgMX,UAhMW,EAiMX,eAjMW,EAkMX,UAlMW,CAAA,EAoMb,IApMa,CAAA,CAAA,EAsMd,kBAtMc,CAsMK,MAtML,EAAA,OAsMoB,MAtMpB,CAAA;;;;;;;;;AAqLjB;;;;;;;;;;;;;;;AAiBqC,iBAyBrB,WAzBqB,CAAA,qBA0Bd,gBA1Bc,EAAA,yBA2BV,iBA3BU,CA2BQ,MA3BR,CAAA,CAAA,MAAA,CAAA,EAAA,8BA4BL,iBA5BK,CA4Ba,MA5Bb,CAAA,CAAA,SAAA,CAAA,EAAA,IAAA,CAAA,CAAA,MAAA,EA+B3B,2BA/B2B,CAgCjC,MAhCiC,EAiCjC,4BAjCiC,CAiCJ,MAjCI,EAiCI,UAjCJ,EAiCgB,eAjChB,CAAA,EAkCjC,IAlCiC,CAAA,CAAA,EAoClC,kBApCkC,CAoCf,MApCe,EAAA,OAoCA,MApCA,CAAA;;;AAyBrC;;;;;;;;;;;;;;;;;AAqCA;;;;;AAIiC,iBAJjB,WAIiB,CAAA,qBAHV,gBAGU,EAAA,qBAFV,IAEU,CAFL,iBAEK,CAFa,MAEb,CAAA,EAAA,YAAA,CAAA,CAAA,CAAA,MAAA,EAAvB,sBAAuB,CAAA,MAAA,EAAQ,MAAR,CAAA,CAAA,EAC9B,kBAD8B,CACX,MADW,EAAA,OACI,MADJ,CAAA"}
1
+ {"version":3,"file":"create-error.d.cts","names":[],"sources":["../src/create-error.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { BlueprintContext, BlueprintErrorTemplate, CreateErrorConfig, ErrorFamilyFactory } from "./types.mjs";
1
+ import { BlueprintContext, BlueprintErrorTemplate, CreateErrorConfig, ErrorFamilyFactory, InvariantInput } from "./types.mjs";
2
2
  import { StandardSchemaV1 } from "@standard-schema/spec";
3
3
 
4
4
  //#region src/create-error.d.ts
@@ -20,6 +20,25 @@ type ExactCreateErrorConfig<Schema extends StandardSchemaV1, Config extends obje
20
20
  type SerializedCreateErrorConfig<Schema extends StandardSchemaV1, Config extends object, Json> = ExactCreateErrorConfig<Schema, Config & {
21
21
  toJSON(error: BlueprintErrorTemplate<NoInfer<Config>>): Json;
22
22
  }>;
23
+ /**
24
+ * Throws `ErrorClass` when `condition` is falsy.
25
+ *
26
+ * Works like the static `ErrorClass.invariant`, but can also be used with
27
+ * classes stored in a `const`, where TypeScript does not allow assertion
28
+ * methods. A function can be supplied as `input` to avoid constructing error
29
+ * data unless the invariant fails.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const MissingUserError = createRequestError({ code: 'missingUser' })
34
+ * .implement(({ code }) => `${code}: user was not found`);
35
+ *
36
+ * invariant(MissingUserError, user, () => ({ userId }));
37
+ *
38
+ * user.id; // narrowed to the truthy branch
39
+ * ```
40
+ */
41
+ declare function invariant<Condition, Input>(ErrorClass: new (input: Input, options?: ErrorOptions) => Error, condition: Condition, input: InvariantInput<Input>, options?: ErrorOptions): asserts condition;
23
42
  /**
24
43
  * Creates an error family with additional instance properties and typed JSON
25
44
  * serialization.
@@ -97,5 +116,5 @@ declare function createError<const Schema extends StandardSchemaV1, const DataCo
97
116
  */
98
117
  declare function createError<const Schema extends StandardSchemaV1, const Config extends Omit<CreateErrorConfig<Schema>, 'definition'>>(config: ExactCreateErrorConfig<Schema, Config>): ErrorFamilyFactory<Schema, typeof config>;
99
118
  //#endregion
100
- export { createError };
119
+ export { createError, invariant };
101
120
  //# sourceMappingURL=create-error.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-error.d.mts","names":[],"sources":["../src/create-error.ts"],"sourcesContent":[],"mappings":";;;;KAWK,+BACY,qCACI,kBAAkB,yCACb,kBAAkB;QAEpC;EALH,OAAA,EAMM,eANS;CACH;KAQZ,yBAPkC,CAAA,eAQtB,gBARsB,EAAA,mBASlB,iBATkB,CASA,MATA,CAAA,CAAA,MAAA,CAAA,EAAA,wBAUb,iBAVa,CAUK,MAVL,CAAA,CAAA,SAAA,CAAA,EAAA,mBAAA,MAAA,CAAA,GAYnC,eAZmC,CAYnB,MAZmB,EAYX,UAZW,EAYC,eAZD,CAAA,GAAA;EAAlB,UAAA,CAAA,OAAA,EAaC,gBAbD,CAakB,MAblB,CAAA,CAAA,EAa4B,UAb5B;CACuB;KAevC,4BAfqB,CAAA,eAgBT,gBAhBS,EAAA,mBAiBL,iBAjBK,CAiBa,MAjBb,CAAA,CAAA,MAAA,CAAA,EAAA,wBAkBA,iBAlBA,CAkBkB,MAlBlB,CAAA,CAAA,SAAA,CAAA,CAAA,GAmBtB,eAnBsB,CAmBN,MAnBM,EAmBE,UAnBF,EAmBc,eAnBd,CAAA,GAAA;EAElB,UAAA,CAAA,EAAA,KAAA;CACG;KAoBN,sBApBqB,CAAA,eAqBT,gBArBS,EAAA,eAAA,MAAA,CAAA,GAAA;EAGrB,UAAA,EAqBS,MArBT;CACY,GAqBb,MArBa,GAAA,CAsBd,gBAAA,CAAiB,WAtBH,CAsBe,MAtBf,CAAA,SAAA,MAAA,GAAA,OAAA,GAAA;EACsB,UAAA,EAAA,KAAA;CAAlB,CAAA;KAyBhB,2BAxBuC,CAAA,eAyB3B,gBAzB2B,EAAA,eAAA,MAAA,EAAA,IAAA,CAAA,GA4BxC,sBA5BwC,CA6B1C,MA7B0C,EA8B1C,MA9B0C,GAAA;EAAlB,MAAA,CAAA,KAAA,EA+BR,sBA/BQ,CA+Be,OA/Bf,CA+BuB,MA/BvB,CAAA,CAAA,CAAA,EA+BkC,IA/BlC;CAEN,CAAA;;;;;;;;AACuC;;;;;;;;;;;AAOxC;;;;;;;AAUY;AAKd,iBAqLD,WArLC,CAAA,qBAsLM,gBAtLN,EAAA,yBAuLU,iBAvLV,CAuL4B,MAvL5B,CAAA,CAAA,MAAA,CAAA,EAAA,8BAwLe,iBAxLf,CAwLiC,MAxLjC,CAAA,CAAA,SAAA,CAAA,EAAA,yBAAA,MAAA,EAAA,IAAA,CAAA,CAAA,MAAA,EA4LP,2BA5LO,CA6Lb,MA7La,EA8Lb,yBA9La,CA+LX,MA/LW,EAgMX,UAhMW,EAiMX,eAjMW,EAkMX,UAlMW,CAAA,EAoMb,IApMa,CAAA,CAAA,EAsMd,kBAtMc,CAsMK,MAtML,EAAA,OAsMoB,MAtMpB,CAAA;;;;;;;;;AAqLjB;;;;;;;;;;;;;;;AAiBqC,iBAyBrB,WAzBqB,CAAA,qBA0Bd,gBA1Bc,EAAA,yBA2BV,iBA3BU,CA2BQ,MA3BR,CAAA,CAAA,MAAA,CAAA,EAAA,8BA4BL,iBA5BK,CA4Ba,MA5Bb,CAAA,CAAA,SAAA,CAAA,EAAA,IAAA,CAAA,CAAA,MAAA,EA+B3B,2BA/B2B,CAgCjC,MAhCiC,EAiCjC,4BAjCiC,CAiCJ,MAjCI,EAiCI,UAjCJ,EAiCgB,eAjChB,CAAA,EAkCjC,IAlCiC,CAAA,CAAA,EAoClC,kBApCkC,CAoCf,MApCe,EAAA,OAoCA,MApCA,CAAA;;;AAyBrC;;;;;;;;;;;;;;;;;AAqCA;;;;;AAIiC,iBAJjB,WAIiB,CAAA,qBAHV,gBAGU,EAAA,qBAFV,IAEU,CAFL,iBAEK,CAFa,MAEb,CAAA,EAAA,YAAA,CAAA,CAAA,CAAA,MAAA,EAAvB,sBAAuB,CAAA,MAAA,EAAQ,MAAR,CAAA,CAAA,EAC9B,kBAD8B,CACX,MADW,EAAA,OACI,MADJ,CAAA"}
1
+ {"version":3,"file":"create-error.d.mts","names":[],"sources":["../src/create-error.ts"],"sourcesContent":[],"mappings":"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"}
@@ -10,6 +10,9 @@ const protectedPropertyNames = new Set([
10
10
  function isObjectLike(value) {
11
11
  return value !== null && (typeof value === "object" || typeof value === "function");
12
12
  }
13
+ function isPromiseLike(value) {
14
+ return isObjectLike(value) && typeof Reflect.get(value, "then") === "function";
15
+ }
13
16
  function isPlainObject(value) {
14
17
  if (!isObjectLike(value)) return false;
15
18
  const prototype = Object.getPrototypeOf(value);
@@ -27,8 +30,17 @@ function validateStandardSchema(schema, subject) {
27
30
  const standard = Reflect.get(schema, "~standard");
28
31
  if (!isObjectLike(standard) || Reflect.get(standard, "version") !== 1 || typeof Reflect.get(standard, "vendor") !== "string" || typeof Reflect.get(standard, "validate") !== "function") throw new TypeError(`${subject} must implement Standard Schema V1`);
29
32
  }
33
+ function validateCallback(value, subject, optional = false) {
34
+ if (optional && value === void 0) return;
35
+ if (typeof value !== "function") throw new TypeError(`${subject} must be a function`);
36
+ }
30
37
  function validateBlueprint(config) {
31
38
  validateStandardSchema(config.definition, "definition");
39
+ if (!isObjectLike(config.data)) throw new TypeError("data must be an object");
40
+ validateCallback(config.data.resolve, "data.resolve");
41
+ validateCallback(config.message, "message");
42
+ validateCallback(config.properties, "properties", true);
43
+ validateCallback(config.toJSON, "toJSON", true);
32
44
  if (typeof config.data.property !== "string" || config.data.property.length === 0) throw new TypeError("data.property must be a non-empty string");
33
45
  if (protectedPropertyNames.has(config.data.property)) throw new TypeError(`data.property cannot overwrite protected property "${config.data.property}"`);
34
46
  }
@@ -38,7 +50,7 @@ function formatIssuePath(path) {
38
50
  }
39
51
  function parseSchema(schema, input, subject) {
40
52
  const result = schema["~standard"].validate(input);
41
- if (result instanceof Promise) throw new TypeError(`${subject} schema validation must be synchronous`);
53
+ if (isPromiseLike(result)) throw new TypeError(`${subject} schema validation must be synchronous`);
42
54
  if (result.issues) {
43
55
  const details = result.issues.map((issue) => `${formatIssuePath(issue.path)}${issue.message}`).join("; ");
44
56
  throw new TypeError(`Invalid error ${subject}: ${details}`);
@@ -59,13 +71,36 @@ function assignProperties(error, properties, dataProperty, data) {
59
71
  Object.defineProperty(error, key, descriptor);
60
72
  }
61
73
  }
74
+ function throwUnless(ErrorClass, condition, input, options) {
75
+ if (condition) return;
76
+ throw new ErrorClass(typeof input === "function" ? input() : input, options);
77
+ }
78
+ /**
79
+ * Throws `ErrorClass` when `condition` is falsy.
80
+ *
81
+ * Works like the static `ErrorClass.invariant`, but can also be used with
82
+ * classes stored in a `const`, where TypeScript does not allow assertion
83
+ * methods. A function can be supplied as `input` to avoid constructing error
84
+ * data unless the invariant fails.
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * const MissingUserError = createRequestError({ code: 'missingUser' })
89
+ * .implement(({ code }) => `${code}: user was not found`);
90
+ *
91
+ * invariant(MissingUserError, user, () => ({ userId }));
92
+ *
93
+ * user.id; // narrowed to the truthy branch
94
+ * ```
95
+ */
96
+ function invariant(ErrorClass, condition, input, options) {
97
+ throwUnless(ErrorClass, condition, input, options);
98
+ }
62
99
  function createError(config) {
63
100
  validateBlueprint(config);
64
101
  class FamilyError extends Error {
65
102
  static invariant(condition, input, options) {
66
- if (condition) return;
67
- const resolvedInput = typeof input === "function" ? input() : input;
68
- throw new this(resolvedInput, options);
103
+ throwUnless(this, condition, input, options);
69
104
  }
70
105
  constructor(message, options) {
71
106
  super(message, options);
@@ -82,9 +117,12 @@ function createError(config) {
82
117
  });
83
118
  function createDefinition(definition) {
84
119
  const parsedDefinition = parseDefinition(config.definition, definition);
85
- function createImplementation(implementation, contextSchema) {
86
- return class extends FamilyError {
87
- constructor(input, options) {
120
+ function createImplementation(implementation, options, contextSchema) {
121
+ validateCallback(implementation, "implementation");
122
+ const name = options?.name;
123
+ if (name !== void 0 && (typeof name !== "string" || name.length === 0)) throw new TypeError("name must be a non-empty string");
124
+ const ImplementedError = class extends FamilyError {
125
+ constructor(input, options$1) {
88
126
  const resolvedData = config.data.resolve({
89
127
  definition: parsedDefinition,
90
128
  input
@@ -96,7 +134,7 @@ function createError(config) {
96
134
  definition: parsedDefinition,
97
135
  implementation: implementationWithDefinition
98
136
  });
99
- super(message, options);
137
+ super(message, options$1);
100
138
  Object.defineProperty(this, config.data.property, {
101
139
  configurable: true,
102
140
  enumerable: true,
@@ -111,14 +149,19 @@ function createError(config) {
111
149
  if (properties) assignProperties(this, properties, config.data.property, data);
112
150
  }
113
151
  };
152
+ Object.defineProperty(ImplementedError, "name", {
153
+ configurable: true,
154
+ value: name ?? ""
155
+ });
156
+ return ImplementedError;
114
157
  }
115
- function implement(implementation) {
116
- return createImplementation(implementation);
158
+ function implement(implementation, options) {
159
+ return createImplementation(implementation, options);
117
160
  }
118
161
  function defineContext(contextSchema) {
119
162
  validateStandardSchema(contextSchema, "context");
120
- return { implement(implementation) {
121
- return createImplementation(implementation, contextSchema);
163
+ return { implement(implementation, options) {
164
+ return createImplementation(implementation, options, contextSchema);
122
165
  } };
123
166
  }
124
167
  return {
@@ -126,9 +169,12 @@ function createError(config) {
126
169
  implement
127
170
  };
128
171
  }
129
- return Object.assign(createDefinition, { Error: FamilyError });
172
+ return Object.assign(createDefinition, {
173
+ Error: FamilyError,
174
+ is: (value) => value instanceof FamilyError
175
+ });
130
176
  }
131
177
 
132
178
  //#endregion
133
- export { createError };
179
+ export { createError, invariant };
134
180
  //# sourceMappingURL=create-error.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-error.mjs","names":["implementationWithDefinition: RuntimeImplementation"],"sources":["../src/create-error.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\r\n\r\nimport type {\r\n BlueprintContext,\r\n BlueprintErrorTemplate,\r\n CreateErrorConfig,\r\n ErrorFamilyFactory,\r\n} from './types.js';\r\n\r\ntype RuntimeImplementation = (argument: unknown) => string;\r\n\r\ntype ErrorConfigBody<\r\n Schema extends StandardSchemaV1,\r\n DataConfig extends CreateErrorConfig<Schema>['data'],\r\n MessageCallback extends CreateErrorConfig<Schema>['message'],\r\n> = {\r\n data: DataConfig;\r\n message: MessageCallback;\r\n};\r\n\r\ntype ErrorConfigWithProperties<\r\n Schema extends StandardSchemaV1,\r\n DataConfig extends CreateErrorConfig<Schema>['data'],\r\n MessageCallback extends CreateErrorConfig<Schema>['message'],\r\n Properties extends object,\r\n> = ErrorConfigBody<Schema, DataConfig, MessageCallback> & {\r\n properties(context: BlueprintContext<Schema>): Properties;\r\n};\r\n\r\ntype ErrorConfigWithoutProperties<\r\n Schema extends StandardSchemaV1,\r\n DataConfig extends CreateErrorConfig<Schema>['data'],\r\n MessageCallback extends CreateErrorConfig<Schema>['message'],\r\n> = ErrorConfigBody<Schema, DataConfig, MessageCallback> & {\r\n properties?: never;\r\n};\r\n\r\ntype ExactCreateErrorConfig<\r\n Schema extends StandardSchemaV1,\r\n Config extends object,\r\n> = {\r\n definition: Schema;\r\n} & Config &\r\n (StandardSchemaV1.InferOutput<Schema> extends object\r\n ? unknown\r\n : { definition: never });\r\n\r\ntype SerializedCreateErrorConfig<\r\n Schema extends StandardSchemaV1,\r\n Config extends object,\r\n Json,\r\n> = ExactCreateErrorConfig<\r\n Schema,\r\n Config & {\r\n toJSON(error: BlueprintErrorTemplate<NoInfer<Config>>): Json;\r\n }\r\n>;\r\n\r\nconst protectedPropertyNames = new Set([\r\n 'name',\r\n 'message',\r\n 'stack',\r\n 'cause',\r\n 'constructor',\r\n 'prototype',\r\n]);\r\n\r\nfunction isObjectLike(value: unknown): value is object {\r\n return (\r\n value !== null && (typeof value === 'object' || typeof value === 'function')\r\n );\r\n}\r\n\r\nfunction isPlainObject(value: unknown): value is Record<PropertyKey, unknown> {\r\n if (!isObjectLike(value)) {\r\n return false;\r\n }\r\n\r\n const prototype = Object.getPrototypeOf(value);\r\n\r\n return prototype === Object.prototype || prototype === null;\r\n}\r\n\r\nfunction includeDefinition(\r\n argument: unknown,\r\n definition: object,\r\n): unknown {\r\n if (!isPlainObject(argument)) {\r\n return argument;\r\n }\r\n\r\n return { ...definition, ...argument };\r\n}\r\n\r\nfunction validateStandardSchema(schema: unknown, subject: string) {\r\n if (!isObjectLike(schema)) {\r\n throw new TypeError(`${subject} must be a Standard Schema object`);\r\n }\r\n\r\n const standard = Reflect.get(schema, '~standard') as unknown;\r\n\r\n if (\r\n !isObjectLike(standard) ||\r\n Reflect.get(standard, 'version') !== 1 ||\r\n typeof Reflect.get(standard, 'vendor') !== 'string' ||\r\n typeof Reflect.get(standard, 'validate') !== 'function'\r\n ) {\r\n throw new TypeError(`${subject} must implement Standard Schema V1`);\r\n }\r\n}\r\n\r\nfunction validateBlueprint(config: CreateErrorConfig<StandardSchemaV1>) {\r\n validateStandardSchema(config.definition, 'definition');\r\n\r\n if (\r\n typeof config.data.property !== 'string' ||\r\n config.data.property.length === 0\r\n ) {\r\n throw new TypeError('data.property must be a non-empty string');\r\n }\r\n\r\n if (protectedPropertyNames.has(config.data.property)) {\r\n throw new TypeError(\r\n `data.property cannot overwrite protected property \"${config.data.property}\"`,\r\n );\r\n }\r\n}\r\n\r\nfunction formatIssuePath(path: StandardSchemaV1.Issue['path']) {\r\n if (!path?.length) {\r\n return '';\r\n }\r\n\r\n const keys = path.map((segment) =>\r\n typeof segment === 'object' ? segment.key : segment,\r\n );\r\n\r\n return `${keys.map(String).join('.')}: `;\r\n}\r\n\r\nfunction parseSchema<Schema extends StandardSchemaV1>(\r\n schema: Schema,\r\n input: StandardSchemaV1.InferInput<Schema>,\r\n subject: string,\r\n) {\r\n const result = schema['~standard'].validate(input);\r\n\r\n if (result instanceof Promise) {\r\n throw new TypeError(`${subject} schema validation must be synchronous`);\r\n }\r\n\r\n if (result.issues) {\r\n const details = result.issues\r\n .map((issue) => `${formatIssuePath(issue.path)}${issue.message}`)\r\n .join('; ');\r\n\r\n throw new TypeError(`Invalid error ${subject}: ${details}`);\r\n }\r\n\r\n return result.value;\r\n}\r\n\r\nfunction parseDefinition<Schema extends StandardSchemaV1>(\r\n schema: Schema,\r\n definition: StandardSchemaV1.InferInput<Schema>,\r\n) {\r\n const parsedDefinition = parseSchema(schema, definition, 'definition');\r\n\r\n if (!isObjectLike(parsedDefinition)) {\r\n throw new TypeError('definition schema must produce an object');\r\n }\r\n\r\n return parsedDefinition;\r\n}\r\n\r\nfunction assignProperties(\r\n error: Error & Record<string, unknown>,\r\n properties: object,\r\n dataProperty: string,\r\n data: unknown,\r\n) {\r\n for (const key of Reflect.ownKeys(properties)) {\r\n if (typeof key === 'string' && protectedPropertyNames.has(key)) {\r\n throw new TypeError(`Cannot overwrite protected error property \"${key}\"`);\r\n }\r\n\r\n const descriptor = Object.getOwnPropertyDescriptor(properties, key);\r\n\r\n if (!descriptor) {\r\n continue;\r\n }\r\n\r\n if (\r\n key === dataProperty &&\r\n (!('value' in descriptor) || descriptor.value !== data)\r\n ) {\r\n throw new TypeError(`Cannot overwrite resolved data property \"${dataProperty}\"`);\r\n }\r\n\r\n Object.defineProperty(error, key, descriptor);\r\n }\r\n}\r\n\r\n/**\r\n * Creates an error family with additional instance properties and typed JSON\r\n * serialization.\r\n *\r\n * @param config Defines the family, its public properties, and its serialized\r\n * representation.\r\n * @returns A callable factory with a shared `.Error` base class.\r\n *\r\n * @example\r\n * ```ts\r\n * const createApiError = createError({\r\n * definition: z.object({ code: z.string() }),\r\n * data: {\r\n * property: 'context',\r\n * resolve: ({ input }) => input,\r\n * },\r\n * message: ({ data, implementation }) => implementation(data),\r\n * properties: ({ definition }) => ({ code: definition.code }),\r\n * toJSON: (error) => ({\r\n * code: error.code,\r\n * context: error.context,\r\n * message: error.message,\r\n * }),\r\n * });\r\n * ```\r\n */\r\nexport function createError<\r\n const Schema extends StandardSchemaV1,\r\n const DataConfig extends CreateErrorConfig<Schema>['data'],\r\n const MessageCallback extends CreateErrorConfig<Schema>['message'],\r\n const Properties extends object,\r\n Json,\r\n>(\r\n config: SerializedCreateErrorConfig<\r\n Schema,\r\n ErrorConfigWithProperties<\r\n Schema,\r\n DataConfig,\r\n MessageCallback,\r\n Properties\r\n >,\r\n Json\r\n >,\r\n): ErrorFamilyFactory<Schema, typeof config>;\r\n\r\n/**\r\n * Creates an error family with typed JSON serialization and no additional\r\n * instance properties.\r\n *\r\n * @param config Defines the family and its serialized representation.\r\n * @returns A callable factory with a shared `.Error` base class.\r\n *\r\n * @example\r\n * ```ts\r\n * const createLogError = createError({\r\n * definition: z.object({ code: z.string() }),\r\n * data: {\r\n * property: 'details',\r\n * resolve: ({ input }) => input,\r\n * },\r\n * message: ({ data, implementation }) => implementation(data),\r\n * toJSON: (error) => ({\r\n * details: error.details,\r\n * message: error.message,\r\n * }),\r\n * });\r\n * ```\r\n */\r\nexport function createError<\r\n const Schema extends StandardSchemaV1,\r\n const DataConfig extends CreateErrorConfig<Schema>['data'],\r\n const MessageCallback extends CreateErrorConfig<Schema>['message'],\r\n Json,\r\n>(\r\n config: SerializedCreateErrorConfig<\r\n Schema,\r\n ErrorConfigWithoutProperties<Schema, DataConfig, MessageCallback>,\r\n Json\r\n >,\r\n): ErrorFamilyFactory<Schema, typeof config>;\r\n\r\n/**\r\n * Creates a configurable family of strongly typed error classes.\r\n *\r\n * Callback execution order is `data.resolve`, optional context validation,\r\n * `message`, then `properties`. Parsed definition output and constructor data\r\n * are inferred without explicit generic arguments or `as const`.\r\n *\r\n * @param config Defines the family's schema, data lifecycle, message, and\r\n * optional public properties.\r\n * @returns A callable factory with a shared `.Error` base class.\r\n *\r\n * @example\r\n * ```ts\r\n * const createRequestError = createError({\r\n * definition: z.object({ code: z.string() }),\r\n * data: {\r\n * property: 'context',\r\n * resolve: ({ input }) => input,\r\n * },\r\n * message: ({ data, implementation }) => implementation(data),\r\n * properties: ({ definition }) => ({ code: definition.code }),\r\n * });\r\n * ```\r\n */\r\nexport function createError<\r\n const Schema extends StandardSchemaV1,\r\n const Config extends Omit<CreateErrorConfig<Schema>, 'definition'>,\r\n>(\r\n config: ExactCreateErrorConfig<Schema, Config>,\r\n): ErrorFamilyFactory<Schema, typeof config>;\r\nexport function createError<\r\n const Schema extends StandardSchemaV1,\r\n const Config extends Omit<CreateErrorConfig<Schema>, 'definition'>,\r\n>(\r\n config: ExactCreateErrorConfig<Schema, Config>,\r\n): ErrorFamilyFactory<Schema, typeof config> {\r\n validateBlueprint(config as CreateErrorConfig<StandardSchemaV1>);\r\n\r\n class FamilyError extends Error {\r\n static invariant<Condition, Input>(\r\n this: new (input: Input, options?: ErrorOptions) => Error,\r\n condition: Condition,\r\n input: Input | (() => Input),\r\n options?: ErrorOptions,\r\n ): asserts condition {\r\n if (condition) {\r\n return;\r\n }\r\n\r\n const resolvedInput =\r\n typeof input === 'function' ? (input as () => Input)() : input;\r\n\r\n throw new this(resolvedInput, options);\r\n }\r\n\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(message, options);\r\n const name = new.target.name;\r\n if (name) {\r\n this.name = name;\r\n }\r\n }\r\n }\r\n\r\n if (config.toJSON) {\r\n Object.defineProperty(FamilyError.prototype, 'toJSON', {\r\n configurable: true,\r\n value: function toJSON(this: Error & Record<string, unknown>) {\r\n return config.toJSON?.(this as never);\r\n },\r\n writable: true,\r\n });\r\n }\r\n\r\n function createDefinition<\r\n const Definition extends StandardSchemaV1.InferInput<Schema>,\r\n >(definition: Definition) {\r\n const parsedDefinition = parseDefinition(config.definition, definition);\r\n\r\n function createImplementation(\r\n implementation: RuntimeImplementation,\r\n contextSchema?: StandardSchemaV1,\r\n ) {\r\n return class extends FamilyError {\r\n constructor(input: unknown, options?: ErrorOptions) {\r\n const resolvedData = config.data.resolve({\r\n definition: parsedDefinition,\r\n input,\r\n } as never);\r\n const data = contextSchema\r\n ? parseSchema(contextSchema, resolvedData, 'context')\r\n : resolvedData;\r\n const implementationWithDefinition: RuntimeImplementation = (\r\n argument,\r\n ) =>\r\n implementation(\r\n argument === data\r\n ? argument\r\n : includeDefinition(argument, parsedDefinition),\r\n );\r\n const message = config.message({\r\n data,\r\n definition: parsedDefinition,\r\n implementation: implementationWithDefinition,\r\n } as never);\r\n\r\n super(message, options);\r\n\r\n Object.defineProperty(this, config.data.property, {\r\n configurable: true,\r\n enumerable: true,\r\n value: data,\r\n writable: true,\r\n });\r\n\r\n const properties = config.properties?.({\r\n data,\r\n definition: parsedDefinition,\r\n implementation: implementationWithDefinition,\r\n } as never);\r\n\r\n if (properties) {\r\n assignProperties(\r\n this as Error & Record<string, unknown>,\r\n properties,\r\n config.data.property,\r\n data,\r\n );\r\n }\r\n }\r\n };\r\n }\r\n\r\n function implement(implementation: RuntimeImplementation) {\r\n return createImplementation(implementation);\r\n }\r\n\r\n function defineContext<ContextSchema extends StandardSchemaV1>(\r\n contextSchema: ContextSchema,\r\n ) {\r\n validateStandardSchema(contextSchema, 'context');\r\n\r\n return {\r\n implement(implementation: RuntimeImplementation) {\r\n return createImplementation(implementation, contextSchema);\r\n },\r\n };\r\n }\r\n\r\n return {\r\n defineContext,\r\n implement,\r\n };\r\n }\r\n\r\n return Object.assign(createDefinition, {\r\n Error: FamilyError,\r\n }) as unknown as ErrorFamilyFactory<Schema, typeof config>;\r\n}\r\n"],"mappings":";AA0DA,MAAM,yBAAyB,IAAI,IAAI;CACrC;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,aAAa,OAAiC;AACrD,QACE,UAAU,SAAS,OAAO,UAAU,YAAY,OAAO,UAAU;;AAIrE,SAAS,cAAc,OAAuD;AAC5E,KAAI,CAAC,aAAa,MAAM,CACtB,QAAO;CAGT,MAAM,YAAY,OAAO,eAAe,MAAM;AAE9C,QAAO,cAAc,OAAO,aAAa,cAAc;;AAGzD,SAAS,kBACP,UACA,YACS;AACT,KAAI,CAAC,cAAc,SAAS,CAC1B,QAAO;AAGT,QAAO;EAAE,GAAG;EAAY,GAAG;EAAU;;AAGvC,SAAS,uBAAuB,QAAiB,SAAiB;AAChE,KAAI,CAAC,aAAa,OAAO,CACvB,OAAM,IAAI,UAAU,GAAG,QAAQ,mCAAmC;CAGpE,MAAM,WAAW,QAAQ,IAAI,QAAQ,YAAY;AAEjD,KACE,CAAC,aAAa,SAAS,IACvB,QAAQ,IAAI,UAAU,UAAU,KAAK,KACrC,OAAO,QAAQ,IAAI,UAAU,SAAS,KAAK,YAC3C,OAAO,QAAQ,IAAI,UAAU,WAAW,KAAK,WAE7C,OAAM,IAAI,UAAU,GAAG,QAAQ,oCAAoC;;AAIvE,SAAS,kBAAkB,QAA6C;AACtE,wBAAuB,OAAO,YAAY,aAAa;AAEvD,KACE,OAAO,OAAO,KAAK,aAAa,YAChC,OAAO,KAAK,SAAS,WAAW,EAEhC,OAAM,IAAI,UAAU,2CAA2C;AAGjE,KAAI,uBAAuB,IAAI,OAAO,KAAK,SAAS,CAClD,OAAM,IAAI,UACR,sDAAsD,OAAO,KAAK,SAAS,GAC5E;;AAIL,SAAS,gBAAgB,MAAsC;AAC7D,KAAI,CAAC,MAAM,OACT,QAAO;AAOT,QAAO,GAJM,KAAK,KAAK,YACrB,OAAO,YAAY,WAAW,QAAQ,MAAM,QAC7C,CAEc,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC;;AAGvC,SAAS,YACP,QACA,OACA,SACA;CACA,MAAM,SAAS,OAAO,aAAa,SAAS,MAAM;AAElD,KAAI,kBAAkB,QACpB,OAAM,IAAI,UAAU,GAAG,QAAQ,wCAAwC;AAGzE,KAAI,OAAO,QAAQ;EACjB,MAAM,UAAU,OAAO,OACpB,KAAK,UAAU,GAAG,gBAAgB,MAAM,KAAK,GAAG,MAAM,UAAU,CAChE,KAAK,KAAK;AAEb,QAAM,IAAI,UAAU,iBAAiB,QAAQ,IAAI,UAAU;;AAG7D,QAAO,OAAO;;AAGhB,SAAS,gBACP,QACA,YACA;CACA,MAAM,mBAAmB,YAAY,QAAQ,YAAY,aAAa;AAEtE,KAAI,CAAC,aAAa,iBAAiB,CACjC,OAAM,IAAI,UAAU,2CAA2C;AAGjE,QAAO;;AAGT,SAAS,iBACP,OACA,YACA,cACA,MACA;AACA,MAAK,MAAM,OAAO,QAAQ,QAAQ,WAAW,EAAE;AAC7C,MAAI,OAAO,QAAQ,YAAY,uBAAuB,IAAI,IAAI,CAC5D,OAAM,IAAI,UAAU,8CAA8C,IAAI,GAAG;EAG3E,MAAM,aAAa,OAAO,yBAAyB,YAAY,IAAI;AAEnE,MAAI,CAAC,WACH;AAGF,MACE,QAAQ,iBACP,EAAE,WAAW,eAAe,WAAW,UAAU,MAElD,OAAM,IAAI,UAAU,4CAA4C,aAAa,GAAG;AAGlF,SAAO,eAAe,OAAO,KAAK,WAAW;;;AAmHjD,SAAgB,YAId,QAC2C;AAC3C,mBAAkB,OAA8C;CAEhE,MAAM,oBAAoB,MAAM;EAC9B,OAAO,UAEL,WACA,OACA,SACmB;AACnB,OAAI,UACF;GAGF,MAAM,gBACJ,OAAO,UAAU,aAAc,OAAuB,GAAG;AAE3D,SAAM,IAAI,KAAK,eAAe,QAAQ;;EAGxC,YAAY,SAAiB,SAAwB;AACnD,SAAM,SAAS,QAAQ;GACvB,MAAM,OAAO,IAAI,OAAO;AACxB,OAAI,KACF,MAAK,OAAO;;;AAKlB,KAAI,OAAO,OACT,QAAO,eAAe,YAAY,WAAW,UAAU;EACrD,cAAc;EACd,OAAO,SAAS,SAA8C;AAC5D,UAAO,OAAO,SAAS,KAAc;;EAEvC,UAAU;EACX,CAAC;CAGJ,SAAS,iBAEP,YAAwB;EACxB,MAAM,mBAAmB,gBAAgB,OAAO,YAAY,WAAW;EAEvE,SAAS,qBACP,gBACA,eACA;AACA,UAAO,cAAc,YAAY;IAC/B,YAAY,OAAgB,SAAwB;KAClD,MAAM,eAAe,OAAO,KAAK,QAAQ;MACvC,YAAY;MACZ;MACD,CAAU;KACX,MAAM,OAAO,gBACT,YAAY,eAAe,cAAc,UAAU,GACnD;KACJ,MAAMA,gCACJ,aAEA,eACE,aAAa,OACT,WACA,kBAAkB,UAAU,iBAAiB,CAClD;KACH,MAAM,UAAU,OAAO,QAAQ;MAC7B;MACA,YAAY;MACZ,gBAAgB;MACjB,CAAU;AAEX,WAAM,SAAS,QAAQ;AAEvB,YAAO,eAAe,MAAM,OAAO,KAAK,UAAU;MAChD,cAAc;MACd,YAAY;MACZ,OAAO;MACP,UAAU;MACX,CAAC;KAEF,MAAM,aAAa,OAAO,aAAa;MACrC;MACA,YAAY;MACZ,gBAAgB;MACjB,CAAU;AAEX,SAAI,WACF,kBACE,MACA,YACA,OAAO,KAAK,UACZ,KACD;;;;EAMT,SAAS,UAAU,gBAAuC;AACxD,UAAO,qBAAqB,eAAe;;EAG7C,SAAS,cACP,eACA;AACA,0BAAuB,eAAe,UAAU;AAEhD,UAAO,EACL,UAAU,gBAAuC;AAC/C,WAAO,qBAAqB,gBAAgB,cAAc;MAE7D;;AAGH,SAAO;GACL;GACA;GACD;;AAGH,QAAO,OAAO,OAAO,kBAAkB,EACrC,OAAO,aACR,CAAC"}
1
+ {"version":3,"file":"create-error.mjs","names":["implementationWithDefinition: RuntimeImplementation","options"],"sources":["../src/create-error.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\n\nimport type {\n BlueprintContext,\n BlueprintErrorTemplate,\n CreateErrorConfig,\n ErrorFamilyFactory,\n ImplementOptions,\n InvariantInput,\n} from './types.js';\n\ntype RuntimeImplementation = (argument: unknown) => string;\n\ntype ErrorConfigBody<\n Schema extends StandardSchemaV1,\n DataConfig extends CreateErrorConfig<Schema>['data'],\n MessageCallback extends CreateErrorConfig<Schema>['message'],\n> = {\n data: DataConfig;\n message: MessageCallback;\n};\n\ntype ErrorConfigWithProperties<\n Schema extends StandardSchemaV1,\n DataConfig extends CreateErrorConfig<Schema>['data'],\n MessageCallback extends CreateErrorConfig<Schema>['message'],\n Properties extends object,\n> = ErrorConfigBody<Schema, DataConfig, MessageCallback> & {\n properties(context: BlueprintContext<Schema>): Properties;\n};\n\ntype ErrorConfigWithoutProperties<\n Schema extends StandardSchemaV1,\n DataConfig extends CreateErrorConfig<Schema>['data'],\n MessageCallback extends CreateErrorConfig<Schema>['message'],\n> = ErrorConfigBody<Schema, DataConfig, MessageCallback> & {\n properties?: never;\n};\n\ntype ExactCreateErrorConfig<\n Schema extends StandardSchemaV1,\n Config extends object,\n> = {\n definition: Schema;\n} & Config &\n (StandardSchemaV1.InferOutput<Schema> extends object\n ? unknown\n : { definition: never });\n\ntype SerializedCreateErrorConfig<\n Schema extends StandardSchemaV1,\n Config extends object,\n Json,\n> = ExactCreateErrorConfig<\n Schema,\n Config & {\n toJSON(error: BlueprintErrorTemplate<NoInfer<Config>>): Json;\n }\n>;\n\nconst protectedPropertyNames = new Set([\n 'name',\n 'message',\n 'stack',\n 'cause',\n 'constructor',\n 'prototype',\n]);\n\nfunction isObjectLike(value: unknown): value is object {\n return (\n value !== null && (typeof value === 'object' || typeof value === 'function')\n );\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return isObjectLike(value) && typeof Reflect.get(value, 'then') === 'function';\n}\n\nfunction isPlainObject(value: unknown): value is Record<PropertyKey, unknown> {\n if (!isObjectLike(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction includeDefinition(\n argument: unknown,\n definition: object,\n): unknown {\n if (!isPlainObject(argument)) {\n return argument;\n }\n\n return { ...definition, ...argument };\n}\n\nfunction validateStandardSchema(schema: unknown, subject: string) {\n if (!isObjectLike(schema)) {\n throw new TypeError(`${subject} must be a Standard Schema object`);\n }\n\n const standard = Reflect.get(schema, '~standard') as unknown;\n\n if (\n !isObjectLike(standard) ||\n Reflect.get(standard, 'version') !== 1 ||\n typeof Reflect.get(standard, 'vendor') !== 'string' ||\n typeof Reflect.get(standard, 'validate') !== 'function'\n ) {\n throw new TypeError(`${subject} must implement Standard Schema V1`);\n }\n}\n\nfunction validateCallback(value: unknown, subject: string, optional = false) {\n if (optional && value === undefined) {\n return;\n }\n\n if (typeof value !== 'function') {\n throw new TypeError(`${subject} must be a function`);\n }\n}\n\nfunction validateBlueprint(config: CreateErrorConfig<StandardSchemaV1>) {\n validateStandardSchema(config.definition, 'definition');\n\n if (!isObjectLike(config.data)) {\n throw new TypeError('data must be an object');\n }\n\n validateCallback(config.data.resolve, 'data.resolve');\n validateCallback(config.message, 'message');\n validateCallback(config.properties, 'properties', true);\n validateCallback(config.toJSON, 'toJSON', true);\n\n if (\n typeof config.data.property !== 'string' ||\n config.data.property.length === 0\n ) {\n throw new TypeError('data.property must be a non-empty string');\n }\n\n if (protectedPropertyNames.has(config.data.property)) {\n throw new TypeError(\n `data.property cannot overwrite protected property \"${config.data.property}\"`,\n );\n }\n}\n\nfunction formatIssuePath(path: StandardSchemaV1.Issue['path']) {\n if (!path?.length) {\n return '';\n }\n\n const keys = path.map((segment) =>\n typeof segment === 'object' ? segment.key : segment,\n );\n\n return `${keys.map(String).join('.')}: `;\n}\n\nfunction parseSchema<Schema extends StandardSchemaV1>(\n schema: Schema,\n input: StandardSchemaV1.InferInput<Schema>,\n subject: string,\n) {\n const result = schema['~standard'].validate(input);\n\n if (isPromiseLike(result)) {\n throw new TypeError(`${subject} schema validation must be synchronous`);\n }\n\n if (result.issues) {\n const details = result.issues\n .map((issue) => `${formatIssuePath(issue.path)}${issue.message}`)\n .join('; ');\n\n throw new TypeError(`Invalid error ${subject}: ${details}`);\n }\n\n return result.value;\n}\n\nfunction parseDefinition<Schema extends StandardSchemaV1>(\n schema: Schema,\n definition: StandardSchemaV1.InferInput<Schema>,\n) {\n const parsedDefinition = parseSchema(schema, definition, 'definition');\n\n if (!isObjectLike(parsedDefinition)) {\n throw new TypeError('definition schema must produce an object');\n }\n\n return parsedDefinition;\n}\n\nfunction assignProperties(\n error: Error & Record<string, unknown>,\n properties: object,\n dataProperty: string,\n data: unknown,\n) {\n for (const key of Reflect.ownKeys(properties)) {\n if (typeof key === 'string' && protectedPropertyNames.has(key)) {\n throw new TypeError(`Cannot overwrite protected error property \"${key}\"`);\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(properties, key);\n\n if (!descriptor) {\n continue;\n }\n\n if (\n key === dataProperty &&\n (!('value' in descriptor) || descriptor.value !== data)\n ) {\n throw new TypeError(`Cannot overwrite resolved data property \"${dataProperty}\"`);\n }\n\n Object.defineProperty(error, key, descriptor);\n }\n}\n\nfunction throwUnless<Input>(\n ErrorClass: new (input: Input, options?: ErrorOptions) => Error,\n condition: unknown,\n input: InvariantInput<Input>,\n options: ErrorOptions | undefined,\n) {\n if (condition) {\n return;\n }\n\n const resolvedInput =\n typeof input === 'function' ? (input as () => Input)() : (input as Input);\n\n throw new ErrorClass(resolvedInput, options);\n}\n\n/**\n * Throws `ErrorClass` when `condition` is falsy.\n *\n * Works like the static `ErrorClass.invariant`, but can also be used with\n * classes stored in a `const`, where TypeScript does not allow assertion\n * methods. A function can be supplied as `input` to avoid constructing error\n * data unless the invariant fails.\n *\n * @example\n * ```ts\n * const MissingUserError = createRequestError({ code: 'missingUser' })\n * .implement(({ code }) => `${code}: user was not found`);\n *\n * invariant(MissingUserError, user, () => ({ userId }));\n *\n * user.id; // narrowed to the truthy branch\n * ```\n */\nexport function invariant<Condition, Input>(\n ErrorClass: new (input: Input, options?: ErrorOptions) => Error,\n condition: Condition,\n input: InvariantInput<Input>,\n options?: ErrorOptions,\n): asserts condition {\n throwUnless(ErrorClass, condition, input, options);\n}\n\n/**\n * Creates an error family with additional instance properties and typed JSON\n * serialization.\n *\n * @param config Defines the family, its public properties, and its serialized\n * representation.\n * @returns A callable factory with a shared `.Error` base class.\n *\n * @example\n * ```ts\n * const createApiError = createError({\n * definition: z.object({ code: z.string() }),\n * data: {\n * property: 'context',\n * resolve: ({ input }) => input,\n * },\n * message: ({ data, implementation }) => implementation(data),\n * properties: ({ definition }) => ({ code: definition.code }),\n * toJSON: (error) => ({\n * code: error.code,\n * context: error.context,\n * message: error.message,\n * }),\n * });\n * ```\n */\nexport function createError<\n const Schema extends StandardSchemaV1,\n const DataConfig extends CreateErrorConfig<Schema>['data'],\n const MessageCallback extends CreateErrorConfig<Schema>['message'],\n const Properties extends object,\n Json,\n>(\n config: SerializedCreateErrorConfig<\n Schema,\n ErrorConfigWithProperties<\n Schema,\n DataConfig,\n MessageCallback,\n Properties\n >,\n Json\n >,\n): ErrorFamilyFactory<Schema, typeof config>;\n\n/**\n * Creates an error family with typed JSON serialization and no additional\n * instance properties.\n *\n * @param config Defines the family and its serialized representation.\n * @returns A callable factory with a shared `.Error` base class.\n *\n * @example\n * ```ts\n * const createLogError = createError({\n * definition: z.object({ code: z.string() }),\n * data: {\n * property: 'details',\n * resolve: ({ input }) => input,\n * },\n * message: ({ data, implementation }) => implementation(data),\n * toJSON: (error) => ({\n * details: error.details,\n * message: error.message,\n * }),\n * });\n * ```\n */\nexport function createError<\n const Schema extends StandardSchemaV1,\n const DataConfig extends CreateErrorConfig<Schema>['data'],\n const MessageCallback extends CreateErrorConfig<Schema>['message'],\n Json,\n>(\n config: SerializedCreateErrorConfig<\n Schema,\n ErrorConfigWithoutProperties<Schema, DataConfig, MessageCallback>,\n Json\n >,\n): ErrorFamilyFactory<Schema, typeof config>;\n\n/**\n * Creates a configurable family of strongly typed error classes.\n *\n * Callback execution order is `data.resolve`, optional context validation,\n * `message`, then `properties`. Parsed definition output and constructor data\n * are inferred without explicit generic arguments or `as const`.\n *\n * @param config Defines the family's schema, data lifecycle, message, and\n * optional public properties.\n * @returns A callable factory with a shared `.Error` base class.\n *\n * @example\n * ```ts\n * const createRequestError = createError({\n * definition: z.object({ code: z.string() }),\n * data: {\n * property: 'context',\n * resolve: ({ input }) => input,\n * },\n * message: ({ data, implementation }) => implementation(data),\n * properties: ({ definition }) => ({ code: definition.code }),\n * });\n * ```\n */\nexport function createError<\n const Schema extends StandardSchemaV1,\n const Config extends Omit<CreateErrorConfig<Schema>, 'definition'>,\n>(\n config: ExactCreateErrorConfig<Schema, Config>,\n): ErrorFamilyFactory<Schema, typeof config>;\nexport function createError<\n const Schema extends StandardSchemaV1,\n const Config extends Omit<CreateErrorConfig<Schema>, 'definition'>,\n>(\n config: ExactCreateErrorConfig<Schema, Config>,\n): ErrorFamilyFactory<Schema, typeof config> {\n validateBlueprint(config as CreateErrorConfig<StandardSchemaV1>);\n\n class FamilyError extends Error {\n static invariant<Condition, Input>(\n this: new (input: Input, options?: ErrorOptions) => Error,\n condition: Condition,\n input: InvariantInput<Input>,\n options?: ErrorOptions,\n ): asserts condition {\n throwUnless(this, condition, input, options);\n }\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n const name = new.target.name;\n if (name) {\n this.name = name;\n }\n }\n }\n\n if (config.toJSON) {\n Object.defineProperty(FamilyError.prototype, 'toJSON', {\n configurable: true,\n value: function toJSON(this: Error & Record<string, unknown>) {\n return config.toJSON?.(this as never);\n },\n writable: true,\n });\n }\n\n function createDefinition<\n const Definition extends StandardSchemaV1.InferInput<Schema>,\n >(definition: Definition) {\n const parsedDefinition = parseDefinition(config.definition, definition);\n\n function createImplementation(\n implementation: RuntimeImplementation,\n options: ImplementOptions | undefined,\n contextSchema?: StandardSchemaV1,\n ) {\n validateCallback(implementation, 'implementation');\n\n const name = options?.name;\n\n if (name !== undefined && (typeof name !== 'string' || name.length === 0)) {\n throw new TypeError('name must be a non-empty string');\n }\n\n const ImplementedError = class extends FamilyError {\n constructor(input: unknown, options?: ErrorOptions) {\n const resolvedData = config.data.resolve({\n definition: parsedDefinition,\n input,\n } as never);\n const data = contextSchema\n ? parseSchema(contextSchema, resolvedData, 'context')\n : resolvedData;\n const implementationWithDefinition: RuntimeImplementation = (\n argument,\n ) =>\n implementation(\n argument === data\n ? argument\n : includeDefinition(argument, parsedDefinition),\n );\n const message = config.message({\n data,\n definition: parsedDefinition,\n implementation: implementationWithDefinition,\n } as never);\n\n super(message, options);\n\n Object.defineProperty(this, config.data.property, {\n configurable: true,\n enumerable: true,\n value: data,\n writable: true,\n });\n\n const properties = config.properties?.({\n data,\n definition: parsedDefinition,\n implementation: implementationWithDefinition,\n } as never);\n\n if (properties) {\n assignProperties(\n this as Error & Record<string, unknown>,\n properties,\n config.data.property,\n data,\n );\n }\n }\n };\n\n // Replace the name inferred from the local binding; unnamed classes fall\n // back to the native \"Error\" name.\n Object.defineProperty(ImplementedError, 'name', {\n configurable: true,\n value: name ?? '',\n });\n\n return ImplementedError;\n }\n\n function implement(\n implementation: RuntimeImplementation,\n options?: ImplementOptions,\n ) {\n return createImplementation(implementation, options);\n }\n\n function defineContext<ContextSchema extends StandardSchemaV1>(\n contextSchema: ContextSchema,\n ) {\n validateStandardSchema(contextSchema, 'context');\n\n return {\n implement(\n implementation: RuntimeImplementation,\n options?: ImplementOptions,\n ) {\n return createImplementation(implementation, options, contextSchema);\n },\n };\n }\n\n return {\n defineContext,\n implement,\n };\n }\n\n return Object.assign(createDefinition, {\n Error: FamilyError,\n is: (value: unknown) => value instanceof FamilyError,\n }) as unknown as ErrorFamilyFactory<Schema, typeof config>;\n}\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,3 +1,4 @@
1
1
  const require_create_error = require('./create-error.cjs');
2
2
 
3
- exports.createError = require_create_error.createError;
3
+ exports.createError = require_create_error.createError;
4
+ exports.invariant = require_create_error.invariant;
package/dist/index.d.cts CHANGED
@@ -1,3 +1,3 @@
1
- import { CreateErrorConfig } from "./types.cjs";
2
- import { createError } from "./create-error.cjs";
3
- export { type CreateErrorConfig, createError };
1
+ import { CreateErrorConfig, ImplementOptions, InvariantInput } from "./types.cjs";
2
+ import { createError, invariant } from "./create-error.cjs";
3
+ export { type CreateErrorConfig, type ImplementOptions, type InvariantInput, createError, invariant };
package/dist/index.d.mts CHANGED
@@ -1,3 +1,3 @@
1
- import { CreateErrorConfig } from "./types.mjs";
2
- import { createError } from "./create-error.mjs";
3
- export { type CreateErrorConfig, createError };
1
+ import { CreateErrorConfig, ImplementOptions, InvariantInput } from "./types.mjs";
2
+ import { createError, invariant } from "./create-error.mjs";
3
+ export { type CreateErrorConfig, type ImplementOptions, type InvariantInput, createError, invariant };
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { createError } from "./create-error.mjs";
1
+ import { createError, invariant } from "./create-error.mjs";
2
2
 
3
- export { createError };
3
+ export { createError, invariant };