@kubb/core 1.15.0-canary.20231025T223729 → 1.15.0-canary.20231026T165002

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 CHANGED
@@ -1,18 +1,18 @@
1
1
  import mod, { createRequire } from 'module';
2
2
  import pc3 from 'picocolors';
3
+ export { default as pc } from 'picocolors';
4
+ import crypto from 'crypto';
3
5
  import fs2, { remove } from 'fs-extra';
4
- import seedrandom from 'seedrandom';
5
- import { switcher } from 'js-runtime';
6
6
  import { camelCase, camelCaseTransformMerge } from 'change-case';
7
- import crypto2 from 'crypto';
8
- import path, { resolve, dirname, extname } from 'path';
9
- import { print } from '@kubb/parser';
10
- import * as factory from '@kubb/parser/factory';
11
- import isEqual from 'lodash.isequal';
12
7
  import { orderBy } from 'natural-orderby';
8
+ import { performance } from 'perf_hooks';
9
+ import seedrandom from 'seedrandom';
10
+ import pathParser from 'path';
11
+ import { switcher } from 'js-runtime';
13
12
  import dirTree from 'directory-tree';
13
+ import { createImportDeclaration, print, createExportDeclaration } from '@kubb/parser';
14
+ import isEqual from 'lodash.isequal';
14
15
  import { EventEmitter as EventEmitter$1 } from 'events';
15
- import { performance } from 'perf_hooks';
16
16
  import os from 'os';
17
17
  import { pathToFileURL } from 'url';
18
18
  import { findUp, findUpSync } from 'find-up';
@@ -27,15 +27,110 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
27
27
  return require.apply(this, arguments);
28
28
  throw Error('Dynamic require of "' + x + '" is not supported');
29
29
  });
30
- async function clean(path3) {
31
- return remove(path3);
30
+
31
+ // src/utils/cache.ts
32
+ function createPluginCache(Store = /* @__PURE__ */ Object.create(null)) {
33
+ return {
34
+ set(id, value) {
35
+ Store[id] = [0, value];
36
+ },
37
+ get(id) {
38
+ const item = Store[id];
39
+ if (!item) {
40
+ return null;
41
+ }
42
+ item[0] = 0;
43
+ return item[1];
44
+ },
45
+ has(id) {
46
+ const item = Store[id];
47
+ if (!item) {
48
+ return false;
49
+ }
50
+ item[0] = 0;
51
+ return true;
52
+ },
53
+ delete(id) {
54
+ return delete Store[id];
55
+ }
56
+ };
32
57
  }
33
- var LogLevel = {
34
- silent: "silent",
35
- info: "info",
36
- debug: "debug"
58
+ async function clean(path) {
59
+ return remove(path);
60
+ }
61
+ var FunctionParams = class {
62
+ type;
63
+ items = [];
64
+ constructor(type) {
65
+ this.type = type;
66
+ return this;
67
+ }
68
+ add(item) {
69
+ if (!item) {
70
+ return this;
71
+ }
72
+ if (Array.isArray(item)) {
73
+ item.filter(Boolean).forEach((it) => this.items.push(it));
74
+ return this;
75
+ }
76
+ this.items.push(item);
77
+ return this;
78
+ }
79
+ toString() {
80
+ const sortedData = orderBy(this.items.filter(Boolean), [(v) => !v.default, (v) => v.required ?? true], ["desc", "desc"]);
81
+ return sortedData.filter(({ enabled = true }) => enabled).reduce((acc, { name, type, required = true, ...rest }) => {
82
+ if (!name) {
83
+ acc.push(`${type}${rest.default ? ` = ${rest.default}` : ""}`);
84
+ return acc;
85
+ }
86
+ const parameterName = name.startsWith("{") ? name : camelCase(name, { delimiter: "", transform: camelCaseTransformMerge });
87
+ if (type) {
88
+ if (required) {
89
+ acc.push(`${parameterName}: ${type}${rest.default ? ` = ${rest.default}` : ""}`);
90
+ } else {
91
+ acc.push(`${parameterName}?: ${type}`);
92
+ }
93
+ } else {
94
+ acc.push(`${parameterName}`);
95
+ }
96
+ return acc;
97
+ }, []).join(", ");
98
+ }
37
99
  };
38
- function createLogger({ logLevel, name, spinner }) {
100
+
101
+ // src/utils/getUniqueName.ts
102
+ function getUniqueName(originalName, data) {
103
+ let used = data[originalName] || 0;
104
+ if (used) {
105
+ data[originalName] = ++used;
106
+ originalName += used;
107
+ }
108
+ data[originalName] = 1;
109
+ return originalName;
110
+ }
111
+
112
+ // src/utils/isPromise.ts
113
+ function isPromise(result) {
114
+ return typeof result?.then === "function";
115
+ }
116
+ function isPromiseFulfilledResult(result) {
117
+ return result.status === "fulfilled";
118
+ }
119
+ function isPromiseRejectedResult(result) {
120
+ return result.status === "rejected";
121
+ }
122
+
123
+ // src/utils/jsdoc.ts
124
+ function createJSDocBlockText({ comments }) {
125
+ const filteredComments = comments.filter(Boolean);
126
+ if (!filteredComments.length) {
127
+ return "";
128
+ }
129
+ return `/**
130
+ * ${filteredComments.join("\n * ")}
131
+ */`;
132
+ }
133
+ function createLogger(spinner) {
39
134
  const logs = [];
40
135
  const log = (message) => {
41
136
  if (message && spinner) {
@@ -61,8 +156,6 @@ function createLogger({ logLevel, name, spinner }) {
61
156
  }
62
157
  };
63
158
  const logger = {
64
- name,
65
- logLevel,
66
159
  log,
67
160
  error,
68
161
  warn,
@@ -72,6 +165,75 @@ function createLogger({ logLevel, name, spinner }) {
72
165
  };
73
166
  return logger;
74
167
  }
168
+
169
+ // src/utils/nameSorter.ts
170
+ function nameSorter(a, b) {
171
+ if (a.name < b.name) {
172
+ return -1;
173
+ }
174
+ if (a.name > b.name) {
175
+ return 1;
176
+ }
177
+ return 0;
178
+ }
179
+ var Queue = class {
180
+ #queue = [];
181
+ #workerCount = 0;
182
+ #maxParallel;
183
+ #debug = false;
184
+ constructor(maxParallel, debug = false) {
185
+ this.#maxParallel = maxParallel;
186
+ this.#debug = debug;
187
+ }
188
+ run(job, options = { controller: new AbortController(), name: crypto.randomUUID(), description: "" }) {
189
+ return new Promise((resolve, reject) => {
190
+ const item = { reject, resolve, job, name: options.name, description: options.description || options.name };
191
+ options.controller?.signal.addEventListener("abort", () => {
192
+ this.#queue = this.#queue.filter((queueItem) => queueItem.name === item.name);
193
+ reject("Aborted");
194
+ });
195
+ this.#queue.push(item);
196
+ this.#work();
197
+ });
198
+ }
199
+ runSync(job, options = { controller: new AbortController(), name: crypto.randomUUID(), description: "" }) {
200
+ new Promise((resolve, reject) => {
201
+ const item = { reject, resolve, job, name: options.name, description: options.description || options.name };
202
+ options.controller?.signal.addEventListener("abort", () => {
203
+ this.#queue = this.#queue.filter((queueItem) => queueItem.name === item.name);
204
+ });
205
+ this.#queue.push(item);
206
+ this.#work();
207
+ });
208
+ }
209
+ get hasJobs() {
210
+ return this.#workerCount > 0 || this.#queue.length > 0;
211
+ }
212
+ get count() {
213
+ return this.#workerCount;
214
+ }
215
+ #work() {
216
+ if (this.#workerCount >= this.#maxParallel) {
217
+ return;
218
+ }
219
+ this.#workerCount++;
220
+ let entry;
221
+ while (entry = this.#queue.shift()) {
222
+ const { reject, resolve, job, name, description } = entry;
223
+ if (this.#debug) {
224
+ performance.mark(name + "_start");
225
+ }
226
+ job().then((result) => {
227
+ resolve(result);
228
+ if (this.#debug) {
229
+ performance.mark(name + "_stop");
230
+ performance.measure(description, name + "_start", name + "_stop");
231
+ }
232
+ }).catch((err) => reject(err));
233
+ }
234
+ this.#workerCount--;
235
+ }
236
+ };
75
237
  var defaultColours = ["black", "blue", "darkBlue", "cyan", "gray", "green", "darkGreen", "magenta", "red", "darkRed", "yellow", "darkYellow"];
76
238
  function randomColour(text, colours = defaultColours) {
77
239
  if (!text) {
@@ -98,22 +260,46 @@ function randomPicoColour(text, colors = defaultColours) {
98
260
  }
99
261
  return formatter(text);
100
262
  }
263
+ function slash(path, platform = "linux") {
264
+ const isWindowsPath = /^\\\\\?\\/.test(path);
265
+ if (["linux", "mac"].includes(platform) && !isWindowsPath) {
266
+ return path.replaceAll(/\\/g, "/").replace("../", "").trimEnd();
267
+ }
268
+ return path.replaceAll(/\\/g, "/").replace("../", "").trimEnd();
269
+ }
270
+ function getRelativePath(rootDir, filePath, platform = "linux") {
271
+ if (!rootDir || !filePath) {
272
+ throw new Error(`Root and file should be filled in when retrieving the relativePath, ${rootDir || ""} ${filePath || ""}`);
273
+ }
274
+ const relativePath = pathParser.relative(rootDir, filePath);
275
+ const path = slash(relativePath, platform);
276
+ if (path.startsWith("../")) {
277
+ return path.replace(pathParser.basename(path), pathParser.basename(path, pathParser.extname(filePath)));
278
+ }
279
+ return `./${path.replace(pathParser.basename(path), pathParser.basename(path, pathParser.extname(filePath)))}`;
280
+ }
281
+ function getPathMode(path) {
282
+ if (!path) {
283
+ return "directory";
284
+ }
285
+ return pathParser.extname(path) ? "file" : "directory";
286
+ }
101
287
  var reader = switcher(
102
288
  {
103
- node: async (path3) => {
104
- return fs2.readFile(path3, { encoding: "utf8" });
289
+ node: async (path) => {
290
+ return fs2.readFile(path, { encoding: "utf8" });
105
291
  },
106
- bun: async (path3) => {
107
- const file = Bun.file(path3);
292
+ bun: async (path) => {
293
+ const file = Bun.file(path);
108
294
  return file.text();
109
295
  }
110
296
  },
111
297
  "node"
112
298
  );
113
- switcher(
299
+ var syncReader = switcher(
114
300
  {
115
- node: (path3) => {
116
- return fs2.readFileSync(path3, { encoding: "utf8" });
301
+ node: (path) => {
302
+ return fs2.readFileSync(path, { encoding: "utf8" });
117
303
  },
118
304
  bun: () => {
119
305
  throw new Error("Bun cannot read sync");
@@ -121,116 +307,79 @@ switcher(
121
307
  },
122
308
  "node"
123
309
  );
124
- async function read(path3) {
125
- return reader(path3);
310
+ async function read(path) {
311
+ return reader(path);
126
312
  }
127
- var URLPath = class {
128
- path;
129
- constructor(path3) {
130
- this.path = path3;
131
- return this;
132
- }
133
- /**
134
- * Convert Swagger path to URLPath(syntax of Express)
135
- * @example /pet/{petId} => /pet/:petId
136
- */
137
- get URL() {
138
- return this.toURLPath();
139
- }
140
- get isURL() {
141
- try {
142
- const url = new URL(this.path);
143
- if (url?.href) {
144
- return true;
145
- }
146
- } catch (error) {
147
- return false;
148
- }
149
- return false;
150
- }
151
- /**
152
- * Convert Swagger path to template literals/ template strings(camelcase)
153
- * @example /pet/{petId} => `/pet/${petId}`
154
- * @example /account/monetary-accountID => `/account/${monetaryAccountId}`
155
- * @example /account/userID => `/account/${userId}`
156
- */
157
- get template() {
158
- return this.toTemplateString();
159
- }
160
- get object() {
161
- return this.toObject();
162
- }
163
- get params() {
164
- return this.getParams();
165
- }
166
- toObject({ type = "path", replacer, stringify } = {}) {
167
- const object = {
168
- url: type === "path" ? this.toURLPath() : this.toTemplateString(replacer),
169
- params: this.getParams()
170
- };
171
- if (stringify) {
172
- if (type !== "template") {
173
- throw new Error("Type should be `template` when using stringiyf");
174
- }
175
- return JSON.stringify(object).replaceAll("'", "").replaceAll(`"`, "");
176
- }
177
- return object;
178
- }
179
- /**
180
- * Convert Swagger path to template literals/ template strings(camelcase)
181
- * @example /pet/{petId} => `/pet/${petId}`
182
- * @example /account/monetary-accountID => `/account/${monetaryAccountId}`
183
- * @example /account/userID => `/account/${userId}`
184
- */
185
- toTemplateString(replacer) {
186
- const regex = /{(\w|-)*}/g;
187
- const found = this.path.match(regex);
188
- let newPath = this.path.replaceAll("{", "${");
189
- if (found) {
190
- newPath = found.reduce((prev, curr) => {
191
- const pathParam = replacer ? replacer(camelCase(curr, { delimiter: "", transform: camelCaseTransformMerge })) : camelCase(curr, { delimiter: "", transform: camelCaseTransformMerge });
192
- const replacement = `\${${pathParam}}`;
193
- return prev.replace(curr, replacement);
194
- }, this.path);
313
+ function readSync(path) {
314
+ return syncReader(path);
315
+ }
316
+
317
+ // src/utils/renderTemplate.ts
318
+ function renderTemplate(template, data = void 0) {
319
+ if (!data || !Object.keys(data).length) {
320
+ return template.replace(/{{(.*?)}}/g, "");
321
+ }
322
+ const matches = template.match(/{{(.*?)}}/g);
323
+ return matches?.reduce((prev, curr) => {
324
+ const index = curr.split(/{{|}}/).filter(Boolean)[0]?.trim();
325
+ if (index === void 0) {
326
+ return prev;
195
327
  }
196
- return `\`${newPath}\``;
197
- }
198
- getParams(replacer) {
199
- const regex = /{(\w|-)*}/g;
200
- const found = this.path.match(regex);
201
- if (!found) {
202
- return void 0;
328
+ const value = data[index];
329
+ if (value === void 0) {
330
+ return prev;
203
331
  }
204
- const params = {};
205
- found.forEach((item) => {
206
- item = item.replaceAll("{", "").replaceAll("}", "");
207
- const pathParam = replacer ? replacer(camelCase(item, { delimiter: "", transform: camelCaseTransformMerge })) : camelCase(item, { delimiter: "", transform: camelCaseTransformMerge });
208
- params[pathParam] = pathParam;
209
- }, this.path);
210
- return params;
211
- }
212
- /**
213
- * Convert Swagger path to URLPath(syntax of Express)
214
- * @example /pet/{petId} => /pet/:petId
215
- */
216
- toURLPath() {
217
- return this.path.replaceAll("{", ":").replaceAll("}", "");
332
+ return prev.replace(curr, () => {
333
+ if (typeof value === "boolean") {
334
+ return `${value.toString()}` || "false";
335
+ }
336
+ return value || "";
337
+ }).trim();
338
+ }, template) || "";
339
+ }
340
+
341
+ // src/utils/SummaryError.ts
342
+ var SummaryError = class extends Error {
343
+ summary;
344
+ constructor(message, options) {
345
+ super(message, { cause: options.cause });
346
+ this.name = "SummaryError";
347
+ this.summary = options.summary || [];
218
348
  }
219
349
  };
220
350
 
221
- // src/config.ts
222
- function defineConfig(options) {
223
- return options;
224
- }
225
- function isInputPath(result) {
226
- return !!result && "path" in result;
227
- }
351
+ // src/utils/throttle.ts
352
+ var throttle = (fn, delay) => {
353
+ let wait = false;
354
+ let timeout2;
355
+ let cancelled = false;
356
+ return [
357
+ (...args) => {
358
+ if (cancelled) {
359
+ return void 0;
360
+ }
361
+ if (wait) {
362
+ return void 0;
363
+ }
364
+ const val = fn(...args);
365
+ wait = true;
366
+ timeout2 = setTimeout(() => {
367
+ wait = false;
368
+ }, delay);
369
+ return val;
370
+ },
371
+ () => {
372
+ cancelled = true;
373
+ clearTimeout(timeout2);
374
+ }
375
+ ];
376
+ };
228
377
 
229
378
  // src/utils/timeout.ts
230
379
  async function timeout(ms) {
231
- return new Promise((resolve2) => {
380
+ return new Promise((resolve) => {
232
381
  setTimeout(() => {
233
- resolve2(true);
382
+ resolve(true);
234
383
  }, ms);
235
384
  });
236
385
  }
@@ -240,17 +389,6 @@ function combineCodes(codes) {
240
389
  return codes.join("\n");
241
390
  }
242
391
 
243
- // src/utils/transformers/createJSDocBlockText.ts
244
- function createJSDocBlockText({ comments }) {
245
- const filteredComments = comments.filter(Boolean);
246
- if (!filteredComments.length) {
247
- return "";
248
- }
249
- return `/**
250
- * ${filteredComments.join("\n * ")}
251
- */`;
252
- }
253
-
254
392
  // src/utils/transformers/escape.ts
255
393
  function escape(text) {
256
394
  return text ? text.replaceAll("`", "\\`") : "";
@@ -276,39 +414,6 @@ function jsStringEscape(input) {
276
414
  });
277
415
  }
278
416
 
279
- // src/utils/transformers/indent.ts
280
- function createIndent(size) {
281
- return Array.from({ length: size + 1 }).join(" ");
282
- }
283
-
284
- // src/utils/transformers/nameSorter.ts
285
- function nameSorter(a, b) {
286
- if (a.name < b.name) {
287
- return -1;
288
- }
289
- if (a.name > b.name) {
290
- return 1;
291
- }
292
- return 0;
293
- }
294
-
295
- // src/utils/transformers/searchAndReplace.ts
296
- function searchAndReplace(options) {
297
- const { text, replaceBy, prefix = "", key } = options;
298
- const searchValues = options.searchValues?.(prefix, key) || [
299
- `${prefix}["${key}"]`,
300
- `${prefix}['${key}']`,
301
- `${prefix}[\`${key}\`]`,
302
- `${prefix}"${key}"`,
303
- `${prefix}'${key}'`,
304
- `${prefix}\`${key}\``,
305
- new RegExp(`${prefix}${key}`, "g")
306
- ];
307
- return searchValues.reduce((prev, searchValue) => {
308
- return prev.toString().replaceAll(searchValue, replaceBy);
309
- }, text);
310
- }
311
-
312
417
  // src/utils/transformers/transformReservedWord.ts
313
418
  var reservedWords = [
314
419
  "abstract",
@@ -401,80 +506,6 @@ function transformReservedWord(word) {
401
506
  }
402
507
  return word;
403
508
  }
404
-
405
- // src/utils/transformers/index.ts
406
- var transformers = {
407
- combineCodes,
408
- escape,
409
- jsStringEscape,
410
- createIndent,
411
- transformReservedWord,
412
- nameSorter,
413
- searchAndReplace,
414
- JSDoc: {
415
- createJSDocBlockText
416
- }
417
- };
418
- async function saveCreateDirectory(path3) {
419
- const passedPath = dirname(resolve(path3));
420
- await fs2.mkdir(passedPath, { recursive: true });
421
- }
422
- var writer = switcher(
423
- {
424
- node: async (path3, data) => {
425
- try {
426
- await fs2.stat(resolve(path3));
427
- const oldContent = await fs2.readFile(resolve(path3), { encoding: "utf-8" });
428
- if (oldContent?.toString() === data?.toString()) {
429
- return;
430
- }
431
- } catch (_err) {
432
- }
433
- await saveCreateDirectory(path3);
434
- await fs2.writeFile(resolve(path3), data, { encoding: "utf-8" });
435
- const savedData = await fs2.readFile(resolve(path3), { encoding: "utf-8" });
436
- if (savedData?.toString() !== data?.toString()) {
437
- throw new Error(`Sanity check failed for ${path3}
438
-
439
- Data[${data.length}]:
440
- ${data}
441
-
442
- Saved[${savedData.length}]:
443
- ${savedData}
444
- `);
445
- }
446
- return savedData;
447
- },
448
- bun: async (path3, data) => {
449
- try {
450
- await saveCreateDirectory(path3);
451
- await Bun.write(resolve(path3), data);
452
- const file = Bun.file(resolve(path3));
453
- const savedData = await file.text();
454
- if (savedData?.toString() !== data?.toString()) {
455
- throw new Error(`Sanity check failed for ${path3}
456
-
457
- Data[${data.length}]:
458
- ${data}
459
-
460
- Saved[${savedData.length}]:
461
- ${savedData}
462
- `);
463
- }
464
- return savedData;
465
- } catch (e) {
466
- console.log(e, resolve(path3));
467
- }
468
- }
469
- },
470
- "node"
471
- );
472
- async function write(data, path3) {
473
- if (data.trim() === "") {
474
- return void 0;
475
- }
476
- return writer(path3, data.trim());
477
- }
478
509
  var TreeNode = class _TreeNode {
479
510
  data;
480
511
  parent;
@@ -539,16 +570,16 @@ var TreeNode = class _TreeNode {
539
570
  }
540
571
  return this;
541
572
  }
542
- static build(path3, options = {}) {
573
+ static build(path, options = {}) {
543
574
  try {
544
575
  const exclude = Array.isArray(options.exclude) ? options.exclude : [options.exclude].filter(Boolean);
545
- const filteredTree = dirTree(path3, { extensions: options.extensions, exclude: [/node_modules/, ...exclude] });
576
+ const filteredTree = dirTree(path, { extensions: options.extensions, exclude: [/node_modules/, ...exclude] });
546
577
  if (!filteredTree) {
547
578
  return null;
548
579
  }
549
- const treeNode = new _TreeNode({ name: filteredTree.name, path: filteredTree.path, type: filteredTree.type || FileManager.getMode(filteredTree.path) });
580
+ const treeNode = new _TreeNode({ name: filteredTree.name, path: filteredTree.path, type: filteredTree.type || getPathMode(filteredTree.path) });
550
581
  const recurse = (node, item) => {
551
- const subNode = node.addChild({ name: item.name, path: item.path, type: item.type || FileManager.getMode(item.path) });
582
+ const subNode = node.addChild({ name: item.name, path: item.path, type: item.type || getPathMode(item.path) });
552
583
  if (item.children?.length) {
553
584
  item.children?.forEach((child) => {
554
585
  recurse(subNode, child);
@@ -563,271 +594,227 @@ var TreeNode = class _TreeNode {
563
594
  }
564
595
  };
565
596
 
566
- // src/BarrelManager.ts
567
- var BarrelManager = class {
568
- #options = {};
569
- constructor(options = {}) {
570
- this.#options = options;
597
+ // src/utils/uniqueIdFactory.ts
598
+ var uniqueIdFactory = (counter) => (str = "") => `${str}${++counter}`;
599
+ var URLPath = class {
600
+ path;
601
+ constructor(path) {
602
+ this.path = path;
571
603
  return this;
572
604
  }
573
- getIndexes(root, extName) {
574
- const { treeNode = {}, isTypeOnly, filter, map, output, includeExt } = this.#options;
575
- const extMapper = {
576
- ".ts": {
577
- extensions: /\.ts/,
578
- exclude: [/schemas/, /json/]
579
- },
580
- ".json": {
581
- extensions: /\.json/,
582
- exclude: []
605
+ /**
606
+ * Convert Swagger path to URLPath(syntax of Express)
607
+ * @example /pet/{petId} => /pet/:petId
608
+ */
609
+ get URL() {
610
+ return this.toURLPath();
611
+ }
612
+ get isURL() {
613
+ try {
614
+ const url = new URL(this.path);
615
+ if (url?.href) {
616
+ return true;
583
617
  }
584
- };
585
- const tree = TreeNode.build(root, { ...extMapper[extName] || {}, ...treeNode });
586
- if (!tree) {
587
- return null;
618
+ } catch (error) {
619
+ return false;
588
620
  }
589
- const fileReducer = (files2, currentTree) => {
590
- if (!currentTree.children) {
591
- return [];
592
- }
593
- if (currentTree.children?.length > 1) {
594
- const indexPath = path.resolve(currentTree.data.path, "index.ts");
595
- const exports = currentTree.children.filter(Boolean).map((file) => {
596
- const importPath = file.data.type === "directory" ? `./${file.data.name}` : `./${file.data.name.replace(/\.[^.]*$/, "")}`;
597
- if (importPath.includes("index") && indexPath.includes("index")) {
598
- return void 0;
599
- }
600
- return {
601
- path: includeExt ? file.data.type === "directory" ? `${importPath}/index${extName}` : `${importPath}${extName}` : importPath,
602
- isTypeOnly
603
- };
604
- }).filter(Boolean);
605
- files2.push({
606
- path: indexPath,
607
- baseName: "index.ts",
608
- source: "",
609
- exports: output ? exports?.filter((item) => {
610
- return item.path.endsWith(output.replace(/\.[^.]*$/, ""));
611
- }) : exports
612
- });
613
- } else {
614
- currentTree.children?.forEach((child) => {
615
- const indexPath = path.resolve(currentTree.data.path, "index.ts");
616
- const importPath = child.data.type === "directory" ? `./${child.data.name}` : `./${child.data.name.replace(/\.[^.]*$/, "")}`;
617
- const exports = [
618
- {
619
- path: includeExt ? child.data.type === "directory" ? `${importPath}/index${extName}` : `${importPath}${extName}` : importPath,
620
- isTypeOnly
621
- }
622
- ];
623
- files2.push({
624
- path: indexPath,
625
- baseName: "index.ts",
626
- source: "",
627
- exports: output ? exports?.filter((item) => {
628
- return item.path.endsWith(output.replace(/\.[^.]*$/, ""));
629
- }) : exports
630
- });
631
- });
632
- }
633
- currentTree.children.forEach((childItem) => {
634
- fileReducer(files2, childItem);
635
- });
636
- return files2;
637
- };
638
- const files = fileReducer([], tree).reverse();
639
- const filteredFiles = filter ? files.filter(filter) : files;
640
- return map ? filteredFiles.map(map) : filteredFiles;
621
+ return false;
641
622
  }
642
- };
643
-
644
- // src/FileManager.ts
645
- var FileManager = class _FileManager {
646
- #cache = /* @__PURE__ */ new Map();
647
- #task;
648
- #isWriting = false;
649
623
  /**
650
- * Timeout between writes
624
+ * Convert Swagger path to template literals/ template strings(camelcase)
625
+ * @example /pet/{petId} => `/pet/${petId}`
626
+ * @example /account/monetary-accountID => `/account/${monetaryAccountId}`
627
+ * @example /account/userID => `/account/${userId}`
651
628
  */
652
- #timeout = 0;
653
- #queue;
654
- constructor(options) {
655
- if (options) {
656
- this.#task = options.task;
657
- this.#queue = options.queue;
658
- this.#timeout = options.timeout || 0;
659
- }
660
- return this;
661
- }
662
- get files() {
663
- const files = [];
664
- this.#cache.forEach((item) => {
665
- files.push(...item.flat(1));
666
- });
667
- return files;
629
+ get template() {
630
+ return this.toTemplateString();
668
631
  }
669
- get isExecuting() {
670
- return this.#queue?.hasJobs ?? this.#isWriting ?? false;
632
+ get object() {
633
+ return this.toObject();
671
634
  }
672
- #validate(file) {
673
- if (!file.validate) {
674
- return;
675
- }
676
- if (!file.path.toLowerCase().endsWith(file.baseName.toLowerCase())) {
677
- throw new Error(`${file.path} should end with the baseName ${file.baseName}`);
678
- }
635
+ get params() {
636
+ return this.getParams();
679
637
  }
680
- async add(...files) {
681
- const promises = files.map((file) => {
682
- this.#validate(file);
683
- if (file.override) {
684
- return this.#add(file);
638
+ toObject({ type = "path", replacer, stringify } = {}) {
639
+ const object = {
640
+ url: type === "path" ? this.toURLPath() : this.toTemplateString(replacer),
641
+ params: this.getParams()
642
+ };
643
+ if (stringify) {
644
+ if (type !== "template") {
645
+ throw new Error("Type should be `template` when using stringiyf");
685
646
  }
686
- return this.#addOrAppend(file);
687
- });
688
- const resolvedFiles = await Promise.all(promises);
689
- if (files.length > 1) {
690
- return resolvedFiles;
691
- }
692
- return resolvedFiles[0];
693
- }
694
- async #add(file) {
695
- const controller = new AbortController();
696
- const resolvedFile = { id: crypto2.randomUUID(), ...file };
697
- this.#cache.set(resolvedFile.path, [{ cancel: () => controller.abort(), ...resolvedFile }]);
698
- if (this.#queue) {
699
- await this.#queue.run(
700
- async () => {
701
- return this.#task?.(resolvedFile);
702
- },
703
- { controller }
704
- );
647
+ return JSON.stringify(object).replaceAll("'", "").replaceAll(`"`, "");
705
648
  }
706
- return resolvedFile;
649
+ return object;
707
650
  }
708
- async #addOrAppend(file) {
709
- const previousCaches = this.#cache.get(file.path);
710
- const previousCache = previousCaches ? previousCaches.at(previousCaches.length - 1) : void 0;
711
- if (previousCache) {
712
- this.#cache.delete(previousCache.path);
713
- return this.#add({
714
- ...file,
715
- source: previousCache.source && file.source ? `${previousCache.source}
716
- ${file.source}` : "",
717
- imports: [...previousCache.imports || [], ...file.imports || []],
718
- exports: [...previousCache.exports || [], ...file.exports || []],
719
- env: { ...previousCache.env || {}, ...file.env || {} }
720
- });
651
+ /**
652
+ * Convert Swagger path to template literals/ template strings(camelcase)
653
+ * @example /pet/{petId} => `/pet/${petId}`
654
+ * @example /account/monetary-accountID => `/account/${monetaryAccountId}`
655
+ * @example /account/userID => `/account/${userId}`
656
+ */
657
+ toTemplateString(replacer) {
658
+ const regex = /{(\w|-)*}/g;
659
+ const found = this.path.match(regex);
660
+ let newPath = this.path.replaceAll("{", "${");
661
+ if (found) {
662
+ newPath = found.reduce((prev, curr) => {
663
+ const pathParam = replacer ? replacer(camelCase(curr, { delimiter: "", transform: camelCaseTransformMerge })) : camelCase(curr, { delimiter: "", transform: camelCaseTransformMerge });
664
+ const replacement = `\${${pathParam}}`;
665
+ return prev.replace(curr, replacement);
666
+ }, this.path);
721
667
  }
722
- return this.#add(file);
668
+ return `\`${newPath}\``;
723
669
  }
724
- async addIndexes({ root, extName = ".ts", meta, options = {} }) {
725
- const barrelManager = new BarrelManager(options);
726
- const files = barrelManager.getIndexes(root, extName);
727
- if (!files) {
670
+ getParams(replacer) {
671
+ const regex = /{(\w|-)*}/g;
672
+ const found = this.path.match(regex);
673
+ if (!found) {
728
674
  return void 0;
729
675
  }
730
- return await Promise.all(
731
- files.map((file) => {
732
- return this.#addOrAppend({
733
- ...file,
734
- meta: meta ? meta : file.meta
735
- });
736
- })
737
- );
676
+ const params = {};
677
+ found.forEach((item) => {
678
+ item = item.replaceAll("{", "").replaceAll("}", "");
679
+ const pathParam = replacer ? replacer(camelCase(item, { delimiter: "", transform: camelCaseTransformMerge })) : camelCase(item, { delimiter: "", transform: camelCaseTransformMerge });
680
+ params[pathParam] = pathParam;
681
+ }, this.path);
682
+ return params;
738
683
  }
739
- getCacheByUUID(UUID) {
740
- let cache;
741
- this.#cache.forEach((files) => {
742
- cache = files.find((item) => item.id === UUID);
743
- });
744
- return cache;
684
+ /**
685
+ * Convert Swagger path to URLPath(syntax of Express)
686
+ * @example /pet/{petId} => /pet/:petId
687
+ */
688
+ toURLPath() {
689
+ return this.path.replaceAll("{", ":").replaceAll("}", "");
745
690
  }
746
- get(path3) {
747
- return this.#cache.get(path3);
691
+ };
692
+
693
+ // src/utils/Warning.ts
694
+ var Warning = class extends Error {
695
+ constructor(message, options) {
696
+ super(message, { cause: options?.cause });
697
+ this.name = "Warning";
748
698
  }
749
- remove(path3) {
750
- const cacheItem = this.get(path3);
751
- if (!cacheItem) {
752
- return;
699
+ };
700
+ async function saveCreateDirectory(path) {
701
+ const passedPath = pathParser.dirname(pathParser.resolve(path));
702
+ await fs2.mkdir(passedPath, { recursive: true });
703
+ }
704
+ var writer = switcher(
705
+ {
706
+ node: async (path, data) => {
707
+ try {
708
+ await fs2.stat(path);
709
+ const oldContent = await fs2.readFile(path, { encoding: "utf-8" });
710
+ if (oldContent?.toString() === data) {
711
+ return;
712
+ }
713
+ } catch (_err) {
714
+ }
715
+ await saveCreateDirectory(path);
716
+ return fs2.writeFile(pathParser.resolve(path), data, { encoding: "utf-8" });
717
+ },
718
+ bun: async (path, data) => {
719
+ try {
720
+ await saveCreateDirectory(path);
721
+ await Bun.write(pathParser.resolve(path), data);
722
+ } catch (e) {
723
+ console.log(e, pathParser.resolve(path));
724
+ }
753
725
  }
754
- this.#cache.delete(path3);
755
- }
756
- async write(...params) {
757
- if (!this.#isWriting) {
758
- this.#isWriting = true;
759
- const text = await write(...params);
760
- this.#isWriting = false;
761
- return text;
726
+ },
727
+ "node"
728
+ );
729
+ async function write(data, path) {
730
+ return writer(path, data);
731
+ }
732
+ function getIndexes(root, extName, options = {}) {
733
+ const extMapper = {
734
+ ".ts": {
735
+ extensions: /\.ts/,
736
+ exclude: [/schemas/, /json/]
737
+ },
738
+ ".json": {
739
+ extensions: /\.json/,
740
+ exclude: []
762
741
  }
763
- await timeout(this.#timeout);
764
- return this.write(...params);
765
- }
766
- async read(...params) {
767
- return read(...params);
742
+ };
743
+ const tree = TreeNode.build(root, { ...extMapper[extName] || {}, ...options });
744
+ if (!tree) {
745
+ return null;
768
746
  }
769
- // statics
770
- static getSource(file) {
771
- if (!_FileManager.isExtensionAllowed(file.baseName)) {
772
- return file.source;
747
+ const fileReducer = (files2, currentTree) => {
748
+ if (!currentTree.children) {
749
+ return [];
773
750
  }
774
- const exports = file.exports ? combineExports(file.exports) : [];
775
- const imports = file.imports ? combineImports(file.imports, exports, file.source) : [];
776
- const importNodes = imports.map((item) => factory.createImportDeclaration({ name: item.name, path: item.path, isTypeOnly: item.isTypeOnly }));
777
- const exportNodes = exports.map(
778
- (item) => factory.createExportDeclaration({ name: item.name, path: item.path, isTypeOnly: item.isTypeOnly, asAlias: item.asAlias })
779
- );
780
- return [print([...importNodes, ...exportNodes]), getEnvSource(file.source, file.env)].join("\n");
781
- }
782
- static combineFiles(files) {
783
- return files.filter(Boolean).reduce((acc, file) => {
784
- const prevIndex = acc.findIndex((item) => item.path === file.path);
785
- if (prevIndex === -1) {
786
- return [...acc, file];
787
- }
751
+ if (currentTree.children?.length > 1) {
752
+ const path = pathParser.resolve(currentTree.data.path, "index.ts");
753
+ const exports = currentTree.children.map((file) => {
754
+ if (!file) {
755
+ return void 0;
756
+ }
757
+ const importPath = file.data.type === "directory" ? `./${file.data.name}` : `./${file.data.name.replace(/\.[^.]*$/, "")}`;
758
+ if (importPath.includes("index") && path.includes("index")) {
759
+ return void 0;
760
+ }
761
+ return { path: importPath };
762
+ }).filter(Boolean);
763
+ files2.push({
764
+ path,
765
+ baseName: "index.ts",
766
+ source: "",
767
+ exports
768
+ });
769
+ } else {
770
+ currentTree.children?.forEach((child) => {
771
+ const path = pathParser.resolve(currentTree.data.path, "index.ts");
772
+ const importPath = child.data.type === "directory" ? `./${child.data.name}` : `./${child.data.name.replace(/\.[^.]*$/, "")}`;
773
+ files2.push({
774
+ path,
775
+ baseName: "index.ts",
776
+ source: "",
777
+ exports: [{ path: importPath }]
778
+ });
779
+ });
780
+ }
781
+ currentTree.children.forEach((childItem) => {
782
+ fileReducer(files2, childItem);
783
+ });
784
+ return files2;
785
+ };
786
+ const files = fileReducer([], tree);
787
+ return files;
788
+ }
789
+ function combineFiles(files) {
790
+ return files.filter(Boolean).reduce((acc, curr) => {
791
+ const prevIndex = acc.findIndex((item) => item.path === curr.path);
792
+ if (prevIndex !== -1) {
788
793
  const prev = acc[prevIndex];
789
- if (prev && file.override) {
790
- acc[prevIndex] = {
791
- imports: [],
792
- exports: [],
793
- ...file
794
- };
795
- return acc;
796
- }
797
794
  if (prev) {
798
795
  acc[prevIndex] = {
799
- ...file,
800
- source: prev.source && file.source ? `${prev.source}
801
- ${file.source}` : "",
802
- imports: [...prev.imports || [], ...file.imports || []],
803
- exports: [...prev.exports || [], ...file.exports || []],
804
- env: { ...prev.env || {}, ...file.env || {} }
796
+ ...curr,
797
+ source: prev.source && curr.source ? `${prev.source}
798
+ ${curr.source}` : "",
799
+ imports: [...prev.imports || [], ...curr.imports || []],
800
+ exports: [...prev.exports || [], ...curr.exports || []],
801
+ env: { ...prev.env || {}, ...curr.env || {} }
805
802
  };
806
803
  }
807
- return acc;
808
- }, []);
809
- }
810
- static getMode(path3) {
811
- if (!path3) {
812
- return "directory";
804
+ } else {
805
+ acc.push(curr);
813
806
  }
814
- return extname(path3) ? "file" : "directory";
815
- }
816
- static get extensions() {
817
- return [".js", ".ts", ".tsx"];
818
- }
819
- static isExtensionAllowed(baseName) {
820
- return _FileManager.extensions.some((extension) => baseName.endsWith(extension));
821
- }
822
- };
807
+ return acc;
808
+ }, []);
809
+ }
810
+ var extensions = [".js", ".ts", ".tsx"];
811
+ function isExtensionAllowed(baseName) {
812
+ return extensions.some((extension) => baseName.endsWith(extension));
813
+ }
823
814
  function combineExports(exports) {
824
- const combinedExports = orderBy(exports, [(v) => !v.isTypeOnly], ["asc"]).reduce((prev, curr) => {
815
+ return exports.reduce((prev, curr) => {
825
816
  const name = curr.name;
826
817
  const prevByPath = prev.findLast((imp) => imp.path === curr.path);
827
- const prevByPathAndIsTypeOnly = prev.findLast((imp) => imp.path === curr.path && isEqual(imp.name, name) && imp.isTypeOnly);
828
- if (prevByPathAndIsTypeOnly) {
829
- return prev;
830
- }
831
818
  const uniquePrev = prev.findLast(
832
819
  (imp) => imp.path === curr.path && isEqual(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly && imp.asAlias === curr.asAlias
833
820
  );
@@ -849,16 +836,12 @@ function combineExports(exports) {
849
836
  }
850
837
  return [...prev, curr];
851
838
  }, []);
852
- return orderBy(combinedExports, [(v) => !v.isTypeOnly, (v) => v.asAlias], ["desc", "desc"]);
853
839
  }
854
840
  function combineImports(imports, exports, source) {
855
- const combinedImports = orderBy(imports, [(v) => !v.isTypeOnly], ["asc"]).reduce((prev, curr) => {
841
+ return imports.reduce((prev, curr) => {
856
842
  let name = Array.isArray(curr.name) ? [...new Set(curr.name)] : curr.name;
857
843
  const hasImportInSource = (importName) => {
858
- if (!source) {
859
- return true;
860
- }
861
- const checker = (name2) => name2 && !!source.includes(name2);
844
+ const checker = (name2) => name2 && !!source.includes(`${name2}`);
862
845
  return checker(importName) || exports.some(({ name: name2 }) => Array.isArray(name2) ? name2.some(checker) : checker(name2));
863
846
  };
864
847
  if (Array.isArray(name)) {
@@ -866,10 +849,6 @@ function combineImports(imports, exports, source) {
866
849
  }
867
850
  const prevByPath = prev.findLast((imp) => imp.path === curr.path && imp.isTypeOnly === curr.isTypeOnly);
868
851
  const uniquePrev = prev.findLast((imp) => imp.path === curr.path && isEqual(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly);
869
- const prevByPathNameAndIsTypeOnly = prev.findLast((imp) => imp.path === curr.path && isEqual(imp.name, name) && imp.isTypeOnly);
870
- if (prevByPathNameAndIsTypeOnly) {
871
- return prev;
872
- }
873
852
  if (uniquePrev || Array.isArray(name) && !name.length) {
874
853
  return prev;
875
854
  }
@@ -891,7 +870,43 @@ function combineImports(imports, exports, source) {
891
870
  }
892
871
  return [...prev, curr];
893
872
  }, []);
894
- return orderBy(combinedImports, [(v) => !v.isTypeOnly], ["desc"]);
873
+ }
874
+ function createFileSource(file) {
875
+ let { source } = file;
876
+ if (!isExtensionAllowed(file.baseName)) {
877
+ return file.source;
878
+ }
879
+ const exports = file.exports ? combineExports(file.exports) : [];
880
+ const imports = file.imports ? combineImports(file.imports, exports, source) : [];
881
+ const importNodes = imports.map((item) => createImportDeclaration({ name: item.name, path: item.path, isTypeOnly: item.isTypeOnly }));
882
+ const importSource = print(importNodes);
883
+ const exportNodes = exports.map((item) => createExportDeclaration({ name: item.name, path: item.path, isTypeOnly: item.isTypeOnly, asAlias: item.asAlias }));
884
+ const exportSource = print(exportNodes);
885
+ source = getEnvSource(file.source, file.env);
886
+ if (importSource) {
887
+ source = `${importSource}
888
+ ${source}`;
889
+ }
890
+ if (exportSource) {
891
+ source = `${exportSource}
892
+ ${source}`;
893
+ }
894
+ return source;
895
+ }
896
+ function searchAndReplace(options) {
897
+ const { text, replaceBy, prefix = "", key } = options;
898
+ const searchValues = options.searchValues?.(prefix, key) || [
899
+ `${prefix}["${key}"]`,
900
+ `${prefix}['${key}']`,
901
+ `${prefix}[\`${key}\`]`,
902
+ `${prefix}"${key}"`,
903
+ `${prefix}'${key}'`,
904
+ `${prefix}\`${key}\``,
905
+ new RegExp(`${prefix}${key}`, "g")
906
+ ];
907
+ return searchValues.reduce((prev, searchValue) => {
908
+ return prev.toString().replaceAll(searchValue, replaceBy);
909
+ }, text);
895
910
  }
896
911
  function getEnvSource(source, env) {
897
912
  if (!env) {
@@ -908,117 +923,127 @@ function getEnvSource(source, env) {
908
923
  throw new TypeError(`Environment should be in upperCase for ${key}`);
909
924
  }
910
925
  if (typeof replaceBy === "string") {
911
- prev = transformers.searchAndReplace({ text: prev.replaceAll(`process.env.${key}`, replaceBy), replaceBy, prefix: "process.env", key });
912
- prev = transformers.searchAndReplace({ text: prev.replaceAll(new RegExp(`(declare const).*
926
+ prev = searchAndReplace({ text: prev.replaceAll(`process.env.${key}`, replaceBy), replaceBy, prefix: "process.env", key });
927
+ prev = searchAndReplace({ text: prev.replaceAll(new RegExp(`(declare const).*
913
928
  `, "ig"), ""), replaceBy, key });
914
929
  }
915
930
  return prev;
916
931
  }, source);
917
932
  }
918
- var EventEmitter = class {
919
- constructor() {
920
- this.#emitter.setMaxListeners(100);
921
- }
922
- #emitter = new EventEmitter$1();
923
- emit(eventName, ...eventArg) {
924
- this.#emitter.emit(eventName, ...eventArg);
933
+
934
+ // src/managers/fileManager/FileManager.ts
935
+ var FileManager = class {
936
+ #cache = /* @__PURE__ */ new Map();
937
+ #task;
938
+ #queue;
939
+ constructor(options) {
940
+ if (options) {
941
+ this.#task = options.task;
942
+ this.#queue = options.queue;
943
+ }
944
+ return this;
925
945
  }
926
- on(eventName, handler) {
927
- this.#emitter.on(eventName, handler);
946
+ get extensions() {
947
+ return extensions;
928
948
  }
929
- off(eventName, handler) {
930
- this.#emitter.off(eventName, handler);
949
+ get files() {
950
+ const files = [];
951
+ this.#cache.forEach((item) => {
952
+ files.push(...item.flat(1));
953
+ });
954
+ return files;
931
955
  }
932
- removeAll() {
933
- this.#emitter.removeAllListeners();
956
+ get isExecuting() {
957
+ return this.#queue?.hasJobs ?? false;
934
958
  }
935
- };
936
- var Queue = class {
937
- #queue = [];
938
- eventEmitter = new EventEmitter();
939
- #workerCount = 0;
940
- #maxParallel;
941
- #debug = false;
942
- constructor(maxParallel, debug = false) {
943
- this.#maxParallel = maxParallel;
944
- this.#debug = debug;
959
+ async add(file) {
960
+ const controller = new AbortController();
961
+ const resolvedFile = { id: crypto.randomUUID(), ...file };
962
+ this.#cache.set(resolvedFile.path, [{ cancel: () => controller.abort(), ...resolvedFile }]);
963
+ if (this.#queue) {
964
+ try {
965
+ await this.#queue.run(
966
+ async () => {
967
+ return this.#task?.(resolvedFile);
968
+ },
969
+ { controller }
970
+ );
971
+ } catch {
972
+ return resolvedFile;
973
+ }
974
+ }
975
+ return resolvedFile;
945
976
  }
946
- run(job, options = { controller: new AbortController(), name: crypto2.randomUUID(), description: "" }) {
947
- return new Promise((resolve2, reject) => {
948
- const item = { reject, resolve: resolve2, job, name: options.name, description: options.description || options.name };
949
- options.controller?.signal.addEventListener("abort", () => {
950
- this.#queue = this.#queue.filter((queueItem) => queueItem.name === item.name);
951
- reject("Aborted");
977
+ async addOrAppend(file) {
978
+ const previousCaches = this.#cache.get(file.path);
979
+ const previousCache = previousCaches ? previousCaches.at(previousCaches.length - 1) : void 0;
980
+ if (previousCache) {
981
+ this.#cache.delete(previousCache.path);
982
+ return this.add({
983
+ ...file,
984
+ source: previousCache.source && file.source ? `${previousCache.source}
985
+ ${file.source}` : "",
986
+ imports: [...previousCache.imports || [], ...file.imports || []],
987
+ exports: [...previousCache.exports || [], ...file.exports || []],
988
+ env: { ...previousCache.env || {}, ...file.env || {} }
952
989
  });
953
- this.#queue.push(item);
954
- this.#work();
955
- });
990
+ }
991
+ return this.add(file);
956
992
  }
957
- runSync(job, options = { controller: new AbortController(), name: crypto2.randomUUID(), description: "" }) {
958
- new Promise((resolve2, reject) => {
959
- const item = { reject, resolve: resolve2, job, name: options.name, description: options.description || options.name };
960
- options.controller?.signal.addEventListener("abort", () => {
961
- this.#queue = this.#queue.filter((queueItem) => queueItem.name === item.name);
962
- });
963
- this.#queue.push(item);
964
- this.#work();
965
- });
993
+ async addIndexes(root, extName = ".ts", options = {}) {
994
+ const files = await getIndexes(root, extName, options);
995
+ if (!files) {
996
+ return void 0;
997
+ }
998
+ return Promise.all(
999
+ files.map((file) => {
1000
+ if (file.override) {
1001
+ return this.add(file);
1002
+ }
1003
+ return this.addOrAppend(file);
1004
+ })
1005
+ );
966
1006
  }
967
- get hasJobs() {
968
- return this.#workerCount > 0 || this.#queue.length > 0;
1007
+ #append(path, file) {
1008
+ const previousFiles = this.#cache.get(path) || [];
1009
+ this.#cache.set(path, [...previousFiles, file]);
969
1010
  }
970
- get count() {
971
- return this.#workerCount;
1011
+ getCacheByUUID(UUID) {
1012
+ let cache;
1013
+ this.#cache.forEach((files) => {
1014
+ cache = files.find((item) => item.id === UUID);
1015
+ });
1016
+ return cache;
972
1017
  }
973
- #work() {
974
- if (this.#workerCount >= this.#maxParallel) {
1018
+ get(path) {
1019
+ return this.#cache.get(path);
1020
+ }
1021
+ remove(path) {
1022
+ const cacheItem = this.get(path);
1023
+ if (!cacheItem) {
975
1024
  return;
976
1025
  }
977
- this.#workerCount++;
978
- let entry;
979
- while (entry = this.#queue.shift()) {
980
- const { reject, resolve: resolve2, job, name, description } = entry;
981
- if (this.#debug) {
982
- performance.mark(name + "_start");
983
- }
984
- job().then((result) => {
985
- this.eventEmitter.emit("jobDone", result);
986
- resolve2(result);
987
- if (this.#debug) {
988
- performance.mark(name + "_stop");
989
- performance.measure(description, name + "_start", name + "_stop");
990
- }
991
- }).catch((err) => {
992
- this.eventEmitter.emit("jobFailed", err);
993
- reject(err);
1026
+ this.#cache.delete(path);
1027
+ }
1028
+ async write(...params) {
1029
+ if (this.#queue) {
1030
+ return this.#queue.run(async () => {
1031
+ return write(...params);
994
1032
  });
995
1033
  }
996
- this.#workerCount--;
1034
+ return write(...params);
997
1035
  }
998
- };
999
-
1000
- // src/utils/uniqueName.ts
1001
- function setUniqueName(originalName, data) {
1002
- let used = data[originalName] || 0;
1003
- if (used) {
1004
- data[originalName] = ++used;
1005
- return originalName;
1006
- }
1007
- data[originalName] = 1;
1008
- return originalName;
1009
- }
1010
-
1011
- // src/errors.ts
1012
- var PluginError = class extends Error {
1013
- pluginManager;
1014
- cause;
1015
- constructor(message, options) {
1016
- super(message, { cause: options.cause });
1017
- this.name = "PluginError";
1018
- this.cause = options.cause;
1019
- this.pluginManager = options.pluginManager;
1036
+ async read(...params) {
1037
+ if (this.#queue) {
1038
+ return this.#queue.run(async () => {
1039
+ return read(...params);
1040
+ });
1041
+ }
1042
+ return read(...params);
1020
1043
  }
1021
1044
  };
1045
+
1046
+ // src/managers/pluginManager/ParallelPluginError.ts
1022
1047
  var ParallelPluginError = class extends Error {
1023
1048
  errors = [];
1024
1049
  pluginManager;
@@ -1043,55 +1068,30 @@ var ParallelPluginError = class extends Error {
1043
1068
  })?.cause;
1044
1069
  }
1045
1070
  };
1046
- var SummaryError = class extends Error {
1047
- summary;
1071
+
1072
+ // src/managers/pluginManager/PluginError.ts
1073
+ var PluginError = class extends Error {
1074
+ pluginManager;
1075
+ cause;
1048
1076
  constructor(message, options) {
1049
1077
  super(message, { cause: options.cause });
1050
- this.name = "SummaryError";
1051
- this.summary = options.summary || [];
1052
- }
1053
- };
1054
- var Warning = class extends Error {
1055
- constructor(message, options) {
1056
- super(message, { cause: options?.cause });
1057
- this.name = "Warning";
1078
+ this.name = "PluginError";
1079
+ this.cause = options.cause;
1080
+ this.pluginManager = options.pluginManager;
1058
1081
  }
1059
1082
  };
1060
- var ValidationPluginError = class extends Error {
1061
- };
1062
-
1063
- // src/utils/cache.ts
1064
- function createPluginCache(Store = /* @__PURE__ */ Object.create(null)) {
1065
- return {
1066
- set(id, value) {
1067
- Store[id] = [0, value];
1068
- },
1069
- get(id) {
1070
- const item = Store[id];
1071
- if (!item) {
1072
- return null;
1073
- }
1074
- item[0] = 0;
1075
- return item[1];
1076
- },
1077
- has(id) {
1078
- const item = Store[id];
1079
- if (!item) {
1080
- return false;
1081
- }
1082
- item[0] = 0;
1083
- return true;
1084
- },
1085
- delete(id) {
1086
- return delete Store[id];
1087
- }
1088
- };
1089
- }
1090
-
1091
- // src/plugin.ts
1092
- function createPlugin(factory2) {
1083
+ function createPlugin(factory) {
1093
1084
  return (options) => {
1094
- return factory2(options);
1085
+ const plugin = factory(options);
1086
+ if (Array.isArray(plugin)) {
1087
+ throw new Error("Not implemented");
1088
+ }
1089
+ if (!plugin.transform) {
1090
+ plugin.transform = function transform(code) {
1091
+ return code;
1092
+ };
1093
+ }
1094
+ return plugin;
1095
1095
  };
1096
1096
  }
1097
1097
  var pluginName = "core";
@@ -1100,8 +1100,6 @@ var definePlugin = createPlugin((options) => {
1100
1100
  return {
1101
1101
  name: pluginName,
1102
1102
  options,
1103
- key: ["controller", "core"],
1104
- kind: "controller",
1105
1103
  api() {
1106
1104
  return {
1107
1105
  get config() {
@@ -1110,18 +1108,18 @@ var definePlugin = createPlugin((options) => {
1110
1108
  get plugins() {
1111
1109
  return options.getPlugins();
1112
1110
  },
1113
- get plugin() {
1114
- return options.plugin;
1115
- },
1116
1111
  logger,
1117
1112
  fileManager,
1118
1113
  pluginManager,
1119
1114
  async addFile(...files) {
1120
- const resolvedFiles = await fileManager.add(...files);
1121
- if (!Array.isArray(resolvedFiles)) {
1122
- return [resolvedFiles];
1123
- }
1124
- return resolvedFiles;
1115
+ return Promise.all(
1116
+ files.map((file) => {
1117
+ if (file.override) {
1118
+ return fileManager.add(file);
1119
+ }
1120
+ return fileManager.addOrAppend(file);
1121
+ })
1122
+ );
1125
1123
  },
1126
1124
  resolvePath,
1127
1125
  resolveName,
@@ -1129,58 +1127,63 @@ var definePlugin = createPlugin((options) => {
1129
1127
  };
1130
1128
  },
1131
1129
  resolvePath(baseName) {
1132
- const root = path.resolve(this.config.root, this.config.output.path);
1133
- return path.resolve(root, baseName);
1130
+ const root = pathParser.resolve(this.config.root, this.config.output.path);
1131
+ return pathParser.resolve(root, baseName);
1134
1132
  },
1135
1133
  resolveName(name) {
1136
1134
  return name;
1137
1135
  }
1138
1136
  };
1139
1137
  });
1140
-
1141
- // src/utils/executeStrategies.ts
1142
- function hookSeq(promises) {
1143
- return promises.reduce(
1144
- (promise, func) => {
1145
- if (!func || typeof func !== "function") {
1146
- throw new Error("HookSeq needs a function that returns a promise `() => Promise<unknown>`");
1147
- }
1148
- return promise.then((result) => {
1149
- const calledFunc = func();
1150
- if (calledFunc) {
1151
- return calledFunc.then(Array.prototype.concat.bind(result));
1152
- }
1153
- });
1154
- },
1155
- Promise.resolve([])
1156
- );
1157
- }
1158
-
1159
- // src/PromiseManager.ts
1160
- var PromiseManager = class {
1161
- #options = {};
1162
- constructor(options = {}) {
1163
- this.#options = options;
1164
- return this;
1138
+ var EventEmitter = class {
1139
+ constructor() {
1140
+ this.#emitter.setMaxListeners(100);
1165
1141
  }
1166
- run(strategy, promises) {
1167
- if (strategy === "seq") {
1168
- return hookSeq(promises);
1169
- }
1170
- throw new Error(`${strategy} not implemented`);
1142
+ #emitter = new EventEmitter$1();
1143
+ emit(eventName, ...eventArg) {
1144
+ this.#emitter.emit(eventName, ...eventArg);
1145
+ }
1146
+ on(eventName, handler) {
1147
+ this.#emitter.on(eventName, handler);
1148
+ }
1149
+ off(eventName, handler) {
1150
+ this.#emitter.off(eventName, handler);
1151
+ }
1152
+ removeAll() {
1153
+ this.#emitter.removeAllListeners();
1171
1154
  }
1172
1155
  };
1173
- function isPromise(result) {
1174
- return !!result && typeof result?.then === "function";
1175
- }
1176
- function isPromiseFulfilledResult(result) {
1177
- return result.status === "fulfilled";
1178
- }
1179
- function isPromiseRejectedResult(result) {
1180
- return result.status === "rejected";
1156
+
1157
+ // src/managers/pluginManager/pluginParser.ts
1158
+ var usedPluginNames = {};
1159
+ function pluginParser(plugin, context) {
1160
+ const key = [plugin.kind, plugin.name, getUniqueName(plugin.name, usedPluginNames).split(plugin.name).at(1)];
1161
+ if (plugin.api && typeof plugin.api === "function") {
1162
+ const api = plugin.api.call(context);
1163
+ return {
1164
+ ...plugin,
1165
+ key,
1166
+ api
1167
+ };
1168
+ }
1169
+ return {
1170
+ ...plugin,
1171
+ key
1172
+ };
1181
1173
  }
1182
1174
 
1183
- // src/PluginManager.ts
1175
+ // src/managers/pluginManager/PluginManager.ts
1176
+ var hookNames = {
1177
+ validate: 1,
1178
+ buildStart: 1,
1179
+ resolvePath: 1,
1180
+ resolveName: 1,
1181
+ load: 1,
1182
+ transform: 1,
1183
+ writeFile: 1,
1184
+ buildEnd: 1
1185
+ };
1186
+ var hooks = Object.keys(hookNames);
1184
1187
  var PluginManager = class {
1185
1188
  plugins;
1186
1189
  fileManager;
@@ -1189,14 +1192,10 @@ var PluginManager = class {
1189
1192
  executed = [];
1190
1193
  logger;
1191
1194
  #core;
1192
- #usedPluginNames = {};
1193
- #promiseManager;
1194
1195
  constructor(config, options) {
1195
1196
  this.logger = options.logger;
1196
- this.queue = new Queue(100, this.logger.logLevel === LogLevel.debug);
1197
- this.fileManager = new FileManager({ task: options.task, queue: this.queue, timeout: options.writeTimeout });
1198
- this.#promiseManager = new PromiseManager();
1199
- const plugins = config.plugins || [];
1197
+ this.queue = new Queue(100, options.debug);
1198
+ this.fileManager = new FileManager({ task: options.task, queue: this.queue });
1200
1199
  const core = definePlugin({
1201
1200
  config,
1202
1201
  logger: this.logger,
@@ -1204,29 +1203,23 @@ var PluginManager = class {
1204
1203
  fileManager: this.fileManager,
1205
1204
  resolvePath: this.resolvePath.bind(this),
1206
1205
  resolveName: this.resolveName.bind(this),
1207
- getPlugins: this.#getSortedPlugins.bind(this)
1208
- });
1209
- this.#core = this.#parse(core, this, core.api.call(null));
1210
- this.plugins = [this.#core, ...plugins].map((plugin) => {
1211
- return this.#parse(plugin, this, this.#core.api);
1206
+ getPlugins: this.#getSortedPlugins.bind(this),
1207
+ plugin: void 0
1212
1208
  });
1209
+ this.#core = pluginParser(core, core.api.call(null));
1210
+ this.plugins = [this.#core, ...config.plugins || []].reduce((prev, plugin) => {
1211
+ const convertedApi = pluginParser(plugin, this.#core?.api);
1212
+ return [...prev, convertedApi];
1213
+ }, []);
1213
1214
  return this;
1214
1215
  }
1215
1216
  resolvePath = (params) => {
1216
- if (params.pluginKey) {
1217
- const paths = this.hookForPluginSync({
1218
- pluginKey: params.pluginKey,
1217
+ if (params.pluginName) {
1218
+ return this.hookForPluginSync({
1219
+ pluginName: params.pluginName,
1219
1220
  hookName: "resolvePath",
1220
1221
  parameters: [params.baseName, params.directory, params.options]
1221
1222
  });
1222
- if (paths && paths?.length > 1) {
1223
- throw new Error(
1224
- `Cannot return a path where the 'pluginKey' ${params.pluginKey ? JSON.stringify(params.pluginKey) : '"'} is not unique enough
1225
-
1226
- Paths: ${JSON.stringify(paths, void 0, 2)}`
1227
- );
1228
- }
1229
- return paths?.at(0);
1230
1223
  }
1231
1224
  return this.hookFirstSync({
1232
1225
  hookName: "resolvePath",
@@ -1234,20 +1227,13 @@ Paths: ${JSON.stringify(paths, void 0, 2)}`
1234
1227
  }).result;
1235
1228
  };
1236
1229
  resolveName = (params) => {
1237
- if (params.pluginKey) {
1238
- const names = this.hookForPluginSync({
1239
- pluginKey: params.pluginKey,
1230
+ if (params.pluginName) {
1231
+ const name2 = this.hookForPluginSync({
1232
+ pluginName: params.pluginName,
1240
1233
  hookName: "resolveName",
1241
1234
  parameters: [params.name, params.type]
1242
1235
  });
1243
- if (names && names?.length > 1) {
1244
- throw new Error(
1245
- `Cannot return a name where the 'pluginKey' ${params.pluginKey ? JSON.stringify(params.pluginKey) : '"'} is not unique enough
1246
-
1247
- Names: ${JSON.stringify(names, void 0, 2)}`
1248
- );
1249
- }
1250
- return transformReservedWord(names?.at(0) || params.name);
1236
+ return transformReservedWord(name2 || params.name);
1251
1237
  }
1252
1238
  const name = this.hookFirstSync({
1253
1239
  hookName: "resolveName",
@@ -1262,35 +1248,30 @@ Names: ${JSON.stringify(names, void 0, 2)}`
1262
1248
  * Run only hook for a specific plugin name
1263
1249
  */
1264
1250
  hookForPlugin({
1265
- pluginKey,
1251
+ pluginName: pluginName2,
1266
1252
  hookName,
1267
1253
  parameters
1268
1254
  }) {
1269
- const plugins = this.getPluginsByKey(hookName, pluginKey);
1270
- const promises = plugins.map((plugin) => {
1271
- return this.#execute({
1272
- strategy: "hookFirst",
1273
- hookName,
1274
- parameters,
1275
- plugin
1276
- });
1277
- }).filter(Boolean);
1278
- return Promise.all(promises);
1255
+ const plugin = this.getPlugin(hookName, pluginName2);
1256
+ return this.#execute({
1257
+ strategy: "hookFirst",
1258
+ hookName,
1259
+ parameters,
1260
+ plugin
1261
+ });
1279
1262
  }
1280
1263
  hookForPluginSync({
1281
- pluginKey,
1264
+ pluginName: pluginName2,
1282
1265
  hookName,
1283
1266
  parameters
1284
1267
  }) {
1285
- const plugins = this.getPluginsByKey(hookName, pluginKey);
1286
- return plugins.map((plugin) => {
1287
- return this.#executeSync({
1288
- strategy: "hookFirst",
1289
- hookName,
1290
- parameters,
1291
- plugin
1292
- });
1293
- }).filter(Boolean);
1268
+ const plugin = this.getPlugin(hookName, pluginName2);
1269
+ return this.#executeSync({
1270
+ strategy: "hookFirst",
1271
+ hookName,
1272
+ parameters,
1273
+ plugin
1274
+ });
1294
1275
  }
1295
1276
  /**
1296
1277
  * Chains, first non-null result stops and returns
@@ -1406,58 +1387,37 @@ Names: ${JSON.stringify(names, void 0, 2)}`
1406
1387
  * Chains plugins
1407
1388
  */
1408
1389
  hookSeq({ hookName, parameters }) {
1409
- const promises = this.#getSortedPlugins().map((plugin) => {
1410
- return () => this.#execute({
1411
- strategy: "hookSeq",
1412
- hookName,
1413
- parameters,
1414
- plugin
1390
+ let promise = Promise.resolve();
1391
+ for (const plugin of this.#getSortedPlugins()) {
1392
+ promise = promise.then(() => {
1393
+ this.#execute({
1394
+ strategy: "hookSeq",
1395
+ hookName,
1396
+ parameters,
1397
+ plugin
1398
+ });
1415
1399
  });
1416
- });
1417
- return this.#promiseManager.run("seq", promises);
1400
+ }
1401
+ return promise.then(noReturn);
1418
1402
  }
1419
1403
  #getSortedPlugins(hookName) {
1420
1404
  const plugins = [...this.plugins].filter((plugin) => plugin.name !== "core");
1421
1405
  if (hookName) {
1422
- if (this.logger.logLevel === "info") {
1423
- const containsHookName = plugins.some((item) => item[hookName]);
1424
- if (!containsHookName) {
1425
- this.logger.warn(`No hook ${hookName} found`);
1426
- }
1427
- }
1428
1406
  return plugins.filter((item) => item[hookName]);
1429
1407
  }
1430
1408
  return plugins;
1431
1409
  }
1432
- getPluginsByKey(hookName, pluginKey) {
1410
+ getPlugin(hookName, pluginName2) {
1433
1411
  const plugins = [...this.plugins];
1434
- const [searchKind, searchPluginName, searchIdentifier] = pluginKey;
1435
- const pluginByPluginName = plugins.filter((plugin) => plugin[hookName]).filter((item) => {
1436
- const [kind, name, identifier] = item.key;
1437
- const identifierCheck = identifier?.toString() === searchIdentifier?.toString();
1438
- const kindCheck = kind === searchKind;
1439
- const nameCheck = name === searchPluginName;
1440
- if (searchIdentifier) {
1441
- return identifierCheck && kindCheck && nameCheck;
1442
- }
1443
- return kindCheck && nameCheck;
1444
- });
1445
- if (!pluginByPluginName?.length) {
1446
- const corePlugin = plugins.find((plugin) => plugin.name === "core" && plugin[hookName]);
1447
- if (this.logger.logLevel === "info") {
1448
- if (corePlugin) {
1449
- this.logger.warn(`No hook '${hookName}' for pluginKey '${JSON.stringify(pluginKey)}' found, falling back on the '@kubb/core' plugin`);
1450
- } else {
1451
- this.logger.warn(`No hook '${hookName}' for pluginKey '${JSON.stringify(pluginKey)}' found, no fallback found in the '@kubb/core' plugin`);
1452
- }
1453
- }
1454
- return corePlugin ? [corePlugin] : [];
1412
+ const pluginByPluginName = plugins.find((item) => item.name === pluginName2 && item[hookName]);
1413
+ if (!pluginByPluginName) {
1414
+ return this.#core;
1455
1415
  }
1456
1416
  return pluginByPluginName;
1457
1417
  }
1458
1418
  #addExecutedToCallStack(executer) {
1459
1419
  if (executer) {
1460
- this.eventEmitter.emit("executed", executer);
1420
+ this.eventEmitter.emit("execute", executer);
1461
1421
  this.executed.push(executer);
1462
1422
  }
1463
1423
  }
@@ -1527,7 +1487,7 @@ Names: ${JSON.stringify(names, void 0, 2)}`
1527
1487
  this.eventEmitter.emit("execute", { strategy, hookName, parameters, plugin });
1528
1488
  try {
1529
1489
  if (typeof hook === "function") {
1530
- const fn = hook.apply({ ...this.#core.api, plugin }, parameters);
1490
+ const fn = hook.apply(this.#core.api, parameters);
1531
1491
  output = fn;
1532
1492
  return fn;
1533
1493
  }
@@ -1553,50 +1513,34 @@ Names: ${JSON.stringify(names, void 0, 2)}`
1553
1513
  this.eventEmitter.emit("error", pluginError);
1554
1514
  throw pluginError;
1555
1515
  }
1556
- #parse(plugin, pluginManager, context) {
1557
- const usedPluginNames = pluginManager.#usedPluginNames;
1558
- setUniqueName(plugin.name, usedPluginNames);
1559
- const key = plugin.key || [plugin.kind, plugin.name, usedPluginNames[plugin.name]].filter(Boolean);
1560
- if (plugin.name !== "core" && usedPluginNames[plugin.name] >= 2) {
1561
- pluginManager.logger.warn("Using multiple of the same plugin is an experimental feature");
1562
- }
1563
- if (!plugin.transform) {
1564
- plugin.transform = function transform(code) {
1565
- return code;
1566
- };
1567
- }
1568
- if (plugin.api && typeof plugin.api === "function") {
1569
- const api = plugin.api.call(context);
1570
- return {
1571
- ...plugin,
1572
- key,
1573
- api
1574
- };
1575
- }
1576
- return {
1577
- ...plugin,
1578
- key
1579
- };
1580
- }
1581
- static getDependedPlugins(plugins, dependedPluginNames) {
1582
- let pluginNames = [];
1583
- if (typeof dependedPluginNames === "string") {
1584
- pluginNames = [dependedPluginNames];
1585
- } else {
1586
- pluginNames = dependedPluginNames;
1587
- }
1588
- return pluginNames.map((pluginName2) => {
1589
- const plugin = plugins.find((plugin2) => plugin2.name === pluginName2);
1590
- if (!plugin) {
1591
- throw new ValidationPluginError(`This plugin depends on the ${pluginName2} plugin.`);
1592
- }
1593
- return plugin;
1594
- });
1595
- }
1596
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
1597
- static get hooks() {
1598
- return ["validate", "buildStart", "resolvePath", "resolveName", "load", "transform", "writeFile", "buildEnd"];
1599
- }
1516
+ };
1517
+ function noReturn() {
1518
+ }
1519
+
1520
+ // src/managers/pluginManager/validate.ts
1521
+ var ValidationPluginError = class extends Error {
1522
+ };
1523
+ function getDependedPlugins(plugins, dependedPluginNames) {
1524
+ let pluginNames = [];
1525
+ if (typeof dependedPluginNames === "string") {
1526
+ pluginNames = [dependedPluginNames];
1527
+ } else {
1528
+ pluginNames = dependedPluginNames;
1529
+ }
1530
+ return pluginNames.map((pluginName2) => {
1531
+ const plugin = plugins.find((plugin2) => plugin2.name === pluginName2);
1532
+ if (!plugin) {
1533
+ throw new ValidationPluginError(`This plugin depends on the ${pluginName2} plugin.`);
1534
+ }
1535
+ return plugin;
1536
+ });
1537
+ }
1538
+
1539
+ // src/types.ts
1540
+ var LogLevel = {
1541
+ silent: "silent",
1542
+ info: "info",
1543
+ debug: "debug"
1600
1544
  };
1601
1545
 
1602
1546
  // src/build.ts
@@ -1604,13 +1548,13 @@ async function transformReducer(_previousCode, result, _plugin) {
1604
1548
  return result;
1605
1549
  }
1606
1550
  async function build(options) {
1607
- const { config, logger = createLogger({ logLevel: LogLevel.silent }) } = options;
1551
+ const { config, logLevel, logger = createLogger() } = options;
1608
1552
  try {
1609
- if (isInputPath(config) && !new URLPath(config.input.path).isURL) {
1553
+ if ("path" in config.input && !new URLPath(config.input.path).isURL) {
1610
1554
  await read(config.input.path);
1611
1555
  }
1612
1556
  } catch (e) {
1613
- if (isInputPath(config)) {
1557
+ if ("path" in config.input) {
1614
1558
  throw new Error(
1615
1559
  "Cannot read file/URL defined in `input.path` or set with `kubb generate PATH` in the CLI of your Kubb config " + pc3.dim(config.input.path),
1616
1560
  {
@@ -1623,11 +1567,11 @@ async function build(options) {
1623
1567
  await clean(config.output.path);
1624
1568
  }
1625
1569
  const queueTask = async (file) => {
1626
- const { path: path3 } = file;
1627
- let code = FileManager.getSource(file);
1570
+ const { path } = file;
1571
+ let code = createFileSource(file);
1628
1572
  const { result: loadedResult } = await pluginManager.hookFirst({
1629
1573
  hookName: "load",
1630
- parameters: [path3]
1574
+ parameters: [path]
1631
1575
  });
1632
1576
  if (loadedResult && isPromise(loadedResult)) {
1633
1577
  code = await loadedResult;
@@ -1638,53 +1582,28 @@ async function build(options) {
1638
1582
  if (code) {
1639
1583
  const transformedCode = await pluginManager.hookReduceArg0({
1640
1584
  hookName: "transform",
1641
- parameters: [code, path3],
1585
+ parameters: [code, path],
1642
1586
  reduce: transformReducer
1643
1587
  });
1644
1588
  if (config.output.write || config.output.write === void 0) {
1645
- if (file.meta?.pluginKey) {
1646
- return pluginManager.hookForPlugin({
1647
- pluginKey: file.meta?.pluginKey,
1648
- hookName: "writeFile",
1649
- parameters: [transformedCode, path3]
1650
- });
1651
- }
1652
- return pluginManager.hookFirst({
1589
+ await pluginManager.hookParallel({
1653
1590
  hookName: "writeFile",
1654
- parameters: [transformedCode, path3]
1591
+ parameters: [transformedCode, path]
1655
1592
  });
1656
1593
  }
1657
1594
  }
1658
1595
  };
1659
- const pluginManager = new PluginManager(config, { logger, task: queueTask, writeTimeout: 0 });
1596
+ const pluginManager = new PluginManager(config, { debug: logLevel === LogLevel.debug, logger, task: queueTask });
1660
1597
  const { plugins, fileManager } = pluginManager;
1661
1598
  pluginManager.on("execute", (executer) => {
1662
- const { hookName, parameters, plugin } = executer;
1663
- if (hookName === "writeFile" && logger.spinner) {
1664
- const [code] = parameters;
1665
- if (logger.logLevel === LogLevel.info) {
1666
- logger.spinner.start(`\u{1F4BE} Writing`);
1667
- }
1668
- if (logger.logLevel === "debug") {
1669
- logger.info(`PluginKey ${pc3.dim(JSON.stringify(plugin.key))}
1670
- with source
1671
-
1672
- ${code}`);
1673
- }
1674
- }
1675
- });
1676
- pluginManager.on("executed", (executer) => {
1677
1599
  const { hookName, plugin, output, parameters } = executer;
1678
1600
  const messsage = `${randomPicoColour(plugin.name)} Executing ${hookName}`;
1679
- if (logger.logLevel === LogLevel.info && logger.spinner) {
1680
- if (hookName === "writeFile") {
1681
- const [_code, path3] = parameters;
1682
- logger.spinner.suffixText = pc3.dim(path3);
1683
- } else {
1601
+ if (logLevel === LogLevel.info) {
1602
+ if (logger.spinner) {
1684
1603
  logger.spinner.suffixText = messsage;
1685
1604
  }
1686
1605
  }
1687
- if (logger.logLevel === LogLevel.debug) {
1606
+ if (logLevel === LogLevel.debug) {
1688
1607
  logger.info(messsage);
1689
1608
  const logs = [
1690
1609
  parameters && `${pc3.bgWhite(`Parameters`)} ${randomPicoColour(plugin.name)} ${hookName}`,
@@ -1704,14 +1623,15 @@ ${code}`);
1704
1623
  parameters: [config]
1705
1624
  });
1706
1625
  await pluginManager.hookParallel({ hookName: "buildEnd" });
1707
- if (!fileManager.isExecuting && logger.spinner) {
1708
- logger.spinner.suffixText = "";
1709
- logger.spinner.succeed(`\u{1F4BE} Writing completed`);
1710
- }
1711
- return { files: fileManager.files.map((file) => ({ ...file, source: FileManager.getSource(file) })), pluginManager };
1626
+ return { files: fileManager.files.map((file) => ({ ...file, source: createFileSource(file) })), pluginManager };
1627
+ }
1628
+
1629
+ // src/config.ts
1630
+ function defineConfig(options) {
1631
+ return options;
1712
1632
  }
1713
1633
 
1714
- // src/Generator.ts
1634
+ // src/generators/Generator.ts
1715
1635
  var Generator = class {
1716
1636
  #options = {};
1717
1637
  #context = {};
@@ -1734,6 +1654,10 @@ var Generator = class {
1734
1654
  this.#options = { ...this.#options, ...options };
1735
1655
  }
1736
1656
  };
1657
+
1658
+ // src/generators/SchemaGenerator.ts
1659
+ var SchemaGenerator = class extends Generator {
1660
+ };
1737
1661
  var PackageManager = class _PackageManager {
1738
1662
  static #cache = {};
1739
1663
  #cwd;
@@ -1756,17 +1680,17 @@ var PackageManager = class _PackageManager {
1756
1680
  }
1757
1681
  return directory;
1758
1682
  }
1759
- getLocation(path3) {
1760
- let location = path3;
1683
+ getLocation(path) {
1684
+ let location = path;
1761
1685
  if (this.#cwd) {
1762
1686
  const require2 = mod.createRequire(this.normalizeDirectory(this.#cwd));
1763
- location = require2.resolve(path3);
1687
+ location = require2.resolve(path);
1764
1688
  }
1765
1689
  return location;
1766
1690
  }
1767
- async import(path3) {
1691
+ async import(path) {
1768
1692
  try {
1769
- let location = this.getLocation(path3);
1693
+ let location = this.getLocation(path);
1770
1694
  if (os.platform() == "win32") {
1771
1695
  location = pathToFileURL(location).href;
1772
1696
  }
@@ -1842,13 +1766,9 @@ var PackageManager = class _PackageManager {
1842
1766
  }
1843
1767
  };
1844
1768
 
1845
- // src/SchemaGenerator.ts
1846
- var SchemaGenerator = class extends Generator {
1847
- };
1848
-
1849
1769
  // src/index.ts
1850
1770
  var src_default = build;
1851
1771
 
1852
- export { FileManager, Generator, PackageManager, ParallelPluginError, PluginError, PluginManager, PromiseManager, SchemaGenerator, SummaryError, ValidationPluginError, Warning, build, createPlugin, src_default as default, defineConfig, isInputPath, isPromise, isPromiseFulfilledResult, isPromiseRejectedResult, pluginName as name, pluginName };
1772
+ export { FileManager, FunctionParams, Generator, LogLevel, PackageManager, ParallelPluginError, PluginError, PluginManager, Queue, SchemaGenerator, SummaryError, TreeNode, URLPath, ValidationPluginError, Warning, build, clean, combineCodes, combineExports, combineFiles, combineImports, createFileSource, createJSDocBlockText, createLogger, createPlugin, createPluginCache, src_default as default, defaultColours, defineConfig, escape, extensions, getDependedPlugins, getIndexes, getPathMode, getRelativePath, getUniqueName, hooks, isExtensionAllowed, isPromise, isPromiseFulfilledResult, isPromiseRejectedResult, jsStringEscape, pluginName as name, nameSorter, pluginName, randomColour, randomPicoColour, read, readSync, renderTemplate, throttle, timeout, transformReservedWord, uniqueIdFactory, write };
1853
1773
  //# sourceMappingURL=out.js.map
1854
1774
  //# sourceMappingURL=index.js.map