@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.
- package/README.md +353 -294
- package/dist/create-error.cjs +60 -13
- package/dist/create-error.cjs.map +1 -1
- package/dist/create-error.d.cts +21 -2
- package/dist/create-error.d.cts.map +1 -1
- package/dist/create-error.d.mts +21 -2
- package/dist/create-error.d.mts.map +1 -1
- package/dist/create-error.mjs +60 -14
- package/dist/create-error.mjs.map +1 -1
- package/dist/index.cjs +2 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +2 -2
- package/dist/types.d.cts +67 -10
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +67 -10
- package/dist/types.d.mts.map +1 -1
- package/package.json +69 -70
package/dist/create-error.cjs
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
88
|
-
|
|
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, {
|
|
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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"}
|
package/dist/create-error.d.cts
CHANGED
|
@@ -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":";;;;
|
|
1
|
+
{"version":3,"file":"create-error.d.cts","names":[],"sources":["../src/create-error.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/create-error.d.mts
CHANGED
|
@@ -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":";;;;
|
|
1
|
+
{"version":3,"file":"create-error.d.mts","names":[],"sources":["../src/create-error.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/create-error.mjs
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
87
|
-
|
|
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, {
|
|
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":"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"}
|
|
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
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 };
|