@kubb/fabric-core 0.1.1 → 0.1.3

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.
Files changed (90) hide show
  1. package/dist/App-DUFbq4lD.d.ts +292 -0
  2. package/dist/App-DoQNlnGL.d.cts +292 -0
  3. package/dist/chunk-CUT6urMc.cjs +30 -0
  4. package/dist/defineApp-C6WnoREI.d.ts +14 -0
  5. package/dist/defineApp-D1-njmtr.d.cts +14 -0
  6. package/dist/index.cjs +159 -88
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.cts +4 -8
  9. package/dist/index.d.ts +4 -8
  10. package/dist/index.js +148 -77
  11. package/dist/index.js.map +1 -1
  12. package/dist/parsers/typescript.cjs +5 -6
  13. package/dist/parsers/typescript.d.cts +3 -51
  14. package/dist/parsers/typescript.d.ts +3 -51
  15. package/dist/parsers/typescript.js +2 -3
  16. package/dist/parsers.cjs +7 -0
  17. package/dist/parsers.d.cts +14 -0
  18. package/dist/parsers.d.ts +14 -0
  19. package/dist/parsers.js +4 -0
  20. package/dist/plugins.cjs +76 -0
  21. package/dist/plugins.cjs.map +1 -0
  22. package/dist/plugins.d.cts +28 -0
  23. package/dist/plugins.d.ts +28 -0
  24. package/dist/plugins.js +71 -0
  25. package/dist/plugins.js.map +1 -0
  26. package/dist/tsxParser-C741ZKCN.js +26 -0
  27. package/dist/tsxParser-C741ZKCN.js.map +1 -0
  28. package/dist/tsxParser-HDf_3TMc.cjs +37 -0
  29. package/dist/tsxParser-HDf_3TMc.cjs.map +1 -0
  30. package/dist/types.d.cts +2 -2
  31. package/dist/types.d.ts +2 -2
  32. package/dist/{typescript-C60gWBu8.js → typescriptParser-BBGeFKlP.js} +52 -69
  33. package/dist/typescriptParser-BBGeFKlP.js.map +1 -0
  34. package/dist/{typescript-Z90jN87k.cjs → typescriptParser-BBbbmG5W.cjs} +61 -108
  35. package/dist/typescriptParser-BBbbmG5W.cjs.map +1 -0
  36. package/dist/typescriptParser-C9WJrwRd.d.ts +50 -0
  37. package/dist/typescriptParser-DOD1_QTe.d.cts +50 -0
  38. package/package.json +13 -13
  39. package/src/App.ts +91 -0
  40. package/src/FileManager.ts +12 -12
  41. package/src/FileProcessor.ts +48 -49
  42. package/src/createFile.ts +1 -1
  43. package/src/defineApp.ts +47 -72
  44. package/src/index.ts +1 -1
  45. package/src/parsers/createParser.ts +8 -0
  46. package/src/parsers/defaultParser.ts +10 -0
  47. package/src/parsers/index.ts +5 -0
  48. package/src/parsers/tsxParser.ts +11 -0
  49. package/src/parsers/types.ts +12 -2
  50. package/src/parsers/{typescript.ts → typescriptParser.ts} +8 -4
  51. package/src/plugins/createPlugin.ts +10 -0
  52. package/src/plugins/fsPlugin.ts +112 -0
  53. package/src/plugins/index.ts +3 -0
  54. package/src/plugins/types.ts +15 -0
  55. package/src/types.ts +4 -1
  56. package/src/utils/AsyncEventEmitter.ts +37 -0
  57. package/src/utils/getRelativePath.ts +32 -0
  58. package/src/utils/trimExtName.ts +3 -0
  59. package/dist/KubbFile-BrN7Wwp6.d.cts +0 -119
  60. package/dist/KubbFile-BzVkcu9M.d.ts +0 -119
  61. package/dist/createFileParser-BD8yn0LT.cjs +0 -14
  62. package/dist/createFileParser-BD8yn0LT.cjs.map +0 -1
  63. package/dist/createFileParser-Cix3AMLd.js +0 -8
  64. package/dist/createFileParser-Cix3AMLd.js.map +0 -1
  65. package/dist/default-DCpuPmrL.js +0 -10
  66. package/dist/default-DCpuPmrL.js.map +0 -1
  67. package/dist/default-DNBu_jsL.cjs +0 -15
  68. package/dist/default-DNBu_jsL.cjs.map +0 -1
  69. package/dist/defineApp-CZYKsxTp.d.ts +0 -95
  70. package/dist/defineApp-c9lWJ96_.d.cts +0 -95
  71. package/dist/parsers/default.cjs +0 -4
  72. package/dist/parsers/default.d.cts +0 -8
  73. package/dist/parsers/default.d.ts +0 -8
  74. package/dist/parsers/default.js +0 -4
  75. package/dist/parsers/tsx.cjs +0 -5
  76. package/dist/parsers/tsx.d.cts +0 -8
  77. package/dist/parsers/tsx.d.ts +0 -8
  78. package/dist/parsers/tsx.js +0 -5
  79. package/dist/tsx-BSUaIML3.cjs +0 -16
  80. package/dist/tsx-BSUaIML3.cjs.map +0 -1
  81. package/dist/tsx-DBAk9dqS.js +0 -11
  82. package/dist/tsx-DBAk9dqS.js.map +0 -1
  83. package/dist/types-CkbelZaS.d.ts +0 -15
  84. package/dist/types-GueHciQ3.d.cts +0 -15
  85. package/dist/typescript-C60gWBu8.js.map +0 -1
  86. package/dist/typescript-Z90jN87k.cjs.map +0 -1
  87. package/src/fs.ts +0 -167
  88. package/src/parsers/createFileParser.ts +0 -5
  89. package/src/parsers/default.ts +0 -7
  90. package/src/parsers/tsx.ts +0 -8
package/dist/index.js CHANGED
@@ -1,13 +1,11 @@
1
- import { a as trimExtName, i as typeScriptParser, o as write } from "./typescript-C60gWBu8.js";
2
- import { t as createFileParser } from "./createFileParser-Cix3AMLd.js";
3
- import { t as tsxParser } from "./tsx-DBAk9dqS.js";
4
- import { t as defaultParser } from "./default-DCpuPmrL.js";
5
- import path from "node:path";
1
+ import { i as typescriptParser, o as trimExtName } from "./typescriptParser-BBGeFKlP.js";
2
+ import { n as defaultParser, t as tsxParser } from "./tsxParser-C741ZKCN.js";
6
3
  import { orderBy } from "natural-orderby";
7
4
  import { createHash } from "node:crypto";
8
- import { isDeepEqual, isPromise, uniqueBy } from "remeda";
9
- import { EventEmitter } from "node:events";
5
+ import path from "node:path";
6
+ import { isDeepEqual, isFunction, isPromise, uniqueBy } from "remeda";
10
7
  import pLimit from "p-limit";
8
+ import { EventEmitter } from "node:events";
11
9
 
12
10
  //#region \0@oxc-project+runtime@0.95.0/helpers/checkPrivateRedeclaration.js
13
11
  function _checkPrivateRedeclaration(e, t) {
@@ -156,15 +154,23 @@ function createFile(file) {
156
154
  }
157
155
 
158
156
  //#endregion
159
- //#region src/utils/EventEmitter.ts
157
+ //#region src/utils/AsyncEventEmitter.ts
160
158
  var _emitter = /* @__PURE__ */ new WeakMap();
161
- var EventEmitter$1 = class {
159
+ var AsyncEventEmitter = class {
162
160
  constructor(maxListener = 100) {
163
161
  _classPrivateFieldInitSpec(this, _emitter, new EventEmitter());
164
162
  _classPrivateFieldGet2(_emitter, this).setMaxListeners(maxListener);
165
163
  }
166
- emit(eventName, ...eventArg) {
167
- _classPrivateFieldGet2(_emitter, this).emit(eventName, ...eventArg);
164
+ async emit(eventName, ...eventArgs) {
165
+ const listeners = _classPrivateFieldGet2(_emitter, this).listeners(eventName);
166
+ if (listeners.length === 0) return;
167
+ await Promise.all(listeners.map(async (listener) => {
168
+ try {
169
+ return await listener(...eventArgs);
170
+ } catch (err) {
171
+ console.error(`Error in async listener for "${eventName}":`, err);
172
+ }
173
+ }));
168
174
  }
169
175
  on(eventName, handler) {
170
176
  _classPrivateFieldGet2(_emitter, this).on(eventName, handler);
@@ -178,46 +184,118 @@ var EventEmitter$1 = class {
178
184
  };
179
185
 
180
186
  //#endregion
181
- //#region src/FileProcessor.ts
182
- async function getParser(extname) {
183
- const parsers = {
184
- ".ts": typeScriptParser,
185
- ".js": typeScriptParser,
186
- ".jsx": tsxParser,
187
- ".tsx": tsxParser,
188
- ".json": defaultParser
189
- };
190
- if (!extname) return defaultParser;
191
- const parser = parsers[extname];
192
- if (!parser) console.warn(`[parser] No parser found for ${extname}, default parser will be used`);
193
- return parser || defaultParser;
187
+ //#region \0@oxc-project+runtime@0.95.0/helpers/classPrivateMethodInitSpec.js
188
+ function _classPrivateMethodInitSpec(e, a) {
189
+ _checkPrivateRedeclaration(e, a), a.add(e);
194
190
  }
195
- async function parseFile(file, { extname } = {}) {
196
- return (await getParser(file.extname)).print(file, { extname });
191
+
192
+ //#endregion
193
+ //#region \0@oxc-project+runtime@0.95.0/helpers/typeof.js
194
+ function _typeof(o) {
195
+ "@babel/helpers - typeof";
196
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o$1) {
197
+ return typeof o$1;
198
+ } : function(o$1) {
199
+ return o$1 && "function" == typeof Symbol && o$1.constructor === Symbol && o$1 !== Symbol.prototype ? "symbol" : typeof o$1;
200
+ }, _typeof(o);
197
201
  }
202
+
203
+ //#endregion
204
+ //#region \0@oxc-project+runtime@0.95.0/helpers/toPrimitive.js
205
+ function toPrimitive(t, r) {
206
+ if ("object" != _typeof(t) || !t) return t;
207
+ var e = t[Symbol.toPrimitive];
208
+ if (void 0 !== e) {
209
+ var i = e.call(t, r || "default");
210
+ if ("object" != _typeof(i)) return i;
211
+ throw new TypeError("@@toPrimitive must return a primitive value.");
212
+ }
213
+ return ("string" === r ? String : Number)(t);
214
+ }
215
+
216
+ //#endregion
217
+ //#region \0@oxc-project+runtime@0.95.0/helpers/toPropertyKey.js
218
+ function toPropertyKey(t) {
219
+ var i = toPrimitive(t, "string");
220
+ return "symbol" == _typeof(i) ? i : i + "";
221
+ }
222
+
223
+ //#endregion
224
+ //#region \0@oxc-project+runtime@0.95.0/helpers/defineProperty.js
225
+ function _defineProperty(e, r, t) {
226
+ return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
227
+ value: t,
228
+ enumerable: !0,
229
+ configurable: !0,
230
+ writable: !0
231
+ }) : e[r] = t, e;
232
+ }
233
+
234
+ //#endregion
235
+ //#region src/FileProcessor.ts
198
236
  var _limit = /* @__PURE__ */ new WeakMap();
199
- var FileProcessor = class extends EventEmitter$1 {
200
- constructor(maxListener = 1e3) {
201
- super(maxListener);
237
+ var _FileProcessor_brand = /* @__PURE__ */ new WeakSet();
238
+ var FileProcessor = class {
239
+ constructor({ events = new AsyncEventEmitter() } = {}) {
240
+ _classPrivateMethodInitSpec(this, _FileProcessor_brand);
202
241
  _classPrivateFieldInitSpec(this, _limit, pLimit(100));
242
+ _defineProperty(this, "events", void 0);
243
+ this.events = events;
203
244
  return this;
204
245
  }
205
- async run(files, { dryRun, extension }) {
206
- this.emit("start", { files });
207
- const promises = files.map((resolvedFile) => _classPrivateFieldGet2(_limit, this).call(this, async () => {
208
- const extname = (extension === null || extension === void 0 ? void 0 : extension[resolvedFile.extname]) || void 0;
209
- this.emit("file:start", { file: resolvedFile });
246
+ async parse(file, { parsers = _get_defaultParser.call(_assertClassBrand(_FileProcessor_brand, this)), extension } = {}) {
247
+ const extname = path.extname(file.path);
248
+ const parseExtName = (extension === null || extension === void 0 ? void 0 : extension[file.extname]) || void 0;
249
+ if (!extname) return defaultParser.parse(file, { extname: parseExtName });
250
+ const parser = [...parsers].find((item) => {
251
+ var _item$extNames;
252
+ return (_item$extNames = item.extNames) === null || _item$extNames === void 0 ? void 0 : _item$extNames.includes(extname);
253
+ });
254
+ if (!parser) return defaultParser.parse(file, { extname: parseExtName });
255
+ return parser.parse(file, { extname: parseExtName });
256
+ }
257
+ async run(files, { parsers, dryRun, extension } = {}) {
258
+ await this.events.emit("process:start", { files });
259
+ let processed = 0;
260
+ const total = files.length;
261
+ const promises = files.map((resolvedFile, index) => _classPrivateFieldGet2(_limit, this).call(this, async () => {
262
+ await this.events.emit("file:start", {
263
+ file: resolvedFile,
264
+ index,
265
+ total
266
+ });
210
267
  if (!dryRun) {
211
- const source = await parseFile(resolvedFile, { extname });
212
- await write(resolvedFile.path, source, { sanity: false });
268
+ const source = await this.parse(resolvedFile, {
269
+ extension,
270
+ parsers
271
+ });
272
+ await this.events.emit("process:progress", {
273
+ file: resolvedFile,
274
+ source,
275
+ processed,
276
+ percentage: processed / total * 100,
277
+ total
278
+ });
213
279
  }
214
- this.emit("file:finish", { file: resolvedFile });
280
+ await this.events.emit("file:end", {
281
+ file: resolvedFile,
282
+ index,
283
+ total
284
+ });
285
+ processed++;
215
286
  }));
216
287
  await Promise.all(promises);
217
- this.emit("finish", { files });
288
+ await this.events.emit("process:end", { files });
218
289
  return files;
219
290
  }
220
291
  };
292
+ function _get_defaultParser() {
293
+ return new Set([
294
+ typescriptParser,
295
+ tsxParser,
296
+ defaultParser
297
+ ]);
298
+ }
221
299
 
222
300
  //#endregion
223
301
  //#region src/FileManager.ts
@@ -230,11 +308,11 @@ function mergeFile(a, b) {
230
308
  };
231
309
  }
232
310
  var _cache = /* @__PURE__ */ new WeakMap();
233
- var _processor = /* @__PURE__ */ new WeakMap();
234
311
  var FileManager = class {
235
- constructor() {
312
+ constructor({ events = new AsyncEventEmitter() } = {}) {
236
313
  _classPrivateFieldInitSpec(this, _cache, new Cache());
237
- _classPrivateFieldInitSpec(this, _processor, new FileProcessor());
314
+ _defineProperty(this, "processor", void 0);
315
+ this.processor = new FileProcessor({ events });
238
316
  return this;
239
317
  }
240
318
  async add(...files) {
@@ -269,34 +347,25 @@ var FileManager = class {
269
347
  get files() {
270
348
  return orderBy(_classPrivateFieldGet2(_cache, this).keys(), [(v) => v.length, (v) => trimExtName(v).endsWith("index")]).map((key) => _classPrivateFieldGet2(_cache, this).get(key)).filter(Boolean);
271
349
  }
272
- get processor() {
273
- const files = this.files;
274
- const processor = _classPrivateFieldGet2(_processor, this);
275
- return { async run(options) {
276
- return processor.run(files, options);
277
- } };
350
+ async write(options) {
351
+ return this.processor.run(this.files, options);
278
352
  }
279
353
  };
280
354
 
281
355
  //#endregion
282
356
  //#region src/defineApp.ts
283
- const isFunction = (val) => typeof val === "function";
284
357
  function defineApp(instance) {
285
358
  function createApp$1(rootComponent, options) {
286
- const installedPlugins = /* @__PURE__ */ new WeakSet();
287
- const fileManager = new FileManager();
359
+ const events = new AsyncEventEmitter();
360
+ const installedPlugins = /* @__PURE__ */ new Set();
361
+ const installedParsers = /* @__PURE__ */ new Set();
362
+ const fileManager = new FileManager({ events });
288
363
  const context = {
364
+ events,
289
365
  options,
290
366
  fileManager,
291
- async addFile(...newFiles) {
292
- await fileManager.add(...newFiles);
293
- },
294
- clear() {
295
- context.fileManager.clear();
296
- },
297
- get files() {
298
- return fileManager.files;
299
- }
367
+ installedPlugins,
368
+ installedParsers
300
369
  };
301
370
  const { render, renderToString, waitUntilExit } = instance.call(context, rootComponent, context);
302
371
  const app = {
@@ -312,28 +381,30 @@ function defineApp(instance) {
312
381
  return fileManager.files;
313
382
  },
314
383
  waitUntilExit,
315
- addFile: context.addFile,
316
- async write(options$1 = {
317
- extension: { ".ts": ".ts" },
318
- dryRun: false
319
- }) {
320
- await fileManager.processor.run({
321
- extension: options$1.extension,
322
- dryRun: options$1.dryRun
323
- });
384
+ async addFile(...newFiles) {
385
+ await fileManager.add(...newFiles);
324
386
  },
325
- use(plugin, ...options$1) {
326
- if (installedPlugins.has(plugin)) console.warn("Plugin has already been applied to target app.");
327
- else if (plugin && isFunction(plugin.install)) {
328
- installedPlugins.add(plugin);
329
- plugin.install(app, ...options$1);
330
- } else if (isFunction(plugin)) {
331
- installedPlugins.add(plugin);
332
- plugin(app, ...options$1);
387
+ use(pluginOrParser, ...options$1) {
388
+ const args = Array.isArray(options$1) ? options$1 : [options$1[0]];
389
+ if (pluginOrParser.type === "plugin") {
390
+ if (installedPlugins.has(pluginOrParser)) console.warn("Plugin has already been applied to target app.");
391
+ else installedPlugins.add(pluginOrParser);
392
+ if (pluginOrParser.override && isFunction(pluginOrParser.override)) {
393
+ const overrider = pluginOrParser.override;
394
+ const extraApp = overrider(app, context, ...args);
395
+ Object.assign(app, extraApp);
396
+ }
397
+ }
398
+ if (pluginOrParser.type === "parser") if (installedParsers.has(pluginOrParser)) console.warn("Parser has already been applied to target app.");
399
+ else installedParsers.add(pluginOrParser);
400
+ if (pluginOrParser && isFunction(pluginOrParser.install)) {
401
+ const installer = pluginOrParser.install;
402
+ installer(app, context, ...args);
333
403
  }
334
404
  return app;
335
405
  }
336
406
  };
407
+ events.emit("start", { app });
337
408
  return app;
338
409
  }
339
410
  return createApp$1;
@@ -356,5 +427,5 @@ const createApp = defineApp(() => {
356
427
  });
357
428
 
358
429
  //#endregion
359
- export { FileManager, FileProcessor, createApp, createFile, createFileParser, defineApp };
430
+ export { FileManager, FileProcessor, createApp, createFile, defineApp };
360
431
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["name","EventEmitter","NodeEventEmitter","parsers: Record<KubbFile.Extname, Parser<any>>","EventEmitter","resolvedFiles: Array<KubbFile.ResolvedFile>","path","createApp","app: App","options"],"sources":["../src/utils/Cache.ts","../src/createFile.ts","../src/utils/EventEmitter.ts","../src/FileProcessor.ts","../src/FileManager.ts","../src/defineApp.ts","../src/createApp.ts"],"sourcesContent":["export class Cache<T> {\n #buffer = new Map<string, T>()\n\n get(key: string): T | null {\n return this.#buffer.get(key) ?? null\n }\n\n set(key: string, value: T): void {\n this.#buffer.set(key, value)\n }\n\n delete(key: string): void {\n this.#buffer.delete(key)\n }\n\n clear(): void {\n this.#buffer.clear()\n }\n\n keys(): string[] {\n return [...this.#buffer.keys()]\n }\n\n values(): Array<T> {\n return [...this.#buffer.values()]\n }\n\n flush(): void {\n // No-op for base cache\n }\n}\n","import type * as KubbFile from './KubbFile.ts'\nimport { trimExtName } from './fs.ts'\nimport { createHash } from 'node:crypto'\nimport path from 'node:path'\nimport { isDeepEqual, uniqueBy } from 'remeda'\nimport { orderBy } from 'natural-orderby'\n\nfunction hashObject(obj: Record<string, unknown>): string {\n const str = JSON.stringify(obj, Object.keys(obj).sort())\n return createHash('sha256').update(str).digest('hex')\n}\n\nexport function combineSources(sources: Array<KubbFile.Source>): Array<KubbFile.Source> {\n return uniqueBy(sources, (obj) => [obj.name, obj.isExportable, obj.isTypeOnly] as const)\n}\n\nexport function combineExports(exports: Array<KubbFile.Export>): Array<KubbFile.Export> {\n return orderBy(exports, [\n (v) => !!Array.isArray(v.name),\n (v) => !v.isTypeOnly,\n (v) => v.path,\n (v) => !!v.name,\n (v) => (Array.isArray(v.name) ? orderBy(v.name) : v.name),\n ]).reduce(\n (prev, curr) => {\n const name = curr.name\n const prevByPath = prev.findLast((imp) => imp.path === curr.path)\n const prevByPathAndIsTypeOnly = prev.findLast((imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly)\n\n if (prevByPathAndIsTypeOnly) {\n // we already have an export that has the same path but uses `isTypeOnly` (export type ...)\n return prev\n }\n\n const uniquePrev = prev.findLast(\n (imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly && imp.asAlias === curr.asAlias,\n )\n\n // we already have an item that was unique enough or name field is empty or prev asAlias is set but current has no changes\n if (uniquePrev || (Array.isArray(name) && !name.length) || (prevByPath?.asAlias && !curr.asAlias)) {\n return prev\n }\n\n if (!prevByPath) {\n return [\n ...prev,\n {\n ...curr,\n name: Array.isArray(name) ? [...new Set(name)] : name,\n },\n ]\n }\n\n // merge all names when prev and current both have the same isTypeOnly set\n if (prevByPath && Array.isArray(prevByPath.name) && Array.isArray(curr.name) && prevByPath.isTypeOnly === curr.isTypeOnly) {\n prevByPath.name = [...new Set([...prevByPath.name, ...curr.name])]\n\n return prev\n }\n\n return [...prev, curr]\n },\n [] as Array<KubbFile.Export>,\n )\n}\n\nexport function combineImports(imports: Array<KubbFile.Import>, exports: Array<KubbFile.Export>, source?: string): Array<KubbFile.Import> {\n return orderBy(imports, [\n (v) => !!Array.isArray(v.name),\n (v) => !v.isTypeOnly,\n (v) => v.path,\n (v) => !!v.name,\n (v) => (Array.isArray(v.name) ? orderBy(v.name) : v.name),\n ]).reduce(\n (prev, curr) => {\n let name = Array.isArray(curr.name) ? [...new Set(curr.name)] : curr.name\n\n const hasImportInSource = (importName: string) => {\n if (!source) {\n return true\n }\n\n const checker = (name?: string) => {\n return name && source.includes(name)\n }\n\n return checker(importName) || exports.some(({ name }) => (Array.isArray(name) ? name.some(checker) : checker(name)))\n }\n\n if (curr.path === curr.root) {\n // root and path are the same file, remove the \"./\" import\n return prev\n }\n\n // merge all names and check if the importName is being used in the generated source and if not filter those imports out\n if (Array.isArray(name)) {\n name = name.filter((item) => (typeof item === 'string' ? hasImportInSource(item) : hasImportInSource(item.propertyName)))\n }\n\n const prevByPath = prev.findLast((imp) => imp.path === curr.path && imp.isTypeOnly === curr.isTypeOnly)\n const uniquePrev = prev.findLast((imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly)\n const prevByPathNameAndIsTypeOnly = prev.findLast((imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly)\n\n if (prevByPathNameAndIsTypeOnly) {\n // we already have an export that has the same path but uses `isTypeOnly` (import type ...)\n return prev\n }\n\n // already unique enough or name is empty\n if (uniquePrev || (Array.isArray(name) && !name.length)) {\n return prev\n }\n\n // new item, append name\n if (!prevByPath) {\n return [\n ...prev,\n {\n ...curr,\n name,\n },\n ]\n }\n\n // merge all names when prev and current both have the same isTypeOnly set\n if (prevByPath && Array.isArray(prevByPath.name) && Array.isArray(name) && prevByPath.isTypeOnly === curr.isTypeOnly) {\n prevByPath.name = [...new Set([...prevByPath.name, ...name])]\n\n return prev\n }\n\n // no import was found in the source, ignore import\n if (!Array.isArray(name) && name && !hasImportInSource(name)) {\n return prev\n }\n\n return [...prev, curr]\n },\n [] as Array<KubbFile.Import>,\n )\n}\n\n/**\n * Helper to create a file with name and id set\n */\nexport function createFile<TMeta extends object = object>(file: KubbFile.File<TMeta>): KubbFile.ResolvedFile<TMeta> {\n const extname = path.extname(file.baseName) as KubbFile.Extname\n if (!extname) {\n throw new Error(`No extname found for ${file.baseName}`)\n }\n\n const source = file.sources.map((item) => item.value).join('\\n\\n')\n const exports = file.exports?.length ? combineExports(file.exports) : []\n const imports = file.imports?.length && source ? combineImports(file.imports, exports, source) : []\n const sources = file.sources?.length ? combineSources(file.sources) : []\n\n return {\n ...file,\n id: hashObject({ path: file.path }),\n name: trimExtName(file.baseName),\n extname,\n imports: imports,\n exports: exports,\n sources: sources,\n meta: file.meta || ({} as TMeta),\n }\n}\n","import { EventEmitter as NodeEventEmitter } from 'node:events'\n\nexport class EventEmitter<TEvents extends Record<string, any>> {\n constructor(maxListener = 100) {\n this.#emitter.setMaxListeners(maxListener)\n }\n #emitter = new NodeEventEmitter()\n\n emit<TEventName extends keyof TEvents & string>(eventName: TEventName, ...eventArg: TEvents[TEventName]): void {\n this.#emitter.emit(eventName, ...(eventArg as any))\n }\n\n on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void {\n this.#emitter.on(eventName, handler as any)\n }\n\n off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void {\n this.#emitter.off(eventName, handler as any)\n }\n removeAll(): void {\n this.#emitter.removeAllListeners()\n }\n}\n","import type * as KubbFile from './KubbFile.ts'\nimport { EventEmitter } from './utils/EventEmitter.ts'\nimport { write } from './fs.ts'\nimport pLimit from 'p-limit'\nimport type { Parser } from './parsers/types.ts'\nimport { typeScriptParser } from './parsers/typescript.ts'\nimport { tsxParser } from './parsers/tsx.ts'\nimport { defaultParser } from './parsers/default.ts'\n\ntype FileProcessorEvents = {\n start: [{ files: KubbFile.ResolvedFile[] }]\n finish: [{ files: KubbFile.ResolvedFile[] }]\n 'file:start': [{ file: KubbFile.ResolvedFile }]\n 'file:finish': [{ file: KubbFile.ResolvedFile }]\n}\n\nexport type ProcessFilesProps = {\n extension?: Record<KubbFile.Extname, KubbFile.Extname | ''>\n dryRun?: boolean\n}\n\ntype GetSourceOptions = {\n extname?: KubbFile.Extname\n}\n\nasync function getParser<TMeta extends object = object>(extname: KubbFile.Extname | undefined): Promise<Parser<TMeta>> {\n const parsers: Record<KubbFile.Extname, Parser<any>> = {\n '.ts': typeScriptParser,\n '.js': typeScriptParser,\n '.jsx': tsxParser,\n '.tsx': tsxParser,\n '.json': defaultParser,\n }\n\n if (!extname) {\n return defaultParser\n }\n\n const parser = parsers[extname]\n\n if (!parser) {\n console.warn(`[parser] No parser found for ${extname}, default parser will be used`)\n }\n\n return parser || defaultParser\n}\n\nexport async function parseFile(file: KubbFile.ResolvedFile, { extname }: GetSourceOptions = {}): Promise<string> {\n const parser = await getParser(file.extname)\n\n return parser.print(file, { extname })\n}\n\nexport class FileProcessor extends EventEmitter<FileProcessorEvents> {\n #limit = pLimit(100)\n\n constructor(maxListener = 1000) {\n super(maxListener)\n return this\n }\n\n async run(files: Array<KubbFile.ResolvedFile>, { dryRun, extension }: ProcessFilesProps): Promise<KubbFile.ResolvedFile[]> {\n this.emit('start', { files })\n\n const promises = files.map((resolvedFile) =>\n this.#limit(async () => {\n const extname = extension?.[resolvedFile.extname] || undefined\n\n this.emit('file:start', { file: resolvedFile })\n\n if (!dryRun) {\n const source = await parseFile(resolvedFile, { extname })\n await write(resolvedFile.path, source, { sanity: false })\n }\n\n this.emit('file:finish', { file: resolvedFile })\n }),\n )\n\n await Promise.all(promises)\n\n this.emit('finish', { files })\n\n return files\n }\n}\n","import type * as KubbFile from './KubbFile.ts'\nimport { Cache } from './utils/Cache.ts'\nimport { trimExtName } from './fs.ts'\nimport { orderBy } from 'natural-orderby'\nimport { createFile } from './createFile.ts'\nimport { FileProcessor, type ProcessFilesProps } from './FileProcessor.ts'\n\nfunction mergeFile<TMeta extends object = object>(a: KubbFile.File<TMeta>, b: KubbFile.File<TMeta>): KubbFile.File<TMeta> {\n return {\n ...a,\n sources: [...(a.sources || []), ...(b.sources || [])],\n imports: [...(a.imports || []), ...(b.imports || [])],\n exports: [...(a.exports || []), ...(b.exports || [])],\n }\n}\n\nexport class FileManager {\n #cache = new Cache<KubbFile.ResolvedFile>()\n #processor = new FileProcessor()\n\n constructor() {\n return this\n }\n\n async add(...files: Array<KubbFile.File>) {\n const resolvedFiles: Array<KubbFile.ResolvedFile> = []\n\n const mergedFiles = new Map<string, KubbFile.File>()\n\n files.forEach((file) => {\n const existing = mergedFiles.get(file.path)\n if (existing) {\n mergedFiles.set(file.path, mergeFile(existing, file))\n } else {\n mergedFiles.set(file.path, file)\n }\n })\n\n for (const file of mergedFiles.values()) {\n const existing = this.#cache.get(file.path)\n\n const merged = existing ? mergeFile(existing, file) : file\n const resolvedFile = createFile(merged)\n\n this.#cache.set(resolvedFile.path, resolvedFile)\n this.flush()\n\n resolvedFiles.push(resolvedFile)\n }\n\n return resolvedFiles\n }\n\n flush() {\n this.#cache.flush()\n }\n\n getByPath(path: KubbFile.Path): KubbFile.ResolvedFile | null {\n return this.#cache.get(path)\n }\n\n deleteByPath(path: KubbFile.Path): void {\n this.#cache.delete(path)\n }\n\n clear(): void {\n this.#cache.clear()\n }\n\n get files(): Array<KubbFile.ResolvedFile> {\n const cachedKeys = this.#cache.keys()\n\n // order by path length and if file is a barrel file\n const keys = orderBy(cachedKeys, [(v) => v.length, (v) => trimExtName(v).endsWith('index')])\n\n const files = keys.map((key) => this.#cache.get(key))\n\n return files.filter(Boolean)\n }\n\n get processor() {\n const files = this.files\n const processor = this.#processor\n\n return {\n async run(options: ProcessFilesProps) {\n return processor.run(files, options)\n },\n }\n }\n}\n","import type * as KubbFile from './KubbFile.ts'\nimport { FileManager } from './FileManager.ts'\nimport { isPromise } from 'remeda'\n\nconst isFunction = (val: unknown): val is Function => typeof val === 'function'\n\ntype Component = any\n\ntype PluginInstallFunction<Options = any[]> = Options extends unknown[] ? (app: App, ...options: Options) => any : (app: App, options: Options) => any\n\nexport type ObjectPlugin<Options = any[]> = {\n install: PluginInstallFunction<Options>\n}\nexport type FunctionPlugin<Options = any[]> = PluginInstallFunction<Options> & Partial<ObjectPlugin<Options>>\n\ntype AppRenderer = {\n render(): Promise<void> | void\n renderToString(): Promise<string> | string\n waitUntilExit(): Promise<void>\n}\n\nexport type AppContext<TOptions = unknown> = {\n options?: TOptions\n fileManager: FileManager\n addFile(...files: Array<KubbFile.File>): Promise<void>\n files: Array<KubbFile.ResolvedFile>\n clear: () => void\n}\n\ntype RootRenderFunction<THostElement, TContext extends AppContext> = (this: TContext, container: THostElement, context: TContext) => AppRenderer\n\ntype Plugin<Options = any[], P extends unknown[] = Options extends unknown[] ? Options : [Options]> = FunctionPlugin<P> | ObjectPlugin<P>\n\ntype WriteOptions = {\n extension?: Record<KubbFile.Extname, KubbFile.Extname | ''>\n dryRun?: boolean\n}\n\nexport interface App {\n _component: Component\n render(): Promise<void>\n renderToString(): Promise<string>\n files: Array<KubbFile.ResolvedFile>\n use<Options>(plugin: Plugin<Options>, options: NoInfer<Options>): this\n write(options?: WriteOptions): Promise<void>\n addFile(...files: Array<KubbFile.File>): Promise<void>\n waitUntilExit(): Promise<void>\n}\n\nexport type DefineApp<TContext extends AppContext> = (rootComponent?: Component, options?: TContext['options']) => App\n\nexport function defineApp<THostElement, TContext extends AppContext>(instance: RootRenderFunction<THostElement, TContext>): DefineApp<TContext> {\n function createApp(rootComponent: Component, options?: TContext['options']): App {\n const installedPlugins = new WeakSet()\n const fileManager = new FileManager()\n const context = {\n options,\n fileManager,\n async addFile(...newFiles) {\n await fileManager.add(...newFiles)\n },\n clear() {\n context.fileManager.clear()\n },\n get files() {\n return fileManager.files\n },\n } as TContext\n\n const { render, renderToString, waitUntilExit } = instance.call(context, rootComponent, context)\n\n const app: App = {\n _component: rootComponent,\n async render() {\n if (isPromise(render)) {\n await render()\n } else {\n render()\n }\n },\n async renderToString() {\n return renderToString()\n },\n get files() {\n return fileManager.files\n },\n waitUntilExit,\n addFile: context.addFile,\n async write(\n options = {\n extension: { '.ts': '.ts' },\n dryRun: false,\n },\n ) {\n await fileManager.processor.run({\n extension: options.extension,\n dryRun: options.dryRun,\n })\n },\n use(plugin: Plugin, ...options: any[]) {\n if (installedPlugins.has(plugin)) {\n console.warn('Plugin has already been applied to target app.')\n } else if (plugin && isFunction(plugin.install)) {\n installedPlugins.add(plugin)\n plugin.install(app, ...options)\n } else if (isFunction(plugin)) {\n installedPlugins.add(plugin)\n plugin(app, ...options)\n }\n\n return app\n },\n }\n\n return app\n }\n\n return createApp\n}\n","import { defineApp } from './defineApp.ts'\n\nexport const createApp = defineApp(() => {\n return {\n async render() {\n throw new Error('Method not implemented')\n },\n async renderToString() {\n throw new Error('Method not implemented')\n },\n async waitUntilExit() {\n throw new Error('Method not implemented')\n },\n }\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["name","NodeEventEmitter","resolvedFiles: Array<KubbFile.ResolvedFile>","path","createApp","options"],"sources":["../src/utils/Cache.ts","../src/createFile.ts","../src/utils/AsyncEventEmitter.ts","../src/FileProcessor.ts","../src/FileManager.ts","../src/defineApp.ts","../src/createApp.ts"],"sourcesContent":["export class Cache<T> {\n #buffer = new Map<string, T>()\n\n get(key: string): T | null {\n return this.#buffer.get(key) ?? null\n }\n\n set(key: string, value: T): void {\n this.#buffer.set(key, value)\n }\n\n delete(key: string): void {\n this.#buffer.delete(key)\n }\n\n clear(): void {\n this.#buffer.clear()\n }\n\n keys(): string[] {\n return [...this.#buffer.keys()]\n }\n\n values(): Array<T> {\n return [...this.#buffer.values()]\n }\n\n flush(): void {\n // No-op for base cache\n }\n}\n","import type * as KubbFile from './KubbFile.ts'\nimport { trimExtName } from './utils/trimExtName.ts'\nimport { createHash } from 'node:crypto'\nimport path from 'node:path'\nimport { isDeepEqual, uniqueBy } from 'remeda'\nimport { orderBy } from 'natural-orderby'\n\nfunction hashObject(obj: Record<string, unknown>): string {\n const str = JSON.stringify(obj, Object.keys(obj).sort())\n return createHash('sha256').update(str).digest('hex')\n}\n\nexport function combineSources(sources: Array<KubbFile.Source>): Array<KubbFile.Source> {\n return uniqueBy(sources, (obj) => [obj.name, obj.isExportable, obj.isTypeOnly] as const)\n}\n\nexport function combineExports(exports: Array<KubbFile.Export>): Array<KubbFile.Export> {\n return orderBy(exports, [\n (v) => !!Array.isArray(v.name),\n (v) => !v.isTypeOnly,\n (v) => v.path,\n (v) => !!v.name,\n (v) => (Array.isArray(v.name) ? orderBy(v.name) : v.name),\n ]).reduce(\n (prev, curr) => {\n const name = curr.name\n const prevByPath = prev.findLast((imp) => imp.path === curr.path)\n const prevByPathAndIsTypeOnly = prev.findLast((imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly)\n\n if (prevByPathAndIsTypeOnly) {\n // we already have an export that has the same path but uses `isTypeOnly` (export type ...)\n return prev\n }\n\n const uniquePrev = prev.findLast(\n (imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly && imp.asAlias === curr.asAlias,\n )\n\n // we already have an item that was unique enough or name field is empty or prev asAlias is set but current has no changes\n if (uniquePrev || (Array.isArray(name) && !name.length) || (prevByPath?.asAlias && !curr.asAlias)) {\n return prev\n }\n\n if (!prevByPath) {\n return [\n ...prev,\n {\n ...curr,\n name: Array.isArray(name) ? [...new Set(name)] : name,\n },\n ]\n }\n\n // merge all names when prev and current both have the same isTypeOnly set\n if (prevByPath && Array.isArray(prevByPath.name) && Array.isArray(curr.name) && prevByPath.isTypeOnly === curr.isTypeOnly) {\n prevByPath.name = [...new Set([...prevByPath.name, ...curr.name])]\n\n return prev\n }\n\n return [...prev, curr]\n },\n [] as Array<KubbFile.Export>,\n )\n}\n\nexport function combineImports(imports: Array<KubbFile.Import>, exports: Array<KubbFile.Export>, source?: string): Array<KubbFile.Import> {\n return orderBy(imports, [\n (v) => !!Array.isArray(v.name),\n (v) => !v.isTypeOnly,\n (v) => v.path,\n (v) => !!v.name,\n (v) => (Array.isArray(v.name) ? orderBy(v.name) : v.name),\n ]).reduce(\n (prev, curr) => {\n let name = Array.isArray(curr.name) ? [...new Set(curr.name)] : curr.name\n\n const hasImportInSource = (importName: string) => {\n if (!source) {\n return true\n }\n\n const checker = (name?: string) => {\n return name && source.includes(name)\n }\n\n return checker(importName) || exports.some(({ name }) => (Array.isArray(name) ? name.some(checker) : checker(name)))\n }\n\n if (curr.path === curr.root) {\n // root and path are the same file, remove the \"./\" import\n return prev\n }\n\n // merge all names and check if the importName is being used in the generated source and if not filter those imports out\n if (Array.isArray(name)) {\n name = name.filter((item) => (typeof item === 'string' ? hasImportInSource(item) : hasImportInSource(item.propertyName)))\n }\n\n const prevByPath = prev.findLast((imp) => imp.path === curr.path && imp.isTypeOnly === curr.isTypeOnly)\n const uniquePrev = prev.findLast((imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly)\n const prevByPathNameAndIsTypeOnly = prev.findLast((imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly)\n\n if (prevByPathNameAndIsTypeOnly) {\n // we already have an export that has the same path but uses `isTypeOnly` (import type ...)\n return prev\n }\n\n // already unique enough or name is empty\n if (uniquePrev || (Array.isArray(name) && !name.length)) {\n return prev\n }\n\n // new item, append name\n if (!prevByPath) {\n return [\n ...prev,\n {\n ...curr,\n name,\n },\n ]\n }\n\n // merge all names when prev and current both have the same isTypeOnly set\n if (prevByPath && Array.isArray(prevByPath.name) && Array.isArray(name) && prevByPath.isTypeOnly === curr.isTypeOnly) {\n prevByPath.name = [...new Set([...prevByPath.name, ...name])]\n\n return prev\n }\n\n // no import was found in the source, ignore import\n if (!Array.isArray(name) && name && !hasImportInSource(name)) {\n return prev\n }\n\n return [...prev, curr]\n },\n [] as Array<KubbFile.Import>,\n )\n}\n\n/**\n * Helper to create a file with name and id set\n */\nexport function createFile<TMeta extends object = object>(file: KubbFile.File<TMeta>): KubbFile.ResolvedFile<TMeta> {\n const extname = path.extname(file.baseName) as KubbFile.Extname\n if (!extname) {\n throw new Error(`No extname found for ${file.baseName}`)\n }\n\n const source = file.sources.map((item) => item.value).join('\\n\\n')\n const exports = file.exports?.length ? combineExports(file.exports) : []\n const imports = file.imports?.length && source ? combineImports(file.imports, exports, source) : []\n const sources = file.sources?.length ? combineSources(file.sources) : []\n\n return {\n ...file,\n id: hashObject({ path: file.path }),\n name: trimExtName(file.baseName),\n extname,\n imports: imports,\n exports: exports,\n sources: sources,\n meta: file.meta || ({} as TMeta),\n }\n}\n","import { EventEmitter as NodeEventEmitter } from 'node:events'\n\nexport class AsyncEventEmitter<TEvents extends Record<string, any>> {\n constructor(maxListener = 100) {\n this.#emitter.setMaxListeners(maxListener)\n }\n #emitter = new NodeEventEmitter()\n\n async emit<TEventName extends keyof TEvents & string>(eventName: TEventName, ...eventArgs: TEvents[TEventName]): Promise<void> {\n const listeners = this.#emitter.listeners(eventName) as Array<(...args: TEvents[TEventName]) => any>\n\n if (listeners.length === 0) {\n return undefined\n }\n\n await Promise.all(\n listeners.map(async (listener) => {\n try {\n return await listener(...eventArgs)\n } catch (err) {\n console.error(`Error in async listener for \"${eventName}\":`, err)\n }\n }),\n )\n }\n\n on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void {\n this.#emitter.on(eventName, handler as any)\n }\n\n off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void {\n this.#emitter.off(eventName, handler as any)\n }\n removeAll(): void {\n this.#emitter.removeAllListeners()\n }\n}\n","import type * as KubbFile from './KubbFile.ts'\nimport pLimit from 'p-limit'\nimport path from 'node:path'\n\nimport type { Parser } from './parsers/types.ts'\nimport { defaultParser } from './parsers/defaultParser.ts'\nimport { AsyncEventEmitter } from './utils/AsyncEventEmitter.ts'\nimport type { AppEvents } from './App.ts'\nimport { typescriptParser } from './parsers/typescriptParser.ts'\nimport { tsxParser } from './parsers/tsxParser.ts'\n\nexport type ProcessFilesProps = {\n parsers?: Set<Parser>\n extension?: Record<KubbFile.Extname, KubbFile.Extname | ''>\n dryRun?: boolean\n}\n\ntype GetParseOptions = {\n parsers?: Set<Parser>\n extension?: Record<KubbFile.Extname, KubbFile.Extname | ''>\n}\n\ntype Options = {\n events?: AsyncEventEmitter<AppEvents>\n}\n\nexport class FileProcessor {\n #limit = pLimit(100)\n events: AsyncEventEmitter<AppEvents>\n\n constructor({ events = new AsyncEventEmitter<AppEvents>() }: Options = {}) {\n this.events = events\n\n return this\n }\n\n get #defaultParser(): Set<Parser> {\n return new Set<Parser>([typescriptParser, tsxParser, defaultParser])\n }\n\n async parse(file: KubbFile.ResolvedFile, { parsers = this.#defaultParser, extension }: GetParseOptions = {}): Promise<string> {\n const extname = path.extname(file.path) as KubbFile.Extname\n const parseExtName = extension?.[file.extname] || undefined\n\n if (!extname) {\n return defaultParser.parse(file, { extname: parseExtName })\n }\n\n const parser = [...parsers].find((item) => item.extNames?.includes(extname))\n\n if (!parser) {\n return defaultParser.parse(file, { extname: parseExtName })\n }\n\n return parser.parse(file, { extname: parseExtName })\n }\n\n async run(files: Array<KubbFile.ResolvedFile>, { parsers, dryRun, extension }: ProcessFilesProps = {}): Promise<KubbFile.ResolvedFile[]> {\n await this.events.emit('process:start', { files })\n\n let processed = 0\n const total = files.length\n\n const promises = files.map((resolvedFile, index) =>\n this.#limit(async () => {\n await this.events.emit('file:start', { file: resolvedFile, index, total })\n\n if (!dryRun) {\n const source = await this.parse(resolvedFile, { extension, parsers })\n await this.events.emit('process:progress', { file: resolvedFile, source, processed, percentage: (processed / total) * 100, total })\n }\n\n await this.events.emit('file:end', { file: resolvedFile, index, total })\n\n processed++\n }),\n )\n\n await Promise.all(promises)\n\n await this.events.emit('process:end', { files })\n\n return files\n }\n}\n","import type * as KubbFile from './KubbFile.ts'\nimport { Cache } from './utils/Cache.ts'\nimport { trimExtName } from './utils/trimExtName.ts'\nimport { orderBy } from 'natural-orderby'\nimport { createFile } from './createFile.ts'\nimport { FileProcessor, type ProcessFilesProps } from './FileProcessor.ts'\nimport { AsyncEventEmitter } from './utils/AsyncEventEmitter.ts'\nimport type { AppEvents } from './App.ts'\n\nfunction mergeFile<TMeta extends object = object>(a: KubbFile.File<TMeta>, b: KubbFile.File<TMeta>): KubbFile.File<TMeta> {\n return {\n ...a,\n sources: [...(a.sources || []), ...(b.sources || [])],\n imports: [...(a.imports || []), ...(b.imports || [])],\n exports: [...(a.exports || []), ...(b.exports || [])],\n }\n}\n\ntype Options = {\n events?: AsyncEventEmitter<AppEvents>\n}\n\nexport class FileManager {\n #cache = new Cache<KubbFile.ResolvedFile>()\n processor: FileProcessor\n\n constructor({ events = new AsyncEventEmitter<AppEvents>() }: Options = {}) {\n this.processor = new FileProcessor({ events })\n return this\n }\n\n async add(...files: Array<KubbFile.File>) {\n const resolvedFiles: Array<KubbFile.ResolvedFile> = []\n\n const mergedFiles = new Map<string, KubbFile.File>()\n\n files.forEach((file) => {\n const existing = mergedFiles.get(file.path)\n if (existing) {\n mergedFiles.set(file.path, mergeFile(existing, file))\n } else {\n mergedFiles.set(file.path, file)\n }\n })\n\n for (const file of mergedFiles.values()) {\n const existing = this.#cache.get(file.path)\n\n const merged = existing ? mergeFile(existing, file) : file\n const resolvedFile = createFile(merged)\n\n this.#cache.set(resolvedFile.path, resolvedFile)\n this.flush()\n\n resolvedFiles.push(resolvedFile)\n }\n\n return resolvedFiles\n }\n\n flush() {\n this.#cache.flush()\n }\n\n getByPath(path: KubbFile.Path): KubbFile.ResolvedFile | null {\n return this.#cache.get(path)\n }\n\n deleteByPath(path: KubbFile.Path): void {\n this.#cache.delete(path)\n }\n\n clear(): void {\n this.#cache.clear()\n }\n\n get files(): Array<KubbFile.ResolvedFile> {\n const cachedKeys = this.#cache.keys()\n\n // order by path length and if file is a barrel file\n const keys = orderBy(cachedKeys, [(v) => v.length, (v) => trimExtName(v).endsWith('index')])\n\n const files = keys.map((key) => this.#cache.get(key))\n\n return files.filter(Boolean)\n }\n\n async write(options: ProcessFilesProps): Promise<KubbFile.ResolvedFile[]> {\n return this.processor.run(this.files, options)\n }\n}\n","import { FileManager } from './FileManager.ts'\nimport { isFunction, isPromise } from 'remeda'\nimport type { Plugin } from './plugins/types.ts'\nimport type { Parser } from './parsers/types.ts'\nimport { AsyncEventEmitter } from './utils/AsyncEventEmitter.ts'\nimport type { App, AppContext, Component, AppEvents } from './App.ts'\n\ntype AppRenderer = {\n render(): Promise<void> | void\n renderToString(): Promise<string> | string\n waitUntilExit(): Promise<void>\n}\n\ntype RootRenderFunction<THostElement, TContext extends AppContext> = (this: TContext, container: THostElement, context: TContext) => AppRenderer\n\nexport type DefineApp<TContext extends AppContext> = (rootComponent?: Component, options?: TContext['options']) => App\n\nexport function defineApp<THostElement, TContext extends AppContext>(instance: RootRenderFunction<THostElement, TContext>): DefineApp<TContext> {\n function createApp(rootComponent: Component, options?: TContext['options']): App {\n const events = new AsyncEventEmitter<AppEvents>()\n const installedPlugins = new Set<Plugin>()\n const installedParsers = new Set<Parser>()\n const fileManager = new FileManager({ events })\n const context = {\n events,\n options,\n fileManager,\n installedPlugins,\n installedParsers,\n } as TContext\n\n const { render, renderToString, waitUntilExit } = instance.call(context, rootComponent, context)\n\n const app = {\n _component: rootComponent,\n async render() {\n if (isPromise(render)) {\n await render()\n } else {\n render()\n }\n },\n async renderToString() {\n return renderToString()\n },\n get files() {\n return fileManager.files\n },\n waitUntilExit,\n async addFile(...newFiles) {\n await fileManager.add(...newFiles)\n },\n use(pluginOrParser, ...options) {\n const args = Array.isArray(options) ? options : [options[0]]\n\n if (pluginOrParser.type === 'plugin') {\n if (installedPlugins.has(pluginOrParser)) {\n console.warn('Plugin has already been applied to target app.')\n } else {\n installedPlugins.add(pluginOrParser)\n }\n\n if (pluginOrParser.override && isFunction(pluginOrParser.override)) {\n const overrider = pluginOrParser.override\n\n const extraApp = (overrider as any)(app, context, ...args)\n Object.assign(app, extraApp)\n }\n }\n if (pluginOrParser.type === 'parser') {\n if (installedParsers.has(pluginOrParser)) {\n console.warn('Parser has already been applied to target app.')\n } else {\n installedParsers.add(pluginOrParser)\n }\n }\n\n if (pluginOrParser && isFunction(pluginOrParser.install)) {\n const installer = pluginOrParser.install\n\n ;(installer as any)(app, context, ...args)\n }\n\n return app\n },\n } as App\n\n events.emit('start', { app })\n\n return app\n }\n\n return createApp\n}\n","import { defineApp } from './defineApp.ts'\n\nexport const createApp = defineApp(() => {\n return {\n async render() {\n throw new Error('Method not implemented')\n },\n async renderToString() {\n throw new Error('Method not implemented')\n },\n async waitUntilExit() {\n throw new Error('Method not implemented')\n },\n }\n})\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
- const require_typescript = require('../typescript-Z90jN87k.cjs');
2
- require('../createFileParser-BD8yn0LT.cjs');
1
+ const require_typescriptParser = require('../typescriptParser-BBbbmG5W.cjs');
3
2
 
4
- exports.createExport = require_typescript.createExport;
5
- exports.createImport = require_typescript.createImport;
6
- exports.print = require_typescript.print;
7
- exports.typeScriptParser = require_typescript.typeScriptParser;
3
+ exports.createExport = require_typescriptParser.createExport;
4
+ exports.createImport = require_typescriptParser.createImport;
5
+ exports.print = require_typescriptParser.print;
6
+ exports.typescriptParser = require_typescriptParser.typescriptParser;
@@ -1,51 +1,3 @@
1
- import "../KubbFile-BrN7Wwp6.cjs";
2
- import { t as Parser } from "../types-GueHciQ3.cjs";
3
- import ts from "typescript";
4
-
5
- //#region src/parsers/typescript.d.ts
6
- type PrintOptions = {
7
- source?: string;
8
- baseName?: string;
9
- scriptKind?: ts.ScriptKind;
10
- };
11
- /**
12
- * Convert AST TypeScript/TSX nodes to a string based on the TypeScript printer.
13
- * Ensures consistent output across environments.
14
- * Also works as a formatter when `source` is provided without `elements`.
15
- */
16
- declare function print(elements?: Array<ts.Node>, {
17
- source,
18
- baseName,
19
- scriptKind
20
- }?: PrintOptions): string;
21
- declare function createImport({
22
- name,
23
- path,
24
- root,
25
- isTypeOnly,
26
- isNameSpace
27
- }: {
28
- name: string | Array<string | {
29
- propertyName: string;
30
- name?: string;
31
- }>;
32
- path: string;
33
- root?: string;
34
- isTypeOnly?: boolean;
35
- isNameSpace?: boolean;
36
- }): ts.ImportDeclaration;
37
- declare function createExport({
38
- path,
39
- asAlias,
40
- isTypeOnly,
41
- name
42
- }: {
43
- path: string;
44
- asAlias?: boolean;
45
- isTypeOnly?: boolean;
46
- name?: string | Array<ts.Identifier | string>;
47
- }): ts.ExportDeclaration;
48
- declare const typeScriptParser: Parser<object>;
49
- //#endregion
50
- export { createExport, createImport, print, typeScriptParser };
51
- //# sourceMappingURL=typescript.d.cts.map
1
+ import "../App-DoQNlnGL.cjs";
2
+ import { i as typescriptParser, n as createImport, r as print, t as createExport } from "../typescriptParser-DOD1_QTe.cjs";
3
+ export { createExport, createImport, print, typescriptParser };
@@ -1,51 +1,3 @@
1
- import "../KubbFile-BzVkcu9M.js";
2
- import { t as Parser } from "../types-CkbelZaS.js";
3
- import ts from "typescript";
4
-
5
- //#region src/parsers/typescript.d.ts
6
- type PrintOptions = {
7
- source?: string;
8
- baseName?: string;
9
- scriptKind?: ts.ScriptKind;
10
- };
11
- /**
12
- * Convert AST TypeScript/TSX nodes to a string based on the TypeScript printer.
13
- * Ensures consistent output across environments.
14
- * Also works as a formatter when `source` is provided without `elements`.
15
- */
16
- declare function print(elements?: Array<ts.Node>, {
17
- source,
18
- baseName,
19
- scriptKind
20
- }?: PrintOptions): string;
21
- declare function createImport({
22
- name,
23
- path,
24
- root,
25
- isTypeOnly,
26
- isNameSpace
27
- }: {
28
- name: string | Array<string | {
29
- propertyName: string;
30
- name?: string;
31
- }>;
32
- path: string;
33
- root?: string;
34
- isTypeOnly?: boolean;
35
- isNameSpace?: boolean;
36
- }): ts.ImportDeclaration;
37
- declare function createExport({
38
- path,
39
- asAlias,
40
- isTypeOnly,
41
- name
42
- }: {
43
- path: string;
44
- asAlias?: boolean;
45
- isTypeOnly?: boolean;
46
- name?: string | Array<ts.Identifier | string>;
47
- }): ts.ExportDeclaration;
48
- declare const typeScriptParser: Parser<object>;
49
- //#endregion
50
- export { createExport, createImport, print, typeScriptParser };
51
- //# sourceMappingURL=typescript.d.ts.map
1
+ import "../App-DUFbq4lD.js";
2
+ import { i as typescriptParser, n as createImport, r as print, t as createExport } from "../typescriptParser-C9WJrwRd.js";
3
+ export { createExport, createImport, print, typescriptParser };
@@ -1,4 +1,3 @@
1
- import { i as typeScriptParser, n as createImport, r as print, t as createExport } from "../typescript-C60gWBu8.js";
2
- import "../createFileParser-Cix3AMLd.js";
1
+ import { i as typescriptParser, n as createImport, r as print, t as createExport } from "../typescriptParser-BBGeFKlP.js";
3
2
 
4
- export { createExport, createImport, print, typeScriptParser };
3
+ export { createExport, createImport, print, typescriptParser };
@@ -0,0 +1,7 @@
1
+ const require_typescriptParser = require('./typescriptParser-BBbbmG5W.cjs');
2
+ const require_tsxParser = require('./tsxParser-HDf_3TMc.cjs');
3
+
4
+ exports.createParser = require_typescriptParser.createParser;
5
+ exports.defaultParser = require_tsxParser.defaultParser;
6
+ exports.tsxParser = require_tsxParser.tsxParser;
7
+ exports.typescriptParser = require_typescriptParser.typescriptParser;
@@ -0,0 +1,14 @@
1
+ import { o as Parser, s as UserParser } from "./App-DoQNlnGL.cjs";
2
+ import { i as typescriptParser } from "./typescriptParser-DOD1_QTe.cjs";
3
+
4
+ //#region src/parsers/createParser.d.ts
5
+ declare function createParser<TOptions = any[], TMeta extends object = any>(parser: UserParser<TOptions, TMeta>): Parser<TOptions, TMeta>;
6
+ //#endregion
7
+ //#region src/parsers/defaultParser.d.ts
8
+ declare const defaultParser: Parser<[], any>;
9
+ //#endregion
10
+ //#region src/parsers/tsxParser.d.ts
11
+ declare const tsxParser: Parser<[], any>;
12
+ //#endregion
13
+ export { createParser, defaultParser, tsxParser, typescriptParser };
14
+ //# sourceMappingURL=parsers.d.cts.map
@@ -0,0 +1,14 @@
1
+ import { o as Parser, s as UserParser } from "./App-DUFbq4lD.js";
2
+ import { i as typescriptParser } from "./typescriptParser-C9WJrwRd.js";
3
+
4
+ //#region src/parsers/createParser.d.ts
5
+ declare function createParser<TOptions = any[], TMeta extends object = any>(parser: UserParser<TOptions, TMeta>): Parser<TOptions, TMeta>;
6
+ //#endregion
7
+ //#region src/parsers/defaultParser.d.ts
8
+ declare const defaultParser: Parser<[], any>;
9
+ //#endregion
10
+ //#region src/parsers/tsxParser.d.ts
11
+ declare const tsxParser: Parser<[], any>;
12
+ //#endregion
13
+ export { createParser, defaultParser, tsxParser, typescriptParser };
14
+ //# sourceMappingURL=parsers.d.ts.map
@@ -0,0 +1,4 @@
1
+ import { a as createParser, i as typescriptParser } from "./typescriptParser-BBGeFKlP.js";
2
+ import { n as defaultParser, t as tsxParser } from "./tsxParser-C741ZKCN.js";
3
+
4
+ export { createParser, defaultParser, tsxParser, typescriptParser };