@kubb/core 1.0.0-beta.8 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/build.ts","../src/utils/isURL.ts","../src/plugin.ts","../src/utils/isPromise.ts","../src/utils/write.ts","../src/utils/cache.ts","../src/utils/read.ts","../src/utils/objectToParameters.ts","../src/utils/nameSorter.ts","../src/utils/jsdoc.ts","../src/utils/getUniqueName.ts","../src/utils/timeout.ts","../src/utils/queue.ts","../src/managers/fileManager/FileManager.ts","../src/managers/fileManager/TreeNode.ts","../src/managers/fileManager/utils.ts","../src/managers/pluginManager/PluginManager.ts","../src/managers/pluginManager/validate.ts","../src/config.ts","../src/generators/Generator.ts","../src/generators/SchemaGenerator.ts","../src/index.ts"],"names":["pathParser","fs","name","argument0"],"mappings":"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","sourcesContent":["/* eslint-disable no-async-promise-executor */\nimport pathParser from 'path'\n\nimport { isURL } from './utils/isURL'\nimport { PluginManager } from './managers/pluginManager'\nimport { clean, read } from './utils'\nimport { getFileSource } from './managers/fileManager'\n\nimport type { FileManager, File } from './managers/fileManager'\nimport type { QueueTask } from './utils'\nimport type { PluginContext, TransformResult, LogLevel, KubbPlugin } from './types'\n\ntype BuildOutput = {\n files: FileManager['files']\n}\n\n// Same type as ora\ntype Spinner = {\n start: (text?: string) => Spinner\n succeed: (text: string) => Spinner\n fail: (text?: string) => Spinner\n stopAndPersist: (options: { text: string }) => Spinner\n render: () => Spinner\n text: string\n info: (text: string) => Spinner\n}\n\nexport type Logger = {\n log: (message: string, logLevel: LogLevel) => void\n spinner?: Spinner\n}\ntype BuildOptions = {\n config: PluginContext['config']\n logger?: Logger\n}\n\nasync function transformReducer(\n this: PluginContext,\n _previousCode: string,\n result: TransformResult | Promise<TransformResult>,\n _plugin: KubbPlugin\n): Promise<string | null> {\n if (result === null) {\n return null\n }\n return result\n}\n\nasync function buildImplementation(options: BuildOptions, done: (output: BuildOutput) => void) {\n const { config, logger } = options\n\n if (config.output.clean) {\n await clean(config.output.path)\n }\n\n const queueTask = async (id: string, file: File) => {\n const { path } = file\n\n let code = getFileSource(file)\n\n const loadedResult = await pluginManager.hookFirst({\n hookName: 'load',\n parameters: [path],\n })\n if (loadedResult) {\n code = loadedResult\n }\n\n if (code) {\n const transformedCode = await pluginManager.hookReduceArg0({\n hookName: 'transform',\n parameters: [code, path],\n reduce: transformReducer,\n })\n\n if (config.output.write || config.output.write === undefined) {\n await pluginManager.hookParallel({\n hookName: 'writeFile',\n parameters: [transformedCode, path],\n })\n }\n }\n }\n\n const pluginManager = new PluginManager(config, { logger, task: queueTask as QueueTask })\n const { plugins, fileManager } = pluginManager\n\n await pluginManager.hookParallel<'validate', true>({\n hookName: 'validate',\n parameters: [plugins],\n })\n\n await pluginManager.hookParallel({\n hookName: 'buildStart',\n parameters: [config],\n })\n\n await pluginManager.hookParallel({ hookName: 'buildEnd' })\n setTimeout(() => {\n done({ files: fileManager.files.map((file) => ({ ...file, source: getFileSource(file) })) })\n }, 500)\n\n pluginManager.fileManager.add({\n path: isURL(config.input.path) ? config.input.path : pathParser.resolve(config.root, config.input.path),\n fileName: isURL(config.input.path) ? 'input' : config.input.path,\n source: isURL(config.input.path) ? config.input.path : await read(pathParser.resolve(config.root, config.input.path)),\n })\n}\n\nexport type KubbBuild = (options: BuildOptions) => Promise<BuildOutput>\n\nexport function build(options: BuildOptions): Promise<BuildOutput> {\n return new Promise(async (resolve, reject) => {\n try {\n await buildImplementation(options, resolve)\n } catch (e) {\n reject(e)\n }\n })\n}\n","export function isURL(data: string) {\n try {\n const url = new URL(data)\n if (url?.href) {\n return true\n }\n } catch (error) {\n return false\n }\n return false\n}\n","import pathParser from 'path'\n\nimport { createPluginCache } from './utils'\n\nimport type { FileManager } from './managers/fileManager'\nimport type { PluginContext, KubbPlugin, PluginFactoryOptions } from './types'\n\ntype KubbPluginFactory<T extends PluginFactoryOptions = PluginFactoryOptions> = (\n options: T['options']\n) => T['nested'] extends true ? Array<KubbPlugin<T>> : KubbPlugin<T>\n\nexport function createPlugin<T extends PluginFactoryOptions = PluginFactoryOptions>(factory: KubbPluginFactory<T>) {\n return (options: T['options']) => {\n const plugin = factory(options)\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 config: PluginContext['config']\n fileManager: FileManager\n resolvePath: PluginContext['resolvePath']\n resolveName: PluginContext['resolveName']\n load: PluginContext['load']\n}\n\n// not publicly exported\nexport type CorePluginOptions = PluginFactoryOptions<Options, false, PluginContext>\n\nexport const name = 'core' as const\n\nexport const definePlugin = createPlugin<CorePluginOptions>((options) => {\n const { fileManager, resolvePath, resolveName, load } = options\n\n const api: PluginContext = {\n get config() {\n return options.config\n },\n fileManager,\n async addFile(file) {\n return fileManager.addOrAppend(file)\n },\n resolvePath,\n resolveName,\n load,\n cache: createPluginCache(Object.create(null)),\n }\n\n return {\n name,\n options,\n api,\n resolvePath(fileName, directory) {\n if (!directory) {\n return null\n }\n return pathParser.resolve(directory, fileName)\n },\n resolveName(name) {\n return name\n },\n }\n})\n","import type { MaybePromise } from '../types'\n\nexport function isPromise<T>(result: MaybePromise<T>): result is Promise<T> {\n return typeof (result as Promise<unknown>)?.then === 'function'\n}\n","/* eslint-disable consistent-return */\nimport { promises as fs } from 'fs'\nimport pathParser from 'path'\n\nimport rimraf from 'rimraf'\n\nasync function safeWriteFileToPath(path: string, data: string) {\n // resolve the full path and get just the directory, ignoring the file and extension\n const passedPath = pathParser.dirname(pathParser.resolve(path))\n // make the directory, recursively. Theoretically, if every directory in the path exists, this won't do anything.\n await fs.mkdir(passedPath, { recursive: true })\n // write the file to the newly created directory\n return fs.writeFile(pathParser.resolve(path), data, { encoding: 'utf-8' })\n}\n\nexport async function write(data: string, path: string) {\n try {\n await fs.stat(path)\n const oldContent = await fs.readFile(path, { encoding: 'utf-8' })\n if (oldContent?.toString() === data) {\n return\n }\n } catch (_err) {\n return safeWriteFileToPath(path, data)\n }\n\n return safeWriteFileToPath(path, data)\n}\n\nexport async function clean(path: string) {\n return new Promise((resolve, reject) => {\n rimraf(path, (err) => {\n if (err) {\n reject(err)\n } else {\n resolve(true)\n }\n })\n })\n}\n","/* eslint-disable no-param-reassign */\n/* eslint-disable consistent-return */\n\nexport interface Cache<T extends object = object> {\n delete(id: keyof T): boolean\n get(id: keyof T): T[keyof T] | null\n has(id: keyof T): boolean\n set(id: keyof T, value: unknown): void\n}\n\nexport function createPluginCache<T extends Record<string, [number, unknown]>>(cache: T): Cache<T> {\n return {\n delete(id: keyof T) {\n return delete cache[id]\n },\n get(id) {\n const item = cache[id]\n if (!item) return null\n item[0] = 0\n return item[1] as T[keyof T]\n },\n has(id) {\n const item = cache[id]\n if (!item) return false\n item[0] = 0\n return true\n },\n set(id, value) {\n cache[id] = [0, value] as T[keyof T]\n },\n }\n}\n","import pathParser from 'path'\nimport { promises as fs } from 'fs'\n\nfunction slash(path: string) {\n const isExtendedLengthPath = /^\\\\\\\\\\?\\\\/.test(path)\n\n if (isExtendedLengthPath) {\n return path\n }\n\n return path.replace(/\\\\/g, '/')\n}\n\nexport function getRelativePath(rootDir?: string | null, filePath?: string | null) {\n if (!rootDir || !filePath) {\n throw new Error('Root and file should be filled in when retrieving the relativePath')\n }\n\n const relativePath = pathParser.relative(rootDir, filePath)\n\n // On Windows, paths are separated with a \"\\\"\n // However, web browsers use \"/\" no matter the platform\n const path = slash(relativePath).replace('../', '').trimEnd()\n\n if (path.startsWith('../')) {\n return path.replace(pathParser.basename(path), pathParser.basename(path, pathParser.extname(filePath)))\n }\n\n return `./${path.replace(pathParser.basename(path), pathParser.basename(path, pathParser.extname(filePath)))}`\n}\n\nexport type PathMode = 'file' | 'directory'\n\nexport function getPathMode(path: string | undefined | null): PathMode {\n if (!path) {\n return 'directory'\n }\n return pathParser.extname(path) ? 'file' : 'directory'\n}\n\nexport async function read(path: string) {\n try {\n return fs.readFile(path, { encoding: 'utf8' })\n } catch (err) {\n console.error(err)\n throw err\n }\n}\n","type Data = string[][]\n\ntype Options = {\n typed?: boolean\n}\n\nexport function objectToParameters(data: Data, options: Options = {}) {\n return data\n .reduce((acc, [key, value]) => {\n if (options.typed) {\n acc.push(`${key}: ${value}[\"${key}\"], `)\n } else {\n acc.push(`${key},`)\n }\n\n return acc\n }, [] as string[])\n .join('')\n}\n","export function nameSorter<T extends { name: string }>(a: T, b: T) {\n if (a.name < b.name) {\n return -1\n }\n if (a.name > b.name) {\n return 1\n }\n return 0\n}\n","export function createJSDocBlockText({ comments }: { comments: Array<string> }): string {\n const filteredComments = comments.filter(Boolean)\n\n if (!filteredComments.length) {\n return ''\n }\n\n const text = filteredComments.reduce((acc, comment) => {\n return `${acc}\\n* ${comment}`\n }, '/**')\n\n return `${text}\\n*/`\n}\n","/* eslint-disable no-param-reassign */\nexport function getUniqueName(originalName: string, data: Record<string, number>) {\n let used = data[originalName] || 0\n if (used) {\n data[originalName] = ++used\n originalName += used\n }\n data[originalName] = 1\n return originalName\n}\n","export async function timeout(ms: number) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(true)\n }, ms)\n })\n}\n","/* eslint-disable no-cond-assign */\n\nexport type QueueTask<T = unknown> = {\n (...args: unknown[]): Promise<T>\n}\n\ninterface QueueItem {\n reject: <T>(reason?: T) => void\n resolve: <T>(value: T | PromiseLike<T>) => void\n task: QueueTask<unknown>\n}\n\nexport class Queue {\n private readonly queue: QueueItem[] = []\n\n workerCount = 0\n\n private maxParallel: number\n\n constructor(maxParallel: number) {\n this.maxParallel = maxParallel\n }\n\n run<T>(task: QueueTask<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const item: QueueItem = { reject, resolve, task } as QueueItem\n this.queue.push(item)\n this.work()\n })\n }\n\n private async work(): Promise<void> {\n if (this.workerCount >= this.maxParallel) return\n this.workerCount++\n\n let entry: QueueItem | undefined\n while ((entry = this.queue.shift())) {\n const { reject, resolve, task } = entry\n task()\n .then((result) => resolve(result))\n .catch((err) => reject(err))\n }\n\n this.workerCount--\n }\n}\n","import { v4 as uuidv4 } from 'uuid'\n\nimport { write, read } from '../../utils'\n\nimport type { QueueTask, Queue } from '../../utils'\nimport type { CacheStore, UUID, Status, File } from './types'\n\nexport class FileManager {\n private cache: Map<CacheStore['id'], CacheStore> = new Map()\n\n private task?: QueueTask<unknown>\n\n private queue?: Queue\n\n constructor(options?: { queue: Queue; task: QueueTask<unknown> }) {\n if (options) {\n this.task = options.task\n this.queue = options.queue\n }\n }\n\n private getCache(id: UUID) {\n return this.cache.get(id)\n }\n\n private getCacheByPath(path: string | undefined): CacheStore | undefined {\n let cache\n\n this.cache.forEach((item) => {\n if (item.file.path === path) {\n cache = item\n }\n })\n return cache as unknown as CacheStore\n }\n\n get files() {\n const files: File[] = []\n this.cache.forEach((item) => {\n files.push(item.file)\n })\n\n return files\n }\n\n async add(file: File) {\n const cacheItem = { id: uuidv4(), file, status: 'new' as Status }\n\n this.cache.set(cacheItem.id, cacheItem)\n\n if (this.queue) {\n await this.queue.run(async () => {\n await this.task?.(cacheItem.id, file)\n })\n }\n\n return file\n }\n\n addOrAppend(file: File) {\n const previousCache = this.getCacheByPath(file.path)\n\n if (previousCache) {\n this.cache.delete(previousCache.id)\n return this.add({\n ...file,\n source: `${previousCache.file.source}\\n${file.source}`,\n imports: [...(previousCache.file.imports || []), ...(file.imports || [])],\n })\n }\n return this.add(file)\n }\n\n setStatus(id: UUID, status: Status) {\n const cacheItem = this.getCache(id)\n if (!cacheItem) {\n return\n }\n\n cacheItem.status = status\n this.cache.set(id, cacheItem)\n }\n\n get(id: UUID) {\n const cacheItem = this.getCache(id)\n return cacheItem?.file\n }\n\n remove(id: UUID) {\n const cacheItem = this.getCache(id)\n if (!cacheItem) {\n return\n }\n\n this.setStatus(id, 'removed')\n }\n\n async write(...params: Parameters<typeof write>) {\n return write(...params)\n }\n\n async read(...params: Parameters<typeof read>) {\n return read(...params)\n }\n}\n","import dirTree from 'directory-tree'\n\nimport type { DirectoryTree, DirectoryTreeOptions } from 'directory-tree'\n\nexport type TreeNodeOptions = DirectoryTreeOptions\n\nexport class TreeNode<T = unknown> {\n public data: T\n\n public parent?: TreeNode<T>\n\n public children: Array<TreeNode<T>> = []\n\n constructor(data: T, parent?: TreeNode<T>) {\n this.data = data\n this.parent = parent\n return this\n }\n\n addChild(data: T): TreeNode<T> {\n const child = new TreeNode(data, this)\n if (!this.children) {\n this.children = []\n }\n this.children.push(child)\n return child\n }\n\n find(data: T) {\n if (data === this.data) {\n return this\n }\n\n if (this.children) {\n for (let i = 0, { length } = this.children, target: unknown = null; i < length; i++) {\n target = this.children[i].find(data)\n if (target) {\n return target\n }\n }\n }\n\n return null\n }\n\n leaves(): TreeNode<T>[] {\n if (!this.children || this.children.length === 0) {\n // this is a leaf\n return [this]\n }\n\n // if not a leaf, return all children's leaves recursively\n const leaves: TreeNode<T>[] = []\n if (this.children) {\n for (let i = 0, { length } = this.children; i < length; i++) {\n // eslint-disable-next-line prefer-spread\n leaves.push.apply(leaves, this.children[i].leaves())\n }\n }\n return leaves\n }\n\n root(): TreeNode<T> {\n if (!this.parent) {\n return this\n }\n return this.parent.root()\n }\n\n forEach(callback: (treeNode: TreeNode<T>) => void): this {\n if (typeof callback !== 'function') {\n throw new TypeError('forEach() callback must be a function')\n }\n\n // run this node through function\n callback(this)\n\n // do the same for all children\n if (this.children) {\n for (let i = 0, { length } = this.children; i < length; i++) {\n this.children[i].forEach(callback)\n }\n }\n\n return this\n }\n\n public static build<T = unknown>(path: string, options: TreeNodeOptions = {}): TreeNode<T> | null {\n const filteredTree = dirTree(path, { extensions: options?.extensions, exclude: options.exclude })\n\n if (!filteredTree) {\n return null\n }\n\n const treeNode = new TreeNode({ name: filteredTree.name, path: filteredTree.path, type: filteredTree.type })\n\n const recurse = (node: typeof treeNode, item: DirectoryTree) => {\n const subNode = node.addChild({ name: item.name, path: item.path, type: item.type })\n\n if (item.children?.length) {\n item.children?.forEach((child) => {\n recurse(subNode, child)\n })\n }\n }\n\n filteredTree.children?.forEach((child) => recurse(treeNode, child))\n\n return treeNode as TreeNode<T>\n }\n}\n","import uniq from 'lodash.uniq'\n\nimport type { File } from './types'\n\nexport function combineFiles(files: Array<File | null>) {\n return files.filter(Boolean).reduce((acc, curr: File | null) => {\n if (!curr) {\n return acc\n }\n const prevIndex = acc.findIndex((item) => item.path === curr.path)\n\n if (prevIndex !== -1) {\n const prev = acc[prevIndex]\n acc[prevIndex] = {\n ...curr,\n source: `${prev.source}\\n${curr.source}`,\n imports: [...(prev.imports || []), ...(curr.imports || [])],\n }\n } else {\n acc.push(curr)\n }\n\n return acc\n }, [] as File[])\n}\n\nexport function getFileSource(file: File) {\n // TODO make generic check\n if (!file.fileName.endsWith('.ts')) {\n return file.source\n }\n const imports: File['imports'] = []\n\n file.imports?.forEach((curr) => {\n const exists = imports.find((imp) => imp.path === curr.path)\n if (!exists) {\n imports.push({\n ...curr,\n name: Array.isArray(curr.name) ? uniq(curr.name) : curr.name,\n })\n }\n\n if (exists && !Array.isArray(exists.name) && exists.name !== curr.name) {\n imports.push(curr)\n }\n\n if (exists && Array.isArray(exists.name)) {\n if (Array.isArray(curr.name)) {\n exists.name = uniq([...exists.name, ...curr.name])\n }\n }\n })\n\n const importSource = imports.reduce((prev, curr) => {\n if (Array.isArray(curr.name)) {\n return `${prev}\\nimport ${curr.isTypeOnly ? 'type ' : ''}{ ${curr.name.join(', ')} } from \"${curr.path}\";`\n }\n\n return `${prev}\\nimport ${curr.isTypeOnly ? 'type ' : ''}${curr.name} from \"${curr.path}\";`\n }, '')\n\n if (importSource) {\n return `${importSource}\\n${file.source}`\n }\n\n return file.source\n}\n","/* eslint-disable no-await-in-loop */\n/* eslint-disable no-restricted-syntax */\n\nimport { definePlugin } from '../../plugin'\nimport { FileManager } from '../fileManager'\nimport { Queue } from '../../utils/queue'\n\nimport type { QueueTask } from '../../utils/queue'\nimport type { Argument0, Strategy } from './types'\nimport type { KubbConfig, KubbPlugin, PluginLifecycleHooks, PluginLifecycle, MaybePromise, ResolvePathParams, ResolveNameParams } from '../../types'\nimport type { Logger } from '../../build'\nimport type { CorePluginOptions } from '../../plugin'\n\n// inspired by: https://github.com/rollup/rollup/blob/master/src/utils/PluginDriver.ts#\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 resolvePath: 1,\n resolveName: 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 PluginManager {\n public plugins: KubbPlugin[]\n\n public readonly fileManager: FileManager\n\n private readonly logger?: Logger\n\n private readonly config: KubbConfig\n\n public readonly core: KubbPlugin<CorePluginOptions>\n\n public queue: Queue\n\n constructor(config: KubbConfig, options: { logger?: Logger; task: QueueTask }) {\n this.logger = options.logger\n this.config = config\n this.queue = new Queue(10)\n\n this.fileManager = new FileManager({ task: options.task, queue: this.queue })\n this.core = definePlugin({\n config,\n fileManager: this.fileManager,\n load: this.load,\n resolvePath: this.resolvePath,\n resolveName: this.resolveName,\n }) as KubbPlugin<CorePluginOptions> & {\n api: CorePluginOptions['api']\n }\n this.plugins = [this.core, ...(config.plugins || [])]\n }\n\n resolvePath = (params: ResolvePathParams) => {\n if (params.pluginName) {\n return this.hookForPluginSync({\n pluginName: params.pluginName,\n hookName: 'resolvePath',\n parameters: [params.fileName, params.directory, params.options],\n })\n }\n return this.hookFirstSync({\n hookName: 'resolvePath',\n parameters: [params.fileName, params.directory, params.options],\n })\n }\n\n resolveName = (params: ResolveNameParams) => {\n if (params.pluginName) {\n return this.hookForPluginSync({\n pluginName: params.pluginName,\n hookName: 'resolveName',\n parameters: [params.name],\n })\n }\n return this.hookFirstSync({\n hookName: 'resolveName',\n parameters: [params.name],\n })\n }\n\n load = async (id: string) => {\n return this.hookFirst({\n hookName: 'load',\n parameters: [id],\n })\n }\n\n /**\n *\n * Run only hook for a specific plugin name\n */\n hookForPlugin<H extends PluginLifecycleHooks>({\n pluginName,\n hookName,\n parameters,\n }: {\n pluginName: string\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n }): Promise<ReturnType<PluginLifecycle[H]> | null> {\n const plugin = this.getPlugin(hookName, pluginName)\n\n return this.run({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n })\n }\n\n hookForPluginSync<H extends PluginLifecycleHooks>({\n pluginName,\n hookName,\n parameters,\n }: {\n pluginName: string\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n }): ReturnType<PluginLifecycle[H]> | null {\n const plugin = this.getPlugin(hookName, pluginName)\n\n return this.runSync({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n })\n }\n\n /**\n *\n * Chains, first non-null result stops and returns\n */\n hookFirst<H extends PluginLifecycleHooks>({\n hookName,\n parameters,\n skipped,\n }: {\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n skipped?: ReadonlySet<KubbPlugin> | 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.run({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n }) as typeof result\n })\n }\n return promise\n }\n\n /**\n *\n * Chains, first non-null result stops and returns\n */\n hookFirstSync<H extends PluginLifecycleHooks>({\n hookName,\n parameters,\n skipped,\n }: {\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n skipped?: ReadonlySet<KubbPlugin> | null\n }): ReturnType<PluginLifecycle[H]> | null {\n let result = null\n\n for (const plugin of this.getSortedPlugins(hookName)) {\n if (skipped && skipped.has(plugin)) continue\n\n result = this.runSync({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n })\n\n if (result != null) {\n break\n }\n }\n return result\n }\n\n // parallel\n async hookParallel<H extends PluginLifecycleHooks, TOuput = void>({\n hookName,\n parameters,\n }: {\n hookName: H\n parameters?: Parameters<PluginLifecycle[H]> | undefined\n }) {\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.run({\n strategy: 'hookParallel',\n hookName,\n parameters,\n plugin,\n })\n } else {\n const promise: Promise<TOuput> = this.run({ strategy: '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,\n parameters,\n reduce,\n }: {\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n reduce: (reduction: Argument0<H>, result: ReturnType<PluginLifecycle[H]>, plugin: KubbPlugin) => MaybePromise<Argument0<H> | null>\n }): Promise<Argument0<H>> {\n const [argument0, ...rest] = parameters\n\n let promise: Promise<Argument0<H>> = Promise.resolve(argument0)\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise.then((argument0) =>\n this.run({\n strategy: 'hookReduceArg0',\n hookName,\n parameters: [argument0, ...rest] as Parameters<PluginLifecycle[H]>,\n plugin,\n }).then((result) => reduce.call(this.core.api, argument0, result as ReturnType<PluginLifecycle[H]>, plugin))\n ) as Promise<Argument0<H>>\n }\n return promise\n }\n\n // chains\n\n hookSeq<H extends PluginLifecycleHooks>({ hookName, parameters }: { 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(() =>\n this.run({\n strategy: 'hookSeq',\n hookName,\n parameters,\n plugin,\n })\n )\n }\n return promise.then(noReturn)\n }\n\n private getSortedPlugins(_hookName: keyof PluginLifecycle): KubbPlugin[] {\n const plugins = [...this.plugins]\n\n return plugins\n }\n\n private getPlugin(hookName: keyof PluginLifecycle, pluginName: string): KubbPlugin {\n const plugins = [...this.plugins]\n\n const pluginByPluginName = plugins.find((item) => item.name === pluginName && item[hookName])\n if (!pluginByPluginName) {\n // fallback on the core plugin when there is no match\n if (this.config.logLevel === 'warn' && this.logger?.spinner) {\n this.logger.spinner.info(`Plugin hook with ${hookName} not found for plugin ${pluginName}`)\n }\n return this.core\n }\n return pluginByPluginName\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 run<H extends PluginLifecycleHooks, TResult = void>({\n strategy,\n hookName,\n parameters,\n plugin,\n }: {\n strategy: Strategy\n hookName: H\n parameters: unknown[] | undefined\n plugin: KubbPlugin\n }): Promise<TResult> {\n const hook = plugin[hookName]!\n\n return Promise.resolve()\n .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 Function).apply(this.core.api, parameters)\n\n if (!(hookResult as Promise<unknown>)?.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 .catch((e: Error) => {\n this.catcher<H>(e, plugin, hookName)\n }) as Promise<TResult>\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 runSync<H extends PluginLifecycleHooks>({\n strategy,\n hookName,\n parameters,\n plugin,\n }: {\n strategy: Strategy\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n plugin: KubbPlugin\n }): 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 if (typeof hook !== 'function') {\n return hook\n }\n\n return (hook as Function).apply(this.core.api, parameters)\n } catch (e) {\n this.catcher<H>(e as Error, plugin, hookName)\n return null as ReturnType<PluginLifecycle[H]>\n }\n }\n\n private catcher<H extends PluginLifecycleHooks>(e: Error, plugin: KubbPlugin, hookName: H) {\n const text = `${e.message} (plugin: ${plugin.name}, hook: ${hookName})\\n`\n\n throw new Error(text, { cause: e })\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noReturn() {}\n","import type { KubbPlugin } from '../../types'\n\nexport class ValidationPluginError extends Error {}\n\nexport function validatePlugins(plugins: KubbPlugin[], dependedPluginNames: string | string[]): true {\n let pluginNames: string[] = []\n if (typeof dependedPluginNames === 'string') {\n pluginNames = [dependedPluginNames]\n } else {\n pluginNames = dependedPluginNames\n }\n\n pluginNames.forEach((pluginName) => {\n const exists = plugins.some((plugin) => plugin.name === pluginName)\n if (!exists) {\n throw new ValidationPluginError(`This plugin depends on the ${pluginName} plugin.`)\n }\n })\n\n return true\n}\n","import type { MaybePromise, KubbUserConfig, CLIOptions } from './types'\n\n/**\n * Type helper to make it easier to use kubb.config.ts\n * accepts a direct {@link KubbConfig} object, or a function that returns it.\n * The function receives a {@link ConfigEnv} object that exposes two properties:\n */\nexport const defineConfig = (\n options:\n | MaybePromise<KubbUserConfig>\n | ((\n /** The options derived from the CLI flags */\n cliOptions: CLIOptions\n ) => MaybePromise<KubbUserConfig>)\n) => options\n","/**\n * Abstract class that contains the building blocks for plugins to create their own Generator\n * @link idea based on https://github.com/colinhacks/zod/blob/master/src/types.ts#L137\n */\nexport abstract class Generator<TOptions extends object = object> {\n private _options: TOptions = {} as TOptions\n\n constructor(options: TOptions = {} as TOptions) {\n if (options) {\n this._options = {\n ...this._options,\n ...options,\n }\n }\n return this\n }\n\n get options() {\n return this._options\n }\n\n abstract build(...params: unknown[]): unknown\n}\n","import { Generator } from './Generator'\n/**\n * Abstract class that contains the building blocks for plugins to create their own SchemaGenerator\n */\nexport abstract class SchemaGenerator<TOptions extends object, TInput, TOutput> extends Generator<TOptions> {\n abstract build(schema: TInput, name: string, description?: string): TOutput\n}\n","/* eslint-disable @typescript-eslint/no-empty-interface */\nimport { build } from './build'\n\nexport * from './config'\nexport * from './build'\nexport { CorePluginOptions, createPlugin, name } from './plugin'\nexport * from './utils'\nexport * from './types'\nexport * from './managers'\nexport * from './generators'\n\nexport default build\n"]}
1
+ {"version":3,"sources":["../src/plugin.ts","../src/utils/isPromise.ts","../src/utils/write.ts","../src/utils/cache.ts","../src/utils/read.ts","../src/utils/isURL.ts","../src/utils/objectToParameters.ts","../src/utils/nameSorter.ts","../src/utils/jsdoc.ts","../src/utils/getUniqueName.ts","../src/utils/timeout.ts","../src/utils/Queue.ts","../src/utils/getEncodedText.ts","../src/utils/renderTemplate.ts","../src/utils/clean.ts","../src/utils/TreeNode.ts","../src/utils/transformReservedWord.ts","../src/managers/fileManager/FileManager.ts","../src/managers/fileManager/utils.ts","../src/managers/pluginManager/PluginManager.ts","../src/managers/pluginManager/validate.ts","../src/build.ts","../src/config.ts","../src/generators/Generator.ts","../src/generators/SchemaGenerator.ts","../src/index.ts"],"names":["pathParser","fs","name","files","argument0"],"mappings":"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","sourcesContent":["import pathParser from 'path'\n\nimport { createPluginCache, transformReservedWord } from './utils'\n\nimport type { FileManager } from './managers/fileManager'\nimport type { PluginContext, KubbPlugin, PluginFactoryOptions } from './types'\n\ntype KubbPluginFactory<T extends PluginFactoryOptions = PluginFactoryOptions> = (\n options: T['options']\n) => T['nested'] extends true ? Array<KubbPlugin<T>> : KubbPlugin<T>\n\nexport function createPlugin<T extends PluginFactoryOptions = PluginFactoryOptions>(factory: KubbPluginFactory<T>) {\n return (options: T['options']) => {\n const plugin = factory(options)\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 config: PluginContext['config']\n fileManager: FileManager\n resolvePath: PluginContext['resolvePath']\n resolveName: PluginContext['resolveName']\n load: PluginContext['load']\n}\n\n// not publicly exported\nexport type CorePluginOptions = PluginFactoryOptions<Options, false, PluginContext>\n\nexport const name = 'core' as const\n\nexport const definePlugin = createPlugin<CorePluginOptions>((options) => {\n const { fileManager, resolvePath, resolveName, load } = options\n\n const api: PluginContext = {\n get config() {\n return options.config\n },\n fileManager,\n async addFile(...files) {\n return Promise.all(files.map((file) => (file.override ? fileManager.add(file) : fileManager.addOrAppend(file))))\n },\n resolvePath,\n resolveName: (params) => {\n const name = resolveName(params)\n\n return transformReservedWord(name)\n },\n load,\n cache: createPluginCache(Object.create(null)),\n }\n\n return {\n name,\n options,\n api,\n resolvePath(fileName) {\n const root = pathParser.resolve(this.config.root, this.config.output.path)\n\n return pathParser.resolve(root, fileName)\n },\n resolveName(name) {\n return name\n },\n }\n})\n","import type { MaybePromise } from '../types'\n\nexport function isPromise<T>(result: MaybePromise<T>): result is Promise<T> {\n return typeof (result as Promise<unknown>)?.then === 'function'\n}\n","/* eslint-disable consistent-return */\nimport { promises as fs } from 'fs'\nimport pathParser from 'path'\n\nasync function safeWriteFileToPath(path: string, data: string) {\n // resolve the full path and get just the directory, ignoring the file and extension\n const passedPath = pathParser.dirname(pathParser.resolve(path))\n // make the directory, recursively. Theoretically, if every directory in the path exists, this won't do anything.\n await fs.mkdir(passedPath, { recursive: true })\n // write the file to the newly created directory\n return fs.writeFile(pathParser.resolve(path), data, { encoding: 'utf-8' })\n}\n\nexport async function write(data: string, path: string) {\n try {\n await fs.stat(path)\n const oldContent = await fs.readFile(path, { encoding: 'utf-8' })\n if (oldContent?.toString() === data) {\n return\n }\n } catch (_err) {\n return safeWriteFileToPath(path, data)\n }\n\n return safeWriteFileToPath(path, data)\n}\n","/* eslint-disable no-param-reassign */\n/* eslint-disable consistent-return */\n\nexport interface Cache<T extends object = object> {\n delete(id: keyof T): boolean\n get(id: keyof T): T[keyof T] | null\n has(id: keyof T): boolean\n set(id: keyof T, value: unknown): void\n}\n\nexport function createPluginCache<T extends Record<string, [number, unknown]>>(cache: T): Cache<T> {\n return {\n delete(id: keyof T) {\n return delete cache[id]\n },\n get(id) {\n const item = cache[id]\n if (!item) return null\n item[0] = 0\n return item[1] as T[keyof T]\n },\n has(id) {\n const item = cache[id]\n if (!item) return false\n item[0] = 0\n return true\n },\n set(id, value) {\n cache[id] = [0, value] as T[keyof T]\n },\n }\n}\n","import pathParser from 'path'\nimport { promises as fs } from 'fs'\n\nfunction slash(path: string) {\n const isExtendedLengthPath = /^\\\\\\\\\\?\\\\/.test(path)\n\n if (isExtendedLengthPath) {\n return path\n }\n\n return path.replace(/\\\\/g, '/')\n}\n\nexport function getRelativePath(rootDir?: string | null, filePath?: string | null) {\n if (!rootDir || !filePath) {\n throw new Error(`Root and file should be filled in when retrieving the relativePath, ${rootDir} ${filePath}`)\n }\n\n const relativePath = pathParser.relative(rootDir, filePath)\n\n // On Windows, paths are separated with a \"\\\"\n // However, web browsers use \"/\" no matter the platform\n const path = slash(relativePath).replace('../', '').trimEnd()\n\n if (path.startsWith('../')) {\n return path.replace(pathParser.basename(path), pathParser.basename(path, pathParser.extname(filePath)))\n }\n\n return `./${path.replace(pathParser.basename(path), pathParser.basename(path, pathParser.extname(filePath)))}`\n}\n\nexport type PathMode = 'file' | 'directory'\n\nexport function getPathMode(path: string | undefined | null): PathMode {\n if (!path) {\n return 'directory'\n }\n return pathParser.extname(path) ? 'file' : 'directory'\n}\n\nexport async function read(path: string) {\n try {\n return fs.readFile(path, { encoding: 'utf8' })\n } catch (err) {\n console.error(err)\n throw err\n }\n}\n","export function isURL(data: string) {\n try {\n const url = new URL(data)\n if (url?.href) {\n return true\n }\n } catch (error) {\n return false\n }\n return false\n}\n","type Data = string[][]\n\ntype Options = {\n typed?: boolean\n}\n\nexport function objectToParameters(data: Data, options: Options = {}) {\n const { typed } = options\n\n return data\n .reduce((acc, [key, value]) => {\n if (typed) {\n acc.push(`${key}: ${value}[\"${key}\"]`)\n } else {\n acc.push(`${key}`)\n }\n\n return acc\n }, [] as string[])\n .join(', ')\n}\n","export function nameSorter<T extends { name: string }>(a: T, b: T) {\n if (a.name < b.name) {\n return -1\n }\n if (a.name > b.name) {\n return 1\n }\n return 0\n}\n","export function createJSDocBlockText({ comments }: { comments: Array<string> }): string {\n const filteredComments = comments.filter(Boolean)\n\n if (!filteredComments.length) {\n return ''\n }\n\n const text = filteredComments.reduce((acc, comment) => {\n return `${acc}\\n* ${comment}`\n }, '/**')\n\n return `${text}\\n*/`\n}\n","/* eslint-disable no-param-reassign */\nexport function getUniqueName(originalName: string, data: Record<string, number>) {\n let used = data[originalName] || 0\n if (used) {\n data[originalName] = ++used\n originalName += used\n }\n data[originalName] = 1\n return originalName\n}\n","export async function timeout(ms: number) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(true)\n }, ms)\n })\n}\n","/* eslint-disable no-cond-assign */\n\nexport type QueueTask<T = unknown> = {\n (...args: unknown[]): Promise<T>\n}\n\ninterface QueueItem {\n reject: <T>(reason?: T) => void\n resolve: <T>(value: T | PromiseLike<T>) => void\n task: QueueTask<unknown>\n}\n\nexport class Queue {\n private readonly queue: QueueItem[] = []\n\n workerCount = 0\n\n private maxParallel: number\n\n constructor(maxParallel: number) {\n this.maxParallel = maxParallel\n }\n\n run<T>(task: QueueTask<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const item: QueueItem = { reject, resolve, task } as QueueItem\n this.queue.push(item)\n this.work()\n })\n }\n\n private async work(): Promise<void> {\n if (this.workerCount >= this.maxParallel) return\n this.workerCount++\n\n let entry: QueueItem | undefined\n while ((entry = this.queue.shift())) {\n const { reject, resolve, task } = entry\n task()\n .then((result) => resolve(result))\n .catch((err) => reject(err))\n }\n\n this.workerCount--\n }\n}\n","export function getEncodedText(text?: string): string {\n return text ? text.replaceAll('`', '\\\\`') : ''\n}\n","export function renderTemplate<TData extends Record<string, string> = Record<string, string>>(template: string, data: TData | undefined = undefined) {\n if (!data) {\n return template.replace(/{{(.*?)}}/g, '')\n }\n\n return template.replace(/{{(.*?)}}/g, (match) => {\n const value = data[match.split(/{{|}}/).filter(Boolean)[0].trim()]\n\n return value || ''\n })\n}\n","import rimraf from 'rimraf'\n\nexport async function clean(path: string) {\n return new Promise((resolve, reject) => {\n rimraf(path, (err) => {\n if (err) {\n reject(err)\n } else {\n resolve(true)\n }\n })\n })\n}\n","import dirTree from 'directory-tree'\n\nimport type { DirectoryTree, DirectoryTreeOptions } from 'directory-tree'\n\nexport type TreeNodeOptions = DirectoryTreeOptions\n\nexport class TreeNode<T = unknown> {\n public data: T\n\n public parent?: TreeNode<T>\n\n public children: Array<TreeNode<T>> = []\n\n constructor(data: T, parent?: TreeNode<T>) {\n this.data = data\n this.parent = parent\n return this\n }\n\n addChild(data: T): TreeNode<T> {\n const child = new TreeNode(data, this)\n if (!this.children) {\n this.children = []\n }\n this.children.push(child)\n return child\n }\n\n find(data: T) {\n if (data === this.data) {\n return this\n }\n\n if (this.children) {\n for (let i = 0, { length } = this.children, target: unknown = null; i < length; i++) {\n target = this.children[i].find(data)\n if (target) {\n return target\n }\n }\n }\n\n return null\n }\n\n leaves(): TreeNode<T>[] {\n if (!this.children || this.children.length === 0) {\n // this is a leaf\n return [this]\n }\n\n // if not a leaf, return all children's leaves recursively\n const leaves: TreeNode<T>[] = []\n if (this.children) {\n for (let i = 0, { length } = this.children; i < length; i++) {\n // eslint-disable-next-line prefer-spread\n leaves.push.apply(leaves, this.children[i].leaves())\n }\n }\n return leaves\n }\n\n root(): TreeNode<T> {\n if (!this.parent) {\n return this\n }\n return this.parent.root()\n }\n\n forEach(callback: (treeNode: TreeNode<T>) => void): this {\n if (typeof callback !== 'function') {\n throw new TypeError('forEach() callback must be a function')\n }\n\n // run this node through function\n callback(this)\n\n // do the same for all children\n if (this.children) {\n for (let i = 0, { length } = this.children; i < length; i++) {\n this.children[i].forEach(callback)\n }\n }\n\n return this\n }\n\n public static build<T = unknown>(path: string, options: TreeNodeOptions = {}): TreeNode<T> | null {\n const filteredTree = dirTree(path, { extensions: options?.extensions, exclude: options.exclude })\n\n if (!filteredTree) {\n return null\n }\n\n const treeNode = new TreeNode({ name: filteredTree.name, path: filteredTree.path, type: filteredTree.type })\n\n const recurse = (node: typeof treeNode, item: DirectoryTree) => {\n const subNode = node.addChild({ name: item.name, path: item.path, type: item.type })\n\n if (item.children?.length) {\n item.children?.forEach((child) => {\n recurse(subNode, child)\n })\n }\n }\n\n filteredTree.children?.forEach((child) => recurse(treeNode, child))\n\n return treeNode as TreeNode<T>\n }\n}\n","/**\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = [\n 'abstract',\n 'arguments',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n\n 'Array',\n 'Date',\n 'eval',\n 'function',\n 'hasOwnProperty',\n 'Infinity',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'length',\n 'Math',\n 'name',\n 'NaN',\n 'Number',\n 'Object',\n 'prototype',\n 'String',\n 'toString',\n 'undefined',\n 'valueOf',\n]\n\nexport function transformReservedWord(word: string) {\n if (reservedWords.includes(word)) {\n return `_${word}`\n }\n\n return word\n}\n","import { v4 as uuidv4 } from 'uuid'\n\nimport { write, read } from '../../utils'\n\nimport type { QueueTask, Queue } from '../../utils'\nimport type { CacheStore, UUID, Status, File } from './types'\n\nexport class FileManager {\n private cache: Map<CacheStore['id'], CacheStore> = new Map()\n\n private task?: QueueTask<unknown>\n\n private queue?: Queue\n\n constructor(options?: { queue: Queue; task: QueueTask<unknown> }) {\n if (options) {\n this.task = options.task\n this.queue = options.queue\n }\n }\n\n private getCache(id: UUID) {\n return this.cache.get(id)\n }\n\n getCacheByPath(path: string | undefined): CacheStore | undefined {\n let cache\n\n this.cache.forEach((item) => {\n if (item.file.path === path) {\n cache = item\n }\n })\n return cache as unknown as CacheStore\n }\n\n get files() {\n const files: File[] = []\n this.cache.forEach((item) => {\n files.push(item.file)\n })\n\n return files\n }\n\n async add(file: File) {\n const cacheItem = { id: uuidv4(), file, status: 'new' as Status }\n\n this.cache.set(cacheItem.id, cacheItem)\n\n if (this.queue) {\n await this.queue.run(async () => {\n await this.task?.(cacheItem.id, file)\n })\n }\n\n return file\n }\n\n addOrAppend(file: File) {\n if (!file.path.endsWith(file.fileName)) {\n // console.warn(`Path ${file.path}(file.path) should end with the fileName ${file.fileName}(file.filename)`)\n }\n\n const previousCache = this.getCacheByPath(file.path)\n\n if (previousCache) {\n // empty source will also return true when using includes\n const sourceAlreadyExists = file.source && previousCache.file.source.includes(file.source)\n\n if (sourceAlreadyExists) {\n return Promise.resolve(file)\n }\n\n this.cache.delete(previousCache.id)\n\n return this.add({\n ...file,\n source: `${previousCache.file.source}\\n${file.source}`,\n imports: [...(previousCache.file.imports || []), ...(file.imports || [])],\n exports: [...(previousCache.file.exports || []), ...(file.exports || [])],\n })\n }\n return this.add(file)\n }\n\n setStatus(id: UUID, status: Status) {\n const cacheItem = this.getCache(id)\n if (!cacheItem) {\n return\n }\n\n cacheItem.status = status\n this.cache.set(id, cacheItem)\n }\n\n get(id: UUID) {\n const cacheItem = this.getCache(id)\n return cacheItem?.file\n }\n\n remove(id: UUID) {\n const cacheItem = this.getCache(id)\n if (!cacheItem) {\n return\n }\n\n this.setStatus(id, 'removed')\n }\n\n async write(...params: Parameters<typeof write>) {\n return write(...params)\n }\n\n async read(...params: Parameters<typeof read>) {\n return read(...params)\n }\n}\n","import pathParser from 'path'\n\nimport uniq from 'lodash.uniq'\n\nimport { createImportDeclaration, createExportDeclaration, print } from '@kubb/ts-codegen'\n\nimport { TreeNode } from '../../utils'\n\nimport type { PathMode, TreeNodeOptions } from '../../utils'\nimport type { Path } from '../../types'\nimport type ts from 'typescript'\nimport type { File } from './types'\n\nexport function writeIndexes(root: string, options: TreeNodeOptions) {\n const tree = TreeNode.build<{ type: PathMode; path: Path; name: string }>(root, { extensions: /\\.ts/, ...options })\n\n if (!tree) {\n return undefined\n }\n\n const fileReducer = (files: File[], item: typeof tree) => {\n if (!item.children) {\n return []\n }\n\n if (item.children?.length > 1) {\n const path = pathParser.resolve(item.data.path, 'index.ts')\n const exports = item.children\n .map((file) => {\n if (!file) {\n return undefined\n }\n\n const importPath: string = file.data.type === 'directory' ? `./${file.data.name}` : `./${file.data.name.replace(/\\.[^.]*$/, '')}`\n\n // TODO weird hacky fix\n if (importPath.includes('index') && path.includes('index')) {\n return undefined\n }\n\n return { path: importPath }\n })\n .filter(Boolean) as File['exports']\n\n files.push({\n path,\n fileName: 'index.ts',\n source: '',\n exports,\n })\n } else {\n item.children?.forEach((child) => {\n const path = pathParser.resolve(item.data.path, 'index.ts')\n const importPath = child.data.type === 'directory' ? `./${child.data.name}` : `./${child.data.name.replace(/\\.[^.]*$/, '')}`\n\n files.push({\n path,\n fileName: 'index.ts',\n source: '',\n exports: [{ path: importPath }],\n })\n })\n }\n\n item.children.forEach((childItem) => {\n fileReducer(files, childItem)\n })\n\n return files\n }\n\n const files = fileReducer([], tree)\n\n return files\n}\n\nexport function combineFiles(files: Array<File | null>) {\n return files.filter(Boolean).reduce((acc, curr: File | null) => {\n if (!curr) {\n return acc\n }\n const prevIndex = acc.findIndex((item) => item.path === curr.path)\n\n if (prevIndex !== -1) {\n const prev = acc[prevIndex]\n acc[prevIndex] = {\n ...curr,\n source: `${prev.source}\\n${curr.source}`,\n imports: [...(prev.imports || []), ...(curr.imports || [])],\n exports: [...(prev.exports || []), ...(curr.exports || [])],\n }\n } else {\n acc.push(curr)\n }\n\n return acc\n }, [] as File[])\n}\n\nexport function getFileSource(file: File) {\n let { source } = file\n\n // TODO make generic check\n if (!file.fileName.endsWith('.ts')) {\n return file.source\n }\n const imports: File['imports'] = []\n const exports: File['exports'] = []\n\n file.imports?.forEach((curr) => {\n const exists = imports.find((imp) => imp.path === curr.path)\n if (!exists) {\n imports.push({\n ...curr,\n name: Array.isArray(curr.name) ? uniq(curr.name) : curr.name,\n })\n }\n\n if (exists && !Array.isArray(exists.name) && exists.name !== curr.name) {\n imports.push(curr)\n }\n\n if (exists && Array.isArray(exists.name)) {\n if (Array.isArray(curr.name)) {\n exists.name = uniq([...exists.name, ...curr.name])\n }\n }\n })\n\n file.exports?.forEach((curr) => {\n const exists = exports.find((imp) => imp.path === curr.path)\n if (!exists) {\n exports.push({\n ...curr,\n name: Array.isArray(curr.name) ? uniq(curr.name) : curr.name,\n })\n }\n\n if (exists && !Array.isArray(exists.name) && exists.name !== curr.name && exists.asAlias === curr.asAlias) {\n exports.push(curr)\n }\n\n if (exists && Array.isArray(exists.name)) {\n if (Array.isArray(curr.name)) {\n exists.name = uniq([...exists.name, ...curr.name])\n }\n }\n })\n\n const importNodes = imports.reduce((prev, curr) => {\n return [...prev, createImportDeclaration({ name: curr.name, path: curr.path, isTypeOnly: curr.isTypeOnly })]\n }, [] as ts.ImportDeclaration[])\n const importSource = print(importNodes)\n\n const exportNodes = exports.reduce((prev, curr) => {\n return [...prev, createExportDeclaration({ name: curr.name, path: curr.path, asAlias: curr.asAlias })]\n }, [] as ts.ExportDeclaration[])\n const exportSource = print(exportNodes)\n\n if (importSource) {\n source = `${importSource}\\n${source}`\n }\n\n if (exportSource) {\n source = `${exportSource}\\n${source}`\n }\n\n return source\n}\n","/* eslint-disable no-await-in-loop */\n/* eslint-disable no-restricted-syntax */\n\nimport { definePlugin } from '../../plugin'\nimport { FileManager } from '../fileManager'\nimport { Queue } from '../../utils/Queue'\n\nimport type { QueueTask } from '../../utils/Queue'\nimport type { Argument0, Strategy } from './types'\nimport type { KubbConfig, KubbPlugin, PluginLifecycleHooks, PluginLifecycle, MaybePromise, ResolvePathParams, ResolveNameParams } from '../../types'\nimport type { Logger } from '../../build'\nimport type { CorePluginOptions } from '../../plugin'\n\n// inspired by: https://github.com/rollup/rollup/blob/master/src/utils/PluginDriver.ts#\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 resolvePath: 1,\n resolveName: 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 PluginManager {\n public plugins: KubbPlugin[]\n\n public readonly fileManager: FileManager\n\n private readonly logger?: Logger\n\n private readonly config: KubbConfig\n\n public readonly core: KubbPlugin<CorePluginOptions>\n\n public queue: Queue\n\n constructor(config: KubbConfig, options: { logger?: Logger; task: QueueTask }) {\n this.logger = options.logger\n this.config = config\n this.queue = new Queue(10)\n\n this.fileManager = new FileManager({ task: options.task, queue: this.queue })\n this.core = definePlugin({\n config,\n fileManager: this.fileManager,\n load: this.load,\n resolvePath: this.resolvePath,\n resolveName: this.resolveName,\n }) as KubbPlugin<CorePluginOptions> & {\n api: CorePluginOptions['api']\n }\n this.plugins = [this.core, ...(config.plugins || [])]\n }\n\n resolvePath = (params: ResolvePathParams) => {\n if (params.pluginName) {\n return this.hookForPluginSync({\n pluginName: params.pluginName,\n hookName: 'resolvePath',\n parameters: [params.fileName, params.directory, params.options],\n })\n }\n return this.hookFirstSync({\n hookName: 'resolvePath',\n parameters: [params.fileName, params.directory, params.options],\n })\n }\n\n resolveName = (params: ResolveNameParams) => {\n if (params.pluginName) {\n return this.hookForPluginSync({\n pluginName: params.pluginName,\n hookName: 'resolveName',\n parameters: [params.name],\n })\n }\n return this.hookFirstSync({\n hookName: 'resolveName',\n parameters: [params.name],\n })\n }\n\n load = async (id: string) => {\n return this.hookFirst({\n hookName: 'load',\n parameters: [id],\n })\n }\n\n /**\n *\n * Run only hook for a specific plugin name\n */\n hookForPlugin<H extends PluginLifecycleHooks>({\n pluginName,\n hookName,\n parameters,\n }: {\n pluginName: string\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n }): Promise<ReturnType<PluginLifecycle[H]> | null> {\n const plugin = this.getPlugin(hookName, pluginName)\n\n return this.run({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n })\n }\n\n hookForPluginSync<H extends PluginLifecycleHooks>({\n pluginName,\n hookName,\n parameters,\n }: {\n pluginName: string\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n }): ReturnType<PluginLifecycle[H]> {\n const plugin = this.getPlugin(hookName, pluginName)\n\n return this.runSync({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n })\n }\n\n /**\n *\n * Chains, first non-null result stops and returns\n */\n hookFirst<H extends PluginLifecycleHooks>({\n hookName,\n parameters,\n skipped,\n }: {\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n skipped?: ReadonlySet<KubbPlugin> | null\n }): Promise<ReturnType<PluginLifecycle[H]>> {\n let promise: Promise<ReturnType<PluginLifecycle[H]>> = Promise.resolve(null as ReturnType<PluginLifecycle[H]>)\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.run({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n }) as typeof result\n })\n }\n return promise\n }\n\n /**\n *\n * Chains, first non-null result stops and returns\n */\n hookFirstSync<H extends PluginLifecycleHooks>({\n hookName,\n parameters,\n skipped,\n }: {\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n skipped?: ReadonlySet<KubbPlugin> | null\n }): ReturnType<PluginLifecycle[H]> {\n let result = null\n\n for (const plugin of this.getSortedPlugins(hookName)) {\n if (skipped && skipped.has(plugin)) continue\n\n result = this.runSync<H>({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n })\n\n if (result != null) {\n break\n }\n }\n return result as ReturnType<PluginLifecycle[H]>\n }\n\n // parallel\n async hookParallel<H extends PluginLifecycleHooks, TOuput = void>({\n hookName,\n parameters,\n }: {\n hookName: H\n parameters?: Parameters<PluginLifecycle[H]> | undefined\n }): Promise<Awaited<TOuput>[]> {\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.run({\n strategy: 'hookParallel',\n hookName,\n parameters,\n plugin,\n })\n } else {\n const promise: Promise<TOuput> = this.run({ strategy: '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,\n parameters,\n reduce,\n }: {\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n reduce: (reduction: Argument0<H>, result: ReturnType<PluginLifecycle[H]>, plugin: KubbPlugin) => MaybePromise<Argument0<H> | null>\n }): Promise<Argument0<H>> {\n const [argument0, ...rest] = parameters\n\n let promise: Promise<Argument0<H>> = Promise.resolve(argument0)\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise.then((argument0) =>\n this.run({\n strategy: 'hookReduceArg0',\n hookName,\n parameters: [argument0, ...rest] as Parameters<PluginLifecycle[H]>,\n plugin,\n }).then((result) => reduce.call(this.core.api, argument0, result as ReturnType<PluginLifecycle[H]>, plugin))\n ) as Promise<Argument0<H>>\n }\n return promise\n }\n\n // chains\n\n hookSeq<H extends PluginLifecycleHooks>({ hookName, parameters }: { 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(() =>\n this.run({\n strategy: 'hookSeq',\n hookName,\n parameters,\n plugin,\n })\n )\n }\n return promise.then(noReturn)\n }\n\n private getSortedPlugins(_hookName: keyof PluginLifecycle): KubbPlugin[] {\n const plugins = [...this.plugins]\n\n return plugins\n }\n\n private getPlugin(hookName: keyof PluginLifecycle, pluginName: string): KubbPlugin {\n const plugins = [...this.plugins]\n\n const pluginByPluginName = plugins.find((item) => item.name === pluginName && item[hookName])\n if (!pluginByPluginName) {\n // fallback on the core plugin when there is no match\n if (this.config.logLevel === 'warn' && this.logger?.spinner) {\n this.logger.spinner.info(`Plugin hook with ${hookName} not found for plugin ${pluginName}`)\n }\n return this.core\n }\n return pluginByPluginName\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 run<H extends PluginLifecycleHooks, TResult = void>({\n strategy,\n hookName,\n parameters,\n plugin,\n }: {\n strategy: Strategy\n hookName: H\n parameters: unknown[] | undefined\n plugin: KubbPlugin\n }): Promise<TResult> {\n const hook = plugin[hookName]!\n\n return Promise.resolve()\n .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 Function).apply(this.core.api, parameters)\n\n if (!(hookResult as Promise<unknown>)?.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 .catch((e: Error) => {\n this.catcher<H>(e, plugin, hookName)\n }) as Promise<TResult>\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 runSync<H extends PluginLifecycleHooks>({\n strategy,\n hookName,\n parameters,\n plugin,\n }: {\n strategy: Strategy\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n plugin: KubbPlugin\n }): 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 if (typeof hook !== 'function') {\n return hook\n }\n\n return (hook as Function).apply(this.core.api, parameters)\n } catch (e) {\n this.catcher<H>(e as Error, plugin, hookName)\n return null as ReturnType<PluginLifecycle[H]>\n }\n }\n\n private catcher<H extends PluginLifecycleHooks>(e: Error, plugin: KubbPlugin, hookName: H) {\n const text = `${e.message} (plugin: ${plugin.name}, hook: ${hookName})\\n`\n\n throw new Error(text, { cause: e })\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noReturn() {}\n","import type { KubbPlugin } from '../../types'\n\nexport class ValidationPluginError extends Error {}\n\nexport function validatePlugins(plugins: KubbPlugin[], dependedPluginNames: string | string[]): true {\n let pluginNames: string[] = []\n if (typeof dependedPluginNames === 'string') {\n pluginNames = [dependedPluginNames]\n } else {\n pluginNames = dependedPluginNames\n }\n\n pluginNames.forEach((pluginName) => {\n const exists = plugins.some((plugin) => plugin.name === pluginName)\n if (!exists) {\n throw new ValidationPluginError(`This plugin depends on the ${pluginName} plugin.`)\n }\n })\n\n return true\n}\n","/* eslint-disable no-async-promise-executor */\nimport pathParser from 'path'\n\nimport { isURL } from './utils/isURL'\nimport { PluginManager } from './managers/pluginManager'\nimport { clean, read } from './utils'\nimport { getFileSource } from './managers/fileManager'\n\nimport type { FileManager, File } from './managers/fileManager'\nimport type { QueueTask } from './utils'\nimport type { PluginContext, TransformResult, LogLevel, KubbPlugin } from './types'\n\ntype BuildOutput = {\n files: FileManager['files']\n}\n\n// Same type as ora\ntype Spinner = {\n start: (text?: string) => Spinner\n succeed: (text: string) => Spinner\n fail: (text?: string) => Spinner\n stopAndPersist: (options: { text: string }) => Spinner\n render: () => Spinner\n text: string\n info: (text: string) => Spinner\n}\n\nexport type Logger = {\n log: (message: string, logLevel: LogLevel) => void\n spinner?: Spinner\n}\ntype BuildOptions = {\n config: PluginContext['config']\n logger?: Logger\n}\n\nasync function transformReducer(\n this: PluginContext,\n _previousCode: string,\n result: TransformResult | Promise<TransformResult>,\n _plugin: KubbPlugin\n): Promise<string | null> {\n if (result === null) {\n return null\n }\n return result\n}\n\nasync function buildImplementation(options: BuildOptions): Promise<BuildOutput> {\n const { config, logger } = options\n\n if (config.output.clean) {\n await clean(config.output.path)\n }\n\n const queueTask = async (id: string, file: File) => {\n const { path } = file\n\n let code = getFileSource(file)\n\n const loadedResult = await pluginManager.hookFirst({\n hookName: 'load',\n parameters: [path],\n })\n if (loadedResult) {\n code = loadedResult\n }\n\n if (code) {\n const transformedCode = await pluginManager.hookReduceArg0({\n hookName: 'transform',\n parameters: [code, path],\n reduce: transformReducer,\n })\n\n if (config.output.write || config.output.write === undefined) {\n await pluginManager.hookParallel({\n hookName: 'writeFile',\n parameters: [transformedCode, path],\n })\n }\n }\n }\n\n const pluginManager = new PluginManager(config, { logger, task: queueTask as QueueTask })\n const { plugins, fileManager } = pluginManager\n\n await pluginManager.hookParallel<'validate', true>({\n hookName: 'validate',\n parameters: [plugins],\n })\n\n await pluginManager.hookParallel({\n hookName: 'buildStart',\n parameters: [config],\n })\n\n await pluginManager.hookParallel({ hookName: 'buildEnd' })\n\n return { files: fileManager.files.map((file) => ({ ...file, source: getFileSource(file) })) }\n}\n\nexport type KubbBuild = (options: BuildOptions) => Promise<BuildOutput>\n\nexport function build(options: BuildOptions): Promise<BuildOutput> {\n return new Promise(async (resolve, reject) => {\n try {\n const output = await buildImplementation(options)\n\n setTimeout(() => {\n resolve(output)\n }, 500)\n } catch (e) {\n reject(e)\n }\n })\n}\n","import type { MaybePromise, KubbUserConfig, CLIOptions } from './types'\n\n/**\n * Type helper to make it easier to use kubb.config.ts\n * accepts a direct {@link KubbConfig} object, or a function that returns it.\n * The function receives a {@link ConfigEnv} object that exposes two properties:\n */\nexport const defineConfig = (\n options:\n | MaybePromise<KubbUserConfig>\n | ((\n /** The options derived from the CLI flags */\n cliOptions: CLIOptions\n ) => MaybePromise<KubbUserConfig>)\n) => options\n","/**\n * Abstract class that contains the building blocks for plugins to create their own Generator\n * @link idea based on https://github.com/colinhacks/zod/blob/master/src/types.ts#L137\n */\nexport abstract class Generator<TOptions extends object = object> {\n private _options: TOptions = {} as TOptions\n\n constructor(options: TOptions = {} as TOptions) {\n if (options) {\n this._options = {\n ...this._options,\n ...options,\n }\n }\n return this\n }\n\n get options() {\n return this._options\n }\n\n abstract build(...params: unknown[]): unknown\n}\n","import { Generator } from './Generator'\n/**\n * Abstract class that contains the building blocks for plugins to create their own SchemaGenerator\n */\nexport abstract class SchemaGenerator<TOptions extends object, TInput, TOutput> extends Generator<TOptions> {\n abstract build(schema: TInput, name: string, description?: string): TOutput\n}\n","/* eslint-disable @typescript-eslint/no-empty-interface */\nimport { build } from './build'\n\nexport * from './config'\nexport * from './build'\nexport { CorePluginOptions, createPlugin, name } from './plugin'\nexport * from './utils'\nexport * from './types'\nexport * from './managers'\nexport * from './generators'\n\nexport default build\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/core",
3
- "version": "1.0.0-beta.8",
3
+ "version": "1.0.0",
4
4
  "description": "Generator core",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,6 +40,7 @@
40
40
  "!/**/__tests__/**"
41
41
  ],
42
42
  "dependencies": {
43
+ "@kubb/ts-codegen": "1.0.0",
43
44
  "change-case": "^4.1.2",
44
45
  "directory-tree": "^3.5.1",
45
46
  "lodash.uniq": "^4.5.0",
@@ -51,7 +52,7 @@
51
52
  "@types/rimraf": "^3.0.2",
52
53
  "@types/uuid": "^9.0.1",
53
54
  "tsup": "^6.7.0",
54
- "typescript": "^5.0.3"
55
+ "typescript": "^5.1.3"
55
56
  },
56
57
  "publishConfig": {
57
58
  "access": "public",
package/src/build.ts CHANGED
@@ -46,7 +46,7 @@ async function transformReducer(
46
46
  return result
47
47
  }
48
48
 
49
- async function buildImplementation(options: BuildOptions, done: (output: BuildOutput) => void) {
49
+ async function buildImplementation(options: BuildOptions): Promise<BuildOutput> {
50
50
  const { config, logger } = options
51
51
 
52
52
  if (config.output.clean) {
@@ -96,15 +96,8 @@ async function buildImplementation(options: BuildOptions, done: (output: BuildOu
96
96
  })
97
97
 
98
98
  await pluginManager.hookParallel({ hookName: 'buildEnd' })
99
- setTimeout(() => {
100
- done({ files: fileManager.files.map((file) => ({ ...file, source: getFileSource(file) })) })
101
- }, 500)
102
-
103
- pluginManager.fileManager.add({
104
- path: isURL(config.input.path) ? config.input.path : pathParser.resolve(config.root, config.input.path),
105
- fileName: isURL(config.input.path) ? 'input' : config.input.path,
106
- source: isURL(config.input.path) ? config.input.path : await read(pathParser.resolve(config.root, config.input.path)),
107
- })
99
+
100
+ return { files: fileManager.files.map((file) => ({ ...file, source: getFileSource(file) })) }
108
101
  }
109
102
 
110
103
  export type KubbBuild = (options: BuildOptions) => Promise<BuildOutput>
@@ -112,7 +105,11 @@ export type KubbBuild = (options: BuildOptions) => Promise<BuildOutput>
112
105
  export function build(options: BuildOptions): Promise<BuildOutput> {
113
106
  return new Promise(async (resolve, reject) => {
114
107
  try {
115
- await buildImplementation(options, resolve)
108
+ const output = await buildImplementation(options)
109
+
110
+ setTimeout(() => {
111
+ resolve(output)
112
+ }, 500)
116
113
  } catch (e) {
117
114
  reject(e)
118
115
  }
@@ -23,7 +23,7 @@ export class FileManager {
23
23
  return this.cache.get(id)
24
24
  }
25
25
 
26
- private getCacheByPath(path: string | undefined): CacheStore | undefined {
26
+ getCacheByPath(path: string | undefined): CacheStore | undefined {
27
27
  let cache
28
28
 
29
29
  this.cache.forEach((item) => {
@@ -58,14 +58,27 @@ export class FileManager {
58
58
  }
59
59
 
60
60
  addOrAppend(file: File) {
61
+ if (!file.path.endsWith(file.fileName)) {
62
+ // console.warn(`Path ${file.path}(file.path) should end with the fileName ${file.fileName}(file.filename)`)
63
+ }
64
+
61
65
  const previousCache = this.getCacheByPath(file.path)
62
66
 
63
67
  if (previousCache) {
68
+ // empty source will also return true when using includes
69
+ const sourceAlreadyExists = file.source && previousCache.file.source.includes(file.source)
70
+
71
+ if (sourceAlreadyExists) {
72
+ return Promise.resolve(file)
73
+ }
74
+
64
75
  this.cache.delete(previousCache.id)
76
+
65
77
  return this.add({
66
78
  ...file,
67
79
  source: `${previousCache.file.source}\n${file.source}`,
68
80
  imports: [...(previousCache.file.imports || []), ...(file.imports || [])],
81
+ exports: [...(previousCache.file.exports || []), ...(file.exports || [])],
69
82
  })
70
83
  }
71
84
  return this.add(file)
@@ -1,4 +1,3 @@
1
1
  export * from './FileManager'
2
2
  export * from './types'
3
- export * from './TreeNode'
4
3
  export * from './utils'
@@ -1,9 +1,16 @@
1
1
  type Import = {
2
- name: string | string[] | readonly string[]
2
+ name: string | string[]
3
3
  path: string
4
4
  isTypeOnly?: boolean
5
5
  }
6
6
 
7
+ type Export = {
8
+ name?: string | string[]
9
+ path: string
10
+ isTypeOnly?: boolean
11
+ asAlias?: boolean
12
+ }
13
+
7
14
  export type File = {
8
15
  /**
9
16
  * Name to be used to dynamicly create the fileName(based on input.path)
@@ -15,6 +22,12 @@ export type File = {
15
22
  path: string
16
23
  source: string
17
24
  imports?: Import[]
25
+ exports?: Export[]
26
+ /**
27
+ * This will call fileManager.add instead of fileManager.addOrAppend, adding the source when the files already exists
28
+ * @default `false`
29
+ */
30
+ override?: boolean
18
31
  }
19
32
 
20
33
  export type UUID = string
@@ -1,7 +1,79 @@
1
+ import pathParser from 'path'
2
+
1
3
  import uniq from 'lodash.uniq'
2
4
 
5
+ import { createImportDeclaration, createExportDeclaration, print } from '@kubb/ts-codegen'
6
+
7
+ import { TreeNode } from '../../utils'
8
+
9
+ import type { PathMode, TreeNodeOptions } from '../../utils'
10
+ import type { Path } from '../../types'
11
+ import type ts from 'typescript'
3
12
  import type { File } from './types'
4
13
 
14
+ export function writeIndexes(root: string, options: TreeNodeOptions) {
15
+ const tree = TreeNode.build<{ type: PathMode; path: Path; name: string }>(root, { extensions: /\.ts/, ...options })
16
+
17
+ if (!tree) {
18
+ return undefined
19
+ }
20
+
21
+ const fileReducer = (files: File[], item: typeof tree) => {
22
+ if (!item.children) {
23
+ return []
24
+ }
25
+
26
+ if (item.children?.length > 1) {
27
+ const path = pathParser.resolve(item.data.path, 'index.ts')
28
+ const exports = item.children
29
+ .map((file) => {
30
+ if (!file) {
31
+ return undefined
32
+ }
33
+
34
+ const importPath: string = file.data.type === 'directory' ? `./${file.data.name}` : `./${file.data.name.replace(/\.[^.]*$/, '')}`
35
+
36
+ // TODO weird hacky fix
37
+ if (importPath.includes('index') && path.includes('index')) {
38
+ return undefined
39
+ }
40
+
41
+ return { path: importPath }
42
+ })
43
+ .filter(Boolean) as File['exports']
44
+
45
+ files.push({
46
+ path,
47
+ fileName: 'index.ts',
48
+ source: '',
49
+ exports,
50
+ })
51
+ } else {
52
+ item.children?.forEach((child) => {
53
+ const path = pathParser.resolve(item.data.path, 'index.ts')
54
+ const importPath = child.data.type === 'directory' ? `./${child.data.name}` : `./${child.data.name.replace(/\.[^.]*$/, '')}`
55
+
56
+ files.push({
57
+ path,
58
+ fileName: 'index.ts',
59
+ source: '',
60
+ exports: [{ path: importPath }],
61
+ })
62
+ })
63
+ }
64
+
65
+ item.children.forEach((childItem) => {
66
+ fileReducer(files, childItem)
67
+ })
68
+
69
+ return files
70
+ }
71
+
72
+ const files = fileReducer([], tree)
73
+
74
+ return files
75
+ }
76
+
5
77
  export function combineFiles(files: Array<File | null>) {
6
78
  return files.filter(Boolean).reduce((acc, curr: File | null) => {
7
79
  if (!curr) {
@@ -15,6 +87,7 @@ export function combineFiles(files: Array<File | null>) {
15
87
  ...curr,
16
88
  source: `${prev.source}\n${curr.source}`,
17
89
  imports: [...(prev.imports || []), ...(curr.imports || [])],
90
+ exports: [...(prev.exports || []), ...(curr.exports || [])],
18
91
  }
19
92
  } else {
20
93
  acc.push(curr)
@@ -25,11 +98,14 @@ export function combineFiles(files: Array<File | null>) {
25
98
  }
26
99
 
27
100
  export function getFileSource(file: File) {
101
+ let { source } = file
102
+
28
103
  // TODO make generic check
29
104
  if (!file.fileName.endsWith('.ts')) {
30
105
  return file.source
31
106
  }
32
107
  const imports: File['imports'] = []
108
+ const exports: File['exports'] = []
33
109
 
34
110
  file.imports?.forEach((curr) => {
35
111
  const exists = imports.find((imp) => imp.path === curr.path)
@@ -51,17 +127,43 @@ export function getFileSource(file: File) {
51
127
  }
52
128
  })
53
129
 
54
- const importSource = imports.reduce((prev, curr) => {
55
- if (Array.isArray(curr.name)) {
56
- return `${prev}\nimport ${curr.isTypeOnly ? 'type ' : ''}{ ${curr.name.join(', ')} } from "${curr.path}";`
130
+ file.exports?.forEach((curr) => {
131
+ const exists = exports.find((imp) => imp.path === curr.path)
132
+ if (!exists) {
133
+ exports.push({
134
+ ...curr,
135
+ name: Array.isArray(curr.name) ? uniq(curr.name) : curr.name,
136
+ })
137
+ }
138
+
139
+ if (exists && !Array.isArray(exists.name) && exists.name !== curr.name && exists.asAlias === curr.asAlias) {
140
+ exports.push(curr)
57
141
  }
58
142
 
59
- return `${prev}\nimport ${curr.isTypeOnly ? 'type ' : ''}${curr.name} from "${curr.path}";`
60
- }, '')
143
+ if (exists && Array.isArray(exists.name)) {
144
+ if (Array.isArray(curr.name)) {
145
+ exists.name = uniq([...exists.name, ...curr.name])
146
+ }
147
+ }
148
+ })
149
+
150
+ const importNodes = imports.reduce((prev, curr) => {
151
+ return [...prev, createImportDeclaration({ name: curr.name, path: curr.path, isTypeOnly: curr.isTypeOnly })]
152
+ }, [] as ts.ImportDeclaration[])
153
+ const importSource = print(importNodes)
154
+
155
+ const exportNodes = exports.reduce((prev, curr) => {
156
+ return [...prev, createExportDeclaration({ name: curr.name, path: curr.path, asAlias: curr.asAlias })]
157
+ }, [] as ts.ExportDeclaration[])
158
+ const exportSource = print(exportNodes)
61
159
 
62
160
  if (importSource) {
63
- return `${importSource}\n${file.source}`
161
+ source = `${importSource}\n${source}`
162
+ }
163
+
164
+ if (exportSource) {
165
+ source = `${exportSource}\n${source}`
64
166
  }
65
167
 
66
- return file.source
168
+ return source
67
169
  }
@@ -3,9 +3,9 @@
3
3
 
4
4
  import { definePlugin } from '../../plugin'
5
5
  import { FileManager } from '../fileManager'
6
- import { Queue } from '../../utils/queue'
6
+ import { Queue } from '../../utils/Queue'
7
7
 
8
- import type { QueueTask } from '../../utils/queue'
8
+ import type { QueueTask } from '../../utils/Queue'
9
9
  import type { Argument0, Strategy } from './types'
10
10
  import type { KubbConfig, KubbPlugin, PluginLifecycleHooks, PluginLifecycle, MaybePromise, ResolvePathParams, ResolveNameParams } from '../../types'
11
11
  import type { Logger } from '../../build'
@@ -125,7 +125,7 @@ export class PluginManager {
125
125
  pluginName: string
126
126
  hookName: H
127
127
  parameters: Parameters<PluginLifecycle[H]>
128
- }): ReturnType<PluginLifecycle[H]> | null {
128
+ }): ReturnType<PluginLifecycle[H]> {
129
129
  const plugin = this.getPlugin(hookName, pluginName)
130
130
 
131
131
  return this.runSync({
@@ -148,8 +148,8 @@ export class PluginManager {
148
148
  hookName: H
149
149
  parameters: Parameters<PluginLifecycle[H]>
150
150
  skipped?: ReadonlySet<KubbPlugin> | null
151
- }): Promise<ReturnType<PluginLifecycle[H]> | null> {
152
- let promise: Promise<ReturnType<PluginLifecycle[H]> | null> = Promise.resolve(null)
151
+ }): Promise<ReturnType<PluginLifecycle[H]>> {
152
+ let promise: Promise<ReturnType<PluginLifecycle[H]>> = Promise.resolve(null as ReturnType<PluginLifecycle[H]>)
153
153
  for (const plugin of this.getSortedPlugins(hookName)) {
154
154
  if (skipped && skipped.has(plugin)) continue
155
155
  promise = promise.then((result) => {
@@ -177,13 +177,13 @@ export class PluginManager {
177
177
  hookName: H
178
178
  parameters: Parameters<PluginLifecycle[H]>
179
179
  skipped?: ReadonlySet<KubbPlugin> | null
180
- }): ReturnType<PluginLifecycle[H]> | null {
180
+ }): ReturnType<PluginLifecycle[H]> {
181
181
  let result = null
182
182
 
183
183
  for (const plugin of this.getSortedPlugins(hookName)) {
184
184
  if (skipped && skipped.has(plugin)) continue
185
185
 
186
- result = this.runSync({
186
+ result = this.runSync<H>({
187
187
  strategy: 'hookFirst',
188
188
  hookName,
189
189
  parameters,
@@ -194,7 +194,7 @@ export class PluginManager {
194
194
  break
195
195
  }
196
196
  }
197
- return result
197
+ return result as ReturnType<PluginLifecycle[H]>
198
198
  }
199
199
 
200
200
  // parallel
@@ -204,7 +204,7 @@ export class PluginManager {
204
204
  }: {
205
205
  hookName: H
206
206
  parameters?: Parameters<PluginLifecycle[H]> | undefined
207
- }) {
207
+ }): Promise<Awaited<TOuput>[]> {
208
208
  const parallelPromises: Promise<TOuput>[] = []
209
209
 
210
210
  for (const plugin of this.getSortedPlugins(hookName)) {