@prismicio/plugin-kit 0.0.3-beta.15 → 0.0.3-beta.16
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/dist/fs/lib/fsLimit.js
CHANGED
|
@@ -4,7 +4,7 @@ const SM_FS_LIMIT = Number.isNaN(Number(process.env.SM_FS_LIMIT)) ? void 0 : Num
|
|
|
4
4
|
const CONCURRENT_FILE_DESCRIPTORS_LIMIT = SM_FS_LIMIT ?? 1024;
|
|
5
5
|
const fsLimit = pLimit(CONCURRENT_FILE_DESCRIPTORS_LIMIT);
|
|
6
6
|
const wrapWithFSLimit = (fn) => {
|
|
7
|
-
return (...args) => fsLimit(() => fn(...args));
|
|
7
|
+
return ((...args) => fsLimit(() => fn(...args)));
|
|
8
8
|
};
|
|
9
9
|
const access = wrapWithFSLimit(fs.access);
|
|
10
10
|
const mkdir = wrapWithFSLimit(fs.mkdir);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fsLimit.js","sources":["../../../../src/fs/lib/fsLimit.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\n\nimport pLimit from \"p-limit\";\n\n/**\n * The parsed number value of the SM_FS_LIMIT environment variable.\n */\nconst SM_FS_LIMIT = Number.isNaN(Number(process.env.SM_FS_LIMIT))\n\t? undefined\n\t: Number(process.env.SM_FS_LIMIT);\n\n/**\n * The maximum number of concurrent file descriptors allowed to adapters to\n * minimize issues like `EMFILE: too many open files`.\n *\n * - MacOS default limit: 2560 (recent), 256 (old)\n * - Windows limit (per process): 2048\n */\nconst CONCURRENT_FILE_DESCRIPTORS_LIMIT = SM_FS_LIMIT ?? 1024;\n\n/**\n * Limit concurrent file descriptors for adapters.\n */\nconst fsLimit = pLimit(CONCURRENT_FILE_DESCRIPTORS_LIMIT);\n\n/**\n * Wrap a function with `fsLimit()` to limit concurrent calls. All functions\n * called with `wrapWithFSLimit()` share the same queue.\n *\n * @param fn - The function to wrap.\n *\n * @returns The wrapped function.\n */\nconst wrapWithFSLimit = <\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tTFn extends (...args: any[]) => any,\n>(\n\tfn: TFn,\n): TFn => {\n\treturn ((...args) => fsLimit(() => fn(...args))) as TFn;\n};\n\nexport const access = wrapWithFSLimit(fs.access);\nexport const appendFile = wrapWithFSLimit(fs.appendFile);\nexport const chmod = wrapWithFSLimit(fs.chmod);\nexport const chown = wrapWithFSLimit(fs.chown);\nexport const copyFile = wrapWithFSLimit(fs.copyFile);\nexport const cp = wrapWithFSLimit(fs.cp);\nexport const lchmod = wrapWithFSLimit(fs.lchmod);\nexport const lchown = wrapWithFSLimit(fs.lchown);\nexport const link = wrapWithFSLimit(fs.link);\nexport const lstat = wrapWithFSLimit(fs.lstat);\nexport const lutimes = wrapWithFSLimit(fs.lutimes);\nexport const mkdir = wrapWithFSLimit(fs.mkdir);\nexport const mkdtemp = wrapWithFSLimit(fs.mkdtemp);\nexport const open = wrapWithFSLimit(fs.open);\nexport const opendir = wrapWithFSLimit(fs.opendir);\nexport const readFile = wrapWithFSLimit(fs.readFile);\nexport const readdir = wrapWithFSLimit(fs.readdir);\nexport const readlink = wrapWithFSLimit(fs.readlink);\nexport const realpath = wrapWithFSLimit(fs.realpath);\nexport const rename = wrapWithFSLimit(fs.rename);\nexport const rm = wrapWithFSLimit(fs.rm);\nexport const rmdir = wrapWithFSLimit(fs.rmdir);\nexport const stat = wrapWithFSLimit(fs.stat);\nexport const statfs = wrapWithFSLimit(fs.statfs);\nexport const symlink = wrapWithFSLimit(fs.symlink);\nexport const truncate = wrapWithFSLimit(fs.truncate);\nexport const unlink = wrapWithFSLimit(fs.unlink);\nexport const utimes = wrapWithFSLimit(fs.utimes);\nexport const watch = wrapWithFSLimit(fs.watch);\nexport const writeFile = wrapWithFSLimit(fs.writeFile);\n"],"names":[],"mappings":";;AAOA,MAAM,cAAc,OAAO,MAAM,OAAO,QAAQ,IAAI,WAAW,CAAC,IAC7D,SACA,OAAO,QAAQ,IAAI,WAAW;AASjC,MAAM,oCAAoC,eAAe;AAKzD,MAAM,UAAU,OAAO,iCAAiC;AAUxD,MAAM,kBAAkB,CAIvB,OACQ;AACR,
|
|
1
|
+
{"version":3,"file":"fsLimit.js","sources":["../../../../src/fs/lib/fsLimit.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\n\nimport pLimit from \"p-limit\";\n\n/**\n * The parsed number value of the SM_FS_LIMIT environment variable.\n */\nconst SM_FS_LIMIT = Number.isNaN(Number(process.env.SM_FS_LIMIT))\n\t? undefined\n\t: Number(process.env.SM_FS_LIMIT);\n\n/**\n * The maximum number of concurrent file descriptors allowed to adapters to\n * minimize issues like `EMFILE: too many open files`.\n *\n * - MacOS default limit: 2560 (recent), 256 (old)\n * - Windows limit (per process): 2048\n */\nconst CONCURRENT_FILE_DESCRIPTORS_LIMIT = SM_FS_LIMIT ?? 1024;\n\n/**\n * Limit concurrent file descriptors for adapters.\n */\nconst fsLimit = pLimit(CONCURRENT_FILE_DESCRIPTORS_LIMIT);\n\n/**\n * Wrap a function with `fsLimit()` to limit concurrent calls. All functions\n * called with `wrapWithFSLimit()` share the same queue.\n *\n * @param fn - The function to wrap.\n *\n * @returns The wrapped function.\n */\nconst wrapWithFSLimit = <\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tTFn extends (...args: any[]) => any,\n>(\n\tfn: TFn,\n): TFn => {\n\treturn ((...args) => fsLimit(() => fn(...args))) as TFn;\n};\n\nexport const access = wrapWithFSLimit(fs.access);\nexport const appendFile = wrapWithFSLimit(fs.appendFile);\nexport const chmod = wrapWithFSLimit(fs.chmod);\nexport const chown = wrapWithFSLimit(fs.chown);\nexport const copyFile = wrapWithFSLimit(fs.copyFile);\nexport const cp = wrapWithFSLimit(fs.cp);\nexport const lchmod = wrapWithFSLimit(fs.lchmod);\nexport const lchown = wrapWithFSLimit(fs.lchown);\nexport const link = wrapWithFSLimit(fs.link);\nexport const lstat = wrapWithFSLimit(fs.lstat);\nexport const lutimes = wrapWithFSLimit(fs.lutimes);\nexport const mkdir = wrapWithFSLimit(fs.mkdir);\nexport const mkdtemp = wrapWithFSLimit(fs.mkdtemp);\nexport const open = wrapWithFSLimit(fs.open);\nexport const opendir = wrapWithFSLimit(fs.opendir);\nexport const readFile = wrapWithFSLimit(fs.readFile);\nexport const readdir = wrapWithFSLimit(fs.readdir);\nexport const readlink = wrapWithFSLimit(fs.readlink);\nexport const realpath = wrapWithFSLimit(fs.realpath);\nexport const rename = wrapWithFSLimit(fs.rename);\nexport const rm = wrapWithFSLimit(fs.rm);\nexport const rmdir = wrapWithFSLimit(fs.rmdir);\nexport const stat = wrapWithFSLimit(fs.stat);\nexport const statfs = wrapWithFSLimit(fs.statfs);\nexport const symlink = wrapWithFSLimit(fs.symlink);\nexport const truncate = wrapWithFSLimit(fs.truncate);\nexport const unlink = wrapWithFSLimit(fs.unlink);\nexport const utimes = wrapWithFSLimit(fs.utimes);\nexport const watch = wrapWithFSLimit(fs.watch);\nexport const writeFile = wrapWithFSLimit(fs.writeFile);\n"],"names":[],"mappings":";;AAOA,MAAM,cAAc,OAAO,MAAM,OAAO,QAAQ,IAAI,WAAW,CAAC,IAC7D,SACA,OAAO,QAAQ,IAAI,WAAW;AASjC,MAAM,oCAAoC,eAAe;AAKzD,MAAM,UAAU,OAAO,iCAAiC;AAUxD,MAAM,kBAAkB,CAIvB,OACQ;AACR,UAAQ,IAAI,SAAS,QAAQ,MAAM,GAAG,GAAG,IAAI,CAAC;AAC/C;AAEO,MAAM,SAAS,gBAAgB,GAAG,MAAM;AAWxC,MAAM,QAAQ,gBAAgB,GAAG,KAAK;AAItC,MAAM,WAAW,gBAAgB,GAAG,QAAQ;AAC5C,MAAM,UAAU,gBAAgB,GAAG,OAAO;AAI1C,MAAM,KAAK,gBAAgB,GAAG,EAAE;AAShC,MAAM,YAAY,gBAAgB,GAAG,SAAS;"}
|
package/dist/lib/HookSystem.js
CHANGED
|
@@ -93,9 +93,9 @@ class HookSystem {
|
|
|
93
93
|
createScope(owner, extraArgs) {
|
|
94
94
|
return {
|
|
95
95
|
hook: (type, hookFn, ...[meta]) => {
|
|
96
|
-
const internalHook = (...args) => {
|
|
96
|
+
const internalHook = ((...args) => {
|
|
97
97
|
return hookFn(...args, ...extraArgs);
|
|
98
|
-
};
|
|
98
|
+
});
|
|
99
99
|
const resolvedMeta = {
|
|
100
100
|
...meta,
|
|
101
101
|
external: hookFn
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HookSystem.js","sources":["../../../src/lib/HookSystem.ts"],"sourcesContent":["/**\n * Extends a function arguments with extra ones.\n */\ntype FnWithExtraArgs<\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tF extends (...args: any[]) => any,\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tTExtraArgs extends any[] = any[],\n> = (\n\t...args: [...args: Parameters<F>, ...extraArgs: TExtraArgs]\n) => ReturnType<F>;\n\n/**\n * Defines a hook handler.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type HookFn<TArgs extends any[] = any[], TReturn = any> = (\n\t...args: TArgs\n) => Promise<TReturn> | TReturn;\n\n/**\n * Generic hook metadata.\n */\ntype HookMeta = Record<string, unknown>;\n\n/**\n * Defines a hook, including its function handler and optional metadata.\n */\nexport type Hook<\n\tTHookFn extends HookFn = HookFn,\n\tTHookMeta extends HookMeta = HookMeta,\n> = {\n\tfn: THookFn;\n\tmeta?: THookMeta;\n};\n\n/**\n * Represents a map of hook types to hook functions and metas.\n */\ntype Hooks = Record<string, Hook>;\n\n/**\n * Builds hook meta arguments after hook meta requirements.\n */\ntype HookMetaArg<THookMeta extends Record<string, unknown> | undefined> =\n\tTHookMeta extends Record<string, unknown>\n\t\t? [meta: THookMeta]\n\t\t: [meta?: never];\n\n/**\n * Defines the return type of the {@link HookSystem.callHook} functions.\n *\n * @internal\n */\nexport type CallHookReturnType<THookFn extends HookFn = HookFn> = Promise<{\n\tdata: Awaited<ReturnType<THookFn>>[];\n\terrors: HookError[];\n}>;\n\n/**\n * Defines the return type of the {@link HookSystem.createScope} functions.\n *\n * @internal\n */\nexport type CreateScopeReturnType<\n\tTHooks extends Hooks = Record<string, { fn: HookFn }>,\n\tTExtraArgs extends unknown[] = never[],\n> = {\n\thook: <TType extends keyof THooks>(\n\t\ttype: TType,\n\t\thookFn: FnWithExtraArgs<THooks[TType][\"fn\"], TExtraArgs>,\n\t\t...[meta]: HookMetaArg<THooks[TType][\"meta\"]>\n\t) => void;\n\tunhook: HookSystem<{\n\t\t[P in keyof THooks]: Omit<THooks[P], \"fn\"> & {\n\t\t\tfn: FnWithExtraArgs<THooks[P][\"fn\"], TExtraArgs>;\n\t\t};\n\t}>[\"unhook\"];\n};\n\ntype RegisteredHookMeta = {\n\tid: string;\n\ttype: string;\n\towner: string;\n\texternal?: HookFn;\n};\n\n/**\n * Represents a registered hook.\n */\ntype RegisteredHook<THook extends Hook = Hook> = {\n\tfn: THook[\"fn\"];\n\tmeta: THook[\"meta\"] extends Record<string, unknown>\n\t\t? RegisteredHookMeta & THook[\"meta\"]\n\t\t: RegisteredHookMeta;\n};\n\nexport class HookError<TError = Error | unknown> extends Error {\n\ttype: string;\n\towner: string;\n\trawMeta: RegisteredHookMeta;\n\trawCause: TError;\n\n\tconstructor(meta: RegisteredHookMeta, cause: TError) {\n\t\tsuper(\n\t\t\t`Error in \\`${meta.owner}\\` during \\`${meta.type}\\` hook: ${\n\t\t\t\tcause instanceof Error ? cause.message : String(cause)\n\t\t\t}`,\n\t\t);\n\n\t\tthis.type = meta.type;\n\t\tthis.owner = meta.owner;\n\t\tthis.rawMeta = meta;\n\t\tthis.rawCause = cause;\n\t\tthis.cause = cause instanceof Error ? cause : undefined;\n\t}\n}\n\nconst uuid = (): string => {\n\treturn (++uuid.i).toString();\n};\nuuid.i = 0;\n\n/**\n * @internal\n */\nexport class HookSystem<THooks extends Hooks = Hooks> {\n\tprivate _registeredHooks: {\n\t\t[K in keyof THooks]?: RegisteredHook<THooks[K]>[];\n\t} = {};\n\n\thook<TType extends keyof THooks>(\n\t\towner: string,\n\t\ttype: TType,\n\t\thookFn: THooks[TType][\"fn\"],\n\t\t...[meta]: HookMetaArg<THooks[TType][\"meta\"]>\n\t): void {\n\t\tconst registeredHook = {\n\t\t\tfn: hookFn,\n\t\t\tmeta: {\n\t\t\t\t...meta,\n\t\t\t\towner,\n\t\t\t\ttype,\n\t\t\t\tid: uuid(),\n\t\t\t},\n\t\t} as RegisteredHook<THooks[TType]>;\n\n\t\tconst registeredHooksForType = this._registeredHooks[type];\n\n\t\tif (registeredHooksForType) {\n\t\t\tregisteredHooksForType.push(registeredHook);\n\t\t} else {\n\t\t\tthis._registeredHooks[type] = [registeredHook];\n\t\t}\n\t}\n\n\tunhook<TType extends keyof THooks>(\n\t\ttype: TType,\n\t\thookFn: THooks[TType][\"fn\"],\n\t): void {\n\t\tthis._registeredHooks[type] = this._registeredHooks[type]?.filter(\n\t\t\t(registeredHook) => registeredHook.fn !== hookFn,\n\t\t);\n\t}\n\n\tasync callHook<TType extends Extract<keyof THooks, string>>(\n\t\ttypeOrTypeAndHookID: TType | { type: TType; hookID: string },\n\t\t...args: Parameters<THooks[TType][\"fn\"]>\n\t): CallHookReturnType<THooks[TType][\"fn\"]> {\n\t\tlet hooks: RegisteredHook<THooks[TType]>[];\n\n\t\tif (typeof typeOrTypeAndHookID === \"string\") {\n\t\t\thooks = this._registeredHooks[typeOrTypeAndHookID] ?? [];\n\t\t} else {\n\t\t\tconst hookForID = this._registeredHooks[typeOrTypeAndHookID.type]?.find(\n\t\t\t\t(hook) => hook.meta.id === typeOrTypeAndHookID.hookID,\n\t\t\t);\n\n\t\t\tif (hookForID) {\n\t\t\t\thooks = [hookForID];\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Hook of type \\`${typeOrTypeAndHookID.type}\\` with ID \\`${typeOrTypeAndHookID.hookID}\\` not found.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst promises = hooks.map(async (hook) => {\n\t\t\ttry {\n\t\t\t\treturn await hook.fn(...args);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new HookError(hook.meta, error);\n\t\t\t}\n\t\t});\n\n\t\tconst settledPromises = await Promise.allSettled(promises);\n\n\t\treturn settledPromises.reduce<{\n\t\t\tdata: Awaited<ReturnType<THooks[TType][\"fn\"]>>[];\n\t\t\terrors: HookError[];\n\t\t}>(\n\t\t\t(acc, settledPromise) => {\n\t\t\t\tif (settledPromise.status === \"fulfilled\") {\n\t\t\t\t\tacc.data.push(settledPromise.value);\n\t\t\t\t} else {\n\t\t\t\t\tacc.errors.push(settledPromise.reason);\n\t\t\t\t}\n\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{ data: [], errors: [] },\n\t\t);\n\t}\n\n\t/**\n\t * Returns list of hooks for a given owner\n\t */\n\thooksForOwner(owner: string): RegisteredHook<THooks[string]>[] {\n\t\tconst hooks: RegisteredHook<THooks[string]>[] = [];\n\n\t\tfor (const hookType in this._registeredHooks) {\n\t\t\tconst registeredHooks = this._registeredHooks[hookType];\n\n\t\t\tif (Array.isArray(registeredHooks)) {\n\t\t\t\tfor (const registeredHook of registeredHooks) {\n\t\t\t\t\tif (registeredHook.meta.owner === owner) {\n\t\t\t\t\t\thooks.push(registeredHook);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn hooks;\n\t}\n\n\t/**\n\t * Returns list of hooks for a given type\n\t */\n\thooksForType<TType extends keyof THooks>(\n\t\ttype: TType,\n\t): RegisteredHook<THooks[TType]>[] {\n\t\treturn this._registeredHooks[type] ?? [];\n\t}\n\n\tcreateScope<TExtraArgs extends unknown[] = never[]>(\n\t\towner: string,\n\t\textraArgs: [...TExtraArgs],\n\t): CreateScopeReturnType<THooks, TExtraArgs> {\n\t\treturn {\n\t\t\thook: (type, hookFn, ...[meta]) => {\n\t\t\t\tconst internalHook = ((\n\t\t\t\t\t...args: Parameters<THooks[typeof type][\"fn\"]>\n\t\t\t\t) => {\n\t\t\t\t\treturn hookFn(...args, ...extraArgs);\n\t\t\t\t}) as THooks[typeof type][\"fn\"];\n\n\t\t\t\tconst resolvedMeta = {\n\t\t\t\t\t...meta,\n\t\t\t\t\texternal: hookFn,\n\t\t\t\t} as HookMetaArg<THooks[typeof type][\"meta\"]>[0];\n\n\t\t\t\treturn this.hook(\n\t\t\t\t\towner,\n\t\t\t\t\ttype,\n\t\t\t\t\tinternalHook,\n\t\t\t\t\t// @ts-expect-error - TypeScript fails to assert rest argument.\n\t\t\t\t\tresolvedMeta,\n\t\t\t\t);\n\t\t\t},\n\t\t\tunhook: (type, hookFn) => {\n\t\t\t\tthis._registeredHooks[type] = this._registeredHooks[type]?.filter(\n\t\t\t\t\t(registeredHook) => registeredHook.meta.external !== hookFn,\n\t\t\t\t);\n\t\t\t},\n\t\t};\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HookSystem.js","sources":["../../../src/lib/HookSystem.ts"],"sourcesContent":["/**\n * Extends a function arguments with extra ones.\n */\ntype FnWithExtraArgs<\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tF extends (...args: any[]) => any,\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tTExtraArgs extends any[] = any[],\n> = (\n\t...args: [...args: Parameters<F>, ...extraArgs: TExtraArgs]\n) => ReturnType<F>;\n\n/**\n * Defines a hook handler.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type HookFn<TArgs extends any[] = any[], TReturn = any> = (\n\t...args: TArgs\n) => Promise<TReturn> | TReturn;\n\n/**\n * Generic hook metadata.\n */\ntype HookMeta = Record<string, unknown>;\n\n/**\n * Defines a hook, including its function handler and optional metadata.\n */\nexport type Hook<\n\tTHookFn extends HookFn = HookFn,\n\tTHookMeta extends HookMeta = HookMeta,\n> = {\n\tfn: THookFn;\n\tmeta?: THookMeta;\n};\n\n/**\n * Represents a map of hook types to hook functions and metas.\n */\ntype Hooks = Record<string, Hook>;\n\n/**\n * Builds hook meta arguments after hook meta requirements.\n */\ntype HookMetaArg<THookMeta extends Record<string, unknown> | undefined> =\n\tTHookMeta extends Record<string, unknown>\n\t\t? [meta: THookMeta]\n\t\t: [meta?: never];\n\n/**\n * Defines the return type of the {@link HookSystem.callHook} functions.\n *\n * @internal\n */\nexport type CallHookReturnType<THookFn extends HookFn = HookFn> = Promise<{\n\tdata: Awaited<ReturnType<THookFn>>[];\n\terrors: HookError[];\n}>;\n\n/**\n * Defines the return type of the {@link HookSystem.createScope} functions.\n *\n * @internal\n */\nexport type CreateScopeReturnType<\n\tTHooks extends Hooks = Record<string, { fn: HookFn }>,\n\tTExtraArgs extends unknown[] = never[],\n> = {\n\thook: <TType extends keyof THooks>(\n\t\ttype: TType,\n\t\thookFn: FnWithExtraArgs<THooks[TType][\"fn\"], TExtraArgs>,\n\t\t...[meta]: HookMetaArg<THooks[TType][\"meta\"]>\n\t) => void;\n\tunhook: HookSystem<{\n\t\t[P in keyof THooks]: Omit<THooks[P], \"fn\"> & {\n\t\t\tfn: FnWithExtraArgs<THooks[P][\"fn\"], TExtraArgs>;\n\t\t};\n\t}>[\"unhook\"];\n};\n\ntype RegisteredHookMeta = {\n\tid: string;\n\ttype: string;\n\towner: string;\n\texternal?: HookFn;\n};\n\n/**\n * Represents a registered hook.\n */\ntype RegisteredHook<THook extends Hook = Hook> = {\n\tfn: THook[\"fn\"];\n\tmeta: THook[\"meta\"] extends Record<string, unknown>\n\t\t? RegisteredHookMeta & THook[\"meta\"]\n\t\t: RegisteredHookMeta;\n};\n\nexport class HookError<TError = Error | unknown> extends Error {\n\ttype: string;\n\towner: string;\n\trawMeta: RegisteredHookMeta;\n\trawCause: TError;\n\n\tconstructor(meta: RegisteredHookMeta, cause: TError) {\n\t\tsuper(\n\t\t\t`Error in \\`${meta.owner}\\` during \\`${meta.type}\\` hook: ${\n\t\t\t\tcause instanceof Error ? cause.message : String(cause)\n\t\t\t}`,\n\t\t);\n\n\t\tthis.type = meta.type;\n\t\tthis.owner = meta.owner;\n\t\tthis.rawMeta = meta;\n\t\tthis.rawCause = cause;\n\t\tthis.cause = cause instanceof Error ? cause : undefined;\n\t}\n}\n\nconst uuid = (): string => {\n\treturn (++uuid.i).toString();\n};\nuuid.i = 0;\n\n/**\n * @internal\n */\nexport class HookSystem<THooks extends Hooks = Hooks> {\n\tprivate _registeredHooks: {\n\t\t[K in keyof THooks]?: RegisteredHook<THooks[K]>[];\n\t} = {};\n\n\thook<TType extends keyof THooks>(\n\t\towner: string,\n\t\ttype: TType,\n\t\thookFn: THooks[TType][\"fn\"],\n\t\t...[meta]: HookMetaArg<THooks[TType][\"meta\"]>\n\t): void {\n\t\tconst registeredHook = {\n\t\t\tfn: hookFn,\n\t\t\tmeta: {\n\t\t\t\t...meta,\n\t\t\t\towner,\n\t\t\t\ttype,\n\t\t\t\tid: uuid(),\n\t\t\t},\n\t\t} as RegisteredHook<THooks[TType]>;\n\n\t\tconst registeredHooksForType = this._registeredHooks[type];\n\n\t\tif (registeredHooksForType) {\n\t\t\tregisteredHooksForType.push(registeredHook);\n\t\t} else {\n\t\t\tthis._registeredHooks[type] = [registeredHook];\n\t\t}\n\t}\n\n\tunhook<TType extends keyof THooks>(\n\t\ttype: TType,\n\t\thookFn: THooks[TType][\"fn\"],\n\t): void {\n\t\tthis._registeredHooks[type] = this._registeredHooks[type]?.filter(\n\t\t\t(registeredHook) => registeredHook.fn !== hookFn,\n\t\t);\n\t}\n\n\tasync callHook<TType extends Extract<keyof THooks, string>>(\n\t\ttypeOrTypeAndHookID: TType | { type: TType; hookID: string },\n\t\t...args: Parameters<THooks[TType][\"fn\"]>\n\t): CallHookReturnType<THooks[TType][\"fn\"]> {\n\t\tlet hooks: RegisteredHook<THooks[TType]>[];\n\n\t\tif (typeof typeOrTypeAndHookID === \"string\") {\n\t\t\thooks = this._registeredHooks[typeOrTypeAndHookID] ?? [];\n\t\t} else {\n\t\t\tconst hookForID = this._registeredHooks[typeOrTypeAndHookID.type]?.find(\n\t\t\t\t(hook) => hook.meta.id === typeOrTypeAndHookID.hookID,\n\t\t\t);\n\n\t\t\tif (hookForID) {\n\t\t\t\thooks = [hookForID];\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Hook of type \\`${typeOrTypeAndHookID.type}\\` with ID \\`${typeOrTypeAndHookID.hookID}\\` not found.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst promises = hooks.map(async (hook) => {\n\t\t\ttry {\n\t\t\t\treturn await hook.fn(...args);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new HookError(hook.meta, error);\n\t\t\t}\n\t\t});\n\n\t\tconst settledPromises = await Promise.allSettled(promises);\n\n\t\treturn settledPromises.reduce<{\n\t\t\tdata: Awaited<ReturnType<THooks[TType][\"fn\"]>>[];\n\t\t\terrors: HookError[];\n\t\t}>(\n\t\t\t(acc, settledPromise) => {\n\t\t\t\tif (settledPromise.status === \"fulfilled\") {\n\t\t\t\t\tacc.data.push(settledPromise.value);\n\t\t\t\t} else {\n\t\t\t\t\tacc.errors.push(settledPromise.reason);\n\t\t\t\t}\n\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{ data: [], errors: [] },\n\t\t);\n\t}\n\n\t/**\n\t * Returns list of hooks for a given owner\n\t */\n\thooksForOwner(owner: string): RegisteredHook<THooks[string]>[] {\n\t\tconst hooks: RegisteredHook<THooks[string]>[] = [];\n\n\t\tfor (const hookType in this._registeredHooks) {\n\t\t\tconst registeredHooks = this._registeredHooks[hookType];\n\n\t\t\tif (Array.isArray(registeredHooks)) {\n\t\t\t\tfor (const registeredHook of registeredHooks) {\n\t\t\t\t\tif (registeredHook.meta.owner === owner) {\n\t\t\t\t\t\thooks.push(registeredHook);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn hooks;\n\t}\n\n\t/**\n\t * Returns list of hooks for a given type\n\t */\n\thooksForType<TType extends keyof THooks>(\n\t\ttype: TType,\n\t): RegisteredHook<THooks[TType]>[] {\n\t\treturn this._registeredHooks[type] ?? [];\n\t}\n\n\tcreateScope<TExtraArgs extends unknown[] = never[]>(\n\t\towner: string,\n\t\textraArgs: [...TExtraArgs],\n\t): CreateScopeReturnType<THooks, TExtraArgs> {\n\t\treturn {\n\t\t\thook: (type, hookFn, ...[meta]) => {\n\t\t\t\tconst internalHook = ((\n\t\t\t\t\t...args: Parameters<THooks[typeof type][\"fn\"]>\n\t\t\t\t) => {\n\t\t\t\t\treturn hookFn(...args, ...extraArgs);\n\t\t\t\t}) as THooks[typeof type][\"fn\"];\n\n\t\t\t\tconst resolvedMeta = {\n\t\t\t\t\t...meta,\n\t\t\t\t\texternal: hookFn,\n\t\t\t\t} as HookMetaArg<THooks[typeof type][\"meta\"]>[0];\n\n\t\t\t\treturn this.hook(\n\t\t\t\t\towner,\n\t\t\t\t\ttype,\n\t\t\t\t\tinternalHook,\n\t\t\t\t\t// @ts-expect-error - TypeScript fails to assert rest argument.\n\t\t\t\t\tresolvedMeta,\n\t\t\t\t);\n\t\t\t},\n\t\t\tunhook: (type, hookFn) => {\n\t\t\t\tthis._registeredHooks[type] = this._registeredHooks[type]?.filter(\n\t\t\t\t\t(registeredHook) => registeredHook.meta.external !== hookFn,\n\t\t\t\t);\n\t\t\t},\n\t\t};\n\t}\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prismicio/plugin-kit",
|
|
3
|
-
"version": "0.0.3-beta.
|
|
3
|
+
"version": "0.0.3-beta.16",
|
|
4
4
|
"description": "A set of helpers to develop and run Prismic plugins",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -62,29 +62,29 @@
|
|
|
62
62
|
"audit": "yarn npm audit --environment production --severity high"
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@prismicio/client": "7.21.
|
|
65
|
+
"@prismicio/client": "7.21.3",
|
|
66
66
|
"common-tags": "1.8.2",
|
|
67
67
|
"defu": "6.1.4",
|
|
68
|
-
"fs-extra": "11.3.
|
|
68
|
+
"fs-extra": "11.3.3",
|
|
69
69
|
"p-limit": "7.2.0",
|
|
70
|
-
"prettier": "3.
|
|
70
|
+
"prettier": "3.8.1",
|
|
71
71
|
"prismic-ts-codegen": "0.1.28",
|
|
72
|
-
"zod": "4.
|
|
72
|
+
"zod": "4.3.6"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
|
-
"@eslint/js": "9.39.
|
|
75
|
+
"@eslint/js": "9.39.2",
|
|
76
76
|
"@prismicio/types-internal": "3.16.1",
|
|
77
|
-
"@trivago/prettier-plugin-sort-imports": "6.0.
|
|
77
|
+
"@trivago/prettier-plugin-sort-imports": "6.0.2",
|
|
78
78
|
"@types/common-tags": "1.8.4",
|
|
79
79
|
"@types/fs-extra": "11.0.4",
|
|
80
80
|
"depcheck": "1.4.7",
|
|
81
|
-
"eslint": "9.39.
|
|
81
|
+
"eslint": "9.39.2",
|
|
82
82
|
"eslint-config-prettier": "10.1.8",
|
|
83
83
|
"eslint-plugin-tsdoc": "0.5.0",
|
|
84
|
-
"prettier-plugin-jsdoc": "1.
|
|
84
|
+
"prettier-plugin-jsdoc": "1.8.0",
|
|
85
85
|
"typescript": "5.9.3",
|
|
86
|
-
"typescript-eslint": "8.
|
|
87
|
-
"vite": "7.
|
|
86
|
+
"typescript-eslint": "8.53.1",
|
|
87
|
+
"vite": "7.3.1",
|
|
88
88
|
"vite-plugin-sdk": "0.1.5"
|
|
89
89
|
},
|
|
90
90
|
"stableVersion": "0.0.2"
|