@kubb/core 1.15.0-canary.20231026T131818 → 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.cjs CHANGED
@@ -3,19 +3,18 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var pc3 = require('picocolors');
6
+ var crypto = require('crypto');
6
7
  var fs2 = require('fs-extra');
8
+ var changeCase = require('change-case');
9
+ var naturalOrderby = require('natural-orderby');
10
+ var perf_hooks = require('perf_hooks');
7
11
  var seedrandom = require('seedrandom');
8
- var path4 = require('path');
12
+ var path2 = require('path');
9
13
  var jsRuntime = require('js-runtime');
10
- var changeCase = require('change-case');
11
- var crypto2 = require('crypto');
14
+ var dirTree = require('directory-tree');
12
15
  var parser = require('@kubb/parser');
13
- var factory = require('@kubb/parser/factory');
14
16
  var isEqual = require('lodash.isequal');
15
- var naturalOrderby = require('natural-orderby');
16
- var dirTree = require('directory-tree');
17
17
  var events = require('events');
18
- var perf_hooks = require('perf_hooks');
19
18
  var mod = require('module');
20
19
  var os = require('os');
21
20
  var url = require('url');
@@ -25,32 +24,13 @@ var semver = require('semver');
25
24
 
26
25
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
27
26
 
28
- function _interopNamespace(e) {
29
- if (e && e.__esModule) return e;
30
- var n = Object.create(null);
31
- if (e) {
32
- Object.keys(e).forEach(function (k) {
33
- if (k !== 'default') {
34
- var d = Object.getOwnPropertyDescriptor(e, k);
35
- Object.defineProperty(n, k, d.get ? d : {
36
- enumerable: true,
37
- get: function () { return e[k]; }
38
- });
39
- }
40
- });
41
- }
42
- n.default = e;
43
- return Object.freeze(n);
44
- }
45
-
46
27
  var pc3__default = /*#__PURE__*/_interopDefault(pc3);
28
+ var crypto__default = /*#__PURE__*/_interopDefault(crypto);
47
29
  var fs2__default = /*#__PURE__*/_interopDefault(fs2);
48
30
  var seedrandom__default = /*#__PURE__*/_interopDefault(seedrandom);
49
- var path4__default = /*#__PURE__*/_interopDefault(path4);
50
- var crypto2__default = /*#__PURE__*/_interopDefault(crypto2);
51
- var factory__namespace = /*#__PURE__*/_interopNamespace(factory);
52
- var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
31
+ var path2__default = /*#__PURE__*/_interopDefault(path2);
53
32
  var dirTree__default = /*#__PURE__*/_interopDefault(dirTree);
33
+ var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
54
34
  var mod__default = /*#__PURE__*/_interopDefault(mod);
55
35
  var os__default = /*#__PURE__*/_interopDefault(os);
56
36
  var process__default = /*#__PURE__*/_interopDefault(process);
@@ -63,15 +43,110 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
63
43
  return require.apply(this, arguments);
64
44
  throw Error('Dynamic require of "' + x + '" is not supported');
65
45
  });
66
- async function clean(path5) {
67
- return fs2.remove(path5);
46
+
47
+ // src/utils/cache.ts
48
+ function createPluginCache(Store = /* @__PURE__ */ Object.create(null)) {
49
+ return {
50
+ set(id, value) {
51
+ Store[id] = [0, value];
52
+ },
53
+ get(id) {
54
+ const item = Store[id];
55
+ if (!item) {
56
+ return null;
57
+ }
58
+ item[0] = 0;
59
+ return item[1];
60
+ },
61
+ has(id) {
62
+ const item = Store[id];
63
+ if (!item) {
64
+ return false;
65
+ }
66
+ item[0] = 0;
67
+ return true;
68
+ },
69
+ delete(id) {
70
+ return delete Store[id];
71
+ }
72
+ };
68
73
  }
69
- var LogLevel = {
70
- silent: "silent",
71
- info: "info",
72
- debug: "debug"
74
+ async function clean(path3) {
75
+ return fs2.remove(path3);
76
+ }
77
+ var FunctionParams = class {
78
+ type;
79
+ items = [];
80
+ constructor(type) {
81
+ this.type = type;
82
+ return this;
83
+ }
84
+ add(item) {
85
+ if (!item) {
86
+ return this;
87
+ }
88
+ if (Array.isArray(item)) {
89
+ item.filter(Boolean).forEach((it) => this.items.push(it));
90
+ return this;
91
+ }
92
+ this.items.push(item);
93
+ return this;
94
+ }
95
+ toString() {
96
+ const sortedData = naturalOrderby.orderBy(this.items.filter(Boolean), [(v) => !v.default, (v) => v.required ?? true], ["desc", "desc"]);
97
+ return sortedData.filter(({ enabled = true }) => enabled).reduce((acc, { name, type, required = true, ...rest }) => {
98
+ if (!name) {
99
+ acc.push(`${type}${rest.default ? ` = ${rest.default}` : ""}`);
100
+ return acc;
101
+ }
102
+ const parameterName = name.startsWith("{") ? name : changeCase.camelCase(name, { delimiter: "", transform: changeCase.camelCaseTransformMerge });
103
+ if (type) {
104
+ if (required) {
105
+ acc.push(`${parameterName}: ${type}${rest.default ? ` = ${rest.default}` : ""}`);
106
+ } else {
107
+ acc.push(`${parameterName}?: ${type}`);
108
+ }
109
+ } else {
110
+ acc.push(`${parameterName}`);
111
+ }
112
+ return acc;
113
+ }, []).join(", ");
114
+ }
73
115
  };
74
- function createLogger({ logLevel, name, spinner }) {
116
+
117
+ // src/utils/getUniqueName.ts
118
+ function getUniqueName(originalName, data) {
119
+ let used = data[originalName] || 0;
120
+ if (used) {
121
+ data[originalName] = ++used;
122
+ originalName += used;
123
+ }
124
+ data[originalName] = 1;
125
+ return originalName;
126
+ }
127
+
128
+ // src/utils/isPromise.ts
129
+ function isPromise(result) {
130
+ return typeof result?.then === "function";
131
+ }
132
+ function isPromiseFulfilledResult(result) {
133
+ return result.status === "fulfilled";
134
+ }
135
+ function isPromiseRejectedResult(result) {
136
+ return result.status === "rejected";
137
+ }
138
+
139
+ // src/utils/jsdoc.ts
140
+ function createJSDocBlockText({ comments }) {
141
+ const filteredComments = comments.filter(Boolean);
142
+ if (!filteredComments.length) {
143
+ return "";
144
+ }
145
+ return `/**
146
+ * ${filteredComments.join("\n * ")}
147
+ */`;
148
+ }
149
+ function createLogger(spinner) {
75
150
  const logs = [];
76
151
  const log = (message) => {
77
152
  if (message && spinner) {
@@ -97,8 +172,6 @@ function createLogger({ logLevel, name, spinner }) {
97
172
  }
98
173
  };
99
174
  const logger = {
100
- name,
101
- logLevel,
102
175
  log,
103
176
  error,
104
177
  warn,
@@ -108,6 +181,75 @@ function createLogger({ logLevel, name, spinner }) {
108
181
  };
109
182
  return logger;
110
183
  }
184
+
185
+ // src/utils/nameSorter.ts
186
+ function nameSorter(a, b) {
187
+ if (a.name < b.name) {
188
+ return -1;
189
+ }
190
+ if (a.name > b.name) {
191
+ return 1;
192
+ }
193
+ return 0;
194
+ }
195
+ var Queue = class {
196
+ #queue = [];
197
+ #workerCount = 0;
198
+ #maxParallel;
199
+ #debug = false;
200
+ constructor(maxParallel, debug = false) {
201
+ this.#maxParallel = maxParallel;
202
+ this.#debug = debug;
203
+ }
204
+ run(job, options = { controller: new AbortController(), name: crypto__default.default.randomUUID(), description: "" }) {
205
+ return new Promise((resolve, reject) => {
206
+ const item = { reject, resolve, job, name: options.name, description: options.description || options.name };
207
+ options.controller?.signal.addEventListener("abort", () => {
208
+ this.#queue = this.#queue.filter((queueItem) => queueItem.name === item.name);
209
+ reject("Aborted");
210
+ });
211
+ this.#queue.push(item);
212
+ this.#work();
213
+ });
214
+ }
215
+ runSync(job, options = { controller: new AbortController(), name: crypto__default.default.randomUUID(), description: "" }) {
216
+ new Promise((resolve, reject) => {
217
+ const item = { reject, resolve, job, name: options.name, description: options.description || options.name };
218
+ options.controller?.signal.addEventListener("abort", () => {
219
+ this.#queue = this.#queue.filter((queueItem) => queueItem.name === item.name);
220
+ });
221
+ this.#queue.push(item);
222
+ this.#work();
223
+ });
224
+ }
225
+ get hasJobs() {
226
+ return this.#workerCount > 0 || this.#queue.length > 0;
227
+ }
228
+ get count() {
229
+ return this.#workerCount;
230
+ }
231
+ #work() {
232
+ if (this.#workerCount >= this.#maxParallel) {
233
+ return;
234
+ }
235
+ this.#workerCount++;
236
+ let entry;
237
+ while (entry = this.#queue.shift()) {
238
+ const { reject, resolve, job, name, description } = entry;
239
+ if (this.#debug) {
240
+ perf_hooks.performance.mark(name + "_start");
241
+ }
242
+ job().then((result) => {
243
+ resolve(result);
244
+ if (this.#debug) {
245
+ perf_hooks.performance.mark(name + "_stop");
246
+ perf_hooks.performance.measure(description, name + "_start", name + "_stop");
247
+ }
248
+ }).catch((err) => reject(err));
249
+ }
250
+ this.#workerCount--;
251
+ }
252
+ };
111
253
  var defaultColours = ["black", "blue", "darkBlue", "cyan", "gray", "green", "darkGreen", "magenta", "red", "darkRed", "yellow", "darkYellow"];
112
254
  function randomColour(text, colours = defaultColours) {
113
255
  if (!text) {
@@ -134,22 +276,46 @@ function randomPicoColour(text, colors = defaultColours) {
134
276
  }
135
277
  return formatter(text);
136
278
  }
279
+ function slash(path3, platform = "linux") {
280
+ const isWindowsPath = /^\\\\\?\\/.test(path3);
281
+ if (["linux", "mac"].includes(platform) && !isWindowsPath) {
282
+ return path3.replaceAll(/\\/g, "/").replace("../", "").trimEnd();
283
+ }
284
+ return path3.replaceAll(/\\/g, "/").replace("../", "").trimEnd();
285
+ }
286
+ function getRelativePath(rootDir, filePath, platform = "linux") {
287
+ if (!rootDir || !filePath) {
288
+ throw new Error(`Root and file should be filled in when retrieving the relativePath, ${rootDir || ""} ${filePath || ""}`);
289
+ }
290
+ const relativePath = path2__default.default.relative(rootDir, filePath);
291
+ const path3 = slash(relativePath, platform);
292
+ if (path3.startsWith("../")) {
293
+ return path3.replace(path2__default.default.basename(path3), path2__default.default.basename(path3, path2__default.default.extname(filePath)));
294
+ }
295
+ return `./${path3.replace(path2__default.default.basename(path3), path2__default.default.basename(path3, path2__default.default.extname(filePath)))}`;
296
+ }
297
+ function getPathMode(path3) {
298
+ if (!path3) {
299
+ return "directory";
300
+ }
301
+ return path2__default.default.extname(path3) ? "file" : "directory";
302
+ }
137
303
  var reader = jsRuntime.switcher(
138
304
  {
139
- node: async (path5) => {
140
- return fs2__default.default.readFile(path5, { encoding: "utf8" });
305
+ node: async (path3) => {
306
+ return fs2__default.default.readFile(path3, { encoding: "utf8" });
141
307
  },
142
- bun: async (path5) => {
143
- const file = Bun.file(path5);
308
+ bun: async (path3) => {
309
+ const file = Bun.file(path3);
144
310
  return file.text();
145
311
  }
146
312
  },
147
313
  "node"
148
314
  );
149
- jsRuntime.switcher(
315
+ var syncReader = jsRuntime.switcher(
150
316
  {
151
- node: (path5) => {
152
- return fs2__default.default.readFileSync(path5, { encoding: "utf8" });
317
+ node: (path3) => {
318
+ return fs2__default.default.readFileSync(path3, { encoding: "utf8" });
153
319
  },
154
320
  bun: () => {
155
321
  throw new Error("Bun cannot read sync");
@@ -157,116 +323,79 @@ jsRuntime.switcher(
157
323
  },
158
324
  "node"
159
325
  );
160
- async function read(path5) {
161
- return reader(path5);
326
+ async function read(path3) {
327
+ return reader(path3);
162
328
  }
163
- var URLPath = class {
164
- path;
165
- constructor(path5) {
166
- this.path = path5;
167
- return this;
168
- }
169
- /**
170
- * Convert Swagger path to URLPath(syntax of Express)
171
- * @example /pet/{petId} => /pet/:petId
172
- */
173
- get URL() {
174
- return this.toURLPath();
175
- }
176
- get isURL() {
177
- try {
178
- const url = new URL(this.path);
179
- if (url?.href) {
180
- return true;
181
- }
182
- } catch (error) {
183
- return false;
184
- }
185
- return false;
186
- }
187
- /**
188
- * Convert Swagger path to template literals/ template strings(camelcase)
189
- * @example /pet/{petId} => `/pet/${petId}`
190
- * @example /account/monetary-accountID => `/account/${monetaryAccountId}`
191
- * @example /account/userID => `/account/${userId}`
192
- */
193
- get template() {
194
- return this.toTemplateString();
195
- }
196
- get object() {
197
- return this.toObject();
198
- }
199
- get params() {
200
- return this.getParams();
201
- }
202
- toObject({ type = "path", replacer, stringify } = {}) {
203
- const object = {
204
- url: type === "path" ? this.toURLPath() : this.toTemplateString(replacer),
205
- params: this.getParams()
206
- };
207
- if (stringify) {
208
- if (type !== "template") {
209
- throw new Error("Type should be `template` when using stringiyf");
210
- }
211
- return JSON.stringify(object).replaceAll("'", "").replaceAll(`"`, "");
212
- }
213
- return object;
214
- }
215
- /**
216
- * Convert Swagger path to template literals/ template strings(camelcase)
217
- * @example /pet/{petId} => `/pet/${petId}`
218
- * @example /account/monetary-accountID => `/account/${monetaryAccountId}`
219
- * @example /account/userID => `/account/${userId}`
220
- */
221
- toTemplateString(replacer) {
222
- const regex = /{(\w|-)*}/g;
223
- const found = this.path.match(regex);
224
- let newPath = this.path.replaceAll("{", "${");
225
- if (found) {
226
- newPath = found.reduce((prev, curr) => {
227
- const pathParam = replacer ? replacer(changeCase.camelCase(curr, { delimiter: "", transform: changeCase.camelCaseTransformMerge })) : changeCase.camelCase(curr, { delimiter: "", transform: changeCase.camelCaseTransformMerge });
228
- const replacement = `\${${pathParam}}`;
229
- return prev.replace(curr, replacement);
230
- }, this.path);
329
+ function readSync(path3) {
330
+ return syncReader(path3);
331
+ }
332
+
333
+ // src/utils/renderTemplate.ts
334
+ function renderTemplate(template, data = void 0) {
335
+ if (!data || !Object.keys(data).length) {
336
+ return template.replace(/{{(.*?)}}/g, "");
337
+ }
338
+ const matches = template.match(/{{(.*?)}}/g);
339
+ return matches?.reduce((prev, curr) => {
340
+ const index = curr.split(/{{|}}/).filter(Boolean)[0]?.trim();
341
+ if (index === void 0) {
342
+ return prev;
231
343
  }
232
- return `\`${newPath}\``;
233
- }
234
- getParams(replacer) {
235
- const regex = /{(\w|-)*}/g;
236
- const found = this.path.match(regex);
237
- if (!found) {
238
- return void 0;
344
+ const value = data[index];
345
+ if (value === void 0) {
346
+ return prev;
239
347
  }
240
- const params = {};
241
- found.forEach((item) => {
242
- item = item.replaceAll("{", "").replaceAll("}", "");
243
- const pathParam = replacer ? replacer(changeCase.camelCase(item, { delimiter: "", transform: changeCase.camelCaseTransformMerge })) : changeCase.camelCase(item, { delimiter: "", transform: changeCase.camelCaseTransformMerge });
244
- params[pathParam] = pathParam;
245
- }, this.path);
246
- return params;
247
- }
248
- /**
249
- * Convert Swagger path to URLPath(syntax of Express)
250
- * @example /pet/{petId} => /pet/:petId
251
- */
252
- toURLPath() {
253
- return this.path.replaceAll("{", ":").replaceAll("}", "");
348
+ return prev.replace(curr, () => {
349
+ if (typeof value === "boolean") {
350
+ return `${value.toString()}` || "false";
351
+ }
352
+ return value || "";
353
+ }).trim();
354
+ }, template) || "";
355
+ }
356
+
357
+ // src/utils/SummaryError.ts
358
+ var SummaryError = class extends Error {
359
+ summary;
360
+ constructor(message, options) {
361
+ super(message, { cause: options.cause });
362
+ this.name = "SummaryError";
363
+ this.summary = options.summary || [];
254
364
  }
255
365
  };
256
366
 
257
- // src/config.ts
258
- function defineConfig(options) {
259
- return options;
260
- }
261
- function isInputPath(result) {
262
- return !!result && "path" in result;
263
- }
367
+ // src/utils/throttle.ts
368
+ var throttle = (fn, delay) => {
369
+ let wait = false;
370
+ let timeout2;
371
+ let cancelled = false;
372
+ return [
373
+ (...args) => {
374
+ if (cancelled) {
375
+ return void 0;
376
+ }
377
+ if (wait) {
378
+ return void 0;
379
+ }
380
+ const val = fn(...args);
381
+ wait = true;
382
+ timeout2 = setTimeout(() => {
383
+ wait = false;
384
+ }, delay);
385
+ return val;
386
+ },
387
+ () => {
388
+ cancelled = true;
389
+ clearTimeout(timeout2);
390
+ }
391
+ ];
392
+ };
264
393
 
265
394
  // src/utils/timeout.ts
266
395
  async function timeout(ms) {
267
- return new Promise((resolve2) => {
396
+ return new Promise((resolve) => {
268
397
  setTimeout(() => {
269
- resolve2(true);
398
+ resolve(true);
270
399
  }, ms);
271
400
  });
272
401
  }
@@ -276,17 +405,6 @@ function combineCodes(codes) {
276
405
  return codes.join("\n");
277
406
  }
278
407
 
279
- // src/utils/transformers/createJSDocBlockText.ts
280
- function createJSDocBlockText({ comments }) {
281
- const filteredComments = comments.filter(Boolean);
282
- if (!filteredComments.length) {
283
- return "";
284
- }
285
- return `/**
286
- * ${filteredComments.join("\n * ")}
287
- */`;
288
- }
289
-
290
408
  // src/utils/transformers/escape.ts
291
409
  function escape(text) {
292
410
  return text ? text.replaceAll("`", "\\`") : "";
@@ -312,39 +430,6 @@ function jsStringEscape(input) {
312
430
  });
313
431
  }
314
432
 
315
- // src/utils/transformers/indent.ts
316
- function createIndent(size) {
317
- return Array.from({ length: size + 1 }).join(" ");
318
- }
319
-
320
- // src/utils/transformers/nameSorter.ts
321
- function nameSorter(a, b) {
322
- if (a.name < b.name) {
323
- return -1;
324
- }
325
- if (a.name > b.name) {
326
- return 1;
327
- }
328
- return 0;
329
- }
330
-
331
- // src/utils/transformers/searchAndReplace.ts
332
- function searchAndReplace(options) {
333
- const { text, replaceBy, prefix = "", key } = options;
334
- const searchValues = options.searchValues?.(prefix, key) || [
335
- `${prefix}["${key}"]`,
336
- `${prefix}['${key}']`,
337
- `${prefix}[\`${key}\`]`,
338
- `${prefix}"${key}"`,
339
- `${prefix}'${key}'`,
340
- `${prefix}\`${key}\``,
341
- new RegExp(`${prefix}${key}`, "g")
342
- ];
343
- return searchValues.reduce((prev, searchValue) => {
344
- return prev.toString().replaceAll(searchValue, replaceBy);
345
- }, text);
346
- }
347
-
348
433
  // src/utils/transformers/transformReservedWord.ts
349
434
  var reservedWords = [
350
435
  "abstract",
@@ -437,80 +522,6 @@ function transformReservedWord(word) {
437
522
  }
438
523
  return word;
439
524
  }
440
-
441
- // src/utils/transformers/index.ts
442
- var transformers = {
443
- combineCodes,
444
- escape,
445
- jsStringEscape,
446
- createIndent,
447
- transformReservedWord,
448
- nameSorter,
449
- searchAndReplace,
450
- JSDoc: {
451
- createJSDocBlockText
452
- }
453
- };
454
- async function saveCreateDirectory(path5) {
455
- const passedPath = path4.dirname(path4.resolve(path5));
456
- await fs2__default.default.mkdir(passedPath, { recursive: true });
457
- }
458
- var writer = jsRuntime.switcher(
459
- {
460
- node: async (path5, data) => {
461
- try {
462
- await fs2__default.default.stat(path4.resolve(path5));
463
- const oldContent = await fs2__default.default.readFile(path4.resolve(path5), { encoding: "utf-8" });
464
- if (oldContent?.toString() === data?.toString()) {
465
- return;
466
- }
467
- } catch (_err) {
468
- }
469
- await saveCreateDirectory(path5);
470
- await fs2__default.default.writeFile(path4.resolve(path5), data, { encoding: "utf-8" });
471
- const savedData = await fs2__default.default.readFile(path4.resolve(path5), { encoding: "utf-8" });
472
- if (savedData?.toString() !== data?.toString()) {
473
- throw new Error(`Sanity check failed for ${path5}
474
-
475
- Data[${data.length}]:
476
- ${data}
477
-
478
- Saved[${savedData.length}]:
479
- ${savedData}
480
- `);
481
- }
482
- return savedData;
483
- },
484
- bun: async (path5, data) => {
485
- try {
486
- await saveCreateDirectory(path5);
487
- await Bun.write(path4.resolve(path5), data);
488
- const file = Bun.file(path4.resolve(path5));
489
- const savedData = await file.text();
490
- if (savedData?.toString() !== data?.toString()) {
491
- throw new Error(`Sanity check failed for ${path5}
492
-
493
- Data[${data.length}]:
494
- ${data}
495
-
496
- Saved[${savedData.length}]:
497
- ${savedData}
498
- `);
499
- }
500
- return savedData;
501
- } catch (e) {
502
- console.log(e, path4.resolve(path5));
503
- }
504
- }
505
- },
506
- "node"
507
- );
508
- async function write(data, path5) {
509
- if (data.trim() === "") {
510
- return void 0;
511
- }
512
- return writer(path5, data.trim());
513
- }
514
525
  var TreeNode = class _TreeNode {
515
526
  data;
516
527
  parent;
@@ -575,16 +586,16 @@ var TreeNode = class _TreeNode {
575
586
  }
576
587
  return this;
577
588
  }
578
- static build(path5, options = {}) {
589
+ static build(path3, options = {}) {
579
590
  try {
580
591
  const exclude = Array.isArray(options.exclude) ? options.exclude : [options.exclude].filter(Boolean);
581
- const filteredTree = dirTree__default.default(path5, { extensions: options.extensions, exclude: [/node_modules/, ...exclude] });
592
+ const filteredTree = dirTree__default.default(path3, { extensions: options.extensions, exclude: [/node_modules/, ...exclude] });
582
593
  if (!filteredTree) {
583
594
  return null;
584
595
  }
585
- const treeNode = new _TreeNode({ name: filteredTree.name, path: filteredTree.path, type: filteredTree.type || FileManager.getMode(filteredTree.path) });
596
+ const treeNode = new _TreeNode({ name: filteredTree.name, path: filteredTree.path, type: filteredTree.type || getPathMode(filteredTree.path) });
586
597
  const recurse = (node, item) => {
587
- const subNode = node.addChild({ name: item.name, path: item.path, type: item.type || FileManager.getMode(item.path) });
598
+ const subNode = node.addChild({ name: item.name, path: item.path, type: item.type || getPathMode(item.path) });
588
599
  if (item.children?.length) {
589
600
  item.children?.forEach((child) => {
590
601
  recurse(subNode, child);
@@ -599,271 +610,227 @@ var TreeNode = class _TreeNode {
599
610
  }
600
611
  };
601
612
 
602
- // src/BarrelManager.ts
603
- var BarrelManager = class {
604
- #options = {};
605
- constructor(options = {}) {
606
- this.#options = options;
613
+ // src/utils/uniqueIdFactory.ts
614
+ var uniqueIdFactory = (counter) => (str = "") => `${str}${++counter}`;
615
+ var URLPath = class {
616
+ path;
617
+ constructor(path3) {
618
+ this.path = path3;
607
619
  return this;
608
620
  }
609
- getIndexes(root, extName) {
610
- const { treeNode = {}, isTypeOnly, filter, map, output, includeExt } = this.#options;
611
- const extMapper = {
612
- ".ts": {
613
- extensions: /\.ts/,
614
- exclude: [/schemas/, /json/]
615
- },
616
- ".json": {
617
- extensions: /\.json/,
618
- exclude: []
621
+ /**
622
+ * Convert Swagger path to URLPath(syntax of Express)
623
+ * @example /pet/{petId} => /pet/:petId
624
+ */
625
+ get URL() {
626
+ return this.toURLPath();
627
+ }
628
+ get isURL() {
629
+ try {
630
+ const url = new URL(this.path);
631
+ if (url?.href) {
632
+ return true;
619
633
  }
620
- };
621
- const tree = TreeNode.build(root, { ...extMapper[extName] || {}, ...treeNode });
622
- if (!tree) {
623
- return null;
634
+ } catch (error) {
635
+ return false;
624
636
  }
625
- const fileReducer = (files2, currentTree) => {
626
- if (!currentTree.children) {
627
- return [];
628
- }
629
- if (currentTree.children?.length > 1) {
630
- const indexPath = path4__default.default.resolve(currentTree.data.path, "index.ts");
631
- const exports = currentTree.children.filter(Boolean).map((file) => {
632
- const importPath = file.data.type === "directory" ? `./${file.data.name}` : `./${file.data.name.replace(/\.[^.]*$/, "")}`;
633
- if (importPath.includes("index") && indexPath.includes("index")) {
634
- return void 0;
635
- }
636
- return {
637
- path: includeExt ? file.data.type === "directory" ? `${importPath}/index${extName}` : `${importPath}${extName}` : importPath,
638
- isTypeOnly
639
- };
640
- }).filter(Boolean);
641
- files2.push({
642
- path: indexPath,
643
- baseName: "index.ts",
644
- source: "",
645
- exports: output ? exports?.filter((item) => {
646
- return item.path.endsWith(output.replace(/\.[^.]*$/, ""));
647
- }) : exports
648
- });
649
- } else {
650
- currentTree.children?.forEach((child) => {
651
- const indexPath = path4__default.default.resolve(currentTree.data.path, "index.ts");
652
- const importPath = child.data.type === "directory" ? `./${child.data.name}` : `./${child.data.name.replace(/\.[^.]*$/, "")}`;
653
- const exports = [
654
- {
655
- path: includeExt ? child.data.type === "directory" ? `${importPath}/index${extName}` : `${importPath}${extName}` : importPath,
656
- isTypeOnly
657
- }
658
- ];
659
- files2.push({
660
- path: indexPath,
661
- baseName: "index.ts",
662
- source: "",
663
- exports: output ? exports?.filter((item) => {
664
- return item.path.endsWith(output.replace(/\.[^.]*$/, ""));
665
- }) : exports
666
- });
667
- });
668
- }
669
- currentTree.children.forEach((childItem) => {
670
- fileReducer(files2, childItem);
671
- });
672
- return files2;
673
- };
674
- const files = fileReducer([], tree).reverse();
675
- const filteredFiles = filter ? files.filter(filter) : files;
676
- return map ? filteredFiles.map(map) : filteredFiles;
637
+ return false;
677
638
  }
678
- };
679
-
680
- // src/FileManager.ts
681
- var FileManager = class _FileManager {
682
- #cache = /* @__PURE__ */ new Map();
683
- #task;
684
- #isWriting = false;
685
639
  /**
686
- * Timeout between writes
640
+ * Convert Swagger path to template literals/ template strings(camelcase)
641
+ * @example /pet/{petId} => `/pet/${petId}`
642
+ * @example /account/monetary-accountID => `/account/${monetaryAccountId}`
643
+ * @example /account/userID => `/account/${userId}`
687
644
  */
688
- #timeout = 0;
689
- #queue;
690
- constructor(options) {
691
- if (options) {
692
- this.#task = options.task;
693
- this.#queue = options.queue;
694
- this.#timeout = options.timeout || 0;
695
- }
696
- return this;
697
- }
698
- get files() {
699
- const files = [];
700
- this.#cache.forEach((item) => {
701
- files.push(...item.flat(1));
702
- });
703
- return files;
645
+ get template() {
646
+ return this.toTemplateString();
704
647
  }
705
- get isExecuting() {
706
- return this.#queue?.hasJobs ?? this.#isWriting ?? false;
648
+ get object() {
649
+ return this.toObject();
707
650
  }
708
- #validate(file) {
709
- if (!file.validate) {
710
- return;
711
- }
712
- if (!file.path.toLowerCase().endsWith(file.baseName.toLowerCase())) {
713
- throw new Error(`${file.path} should end with the baseName ${file.baseName}`);
714
- }
651
+ get params() {
652
+ return this.getParams();
715
653
  }
716
- async add(...files) {
717
- const promises = files.map((file) => {
718
- this.#validate(file);
719
- if (file.override) {
720
- return this.#add(file);
654
+ toObject({ type = "path", replacer, stringify } = {}) {
655
+ const object = {
656
+ url: type === "path" ? this.toURLPath() : this.toTemplateString(replacer),
657
+ params: this.getParams()
658
+ };
659
+ if (stringify) {
660
+ if (type !== "template") {
661
+ throw new Error("Type should be `template` when using stringiyf");
721
662
  }
722
- return this.#addOrAppend(file);
723
- });
724
- const resolvedFiles = await Promise.all(promises);
725
- if (files.length > 1) {
726
- return resolvedFiles;
727
- }
728
- return resolvedFiles[0];
729
- }
730
- async #add(file) {
731
- const controller = new AbortController();
732
- const resolvedFile = { id: crypto2__default.default.randomUUID(), ...file };
733
- this.#cache.set(resolvedFile.path, [{ cancel: () => controller.abort(), ...resolvedFile }]);
734
- if (this.#queue) {
735
- await this.#queue.run(
736
- async () => {
737
- return this.#task?.(resolvedFile);
738
- },
739
- { controller }
740
- );
663
+ return JSON.stringify(object).replaceAll("'", "").replaceAll(`"`, "");
741
664
  }
742
- return resolvedFile;
665
+ return object;
743
666
  }
744
- async #addOrAppend(file) {
745
- const previousCaches = this.#cache.get(file.path);
746
- const previousCache = previousCaches ? previousCaches.at(previousCaches.length - 1) : void 0;
747
- if (previousCache) {
748
- this.#cache.delete(previousCache.path);
749
- return this.#add({
750
- ...file,
751
- source: previousCache.source && file.source ? `${previousCache.source}
752
- ${file.source}` : "",
753
- imports: [...previousCache.imports || [], ...file.imports || []],
754
- exports: [...previousCache.exports || [], ...file.exports || []],
755
- env: { ...previousCache.env || {}, ...file.env || {} }
756
- });
667
+ /**
668
+ * Convert Swagger path to template literals/ template strings(camelcase)
669
+ * @example /pet/{petId} => `/pet/${petId}`
670
+ * @example /account/monetary-accountID => `/account/${monetaryAccountId}`
671
+ * @example /account/userID => `/account/${userId}`
672
+ */
673
+ toTemplateString(replacer) {
674
+ const regex = /{(\w|-)*}/g;
675
+ const found = this.path.match(regex);
676
+ let newPath = this.path.replaceAll("{", "${");
677
+ if (found) {
678
+ newPath = found.reduce((prev, curr) => {
679
+ const pathParam = replacer ? replacer(changeCase.camelCase(curr, { delimiter: "", transform: changeCase.camelCaseTransformMerge })) : changeCase.camelCase(curr, { delimiter: "", transform: changeCase.camelCaseTransformMerge });
680
+ const replacement = `\${${pathParam}}`;
681
+ return prev.replace(curr, replacement);
682
+ }, this.path);
757
683
  }
758
- return this.#add(file);
684
+ return `\`${newPath}\``;
759
685
  }
760
- async addIndexes({ root, extName = ".ts", meta, options = {} }) {
761
- const barrelManager = new BarrelManager(options);
762
- const files = barrelManager.getIndexes(root, extName);
763
- if (!files) {
686
+ getParams(replacer) {
687
+ const regex = /{(\w|-)*}/g;
688
+ const found = this.path.match(regex);
689
+ if (!found) {
764
690
  return void 0;
765
691
  }
766
- return await Promise.all(
767
- files.map((file) => {
768
- return this.#addOrAppend({
769
- ...file,
770
- meta: meta ? meta : file.meta
771
- });
772
- })
773
- );
692
+ const params = {};
693
+ found.forEach((item) => {
694
+ item = item.replaceAll("{", "").replaceAll("}", "");
695
+ const pathParam = replacer ? replacer(changeCase.camelCase(item, { delimiter: "", transform: changeCase.camelCaseTransformMerge })) : changeCase.camelCase(item, { delimiter: "", transform: changeCase.camelCaseTransformMerge });
696
+ params[pathParam] = pathParam;
697
+ }, this.path);
698
+ return params;
774
699
  }
775
- getCacheByUUID(UUID) {
776
- let cache;
777
- this.#cache.forEach((files) => {
778
- cache = files.find((item) => item.id === UUID);
779
- });
780
- return cache;
700
+ /**
701
+ * Convert Swagger path to URLPath(syntax of Express)
702
+ * @example /pet/{petId} => /pet/:petId
703
+ */
704
+ toURLPath() {
705
+ return this.path.replaceAll("{", ":").replaceAll("}", "");
781
706
  }
782
- get(path5) {
783
- return this.#cache.get(path5);
707
+ };
708
+
709
+ // src/utils/Warning.ts
710
+ var Warning = class extends Error {
711
+ constructor(message, options) {
712
+ super(message, { cause: options?.cause });
713
+ this.name = "Warning";
784
714
  }
785
- remove(path5) {
786
- const cacheItem = this.get(path5);
787
- if (!cacheItem) {
788
- return;
715
+ };
716
+ async function saveCreateDirectory(path3) {
717
+ const passedPath = path2__default.default.dirname(path2__default.default.resolve(path3));
718
+ await fs2__default.default.mkdir(passedPath, { recursive: true });
719
+ }
720
+ var writer = jsRuntime.switcher(
721
+ {
722
+ node: async (path3, data) => {
723
+ try {
724
+ await fs2__default.default.stat(path3);
725
+ const oldContent = await fs2__default.default.readFile(path3, { encoding: "utf-8" });
726
+ if (oldContent?.toString() === data) {
727
+ return;
728
+ }
729
+ } catch (_err) {
730
+ }
731
+ await saveCreateDirectory(path3);
732
+ return fs2__default.default.writeFile(path2__default.default.resolve(path3), data, { encoding: "utf-8" });
733
+ },
734
+ bun: async (path3, data) => {
735
+ try {
736
+ await saveCreateDirectory(path3);
737
+ await Bun.write(path2__default.default.resolve(path3), data);
738
+ } catch (e) {
739
+ console.log(e, path2__default.default.resolve(path3));
740
+ }
789
741
  }
790
- this.#cache.delete(path5);
791
- }
792
- async write(...params) {
793
- if (!this.#isWriting) {
794
- this.#isWriting = true;
795
- const text = await write(...params);
796
- this.#isWriting = false;
797
- return text;
742
+ },
743
+ "node"
744
+ );
745
+ async function write(data, path3) {
746
+ return writer(path3, data);
747
+ }
748
+ function getIndexes(root, extName, options = {}) {
749
+ const extMapper = {
750
+ ".ts": {
751
+ extensions: /\.ts/,
752
+ exclude: [/schemas/, /json/]
753
+ },
754
+ ".json": {
755
+ extensions: /\.json/,
756
+ exclude: []
798
757
  }
799
- await timeout(this.#timeout);
800
- return this.write(...params);
801
- }
802
- async read(...params) {
803
- return read(...params);
758
+ };
759
+ const tree = TreeNode.build(root, { ...extMapper[extName] || {}, ...options });
760
+ if (!tree) {
761
+ return null;
804
762
  }
805
- // statics
806
- static getSource(file) {
807
- if (!_FileManager.isExtensionAllowed(file.baseName)) {
808
- return file.source;
763
+ const fileReducer = (files2, currentTree) => {
764
+ if (!currentTree.children) {
765
+ return [];
809
766
  }
810
- const exports = file.exports ? combineExports(file.exports) : [];
811
- const imports = file.imports ? combineImports(file.imports, exports, file.source) : [];
812
- const importNodes = imports.map((item) => factory__namespace.createImportDeclaration({ name: item.name, path: item.path, isTypeOnly: item.isTypeOnly }));
813
- const exportNodes = exports.map(
814
- (item) => factory__namespace.createExportDeclaration({ name: item.name, path: item.path, isTypeOnly: item.isTypeOnly, asAlias: item.asAlias })
815
- );
816
- return [parser.print([...importNodes, ...exportNodes]), getEnvSource(file.source, file.env)].join("\n");
817
- }
818
- static combineFiles(files) {
819
- return files.filter(Boolean).reduce((acc, file) => {
820
- const prevIndex = acc.findIndex((item) => item.path === file.path);
821
- if (prevIndex === -1) {
822
- return [...acc, file];
823
- }
767
+ if (currentTree.children?.length > 1) {
768
+ const path3 = path2__default.default.resolve(currentTree.data.path, "index.ts");
769
+ const exports = currentTree.children.map((file) => {
770
+ if (!file) {
771
+ return void 0;
772
+ }
773
+ const importPath = file.data.type === "directory" ? `./${file.data.name}` : `./${file.data.name.replace(/\.[^.]*$/, "")}`;
774
+ if (importPath.includes("index") && path3.includes("index")) {
775
+ return void 0;
776
+ }
777
+ return { path: importPath };
778
+ }).filter(Boolean);
779
+ files2.push({
780
+ path: path3,
781
+ baseName: "index.ts",
782
+ source: "",
783
+ exports
784
+ });
785
+ } else {
786
+ currentTree.children?.forEach((child) => {
787
+ const path3 = path2__default.default.resolve(currentTree.data.path, "index.ts");
788
+ const importPath = child.data.type === "directory" ? `./${child.data.name}` : `./${child.data.name.replace(/\.[^.]*$/, "")}`;
789
+ files2.push({
790
+ path: path3,
791
+ baseName: "index.ts",
792
+ source: "",
793
+ exports: [{ path: importPath }]
794
+ });
795
+ });
796
+ }
797
+ currentTree.children.forEach((childItem) => {
798
+ fileReducer(files2, childItem);
799
+ });
800
+ return files2;
801
+ };
802
+ const files = fileReducer([], tree);
803
+ return files;
804
+ }
805
+ function combineFiles(files) {
806
+ return files.filter(Boolean).reduce((acc, curr) => {
807
+ const prevIndex = acc.findIndex((item) => item.path === curr.path);
808
+ if (prevIndex !== -1) {
824
809
  const prev = acc[prevIndex];
825
- if (prev && file.override) {
826
- acc[prevIndex] = {
827
- imports: [],
828
- exports: [],
829
- ...file
830
- };
831
- return acc;
832
- }
833
810
  if (prev) {
834
811
  acc[prevIndex] = {
835
- ...file,
836
- source: prev.source && file.source ? `${prev.source}
837
- ${file.source}` : "",
838
- imports: [...prev.imports || [], ...file.imports || []],
839
- exports: [...prev.exports || [], ...file.exports || []],
840
- env: { ...prev.env || {}, ...file.env || {} }
812
+ ...curr,
813
+ source: prev.source && curr.source ? `${prev.source}
814
+ ${curr.source}` : "",
815
+ imports: [...prev.imports || [], ...curr.imports || []],
816
+ exports: [...prev.exports || [], ...curr.exports || []],
817
+ env: { ...prev.env || {}, ...curr.env || {} }
841
818
  };
842
819
  }
843
- return acc;
844
- }, []);
845
- }
846
- static getMode(path5) {
847
- if (!path5) {
848
- return "directory";
820
+ } else {
821
+ acc.push(curr);
849
822
  }
850
- return path4.extname(path5) ? "file" : "directory";
851
- }
852
- static get extensions() {
853
- return [".js", ".ts", ".tsx"];
854
- }
855
- static isExtensionAllowed(baseName) {
856
- return _FileManager.extensions.some((extension) => baseName.endsWith(extension));
857
- }
858
- };
823
+ return acc;
824
+ }, []);
825
+ }
826
+ var extensions = [".js", ".ts", ".tsx"];
827
+ function isExtensionAllowed(baseName) {
828
+ return extensions.some((extension) => baseName.endsWith(extension));
829
+ }
859
830
  function combineExports(exports) {
860
- const combinedExports = naturalOrderby.orderBy(exports, [(v) => !v.isTypeOnly], ["asc"]).reduce((prev, curr) => {
831
+ return exports.reduce((prev, curr) => {
861
832
  const name = curr.name;
862
833
  const prevByPath = prev.findLast((imp) => imp.path === curr.path);
863
- const prevByPathAndIsTypeOnly = prev.findLast((imp) => imp.path === curr.path && isEqual__default.default(imp.name, name) && imp.isTypeOnly);
864
- if (prevByPathAndIsTypeOnly) {
865
- return prev;
866
- }
867
834
  const uniquePrev = prev.findLast(
868
835
  (imp) => imp.path === curr.path && isEqual__default.default(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly && imp.asAlias === curr.asAlias
869
836
  );
@@ -885,16 +852,12 @@ function combineExports(exports) {
885
852
  }
886
853
  return [...prev, curr];
887
854
  }, []);
888
- return naturalOrderby.orderBy(combinedExports, [(v) => !v.isTypeOnly, (v) => v.asAlias], ["desc", "desc"]);
889
855
  }
890
856
  function combineImports(imports, exports, source) {
891
- const combinedImports = naturalOrderby.orderBy(imports, [(v) => !v.isTypeOnly], ["asc"]).reduce((prev, curr) => {
857
+ return imports.reduce((prev, curr) => {
892
858
  let name = Array.isArray(curr.name) ? [...new Set(curr.name)] : curr.name;
893
859
  const hasImportInSource = (importName) => {
894
- if (!source) {
895
- return true;
896
- }
897
- const checker = (name2) => name2 && !!source.includes(name2);
860
+ const checker = (name2) => name2 && !!source.includes(`${name2}`);
898
861
  return checker(importName) || exports.some(({ name: name2 }) => Array.isArray(name2) ? name2.some(checker) : checker(name2));
899
862
  };
900
863
  if (Array.isArray(name)) {
@@ -902,10 +865,6 @@ function combineImports(imports, exports, source) {
902
865
  }
903
866
  const prevByPath = prev.findLast((imp) => imp.path === curr.path && imp.isTypeOnly === curr.isTypeOnly);
904
867
  const uniquePrev = prev.findLast((imp) => imp.path === curr.path && isEqual__default.default(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly);
905
- const prevByPathNameAndIsTypeOnly = prev.findLast((imp) => imp.path === curr.path && isEqual__default.default(imp.name, name) && imp.isTypeOnly);
906
- if (prevByPathNameAndIsTypeOnly) {
907
- return prev;
908
- }
909
868
  if (uniquePrev || Array.isArray(name) && !name.length) {
910
869
  return prev;
911
870
  }
@@ -927,7 +886,43 @@ function combineImports(imports, exports, source) {
927
886
  }
928
887
  return [...prev, curr];
929
888
  }, []);
930
- return naturalOrderby.orderBy(combinedImports, [(v) => !v.isTypeOnly], ["desc"]);
889
+ }
890
+ function createFileSource(file) {
891
+ let { source } = file;
892
+ if (!isExtensionAllowed(file.baseName)) {
893
+ return file.source;
894
+ }
895
+ const exports = file.exports ? combineExports(file.exports) : [];
896
+ const imports = file.imports ? combineImports(file.imports, exports, source) : [];
897
+ const importNodes = imports.map((item) => parser.createImportDeclaration({ name: item.name, path: item.path, isTypeOnly: item.isTypeOnly }));
898
+ const importSource = parser.print(importNodes);
899
+ const exportNodes = exports.map((item) => parser.createExportDeclaration({ name: item.name, path: item.path, isTypeOnly: item.isTypeOnly, asAlias: item.asAlias }));
900
+ const exportSource = parser.print(exportNodes);
901
+ source = getEnvSource(file.source, file.env);
902
+ if (importSource) {
903
+ source = `${importSource}
904
+ ${source}`;
905
+ }
906
+ if (exportSource) {
907
+ source = `${exportSource}
908
+ ${source}`;
909
+ }
910
+ return source;
911
+ }
912
+ function searchAndReplace(options) {
913
+ const { text, replaceBy, prefix = "", key } = options;
914
+ const searchValues = options.searchValues?.(prefix, key) || [
915
+ `${prefix}["${key}"]`,
916
+ `${prefix}['${key}']`,
917
+ `${prefix}[\`${key}\`]`,
918
+ `${prefix}"${key}"`,
919
+ `${prefix}'${key}'`,
920
+ `${prefix}\`${key}\``,
921
+ new RegExp(`${prefix}${key}`, "g")
922
+ ];
923
+ return searchValues.reduce((prev, searchValue) => {
924
+ return prev.toString().replaceAll(searchValue, replaceBy);
925
+ }, text);
931
926
  }
932
927
  function getEnvSource(source, env) {
933
928
  if (!env) {
@@ -944,117 +939,127 @@ function getEnvSource(source, env) {
944
939
  throw new TypeError(`Environment should be in upperCase for ${key}`);
945
940
  }
946
941
  if (typeof replaceBy === "string") {
947
- prev = transformers.searchAndReplace({ text: prev.replaceAll(`process.env.${key}`, replaceBy), replaceBy, prefix: "process.env", key });
948
- prev = transformers.searchAndReplace({ text: prev.replaceAll(new RegExp(`(declare const).*
942
+ prev = searchAndReplace({ text: prev.replaceAll(`process.env.${key}`, replaceBy), replaceBy, prefix: "process.env", key });
943
+ prev = searchAndReplace({ text: prev.replaceAll(new RegExp(`(declare const).*
949
944
  `, "ig"), ""), replaceBy, key });
950
945
  }
951
946
  return prev;
952
947
  }, source);
953
948
  }
954
- var EventEmitter = class {
955
- constructor() {
956
- this.#emitter.setMaxListeners(100);
957
- }
958
- #emitter = new events.EventEmitter();
959
- emit(eventName, ...eventArg) {
960
- this.#emitter.emit(eventName, ...eventArg);
949
+
950
+ // src/managers/fileManager/FileManager.ts
951
+ var FileManager = class {
952
+ #cache = /* @__PURE__ */ new Map();
953
+ #task;
954
+ #queue;
955
+ constructor(options) {
956
+ if (options) {
957
+ this.#task = options.task;
958
+ this.#queue = options.queue;
959
+ }
960
+ return this;
961
961
  }
962
- on(eventName, handler) {
963
- this.#emitter.on(eventName, handler);
962
+ get extensions() {
963
+ return extensions;
964
964
  }
965
- off(eventName, handler) {
966
- this.#emitter.off(eventName, handler);
965
+ get files() {
966
+ const files = [];
967
+ this.#cache.forEach((item) => {
968
+ files.push(...item.flat(1));
969
+ });
970
+ return files;
967
971
  }
968
- removeAll() {
969
- this.#emitter.removeAllListeners();
972
+ get isExecuting() {
973
+ return this.#queue?.hasJobs ?? false;
970
974
  }
971
- };
972
- var Queue = class {
973
- #queue = [];
974
- eventEmitter = new EventEmitter();
975
- #workerCount = 0;
976
- #maxParallel;
977
- #debug = false;
978
- constructor(maxParallel, debug = false) {
979
- this.#maxParallel = maxParallel;
980
- this.#debug = debug;
975
+ async add(file) {
976
+ const controller = new AbortController();
977
+ const resolvedFile = { id: crypto__default.default.randomUUID(), ...file };
978
+ this.#cache.set(resolvedFile.path, [{ cancel: () => controller.abort(), ...resolvedFile }]);
979
+ if (this.#queue) {
980
+ try {
981
+ await this.#queue.run(
982
+ async () => {
983
+ return this.#task?.(resolvedFile);
984
+ },
985
+ { controller }
986
+ );
987
+ } catch {
988
+ return resolvedFile;
989
+ }
990
+ }
991
+ return resolvedFile;
981
992
  }
982
- run(job, options = { controller: new AbortController(), name: crypto2__default.default.randomUUID(), description: "" }) {
983
- return new Promise((resolve2, reject) => {
984
- const item = { reject, resolve: resolve2, job, name: options.name, description: options.description || options.name };
985
- options.controller?.signal.addEventListener("abort", () => {
986
- this.#queue = this.#queue.filter((queueItem) => queueItem.name === item.name);
987
- reject("Aborted");
993
+ async addOrAppend(file) {
994
+ const previousCaches = this.#cache.get(file.path);
995
+ const previousCache = previousCaches ? previousCaches.at(previousCaches.length - 1) : void 0;
996
+ if (previousCache) {
997
+ this.#cache.delete(previousCache.path);
998
+ return this.add({
999
+ ...file,
1000
+ source: previousCache.source && file.source ? `${previousCache.source}
1001
+ ${file.source}` : "",
1002
+ imports: [...previousCache.imports || [], ...file.imports || []],
1003
+ exports: [...previousCache.exports || [], ...file.exports || []],
1004
+ env: { ...previousCache.env || {}, ...file.env || {} }
988
1005
  });
989
- this.#queue.push(item);
990
- this.#work();
991
- });
1006
+ }
1007
+ return this.add(file);
992
1008
  }
993
- runSync(job, options = { controller: new AbortController(), name: crypto2__default.default.randomUUID(), description: "" }) {
994
- new Promise((resolve2, reject) => {
995
- const item = { reject, resolve: resolve2, job, name: options.name, description: options.description || options.name };
996
- options.controller?.signal.addEventListener("abort", () => {
997
- this.#queue = this.#queue.filter((queueItem) => queueItem.name === item.name);
998
- });
999
- this.#queue.push(item);
1000
- this.#work();
1001
- });
1009
+ async addIndexes(root, extName = ".ts", options = {}) {
1010
+ const files = await getIndexes(root, extName, options);
1011
+ if (!files) {
1012
+ return void 0;
1013
+ }
1014
+ return Promise.all(
1015
+ files.map((file) => {
1016
+ if (file.override) {
1017
+ return this.add(file);
1018
+ }
1019
+ return this.addOrAppend(file);
1020
+ })
1021
+ );
1002
1022
  }
1003
- get hasJobs() {
1004
- return this.#workerCount > 0 || this.#queue.length > 0;
1023
+ #append(path3, file) {
1024
+ const previousFiles = this.#cache.get(path3) || [];
1025
+ this.#cache.set(path3, [...previousFiles, file]);
1005
1026
  }
1006
- get count() {
1007
- return this.#workerCount;
1027
+ getCacheByUUID(UUID) {
1028
+ let cache;
1029
+ this.#cache.forEach((files) => {
1030
+ cache = files.find((item) => item.id === UUID);
1031
+ });
1032
+ return cache;
1008
1033
  }
1009
- #work() {
1010
- if (this.#workerCount >= this.#maxParallel) {
1034
+ get(path3) {
1035
+ return this.#cache.get(path3);
1036
+ }
1037
+ remove(path3) {
1038
+ const cacheItem = this.get(path3);
1039
+ if (!cacheItem) {
1011
1040
  return;
1012
1041
  }
1013
- this.#workerCount++;
1014
- let entry;
1015
- while (entry = this.#queue.shift()) {
1016
- const { reject, resolve: resolve2, job, name, description } = entry;
1017
- if (this.#debug) {
1018
- perf_hooks.performance.mark(name + "_start");
1019
- }
1020
- job().then((result) => {
1021
- this.eventEmitter.emit("jobDone", result);
1022
- resolve2(result);
1023
- if (this.#debug) {
1024
- perf_hooks.performance.mark(name + "_stop");
1025
- perf_hooks.performance.measure(description, name + "_start", name + "_stop");
1026
- }
1027
- }).catch((err) => {
1028
- this.eventEmitter.emit("jobFailed", err);
1029
- reject(err);
1042
+ this.#cache.delete(path3);
1043
+ }
1044
+ async write(...params) {
1045
+ if (this.#queue) {
1046
+ return this.#queue.run(async () => {
1047
+ return write(...params);
1030
1048
  });
1031
1049
  }
1032
- this.#workerCount--;
1033
- }
1034
- };
1035
-
1036
- // src/utils/uniqueName.ts
1037
- function setUniqueName(originalName, data) {
1038
- let used = data[originalName] || 0;
1039
- if (used) {
1040
- data[originalName] = ++used;
1041
- return originalName;
1050
+ return write(...params);
1042
1051
  }
1043
- data[originalName] = 1;
1044
- return originalName;
1045
- }
1046
-
1047
- // src/errors.ts
1048
- var PluginError = class extends Error {
1049
- pluginManager;
1050
- cause;
1051
- constructor(message, options) {
1052
- super(message, { cause: options.cause });
1053
- this.name = "PluginError";
1054
- this.cause = options.cause;
1055
- this.pluginManager = options.pluginManager;
1052
+ async read(...params) {
1053
+ if (this.#queue) {
1054
+ return this.#queue.run(async () => {
1055
+ return read(...params);
1056
+ });
1057
+ }
1058
+ return read(...params);
1056
1059
  }
1057
1060
  };
1061
+
1062
+ // src/managers/pluginManager/ParallelPluginError.ts
1058
1063
  var ParallelPluginError = class extends Error {
1059
1064
  errors = [];
1060
1065
  pluginManager;
@@ -1079,55 +1084,30 @@ var ParallelPluginError = class extends Error {
1079
1084
  })?.cause;
1080
1085
  }
1081
1086
  };
1082
- var SummaryError = class extends Error {
1083
- summary;
1087
+
1088
+ // src/managers/pluginManager/PluginError.ts
1089
+ var PluginError = class extends Error {
1090
+ pluginManager;
1091
+ cause;
1084
1092
  constructor(message, options) {
1085
1093
  super(message, { cause: options.cause });
1086
- this.name = "SummaryError";
1087
- this.summary = options.summary || [];
1088
- }
1089
- };
1090
- var Warning = class extends Error {
1091
- constructor(message, options) {
1092
- super(message, { cause: options?.cause });
1093
- this.name = "Warning";
1094
+ this.name = "PluginError";
1095
+ this.cause = options.cause;
1096
+ this.pluginManager = options.pluginManager;
1094
1097
  }
1095
1098
  };
1096
- var ValidationPluginError = class extends Error {
1097
- };
1098
-
1099
- // src/utils/cache.ts
1100
- function createPluginCache(Store = /* @__PURE__ */ Object.create(null)) {
1101
- return {
1102
- set(id, value) {
1103
- Store[id] = [0, value];
1104
- },
1105
- get(id) {
1106
- const item = Store[id];
1107
- if (!item) {
1108
- return null;
1109
- }
1110
- item[0] = 0;
1111
- return item[1];
1112
- },
1113
- has(id) {
1114
- const item = Store[id];
1115
- if (!item) {
1116
- return false;
1117
- }
1118
- item[0] = 0;
1119
- return true;
1120
- },
1121
- delete(id) {
1122
- return delete Store[id];
1123
- }
1124
- };
1125
- }
1126
-
1127
- // src/plugin.ts
1128
- function createPlugin(factory2) {
1099
+ function createPlugin(factory) {
1129
1100
  return (options) => {
1130
- return factory2(options);
1101
+ const plugin = factory(options);
1102
+ if (Array.isArray(plugin)) {
1103
+ throw new Error("Not implemented");
1104
+ }
1105
+ if (!plugin.transform) {
1106
+ plugin.transform = function transform(code) {
1107
+ return code;
1108
+ };
1109
+ }
1110
+ return plugin;
1131
1111
  };
1132
1112
  }
1133
1113
  var pluginName = "core";
@@ -1136,8 +1116,6 @@ var definePlugin = createPlugin((options) => {
1136
1116
  return {
1137
1117
  name: pluginName,
1138
1118
  options,
1139
- key: ["controller", "core"],
1140
- kind: "controller",
1141
1119
  api() {
1142
1120
  return {
1143
1121
  get config() {
@@ -1146,18 +1124,18 @@ var definePlugin = createPlugin((options) => {
1146
1124
  get plugins() {
1147
1125
  return options.getPlugins();
1148
1126
  },
1149
- get plugin() {
1150
- return options.plugin;
1151
- },
1152
1127
  logger,
1153
1128
  fileManager,
1154
1129
  pluginManager,
1155
1130
  async addFile(...files) {
1156
- const resolvedFiles = await fileManager.add(...files);
1157
- if (!Array.isArray(resolvedFiles)) {
1158
- return [resolvedFiles];
1159
- }
1160
- return resolvedFiles;
1131
+ return Promise.all(
1132
+ files.map((file) => {
1133
+ if (file.override) {
1134
+ return fileManager.add(file);
1135
+ }
1136
+ return fileManager.addOrAppend(file);
1137
+ })
1138
+ );
1161
1139
  },
1162
1140
  resolvePath,
1163
1141
  resolveName,
@@ -1165,55 +1143,63 @@ var definePlugin = createPlugin((options) => {
1165
1143
  };
1166
1144
  },
1167
1145
  resolvePath(baseName) {
1168
- const root = path4__default.default.resolve(this.config.root, this.config.output.path);
1169
- return path4__default.default.resolve(root, baseName);
1146
+ const root = path2__default.default.resolve(this.config.root, this.config.output.path);
1147
+ return path2__default.default.resolve(root, baseName);
1170
1148
  },
1171
1149
  resolveName(name) {
1172
1150
  return name;
1173
1151
  }
1174
1152
  };
1175
1153
  });
1176
-
1177
- // src/utils/executeStrategies.ts
1178
- function hookSeq(promises) {
1179
- return promises.reduce(
1180
- (promise, func) => {
1181
- if (!func || typeof func !== "function") {
1182
- throw new Error("HookSeq needs a function that returns a promise `() => Promise<unknown>`");
1183
- }
1184
- return promise.then((result) => {
1185
- const calledFunc = func();
1186
- if (calledFunc) {
1187
- return calledFunc.then(Array.prototype.concat.bind(result));
1188
- }
1189
- });
1190
- },
1191
- Promise.resolve([])
1192
- );
1193
- }
1194
-
1195
- // src/PromiseManager.ts
1196
- var PromiseManager = class {
1197
- #options = {};
1198
- constructor(options = {}) {
1199
- this.#options = options;
1200
- return this;
1154
+ var EventEmitter = class {
1155
+ constructor() {
1156
+ this.#emitter.setMaxListeners(100);
1201
1157
  }
1202
- run(strategy, promises) {
1203
- if (strategy === "seq") {
1204
- return hookSeq(promises);
1205
- }
1206
- throw new Error(`${strategy} not implemented`);
1158
+ #emitter = new events.EventEmitter();
1159
+ emit(eventName, ...eventArg) {
1160
+ this.#emitter.emit(eventName, ...eventArg);
1161
+ }
1162
+ on(eventName, handler) {
1163
+ this.#emitter.on(eventName, handler);
1164
+ }
1165
+ off(eventName, handler) {
1166
+ this.#emitter.off(eventName, handler);
1167
+ }
1168
+ removeAll() {
1169
+ this.#emitter.removeAllListeners();
1207
1170
  }
1208
1171
  };
1209
- function isPromise(result) {
1210
- return !!result && typeof result?.then === "function";
1211
- }
1212
- function isPromiseRejectedResult(result) {
1213
- return result.status === "rejected";
1172
+
1173
+ // src/managers/pluginManager/pluginParser.ts
1174
+ var usedPluginNames = {};
1175
+ function pluginParser(plugin, context) {
1176
+ const key = [plugin.kind, plugin.name, getUniqueName(plugin.name, usedPluginNames).split(plugin.name).at(1)];
1177
+ if (plugin.api && typeof plugin.api === "function") {
1178
+ const api = plugin.api.call(context);
1179
+ return {
1180
+ ...plugin,
1181
+ key,
1182
+ api
1183
+ };
1184
+ }
1185
+ return {
1186
+ ...plugin,
1187
+ key
1188
+ };
1214
1189
  }
1215
1190
 
1216
- // src/PluginManager.ts
1191
+ // src/managers/pluginManager/PluginManager.ts
1192
+ var hookNames = {
1193
+ validate: 1,
1194
+ buildStart: 1,
1195
+ resolvePath: 1,
1196
+ resolveName: 1,
1197
+ load: 1,
1198
+ transform: 1,
1199
+ writeFile: 1,
1200
+ buildEnd: 1
1201
+ };
1202
+ var hooks = Object.keys(hookNames);
1217
1203
  var PluginManager = class {
1218
1204
  plugins;
1219
1205
  fileManager;
@@ -1222,14 +1208,10 @@ var PluginManager = class {
1222
1208
  executed = [];
1223
1209
  logger;
1224
1210
  #core;
1225
- #usedPluginNames = {};
1226
- #promiseManager;
1227
1211
  constructor(config, options) {
1228
1212
  this.logger = options.logger;
1229
- this.queue = new Queue(100, this.logger.logLevel === LogLevel.debug);
1230
- this.fileManager = new FileManager({ task: options.task, queue: this.queue, timeout: options.writeTimeout });
1231
- this.#promiseManager = new PromiseManager();
1232
- const plugins = config.plugins || [];
1213
+ this.queue = new Queue(100, options.debug);
1214
+ this.fileManager = new FileManager({ task: options.task, queue: this.queue });
1233
1215
  const core = definePlugin({
1234
1216
  config,
1235
1217
  logger: this.logger,
@@ -1237,29 +1219,23 @@ var PluginManager = class {
1237
1219
  fileManager: this.fileManager,
1238
1220
  resolvePath: this.resolvePath.bind(this),
1239
1221
  resolveName: this.resolveName.bind(this),
1240
- getPlugins: this.#getSortedPlugins.bind(this)
1241
- });
1242
- this.#core = this.#parse(core, this, core.api.call(null));
1243
- this.plugins = [this.#core, ...plugins].map((plugin) => {
1244
- return this.#parse(plugin, this, this.#core.api);
1222
+ getPlugins: this.#getSortedPlugins.bind(this),
1223
+ plugin: void 0
1245
1224
  });
1225
+ this.#core = pluginParser(core, core.api.call(null));
1226
+ this.plugins = [this.#core, ...config.plugins || []].reduce((prev, plugin) => {
1227
+ const convertedApi = pluginParser(plugin, this.#core?.api);
1228
+ return [...prev, convertedApi];
1229
+ }, []);
1246
1230
  return this;
1247
1231
  }
1248
1232
  resolvePath = (params) => {
1249
- if (params.pluginKey) {
1250
- const paths = this.hookForPluginSync({
1251
- pluginKey: params.pluginKey,
1233
+ if (params.pluginName) {
1234
+ return this.hookForPluginSync({
1235
+ pluginName: params.pluginName,
1252
1236
  hookName: "resolvePath",
1253
1237
  parameters: [params.baseName, params.directory, params.options]
1254
1238
  });
1255
- if (paths && paths?.length > 1) {
1256
- throw new Error(
1257
- `Cannot return a path where the 'pluginKey' ${params.pluginKey ? JSON.stringify(params.pluginKey) : '"'} is not unique enough
1258
-
1259
- Paths: ${JSON.stringify(paths, void 0, 2)}`
1260
- );
1261
- }
1262
- return paths?.at(0);
1263
1239
  }
1264
1240
  return this.hookFirstSync({
1265
1241
  hookName: "resolvePath",
@@ -1267,20 +1243,13 @@ Paths: ${JSON.stringify(paths, void 0, 2)}`
1267
1243
  }).result;
1268
1244
  };
1269
1245
  resolveName = (params) => {
1270
- if (params.pluginKey) {
1271
- const names = this.hookForPluginSync({
1272
- pluginKey: params.pluginKey,
1246
+ if (params.pluginName) {
1247
+ const name2 = this.hookForPluginSync({
1248
+ pluginName: params.pluginName,
1273
1249
  hookName: "resolveName",
1274
1250
  parameters: [params.name, params.type]
1275
1251
  });
1276
- if (names && names?.length > 1) {
1277
- throw new Error(
1278
- `Cannot return a name where the 'pluginKey' ${params.pluginKey ? JSON.stringify(params.pluginKey) : '"'} is not unique enough
1279
-
1280
- Names: ${JSON.stringify(names, void 0, 2)}`
1281
- );
1282
- }
1283
- return transformReservedWord(names?.at(0) || params.name);
1252
+ return transformReservedWord(name2 || params.name);
1284
1253
  }
1285
1254
  const name = this.hookFirstSync({
1286
1255
  hookName: "resolveName",
@@ -1295,35 +1264,30 @@ Names: ${JSON.stringify(names, void 0, 2)}`
1295
1264
  * Run only hook for a specific plugin name
1296
1265
  */
1297
1266
  hookForPlugin({
1298
- pluginKey,
1267
+ pluginName: pluginName2,
1299
1268
  hookName,
1300
1269
  parameters
1301
1270
  }) {
1302
- const plugins = this.getPluginsByKey(hookName, pluginKey);
1303
- const promises = plugins.map((plugin) => {
1304
- return this.#execute({
1305
- strategy: "hookFirst",
1306
- hookName,
1307
- parameters,
1308
- plugin
1309
- });
1310
- }).filter(Boolean);
1311
- return Promise.all(promises);
1271
+ const plugin = this.getPlugin(hookName, pluginName2);
1272
+ return this.#execute({
1273
+ strategy: "hookFirst",
1274
+ hookName,
1275
+ parameters,
1276
+ plugin
1277
+ });
1312
1278
  }
1313
1279
  hookForPluginSync({
1314
- pluginKey,
1280
+ pluginName: pluginName2,
1315
1281
  hookName,
1316
1282
  parameters
1317
1283
  }) {
1318
- const plugins = this.getPluginsByKey(hookName, pluginKey);
1319
- return plugins.map((plugin) => {
1320
- return this.#executeSync({
1321
- strategy: "hookFirst",
1322
- hookName,
1323
- parameters,
1324
- plugin
1325
- });
1326
- }).filter(Boolean);
1284
+ const plugin = this.getPlugin(hookName, pluginName2);
1285
+ return this.#executeSync({
1286
+ strategy: "hookFirst",
1287
+ hookName,
1288
+ parameters,
1289
+ plugin
1290
+ });
1327
1291
  }
1328
1292
  /**
1329
1293
  * Chains, first non-null result stops and returns
@@ -1439,58 +1403,37 @@ Names: ${JSON.stringify(names, void 0, 2)}`
1439
1403
  * Chains plugins
1440
1404
  */
1441
1405
  hookSeq({ hookName, parameters }) {
1442
- const promises = this.#getSortedPlugins().map((plugin) => {
1443
- return () => this.#execute({
1444
- strategy: "hookSeq",
1445
- hookName,
1446
- parameters,
1447
- plugin
1406
+ let promise = Promise.resolve();
1407
+ for (const plugin of this.#getSortedPlugins()) {
1408
+ promise = promise.then(() => {
1409
+ this.#execute({
1410
+ strategy: "hookSeq",
1411
+ hookName,
1412
+ parameters,
1413
+ plugin
1414
+ });
1448
1415
  });
1449
- });
1450
- return this.#promiseManager.run("seq", promises);
1416
+ }
1417
+ return promise.then(noReturn);
1451
1418
  }
1452
1419
  #getSortedPlugins(hookName) {
1453
1420
  const plugins = [...this.plugins].filter((plugin) => plugin.name !== "core");
1454
1421
  if (hookName) {
1455
- if (this.logger.logLevel === "info") {
1456
- const containsHookName = plugins.some((item) => item[hookName]);
1457
- if (!containsHookName) {
1458
- this.logger.warn(`No hook ${hookName} found`);
1459
- }
1460
- }
1461
1422
  return plugins.filter((item) => item[hookName]);
1462
1423
  }
1463
1424
  return plugins;
1464
1425
  }
1465
- getPluginsByKey(hookName, pluginKey) {
1426
+ getPlugin(hookName, pluginName2) {
1466
1427
  const plugins = [...this.plugins];
1467
- const [searchKind, searchPluginName, searchIdentifier] = pluginKey;
1468
- const pluginByPluginName = plugins.filter((plugin) => plugin[hookName]).filter((item) => {
1469
- const [kind, name, identifier] = item.key;
1470
- const identifierCheck = identifier?.toString() === searchIdentifier?.toString();
1471
- const kindCheck = kind === searchKind;
1472
- const nameCheck = name === searchPluginName;
1473
- if (searchIdentifier) {
1474
- return identifierCheck && kindCheck && nameCheck;
1475
- }
1476
- return kindCheck && nameCheck;
1477
- });
1478
- if (!pluginByPluginName?.length) {
1479
- const corePlugin = plugins.find((plugin) => plugin.name === "core" && plugin[hookName]);
1480
- if (this.logger.logLevel === "info") {
1481
- if (corePlugin) {
1482
- this.logger.warn(`No hook '${hookName}' for pluginKey '${JSON.stringify(pluginKey)}' found, falling back on the '@kubb/core' plugin`);
1483
- } else {
1484
- this.logger.warn(`No hook '${hookName}' for pluginKey '${JSON.stringify(pluginKey)}' found, no fallback found in the '@kubb/core' plugin`);
1485
- }
1486
- }
1487
- return corePlugin ? [corePlugin] : [];
1428
+ const pluginByPluginName = plugins.find((item) => item.name === pluginName2 && item[hookName]);
1429
+ if (!pluginByPluginName) {
1430
+ return this.#core;
1488
1431
  }
1489
1432
  return pluginByPluginName;
1490
1433
  }
1491
1434
  #addExecutedToCallStack(executer) {
1492
1435
  if (executer) {
1493
- this.eventEmitter.emit("executed", executer);
1436
+ this.eventEmitter.emit("execute", executer);
1494
1437
  this.executed.push(executer);
1495
1438
  }
1496
1439
  }
@@ -1560,7 +1503,7 @@ Names: ${JSON.stringify(names, void 0, 2)}`
1560
1503
  this.eventEmitter.emit("execute", { strategy, hookName, parameters, plugin });
1561
1504
  try {
1562
1505
  if (typeof hook === "function") {
1563
- const fn = hook.apply({ ...this.#core.api, plugin }, parameters);
1506
+ const fn = hook.apply(this.#core.api, parameters);
1564
1507
  output = fn;
1565
1508
  return fn;
1566
1509
  }
@@ -1586,50 +1529,34 @@ Names: ${JSON.stringify(names, void 0, 2)}`
1586
1529
  this.eventEmitter.emit("error", pluginError);
1587
1530
  throw pluginError;
1588
1531
  }
1589
- #parse(plugin, pluginManager, context) {
1590
- const usedPluginNames = pluginManager.#usedPluginNames;
1591
- setUniqueName(plugin.name, usedPluginNames);
1592
- const key = plugin.key || [plugin.kind, plugin.name, usedPluginNames[plugin.name]].filter(Boolean);
1593
- if (plugin.name !== "core" && usedPluginNames[plugin.name] >= 2) {
1594
- pluginManager.logger.warn("Using multiple of the same plugin is an experimental feature");
1595
- }
1596
- if (!plugin.transform) {
1597
- plugin.transform = function transform(code) {
1598
- return code;
1599
- };
1600
- }
1601
- if (plugin.api && typeof plugin.api === "function") {
1602
- const api = plugin.api.call(context);
1603
- return {
1604
- ...plugin,
1605
- key,
1606
- api
1607
- };
1608
- }
1609
- return {
1610
- ...plugin,
1611
- key
1612
- };
1613
- }
1614
- static getDependedPlugins(plugins, dependedPluginNames) {
1615
- let pluginNames = [];
1616
- if (typeof dependedPluginNames === "string") {
1617
- pluginNames = [dependedPluginNames];
1618
- } else {
1619
- pluginNames = dependedPluginNames;
1620
- }
1621
- return pluginNames.map((pluginName2) => {
1622
- const plugin = plugins.find((plugin2) => plugin2.name === pluginName2);
1623
- if (!plugin) {
1624
- throw new ValidationPluginError(`This plugin depends on the ${pluginName2} plugin.`);
1625
- }
1626
- return plugin;
1627
- });
1628
- }
1629
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
1630
- static get hooks() {
1631
- return ["validate", "buildStart", "resolvePath", "resolveName", "load", "transform", "writeFile", "buildEnd"];
1632
- }
1532
+ };
1533
+ function noReturn() {
1534
+ }
1535
+
1536
+ // src/managers/pluginManager/validate.ts
1537
+ var ValidationPluginError = class extends Error {
1538
+ };
1539
+ function getDependedPlugins(plugins, dependedPluginNames) {
1540
+ let pluginNames = [];
1541
+ if (typeof dependedPluginNames === "string") {
1542
+ pluginNames = [dependedPluginNames];
1543
+ } else {
1544
+ pluginNames = dependedPluginNames;
1545
+ }
1546
+ return pluginNames.map((pluginName2) => {
1547
+ const plugin = plugins.find((plugin2) => plugin2.name === pluginName2);
1548
+ if (!plugin) {
1549
+ throw new ValidationPluginError(`This plugin depends on the ${pluginName2} plugin.`);
1550
+ }
1551
+ return plugin;
1552
+ });
1553
+ }
1554
+
1555
+ // src/types.ts
1556
+ var LogLevel = {
1557
+ silent: "silent",
1558
+ info: "info",
1559
+ debug: "debug"
1633
1560
  };
1634
1561
 
1635
1562
  // src/build.ts
@@ -1637,13 +1564,13 @@ async function transformReducer(_previousCode, result, _plugin) {
1637
1564
  return result;
1638
1565
  }
1639
1566
  async function build(options) {
1640
- const { config, logger = createLogger({ logLevel: LogLevel.silent }) } = options;
1567
+ const { config, logLevel, logger = createLogger() } = options;
1641
1568
  try {
1642
- if (isInputPath(config) && !new URLPath(config.input.path).isURL) {
1569
+ if ("path" in config.input && !new URLPath(config.input.path).isURL) {
1643
1570
  await read(config.input.path);
1644
1571
  }
1645
1572
  } catch (e) {
1646
- if (isInputPath(config)) {
1573
+ if ("path" in config.input) {
1647
1574
  throw new Error(
1648
1575
  "Cannot read file/URL defined in `input.path` or set with `kubb generate PATH` in the CLI of your Kubb config " + pc3__default.default.dim(config.input.path),
1649
1576
  {
@@ -1656,11 +1583,11 @@ async function build(options) {
1656
1583
  await clean(config.output.path);
1657
1584
  }
1658
1585
  const queueTask = async (file) => {
1659
- const { path: path5 } = file;
1660
- let code = FileManager.getSource(file);
1586
+ const { path: path3 } = file;
1587
+ let code = createFileSource(file);
1661
1588
  const { result: loadedResult } = await pluginManager.hookFirst({
1662
1589
  hookName: "load",
1663
- parameters: [path5]
1590
+ parameters: [path3]
1664
1591
  });
1665
1592
  if (loadedResult && isPromise(loadedResult)) {
1666
1593
  code = await loadedResult;
@@ -1671,53 +1598,28 @@ async function build(options) {
1671
1598
  if (code) {
1672
1599
  const transformedCode = await pluginManager.hookReduceArg0({
1673
1600
  hookName: "transform",
1674
- parameters: [code, path5],
1601
+ parameters: [code, path3],
1675
1602
  reduce: transformReducer
1676
1603
  });
1677
1604
  if (config.output.write || config.output.write === void 0) {
1678
- if (file.meta?.pluginKey) {
1679
- return pluginManager.hookForPlugin({
1680
- pluginKey: file.meta?.pluginKey,
1681
- hookName: "writeFile",
1682
- parameters: [transformedCode, path5]
1683
- });
1684
- }
1685
- return pluginManager.hookFirst({
1605
+ await pluginManager.hookParallel({
1686
1606
  hookName: "writeFile",
1687
- parameters: [transformedCode, path5]
1607
+ parameters: [transformedCode, path3]
1688
1608
  });
1689
1609
  }
1690
1610
  }
1691
1611
  };
1692
- const pluginManager = new PluginManager(config, { logger, task: queueTask, writeTimeout: 0 });
1612
+ const pluginManager = new PluginManager(config, { debug: logLevel === LogLevel.debug, logger, task: queueTask });
1693
1613
  const { plugins, fileManager } = pluginManager;
1694
1614
  pluginManager.on("execute", (executer) => {
1695
- const { hookName, parameters, plugin } = executer;
1696
- if (hookName === "writeFile" && logger.spinner) {
1697
- const [code] = parameters;
1698
- if (logger.logLevel === LogLevel.info) {
1699
- logger.spinner.start(`\u{1F4BE} Writing`);
1700
- }
1701
- if (logger.logLevel === "debug") {
1702
- logger.info(`PluginKey ${pc3__default.default.dim(JSON.stringify(plugin.key))}
1703
- with source
1704
-
1705
- ${code}`);
1706
- }
1707
- }
1708
- });
1709
- pluginManager.on("executed", (executer) => {
1710
1615
  const { hookName, plugin, output, parameters } = executer;
1711
1616
  const messsage = `${randomPicoColour(plugin.name)} Executing ${hookName}`;
1712
- if (logger.logLevel === LogLevel.info && logger.spinner) {
1713
- if (hookName === "writeFile") {
1714
- const [_code, path5] = parameters;
1715
- logger.spinner.suffixText = pc3__default.default.dim(path5);
1716
- } else {
1617
+ if (logLevel === LogLevel.info) {
1618
+ if (logger.spinner) {
1717
1619
  logger.spinner.suffixText = messsage;
1718
1620
  }
1719
1621
  }
1720
- if (logger.logLevel === LogLevel.debug) {
1622
+ if (logLevel === LogLevel.debug) {
1721
1623
  logger.info(messsage);
1722
1624
  const logs = [
1723
1625
  parameters && `${pc3__default.default.bgWhite(`Parameters`)} ${randomPicoColour(plugin.name)} ${hookName}`,
@@ -1737,14 +1639,15 @@ ${code}`);
1737
1639
  parameters: [config]
1738
1640
  });
1739
1641
  await pluginManager.hookParallel({ hookName: "buildEnd" });
1740
- if (!fileManager.isExecuting && logger.spinner) {
1741
- logger.spinner.suffixText = "";
1742
- logger.spinner.succeed(`\u{1F4BE} Writing completed`);
1743
- }
1744
- return { files: fileManager.files.map((file) => ({ ...file, source: FileManager.getSource(file) })), pluginManager };
1642
+ return { files: fileManager.files.map((file) => ({ ...file, source: createFileSource(file) })), pluginManager };
1643
+ }
1644
+
1645
+ // src/config.ts
1646
+ function defineConfig(options) {
1647
+ return options;
1745
1648
  }
1746
1649
 
1747
- // src/Generator.ts
1650
+ // src/generators/Generator.ts
1748
1651
  var Generator = class {
1749
1652
  #options = {};
1750
1653
  #context = {};
@@ -1768,6 +1671,10 @@ var Generator = class {
1768
1671
  }
1769
1672
  };
1770
1673
 
1674
+ // src/generators/SchemaGenerator.ts
1675
+ var SchemaGenerator = class extends Generator {
1676
+ };
1677
+
1771
1678
  // ../../node_modules/.pnpm/yocto-queue@1.0.0/node_modules/yocto-queue/index.js
1772
1679
  var Node = class {
1773
1680
  value;
@@ -1833,18 +1740,18 @@ function pLimit(concurrency) {
1833
1740
  queue.dequeue()();
1834
1741
  }
1835
1742
  };
1836
- const run = async (fn, resolve2, args) => {
1743
+ const run = async (fn, resolve, args) => {
1837
1744
  activeCount++;
1838
1745
  const result = (async () => fn(...args))();
1839
- resolve2(result);
1746
+ resolve(result);
1840
1747
  try {
1841
1748
  await result;
1842
1749
  } catch {
1843
1750
  }
1844
1751
  next();
1845
1752
  };
1846
- const enqueue = (fn, resolve2, args) => {
1847
- queue.enqueue(run.bind(void 0, fn, resolve2, args));
1753
+ const enqueue = (fn, resolve, args) => {
1754
+ queue.enqueue(run.bind(void 0, fn, resolve, args));
1848
1755
  (async () => {
1849
1756
  await Promise.resolve();
1850
1757
  if (activeCount < concurrency && queue.size > 0) {
@@ -1852,8 +1759,8 @@ function pLimit(concurrency) {
1852
1759
  }
1853
1760
  })();
1854
1761
  };
1855
- const generator = (fn, ...args) => new Promise((resolve2) => {
1856
- enqueue(fn, resolve2, args);
1762
+ const generator = (fn, ...args) => new Promise((resolve) => {
1763
+ enqueue(fn, resolve, args);
1857
1764
  });
1858
1765
  Object.defineProperties(generator, {
1859
1766
  activeCount: {
@@ -1928,7 +1835,7 @@ async function locatePath(paths, {
1928
1835
  const statFunction = allowSymlinks ? fs3.promises.stat : fs3.promises.lstat;
1929
1836
  return pLocate(paths, async (path_) => {
1930
1837
  try {
1931
- const stat = await statFunction(path4__default.default.resolve(cwd, path_));
1838
+ const stat = await statFunction(path2__default.default.resolve(cwd, path_));
1932
1839
  return matchType(type, stat);
1933
1840
  } catch {
1934
1841
  return false;
@@ -1945,7 +1852,7 @@ function locatePathSync(paths, {
1945
1852
  const statFunction = allowSymlinks ? fs3__default.default.statSync : fs3__default.default.lstatSync;
1946
1853
  for (const path_ of paths) {
1947
1854
  try {
1948
- const stat = statFunction(path4__default.default.resolve(cwd, path_), {
1855
+ const stat = statFunction(path2__default.default.resolve(cwd, path_), {
1949
1856
  throwIfNoEntry: false
1950
1857
  });
1951
1858
  if (!stat) {
@@ -1963,9 +1870,9 @@ function locatePathSync(paths, {
1963
1870
  var toPath2 = (urlOrPath) => urlOrPath instanceof URL ? url.fileURLToPath(urlOrPath) : urlOrPath;
1964
1871
  var findUpStop = Symbol("findUpStop");
1965
1872
  async function findUpMultiple(name, options = {}) {
1966
- let directory = path4__default.default.resolve(toPath2(options.cwd) || "");
1967
- const { root } = path4__default.default.parse(directory);
1968
- const stopAt = path4__default.default.resolve(directory, options.stopAt || root);
1873
+ let directory = path2__default.default.resolve(toPath2(options.cwd) || "");
1874
+ const { root } = path2__default.default.parse(directory);
1875
+ const stopAt = path2__default.default.resolve(directory, options.stopAt || root);
1969
1876
  const limit = options.limit || Number.POSITIVE_INFINITY;
1970
1877
  const paths = [name].flat();
1971
1878
  const runMatcher = async (locateOptions) => {
@@ -1985,18 +1892,18 @@ async function findUpMultiple(name, options = {}) {
1985
1892
  break;
1986
1893
  }
1987
1894
  if (foundPath) {
1988
- matches.push(path4__default.default.resolve(directory, foundPath));
1895
+ matches.push(path2__default.default.resolve(directory, foundPath));
1989
1896
  }
1990
1897
  if (directory === stopAt || matches.length >= limit) {
1991
1898
  break;
1992
1899
  }
1993
- directory = path4__default.default.dirname(directory);
1900
+ directory = path2__default.default.dirname(directory);
1994
1901
  }
1995
1902
  return matches;
1996
1903
  }
1997
1904
  function findUpMultipleSync(name, options = {}) {
1998
- let directory = path4__default.default.resolve(toPath2(options.cwd) || "");
1999
- const { root } = path4__default.default.parse(directory);
1905
+ let directory = path2__default.default.resolve(toPath2(options.cwd) || "");
1906
+ const { root } = path2__default.default.parse(directory);
2000
1907
  const stopAt = options.stopAt || root;
2001
1908
  const limit = options.limit || Number.POSITIVE_INFINITY;
2002
1909
  const paths = [name].flat();
@@ -2017,12 +1924,12 @@ function findUpMultipleSync(name, options = {}) {
2017
1924
  break;
2018
1925
  }
2019
1926
  if (foundPath) {
2020
- matches.push(path4__default.default.resolve(directory, foundPath));
1927
+ matches.push(path2__default.default.resolve(directory, foundPath));
2021
1928
  }
2022
1929
  if (directory === stopAt || matches.length >= limit) {
2023
1930
  break;
2024
1931
  }
2025
- directory = path4__default.default.dirname(directory);
1932
+ directory = path2__default.default.dirname(directory);
2026
1933
  }
2027
1934
  return matches;
2028
1935
  }
@@ -2056,17 +1963,17 @@ var PackageManager = class _PackageManager {
2056
1963
  }
2057
1964
  return directory;
2058
1965
  }
2059
- getLocation(path5) {
2060
- let location = path5;
1966
+ getLocation(path3) {
1967
+ let location = path3;
2061
1968
  if (this.#cwd) {
2062
1969
  const require2 = mod__default.default.createRequire(this.normalizeDirectory(this.#cwd));
2063
- location = require2.resolve(path5);
1970
+ location = require2.resolve(path3);
2064
1971
  }
2065
1972
  return location;
2066
1973
  }
2067
- async import(path5) {
1974
+ async import(path3) {
2068
1975
  try {
2069
- let location = this.getLocation(path5);
1976
+ let location = this.getLocation(path3);
2070
1977
  if (os__default.default.platform() == "win32") {
2071
1978
  location = url.pathToFileURL(location).href;
2072
1979
  }
@@ -2142,32 +2049,67 @@ var PackageManager = class _PackageManager {
2142
2049
  }
2143
2050
  };
2144
2051
 
2145
- // src/SchemaGenerator.ts
2146
- var SchemaGenerator = class extends Generator {
2147
- };
2148
-
2149
2052
  // src/index.ts
2150
2053
  var src_default = build;
2151
2054
 
2055
+ Object.defineProperty(exports, 'pc', {
2056
+ enumerable: true,
2057
+ get: function () { return pc3__default.default; }
2058
+ });
2152
2059
  exports.FileManager = FileManager;
2060
+ exports.FunctionParams = FunctionParams;
2153
2061
  exports.Generator = Generator;
2062
+ exports.LogLevel = LogLevel;
2154
2063
  exports.PackageManager = PackageManager;
2155
2064
  exports.ParallelPluginError = ParallelPluginError;
2156
2065
  exports.PluginError = PluginError;
2157
2066
  exports.PluginManager = PluginManager;
2158
- exports.PromiseManager = PromiseManager;
2067
+ exports.Queue = Queue;
2159
2068
  exports.SchemaGenerator = SchemaGenerator;
2160
2069
  exports.SummaryError = SummaryError;
2070
+ exports.TreeNode = TreeNode;
2071
+ exports.URLPath = URLPath;
2161
2072
  exports.ValidationPluginError = ValidationPluginError;
2162
2073
  exports.Warning = Warning;
2163
2074
  exports.build = build;
2075
+ exports.clean = clean;
2076
+ exports.combineCodes = combineCodes;
2164
2077
  exports.combineExports = combineExports;
2078
+ exports.combineFiles = combineFiles;
2165
2079
  exports.combineImports = combineImports;
2080
+ exports.createFileSource = createFileSource;
2081
+ exports.createJSDocBlockText = createJSDocBlockText;
2082
+ exports.createLogger = createLogger;
2166
2083
  exports.createPlugin = createPlugin;
2084
+ exports.createPluginCache = createPluginCache;
2167
2085
  exports.default = src_default;
2086
+ exports.defaultColours = defaultColours;
2168
2087
  exports.defineConfig = defineConfig;
2169
- exports.isInputPath = isInputPath;
2088
+ exports.escape = escape;
2089
+ exports.extensions = extensions;
2090
+ exports.getDependedPlugins = getDependedPlugins;
2091
+ exports.getIndexes = getIndexes;
2092
+ exports.getPathMode = getPathMode;
2093
+ exports.getRelativePath = getRelativePath;
2094
+ exports.getUniqueName = getUniqueName;
2095
+ exports.hooks = hooks;
2096
+ exports.isExtensionAllowed = isExtensionAllowed;
2097
+ exports.isPromise = isPromise;
2098
+ exports.isPromiseFulfilledResult = isPromiseFulfilledResult;
2099
+ exports.isPromiseRejectedResult = isPromiseRejectedResult;
2100
+ exports.jsStringEscape = jsStringEscape;
2170
2101
  exports.name = pluginName;
2102
+ exports.nameSorter = nameSorter;
2171
2103
  exports.pluginName = pluginName;
2104
+ exports.randomColour = randomColour;
2105
+ exports.randomPicoColour = randomPicoColour;
2106
+ exports.read = read;
2107
+ exports.readSync = readSync;
2108
+ exports.renderTemplate = renderTemplate;
2109
+ exports.throttle = throttle;
2110
+ exports.timeout = timeout;
2111
+ exports.transformReservedWord = transformReservedWord;
2112
+ exports.uniqueIdFactory = uniqueIdFactory;
2113
+ exports.write = write;
2172
2114
  //# sourceMappingURL=out.js.map
2173
2115
  //# sourceMappingURL=index.cjs.map