@kubb/core 0.11.0 → 0.11.2

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/index.d.ts CHANGED
@@ -36,7 +36,6 @@ declare class FileEmitter {
36
36
  on(...params: Parameters<typeof this$1.emitter['on']>): void;
37
37
  private assignReferenceId;
38
38
  getEmittedFile: (fileReferenceId?: string | null) => EmittedFile | undefined;
39
- getFileName: (fileReferenceId: string | null) => string | undefined;
40
39
  }
41
40
 
42
41
  interface SerializablePluginCache {
@@ -66,7 +65,6 @@ declare class PluginDriver {
66
65
  constructor(config: Api['config'], pluginCache: Record<string, SerializablePluginCache> | undefined, options: {
67
66
  logger: BuildContext['logger'];
68
67
  });
69
- get apis(): ReadonlyMap<Plugin<PluginOptions<unknown, false, any>>, PluginContext>;
70
68
  get api(): PluginContext;
71
69
  emitFile(...params: Parameters<FileEmitter['emitFile']>): Promise<EmittedFile>;
72
70
  resolveId: (source: string, importer: string, meta: Record<string, any> | undefined) => Promise<string | null | undefined>;
@@ -120,7 +118,7 @@ type PluginFactory<TOptions extends PluginOptions = PluginOptions> = (options: T
120
118
  declare function createPlugin<TOptions extends PluginOptions = PluginOptions>(factory: PluginFactory<TOptions>): (userOptions: TOptions['userOptions']) => TOptions["nested"] extends true ? Plugin<TOptions>[] : Plugin<TOptions>;
121
119
 
122
120
  interface ConfigEnv {
123
- mode: string;
121
+ mode: 'development';
124
122
  }
125
123
  interface UserConfig {
126
124
  /**
@@ -130,26 +128,25 @@ interface UserConfig {
130
128
  */
131
129
  root?: string;
132
130
  mode?: 'single';
133
- /**
134
- * plugins means it will run context, buildStart, transform and buildEnd based on order of the plugins array
135
- * Example of an order(plugin x does not have a buildEnd): [buildStart of plugin x, buildStart of plugin y, transform of plugin x, transform of plugin y, buildEnd of plugin y ]
136
- * Default: plugins
137
- */
138
- lifeCycle?: 'plugins';
139
- /**
140
- * Default: fifo
141
- */
142
- strategy?: 'fifo' | 'lifo';
143
131
  input: {
144
- schema: string;
132
+ /**
133
+ * Path or link to the input file
134
+ */
135
+ path: string;
145
136
  };
146
137
  output: {
138
+ /**
139
+ * Path to export folder
140
+ */
147
141
  path: string;
148
142
  };
149
143
  /**
150
- * Array of kubb plugins to use.
144
+ * Array of Kubb plugins to use.
151
145
  */
152
146
  plugins?: Plugin[];
147
+ /**
148
+ * Log level to report when using the CLI
149
+ */
153
150
  logLevel?: LogLevel;
154
151
  }
155
152
  type UserConfigFn = (env: ConfigEnv) => WithPromise<UserConfig>;
@@ -176,11 +173,10 @@ type Api = {
176
173
  config: UserConfig & {
177
174
  root: string;
178
175
  };
179
- schema: Schema;
176
+ input: Path;
180
177
  emitFile: FileEmitter['emitFile'];
181
178
  resolveId: (source: string, importer?: string, meta?: Record<string, any>) => WithPromise<string | null | undefined>;
182
179
  load: (id: string) => WithPromise<TransformResult | void>;
183
- getFileName: FileEmitter['getFileName'];
184
180
  getEmittedFile: FileEmitter['getEmittedFile'];
185
181
  on: FileEmitter['on'];
186
182
  };
@@ -192,7 +188,7 @@ type ValidationResult = true | {
192
188
  };
193
189
  type TransformResult = string | null;
194
190
  type Id = string;
195
- type Schema = string;
191
+ type Path = string;
196
192
  type LogType = 'error' | 'warn' | 'info';
197
193
  type LogLevel = LogType | 'silent';
198
194
 
@@ -219,4 +215,4 @@ declare function getPluginContext(this: PluginDriver, plugin: Plugin, pluginCach
219
215
  cache: Cache<any>;
220
216
  };
221
217
 
222
- export { Api, Argument0, BuildContext, Cache, ConfigEnv, EmitFile, EmittedFile, Emitter, FileEmitter, Id, Listener, LogLevel, LogType, Plugin, PluginContext, PluginDriver, PluginFactory, PluginLifecycle, PluginLifecycleHooks, PluginName, PluginOptions, Schema, SerializablePluginCache, TransformResult, UserConfig, UserConfigExport, UserConfigFn, ValidationResult, WithPromise, build, createPlugin, createPluginCache, build as default, defineConfig, format, getPluginContext, getRelativePath, hooks, isPromise, write };
218
+ export { Api, Argument0, BuildContext, Cache, ConfigEnv, EmitFile, EmittedFile, Emitter, FileEmitter, Id, Listener, LogLevel, LogType, Path, Plugin, PluginContext, PluginDriver, PluginFactory, PluginLifecycle, PluginLifecycleHooks, PluginName, PluginOptions, SerializablePluginCache, TransformResult, UserConfig, UserConfigExport, UserConfigFn, ValidationResult, WithPromise, build, createPlugin, createPluginCache, build as default, defineConfig, format, getPluginContext, getRelativePath, hooks, isPromise, write };
package/dist/index.js CHANGED
@@ -91,12 +91,6 @@ var FileEmitter = class {
91
91
  }
92
92
  return this.filesByReferenceId.get(fileReferenceId);
93
93
  };
94
- getFileName = (fileReferenceId) => {
95
- if (!fileReferenceId) {
96
- return void 0;
97
- }
98
- return this.filesByReferenceId.get(fileReferenceId)?.source;
99
- };
100
94
  };
101
95
 
102
96
  // src/utils/cache.ts
@@ -147,25 +141,25 @@ function createPlugin(factory) {
147
141
  return plugin;
148
142
  };
149
143
  }
150
- var createCorePlugin = createPlugin((options) => {
144
+ var name = "core";
145
+ var definePlugin = createPlugin((options) => {
151
146
  const { fileEmitter, resolveId, load } = options;
152
- const schema = fse2.readFileSync(path2.resolve(options.config.root, options.config.input.schema), "utf-8");
147
+ const schema = fse2.readFileSync(path2.resolve(options.config.root, options.config.input.path), "utf-8");
153
148
  const api = {
154
149
  get config() {
155
150
  return options.config;
156
151
  },
157
- get schema() {
152
+ get input() {
158
153
  return schema;
159
154
  },
160
155
  on: fileEmitter.on.bind(fileEmitter),
161
- getFileName: fileEmitter.getFileName.bind(fileEmitter),
162
156
  getEmittedFile: fileEmitter.getEmittedFile.bind(fileEmitter),
163
157
  emitFile: fileEmitter.emitFile.bind(fileEmitter),
164
158
  resolveId,
165
159
  load
166
160
  };
167
161
  return {
168
- name: "core",
162
+ name,
169
163
  api
170
164
  };
171
165
  });
@@ -193,7 +187,7 @@ var PluginDriver = class {
193
187
  this.config = config;
194
188
  this.fileEmitter = new FileEmitter();
195
189
  this.emitFile = this.fileEmitter.emitFile.bind(this.fileEmitter);
196
- const corePlugin = createCorePlugin({ config, fileEmitter: this.fileEmitter, load: this.load, resolveId: this.resolveId });
190
+ const corePlugin = definePlugin({ config, fileEmitter: this.fileEmitter, load: this.load, resolveId: this.resolveId });
197
191
  this.plugins = [corePlugin, ...config.plugins || []];
198
192
  const coreApi = corePlugin.api;
199
193
  this.pluginContexts = new Map(
@@ -206,9 +200,6 @@ var PluginDriver = class {
206
200
  })
207
201
  );
208
202
  }
209
- get apis() {
210
- return this.pluginContexts;
211
- }
212
203
  get api() {
213
204
  let context = {};
214
205
  this.pluginContexts.forEach((value) => {
@@ -322,12 +313,6 @@ async function transformReducer(previousCode, result, _plugin) {
322
313
  }
323
314
  async function buildImplementation(options, done) {
324
315
  const { config } = options;
325
- if (config.lifeCycle && config.lifeCycle !== "plugins") {
326
- throw new Error("Only lifeCycle plugins possible");
327
- }
328
- if (config.strategy && config.strategy !== "lifo") {
329
- throw new Error("Only strategy fifo possible");
330
- }
331
316
  const pluginCache = /* @__PURE__ */ Object.create(null);
332
317
  const pluginDriver = new PluginDriver(config, pluginCache, { logger: this.logger });
333
318
  const validations = await pluginDriver.hookParallel("validate", [pluginDriver.plugins]);
@@ -359,10 +344,10 @@ async function buildImplementation(options, done) {
359
344
  });
360
345
  await pluginDriver.hookParallel("buildStart");
361
346
  pluginDriver.emitFile({
362
- id: path2.resolve(pluginDriver.api.config.root, pluginDriver.api.config.input.schema),
363
- source: pluginDriver.api.config.input.schema,
347
+ id: path2.resolve(pluginDriver.api.config.root, pluginDriver.api.config.input.path),
348
+ source: pluginDriver.api.config.input.path,
364
349
  name: void 0,
365
- code: pluginDriver.api.schema
350
+ code: pluginDriver.api.input
366
351
  });
367
352
  pluginDriver.fileEmitter.on("end", async () => {
368
353
  await pluginDriver.hookParallel("buildEnd");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/build.ts","../src/utils/Emitter.ts","../src/utils/FileEmitter.ts","../src/utils/cache.ts","../src/context.ts","../src/plugin.ts","../src/utils/PluginDriver.ts","../src/config.ts","../src/utils/isPromise.ts","../src/utils/write.ts","../src/utils/format.ts","../src/utils/read.ts","../src/index.ts"],"names":["path","argument0","fse"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-empty-function */\n/* eslint-disable no-console */\n\nimport path from 'path'\n\nimport { PluginDriver } from './utils/PluginDriver'\n\nimport type { Api, PluginContext, TransformResult, ValidationResult, LogLevel } from './types'\nimport type { UserConfig, ConfigEnv } from './config'\nimport type { Plugin } from './plugin'\n\ntype BuildOutput = void\n\n// Same type as ora\ntype Spinner = {\n start: (text?: string) => Spinner\n succeed: (text: string) => Spinner\n stopAndPersist: (options: { text: string }) => Spinner\n render: () => Spinner\n text: string\n info: (text: string) => Spinner\n}\n\nexport type BuildContext = {\n logger?: {\n log: (message: string, logLevel: LogLevel) => void\n spinner?: Spinner\n }\n}\n\nasync function transformReducer(this: PluginContext, previousCode: string, result: TransformResult, _plugin: Plugin) {\n if (result === null) {\n return null\n }\n return result\n}\n\ntype BuildImplementationOptions = {\n config: Api['config']\n env: ConfigEnv\n}\n\nasync function buildImplementation(this: BuildContext, options: BuildImplementationOptions, done: (output: BuildOutput) => void) {\n const { config } = options\n if (config.lifeCycle && config.lifeCycle !== 'plugins') {\n throw new Error('Only lifeCycle plugins possible')\n }\n\n if (config.strategy && config.strategy !== 'lifo') {\n throw new Error('Only strategy fifo possible')\n }\n\n const pluginCache = Object.create(null)\n const pluginDriver = new PluginDriver(config, pluginCache, { logger: this.logger })\n\n const validations = await pluginDriver.hookParallel<'validate', ValidationResult>('validate', [pluginDriver.plugins])\n\n const validationsWithMessage = validations.filter(Boolean)\n\n if (validationsWithMessage.some((validation) => typeof validation !== 'boolean')) {\n validationsWithMessage.forEach((validation) => {\n if (validation && typeof validation !== 'boolean' && validation?.message) {\n this.logger?.log(validation.message, 'warn')\n }\n })\n\n return\n }\n\n pluginDriver.fileEmitter.on('new', async (emittedFile) => {\n if (!emittedFile?.source) {\n return\n }\n\n const resolvedId = await pluginDriver.hookFirst('resolveId', [emittedFile.source, path.resolve(emittedFile.source), emittedFile.meta])\n const id = resolvedId || emittedFile.source\n let { code } = emittedFile\n\n const loadedResult = await pluginDriver.hookFirst('load', [id])\n if (loadedResult) {\n code = loadedResult\n }\n\n if (code) {\n const result = await pluginDriver.hookReduceArg0('transform', [code, id], transformReducer)\n\n await pluginDriver.hookParallel('writeFile', [result, id])\n pluginDriver.fileEmitter.delete(emittedFile.id)\n }\n })\n\n await pluginDriver.hookParallel('buildStart')\n\n pluginDriver.emitFile({\n id: path.resolve(pluginDriver.api.config.root, pluginDriver.api.config.input.schema),\n source: pluginDriver.api.config.input.schema,\n name: undefined,\n code: pluginDriver.api.schema,\n })\n\n pluginDriver.fileEmitter.on('end', async () => {\n await pluginDriver.hookParallel('buildEnd')\n done()\n })\n}\n\nexport function build(this: BuildContext, userConfig: UserConfig, env: ConfigEnv): Promise<BuildOutput> {\n const config: UserConfig = {\n ...userConfig,\n root: userConfig.root || process.cwd(),\n }\n\n return new Promise((resolve) => {\n buildImplementation.call(\n this,\n {\n config,\n env,\n },\n resolve\n )\n })\n}\n","export type Listener<T> = (value?: T) => void\n\nexport class Emitter<TValue = unknown, TTopics = unknown> {\n private readonly listeners: Set<{\n topic?: TTopics\n cb: Listener<TValue>\n }> = new Set()\n\n private readonly topics?: TTopics[]\n\n constructor(topics?: TTopics[]) {\n this.topics = topics\n }\n\n emit(...params: [topic: TTopics, value?: TValue] | [value?: TValue]) {\n const isTopic = (value: any): value is TTopics => !!this.topics?.includes(value)\n\n if (isTopic(params[0])) {\n this.listeners.forEach((listener) => {\n if (listener.topic === params[0]) {\n listener.cb(params[1])\n }\n })\n return\n }\n this.listeners.forEach((listener) => listener.cb(params[0] as TValue))\n }\n\n subscribe: (cb: Listener<TValue>) => () => void = (cb) => {\n const listener = {\n topic: undefined,\n cb,\n }\n this.listeners.add(listener)\n // Unsubscribe\n return () => this.listeners.delete(listener)\n }\n\n on(topic: TTopics, cb: Listener<TValue>) {\n const listener = {\n topic,\n cb,\n }\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n destroy: () => void = () => this.listeners.clear()\n}\n","import { Emitter } from './Emitter'\n\nexport interface EmittedFile {\n id: string\n // this can be used as a dynamic path, also resolveId will use this as source(first parameter)\n source: string | undefined\n name: string | undefined\n code: string | undefined\n meta?: Record<string, any>\n}\n\nexport type EmitFile = (emittedFile: EmittedFile) => void\n\ntype Topics = 'new' | 'delete' | 'end'\nexport class FileEmitter {\n private readonly emitter: Emitter<EmittedFile, Topics>\n\n private readonly filesByReferenceId: Map<string, EmittedFile> = new Map()\n\n constructor(emitter: Emitter<EmittedFile, Topics> = new Emitter<EmittedFile, Topics>(['delete', 'end', 'new'])) {\n this.emitter = emitter\n }\n\n emitFile(emitedFile: EmittedFile) {\n // save locally in this class\n this.assignReferenceId(emitedFile, emitedFile.id)\n this.emitter.emit('new', emitedFile)\n return new Promise<EmittedFile>((resolve) => {\n const subscribe = this.emitter.on('delete', (deletedFile) => {\n if (deletedFile?.id === emitedFile.id) {\n resolve(deletedFile)\n return subscribe()\n }\n return undefined\n })\n })\n }\n\n delete(fileReferenceId: string) {\n const deletedFile = this.filesByReferenceId.get(fileReferenceId)\n this.filesByReferenceId.delete(fileReferenceId)\n if (this.filesByReferenceId.size === 0) {\n this.emitter.emit('end')\n }\n return this.emitter.emit('delete', deletedFile)\n }\n\n subscribe(...params: Parameters<typeof this.emitter['subscribe']>) {\n this.emitter.subscribe(...params)\n }\n\n on(...params: Parameters<typeof this.emitter['on']>) {\n this.emitter.on(...params)\n }\n\n private assignReferenceId(emittedFile: EmittedFile, fileReferenceId: string | undefined) {\n if (fileReferenceId) {\n this.filesByReferenceId.set(fileReferenceId, emittedFile)\n }\n }\n\n getEmittedFile = (fileReferenceId?: string | null): EmittedFile | undefined => {\n if (!fileReferenceId) {\n return undefined\n }\n return this.filesByReferenceId.get(fileReferenceId)\n }\n\n getFileName = (fileReferenceId: string | null): string | undefined => {\n if (!fileReferenceId) {\n return undefined\n }\n return this.filesByReferenceId.get(fileReferenceId)?.source\n }\n}\n","/* eslint-disable no-param-reassign */\n/* eslint-disable consistent-return */\nexport interface SerializablePluginCache {\n [key: string]: [number, any]\n}\n\nexport interface Cache<TCache = any> {\n delete(id: string): boolean\n get<T = TCache>(id: string): T\n has(id: string): boolean\n set<T = TCache>(id: string, value: T): void\n}\n\nexport function createPluginCache(cache: SerializablePluginCache): Cache {\n return {\n delete(id: string) {\n return delete cache[id]\n },\n get(id: string) {\n const item = cache[id]\n if (!item) return\n item[0] = 0\n return item[1]\n },\n has(id: string) {\n const item = cache[id]\n if (!item) return false\n item[0] = 0\n return true\n },\n set(id: string, value: any) {\n cache[id] = [0, value]\n },\n }\n}\n","/* eslint-disable no-param-reassign */\nimport { createPluginCache } from './utils/cache'\n\nimport type { PluginDriver } from './utils/PluginDriver'\nimport type { SerializablePluginCache } from './utils/cache'\nimport type { Plugin } from './plugin'\n\nexport function getPluginContext(this: PluginDriver, plugin: Plugin, pluginCache: Record<string, SerializablePluginCache> | void) {\n const cacheKey = plugin.cacheKey || (plugin.name as string)\n\n const cacheInstance = createPluginCache(pluginCache[cacheKey] || (pluginCache[cacheKey] = Object.create(null)))\n\n return {\n cache: cacheInstance,\n }\n}\n","/* eslint-disable no-console */\n\nimport path from 'path'\n\nimport fse from 'fs-extra'\n\nimport type { FileEmitter } from './utils'\nimport type { PluginLifecycle, PluginName, Api } from './types'\n\n// use of type objects\nexport type PluginOptions<UserOptions = unknown, Nested extends boolean = false, Api = any> = {\n userOptions: UserOptions\n nested: Nested\n api: Api\n}\n\nexport type Plugin<TOptions extends PluginOptions = PluginOptions> = {\n name: PluginName | Omit<string, PluginName>\n cacheKey?: string\n api?: TOptions['api']\n} & Partial<PluginLifecycle>\n\nexport type PluginFactory<TOptions extends PluginOptions = PluginOptions> = (\n options: TOptions['userOptions']\n) => TOptions['nested'] extends true ? Array<Plugin<TOptions>> : Plugin<TOptions>\n\nexport function createPlugin<TOptions extends PluginOptions = PluginOptions>(factory: PluginFactory<TOptions>) {\n return (userOptions: TOptions['userOptions']) => {\n const plugin = factory(userOptions)\n if (Array.isArray(plugin)) {\n throw new Error('Not implemented')\n }\n\n // default transform\n if (!plugin.transform) {\n plugin.transform = function transform(code) {\n return code\n }\n }\n\n return plugin\n }\n}\n\ntype Options = {\n // root will be filled in with a default value in build(process.cwd)\n config: Api['config']\n fileEmitter: FileEmitter\n resolveId: Api['resolveId']\n load: Api['load']\n}\n\n// not exported\ntype CorePluginOptions = PluginOptions<Options, false, Api>\n\nexport const createCorePlugin = createPlugin<CorePluginOptions>((options) => {\n const { fileEmitter, resolveId, load } = options\n\n const schema = fse.readFileSync(path.resolve(options.config.root, options.config.input.schema), 'utf-8')\n\n const api: Api = {\n get config() {\n return options.config\n },\n get schema() {\n return schema\n },\n on: fileEmitter.on.bind(fileEmitter),\n getFileName: fileEmitter.getFileName.bind(fileEmitter),\n getEmittedFile: fileEmitter.getEmittedFile.bind(fileEmitter),\n emitFile: fileEmitter.emitFile.bind(fileEmitter),\n resolveId,\n load,\n }\n\n return {\n name: 'core',\n api,\n }\n})\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable no-restricted-syntax */\n/* eslint-disable no-await-in-loop */\n/* eslint-disable no-undef */\n// inspired by: https://github.com/rollup/rollup/blob/master/src/utils/PluginDriver.ts#\n\nimport { FileEmitter } from './FileEmitter'\n\nimport { getPluginContext } from '../context'\nimport { createCorePlugin } from '../plugin'\n\nimport type { WithPromise } from './isPromise'\nimport type { BuildContext } from '../build'\nimport type { SerializablePluginCache } from './cache'\nimport type { Plugin } from '../plugin'\nimport type { PluginLifecycleHooks, PluginLifecycle, PluginContext, Api } from '../types'\n\n/**\n * Get the type of the first argument in a function.\n * @example Arg0<(a: string, b: number) => void> -> string\n */\nexport type Argument0<H extends keyof PluginLifecycle> = Parameters<PluginLifecycle[H]>[0]\n\ntype Strategy = 'hookFirst' | 'hookParallel' | 'hookReduceArg0' | 'hookSeq'\n\n// This will make sure no input hook is omitted\nconst hookNames: {\n [P in PluginLifecycleHooks]: 1\n} = {\n validate: 1,\n buildStart: 1,\n resolveId: 1,\n load: 1,\n transform: 1,\n writeFile: 1,\n buildEnd: 1,\n}\nexport const hooks = Object.keys(hookNames) as [PluginLifecycleHooks]\n\nexport class PluginDriver {\n private readonly pluginContexts: ReadonlyMap<Plugin, PluginContext>\n\n public plugins: Plugin[]\n\n public readonly fileEmitter: FileEmitter\n\n private readonly logger?: BuildContext['logger']\n\n private readonly config: Api['config']\n\n private readonly sortedPlugins = new Map<PluginLifecycleHooks, Plugin[]>()\n\n constructor(config: Api['config'], pluginCache: Record<string, SerializablePluginCache> | undefined, options: { logger: BuildContext['logger'] }) {\n this.logger = options.logger\n this.config = config\n\n this.fileEmitter = new FileEmitter()\n\n this.emitFile = this.fileEmitter.emitFile.bind(this.fileEmitter)\n\n const corePlugin = createCorePlugin({ config, fileEmitter: this.fileEmitter, load: this.load, resolveId: this.resolveId })\n this.plugins = [corePlugin, ...(config.plugins || [])]\n const coreApi = corePlugin.api\n this.pluginContexts = new Map(\n this.plugins.map((plugin) => {\n const context = {\n ...coreApi,\n ...getPluginContext.call(this, plugin, pluginCache),\n }\n return [plugin, context]\n })\n )\n }\n\n get apis() {\n return this.pluginContexts\n }\n\n get api() {\n let context = {}\n this.pluginContexts.forEach((value) => {\n context = { ...context, ...value }\n })\n return context as PluginContext\n }\n\n emitFile(...params: Parameters<FileEmitter['emitFile']>) {\n return this.fileEmitter.emitFile(...params)\n }\n\n resolveId = (source: string, importer: string, meta: Record<string, any> | undefined) => {\n return this.hookFirst('resolveId', [source, importer, meta])\n }\n\n load = async (id: string) => {\n const result = await this.hookFirst('load', [id])\n return result\n }\n\n // chains, first non-null result stops and returns\n hookFirst<H extends PluginLifecycleHooks>(\n hookName: H,\n parameters: Parameters<PluginLifecycle[H]>,\n skipped?: ReadonlySet<Plugin> | null\n ): Promise<ReturnType<PluginLifecycle[H]> | null> {\n let promise: Promise<ReturnType<PluginLifecycle[H]> | null> = Promise.resolve(null)\n for (const plugin of this.getSortedPlugins(hookName)) {\n if (skipped && skipped.has(plugin)) continue\n promise = promise.then((result) => {\n if (result != null) return result\n return this.runHook('hookFirst', hookName, parameters, plugin) as any\n })\n }\n return promise\n }\n\n // parallel\n async hookParallel<H extends PluginLifecycleHooks, TOuput = void>(hookName: H, parameters?: Parameters<PluginLifecycle[H]> | undefined) {\n const parallelPromises: Promise<TOuput>[] = []\n\n for (const plugin of this.getSortedPlugins(hookName)) {\n if ((plugin[hookName] as { sequential?: boolean })?.sequential) {\n await Promise.all(parallelPromises)\n parallelPromises.length = 0\n await this.runHook('hookParallel', hookName, parameters, plugin)\n } else {\n const promise: Promise<TOuput> = this.runHook('hookParallel', hookName, parameters, plugin)\n\n parallelPromises.push(promise)\n }\n }\n return Promise.all(parallelPromises)\n }\n\n // chains, reduces returned value, handling the reduced value as the first hook argument\n hookReduceArg0<H extends PluginLifecycleHooks>(\n hookName: H,\n [argument0, ...rest]: Parameters<PluginLifecycle[H]>,\n reduce: (reduction: Argument0<H>, result: ReturnType<PluginLifecycle[H]>, plugin: Plugin) => WithPromise<Argument0<H> | null>\n ): Promise<Argument0<H>> {\n let promise = Promise.resolve(argument0)\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise.then((argument0) =>\n this.runHook('hookReduceArg0', hookName, [argument0, ...rest] as Parameters<PluginLifecycle[H]>, plugin).then((result) =>\n reduce.call(this.api, argument0, result, plugin)\n )\n )\n }\n return promise\n }\n\n // chains\n\n hookSeq<H extends PluginLifecycleHooks>(hookName: H, parameters?: Parameters<PluginLifecycle[H]>) {\n let promise: Promise<void> = Promise.resolve()\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise.then(() => this.runHook('hookSeq', hookName, parameters, plugin))\n }\n return promise.then(noReturn)\n }\n\n private getSortedPlugins(_hookName: keyof PluginLifecycle): Plugin[] {\n return [...this.plugins]\n }\n\n /**\n * Run an async plugin hook and return the result.\n * @param hookName Name of the plugin hook. Must be either in `PluginHooks` or `OutputPluginValueHooks`.\n * @param args Arguments passed to the plugin hook.\n * @param plugin The actual pluginObject to run.\n */\n // Implementation signature\n private runHook<H extends PluginLifecycleHooks, TResult = void>(\n strategy: Strategy,\n hookName: H,\n parameters: unknown[] | undefined,\n plugin: Plugin\n ): Promise<TResult> {\n // We always filter for plugins that support the hook before running it\n const hook = plugin[hookName]!\n // const context = this.pluginContexts.get(plugin) || {};\n\n return Promise.resolve().then(() => {\n if (typeof hook !== 'function') {\n return hook\n }\n\n if (this.config.logLevel === 'info' && this.logger?.spinner) {\n this.logger.spinner.text = `[${strategy}] ${hookName}: Excecuting task for plugin ${plugin.name} \\n`\n }\n\n const hookResult = (hook as any).apply(this.api, parameters)\n\n if (!hookResult?.then) {\n // short circuit for non-thenables and non-Promises\n if (this.config.logLevel === 'info' && this.logger?.spinner) {\n this.logger.spinner.succeed(`[${strategy}] ${hookName}: Excecuting task for plugin ${plugin.name} \\n`)\n }\n return hookResult\n }\n\n return Promise.resolve(hookResult).then((result) => {\n // action was fulfilled\n if (this.config.logLevel === 'info' && this.logger?.spinner) {\n this.logger.spinner.succeed(`[${strategy}] ${hookName}: Excecuting task for plugin ${plugin.name} \\n`)\n }\n return result\n })\n })\n }\n\n /**\n * Run a sync plugin hook and return the result.\n * @param hookName Name of the plugin hook. Must be in `PluginHooks`.\n * @param args Arguments passed to the plugin hook.\n * @param plugin The acutal plugin\n * @param replaceContext When passed, the plugin context can be overridden.\n */\n private runHookSync<H extends PluginLifecycleHooks>(hookName: H, parameters: Parameters<PluginLifecycle[H]>, plugin: Plugin): ReturnType<PluginLifecycle[H]> {\n const hook = plugin[hookName]!\n\n // const context = this.pluginContexts.get(plugin)!;\n\n try {\n // eslint-disable-next-line @typescript-eslint/ban-types\n return (hook as Function).apply(this.api, parameters)\n } catch (error: any) {\n return error\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noReturn() {}\n","import type { WithPromise } from './utils/isPromise'\nimport type { LogLevel } from './types'\nimport type { Plugin } from './plugin'\n\nexport interface ConfigEnv {\n mode: string\n}\n// TODO revert to this to have multiple options like async, object, ...\n// export type PluginOption = PluginOptions | false | null | undefined | PluginOption[] | Promise<PluginOptions | false | null | undefined | PluginOption[]>;\n\nexport interface UserConfig {\n /**\n * Project root directory. Can be an absolute path, or a path relative from\n * the location of the config file itself.\n * @default process.cwd()\n */\n root?: string\n mode?: 'single'\n /**\n * plugins means it will run context, buildStart, transform and buildEnd based on order of the plugins array\n * Example of an order(plugin x does not have a buildEnd): [buildStart of plugin x, buildStart of plugin y, transform of plugin x, transform of plugin y, buildEnd of plugin y ]\n * Default: plugins\n */\n lifeCycle?: 'plugins'\n /**\n * Default: fifo\n */\n strategy?: 'fifo' | 'lifo'\n input: {\n schema: string\n }\n output: {\n path: string\n }\n /**\n * Array of kubb plugins to use.\n */\n plugins?: Plugin[]\n\n logLevel?: LogLevel\n}\n\nexport type UserConfigFn = (env: ConfigEnv) => WithPromise<UserConfig>\nexport type UserConfigExport = WithPromise<UserConfig> | UserConfigFn\n\n/**\n * Type helper to make it easier to use kubb.config.ts\n * accepts a direct {@link UserConfig} object, or a function that returns it.\n * The function receives a {@link ConfigEnv} object that exposes two properties:\n */\nexport function defineConfig(config: UserConfigExport): UserConfigExport {\n return config\n}\n","export type WithPromise<T> = Promise<T> | T\n\nexport const isPromise = <T>(result: WithPromise<T>): result is Promise<T> => {\n return typeof (result as any)?.then === 'function'\n}\n","/* eslint-disable consistent-return */\nimport fse from 'fs-extra'\n\nimport { format } from './format'\n\ntype WriteOptions = {\n format: boolean\n}\n\nexport const write = async (data: string, path: string, options: WriteOptions = { format: false }) => {\n const formattedData = options.format ? format(data) : data\n\n try {\n await fse.stat(path)\n const oldContent = await fse.readFile(path, { encoding: 'utf-8' })\n if (oldContent?.toString() === formattedData) {\n return\n }\n } catch (_err) {\n return fse.outputFile(path, formattedData)\n }\n\n return fse.outputFile(path, formattedData)\n}\n","import { format as prettierFormat } from 'prettier'\n\nimport type { Options } from 'prettier'\n\nconst formatOptions: Options = {\n tabWidth: 2,\n printWidth: 160,\n parser: 'typescript',\n singleQuote: true,\n semi: false,\n bracketSameLine: false,\n endOfLine: 'auto',\n}\nexport const format = (text: string) => {\n return prettierFormat(text, formatOptions)\n}\n","import path from 'path'\n\n// TODO check for a better way or resolving the relative path\nexport const getRelativePath = (from?: string | null, to?: string | null) => {\n if (!from || !to) {\n throw new Error('From and to should be filled in when retrieving the relativePath')\n }\n const newPath = path.relative(from, to).replace('../', '').replace('.ts', '').trimEnd()\n\n if (newPath.startsWith('./') || newPath.startsWith('../')) {\n return newPath.replace\n }\n return `./${newPath}`\n}\n","/* eslint-disable @typescript-eslint/no-empty-interface */\nimport { build } from './build'\n\nexport * from './config'\nexport * from './build'\nexport { Plugin, PluginOptions, PluginFactory, createPlugin } from './plugin'\nexport * from './utils'\nexport * from './types'\nexport * from './context'\n\nexport default build\n"]}
1
+ {"version":3,"sources":["../src/build.ts","../src/utils/Emitter.ts","../src/utils/FileEmitter.ts","../src/utils/cache.ts","../src/context.ts","../src/plugin.ts","../src/utils/PluginDriver.ts","../src/config.ts","../src/utils/isPromise.ts","../src/utils/write.ts","../src/utils/format.ts","../src/utils/read.ts","../src/index.ts"],"names":["path","argument0","fse"],"mappings":";AAIA,OAAOA,WAAU;;;ACFV,IAAM,UAAN,MAAmD;AAAA,EACvC,YAGZ,oBAAI,IAAI;AAAA,EAEI;AAAA,EAEjB,YAAY,QAAoB;AAC9B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAQ,QAA6D;AACnE,UAAM,UAAU,CAAC,UAAiC,CAAC,CAAC,KAAK,QAAQ,SAAS,KAAK;AAE/E,QAAI,QAAQ,OAAO,EAAE,GAAG;AACtB,WAAK,UAAU,QAAQ,CAAC,aAAa;AACnC,YAAI,SAAS,UAAU,OAAO,IAAI;AAChC,mBAAS,GAAG,OAAO,EAAE;AAAA,QACvB;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,SAAK,UAAU,QAAQ,CAAC,aAAa,SAAS,GAAG,OAAO,EAAY,CAAC;AAAA,EACvE;AAAA,EAEA,YAAkD,CAAC,OAAO;AACxD,UAAM,WAAW;AAAA,MACf,OAAO;AAAA,MACP;AAAA,IACF;AACA,SAAK,UAAU,IAAI,QAAQ;AAE3B,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,EAC7C;AAAA,EAEA,GAAG,OAAgB,IAAsB;AACvC,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,IACF;AACA,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,EAC7C;AAAA,EAEA,UAAsB,MAAM,KAAK,UAAU,MAAM;AACnD;;;AClCO,IAAM,cAAN,MAAkB;AAAA,EACN;AAAA,EAEA,qBAA+C,oBAAI,IAAI;AAAA,EAExE,YAAY,UAAwC,IAAI,QAA6B,CAAC,UAAU,OAAO,KAAK,CAAC,GAAG;AAC9G,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,SAAS,YAAyB;AAEhC,SAAK,kBAAkB,YAAY,WAAW,EAAE;AAChD,SAAK,QAAQ,KAAK,OAAO,UAAU;AACnC,WAAO,IAAI,QAAqB,CAAC,YAAY;AAC3C,YAAM,YAAY,KAAK,QAAQ,GAAG,UAAU,CAAC,gBAAgB;AAC3D,YAAI,aAAa,OAAO,WAAW,IAAI;AACrC,kBAAQ,WAAW;AACnB,iBAAO,UAAU;AAAA,QACnB;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,iBAAyB;AAC9B,UAAM,cAAc,KAAK,mBAAmB,IAAI,eAAe;AAC/D,SAAK,mBAAmB,OAAO,eAAe;AAC9C,QAAI,KAAK,mBAAmB,SAAS,GAAG;AACtC,WAAK,QAAQ,KAAK,KAAK;AAAA,IACzB;AACA,WAAO,KAAK,QAAQ,KAAK,UAAU,WAAW;AAAA,EAChD;AAAA,EAEA,aAAa,QAAsD;AACjE,SAAK,QAAQ,UAAU,GAAG,MAAM;AAAA,EAClC;AAAA,EAEA,MAAM,QAA+C;AACnD,SAAK,QAAQ,GAAG,GAAG,MAAM;AAAA,EAC3B;AAAA,EAEQ,kBAAkB,aAA0B,iBAAqC;AACvF,QAAI,iBAAiB;AACnB,WAAK,mBAAmB,IAAI,iBAAiB,WAAW;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,iBAAiB,CAAC,oBAA6D;AAC7E,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,mBAAmB,IAAI,eAAe;AAAA,EACpD;AACF;;;ACtDO,SAAS,kBAAkB,OAAuC;AACvE,SAAO;AAAA,IACL,OAAO,IAAY;AACjB,aAAO,OAAO,MAAM;AAAA,IACtB;AAAA,IACA,IAAI,IAAY;AACd,YAAM,OAAO,MAAM;AACnB,UAAI,CAAC;AAAM;AACX,WAAK,KAAK;AACV,aAAO,KAAK;AAAA,IACd;AAAA,IACA,IAAI,IAAY;AACd,YAAM,OAAO,MAAM;AACnB,UAAI,CAAC;AAAM,eAAO;AAClB,WAAK,KAAK;AACV,aAAO;AAAA,IACT;AAAA,IACA,IAAI,IAAY,OAAY;AAC1B,YAAM,MAAM,CAAC,GAAG,KAAK;AAAA,IACvB;AAAA,EACF;AACF;;;AC3BO,SAAS,iBAAqC,QAAgB,aAA6D;AAChI,QAAM,WAAW,OAAO,YAAa,OAAO;AAE5C,QAAM,gBAAgB,kBAAkB,YAAY,cAAc,YAAY,YAAY,uBAAO,OAAO,IAAI,EAAE;AAE9G,SAAO;AAAA,IACL,OAAO;AAAA,EACT;AACF;;;ACbA,OAAO,UAAU;AAEjB,OAAO,SAAS;AAsBT,SAAS,aAA6D,SAAkC;AAC7G,SAAO,CAAC,gBAAyC;AAC/C,UAAM,SAAS,QAAQ,WAAW;AAClC,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AAGA,QAAI,CAAC,OAAO,WAAW;AACrB,aAAO,YAAY,SAAS,UAAU,MAAM;AAC1C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAaO,IAAM,OAAO;AAEb,IAAM,eAAe,aAAgC,CAAC,YAAY;AACvE,QAAM,EAAE,aAAa,WAAW,KAAK,IAAI;AAEzC,QAAM,SAAS,IAAI,aAAa,KAAK,QAAQ,QAAQ,OAAO,MAAM,QAAQ,OAAO,MAAM,IAAI,GAAG,OAAO;AAErG,QAAM,MAAW;AAAA,IACf,IAAI,SAAS;AACX,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA,IAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,IACA,IAAI,YAAY,GAAG,KAAK,WAAW;AAAA,IACnC,gBAAgB,YAAY,eAAe,KAAK,WAAW;AAAA,IAC3D,UAAU,YAAY,SAAS,KAAK,WAAW;AAAA,IAC/C;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF,CAAC;;;ACrDD,IAAM,YAEF;AAAA,EACF,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,MAAM;AAAA,EACN,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AACZ;AACO,IAAM,QAAQ,OAAO,KAAK,SAAS;AAEnC,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EAEV;AAAA,EAES;AAAA,EAEC;AAAA,EAEA;AAAA,EAEA,gBAAgB,oBAAI,IAAoC;AAAA,EAEzE,YAAY,QAAuB,aAAkE,SAA6C;AAChJ,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS;AAEd,SAAK,cAAc,IAAI,YAAY;AAEnC,SAAK,WAAW,KAAK,YAAY,SAAS,KAAK,KAAK,WAAW;AAE/D,UAAM,aAAa,aAAa,EAAE,QAAQ,aAAa,KAAK,aAAa,MAAM,KAAK,MAAM,WAAW,KAAK,UAAU,CAAC;AACrH,SAAK,UAAU,CAAC,YAAY,GAAI,OAAO,WAAW,CAAC,CAAE;AACrD,UAAM,UAAU,WAAW;AAC3B,SAAK,iBAAiB,IAAI;AAAA,MACxB,KAAK,QAAQ,IAAI,CAAC,WAAW;AAC3B,cAAM,UAAU;AAAA,UACd,GAAG;AAAA,UACH,GAAG,iBAAiB,KAAK,MAAM,QAAQ,WAAW;AAAA,QACpD;AACA,eAAO,CAAC,QAAQ,OAAO;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,IAAI,MAAM;AACR,QAAI,UAAU,CAAC;AACf,SAAK,eAAe,QAAQ,CAAC,UAAU;AACrC,gBAAU,EAAE,GAAG,SAAS,GAAG,MAAM;AAAA,IACnC,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,QAA6C;AACvD,WAAO,KAAK,YAAY,SAAS,GAAG,MAAM;AAAA,EAC5C;AAAA,EAEA,YAAY,CAAC,QAAgB,UAAkB,SAA0C;AACvF,WAAO,KAAK,UAAU,aAAa,CAAC,QAAQ,UAAU,IAAI,CAAC;AAAA,EAC7D;AAAA,EAEA,OAAO,OAAO,OAAe;AAC3B,UAAM,SAAS,MAAM,KAAK,UAAU,QAAQ,CAAC,EAAE,CAAC;AAChD,WAAO;AAAA,EACT;AAAA,EAGA,UACE,UACA,YACA,SACgD;AAChD,QAAI,UAA0D,QAAQ,QAAQ,IAAI;AAClF,eAAW,UAAU,KAAK,iBAAiB,QAAQ,GAAG;AACpD,UAAI,WAAW,QAAQ,IAAI,MAAM;AAAG;AACpC,gBAAU,QAAQ,KAAK,CAAC,WAAW;AACjC,YAAI,UAAU;AAAM,iBAAO;AAC3B,eAAO,KAAK,QAAQ,aAAa,UAAU,YAAY,MAAM;AAAA,MAC/D,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAGA,MAAM,aAA4D,UAAa,YAAyD;AACtI,UAAM,mBAAsC,CAAC;AAE7C,eAAW,UAAU,KAAK,iBAAiB,QAAQ,GAAG;AACpD,UAAK,OAAO,WAAwC,YAAY;AAC9D,cAAM,QAAQ,IAAI,gBAAgB;AAClC,yBAAiB,SAAS;AAC1B,cAAM,KAAK,QAAQ,gBAAgB,UAAU,YAAY,MAAM;AAAA,MACjE,OAAO;AACL,cAAM,UAA2B,KAAK,QAAQ,gBAAgB,UAAU,YAAY,MAAM;AAE1F,yBAAiB,KAAK,OAAO;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,QAAQ,IAAI,gBAAgB;AAAA,EACrC;AAAA,EAGA,eACE,UACA,CAAC,cAAc,IAAI,GACnB,QACuB;AACvB,QAAI,UAAU,QAAQ,QAAQ,SAAS;AACvC,eAAW,UAAU,KAAK,iBAAiB,QAAQ,GAAG;AACpD,gBAAU,QAAQ;AAAA,QAAK,CAACC,eACtB,KAAK,QAAQ,kBAAkB,UAAU,CAACA,YAAW,GAAG,IAAI,GAAqC,MAAM,EAAE;AAAA,UAAK,CAAC,WAC7G,OAAO,KAAK,KAAK,KAAKA,YAAW,QAAQ,MAAM;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAIA,QAAwC,UAAa,YAA6C;AAChG,QAAI,UAAyB,QAAQ,QAAQ;AAC7C,eAAW,UAAU,KAAK,iBAAiB,QAAQ,GAAG;AACpD,gBAAU,QAAQ,KAAK,MAAM,KAAK,QAAQ,WAAW,UAAU,YAAY,MAAM,CAAC;AAAA,IACpF;AACA,WAAO,QAAQ,KAAK,QAAQ;AAAA,EAC9B;AAAA,EAEQ,iBAAiB,WAA4C;AACnE,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB;AAAA,EASQ,QACN,UACA,UACA,YACA,QACkB;AAElB,UAAM,OAAO,OAAO;AAGpB,WAAO,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAClC,UAAI,OAAO,SAAS,YAAY;AAC9B,eAAO;AAAA,MACT;AAEA,UAAI,KAAK,OAAO,aAAa,UAAU,KAAK,QAAQ,SAAS;AAC3D,aAAK,OAAO,QAAQ,OAAO,IAAI,aAAa,wCAAwC,OAAO;AAAA;AAAA,MAC7F;AAEA,YAAM,aAAc,KAAa,MAAM,KAAK,KAAK,UAAU;AAE3D,UAAI,CAAC,YAAY,MAAM;AAErB,YAAI,KAAK,OAAO,aAAa,UAAU,KAAK,QAAQ,SAAS;AAC3D,eAAK,OAAO,QAAQ,QAAQ,IAAI,aAAa,wCAAwC,OAAO;AAAA,CAAS;AAAA,QACvG;AACA,eAAO;AAAA,MACT;AAEA,aAAO,QAAQ,QAAQ,UAAU,EAAE,KAAK,CAAC,WAAW;AAElD,YAAI,KAAK,OAAO,aAAa,UAAU,KAAK,QAAQ,SAAS;AAC3D,eAAK,OAAO,QAAQ,QAAQ,IAAI,aAAa,wCAAwC,OAAO;AAAA,CAAS;AAAA,QACvG;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EASQ,YAA4C,UAAa,YAA4C,QAAgD;AAC3J,UAAM,OAAO,OAAO;AAIpB,QAAI;AAEF,aAAQ,KAAkB,MAAM,KAAK,KAAK,UAAU;AAAA,IACtD,SAAS,OAAP;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAGA,SAAS,WAAW;AAAC;;;ANvMrB,eAAe,iBAAsC,cAAsB,QAAyB,SAAiB;AACnH,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAOA,eAAe,oBAAwC,SAAqC,MAAqC;AAC/H,QAAM,EAAE,OAAO,IAAI;AAEnB,QAAM,cAAc,uBAAO,OAAO,IAAI;AACtC,QAAM,eAAe,IAAI,aAAa,QAAQ,aAAa,EAAE,QAAQ,KAAK,OAAO,CAAC;AAElF,QAAM,cAAc,MAAM,aAAa,aAA2C,YAAY,CAAC,aAAa,OAAO,CAAC;AAEpH,QAAM,yBAAyB,YAAY,OAAO,OAAO;AAEzD,MAAI,uBAAuB,KAAK,CAAC,eAAe,OAAO,eAAe,SAAS,GAAG;AAChF,2BAAuB,QAAQ,CAAC,eAAe;AAC7C,UAAI,cAAc,OAAO,eAAe,aAAa,YAAY,SAAS;AACxE,aAAK,QAAQ,IAAI,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,IACF,CAAC;AAED;AAAA,EACF;AAEA,eAAa,YAAY,GAAG,OAAO,OAAO,gBAAgB;AACxD,QAAI,CAAC,aAAa,QAAQ;AACxB;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,aAAa,UAAU,aAAa,CAAC,YAAY,QAAQD,MAAK,QAAQ,YAAY,MAAM,GAAG,YAAY,IAAI,CAAC;AACrI,UAAM,KAAK,cAAc,YAAY;AACrC,QAAI,EAAE,KAAK,IAAI;AAEf,UAAM,eAAe,MAAM,aAAa,UAAU,QAAQ,CAAC,EAAE,CAAC;AAC9D,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAEA,QAAI,MAAM;AACR,YAAM,SAAS,MAAM,aAAa,eAAe,aAAa,CAAC,MAAM,EAAE,GAAG,gBAAgB;AAE1F,YAAM,aAAa,aAAa,aAAa,CAAC,QAAQ,EAAE,CAAC;AACzD,mBAAa,YAAY,OAAO,YAAY,EAAE;AAAA,IAChD;AAAA,EACF,CAAC;AAED,QAAM,aAAa,aAAa,YAAY;AAE5C,eAAa,SAAS;AAAA,IACpB,IAAIA,MAAK,QAAQ,aAAa,IAAI,OAAO,MAAM,aAAa,IAAI,OAAO,MAAM,IAAI;AAAA,IACjF,QAAQ,aAAa,IAAI,OAAO,MAAM;AAAA,IACtC,MAAM;AAAA,IACN,MAAM,aAAa,IAAI;AAAA,EACzB,CAAC;AAED,eAAa,YAAY,GAAG,OAAO,YAAY;AAC7C,UAAM,aAAa,aAAa,UAAU;AAC1C,SAAK;AAAA,EACP,CAAC;AACH;AAEO,SAAS,MAA0B,YAAwB,KAAsC;AACtG,QAAM,SAAqB;AAAA,IACzB,GAAG;AAAA,IACH,MAAM,WAAW,QAAQ,QAAQ,IAAI;AAAA,EACvC;AAEA,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,wBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AOnEO,SAAS,aAAa,QAA4C;AACvE,SAAO;AACT;;;ACjDO,IAAM,YAAY,CAAI,WAAiD;AAC5E,SAAO,OAAQ,QAAgB,SAAS;AAC1C;;;ACHA,OAAOE,UAAS;;;ACDhB,SAAS,UAAU,sBAAsB;AAIzC,IAAM,gBAAyB;AAAA,EAC7B,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,WAAW;AACb;AACO,IAAM,SAAS,CAAC,SAAiB;AACtC,SAAO,eAAe,MAAM,aAAa;AAC3C;;;ADNO,IAAM,QAAQ,OAAO,MAAcF,OAAc,UAAwB,EAAE,QAAQ,MAAM,MAAM;AACpG,QAAM,gBAAgB,QAAQ,SAAS,OAAO,IAAI,IAAI;AAEtD,MAAI;AACF,UAAME,KAAI,KAAKF,KAAI;AACnB,UAAM,aAAa,MAAME,KAAI,SAASF,OAAM,EAAE,UAAU,QAAQ,CAAC;AACjE,QAAI,YAAY,SAAS,MAAM,eAAe;AAC5C;AAAA,IACF;AAAA,EACF,SAAS,MAAP;AACA,WAAOE,KAAI,WAAWF,OAAM,aAAa;AAAA,EAC3C;AAEA,SAAOE,KAAI,WAAWF,OAAM,aAAa;AAC3C;;;AEvBA,OAAOA,WAAU;AAGV,IAAM,kBAAkB,CAAC,MAAsB,OAAuB;AAC3E,MAAI,CAAC,QAAQ,CAAC,IAAI;AAChB,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AACA,QAAM,UAAUA,MAAK,SAAS,MAAM,EAAE,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ;AAEtF,MAAI,QAAQ,WAAW,IAAI,KAAK,QAAQ,WAAW,KAAK,GAAG;AACzD,WAAO,QAAQ;AAAA,EACjB;AACA,SAAO,KAAK;AACd;;;ACHA,IAAO,cAAQ","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-empty-function */\n/* eslint-disable no-console */\n\nimport path from 'path'\n\nimport { PluginDriver } from './utils/PluginDriver'\n\nimport type { Api, PluginContext, TransformResult, ValidationResult, LogLevel } from './types'\nimport type { UserConfig, ConfigEnv } from './config'\nimport type { Plugin } from './plugin'\n\ntype BuildOutput = void\n\n// Same type as ora\ntype Spinner = {\n start: (text?: string) => Spinner\n succeed: (text: string) => Spinner\n stopAndPersist: (options: { text: string }) => Spinner\n render: () => Spinner\n text: string\n info: (text: string) => Spinner\n}\n\nexport type BuildContext = {\n logger?: {\n log: (message: string, logLevel: LogLevel) => void\n spinner?: Spinner\n }\n}\n\nasync function transformReducer(this: PluginContext, previousCode: string, result: TransformResult, _plugin: Plugin) {\n if (result === null) {\n return null\n }\n return result\n}\n\ntype BuildImplementationOptions = {\n config: Api['config']\n env: ConfigEnv\n}\n\nasync function buildImplementation(this: BuildContext, options: BuildImplementationOptions, done: (output: BuildOutput) => void) {\n const { config } = options\n\n const pluginCache = Object.create(null)\n const pluginDriver = new PluginDriver(config, pluginCache, { logger: this.logger })\n\n const validations = await pluginDriver.hookParallel<'validate', ValidationResult>('validate', [pluginDriver.plugins])\n\n const validationsWithMessage = validations.filter(Boolean)\n\n if (validationsWithMessage.some((validation) => typeof validation !== 'boolean')) {\n validationsWithMessage.forEach((validation) => {\n if (validation && typeof validation !== 'boolean' && validation?.message) {\n this.logger?.log(validation.message, 'warn')\n }\n })\n\n return\n }\n\n pluginDriver.fileEmitter.on('new', async (emittedFile) => {\n if (!emittedFile?.source) {\n return\n }\n\n const resolvedId = await pluginDriver.hookFirst('resolveId', [emittedFile.source, path.resolve(emittedFile.source), emittedFile.meta])\n const id = resolvedId || emittedFile.source\n let { code } = emittedFile\n\n const loadedResult = await pluginDriver.hookFirst('load', [id])\n if (loadedResult) {\n code = loadedResult\n }\n\n if (code) {\n const result = await pluginDriver.hookReduceArg0('transform', [code, id], transformReducer)\n\n await pluginDriver.hookParallel('writeFile', [result, id])\n pluginDriver.fileEmitter.delete(emittedFile.id)\n }\n })\n\n await pluginDriver.hookParallel('buildStart')\n\n pluginDriver.emitFile({\n id: path.resolve(pluginDriver.api.config.root, pluginDriver.api.config.input.path),\n source: pluginDriver.api.config.input.path,\n name: undefined,\n code: pluginDriver.api.input,\n })\n\n pluginDriver.fileEmitter.on('end', async () => {\n await pluginDriver.hookParallel('buildEnd')\n done()\n })\n}\n\nexport function build(this: BuildContext, userConfig: UserConfig, env: ConfigEnv): Promise<BuildOutput> {\n const config: UserConfig = {\n ...userConfig,\n root: userConfig.root || process.cwd(),\n }\n\n return new Promise((resolve) => {\n buildImplementation.call(\n this,\n {\n config,\n env,\n },\n resolve\n )\n })\n}\n","export type Listener<T> = (value?: T) => void\n\nexport class Emitter<TValue = unknown, TTopics = unknown> {\n private readonly listeners: Set<{\n topic?: TTopics\n cb: Listener<TValue>\n }> = new Set()\n\n private readonly topics?: TTopics[]\n\n constructor(topics?: TTopics[]) {\n this.topics = topics\n }\n\n emit(...params: [topic: TTopics, value?: TValue] | [value?: TValue]) {\n const isTopic = (value: any): value is TTopics => !!this.topics?.includes(value)\n\n if (isTopic(params[0])) {\n this.listeners.forEach((listener) => {\n if (listener.topic === params[0]) {\n listener.cb(params[1])\n }\n })\n return\n }\n this.listeners.forEach((listener) => listener.cb(params[0] as TValue))\n }\n\n subscribe: (cb: Listener<TValue>) => () => void = (cb) => {\n const listener = {\n topic: undefined,\n cb,\n }\n this.listeners.add(listener)\n // Unsubscribe\n return () => this.listeners.delete(listener)\n }\n\n on(topic: TTopics, cb: Listener<TValue>) {\n const listener = {\n topic,\n cb,\n }\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n destroy: () => void = () => this.listeners.clear()\n}\n","import { Emitter } from './Emitter'\n\nexport interface EmittedFile {\n id: string\n // this can be used as a dynamic path, also resolveId will use this as source(first parameter)\n source: string | undefined\n name: string | undefined\n code: string | undefined\n meta?: Record<string, any>\n}\n\nexport type EmitFile = (emittedFile: EmittedFile) => void\n\ntype Topics = 'new' | 'delete' | 'end'\nexport class FileEmitter {\n private readonly emitter: Emitter<EmittedFile, Topics>\n\n private readonly filesByReferenceId: Map<string, EmittedFile> = new Map()\n\n constructor(emitter: Emitter<EmittedFile, Topics> = new Emitter<EmittedFile, Topics>(['delete', 'end', 'new'])) {\n this.emitter = emitter\n }\n\n emitFile(emitedFile: EmittedFile) {\n // save locally in this class\n this.assignReferenceId(emitedFile, emitedFile.id)\n this.emitter.emit('new', emitedFile)\n return new Promise<EmittedFile>((resolve) => {\n const subscribe = this.emitter.on('delete', (deletedFile) => {\n if (deletedFile?.id === emitedFile.id) {\n resolve(deletedFile)\n return subscribe()\n }\n return undefined\n })\n })\n }\n\n delete(fileReferenceId: string) {\n const deletedFile = this.filesByReferenceId.get(fileReferenceId)\n this.filesByReferenceId.delete(fileReferenceId)\n if (this.filesByReferenceId.size === 0) {\n this.emitter.emit('end')\n }\n return this.emitter.emit('delete', deletedFile)\n }\n\n subscribe(...params: Parameters<typeof this.emitter['subscribe']>) {\n this.emitter.subscribe(...params)\n }\n\n on(...params: Parameters<typeof this.emitter['on']>) {\n this.emitter.on(...params)\n }\n\n private assignReferenceId(emittedFile: EmittedFile, fileReferenceId: string | undefined) {\n if (fileReferenceId) {\n this.filesByReferenceId.set(fileReferenceId, emittedFile)\n }\n }\n\n getEmittedFile = (fileReferenceId?: string | null): EmittedFile | undefined => {\n if (!fileReferenceId) {\n return undefined\n }\n return this.filesByReferenceId.get(fileReferenceId)\n }\n}\n","/* eslint-disable no-param-reassign */\n/* eslint-disable consistent-return */\nexport interface SerializablePluginCache {\n [key: string]: [number, any]\n}\n\nexport interface Cache<TCache = any> {\n delete(id: string): boolean\n get<T = TCache>(id: string): T\n has(id: string): boolean\n set<T = TCache>(id: string, value: T): void\n}\n\nexport function createPluginCache(cache: SerializablePluginCache): Cache {\n return {\n delete(id: string) {\n return delete cache[id]\n },\n get(id: string) {\n const item = cache[id]\n if (!item) return\n item[0] = 0\n return item[1]\n },\n has(id: string) {\n const item = cache[id]\n if (!item) return false\n item[0] = 0\n return true\n },\n set(id: string, value: any) {\n cache[id] = [0, value]\n },\n }\n}\n","/* eslint-disable no-param-reassign */\nimport { createPluginCache } from './utils/cache'\n\nimport type { PluginDriver } from './utils/PluginDriver'\nimport type { SerializablePluginCache } from './utils/cache'\nimport type { Plugin } from './plugin'\n\nexport function getPluginContext(this: PluginDriver, plugin: Plugin, pluginCache: Record<string, SerializablePluginCache> | void) {\n const cacheKey = plugin.cacheKey || (plugin.name as string)\n\n const cacheInstance = createPluginCache(pluginCache[cacheKey] || (pluginCache[cacheKey] = Object.create(null)))\n\n return {\n cache: cacheInstance,\n }\n}\n","/* eslint-disable no-console */\n\nimport path from 'path'\n\nimport fse from 'fs-extra'\n\nimport type { FileEmitter } from './utils'\nimport type { PluginLifecycle, PluginName, Api } from './types'\n\n// use of type objects\nexport type PluginOptions<UserOptions = unknown, Nested extends boolean = false, Api = any> = {\n userOptions: UserOptions\n nested: Nested\n api: Api\n}\n\nexport type Plugin<TOptions extends PluginOptions = PluginOptions> = {\n name: PluginName | Omit<string, PluginName>\n cacheKey?: string\n api?: TOptions['api']\n} & Partial<PluginLifecycle>\n\nexport type PluginFactory<TOptions extends PluginOptions = PluginOptions> = (\n options: TOptions['userOptions']\n) => TOptions['nested'] extends true ? Array<Plugin<TOptions>> : Plugin<TOptions>\n\nexport function createPlugin<TOptions extends PluginOptions = PluginOptions>(factory: PluginFactory<TOptions>) {\n return (userOptions: TOptions['userOptions']) => {\n const plugin = factory(userOptions)\n if (Array.isArray(plugin)) {\n throw new Error('Not implemented')\n }\n\n // default transform\n if (!plugin.transform) {\n plugin.transform = function transform(code) {\n return code\n }\n }\n\n return plugin\n }\n}\n\ntype Options = {\n // root will be filled in with a default value in build(process.cwd)\n config: Api['config']\n fileEmitter: FileEmitter\n resolveId: Api['resolveId']\n load: Api['load']\n}\n\n// not exported\ntype CorePluginOptions = PluginOptions<Options, false, Api>\n\nexport const name = 'core' as const\n\nexport const definePlugin = createPlugin<CorePluginOptions>((options) => {\n const { fileEmitter, resolveId, load } = options\n\n const schema = fse.readFileSync(path.resolve(options.config.root, options.config.input.path), 'utf-8')\n\n const api: Api = {\n get config() {\n return options.config\n },\n get input() {\n return schema\n },\n on: fileEmitter.on.bind(fileEmitter),\n getEmittedFile: fileEmitter.getEmittedFile.bind(fileEmitter),\n emitFile: fileEmitter.emitFile.bind(fileEmitter),\n resolveId,\n load,\n }\n\n return {\n name,\n api,\n }\n})\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable no-restricted-syntax */\n/* eslint-disable no-await-in-loop */\n/* eslint-disable no-undef */\n// inspired by: https://github.com/rollup/rollup/blob/master/src/utils/PluginDriver.ts#\n\nimport { FileEmitter } from './FileEmitter'\n\nimport { getPluginContext } from '../context'\nimport { definePlugin } from '../plugin'\n\nimport type { WithPromise } from './isPromise'\nimport type { BuildContext } from '../build'\nimport type { SerializablePluginCache } from './cache'\nimport type { Plugin } from '../plugin'\nimport type { PluginLifecycleHooks, PluginLifecycle, PluginContext, Api } from '../types'\n\n/**\n * Get the type of the first argument in a function.\n * @example Arg0<(a: string, b: number) => void> -> string\n */\nexport type Argument0<H extends keyof PluginLifecycle> = Parameters<PluginLifecycle[H]>[0]\n\ntype Strategy = 'hookFirst' | 'hookParallel' | 'hookReduceArg0' | 'hookSeq'\n\n// This will make sure no input hook is omitted\nconst hookNames: {\n [P in PluginLifecycleHooks]: 1\n} = {\n validate: 1,\n buildStart: 1,\n resolveId: 1,\n load: 1,\n transform: 1,\n writeFile: 1,\n buildEnd: 1,\n}\nexport const hooks = Object.keys(hookNames) as [PluginLifecycleHooks]\n\nexport class PluginDriver {\n private readonly pluginContexts: ReadonlyMap<Plugin, PluginContext>\n\n public plugins: Plugin[]\n\n public readonly fileEmitter: FileEmitter\n\n private readonly logger?: BuildContext['logger']\n\n private readonly config: Api['config']\n\n private readonly sortedPlugins = new Map<PluginLifecycleHooks, Plugin[]>()\n\n constructor(config: Api['config'], pluginCache: Record<string, SerializablePluginCache> | undefined, options: { logger: BuildContext['logger'] }) {\n this.logger = options.logger\n this.config = config\n\n this.fileEmitter = new FileEmitter()\n\n this.emitFile = this.fileEmitter.emitFile.bind(this.fileEmitter)\n\n const corePlugin = definePlugin({ config, fileEmitter: this.fileEmitter, load: this.load, resolveId: this.resolveId })\n this.plugins = [corePlugin, ...(config.plugins || [])]\n const coreApi = corePlugin.api\n this.pluginContexts = new Map(\n this.plugins.map((plugin) => {\n const context = {\n ...coreApi,\n ...getPluginContext.call(this, plugin, pluginCache),\n }\n return [plugin, context]\n })\n )\n }\n\n get api() {\n let context = {}\n this.pluginContexts.forEach((value) => {\n context = { ...context, ...value }\n })\n return context as PluginContext\n }\n\n emitFile(...params: Parameters<FileEmitter['emitFile']>) {\n return this.fileEmitter.emitFile(...params)\n }\n\n resolveId = (source: string, importer: string, meta: Record<string, any> | undefined) => {\n return this.hookFirst('resolveId', [source, importer, meta])\n }\n\n load = async (id: string) => {\n const result = await this.hookFirst('load', [id])\n return result\n }\n\n // chains, first non-null result stops and returns\n hookFirst<H extends PluginLifecycleHooks>(\n hookName: H,\n parameters: Parameters<PluginLifecycle[H]>,\n skipped?: ReadonlySet<Plugin> | null\n ): Promise<ReturnType<PluginLifecycle[H]> | null> {\n let promise: Promise<ReturnType<PluginLifecycle[H]> | null> = Promise.resolve(null)\n for (const plugin of this.getSortedPlugins(hookName)) {\n if (skipped && skipped.has(plugin)) continue\n promise = promise.then((result) => {\n if (result != null) return result\n return this.runHook('hookFirst', hookName, parameters, plugin) as any\n })\n }\n return promise\n }\n\n // parallel\n async hookParallel<H extends PluginLifecycleHooks, TOuput = void>(hookName: H, parameters?: Parameters<PluginLifecycle[H]> | undefined) {\n const parallelPromises: Promise<TOuput>[] = []\n\n for (const plugin of this.getSortedPlugins(hookName)) {\n if ((plugin[hookName] as { sequential?: boolean })?.sequential) {\n await Promise.all(parallelPromises)\n parallelPromises.length = 0\n await this.runHook('hookParallel', hookName, parameters, plugin)\n } else {\n const promise: Promise<TOuput> = this.runHook('hookParallel', hookName, parameters, plugin)\n\n parallelPromises.push(promise)\n }\n }\n return Promise.all(parallelPromises)\n }\n\n // chains, reduces returned value, handling the reduced value as the first hook argument\n hookReduceArg0<H extends PluginLifecycleHooks>(\n hookName: H,\n [argument0, ...rest]: Parameters<PluginLifecycle[H]>,\n reduce: (reduction: Argument0<H>, result: ReturnType<PluginLifecycle[H]>, plugin: Plugin) => WithPromise<Argument0<H> | null>\n ): Promise<Argument0<H>> {\n let promise = Promise.resolve(argument0)\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise.then((argument0) =>\n this.runHook('hookReduceArg0', hookName, [argument0, ...rest] as Parameters<PluginLifecycle[H]>, plugin).then((result) =>\n reduce.call(this.api, argument0, result, plugin)\n )\n )\n }\n return promise\n }\n\n // chains\n\n hookSeq<H extends PluginLifecycleHooks>(hookName: H, parameters?: Parameters<PluginLifecycle[H]>) {\n let promise: Promise<void> = Promise.resolve()\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise.then(() => this.runHook('hookSeq', hookName, parameters, plugin))\n }\n return promise.then(noReturn)\n }\n\n private getSortedPlugins(_hookName: keyof PluginLifecycle): Plugin[] {\n return [...this.plugins]\n }\n\n /**\n * Run an async plugin hook and return the result.\n * @param hookName Name of the plugin hook. Must be either in `PluginHooks` or `OutputPluginValueHooks`.\n * @param args Arguments passed to the plugin hook.\n * @param plugin The actual pluginObject to run.\n */\n // Implementation signature\n private runHook<H extends PluginLifecycleHooks, TResult = void>(\n strategy: Strategy,\n hookName: H,\n parameters: unknown[] | undefined,\n plugin: Plugin\n ): Promise<TResult> {\n // We always filter for plugins that support the hook before running it\n const hook = plugin[hookName]!\n // const context = this.pluginContexts.get(plugin) || {};\n\n return Promise.resolve().then(() => {\n if (typeof hook !== 'function') {\n return hook\n }\n\n if (this.config.logLevel === 'info' && this.logger?.spinner) {\n this.logger.spinner.text = `[${strategy}] ${hookName}: Excecuting task for plugin ${plugin.name} \\n`\n }\n\n const hookResult = (hook as any).apply(this.api, parameters)\n\n if (!hookResult?.then) {\n // short circuit for non-thenables and non-Promises\n if (this.config.logLevel === 'info' && this.logger?.spinner) {\n this.logger.spinner.succeed(`[${strategy}] ${hookName}: Excecuting task for plugin ${plugin.name} \\n`)\n }\n return hookResult\n }\n\n return Promise.resolve(hookResult).then((result) => {\n // action was fulfilled\n if (this.config.logLevel === 'info' && this.logger?.spinner) {\n this.logger.spinner.succeed(`[${strategy}] ${hookName}: Excecuting task for plugin ${plugin.name} \\n`)\n }\n return result\n })\n })\n }\n\n /**\n * Run a sync plugin hook and return the result.\n * @param hookName Name of the plugin hook. Must be in `PluginHooks`.\n * @param args Arguments passed to the plugin hook.\n * @param plugin The acutal plugin\n * @param replaceContext When passed, the plugin context can be overridden.\n */\n private runHookSync<H extends PluginLifecycleHooks>(hookName: H, parameters: Parameters<PluginLifecycle[H]>, plugin: Plugin): ReturnType<PluginLifecycle[H]> {\n const hook = plugin[hookName]!\n\n // const context = this.pluginContexts.get(plugin)!;\n\n try {\n // eslint-disable-next-line @typescript-eslint/ban-types\n return (hook as Function).apply(this.api, parameters)\n } catch (error: any) {\n return error\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noReturn() {}\n","import type { WithPromise } from './utils/isPromise'\nimport type { LogLevel } from './types'\nimport type { Plugin } from './plugin'\n\nexport interface ConfigEnv {\n mode: 'development'\n}\n// TODO revert to this to have multiple options like async, object, ...\n// export type PluginOption = PluginOptions | false | null | undefined | PluginOption[] | Promise<PluginOptions | false | null | undefined | PluginOption[]>;\n\nexport interface UserConfig {\n /**\n * Project root directory. Can be an absolute path, or a path relative from\n * the location of the config file itself.\n * @default process.cwd()\n */\n root?: string\n mode?: 'single'\n input: {\n /**\n * Path or link to the input file\n */\n path: string\n }\n output: {\n /**\n * Path to export folder\n */\n path: string\n }\n /**\n * Array of Kubb plugins to use.\n */\n plugins?: Plugin[]\n /**\n * Log level to report when using the CLI\n */\n\n logLevel?: LogLevel\n}\n\nexport type UserConfigFn = (env: ConfigEnv) => WithPromise<UserConfig>\nexport type UserConfigExport = WithPromise<UserConfig> | UserConfigFn\n\n/**\n * Type helper to make it easier to use kubb.config.ts\n * accepts a direct {@link UserConfig} object, or a function that returns it.\n * The function receives a {@link ConfigEnv} object that exposes two properties:\n */\nexport function defineConfig(config: UserConfigExport): UserConfigExport {\n return config\n}\n","export type WithPromise<T> = Promise<T> | T\n\nexport const isPromise = <T>(result: WithPromise<T>): result is Promise<T> => {\n return typeof (result as any)?.then === 'function'\n}\n","/* eslint-disable consistent-return */\nimport fse from 'fs-extra'\n\nimport { format } from './format'\n\ntype WriteOptions = {\n format: boolean\n}\n\nexport const write = async (data: string, path: string, options: WriteOptions = { format: false }) => {\n const formattedData = options.format ? format(data) : data\n\n try {\n await fse.stat(path)\n const oldContent = await fse.readFile(path, { encoding: 'utf-8' })\n if (oldContent?.toString() === formattedData) {\n return\n }\n } catch (_err) {\n return fse.outputFile(path, formattedData)\n }\n\n return fse.outputFile(path, formattedData)\n}\n","import { format as prettierFormat } from 'prettier'\n\nimport type { Options } from 'prettier'\n\nconst formatOptions: Options = {\n tabWidth: 2,\n printWidth: 160,\n parser: 'typescript',\n singleQuote: true,\n semi: false,\n bracketSameLine: false,\n endOfLine: 'auto',\n}\nexport const format = (text: string) => {\n return prettierFormat(text, formatOptions)\n}\n","import path from 'path'\n\n// TODO check for a better way or resolving the relative path\nexport const getRelativePath = (from?: string | null, to?: string | null) => {\n if (!from || !to) {\n throw new Error('From and to should be filled in when retrieving the relativePath')\n }\n const newPath = path.relative(from, to).replace('../', '').replace('.ts', '').trimEnd()\n\n if (newPath.startsWith('./') || newPath.startsWith('../')) {\n return newPath.replace\n }\n return `./${newPath}`\n}\n","/* eslint-disable @typescript-eslint/no-empty-interface */\nimport { build } from './build'\n\nexport * from './config'\nexport * from './build'\nexport { Plugin, PluginOptions, PluginFactory, createPlugin } from './plugin'\nexport * from './utils'\nexport * from './types'\nexport * from './context'\n\nexport default build\n"]}
package/dist/index.mjs CHANGED
@@ -87,12 +87,6 @@ var FileEmitter = class {
87
87
  }
88
88
  return this.filesByReferenceId.get(fileReferenceId);
89
89
  };
90
- getFileName = (fileReferenceId) => {
91
- if (!fileReferenceId) {
92
- return void 0;
93
- }
94
- return this.filesByReferenceId.get(fileReferenceId)?.source;
95
- };
96
90
  };
97
91
 
98
92
  // src/utils/cache.ts
@@ -143,25 +137,25 @@ function createPlugin(factory) {
143
137
  return plugin;
144
138
  };
145
139
  }
146
- var createCorePlugin = createPlugin((options) => {
140
+ var name = "core";
141
+ var definePlugin = createPlugin((options) => {
147
142
  const { fileEmitter, resolveId, load } = options;
148
- const schema = fse2.readFileSync(path2.resolve(options.config.root, options.config.input.schema), "utf-8");
143
+ const schema = fse2.readFileSync(path2.resolve(options.config.root, options.config.input.path), "utf-8");
149
144
  const api = {
150
145
  get config() {
151
146
  return options.config;
152
147
  },
153
- get schema() {
148
+ get input() {
154
149
  return schema;
155
150
  },
156
151
  on: fileEmitter.on.bind(fileEmitter),
157
- getFileName: fileEmitter.getFileName.bind(fileEmitter),
158
152
  getEmittedFile: fileEmitter.getEmittedFile.bind(fileEmitter),
159
153
  emitFile: fileEmitter.emitFile.bind(fileEmitter),
160
154
  resolveId,
161
155
  load
162
156
  };
163
157
  return {
164
- name: "core",
158
+ name,
165
159
  api
166
160
  };
167
161
  });
@@ -189,7 +183,7 @@ var PluginDriver = class {
189
183
  this.config = config;
190
184
  this.fileEmitter = new FileEmitter();
191
185
  this.emitFile = this.fileEmitter.emitFile.bind(this.fileEmitter);
192
- const corePlugin = createCorePlugin({ config, fileEmitter: this.fileEmitter, load: this.load, resolveId: this.resolveId });
186
+ const corePlugin = definePlugin({ config, fileEmitter: this.fileEmitter, load: this.load, resolveId: this.resolveId });
193
187
  this.plugins = [corePlugin, ...config.plugins || []];
194
188
  const coreApi = corePlugin.api;
195
189
  this.pluginContexts = new Map(
@@ -202,9 +196,6 @@ var PluginDriver = class {
202
196
  })
203
197
  );
204
198
  }
205
- get apis() {
206
- return this.pluginContexts;
207
- }
208
199
  get api() {
209
200
  let context = {};
210
201
  this.pluginContexts.forEach((value) => {
@@ -318,12 +309,6 @@ async function transformReducer(previousCode, result, _plugin) {
318
309
  }
319
310
  async function buildImplementation(options, done) {
320
311
  const { config } = options;
321
- if (config.lifeCycle && config.lifeCycle !== "plugins") {
322
- throw new Error("Only lifeCycle plugins possible");
323
- }
324
- if (config.strategy && config.strategy !== "lifo") {
325
- throw new Error("Only strategy fifo possible");
326
- }
327
312
  const pluginCache = /* @__PURE__ */ Object.create(null);
328
313
  const pluginDriver = new PluginDriver(config, pluginCache, { logger: this.logger });
329
314
  const validations = await pluginDriver.hookParallel("validate", [pluginDriver.plugins]);
@@ -355,10 +340,10 @@ async function buildImplementation(options, done) {
355
340
  });
356
341
  await pluginDriver.hookParallel("buildStart");
357
342
  pluginDriver.emitFile({
358
- id: path2.resolve(pluginDriver.api.config.root, pluginDriver.api.config.input.schema),
359
- source: pluginDriver.api.config.input.schema,
343
+ id: path2.resolve(pluginDriver.api.config.root, pluginDriver.api.config.input.path),
344
+ source: pluginDriver.api.config.input.path,
360
345
  name: void 0,
361
- code: pluginDriver.api.schema
346
+ code: pluginDriver.api.input
362
347
  });
363
348
  pluginDriver.fileEmitter.on("end", async () => {
364
349
  await pluginDriver.hookParallel("buildEnd");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/build.ts","../src/utils/Emitter.ts","../src/utils/FileEmitter.ts","../src/utils/cache.ts","../src/context.ts","../src/plugin.ts","../src/utils/PluginDriver.ts","../src/config.ts","../src/utils/isPromise.ts","../src/utils/write.ts","../src/utils/format.ts","../src/utils/read.ts","../src/index.ts"],"names":["path","argument0","fse"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-empty-function */\n/* eslint-disable no-console */\n\nimport path from 'path'\n\nimport { PluginDriver } from './utils/PluginDriver'\n\nimport type { Api, PluginContext, TransformResult, ValidationResult, LogLevel } from './types'\nimport type { UserConfig, ConfigEnv } from './config'\nimport type { Plugin } from './plugin'\n\ntype BuildOutput = void\n\n// Same type as ora\ntype Spinner = {\n start: (text?: string) => Spinner\n succeed: (text: string) => Spinner\n stopAndPersist: (options: { text: string }) => Spinner\n render: () => Spinner\n text: string\n info: (text: string) => Spinner\n}\n\nexport type BuildContext = {\n logger?: {\n log: (message: string, logLevel: LogLevel) => void\n spinner?: Spinner\n }\n}\n\nasync function transformReducer(this: PluginContext, previousCode: string, result: TransformResult, _plugin: Plugin) {\n if (result === null) {\n return null\n }\n return result\n}\n\ntype BuildImplementationOptions = {\n config: Api['config']\n env: ConfigEnv\n}\n\nasync function buildImplementation(this: BuildContext, options: BuildImplementationOptions, done: (output: BuildOutput) => void) {\n const { config } = options\n if (config.lifeCycle && config.lifeCycle !== 'plugins') {\n throw new Error('Only lifeCycle plugins possible')\n }\n\n if (config.strategy && config.strategy !== 'lifo') {\n throw new Error('Only strategy fifo possible')\n }\n\n const pluginCache = Object.create(null)\n const pluginDriver = new PluginDriver(config, pluginCache, { logger: this.logger })\n\n const validations = await pluginDriver.hookParallel<'validate', ValidationResult>('validate', [pluginDriver.plugins])\n\n const validationsWithMessage = validations.filter(Boolean)\n\n if (validationsWithMessage.some((validation) => typeof validation !== 'boolean')) {\n validationsWithMessage.forEach((validation) => {\n if (validation && typeof validation !== 'boolean' && validation?.message) {\n this.logger?.log(validation.message, 'warn')\n }\n })\n\n return\n }\n\n pluginDriver.fileEmitter.on('new', async (emittedFile) => {\n if (!emittedFile?.source) {\n return\n }\n\n const resolvedId = await pluginDriver.hookFirst('resolveId', [emittedFile.source, path.resolve(emittedFile.source), emittedFile.meta])\n const id = resolvedId || emittedFile.source\n let { code } = emittedFile\n\n const loadedResult = await pluginDriver.hookFirst('load', [id])\n if (loadedResult) {\n code = loadedResult\n }\n\n if (code) {\n const result = await pluginDriver.hookReduceArg0('transform', [code, id], transformReducer)\n\n await pluginDriver.hookParallel('writeFile', [result, id])\n pluginDriver.fileEmitter.delete(emittedFile.id)\n }\n })\n\n await pluginDriver.hookParallel('buildStart')\n\n pluginDriver.emitFile({\n id: path.resolve(pluginDriver.api.config.root, pluginDriver.api.config.input.schema),\n source: pluginDriver.api.config.input.schema,\n name: undefined,\n code: pluginDriver.api.schema,\n })\n\n pluginDriver.fileEmitter.on('end', async () => {\n await pluginDriver.hookParallel('buildEnd')\n done()\n })\n}\n\nexport function build(this: BuildContext, userConfig: UserConfig, env: ConfigEnv): Promise<BuildOutput> {\n const config: UserConfig = {\n ...userConfig,\n root: userConfig.root || process.cwd(),\n }\n\n return new Promise((resolve) => {\n buildImplementation.call(\n this,\n {\n config,\n env,\n },\n resolve\n )\n })\n}\n","export type Listener<T> = (value?: T) => void\n\nexport class Emitter<TValue = unknown, TTopics = unknown> {\n private readonly listeners: Set<{\n topic?: TTopics\n cb: Listener<TValue>\n }> = new Set()\n\n private readonly topics?: TTopics[]\n\n constructor(topics?: TTopics[]) {\n this.topics = topics\n }\n\n emit(...params: [topic: TTopics, value?: TValue] | [value?: TValue]) {\n const isTopic = (value: any): value is TTopics => !!this.topics?.includes(value)\n\n if (isTopic(params[0])) {\n this.listeners.forEach((listener) => {\n if (listener.topic === params[0]) {\n listener.cb(params[1])\n }\n })\n return\n }\n this.listeners.forEach((listener) => listener.cb(params[0] as TValue))\n }\n\n subscribe: (cb: Listener<TValue>) => () => void = (cb) => {\n const listener = {\n topic: undefined,\n cb,\n }\n this.listeners.add(listener)\n // Unsubscribe\n return () => this.listeners.delete(listener)\n }\n\n on(topic: TTopics, cb: Listener<TValue>) {\n const listener = {\n topic,\n cb,\n }\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n destroy: () => void = () => this.listeners.clear()\n}\n","import { Emitter } from './Emitter'\n\nexport interface EmittedFile {\n id: string\n // this can be used as a dynamic path, also resolveId will use this as source(first parameter)\n source: string | undefined\n name: string | undefined\n code: string | undefined\n meta?: Record<string, any>\n}\n\nexport type EmitFile = (emittedFile: EmittedFile) => void\n\ntype Topics = 'new' | 'delete' | 'end'\nexport class FileEmitter {\n private readonly emitter: Emitter<EmittedFile, Topics>\n\n private readonly filesByReferenceId: Map<string, EmittedFile> = new Map()\n\n constructor(emitter: Emitter<EmittedFile, Topics> = new Emitter<EmittedFile, Topics>(['delete', 'end', 'new'])) {\n this.emitter = emitter\n }\n\n emitFile(emitedFile: EmittedFile) {\n // save locally in this class\n this.assignReferenceId(emitedFile, emitedFile.id)\n this.emitter.emit('new', emitedFile)\n return new Promise<EmittedFile>((resolve) => {\n const subscribe = this.emitter.on('delete', (deletedFile) => {\n if (deletedFile?.id === emitedFile.id) {\n resolve(deletedFile)\n return subscribe()\n }\n return undefined\n })\n })\n }\n\n delete(fileReferenceId: string) {\n const deletedFile = this.filesByReferenceId.get(fileReferenceId)\n this.filesByReferenceId.delete(fileReferenceId)\n if (this.filesByReferenceId.size === 0) {\n this.emitter.emit('end')\n }\n return this.emitter.emit('delete', deletedFile)\n }\n\n subscribe(...params: Parameters<typeof this.emitter['subscribe']>) {\n this.emitter.subscribe(...params)\n }\n\n on(...params: Parameters<typeof this.emitter['on']>) {\n this.emitter.on(...params)\n }\n\n private assignReferenceId(emittedFile: EmittedFile, fileReferenceId: string | undefined) {\n if (fileReferenceId) {\n this.filesByReferenceId.set(fileReferenceId, emittedFile)\n }\n }\n\n getEmittedFile = (fileReferenceId?: string | null): EmittedFile | undefined => {\n if (!fileReferenceId) {\n return undefined\n }\n return this.filesByReferenceId.get(fileReferenceId)\n }\n\n getFileName = (fileReferenceId: string | null): string | undefined => {\n if (!fileReferenceId) {\n return undefined\n }\n return this.filesByReferenceId.get(fileReferenceId)?.source\n }\n}\n","/* eslint-disable no-param-reassign */\n/* eslint-disable consistent-return */\nexport interface SerializablePluginCache {\n [key: string]: [number, any]\n}\n\nexport interface Cache<TCache = any> {\n delete(id: string): boolean\n get<T = TCache>(id: string): T\n has(id: string): boolean\n set<T = TCache>(id: string, value: T): void\n}\n\nexport function createPluginCache(cache: SerializablePluginCache): Cache {\n return {\n delete(id: string) {\n return delete cache[id]\n },\n get(id: string) {\n const item = cache[id]\n if (!item) return\n item[0] = 0\n return item[1]\n },\n has(id: string) {\n const item = cache[id]\n if (!item) return false\n item[0] = 0\n return true\n },\n set(id: string, value: any) {\n cache[id] = [0, value]\n },\n }\n}\n","/* eslint-disable no-param-reassign */\nimport { createPluginCache } from './utils/cache'\n\nimport type { PluginDriver } from './utils/PluginDriver'\nimport type { SerializablePluginCache } from './utils/cache'\nimport type { Plugin } from './plugin'\n\nexport function getPluginContext(this: PluginDriver, plugin: Plugin, pluginCache: Record<string, SerializablePluginCache> | void) {\n const cacheKey = plugin.cacheKey || (plugin.name as string)\n\n const cacheInstance = createPluginCache(pluginCache[cacheKey] || (pluginCache[cacheKey] = Object.create(null)))\n\n return {\n cache: cacheInstance,\n }\n}\n","/* eslint-disable no-console */\n\nimport path from 'path'\n\nimport fse from 'fs-extra'\n\nimport type { FileEmitter } from './utils'\nimport type { PluginLifecycle, PluginName, Api } from './types'\n\n// use of type objects\nexport type PluginOptions<UserOptions = unknown, Nested extends boolean = false, Api = any> = {\n userOptions: UserOptions\n nested: Nested\n api: Api\n}\n\nexport type Plugin<TOptions extends PluginOptions = PluginOptions> = {\n name: PluginName | Omit<string, PluginName>\n cacheKey?: string\n api?: TOptions['api']\n} & Partial<PluginLifecycle>\n\nexport type PluginFactory<TOptions extends PluginOptions = PluginOptions> = (\n options: TOptions['userOptions']\n) => TOptions['nested'] extends true ? Array<Plugin<TOptions>> : Plugin<TOptions>\n\nexport function createPlugin<TOptions extends PluginOptions = PluginOptions>(factory: PluginFactory<TOptions>) {\n return (userOptions: TOptions['userOptions']) => {\n const plugin = factory(userOptions)\n if (Array.isArray(plugin)) {\n throw new Error('Not implemented')\n }\n\n // default transform\n if (!plugin.transform) {\n plugin.transform = function transform(code) {\n return code\n }\n }\n\n return plugin\n }\n}\n\ntype Options = {\n // root will be filled in with a default value in build(process.cwd)\n config: Api['config']\n fileEmitter: FileEmitter\n resolveId: Api['resolveId']\n load: Api['load']\n}\n\n// not exported\ntype CorePluginOptions = PluginOptions<Options, false, Api>\n\nexport const createCorePlugin = createPlugin<CorePluginOptions>((options) => {\n const { fileEmitter, resolveId, load } = options\n\n const schema = fse.readFileSync(path.resolve(options.config.root, options.config.input.schema), 'utf-8')\n\n const api: Api = {\n get config() {\n return options.config\n },\n get schema() {\n return schema\n },\n on: fileEmitter.on.bind(fileEmitter),\n getFileName: fileEmitter.getFileName.bind(fileEmitter),\n getEmittedFile: fileEmitter.getEmittedFile.bind(fileEmitter),\n emitFile: fileEmitter.emitFile.bind(fileEmitter),\n resolveId,\n load,\n }\n\n return {\n name: 'core',\n api,\n }\n})\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable no-restricted-syntax */\n/* eslint-disable no-await-in-loop */\n/* eslint-disable no-undef */\n// inspired by: https://github.com/rollup/rollup/blob/master/src/utils/PluginDriver.ts#\n\nimport { FileEmitter } from './FileEmitter'\n\nimport { getPluginContext } from '../context'\nimport { createCorePlugin } from '../plugin'\n\nimport type { WithPromise } from './isPromise'\nimport type { BuildContext } from '../build'\nimport type { SerializablePluginCache } from './cache'\nimport type { Plugin } from '../plugin'\nimport type { PluginLifecycleHooks, PluginLifecycle, PluginContext, Api } from '../types'\n\n/**\n * Get the type of the first argument in a function.\n * @example Arg0<(a: string, b: number) => void> -> string\n */\nexport type Argument0<H extends keyof PluginLifecycle> = Parameters<PluginLifecycle[H]>[0]\n\ntype Strategy = 'hookFirst' | 'hookParallel' | 'hookReduceArg0' | 'hookSeq'\n\n// This will make sure no input hook is omitted\nconst hookNames: {\n [P in PluginLifecycleHooks]: 1\n} = {\n validate: 1,\n buildStart: 1,\n resolveId: 1,\n load: 1,\n transform: 1,\n writeFile: 1,\n buildEnd: 1,\n}\nexport const hooks = Object.keys(hookNames) as [PluginLifecycleHooks]\n\nexport class PluginDriver {\n private readonly pluginContexts: ReadonlyMap<Plugin, PluginContext>\n\n public plugins: Plugin[]\n\n public readonly fileEmitter: FileEmitter\n\n private readonly logger?: BuildContext['logger']\n\n private readonly config: Api['config']\n\n private readonly sortedPlugins = new Map<PluginLifecycleHooks, Plugin[]>()\n\n constructor(config: Api['config'], pluginCache: Record<string, SerializablePluginCache> | undefined, options: { logger: BuildContext['logger'] }) {\n this.logger = options.logger\n this.config = config\n\n this.fileEmitter = new FileEmitter()\n\n this.emitFile = this.fileEmitter.emitFile.bind(this.fileEmitter)\n\n const corePlugin = createCorePlugin({ config, fileEmitter: this.fileEmitter, load: this.load, resolveId: this.resolveId })\n this.plugins = [corePlugin, ...(config.plugins || [])]\n const coreApi = corePlugin.api\n this.pluginContexts = new Map(\n this.plugins.map((plugin) => {\n const context = {\n ...coreApi,\n ...getPluginContext.call(this, plugin, pluginCache),\n }\n return [plugin, context]\n })\n )\n }\n\n get apis() {\n return this.pluginContexts\n }\n\n get api() {\n let context = {}\n this.pluginContexts.forEach((value) => {\n context = { ...context, ...value }\n })\n return context as PluginContext\n }\n\n emitFile(...params: Parameters<FileEmitter['emitFile']>) {\n return this.fileEmitter.emitFile(...params)\n }\n\n resolveId = (source: string, importer: string, meta: Record<string, any> | undefined) => {\n return this.hookFirst('resolveId', [source, importer, meta])\n }\n\n load = async (id: string) => {\n const result = await this.hookFirst('load', [id])\n return result\n }\n\n // chains, first non-null result stops and returns\n hookFirst<H extends PluginLifecycleHooks>(\n hookName: H,\n parameters: Parameters<PluginLifecycle[H]>,\n skipped?: ReadonlySet<Plugin> | null\n ): Promise<ReturnType<PluginLifecycle[H]> | null> {\n let promise: Promise<ReturnType<PluginLifecycle[H]> | null> = Promise.resolve(null)\n for (const plugin of this.getSortedPlugins(hookName)) {\n if (skipped && skipped.has(plugin)) continue\n promise = promise.then((result) => {\n if (result != null) return result\n return this.runHook('hookFirst', hookName, parameters, plugin) as any\n })\n }\n return promise\n }\n\n // parallel\n async hookParallel<H extends PluginLifecycleHooks, TOuput = void>(hookName: H, parameters?: Parameters<PluginLifecycle[H]> | undefined) {\n const parallelPromises: Promise<TOuput>[] = []\n\n for (const plugin of this.getSortedPlugins(hookName)) {\n if ((plugin[hookName] as { sequential?: boolean })?.sequential) {\n await Promise.all(parallelPromises)\n parallelPromises.length = 0\n await this.runHook('hookParallel', hookName, parameters, plugin)\n } else {\n const promise: Promise<TOuput> = this.runHook('hookParallel', hookName, parameters, plugin)\n\n parallelPromises.push(promise)\n }\n }\n return Promise.all(parallelPromises)\n }\n\n // chains, reduces returned value, handling the reduced value as the first hook argument\n hookReduceArg0<H extends PluginLifecycleHooks>(\n hookName: H,\n [argument0, ...rest]: Parameters<PluginLifecycle[H]>,\n reduce: (reduction: Argument0<H>, result: ReturnType<PluginLifecycle[H]>, plugin: Plugin) => WithPromise<Argument0<H> | null>\n ): Promise<Argument0<H>> {\n let promise = Promise.resolve(argument0)\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise.then((argument0) =>\n this.runHook('hookReduceArg0', hookName, [argument0, ...rest] as Parameters<PluginLifecycle[H]>, plugin).then((result) =>\n reduce.call(this.api, argument0, result, plugin)\n )\n )\n }\n return promise\n }\n\n // chains\n\n hookSeq<H extends PluginLifecycleHooks>(hookName: H, parameters?: Parameters<PluginLifecycle[H]>) {\n let promise: Promise<void> = Promise.resolve()\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise.then(() => this.runHook('hookSeq', hookName, parameters, plugin))\n }\n return promise.then(noReturn)\n }\n\n private getSortedPlugins(_hookName: keyof PluginLifecycle): Plugin[] {\n return [...this.plugins]\n }\n\n /**\n * Run an async plugin hook and return the result.\n * @param hookName Name of the plugin hook. Must be either in `PluginHooks` or `OutputPluginValueHooks`.\n * @param args Arguments passed to the plugin hook.\n * @param plugin The actual pluginObject to run.\n */\n // Implementation signature\n private runHook<H extends PluginLifecycleHooks, TResult = void>(\n strategy: Strategy,\n hookName: H,\n parameters: unknown[] | undefined,\n plugin: Plugin\n ): Promise<TResult> {\n // We always filter for plugins that support the hook before running it\n const hook = plugin[hookName]!\n // const context = this.pluginContexts.get(plugin) || {};\n\n return Promise.resolve().then(() => {\n if (typeof hook !== 'function') {\n return hook\n }\n\n if (this.config.logLevel === 'info' && this.logger?.spinner) {\n this.logger.spinner.text = `[${strategy}] ${hookName}: Excecuting task for plugin ${plugin.name} \\n`\n }\n\n const hookResult = (hook as any).apply(this.api, parameters)\n\n if (!hookResult?.then) {\n // short circuit for non-thenables and non-Promises\n if (this.config.logLevel === 'info' && this.logger?.spinner) {\n this.logger.spinner.succeed(`[${strategy}] ${hookName}: Excecuting task for plugin ${plugin.name} \\n`)\n }\n return hookResult\n }\n\n return Promise.resolve(hookResult).then((result) => {\n // action was fulfilled\n if (this.config.logLevel === 'info' && this.logger?.spinner) {\n this.logger.spinner.succeed(`[${strategy}] ${hookName}: Excecuting task for plugin ${plugin.name} \\n`)\n }\n return result\n })\n })\n }\n\n /**\n * Run a sync plugin hook and return the result.\n * @param hookName Name of the plugin hook. Must be in `PluginHooks`.\n * @param args Arguments passed to the plugin hook.\n * @param plugin The acutal plugin\n * @param replaceContext When passed, the plugin context can be overridden.\n */\n private runHookSync<H extends PluginLifecycleHooks>(hookName: H, parameters: Parameters<PluginLifecycle[H]>, plugin: Plugin): ReturnType<PluginLifecycle[H]> {\n const hook = plugin[hookName]!\n\n // const context = this.pluginContexts.get(plugin)!;\n\n try {\n // eslint-disable-next-line @typescript-eslint/ban-types\n return (hook as Function).apply(this.api, parameters)\n } catch (error: any) {\n return error\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noReturn() {}\n","import type { WithPromise } from './utils/isPromise'\nimport type { LogLevel } from './types'\nimport type { Plugin } from './plugin'\n\nexport interface ConfigEnv {\n mode: string\n}\n// TODO revert to this to have multiple options like async, object, ...\n// export type PluginOption = PluginOptions | false | null | undefined | PluginOption[] | Promise<PluginOptions | false | null | undefined | PluginOption[]>;\n\nexport interface UserConfig {\n /**\n * Project root directory. Can be an absolute path, or a path relative from\n * the location of the config file itself.\n * @default process.cwd()\n */\n root?: string\n mode?: 'single'\n /**\n * plugins means it will run context, buildStart, transform and buildEnd based on order of the plugins array\n * Example of an order(plugin x does not have a buildEnd): [buildStart of plugin x, buildStart of plugin y, transform of plugin x, transform of plugin y, buildEnd of plugin y ]\n * Default: plugins\n */\n lifeCycle?: 'plugins'\n /**\n * Default: fifo\n */\n strategy?: 'fifo' | 'lifo'\n input: {\n schema: string\n }\n output: {\n path: string\n }\n /**\n * Array of kubb plugins to use.\n */\n plugins?: Plugin[]\n\n logLevel?: LogLevel\n}\n\nexport type UserConfigFn = (env: ConfigEnv) => WithPromise<UserConfig>\nexport type UserConfigExport = WithPromise<UserConfig> | UserConfigFn\n\n/**\n * Type helper to make it easier to use kubb.config.ts\n * accepts a direct {@link UserConfig} object, or a function that returns it.\n * The function receives a {@link ConfigEnv} object that exposes two properties:\n */\nexport function defineConfig(config: UserConfigExport): UserConfigExport {\n return config\n}\n","export type WithPromise<T> = Promise<T> | T\n\nexport const isPromise = <T>(result: WithPromise<T>): result is Promise<T> => {\n return typeof (result as any)?.then === 'function'\n}\n","/* eslint-disable consistent-return */\nimport fse from 'fs-extra'\n\nimport { format } from './format'\n\ntype WriteOptions = {\n format: boolean\n}\n\nexport const write = async (data: string, path: string, options: WriteOptions = { format: false }) => {\n const formattedData = options.format ? format(data) : data\n\n try {\n await fse.stat(path)\n const oldContent = await fse.readFile(path, { encoding: 'utf-8' })\n if (oldContent?.toString() === formattedData) {\n return\n }\n } catch (_err) {\n return fse.outputFile(path, formattedData)\n }\n\n return fse.outputFile(path, formattedData)\n}\n","import { format as prettierFormat } from 'prettier'\n\nimport type { Options } from 'prettier'\n\nconst formatOptions: Options = {\n tabWidth: 2,\n printWidth: 160,\n parser: 'typescript',\n singleQuote: true,\n semi: false,\n bracketSameLine: false,\n endOfLine: 'auto',\n}\nexport const format = (text: string) => {\n return prettierFormat(text, formatOptions)\n}\n","import path from 'path'\n\n// TODO check for a better way or resolving the relative path\nexport const getRelativePath = (from?: string | null, to?: string | null) => {\n if (!from || !to) {\n throw new Error('From and to should be filled in when retrieving the relativePath')\n }\n const newPath = path.relative(from, to).replace('../', '').replace('.ts', '').trimEnd()\n\n if (newPath.startsWith('./') || newPath.startsWith('../')) {\n return newPath.replace\n }\n return `./${newPath}`\n}\n","/* eslint-disable @typescript-eslint/no-empty-interface */\nimport { build } from './build'\n\nexport * from './config'\nexport * from './build'\nexport { Plugin, PluginOptions, PluginFactory, createPlugin } from './plugin'\nexport * from './utils'\nexport * from './types'\nexport * from './context'\n\nexport default build\n"]}
1
+ {"version":3,"sources":["../src/build.ts","../src/utils/Emitter.ts","../src/utils/FileEmitter.ts","../src/utils/cache.ts","../src/context.ts","../src/plugin.ts","../src/utils/PluginDriver.ts","../src/config.ts","../src/utils/isPromise.ts","../src/utils/write.ts","../src/utils/format.ts","../src/utils/read.ts","../src/index.ts"],"names":["path","argument0","fse"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-empty-function */\n/* eslint-disable no-console */\n\nimport path from 'path'\n\nimport { PluginDriver } from './utils/PluginDriver'\n\nimport type { Api, PluginContext, TransformResult, ValidationResult, LogLevel } from './types'\nimport type { UserConfig, ConfigEnv } from './config'\nimport type { Plugin } from './plugin'\n\ntype BuildOutput = void\n\n// Same type as ora\ntype Spinner = {\n start: (text?: string) => Spinner\n succeed: (text: string) => Spinner\n stopAndPersist: (options: { text: string }) => Spinner\n render: () => Spinner\n text: string\n info: (text: string) => Spinner\n}\n\nexport type BuildContext = {\n logger?: {\n log: (message: string, logLevel: LogLevel) => void\n spinner?: Spinner\n }\n}\n\nasync function transformReducer(this: PluginContext, previousCode: string, result: TransformResult, _plugin: Plugin) {\n if (result === null) {\n return null\n }\n return result\n}\n\ntype BuildImplementationOptions = {\n config: Api['config']\n env: ConfigEnv\n}\n\nasync function buildImplementation(this: BuildContext, options: BuildImplementationOptions, done: (output: BuildOutput) => void) {\n const { config } = options\n\n const pluginCache = Object.create(null)\n const pluginDriver = new PluginDriver(config, pluginCache, { logger: this.logger })\n\n const validations = await pluginDriver.hookParallel<'validate', ValidationResult>('validate', [pluginDriver.plugins])\n\n const validationsWithMessage = validations.filter(Boolean)\n\n if (validationsWithMessage.some((validation) => typeof validation !== 'boolean')) {\n validationsWithMessage.forEach((validation) => {\n if (validation && typeof validation !== 'boolean' && validation?.message) {\n this.logger?.log(validation.message, 'warn')\n }\n })\n\n return\n }\n\n pluginDriver.fileEmitter.on('new', async (emittedFile) => {\n if (!emittedFile?.source) {\n return\n }\n\n const resolvedId = await pluginDriver.hookFirst('resolveId', [emittedFile.source, path.resolve(emittedFile.source), emittedFile.meta])\n const id = resolvedId || emittedFile.source\n let { code } = emittedFile\n\n const loadedResult = await pluginDriver.hookFirst('load', [id])\n if (loadedResult) {\n code = loadedResult\n }\n\n if (code) {\n const result = await pluginDriver.hookReduceArg0('transform', [code, id], transformReducer)\n\n await pluginDriver.hookParallel('writeFile', [result, id])\n pluginDriver.fileEmitter.delete(emittedFile.id)\n }\n })\n\n await pluginDriver.hookParallel('buildStart')\n\n pluginDriver.emitFile({\n id: path.resolve(pluginDriver.api.config.root, pluginDriver.api.config.input.path),\n source: pluginDriver.api.config.input.path,\n name: undefined,\n code: pluginDriver.api.input,\n })\n\n pluginDriver.fileEmitter.on('end', async () => {\n await pluginDriver.hookParallel('buildEnd')\n done()\n })\n}\n\nexport function build(this: BuildContext, userConfig: UserConfig, env: ConfigEnv): Promise<BuildOutput> {\n const config: UserConfig = {\n ...userConfig,\n root: userConfig.root || process.cwd(),\n }\n\n return new Promise((resolve) => {\n buildImplementation.call(\n this,\n {\n config,\n env,\n },\n resolve\n )\n })\n}\n","export type Listener<T> = (value?: T) => void\n\nexport class Emitter<TValue = unknown, TTopics = unknown> {\n private readonly listeners: Set<{\n topic?: TTopics\n cb: Listener<TValue>\n }> = new Set()\n\n private readonly topics?: TTopics[]\n\n constructor(topics?: TTopics[]) {\n this.topics = topics\n }\n\n emit(...params: [topic: TTopics, value?: TValue] | [value?: TValue]) {\n const isTopic = (value: any): value is TTopics => !!this.topics?.includes(value)\n\n if (isTopic(params[0])) {\n this.listeners.forEach((listener) => {\n if (listener.topic === params[0]) {\n listener.cb(params[1])\n }\n })\n return\n }\n this.listeners.forEach((listener) => listener.cb(params[0] as TValue))\n }\n\n subscribe: (cb: Listener<TValue>) => () => void = (cb) => {\n const listener = {\n topic: undefined,\n cb,\n }\n this.listeners.add(listener)\n // Unsubscribe\n return () => this.listeners.delete(listener)\n }\n\n on(topic: TTopics, cb: Listener<TValue>) {\n const listener = {\n topic,\n cb,\n }\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n destroy: () => void = () => this.listeners.clear()\n}\n","import { Emitter } from './Emitter'\n\nexport interface EmittedFile {\n id: string\n // this can be used as a dynamic path, also resolveId will use this as source(first parameter)\n source: string | undefined\n name: string | undefined\n code: string | undefined\n meta?: Record<string, any>\n}\n\nexport type EmitFile = (emittedFile: EmittedFile) => void\n\ntype Topics = 'new' | 'delete' | 'end'\nexport class FileEmitter {\n private readonly emitter: Emitter<EmittedFile, Topics>\n\n private readonly filesByReferenceId: Map<string, EmittedFile> = new Map()\n\n constructor(emitter: Emitter<EmittedFile, Topics> = new Emitter<EmittedFile, Topics>(['delete', 'end', 'new'])) {\n this.emitter = emitter\n }\n\n emitFile(emitedFile: EmittedFile) {\n // save locally in this class\n this.assignReferenceId(emitedFile, emitedFile.id)\n this.emitter.emit('new', emitedFile)\n return new Promise<EmittedFile>((resolve) => {\n const subscribe = this.emitter.on('delete', (deletedFile) => {\n if (deletedFile?.id === emitedFile.id) {\n resolve(deletedFile)\n return subscribe()\n }\n return undefined\n })\n })\n }\n\n delete(fileReferenceId: string) {\n const deletedFile = this.filesByReferenceId.get(fileReferenceId)\n this.filesByReferenceId.delete(fileReferenceId)\n if (this.filesByReferenceId.size === 0) {\n this.emitter.emit('end')\n }\n return this.emitter.emit('delete', deletedFile)\n }\n\n subscribe(...params: Parameters<typeof this.emitter['subscribe']>) {\n this.emitter.subscribe(...params)\n }\n\n on(...params: Parameters<typeof this.emitter['on']>) {\n this.emitter.on(...params)\n }\n\n private assignReferenceId(emittedFile: EmittedFile, fileReferenceId: string | undefined) {\n if (fileReferenceId) {\n this.filesByReferenceId.set(fileReferenceId, emittedFile)\n }\n }\n\n getEmittedFile = (fileReferenceId?: string | null): EmittedFile | undefined => {\n if (!fileReferenceId) {\n return undefined\n }\n return this.filesByReferenceId.get(fileReferenceId)\n }\n}\n","/* eslint-disable no-param-reassign */\n/* eslint-disable consistent-return */\nexport interface SerializablePluginCache {\n [key: string]: [number, any]\n}\n\nexport interface Cache<TCache = any> {\n delete(id: string): boolean\n get<T = TCache>(id: string): T\n has(id: string): boolean\n set<T = TCache>(id: string, value: T): void\n}\n\nexport function createPluginCache(cache: SerializablePluginCache): Cache {\n return {\n delete(id: string) {\n return delete cache[id]\n },\n get(id: string) {\n const item = cache[id]\n if (!item) return\n item[0] = 0\n return item[1]\n },\n has(id: string) {\n const item = cache[id]\n if (!item) return false\n item[0] = 0\n return true\n },\n set(id: string, value: any) {\n cache[id] = [0, value]\n },\n }\n}\n","/* eslint-disable no-param-reassign */\nimport { createPluginCache } from './utils/cache'\n\nimport type { PluginDriver } from './utils/PluginDriver'\nimport type { SerializablePluginCache } from './utils/cache'\nimport type { Plugin } from './plugin'\n\nexport function getPluginContext(this: PluginDriver, plugin: Plugin, pluginCache: Record<string, SerializablePluginCache> | void) {\n const cacheKey = plugin.cacheKey || (plugin.name as string)\n\n const cacheInstance = createPluginCache(pluginCache[cacheKey] || (pluginCache[cacheKey] = Object.create(null)))\n\n return {\n cache: cacheInstance,\n }\n}\n","/* eslint-disable no-console */\n\nimport path from 'path'\n\nimport fse from 'fs-extra'\n\nimport type { FileEmitter } from './utils'\nimport type { PluginLifecycle, PluginName, Api } from './types'\n\n// use of type objects\nexport type PluginOptions<UserOptions = unknown, Nested extends boolean = false, Api = any> = {\n userOptions: UserOptions\n nested: Nested\n api: Api\n}\n\nexport type Plugin<TOptions extends PluginOptions = PluginOptions> = {\n name: PluginName | Omit<string, PluginName>\n cacheKey?: string\n api?: TOptions['api']\n} & Partial<PluginLifecycle>\n\nexport type PluginFactory<TOptions extends PluginOptions = PluginOptions> = (\n options: TOptions['userOptions']\n) => TOptions['nested'] extends true ? Array<Plugin<TOptions>> : Plugin<TOptions>\n\nexport function createPlugin<TOptions extends PluginOptions = PluginOptions>(factory: PluginFactory<TOptions>) {\n return (userOptions: TOptions['userOptions']) => {\n const plugin = factory(userOptions)\n if (Array.isArray(plugin)) {\n throw new Error('Not implemented')\n }\n\n // default transform\n if (!plugin.transform) {\n plugin.transform = function transform(code) {\n return code\n }\n }\n\n return plugin\n }\n}\n\ntype Options = {\n // root will be filled in with a default value in build(process.cwd)\n config: Api['config']\n fileEmitter: FileEmitter\n resolveId: Api['resolveId']\n load: Api['load']\n}\n\n// not exported\ntype CorePluginOptions = PluginOptions<Options, false, Api>\n\nexport const name = 'core' as const\n\nexport const definePlugin = createPlugin<CorePluginOptions>((options) => {\n const { fileEmitter, resolveId, load } = options\n\n const schema = fse.readFileSync(path.resolve(options.config.root, options.config.input.path), 'utf-8')\n\n const api: Api = {\n get config() {\n return options.config\n },\n get input() {\n return schema\n },\n on: fileEmitter.on.bind(fileEmitter),\n getEmittedFile: fileEmitter.getEmittedFile.bind(fileEmitter),\n emitFile: fileEmitter.emitFile.bind(fileEmitter),\n resolveId,\n load,\n }\n\n return {\n name,\n api,\n }\n})\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable no-restricted-syntax */\n/* eslint-disable no-await-in-loop */\n/* eslint-disable no-undef */\n// inspired by: https://github.com/rollup/rollup/blob/master/src/utils/PluginDriver.ts#\n\nimport { FileEmitter } from './FileEmitter'\n\nimport { getPluginContext } from '../context'\nimport { definePlugin } from '../plugin'\n\nimport type { WithPromise } from './isPromise'\nimport type { BuildContext } from '../build'\nimport type { SerializablePluginCache } from './cache'\nimport type { Plugin } from '../plugin'\nimport type { PluginLifecycleHooks, PluginLifecycle, PluginContext, Api } from '../types'\n\n/**\n * Get the type of the first argument in a function.\n * @example Arg0<(a: string, b: number) => void> -> string\n */\nexport type Argument0<H extends keyof PluginLifecycle> = Parameters<PluginLifecycle[H]>[0]\n\ntype Strategy = 'hookFirst' | 'hookParallel' | 'hookReduceArg0' | 'hookSeq'\n\n// This will make sure no input hook is omitted\nconst hookNames: {\n [P in PluginLifecycleHooks]: 1\n} = {\n validate: 1,\n buildStart: 1,\n resolveId: 1,\n load: 1,\n transform: 1,\n writeFile: 1,\n buildEnd: 1,\n}\nexport const hooks = Object.keys(hookNames) as [PluginLifecycleHooks]\n\nexport class PluginDriver {\n private readonly pluginContexts: ReadonlyMap<Plugin, PluginContext>\n\n public plugins: Plugin[]\n\n public readonly fileEmitter: FileEmitter\n\n private readonly logger?: BuildContext['logger']\n\n private readonly config: Api['config']\n\n private readonly sortedPlugins = new Map<PluginLifecycleHooks, Plugin[]>()\n\n constructor(config: Api['config'], pluginCache: Record<string, SerializablePluginCache> | undefined, options: { logger: BuildContext['logger'] }) {\n this.logger = options.logger\n this.config = config\n\n this.fileEmitter = new FileEmitter()\n\n this.emitFile = this.fileEmitter.emitFile.bind(this.fileEmitter)\n\n const corePlugin = definePlugin({ config, fileEmitter: this.fileEmitter, load: this.load, resolveId: this.resolveId })\n this.plugins = [corePlugin, ...(config.plugins || [])]\n const coreApi = corePlugin.api\n this.pluginContexts = new Map(\n this.plugins.map((plugin) => {\n const context = {\n ...coreApi,\n ...getPluginContext.call(this, plugin, pluginCache),\n }\n return [plugin, context]\n })\n )\n }\n\n get api() {\n let context = {}\n this.pluginContexts.forEach((value) => {\n context = { ...context, ...value }\n })\n return context as PluginContext\n }\n\n emitFile(...params: Parameters<FileEmitter['emitFile']>) {\n return this.fileEmitter.emitFile(...params)\n }\n\n resolveId = (source: string, importer: string, meta: Record<string, any> | undefined) => {\n return this.hookFirst('resolveId', [source, importer, meta])\n }\n\n load = async (id: string) => {\n const result = await this.hookFirst('load', [id])\n return result\n }\n\n // chains, first non-null result stops and returns\n hookFirst<H extends PluginLifecycleHooks>(\n hookName: H,\n parameters: Parameters<PluginLifecycle[H]>,\n skipped?: ReadonlySet<Plugin> | null\n ): Promise<ReturnType<PluginLifecycle[H]> | null> {\n let promise: Promise<ReturnType<PluginLifecycle[H]> | null> = Promise.resolve(null)\n for (const plugin of this.getSortedPlugins(hookName)) {\n if (skipped && skipped.has(plugin)) continue\n promise = promise.then((result) => {\n if (result != null) return result\n return this.runHook('hookFirst', hookName, parameters, plugin) as any\n })\n }\n return promise\n }\n\n // parallel\n async hookParallel<H extends PluginLifecycleHooks, TOuput = void>(hookName: H, parameters?: Parameters<PluginLifecycle[H]> | undefined) {\n const parallelPromises: Promise<TOuput>[] = []\n\n for (const plugin of this.getSortedPlugins(hookName)) {\n if ((plugin[hookName] as { sequential?: boolean })?.sequential) {\n await Promise.all(parallelPromises)\n parallelPromises.length = 0\n await this.runHook('hookParallel', hookName, parameters, plugin)\n } else {\n const promise: Promise<TOuput> = this.runHook('hookParallel', hookName, parameters, plugin)\n\n parallelPromises.push(promise)\n }\n }\n return Promise.all(parallelPromises)\n }\n\n // chains, reduces returned value, handling the reduced value as the first hook argument\n hookReduceArg0<H extends PluginLifecycleHooks>(\n hookName: H,\n [argument0, ...rest]: Parameters<PluginLifecycle[H]>,\n reduce: (reduction: Argument0<H>, result: ReturnType<PluginLifecycle[H]>, plugin: Plugin) => WithPromise<Argument0<H> | null>\n ): Promise<Argument0<H>> {\n let promise = Promise.resolve(argument0)\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise.then((argument0) =>\n this.runHook('hookReduceArg0', hookName, [argument0, ...rest] as Parameters<PluginLifecycle[H]>, plugin).then((result) =>\n reduce.call(this.api, argument0, result, plugin)\n )\n )\n }\n return promise\n }\n\n // chains\n\n hookSeq<H extends PluginLifecycleHooks>(hookName: H, parameters?: Parameters<PluginLifecycle[H]>) {\n let promise: Promise<void> = Promise.resolve()\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise.then(() => this.runHook('hookSeq', hookName, parameters, plugin))\n }\n return promise.then(noReturn)\n }\n\n private getSortedPlugins(_hookName: keyof PluginLifecycle): Plugin[] {\n return [...this.plugins]\n }\n\n /**\n * Run an async plugin hook and return the result.\n * @param hookName Name of the plugin hook. Must be either in `PluginHooks` or `OutputPluginValueHooks`.\n * @param args Arguments passed to the plugin hook.\n * @param plugin The actual pluginObject to run.\n */\n // Implementation signature\n private runHook<H extends PluginLifecycleHooks, TResult = void>(\n strategy: Strategy,\n hookName: H,\n parameters: unknown[] | undefined,\n plugin: Plugin\n ): Promise<TResult> {\n // We always filter for plugins that support the hook before running it\n const hook = plugin[hookName]!\n // const context = this.pluginContexts.get(plugin) || {};\n\n return Promise.resolve().then(() => {\n if (typeof hook !== 'function') {\n return hook\n }\n\n if (this.config.logLevel === 'info' && this.logger?.spinner) {\n this.logger.spinner.text = `[${strategy}] ${hookName}: Excecuting task for plugin ${plugin.name} \\n`\n }\n\n const hookResult = (hook as any).apply(this.api, parameters)\n\n if (!hookResult?.then) {\n // short circuit for non-thenables and non-Promises\n if (this.config.logLevel === 'info' && this.logger?.spinner) {\n this.logger.spinner.succeed(`[${strategy}] ${hookName}: Excecuting task for plugin ${plugin.name} \\n`)\n }\n return hookResult\n }\n\n return Promise.resolve(hookResult).then((result) => {\n // action was fulfilled\n if (this.config.logLevel === 'info' && this.logger?.spinner) {\n this.logger.spinner.succeed(`[${strategy}] ${hookName}: Excecuting task for plugin ${plugin.name} \\n`)\n }\n return result\n })\n })\n }\n\n /**\n * Run a sync plugin hook and return the result.\n * @param hookName Name of the plugin hook. Must be in `PluginHooks`.\n * @param args Arguments passed to the plugin hook.\n * @param plugin The acutal plugin\n * @param replaceContext When passed, the plugin context can be overridden.\n */\n private runHookSync<H extends PluginLifecycleHooks>(hookName: H, parameters: Parameters<PluginLifecycle[H]>, plugin: Plugin): ReturnType<PluginLifecycle[H]> {\n const hook = plugin[hookName]!\n\n // const context = this.pluginContexts.get(plugin)!;\n\n try {\n // eslint-disable-next-line @typescript-eslint/ban-types\n return (hook as Function).apply(this.api, parameters)\n } catch (error: any) {\n return error\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noReturn() {}\n","import type { WithPromise } from './utils/isPromise'\nimport type { LogLevel } from './types'\nimport type { Plugin } from './plugin'\n\nexport interface ConfigEnv {\n mode: 'development'\n}\n// TODO revert to this to have multiple options like async, object, ...\n// export type PluginOption = PluginOptions | false | null | undefined | PluginOption[] | Promise<PluginOptions | false | null | undefined | PluginOption[]>;\n\nexport interface UserConfig {\n /**\n * Project root directory. Can be an absolute path, or a path relative from\n * the location of the config file itself.\n * @default process.cwd()\n */\n root?: string\n mode?: 'single'\n input: {\n /**\n * Path or link to the input file\n */\n path: string\n }\n output: {\n /**\n * Path to export folder\n */\n path: string\n }\n /**\n * Array of Kubb plugins to use.\n */\n plugins?: Plugin[]\n /**\n * Log level to report when using the CLI\n */\n\n logLevel?: LogLevel\n}\n\nexport type UserConfigFn = (env: ConfigEnv) => WithPromise<UserConfig>\nexport type UserConfigExport = WithPromise<UserConfig> | UserConfigFn\n\n/**\n * Type helper to make it easier to use kubb.config.ts\n * accepts a direct {@link UserConfig} object, or a function that returns it.\n * The function receives a {@link ConfigEnv} object that exposes two properties:\n */\nexport function defineConfig(config: UserConfigExport): UserConfigExport {\n return config\n}\n","export type WithPromise<T> = Promise<T> | T\n\nexport const isPromise = <T>(result: WithPromise<T>): result is Promise<T> => {\n return typeof (result as any)?.then === 'function'\n}\n","/* eslint-disable consistent-return */\nimport fse from 'fs-extra'\n\nimport { format } from './format'\n\ntype WriteOptions = {\n format: boolean\n}\n\nexport const write = async (data: string, path: string, options: WriteOptions = { format: false }) => {\n const formattedData = options.format ? format(data) : data\n\n try {\n await fse.stat(path)\n const oldContent = await fse.readFile(path, { encoding: 'utf-8' })\n if (oldContent?.toString() === formattedData) {\n return\n }\n } catch (_err) {\n return fse.outputFile(path, formattedData)\n }\n\n return fse.outputFile(path, formattedData)\n}\n","import { format as prettierFormat } from 'prettier'\n\nimport type { Options } from 'prettier'\n\nconst formatOptions: Options = {\n tabWidth: 2,\n printWidth: 160,\n parser: 'typescript',\n singleQuote: true,\n semi: false,\n bracketSameLine: false,\n endOfLine: 'auto',\n}\nexport const format = (text: string) => {\n return prettierFormat(text, formatOptions)\n}\n","import path from 'path'\n\n// TODO check for a better way or resolving the relative path\nexport const getRelativePath = (from?: string | null, to?: string | null) => {\n if (!from || !to) {\n throw new Error('From and to should be filled in when retrieving the relativePath')\n }\n const newPath = path.relative(from, to).replace('../', '').replace('.ts', '').trimEnd()\n\n if (newPath.startsWith('./') || newPath.startsWith('../')) {\n return newPath.replace\n }\n return `./${newPath}`\n}\n","/* eslint-disable @typescript-eslint/no-empty-interface */\nimport { build } from './build'\n\nexport * from './config'\nexport * from './build'\nexport { Plugin, PluginOptions, PluginFactory, createPlugin } from './plugin'\nexport * from './utils'\nexport * from './types'\nexport * from './context'\n\nexport default build\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/core",
3
- "version": "0.11.0",
3
+ "version": "0.11.2",
4
4
  "description": "Generator core",
5
5
  "repository": {
6
6
  "type": "git",
@@ -13,7 +13,7 @@
13
13
  "type": "object",
14
14
  "description": "Input type",
15
15
  "properties": {
16
- "schema": {
16
+ "path": {
17
17
  "type": "string",
18
18
  "description": "Your JSON schema"
19
19
  }
@@ -47,18 +47,6 @@
47
47
  },
48
48
  "description": "Plugins"
49
49
  },
50
- "lifeCycle": {
51
- "type": "string",
52
- "description": "lifeCycle, default will be plugins",
53
- "enum": ["plugins"],
54
- "default": "plugins"
55
- },
56
- "strategy": {
57
- "type": "string",
58
- "description": "Strategy, default will be fifo",
59
- "enum": ["fifo", "lifo"],
60
- "default": "fifo"
61
- },
62
50
  "logLevel": {
63
51
  "type": "string",
64
52
  "description": "Log level",