@webiny/plugins
Advanced tools
+28
-27
| import { PluginsContainer } from "./types.js"; | ||
| const isPluginLoader = value => { | ||
| return typeof value === "function"; | ||
| }; | ||
| export class AsyncPluginsContainer { | ||
| constructor(plugins) { | ||
| this.plugins = plugins instanceof PluginsContainer ? plugins.all() : plugins; | ||
| } | ||
| async init() { | ||
| if (this.pluginsContainer) { | ||
| return this.pluginsContainer; | ||
| const isPluginLoader = (value)=>"function" == typeof value; | ||
| class AsyncPluginsContainer { | ||
| constructor(plugins){ | ||
| this.plugins = plugins instanceof PluginsContainer ? plugins.all() : plugins; | ||
| } | ||
| const plugins = await this.traverseAndLoadPlugins(this.plugins); | ||
| this.pluginsContainer = new PluginsContainer(plugins); | ||
| return this.pluginsContainer; | ||
| } | ||
| async traverseAndLoadPlugins(plugins) { | ||
| if (!Array.isArray(plugins)) { | ||
| return [plugins]; | ||
| async init() { | ||
| if (this.pluginsContainer) return this.pluginsContainer; | ||
| const plugins = await this.traverseAndLoadPlugins(this.plugins); | ||
| this.pluginsContainer = new PluginsContainer(plugins); | ||
| return this.pluginsContainer; | ||
| } | ||
| return plugins.reduce((acc, item) => { | ||
| return acc.then(async plugins => { | ||
| if (isPluginLoader(item)) { | ||
| const lazyPlugins = await item(); | ||
| return [...plugins, ...(await this.traverseAndLoadPlugins(lazyPlugins))]; | ||
| } | ||
| return [...plugins, ...(await this.traverseAndLoadPlugins(item))]; | ||
| }); | ||
| }, Promise.resolve([])); | ||
| } | ||
| async traverseAndLoadPlugins(plugins) { | ||
| if (!Array.isArray(plugins)) return [ | ||
| plugins | ||
| ]; | ||
| return plugins.reduce((acc, item)=>acc.then(async (plugins)=>{ | ||
| if (isPluginLoader(item)) { | ||
| const lazyPlugins = await item(); | ||
| return [ | ||
| ...plugins, | ||
| ...await this.traverseAndLoadPlugins(lazyPlugins) | ||
| ]; | ||
| } | ||
| return [ | ||
| ...plugins, | ||
| ...await this.traverseAndLoadPlugins(item) | ||
| ]; | ||
| }), Promise.resolve([])); | ||
| } | ||
| } | ||
| export { AsyncPluginsContainer }; | ||
| //# sourceMappingURL=AsyncPluginsContainer.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"names":["PluginsContainer","isPluginLoader","value","AsyncPluginsContainer","constructor","plugins","all","init","pluginsContainer","traverseAndLoadPlugins","Array","isArray","reduce","acc","item","then","lazyPlugins","Promise","resolve"],"sources":["AsyncPluginsContainer.ts"],"sourcesContent":["import type { Plugin, PluginCollection, PluginFactory } from \"~/types.js\";\nimport { PluginsContainer } from \"~/types.js\";\n\nconst isPluginLoader = (value: unknown): value is PluginFactory => {\n return typeof value === \"function\";\n};\n\nexport class AsyncPluginsContainer {\n private readonly plugins: PluginCollection;\n private pluginsContainer: PluginsContainer | undefined;\n\n constructor(plugins: PluginCollection | PluginsContainer) {\n this.plugins = plugins instanceof PluginsContainer ? plugins.all() : plugins;\n }\n\n async init() {\n if (this.pluginsContainer) {\n return this.pluginsContainer;\n }\n\n const plugins = await this.traverseAndLoadPlugins(this.plugins);\n this.pluginsContainer = new PluginsContainer(plugins);\n\n return this.pluginsContainer;\n }\n\n private async traverseAndLoadPlugins(plugins: Plugin | PluginCollection): Promise<Plugin[]> {\n if (!Array.isArray(plugins)) {\n return [plugins];\n }\n\n return plugins.reduce<Promise<Plugin[]>>((acc, item) => {\n return acc.then(async plugins => {\n if (isPluginLoader(item)) {\n const lazyPlugins = await item();\n return [...plugins, ...(await this.traverseAndLoadPlugins(lazyPlugins))];\n }\n\n return [...plugins, ...(await this.traverseAndLoadPlugins(item))];\n });\n }, Promise.resolve([]));\n }\n}\n"],"mappings":"AACA,SAASA,gBAAgB;AAEzB,MAAMC,cAAc,GAAIC,KAAc,IAA6B;EAC/D,OAAO,OAAOA,KAAK,KAAK,UAAU;AACtC,CAAC;AAED,OAAO,MAAMC,qBAAqB,CAAC;EAI/BC,WAAWA,CAACC,OAA4C,EAAE;IACtD,IAAI,CAACA,OAAO,GAAGA,OAAO,YAAYL,gBAAgB,GAAGK,OAAO,CAACC,GAAG,CAAC,CAAC,GAAGD,OAAO;EAChF;EAEA,MAAME,IAAIA,CAAA,EAAG;IACT,IAAI,IAAI,CAACC,gBAAgB,EAAE;MACvB,OAAO,IAAI,CAACA,gBAAgB;IAChC;IAEA,MAAMH,OAAO,GAAG,MAAM,IAAI,CAACI,sBAAsB,CAAC,IAAI,CAACJ,OAAO,CAAC;IAC/D,IAAI,CAACG,gBAAgB,GAAG,IAAIR,gBAAgB,CAACK,OAAO,CAAC;IAErD,OAAO,IAAI,CAACG,gBAAgB;EAChC;EAEA,MAAcC,sBAAsBA,CAACJ,OAAkC,EAAqB;IACxF,IAAI,CAACK,KAAK,CAACC,OAAO,CAACN,OAAO,CAAC,EAAE;MACzB,OAAO,CAACA,OAAO,CAAC;IACpB;IAEA,OAAOA,OAAO,CAACO,MAAM,CAAoB,CAACC,GAAG,EAAEC,IAAI,KAAK;MACpD,OAAOD,GAAG,CAACE,IAAI,CAAC,MAAMV,OAAO,IAAI;QAC7B,IAAIJ,cAAc,CAACa,IAAI,CAAC,EAAE;UACtB,MAAME,WAAW,GAAG,MAAMF,IAAI,CAAC,CAAC;UAChC,OAAO,CAAC,GAAGT,OAAO,EAAE,IAAI,MAAM,IAAI,CAACI,sBAAsB,CAACO,WAAW,CAAC,CAAC,CAAC;QAC5E;QAEA,OAAO,CAAC,GAAGX,OAAO,EAAE,IAAI,MAAM,IAAI,CAACI,sBAAsB,CAACK,IAAI,CAAC,CAAC,CAAC;MACrE,CAAC,CAAC;IACN,CAAC,EAAEG,OAAO,CAACC,OAAO,CAAC,EAAE,CAAC,CAAC;EAC3B;AACJ","ignoreList":[]} | ||
| {"version":3,"file":"AsyncPluginsContainer.js","sources":["../src/AsyncPluginsContainer.ts"],"sourcesContent":["import type { Plugin, PluginCollection, PluginFactory } from \"~/types.js\";\nimport { PluginsContainer } from \"~/types.js\";\n\nconst isPluginLoader = (value: unknown): value is PluginFactory => {\n return typeof value === \"function\";\n};\n\nexport class AsyncPluginsContainer {\n private readonly plugins: PluginCollection;\n private pluginsContainer: PluginsContainer | undefined;\n\n constructor(plugins: PluginCollection | PluginsContainer) {\n this.plugins = plugins instanceof PluginsContainer ? plugins.all() : plugins;\n }\n\n async init() {\n if (this.pluginsContainer) {\n return this.pluginsContainer;\n }\n\n const plugins = await this.traverseAndLoadPlugins(this.plugins);\n this.pluginsContainer = new PluginsContainer(plugins);\n\n return this.pluginsContainer;\n }\n\n private async traverseAndLoadPlugins(plugins: Plugin | PluginCollection): Promise<Plugin[]> {\n if (!Array.isArray(plugins)) {\n return [plugins];\n }\n\n return plugins.reduce<Promise<Plugin[]>>((acc, item) => {\n return acc.then(async plugins => {\n if (isPluginLoader(item)) {\n const lazyPlugins = await item();\n return [...plugins, ...(await this.traverseAndLoadPlugins(lazyPlugins))];\n }\n\n return [...plugins, ...(await this.traverseAndLoadPlugins(item))];\n });\n }, Promise.resolve([]));\n }\n}\n"],"names":["isPluginLoader","value","AsyncPluginsContainer","plugins","PluginsContainer","Array","acc","item","lazyPlugins","Promise"],"mappings":";AAGA,MAAMA,iBAAiB,CAACC,QACb,AAAiB,cAAjB,OAAOA;AAGX,MAAMC;IAIT,YAAYC,OAA4C,CAAE;QACtD,IAAI,CAAC,OAAO,GAAGA,mBAAmBC,mBAAmBD,QAAQ,GAAG,KAAKA;IACzE;IAEA,MAAM,OAAO;QACT,IAAI,IAAI,CAAC,gBAAgB,EACrB,OAAO,IAAI,CAAC,gBAAgB;QAGhC,MAAMA,UAAU,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO;QAC9D,IAAI,CAAC,gBAAgB,GAAG,IAAIC,iBAAiBD;QAE7C,OAAO,IAAI,CAAC,gBAAgB;IAChC;IAEA,MAAc,uBAAuBA,OAAkC,EAAqB;QACxF,IAAI,CAACE,MAAM,OAAO,CAACF,UACf,OAAO;YAACA;SAAQ;QAGpB,OAAOA,QAAQ,MAAM,CAAoB,CAACG,KAAKC,OACpCD,IAAI,IAAI,CAAC,OAAMH;gBAClB,IAAIH,eAAeO,OAAO;oBACtB,MAAMC,cAAc,MAAMD;oBAC1B,OAAO;2BAAIJ;2BAAa,MAAM,IAAI,CAAC,sBAAsB,CAACK;qBAAc;gBAC5E;gBAEA,OAAO;uBAAIL;uBAAa,MAAM,IAAI,CAAC,sBAAsB,CAACI;iBAAO;YACrE,IACDE,QAAQ,OAAO,CAAC,EAAE;IACzB;AACJ"} |
+3
-3
| import { PluginsContainer } from "./PluginsContainer.js"; | ||
| import { AsyncPluginsContainer } from "./AsyncPluginsContainer.js"; | ||
| import { Plugin } from "./Plugin.js"; | ||
| const plugins = new PluginsContainer(); | ||
| export { Plugin, PluginsContainer, plugins, AsyncPluginsContainer }; | ||
| export { AsyncPluginsContainer } from "./AsyncPluginsContainer.js"; | ||
| export { Plugin } from "./Plugin.js"; | ||
| export { PluginsContainer, plugins }; | ||
| //# sourceMappingURL=index.js.map |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"names":["PluginsContainer","AsyncPluginsContainer","Plugin","plugins"],"sources":["index.ts"],"sourcesContent":["import { PluginsContainer } from \"./PluginsContainer.js\";\nimport { AsyncPluginsContainer } from \"./AsyncPluginsContainer.js\";\nimport { Plugin } from \"./Plugin.js\";\n\nconst plugins = new PluginsContainer();\n\nexport { Plugin, PluginsContainer, plugins, AsyncPluginsContainer };\n"],"mappings":"AAAA,SAASA,gBAAgB;AACzB,SAASC,qBAAqB;AAC9B,SAASC,MAAM;AAEf,MAAMC,OAAO,GAAG,IAAIH,gBAAgB,CAAC,CAAC;AAEtC,SAASE,MAAM,EAAEF,gBAAgB,EAAEG,OAAO,EAAEF,qBAAqB","ignoreList":[]} | ||
| {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { PluginsContainer } from \"./PluginsContainer.js\";\nimport { AsyncPluginsContainer } from \"./AsyncPluginsContainer.js\";\nimport { Plugin } from \"./Plugin.js\";\n\nconst plugins = new PluginsContainer();\n\nexport { Plugin, PluginsContainer, plugins, AsyncPluginsContainer };\n"],"names":["plugins","PluginsContainer"],"mappings":";AAIA,MAAMA,UAAU,IAAIC"} |
+4
-4
| { | ||
| "name": "@webiny/plugins", | ||
| "version": "6.3.0", | ||
| "version": "6.4.0-beta.0", | ||
| "type": "module", | ||
@@ -24,6 +24,6 @@ "exports": { | ||
| "@types/uniqid": "5.3.4", | ||
| "@webiny/build-tools": "6.3.0", | ||
| "@webiny/build-tools": "6.4.0-beta.0", | ||
| "rimraf": "6.1.3", | ||
| "typescript": "6.0.3", | ||
| "vitest": "4.1.5" | ||
| "vitest": "4.1.6" | ||
| }, | ||
@@ -34,3 +34,3 @@ "publishConfig": { | ||
| }, | ||
| "gitHead": "7cefe15431dbd65504e1f58147dc9e55bcbfa693" | ||
| "gitHead": "a545d7529828af07d08d49c3da1bcb967483b9ce" | ||
| } |
+7
-8
@@ -1,12 +0,11 @@ | ||
| export class Plugin { | ||
| constructor() { | ||
| if (!this.constructor.type) { | ||
| throw Error(`Missing "type" definition in "${this.constructor.name}"!`); | ||
| class Plugin { | ||
| constructor(){ | ||
| if (!this.constructor.type) throw Error(`Missing "type" definition in "${this.constructor.name}"!`); | ||
| } | ||
| } | ||
| get type() { | ||
| return this.constructor.type; | ||
| } | ||
| get type() { | ||
| return this.constructor.type; | ||
| } | ||
| } | ||
| export { Plugin }; | ||
| //# sourceMappingURL=Plugin.js.map |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"names":["Plugin","constructor","type","Error","name"],"sources":["Plugin.ts"],"sourcesContent":["export abstract class Plugin {\n public static readonly type: string;\n public name?: string;\n\n constructor() {\n if (!(this.constructor as typeof Plugin).type) {\n throw Error(`Missing \"type\" definition in \"${this.constructor.name}\"!`);\n }\n }\n\n get type() {\n return (this.constructor as typeof Plugin).type;\n }\n}\n"],"mappings":"AAAA,OAAO,MAAeA,MAAM,CAAC;EAIzBC,WAAWA,CAAA,EAAG;IACV,IAAI,CAAE,IAAI,CAACA,WAAW,CAAmBC,IAAI,EAAE;MAC3C,MAAMC,KAAK,CAAC,iCAAiC,IAAI,CAACF,WAAW,CAACG,IAAI,IAAI,CAAC;IAC3E;EACJ;EAEA,IAAIF,IAAIA,CAAA,EAAG;IACP,OAAQ,IAAI,CAACD,WAAW,CAAmBC,IAAI;EACnD;AACJ","ignoreList":[]} | ||
| {"version":3,"file":"Plugin.js","sources":["../src/Plugin.ts"],"sourcesContent":["export abstract class Plugin {\n public static readonly type: string;\n public name?: string;\n\n constructor() {\n if (!(this.constructor as typeof Plugin).type) {\n throw Error(`Missing \"type\" definition in \"${this.constructor.name}\"!`);\n }\n }\n\n get type() {\n return (this.constructor as typeof Plugin).type;\n }\n}\n"],"names":["Plugin","Error"],"mappings":"AAAO,MAAeA;IAIlB,aAAc;QACV,IAAI,CAAE,IAAI,CAAC,WAAW,CAAmB,IAAI,EACzC,MAAMC,MAAM,CAAC,8BAA8B,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;IAE9E;IAEA,IAAI,OAAO;QACP,OAAQ,IAAI,CAAC,WAAW,CAAmB,IAAI;IACnD;AACJ"} |
+67
-91
| import uniqid from "uniqid"; | ||
| const isOptionsObject = item => item && !Array.isArray(item) && !item.type && !item.name; | ||
| const normalizeArgs = args => { | ||
| let options = {}; | ||
| // Check if last item in the plugins array is actually an options object. | ||
| if (isOptionsObject(args[args.length - 1])) { | ||
| [options] = args.splice(-1, 1); | ||
| } | ||
| return [args, options]; | ||
| const isOptionsObject = (item)=>item && !Array.isArray(item) && !item.type && !item.name; | ||
| const normalizeArgs = (args)=>{ | ||
| let options = {}; | ||
| if (isOptionsObject(args[args.length - 1])) [options] = args.splice(-1, 1); | ||
| return [ | ||
| args, | ||
| options | ||
| ]; | ||
| }; | ||
| const assign = (plugins, options, target) => { | ||
| for (const plugin of plugins) { | ||
| if (Array.isArray(plugin)) { | ||
| assign(plugin, options, target); | ||
| continue; | ||
| const PluginsContainer_assign = (plugins, options, target)=>{ | ||
| for (const plugin of plugins){ | ||
| if (Array.isArray(plugin)) { | ||
| PluginsContainer_assign(plugin, options, target); | ||
| continue; | ||
| } | ||
| if ("object" != typeof plugin) throw new Error(`Could not register plugin. Expected an object, but got ${typeof plugin}.`); | ||
| if (!plugin.type) { | ||
| let name = ""; | ||
| if (plugin.name) name = ` "${plugin.name}"`; | ||
| throw new Error(`Could not register plugin${name}. Missing "type" definition.`); | ||
| } | ||
| let name = plugin._name || plugin.name; | ||
| if (!name) plugin.name = name = uniqid(plugin.type + "-"); | ||
| if (!options.skipExisting || !target[name]) { | ||
| target[name] = plugin; | ||
| plugin.init && plugin.init(); | ||
| } | ||
| } | ||
| if (typeof plugin !== "object") { | ||
| throw new Error(`Could not register plugin. Expected an object, but got ${typeof plugin}.`); | ||
| }; | ||
| class PluginsContainer { | ||
| constructor(...args){ | ||
| this.plugins = {}; | ||
| this._byTypeCache = {}; | ||
| this.register(...args); | ||
| } | ||
| if (!plugin.type) { | ||
| let name = ""; | ||
| if (plugin.name) { | ||
| name = ` "${plugin.name}"`; | ||
| } | ||
| throw new Error(`Could not register plugin${name}. Missing "type" definition.`); | ||
| byName(name) { | ||
| if (!name) return null; | ||
| return this.plugins[name]; | ||
| } | ||
| let name = plugin._name || plugin.name; | ||
| if (!name) { | ||
| plugin.name = name = uniqid(plugin.type + "-"); | ||
| byType(type) { | ||
| if (this._byTypeCache[type]) return Array.from(this._byTypeCache[type]); | ||
| const plugins = this.findByType(type); | ||
| this._byTypeCache[type] = plugins; | ||
| return Array.from(plugins); | ||
| } | ||
| // If skip existing was set to true, and a plugin with the same name was already registered, skip registration. | ||
| if (!options.skipExisting || !target[name]) { | ||
| target[name] = plugin; | ||
| plugin.init && plugin.init(); | ||
| atLeastOneByType(type) { | ||
| const list = this.byType(type); | ||
| if (0 === list.length) throw new Error(`There are no plugins by type "${type}".`); | ||
| return list; | ||
| } | ||
| } | ||
| }; | ||
| export class PluginsContainer { | ||
| plugins = {}; | ||
| _byTypeCache = {}; | ||
| constructor(...args) { | ||
| this.register(...args); | ||
| } | ||
| byName(name) { | ||
| if (!name) { | ||
| return null; | ||
| oneByType(type) { | ||
| const list = this.atLeastOneByType(type); | ||
| if (list.length > 1) throw new Error(`There is a requirement for plugin of type "${type}" to be only one registered.`); | ||
| return list[0]; | ||
| } | ||
| /** | ||
| * We can safely cast name as string, we know it is so. | ||
| */ | ||
| return this.plugins[name]; | ||
| } | ||
| byType(type) { | ||
| if (this._byTypeCache[type]) { | ||
| return Array.from(this._byTypeCache[type]); | ||
| merge(input) { | ||
| if (input instanceof PluginsContainer) return void this.register(...input.all()); | ||
| this.register(input); | ||
| } | ||
| const plugins = this.findByType(type); | ||
| this._byTypeCache[type] = plugins; | ||
| return Array.from(plugins); | ||
| } | ||
| atLeastOneByType(type) { | ||
| const list = this.byType(type); | ||
| if (list.length === 0) { | ||
| throw new Error(`There are no plugins by type "${type}".`); | ||
| mergeByType(container, type) { | ||
| this.register(...container.byType(type)); | ||
| } | ||
| return list; | ||
| } | ||
| oneByType(type) { | ||
| const list = this.atLeastOneByType(type); | ||
| if (list.length > 1) { | ||
| throw new Error(`There is a requirement for plugin of type "${type}" to be only one registered.`); | ||
| all() { | ||
| return Object.values(this.plugins); | ||
| } | ||
| return list[0]; | ||
| } | ||
| merge(input) { | ||
| if (input instanceof PluginsContainer) { | ||
| this.register(...input.all()); | ||
| return; | ||
| register(...args) { | ||
| this._byTypeCache = {}; | ||
| const [plugins, options] = normalizeArgs(args); | ||
| PluginsContainer_assign(plugins, options, this.plugins); | ||
| } | ||
| this.register(input); | ||
| } | ||
| mergeByType(container, type) { | ||
| this.register(...container.byType(type)); | ||
| } | ||
| all() { | ||
| return Object.values(this.plugins); | ||
| } | ||
| register(...args) { | ||
| // reset the cache when adding new plugins | ||
| this._byTypeCache = {}; | ||
| const [plugins, options] = normalizeArgs(args); | ||
| assign(plugins, options, this.plugins); | ||
| } | ||
| unregister(name) { | ||
| // reset the cache when removing a plugin | ||
| this._byTypeCache = {}; | ||
| delete this.plugins[name]; | ||
| } | ||
| findByType(type) { | ||
| return Object.values(this.plugins).filter(pl => pl.type === type); | ||
| } | ||
| unregister(name) { | ||
| this._byTypeCache = {}; | ||
| delete this.plugins[name]; | ||
| } | ||
| findByType(type) { | ||
| return Object.values(this.plugins).filter((pl)=>pl.type === type); | ||
| } | ||
| } | ||
| export { PluginsContainer }; | ||
| //# sourceMappingURL=PluginsContainer.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"names":["uniqid","isOptionsObject","item","Array","isArray","type","name","normalizeArgs","args","options","length","splice","assign","plugins","target","plugin","Error","_name","skipExisting","init","PluginsContainer","_byTypeCache","constructor","register","byName","byType","from","findByType","atLeastOneByType","list","oneByType","merge","input","all","mergeByType","container","Object","values","unregister","filter","pl"],"sources":["PluginsContainer.ts"],"sourcesContent":["import type { Plugin, PluginCollection } from \"./types.js\";\nimport uniqid from \"uniqid\";\n\nexport type WithName<T extends Plugin> = T & { name: string };\n\nconst isOptionsObject = (item?: any) => item && !Array.isArray(item) && !item.type && !item.name;\nconst normalizeArgs = (args: any[]): [Plugin[], any] => {\n let options = {};\n\n // Check if last item in the plugins array is actually an options object.\n if (isOptionsObject(args[args.length - 1])) {\n [options] = args.splice(-1, 1);\n }\n\n return [args, options];\n};\n\nconst assign = (\n plugins: Plugin[] | Plugin[][],\n options: any,\n target: Record<string, any>\n): void => {\n for (const plugin of plugins) {\n if (Array.isArray(plugin)) {\n assign(plugin, options, target);\n continue;\n }\n\n if (typeof plugin !== \"object\") {\n throw new Error(\n `Could not register plugin. Expected an object, but got ${typeof plugin}.`\n );\n }\n\n if (!plugin.type) {\n let name = \"\";\n if (plugin.name) {\n name = ` \"${plugin.name}\"`;\n }\n throw new Error(`Could not register plugin${name}. Missing \"type\" definition.`);\n }\n\n let name = plugin._name || plugin.name;\n if (!name) {\n plugin.name = name = uniqid(plugin.type + \"-\");\n }\n\n // If skip existing was set to true, and a plugin with the same name was already registered, skip registration.\n if (!options.skipExisting || !target[name]) {\n target[name] = plugin;\n plugin.init && plugin.init();\n }\n }\n};\n\nexport class PluginsContainer {\n private plugins: Record<string, Plugin> = {};\n private _byTypeCache: Record<string, WithName<Plugin>[]> = {};\n\n constructor(...args: PluginCollection) {\n this.register(...args);\n }\n\n public byName<T extends Plugin>(name: T[\"name\"]) {\n if (!name) {\n return null;\n }\n /**\n * We can safely cast name as string, we know it is so.\n */\n return this.plugins[name as string] as WithName<T>;\n }\n\n public byType<T extends Plugin>(type: T[\"type\"]) {\n if (this._byTypeCache[type]) {\n return Array.from(this._byTypeCache[type]) as WithName<T>[];\n }\n const plugins = this.findByType<T>(type);\n this._byTypeCache[type] = plugins;\n return Array.from(plugins);\n }\n\n public atLeastOneByType<T extends Plugin>(type: T[\"type\"]) {\n const list = this.byType<T>(type);\n if (list.length === 0) {\n throw new Error(`There are no plugins by type \"${type}\".`);\n }\n return list;\n }\n\n public oneByType<T extends Plugin>(type: T[\"type\"]) {\n const list = this.atLeastOneByType<T>(type);\n if (list.length > 1) {\n throw new Error(\n `There is a requirement for plugin of type \"${type}\" to be only one registered.`\n );\n }\n return list[0];\n }\n\n public merge(input: PluginsContainer | PluginCollection): void {\n if (input instanceof PluginsContainer) {\n this.register(...input.all());\n return;\n }\n this.register(input);\n }\n\n public mergeByType(container: PluginsContainer, type: string): void {\n this.register(...container.byType(type));\n }\n\n public all<T extends Plugin>(): T[] {\n return Object.values(this.plugins) as T[];\n }\n\n public register(...args: any): void {\n // reset the cache when adding new plugins\n this._byTypeCache = {};\n const [plugins, options] = normalizeArgs(args);\n assign(plugins, options, this.plugins);\n }\n\n public unregister(name: string): void {\n // reset the cache when removing a plugin\n this._byTypeCache = {};\n delete this.plugins[name];\n }\n\n private findByType<T extends Plugin>(type: T[\"type\"]) {\n return Object.values(this.plugins).filter(\n (pl): pl is T => pl.type === type\n ) as WithName<T>[];\n }\n}\n"],"mappings":"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","ignoreList":[]} | ||
| {"version":3,"file":"PluginsContainer.js","sources":["../src/PluginsContainer.ts"],"sourcesContent":["import type { Plugin, PluginCollection } from \"./types.js\";\nimport uniqid from \"uniqid\";\n\nexport type WithName<T extends Plugin> = T & { name: string };\n\nconst isOptionsObject = (item?: any) => item && !Array.isArray(item) && !item.type && !item.name;\nconst normalizeArgs = (args: any[]): [Plugin[], any] => {\n let options = {};\n\n // Check if last item in the plugins array is actually an options object.\n if (isOptionsObject(args[args.length - 1])) {\n [options] = args.splice(-1, 1);\n }\n\n return [args, options];\n};\n\nconst assign = (\n plugins: Plugin[] | Plugin[][],\n options: any,\n target: Record<string, any>\n): void => {\n for (const plugin of plugins) {\n if (Array.isArray(plugin)) {\n assign(plugin, options, target);\n continue;\n }\n\n if (typeof plugin !== \"object\") {\n throw new Error(\n `Could not register plugin. Expected an object, but got ${typeof plugin}.`\n );\n }\n\n if (!plugin.type) {\n let name = \"\";\n if (plugin.name) {\n name = ` \"${plugin.name}\"`;\n }\n throw new Error(`Could not register plugin${name}. Missing \"type\" definition.`);\n }\n\n let name = plugin._name || plugin.name;\n if (!name) {\n plugin.name = name = uniqid(plugin.type + \"-\");\n }\n\n // If skip existing was set to true, and a plugin with the same name was already registered, skip registration.\n if (!options.skipExisting || !target[name]) {\n target[name] = plugin;\n plugin.init && plugin.init();\n }\n }\n};\n\nexport class PluginsContainer {\n private plugins: Record<string, Plugin> = {};\n private _byTypeCache: Record<string, WithName<Plugin>[]> = {};\n\n constructor(...args: PluginCollection) {\n this.register(...args);\n }\n\n public byName<T extends Plugin>(name: T[\"name\"]) {\n if (!name) {\n return null;\n }\n /**\n * We can safely cast name as string, we know it is so.\n */\n return this.plugins[name as string] as WithName<T>;\n }\n\n public byType<T extends Plugin>(type: T[\"type\"]) {\n if (this._byTypeCache[type]) {\n return Array.from(this._byTypeCache[type]) as WithName<T>[];\n }\n const plugins = this.findByType<T>(type);\n this._byTypeCache[type] = plugins;\n return Array.from(plugins);\n }\n\n public atLeastOneByType<T extends Plugin>(type: T[\"type\"]) {\n const list = this.byType<T>(type);\n if (list.length === 0) {\n throw new Error(`There are no plugins by type \"${type}\".`);\n }\n return list;\n }\n\n public oneByType<T extends Plugin>(type: T[\"type\"]) {\n const list = this.atLeastOneByType<T>(type);\n if (list.length > 1) {\n throw new Error(\n `There is a requirement for plugin of type \"${type}\" to be only one registered.`\n );\n }\n return list[0];\n }\n\n public merge(input: PluginsContainer | PluginCollection): void {\n if (input instanceof PluginsContainer) {\n this.register(...input.all());\n return;\n }\n this.register(input);\n }\n\n public mergeByType(container: PluginsContainer, type: string): void {\n this.register(...container.byType(type));\n }\n\n public all<T extends Plugin>(): T[] {\n return Object.values(this.plugins) as T[];\n }\n\n public register(...args: any): void {\n // reset the cache when adding new plugins\n this._byTypeCache = {};\n const [plugins, options] = normalizeArgs(args);\n assign(plugins, options, this.plugins);\n }\n\n public unregister(name: string): void {\n // reset the cache when removing a plugin\n this._byTypeCache = {};\n delete this.plugins[name];\n }\n\n private findByType<T extends Plugin>(type: T[\"type\"]) {\n return Object.values(this.plugins).filter(\n (pl): pl is T => pl.type === type\n ) as WithName<T>[];\n }\n}\n"],"names":["isOptionsObject","item","Array","normalizeArgs","args","options","assign","plugins","target","plugin","Error","name","uniqid","PluginsContainer","type","list","input","container","Object","pl"],"mappings":";AAKA,MAAMA,kBAAkB,CAACC,OAAeA,QAAQ,CAACC,MAAM,OAAO,CAACD,SAAS,CAACA,KAAK,IAAI,IAAI,CAACA,KAAK,IAAI;AAChG,MAAME,gBAAgB,CAACC;IACnB,IAAIC,UAAU,CAAC;IAGf,IAAIL,gBAAgBI,IAAI,CAACA,KAAK,MAAM,GAAG,EAAE,GACrC,CAACC,QAAQ,GAAGD,KAAK,MAAM,CAAC,IAAI;IAGhC,OAAO;QAACA;QAAMC;KAAQ;AAC1B;AAEA,MAAMC,0BAAS,CACXC,SACAF,SACAG;IAEA,KAAK,MAAMC,UAAUF,QAAS;QAC1B,IAAIL,MAAM,OAAO,CAACO,SAAS;YACvBH,wBAAOG,QAAQJ,SAASG;YACxB;QACJ;QAEA,IAAI,AAAkB,YAAlB,OAAOC,QACP,MAAM,IAAIC,MACN,CAAC,uDAAuD,EAAE,OAAOD,OAAO,CAAC,CAAC;QAIlF,IAAI,CAACA,OAAO,IAAI,EAAE;YACd,IAAIE,OAAO;YACX,IAAIF,OAAO,IAAI,EACXE,OAAO,CAAC,EAAE,EAAEF,OAAO,IAAI,CAAC,CAAC,CAAC;YAE9B,MAAM,IAAIC,MAAM,CAAC,yBAAyB,EAAEC,KAAK,4BAA4B,CAAC;QAClF;QAEA,IAAIA,OAAOF,OAAO,KAAK,IAAIA,OAAO,IAAI;QACtC,IAAI,CAACE,MACDF,OAAO,IAAI,GAAGE,OAAOC,OAAOH,OAAO,IAAI,GAAG;QAI9C,IAAI,CAACJ,QAAQ,YAAY,IAAI,CAACG,MAAM,CAACG,KAAK,EAAE;YACxCH,MAAM,CAACG,KAAK,GAAGF;YACfA,OAAO,IAAI,IAAIA,OAAO,IAAI;QAC9B;IACJ;AACJ;AAEO,MAAMI;IAIT,YAAY,GAAGT,IAAsB,CAAE;aAH/B,OAAO,GAA2B,CAAC;aACnC,YAAY,GAAuC,CAAC;QAGxD,IAAI,CAAC,QAAQ,IAAIA;IACrB;IAEO,OAAyBO,IAAe,EAAE;QAC7C,IAAI,CAACA,MACD,OAAO;QAKX,OAAO,IAAI,CAAC,OAAO,CAACA,KAAe;IACvC;IAEO,OAAyBG,IAAe,EAAE;QAC7C,IAAI,IAAI,CAAC,YAAY,CAACA,KAAK,EACvB,OAAOZ,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAACY,KAAK;QAE7C,MAAMP,UAAU,IAAI,CAAC,UAAU,CAAIO;QACnC,IAAI,CAAC,YAAY,CAACA,KAAK,GAAGP;QAC1B,OAAOL,MAAM,IAAI,CAACK;IACtB;IAEO,iBAAmCO,IAAe,EAAE;QACvD,MAAMC,OAAO,IAAI,CAAC,MAAM,CAAID;QAC5B,IAAIC,AAAgB,MAAhBA,KAAK,MAAM,EACX,MAAM,IAAIL,MAAM,CAAC,8BAA8B,EAAEI,KAAK,EAAE,CAAC;QAE7D,OAAOC;IACX;IAEO,UAA4BD,IAAe,EAAE;QAChD,MAAMC,OAAO,IAAI,CAAC,gBAAgB,CAAID;QACtC,IAAIC,KAAK,MAAM,GAAG,GACd,MAAM,IAAIL,MACN,CAAC,2CAA2C,EAAEI,KAAK,4BAA4B,CAAC;QAGxF,OAAOC,IAAI,CAAC,EAAE;IAClB;IAEO,MAAMC,KAA0C,EAAQ;QAC3D,IAAIA,iBAAiBH,kBAAkB,YACnC,IAAI,CAAC,QAAQ,IAAIG,MAAM,GAAG;QAG9B,IAAI,CAAC,QAAQ,CAACA;IAClB;IAEO,YAAYC,SAA2B,EAAEH,IAAY,EAAQ;QAChE,IAAI,CAAC,QAAQ,IAAIG,UAAU,MAAM,CAACH;IACtC;IAEO,MAA6B;QAChC,OAAOI,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO;IACrC;IAEO,SAAS,GAAGd,IAAS,EAAQ;QAEhC,IAAI,CAAC,YAAY,GAAG,CAAC;QACrB,MAAM,CAACG,SAASF,QAAQ,GAAGF,cAAcC;QACzCE,wBAAOC,SAASF,SAAS,IAAI,CAAC,OAAO;IACzC;IAEO,WAAWM,IAAY,EAAQ;QAElC,IAAI,CAAC,YAAY,GAAG,CAAC;QACrB,OAAO,IAAI,CAAC,OAAO,CAACA,KAAK;IAC7B;IAEQ,WAA6BG,IAAe,EAAE;QAClD,OAAOI,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CACrC,CAACC,KAAgBA,GAAG,IAAI,KAAKL;IAErC;AACJ"} |
+0
-2
| export { PluginsContainer } from "./PluginsContainer.js"; | ||
| //# sourceMappingURL=types.js.map |
| {"version":3,"names":["PluginsContainer"],"sources":["types.ts"],"sourcesContent":["export { PluginsContainer } from \"./PluginsContainer.js\";\n\nexport type Plugin<T = Record<string, any>> = {\n type: string;\n name?: string;\n init?: () => void;\n [key: string]: any;\n} & T;\n\nexport type PluginCollection = (Plugin | PluginFactory | PluginCollection)[];\n\nexport type PluginFactory = () => Promise<Plugin | PluginCollection>;\n"],"mappings":"AAAA,SAASA,gBAAgB","ignoreList":[]} |
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
19263
-10.62%17
-5.56%175
-11.17%2
100%