UNPKG

conway-errors

Version:

A convenient primitive for creating, structing and throwing errors

1 lines 11.6 kB
{"version":3,"file":"index.modern.mjs","sources":["../index.ts"],"sourcesContent":["/**\n * Root interface for any specific error type.\n */\nexport interface IConwayError extends Error {\n rootContext: string;\n contextsChunk: string;\n feature: string;\n originalError?: OriginalError;\n extendedParams?: ExtendedParams;\n\n emit: EmitFn;\n}\n\nclass ConwayError extends Error implements IConwayError {\n readonly rootContext: string;\n readonly contextsChunk: string;\n readonly originalError?: OriginalError;\n readonly extendedParams?: ExtendedParams;\n\n feature = \"\";\n\n constructor(\n name: string,\n rootContext: string,\n contextsChunk: string,\n message: string,\n emit: EmitFn,\n originalError?: OriginalError,\n extendedParams?: ExtendedParams\n ) {\n super(message);\n this.name = name;\n this.rootContext = rootContext;\n this.contextsChunk = contextsChunk;\n this.originalError = originalError;\n this.emit = emit;\n this.extendedParams = extendedParams;\n }\n\n emit: EmitFn;\n}\n\ntype EmitFn = (extendedParams?: ExtendedParams) => void;\n\n/**\n * Type guard which helps to understand if error is Conway error.\n * @param error\n * @return {boolean}\n */\nexport function isConwayError(error: unknown): error is IConwayError {\n return typeof error === \"object\" && error instanceof ConwayError;\n}\n\nfunction createErrorClass(name: string, rootContext: string) {\n return class extends ConwayError {\n constructor(\n contextsChunk: string,\n message: string,\n emit: EmitFn,\n originalError?: OriginalError,\n extendedParams?: ExtendedParams\n ) {\n super(name, rootContext, contextsChunk, message, emit, originalError, extendedParams);\n }\n };\n}\n\nfunction createContextedMessage(contextPath: string, featureName: string, message: string) {\n return `${contextPath}/${featureName}: ${message}`;\n}\n\nfunction defaultHandleEmit(err: IConwayError) {\n console.error(err);\n}\n\ntype ExtendedParams = Record<string, unknown>;\n\ntype OriginalError = Error | Record<string, unknown> | unknown;\n\ninterface CreateErrorOptions {\n handleEmit?: (err: IConwayError, extendedParams?: ExtendedParams) => void;\n extendedParams?: ExtendedParams;\n}\n\nconst defaultErrorOptions: CreateErrorOptions = {\n handleEmit: defaultHandleEmit,\n extendedParams: {},\n};\n\ntype ErrorTypeConfig = ReadonlyArray<{\n errorType: string;\n createMessagePostfix?: (originalError?: OriginalError) => string;\n}>;\n\ntype ErrorMap = Record<\n string,\n {\n errorClass: ReturnType<typeof createErrorClass>;\n createMessagePostfix?: (originalError?: OriginalError) => string;\n }\n>;\n\ntype ErrorFnOptions = {\n originalError?: OriginalError;\n extendedParams?: ExtendedParams;\n};\n\ntype CreateErrorFn<ErrorType extends string> = (\n errorType: ErrorType,\n message: string,\n options?: ErrorFnOptions\n) => IConwayError;\n\ntype Brand<T, B> = T & { __brand: B };\n\ntype ErrorSubcontext<Name extends string, ErrorType extends string> = Brand<Subcontext<Name, ErrorType>, Name>;\ntype ErrorFeature<Name extends string, ErrorType extends string> = Brand<CreateErrorFn<ErrorType>, Name>;\nexport type AnyFeatureOfSubcontext<S> = S extends ErrorSubcontext<infer Name, infer ErrorType>\n ? ErrorFeature<`${Name}/${string}`, ErrorType>\n : never;\n\ntype Subcontext<Name extends string, ErrorType extends string> = {\n /**\n * Create a child context within the current context.\n *\n * @param {string} childContextName - The name of the child context.\n * @param {ExtendedParams} extendedParams - Additional extended parameters for the child context.\n * @return {Function} Function to create an error context with the specified child context name and extended params.\n */\n subcontext: <const ChildContextName extends string>(\n subcontextName: ChildContextName,\n extendedParams?: ExtendedParams\n ) => ErrorSubcontext<`${Name}/${ChildContextName}`, ErrorType>;\n /**\n * Creates a child feature within the current context.\n *\n * @param {string} childFeatureName - The name of the child feature.\n * @param {ExtendedParams} [extendedParams={}] - Additional extended parameters for the child feature.\n * @return {Function} The created error feature.\n */\n feature: <const FeatureName extends string>(\n featureName: FeatureName,\n featureContextExtendedParams?: ExtendedParams\n ) => ErrorFeature<`${Name}/${FeatureName}`, ErrorType>;\n};\n\n/**\n * Function to create an error context with specified error types and options.\n *\n * @param {ErrorTypeConfig} errorTypes - Array of error types and optional message postfix creation functions.\n * @param {CreateErrorOptions} options - Options for error creation, including custom throw function and extended params.\n * @return {Function} Function to create an error context with specific context name and extended params.\n */\nexport function createError<ErrorTypes extends ErrorTypeConfig>(errorTypes?: ErrorTypes, options?: CreateErrorOptions) {\n const _options = { ...defaultErrorOptions, ...options };\n const initialExtendedParams = options?.extendedParams ?? {};\n\n return <const ContextName extends string>(contextName: ContextName, extendedParams: ExtendedParams = {}) => {\n const outerExtendedParams = { ...initialExtendedParams, ...extendedParams };\n\n const errorsMap: ErrorMap = Array.isArray(errorTypes)\n ? errorTypes.reduce<ErrorMap>((acc, { errorType, createMessagePostfix }) => {\n acc[errorType] = {\n errorClass: createErrorClass(errorType, contextName),\n createMessagePostfix,\n };\n return acc;\n }, {})\n : {};\n\n const UnknownError = createErrorClass(\"UnknownError\", contextName);\n\n const _createSubcontext =\n <const ContextName extends string>(contextName: ContextName, subContextExtendedParams: ExtendedParams) =>\n <const ChildContextName extends string>(\n childContextName: ChildContextName,\n extendedParams: ExtendedParams = {}\n ) => {\n const subErrorContext = { ...subContextExtendedParams, ...extendedParams };\n return _createErrorContext(`${contextName}/${childContextName}`, subErrorContext);\n };\n\n function _createErrorContext<const ContextName extends string>(\n _contextName: ContextName,\n contextExtendedParams: ExtendedParams = outerExtendedParams\n ): ErrorSubcontext<ContextName, ErrorTypes[number][\"errorType\"]> {\n return {\n __brand: _contextName,\n subcontext: _createSubcontext(_contextName, contextExtendedParams),\n feature: <const FeatureName extends string>(\n childFeatureName: FeatureName,\n extendedParams: ExtendedParams = {}\n ) => {\n const featureErrorContext = { ...contextExtendedParams, ...extendedParams };\n return _createErrorFeature(childFeatureName, _contextName, featureErrorContext);\n },\n };\n }\n\n function _createErrorFeature<const ContextName extends string, const FeatureName extends string>(\n featureName: FeatureName,\n contextName: ContextName,\n featureContextExtendedParams: ExtendedParams = {}\n ): ErrorFeature<`${ContextName}/${FeatureName}`, ErrorTypes[number][\"errorType\"]> {\n const createNewErrorObject: CreateErrorFn<ErrorTypes[number][\"errorType\"]> = (\n errorType,\n message: string,\n options?: ErrorFnOptions\n ) => {\n const errorMapItem = errorsMap[errorType];\n const messagePostfix =\n options?.originalError && errorMapItem?.createMessagePostfix\n ? errorMapItem.createMessagePostfix(options?.originalError)\n : \"\";\n\n const emit: EmitFn = (extendedParams = {}) => {\n const _extendedParams = { ...featureContextExtendedParams, ...options?.extendedParams, ...extendedParams };\n _options.handleEmit?.(error, _extendedParams);\n };\n\n const error = new (errorMapItem?.errorClass ?? UnknownError)(\n contextName,\n createContextedMessage(contextName, featureName, message + messagePostfix),\n emit,\n options?.originalError,\n options?.extendedParams\n );\n\n error.feature = featureName;\n\n return error;\n };\n\n Object.assign(createNewErrorObject, { __brand: `${contextName}/${featureName}` as const });\n return createNewErrorObject as ErrorFeature<`${ContextName}/${FeatureName}`, ErrorTypes[number][\"errorType\"]>;\n }\n\n return _createErrorContext(contextName);\n };\n}\n"],"names":["ConwayError","Error","constructor","name","rootContext","contextsChunk","message","emit","originalError","extendedParams","super","this","feature","isConwayError","error","createErrorClass","defaultErrorOptions","handleEmit","err","console","createError","errorTypes","options","_options$extendedPara","_options","_extends","initialExtendedParams","contextName","outerExtendedParams","errorsMap","Array","isArray","reduce","acc","errorType","createMessagePostfix","errorClass","UnknownError","_createSubcontext","subContextExtendedParams","childContextName","subErrorContext","_createErrorContext","_contextName","contextExtendedParams","__brand","subcontext","childFeatureName","featureErrorContext","featureName","featureContextExtendedParams","createNewErrorObject","_errorMapItem$errorCl","errorMapItem","messagePostfix","contextPath","createContextedMessage","_extendedParams","Object","assign","_createErrorFeature"],"mappings":"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"}