@kubb/core 2.0.0-beta.1 → 2.0.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/index.cjs +292 -240
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +61 -61
  4. package/dist/index.d.ts +61 -61
  5. package/dist/index.js +289 -236
  6. package/dist/index.js.map +1 -1
  7. package/dist/transformers.cjs +222 -0
  8. package/dist/transformers.cjs.map +1 -0
  9. package/dist/transformers.d.cts +55 -0
  10. package/dist/transformers.d.ts +55 -0
  11. package/dist/transformers.js +207 -0
  12. package/dist/transformers.js.map +1 -0
  13. package/dist/utils.cjs +302 -274
  14. package/dist/utils.cjs.map +1 -1
  15. package/dist/utils.d.cts +515 -67
  16. package/dist/utils.d.ts +515 -67
  17. package/dist/utils.js +303 -274
  18. package/dist/utils.js.map +1 -1
  19. package/package.json +14 -9
  20. package/src/BarrelManager.ts +55 -65
  21. package/src/FileManager.ts +93 -24
  22. package/src/PluginManager.ts +35 -17
  23. package/src/build.ts +1 -11
  24. package/src/index.ts +0 -1
  25. package/src/plugin.ts +4 -4
  26. package/src/transformers/casing.ts +9 -0
  27. package/src/transformers/createJSDocBlockText.ts +9 -0
  28. package/src/transformers/index.ts +36 -0
  29. package/src/transformers/trim.ts +7 -0
  30. package/src/types.ts +22 -41
  31. package/src/utils/FunctionParams.ts +3 -2
  32. package/src/utils/TreeNode.ts +6 -3
  33. package/src/utils/URLPath.ts +5 -5
  34. package/src/utils/index.ts +0 -1
  35. package/src/SchemaGenerator.ts +0 -8
  36. package/src/utils/transformers/createJSDocBlockText.ts +0 -15
  37. package/src/utils/transformers/index.ts +0 -22
  38. package/src/utils/transformers/trim.ts +0 -3
  39. /package/src/{utils/transformers → transformers}/combineCodes.ts +0 -0
  40. /package/src/{utils/transformers → transformers}/escape.ts +0 -0
  41. /package/src/{utils/transformers → transformers}/indent.ts +0 -0
  42. /package/src/{utils/transformers → transformers}/nameSorter.ts +0 -0
  43. /package/src/{utils/transformers → transformers}/searchAndReplace.ts +0 -0
  44. /package/src/{utils/transformers → transformers}/transformReservedWord.ts +0 -0
package/dist/index.cjs CHANGED
@@ -170,6 +170,24 @@ function randomPicoColour(text, colors = defaultColours) {
170
170
  }
171
171
  return formatter(text);
172
172
  }
173
+ function slash(path5, platform = "linux") {
174
+ const isWindowsPath = /^\\\\\?\\/.test(path5);
175
+ if (["linux", "mac"].includes(platform) && !isWindowsPath) {
176
+ return path5.replaceAll(/\\/g, "/").replace("../", "").trimEnd();
177
+ }
178
+ return path5.replaceAll(/\\/g, "/").replace("../", "").trimEnd();
179
+ }
180
+ function getRelativePath(rootDir, filePath, platform = "linux") {
181
+ if (!rootDir || !filePath) {
182
+ throw new Error(`Root and file should be filled in when retrieving the relativePath, ${rootDir || ""} ${filePath || ""}`);
183
+ }
184
+ const relativePath = path4.relative(rootDir, filePath);
185
+ const slashedPath = slash(relativePath, platform);
186
+ if (slashedPath.startsWith("../")) {
187
+ return slashedPath.replace(path4.basename(slashedPath), path4.basename(slashedPath, path4.extname(filePath)));
188
+ }
189
+ return `./${slashedPath.replace(path4.basename(slashedPath), path4.basename(slashedPath, path4.extname(filePath)))}`;
190
+ }
173
191
  var reader = jsRuntime.switcher(
174
192
  {
175
193
  node: async (path5) => {
@@ -196,141 +214,30 @@ jsRuntime.switcher(
196
214
  async function read(path5) {
197
215
  return reader(path5);
198
216
  }
199
- var URLPath = class {
200
- constructor(path5) {
201
- this.path = path5;
202
- return this;
203
- }
204
- /**
205
- * Convert Swagger path to URLPath(syntax of Express)
206
- * @example /pet/{petId} => /pet/:petId
207
- */
208
- get URL() {
209
- return this.toURLPath();
210
- }
211
- get isURL() {
212
- try {
213
- const url = new URL(this.path);
214
- if (url?.href) {
215
- return true;
216
- }
217
- } catch (error) {
218
- return false;
219
- }
220
- return false;
221
- }
222
- /**
223
- * Convert Swagger path to template literals/ template strings(camelcase)
224
- * @example /pet/{petId} => `/pet/${petId}`
225
- * @example /account/monetary-accountID => `/account/${monetaryAccountId}`
226
- * @example /account/userID => `/account/${userId}`
227
- */
228
- get template() {
229
- return this.toTemplateString();
230
- }
231
- get object() {
232
- return this.toObject();
233
- }
234
- get params() {
235
- return this.getParams();
236
- }
237
- toObject({ type = "path", replacer, stringify } = {}) {
238
- const object = {
239
- url: type === "path" ? this.toURLPath() : this.toTemplateString(replacer),
240
- params: this.getParams()
241
- };
242
- if (stringify) {
243
- if (type === "template") {
244
- return JSON.stringify(object).replaceAll("'", "").replaceAll(`"`, "");
245
- }
246
- if (object.params) {
247
- return `{ url: '${object.url}', params: ${JSON.stringify(object.params).replaceAll("'", "").replaceAll(`"`, "")} }`;
248
- }
249
- return `{ url: '${object.url}' }`;
250
- }
251
- return object;
252
- }
253
- /**
254
- * Convert Swagger path to template literals/ template strings(camelcase)
255
- * @example /pet/{petId} => `/pet/${petId}`
256
- * @example /account/monetary-accountID => `/account/${monetaryAccountId}`
257
- * @example /account/userID => `/account/${userId}`
258
- */
259
- toTemplateString(replacer) {
260
- const regex = /{(\w|-)*}/g;
261
- const found = this.path.match(regex);
262
- let newPath = this.path.replaceAll("{", "${");
263
- if (found) {
264
- newPath = found.reduce((prev, curr) => {
265
- const pathParam = replacer ? replacer(changeCase.camelCase(curr, { delimiter: "", transform: changeCase.camelCaseTransformMerge })) : changeCase.camelCase(curr, { delimiter: "", transform: changeCase.camelCaseTransformMerge });
266
- const replacement = `\${${pathParam}}`;
267
- return prev.replace(curr, replacement);
268
- }, this.path);
269
- }
270
- return `\`${newPath}\``;
271
- }
272
- getParams(replacer) {
273
- const regex = /{(\w|-)*}/g;
274
- const found = this.path.match(regex);
275
- if (!found) {
276
- return void 0;
277
- }
278
- const params = {};
279
- found.forEach((item) => {
280
- item = item.replaceAll("{", "").replaceAll("}", "");
281
- const pathParam = replacer ? replacer(changeCase.camelCase(item, { delimiter: "", transform: changeCase.camelCaseTransformMerge })) : changeCase.camelCase(item, { delimiter: "", transform: changeCase.camelCaseTransformMerge });
282
- params[pathParam] = pathParam;
283
- }, this.path);
284
- return params;
285
- }
286
- /**
287
- * Convert Swagger path to URLPath(syntax of Express)
288
- * @example /pet/{petId} => /pet/:petId
289
- */
290
- toURLPath() {
291
- return this.path.replaceAll("{", ":").replaceAll("}", "");
292
- }
293
- };
294
-
295
- // src/config.ts
296
- function defineConfig(options) {
297
- return options;
298
- }
299
- function isInputPath(result) {
300
- return !!result && "path" in result;
217
+ function camelCase(text) {
218
+ return changeCase.camelCase(text, { delimiter: "", stripRegexp: /[^A-Z0-9$]/gi, transform: changeCase.camelCaseTransformMerge });
301
219
  }
302
-
303
- // src/utils/timeout.ts
304
- async function timeout(ms) {
305
- return new Promise((resolve2) => {
306
- setTimeout(() => {
307
- resolve2(true);
308
- }, ms);
309
- });
220
+ function pascalCase(text) {
221
+ return changeCase.pascalCase(text, { delimiter: "", stripRegexp: /[^A-Z0-9$]/gi, transform: changeCase.pascalCaseTransformMerge });
310
222
  }
311
223
 
312
- // src/utils/transformers/combineCodes.ts
224
+ // src/transformers/combineCodes.ts
313
225
  function combineCodes(codes) {
314
226
  return codes.join("\n");
315
227
  }
316
228
 
317
- // src/utils/transformers/createJSDocBlockText.ts
318
- function createJSDocBlockText({ comments, newLine }) {
229
+ // src/transformers/createJSDocBlockText.ts
230
+ function createJSDocBlockText({ comments }) {
319
231
  const filteredComments = comments.filter(Boolean);
320
232
  if (!filteredComments.length) {
321
233
  return "";
322
234
  }
323
- const source = `/**
235
+ return `/**
324
236
  * ${filteredComments.join("\n * ")}
325
237
  */`;
326
- if (newLine) {
327
- return `${source}
328
- `;
329
- }
330
- return source;
331
238
  }
332
239
 
333
- // src/utils/transformers/escape.ts
240
+ // src/transformers/escape.ts
334
241
  function escape(text) {
335
242
  return text ? text.replaceAll("`", "\\`") : "";
336
243
  }
@@ -355,12 +262,12 @@ function jsStringEscape(input) {
355
262
  });
356
263
  }
357
264
 
358
- // src/utils/transformers/indent.ts
265
+ // src/transformers/indent.ts
359
266
  function createIndent(size) {
360
267
  return Array.from({ length: size + 1 }).join(" ");
361
268
  }
362
269
 
363
- // src/utils/transformers/nameSorter.ts
270
+ // src/transformers/nameSorter.ts
364
271
  function nameSorter(a, b) {
365
272
  if (a.name < b.name) {
366
273
  return -1;
@@ -371,7 +278,7 @@ function nameSorter(a, b) {
371
278
  return 0;
372
279
  }
373
280
 
374
- // src/utils/transformers/searchAndReplace.ts
281
+ // src/transformers/searchAndReplace.ts
375
282
  function searchAndReplace(options) {
376
283
  const { text, replaceBy, prefix = "", key } = options;
377
284
  const searchValues = options.searchValues?.(prefix, key) || [
@@ -388,7 +295,7 @@ function searchAndReplace(options) {
388
295
  }, text);
389
296
  }
390
297
 
391
- // src/utils/transformers/transformReservedWord.ts
298
+ // src/transformers/transformReservedWord.ts
392
299
  var reservedWords = [
393
300
  "abstract",
394
301
  "arguments",
@@ -481,13 +388,16 @@ function transformReservedWord(word) {
481
388
  return word;
482
389
  }
483
390
 
484
- // src/utils/transformers/trim.ts
391
+ // src/transformers/trim.ts
485
392
  function trim(text) {
486
393
  return text.replaceAll(/\n/g, "").trim();
487
394
  }
395
+ function trimExtName(text) {
396
+ return text.replace(/\.[^/.]+$/, "");
397
+ }
488
398
 
489
- // src/utils/transformers/index.ts
490
- var transformers = {
399
+ // src/transformers/index.ts
400
+ var transformers_default = {
491
401
  combineCodes,
492
402
  escape,
493
403
  jsStringEscape,
@@ -496,10 +406,127 @@ var transformers = {
496
406
  nameSorter,
497
407
  searchAndReplace,
498
408
  trim,
409
+ trimExtName,
499
410
  JSDoc: {
500
411
  createJSDocBlockText
412
+ },
413
+ camelCase,
414
+ pascalCase
415
+ };
416
+
417
+ // src/utils/URLPath.ts
418
+ var URLPath = class {
419
+ constructor(path5) {
420
+ this.path = path5;
421
+ return this;
422
+ }
423
+ /**
424
+ * Convert Swagger path to URLPath(syntax of Express)
425
+ * @example /pet/{petId} => /pet/:petId
426
+ */
427
+ get URL() {
428
+ return this.toURLPath();
429
+ }
430
+ get isURL() {
431
+ try {
432
+ const url = new URL(this.path);
433
+ if (url?.href) {
434
+ return true;
435
+ }
436
+ } catch (error) {
437
+ return false;
438
+ }
439
+ return false;
440
+ }
441
+ /**
442
+ * Convert Swagger path to template literals/ template strings(camelcase)
443
+ * @example /pet/{petId} => `/pet/${petId}`
444
+ * @example /account/monetary-accountID => `/account/${monetaryAccountId}`
445
+ * @example /account/userID => `/account/${userId}`
446
+ */
447
+ get template() {
448
+ return this.toTemplateString();
449
+ }
450
+ get object() {
451
+ return this.toObject();
452
+ }
453
+ get params() {
454
+ return this.getParams();
455
+ }
456
+ toObject({ type = "path", replacer, stringify } = {}) {
457
+ const object = {
458
+ url: type === "path" ? this.toURLPath() : this.toTemplateString(replacer),
459
+ params: this.getParams()
460
+ };
461
+ if (stringify) {
462
+ if (type === "template") {
463
+ return JSON.stringify(object).replaceAll("'", "").replaceAll(`"`, "");
464
+ }
465
+ if (object.params) {
466
+ return `{ url: '${object.url}', params: ${JSON.stringify(object.params).replaceAll("'", "").replaceAll(`"`, "")} }`;
467
+ }
468
+ return `{ url: '${object.url}' }`;
469
+ }
470
+ return object;
471
+ }
472
+ /**
473
+ * Convert Swagger path to template literals/ template strings(camelcase)
474
+ * @example /pet/{petId} => `/pet/${petId}`
475
+ * @example /account/monetary-accountID => `/account/${monetaryAccountId}`
476
+ * @example /account/userID => `/account/${userId}`
477
+ */
478
+ toTemplateString(replacer) {
479
+ const regex = /{(\w|-)*}/g;
480
+ const found = this.path.match(regex);
481
+ let newPath = this.path.replaceAll("{", "${");
482
+ if (found) {
483
+ newPath = found.reduce((prev, curr) => {
484
+ const pathParam = replacer ? replacer(transformers_default.camelCase(curr)) : transformers_default.camelCase(curr);
485
+ const replacement = `\${${pathParam}}`;
486
+ return prev.replace(curr, replacement);
487
+ }, this.path);
488
+ }
489
+ return `\`${newPath}\``;
490
+ }
491
+ getParams(replacer) {
492
+ const regex = /{(\w|-)*}/g;
493
+ const found = this.path.match(regex);
494
+ if (!found) {
495
+ return void 0;
496
+ }
497
+ const params = {};
498
+ found.forEach((item) => {
499
+ item = item.replaceAll("{", "").replaceAll("}", "");
500
+ const pathParam = replacer ? replacer(transformers_default.camelCase(item)) : transformers_default.camelCase(item);
501
+ params[pathParam] = pathParam;
502
+ }, this.path);
503
+ return params;
504
+ }
505
+ /**
506
+ * Convert Swagger path to URLPath(syntax of Express)
507
+ * @example /pet/{petId} => /pet/:petId
508
+ */
509
+ toURLPath() {
510
+ return this.path.replaceAll("{", ":").replaceAll("}", "");
501
511
  }
502
512
  };
513
+
514
+ // src/config.ts
515
+ function defineConfig(options) {
516
+ return options;
517
+ }
518
+ function isInputPath(result) {
519
+ return !!result && "path" in result;
520
+ }
521
+
522
+ // src/utils/timeout.ts
523
+ async function timeout(ms) {
524
+ return new Promise((resolve3) => {
525
+ setTimeout(() => {
526
+ resolve3(true);
527
+ }, ms);
528
+ });
529
+ }
503
530
  async function saveCreateDirectory(path5) {
504
531
  const passedPath = path4.dirname(path4.resolve(path5));
505
532
  await fs2__default.default.mkdir(passedPath, { recursive: true });
@@ -650,78 +677,67 @@ var TreeNode = class _TreeNode {
650
677
  var _options;
651
678
  var BarrelManager = class {
652
679
  constructor(options = {}) {
653
- __privateAdd(this, _options, {});
680
+ __privateAdd(this, _options, void 0);
654
681
  __privateSet(this, _options, options);
655
682
  return this;
656
683
  }
657
- getIndexes(root, extName) {
658
- const { treeNode = {}, isTypeOnly, filter, map, output, includeExt } = __privateGet(this, _options);
659
- const extMapper = {
660
- ".ts": {
661
- extensions: /\.ts/,
662
- exclude: [/schemas/, /json/]
663
- },
664
- ".json": {
665
- extensions: /\.json/,
666
- exclude: []
667
- }
668
- };
669
- const tree = TreeNode.build(root, { ...extMapper[extName] || {}, ...treeNode });
684
+ getIndexes(pathToBuild) {
685
+ const { treeNode = {}, isTypeOnly, extName } = __privateGet(this, _options);
686
+ const tree = TreeNode.build(pathToBuild, treeNode);
670
687
  if (!tree) {
671
688
  return null;
672
689
  }
673
- const fileReducer = (files2, currentTree) => {
674
- if (!currentTree.children) {
690
+ const fileReducer = (files, treeNode2) => {
691
+ if (!treeNode2.children) {
675
692
  return [];
676
693
  }
677
- if (currentTree.children?.length > 1) {
678
- const indexPath = path4__default.default.resolve(currentTree.data.path, "index.ts");
679
- const exports = currentTree.children.filter(Boolean).map((file) => {
680
- const importPath = file.data.type === "directory" ? `./${file.data.name}/index` : `./${file.data.name.replace(/\.[^.]*$/, "")}`;
681
- if (importPath.includes("index") && file.data.type === "file") {
694
+ if (treeNode2.children.length > 1) {
695
+ const indexPath = path4__default.default.resolve(treeNode2.data.path, "index.ts");
696
+ const exports = treeNode2.children.filter(Boolean).map((file) => {
697
+ const importPath = file.data.type === "directory" ? `./${file.data.name}/index` : `./${transformers_default.trimExtName(file.data.name)}`;
698
+ if (importPath.endsWith("index") && file.data.type === "file") {
682
699
  return void 0;
683
700
  }
684
701
  return {
685
- path: includeExt ? `${importPath}${extName}` : importPath,
702
+ path: extName ? `${importPath}${extName}` : importPath,
686
703
  isTypeOnly
687
704
  };
688
705
  }).filter(Boolean);
689
- files2.push({
706
+ files.push({
690
707
  path: indexPath,
691
708
  baseName: "index.ts",
692
709
  source: "",
693
- exports: output ? exports?.filter((item) => {
694
- return item.path.endsWith(output.replace(/\.[^.]*$/, ""));
695
- }) : exports
710
+ exports,
711
+ meta: {
712
+ treeNode: treeNode2
713
+ }
696
714
  });
697
- } else {
698
- currentTree.children?.forEach((child) => {
699
- const indexPath = path4__default.default.resolve(currentTree.data.path, "index.ts");
700
- const importPath = child.data.type === "directory" ? `./${child.data.name}/index` : `./${child.data.name.replace(/\.[^.]*$/, "")}`;
701
- const exports = [
702
- {
703
- path: includeExt ? `${importPath}${extName}` : importPath,
704
- isTypeOnly
705
- }
706
- ];
707
- files2.push({
708
- path: indexPath,
709
- baseName: "index.ts",
710
- source: "",
711
- exports: output ? exports?.filter((item) => {
712
- return item.path.endsWith(output.replace(/\.[^.]*$/, ""));
713
- }) : exports
714
- });
715
+ } else if (treeNode2.children.length === 1) {
716
+ const [treeNodeChild] = treeNode2.children;
717
+ const indexPath = path4__default.default.resolve(treeNode2.data.path, "index.ts");
718
+ const importPath = treeNodeChild.data.type === "directory" ? `./${treeNodeChild.data.name}/index` : `./${transformers_default.trimExtName(treeNodeChild.data.name)}`;
719
+ const exports = [
720
+ {
721
+ path: extName ? `${importPath}${extName}` : importPath,
722
+ isTypeOnly
723
+ }
724
+ ];
725
+ files.push({
726
+ path: indexPath,
727
+ baseName: "index.ts",
728
+ source: "",
729
+ exports,
730
+ meta: {
731
+ treeNode: treeNode2
732
+ }
715
733
  });
716
734
  }
717
- currentTree.children.forEach((childItem) => {
718
- fileReducer(files2, childItem);
735
+ treeNode2.children.forEach((childItem) => {
736
+ fileReducer(files, childItem);
719
737
  });
720
- return files2;
738
+ return files;
721
739
  };
722
- const files = fileReducer([], tree).reverse();
723
- const filteredFiles = filter ? files.filter(filter) : files;
724
- return map ? filteredFiles.map(map) : filteredFiles;
740
+ return fileReducer([], tree).reverse();
725
741
  }
726
742
  };
727
743
  _options = new WeakMap();
@@ -730,7 +746,7 @@ _options = new WeakMap();
730
746
  exports.KubbFile = void 0;
731
747
  ((KubbFile2) => {
732
748
  })(exports.KubbFile || (exports.KubbFile = {}));
733
- var _cache, _task, _isWriting, _timeout, _queue, _validate, validate_fn, _add, add_fn, _addOrAppend, addOrAppend_fn;
749
+ var _cache, _task, _isWriting, _timeout, _queue, _validate, _add, add_fn, _addOrAppend, addOrAppend_fn;
734
750
  var _FileManager = class _FileManager {
735
751
  constructor(options) {
736
752
  __privateAdd(this, _validate);
@@ -763,7 +779,6 @@ var _FileManager = class _FileManager {
763
779
  }
764
780
  async add(...files) {
765
781
  const promises = files.map((file) => {
766
- __privateMethod(this, _validate, validate_fn).call(this, file);
767
782
  if (file.override) {
768
783
  return __privateMethod(this, _add, add_fn).call(this, file);
769
784
  }
@@ -775,12 +790,37 @@ var _FileManager = class _FileManager {
775
790
  }
776
791
  return resolvedFiles[0];
777
792
  }
778
- async addIndexes({ root, extName = ".ts", meta, options = {} }) {
779
- const barrelManager = new BarrelManager(options);
780
- const files = barrelManager.getIndexes(root, extName);
793
+ async addIndexes({ root, output, meta, options = {} }) {
794
+ const { exportType = "barrel" } = output;
795
+ if (!exportType) {
796
+ return void 0;
797
+ }
798
+ const exportPath = output.path.startsWith("./") ? output.path : `./${output.path}`;
799
+ const barrelManager = new BarrelManager({ extName: output.extName, ...options });
800
+ const files = barrelManager.getIndexes(path4.resolve(root, output.path));
781
801
  if (!files) {
782
802
  return void 0;
783
803
  }
804
+ const rootFile = {
805
+ path: path4.resolve(root, "index.ts"),
806
+ baseName: "index.ts",
807
+ source: "",
808
+ exports: [
809
+ output.exportAs ? {
810
+ name: output.exportAs,
811
+ asAlias: true,
812
+ path: exportPath,
813
+ isTypeOnly: options.isTypeOnly
814
+ } : {
815
+ path: exportPath,
816
+ isTypeOnly: options.isTypeOnly
817
+ }
818
+ ]
819
+ };
820
+ await __privateMethod(this, _addOrAppend, addOrAppend_fn).call(this, {
821
+ ...rootFile,
822
+ meta: meta ? meta : rootFile.meta
823
+ });
784
824
  return await Promise.all(
785
825
  files.map((file) => {
786
826
  return __privateMethod(this, _addOrAppend, addOrAppend_fn).call(this, {
@@ -827,9 +867,22 @@ var _FileManager = class _FileManager {
827
867
  }
828
868
  const exports = file.exports ? combineExports(file.exports) : [];
829
869
  const imports = file.imports ? combineImports(file.imports, exports, file.source) : [];
830
- const importNodes = imports.map((item) => factory__namespace.createImportDeclaration({ name: item.name, path: item.path, isTypeOnly: item.isTypeOnly }));
870
+ const importNodes = imports.filter((item) => {
871
+ return item.path !== transformers_default.trimExtName(file.path);
872
+ }).map((item) => {
873
+ return factory__namespace.createImportDeclaration({
874
+ name: item.name,
875
+ path: item.root ? getRelativePath(item.root, item.path) : item.path,
876
+ isTypeOnly: item.isTypeOnly
877
+ });
878
+ });
831
879
  const exportNodes = exports.map(
832
- (item) => factory__namespace.createExportDeclaration({ name: item.name, path: item.path, isTypeOnly: item.isTypeOnly, asAlias: item.asAlias })
880
+ (item) => factory__namespace.createExportDeclaration({
881
+ name: item.name,
882
+ path: item.path,
883
+ isTypeOnly: item.isTypeOnly,
884
+ asAlias: item.asAlias
885
+ })
833
886
  );
834
887
  return [parser.print([...importNodes, ...exportNodes]), getEnvSource(file.source, file.env)].join("\n");
835
888
  }
@@ -880,18 +933,10 @@ _isWriting = new WeakMap();
880
933
  _timeout = new WeakMap();
881
934
  _queue = new WeakMap();
882
935
  _validate = new WeakSet();
883
- validate_fn = function(file) {
884
- if (!file.validate) {
885
- return;
886
- }
887
- if (!file.path.toLowerCase().endsWith(file.baseName.toLowerCase())) {
888
- throw new Error(`${file.path} should end with the baseName ${file.baseName}`);
889
- }
890
- };
891
936
  _add = new WeakSet();
892
937
  add_fn = async function(file) {
893
938
  const controller = new AbortController();
894
- const resolvedFile = { id: crypto2__default.default.randomUUID(), ...file };
939
+ const resolvedFile = { id: crypto2__default.default.randomUUID(), name: transformers_default.trimExtName(file.baseName), ...file };
895
940
  __privateGet(this, _cache).set(resolvedFile.path, [{ cancel: () => controller.abort(), ...resolvedFile }]);
896
941
  if (__privateGet(this, _queue)) {
897
942
  await __privateGet(this, _queue).run(
@@ -964,7 +1009,7 @@ function combineImports(imports, exports, source) {
964
1009
  return checker(importName) || exports.some(({ name: name2 }) => Array.isArray(name2) ? name2.some(checker) : checker(name2));
965
1010
  };
966
1011
  if (Array.isArray(name)) {
967
- name = name.filter((item) => hasImportInSource(item));
1012
+ name = name.filter((item) => typeof item === "string" ? hasImportInSource(item) : hasImportInSource(item.propertyName));
968
1013
  }
969
1014
  const prevByPath = prev.findLast((imp) => imp.path === curr.path && imp.isTypeOnly === curr.isTypeOnly);
970
1015
  const uniquePrev = prev.findLast((imp) => imp.path === curr.path && isEqual__default.default(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly);
@@ -1010,8 +1055,8 @@ function getEnvSource(source, env) {
1010
1055
  throw new TypeError(`Environment should be in upperCase for ${key}`);
1011
1056
  }
1012
1057
  if (typeof replaceBy === "string") {
1013
- prev = transformers.searchAndReplace({ text: prev.replaceAll(`process.env.${key}`, replaceBy), replaceBy, prefix: "process.env", key });
1014
- prev = transformers.searchAndReplace({ text: prev.replaceAll(new RegExp(`(declare const).*
1058
+ prev = transformers_default.searchAndReplace({ text: prev.replaceAll(`process.env.${key}`, replaceBy), replaceBy, prefix: "process.env", key });
1059
+ prev = transformers_default.searchAndReplace({ text: prev.replaceAll(new RegExp(`(declare const).*
1015
1060
  `, "ig"), ""), replaceBy, key });
1016
1061
  }
1017
1062
  return prev;
@@ -1050,8 +1095,8 @@ var Queue = class {
1050
1095
  __privateSet(this, _debug, debug);
1051
1096
  }
1052
1097
  run(job, options = { controller: new AbortController(), name: crypto2__default.default.randomUUID(), description: "" }) {
1053
- return new Promise((resolve2, reject) => {
1054
- const item = { reject, resolve: resolve2, job, name: options.name, description: options.description || options.name };
1098
+ return new Promise((resolve3, reject) => {
1099
+ const item = { reject, resolve: resolve3, job, name: options.name, description: options.description || options.name };
1055
1100
  options.controller?.signal.addEventListener("abort", () => {
1056
1101
  __privateSet(this, _queue2, __privateGet(this, _queue2).filter((queueItem) => queueItem.name === item.name));
1057
1102
  reject("Aborted");
@@ -1061,8 +1106,8 @@ var Queue = class {
1061
1106
  });
1062
1107
  }
1063
1108
  runSync(job, options = { controller: new AbortController(), name: crypto2__default.default.randomUUID(), description: "" }) {
1064
- new Promise((resolve2, reject) => {
1065
- const item = { reject, resolve: resolve2, job, name: options.name, description: options.description || options.name };
1109
+ new Promise((resolve3, reject) => {
1110
+ const item = { reject, resolve: resolve3, job, name: options.name, description: options.description || options.name };
1066
1111
  options.controller?.signal.addEventListener("abort", () => {
1067
1112
  __privateSet(this, _queue2, __privateGet(this, _queue2).filter((queueItem) => queueItem.name === item.name));
1068
1113
  });
@@ -1089,13 +1134,13 @@ work_fn = function() {
1089
1134
  __privateWrapper(this, _workerCount)._++;
1090
1135
  let entry;
1091
1136
  while (entry = __privateGet(this, _queue2).shift()) {
1092
- const { reject, resolve: resolve2, job, name, description } = entry;
1137
+ const { reject, resolve: resolve3, job, name, description } = entry;
1093
1138
  if (__privateGet(this, _debug)) {
1094
1139
  perf_hooks.performance.mark(name + "_start");
1095
1140
  }
1096
1141
  job().then((result) => {
1097
1142
  this.eventEmitter.emit("jobDone", result);
1098
- resolve2(result);
1143
+ resolve3(result);
1099
1144
  if (__privateGet(this, _debug)) {
1100
1145
  perf_hooks.performance.mark(name + "_stop");
1101
1146
  perf_hooks.performance.measure(description, name + "_start", name + "_stop");
@@ -1169,8 +1214,7 @@ var definePlugin = createPlugin((options) => {
1169
1214
  return {
1170
1215
  name: pluginName,
1171
1216
  options,
1172
- key: ["controller", "core"],
1173
- kind: "controller",
1217
+ key: ["core"],
1174
1218
  api() {
1175
1219
  return {
1176
1220
  get config() {
@@ -1306,11 +1350,14 @@ var PluginManager = class {
1306
1350
  hookName: "resolvePath",
1307
1351
  parameters: [params.baseName, params.directory, params.options]
1308
1352
  });
1309
- if (paths && paths?.length > 1) {
1310
- throw new Error(
1353
+ if (paths && paths?.length > 1 && this.logger.logLevel === LogLevel.debug) {
1354
+ this.logger.warn(
1311
1355
  `Cannot return a path where the 'pluginKey' ${params.pluginKey ? JSON.stringify(params.pluginKey) : '"'} is not unique enough
1312
1356
 
1313
- Paths: ${JSON.stringify(paths, void 0, 2)}`
1357
+ Paths: ${JSON.stringify(paths, void 0, 2)}
1358
+
1359
+ Falling back on the first item.
1360
+ `
1314
1361
  );
1315
1362
  }
1316
1363
  return paths?.at(0);
@@ -1327,11 +1374,14 @@ Paths: ${JSON.stringify(paths, void 0, 2)}`
1327
1374
  hookName: "resolveName",
1328
1375
  parameters: [params.name, params.type]
1329
1376
  });
1330
- if (names && names?.length > 1) {
1331
- throw new Error(
1377
+ if (names && names?.length > 1 && this.logger.logLevel === LogLevel.debug) {
1378
+ this.logger.warn(
1332
1379
  `Cannot return a name where the 'pluginKey' ${params.pluginKey ? JSON.stringify(params.pluginKey) : '"'} is not unique enough
1333
1380
 
1334
- Names: ${JSON.stringify(names, void 0, 2)}`
1381
+ Names: ${JSON.stringify(names, void 0, 2)}
1382
+
1383
+ Falling back on the first item.
1384
+ `
1335
1385
  );
1336
1386
  }
1337
1387
  return transformReservedWord(names?.at(0) || params.name);
@@ -1514,20 +1564,19 @@ Names: ${JSON.stringify(names, void 0, 2)}`
1514
1564
  }
1515
1565
  getPluginsByKey(hookName, pluginKey) {
1516
1566
  const plugins = [...this.plugins];
1517
- const [searchKind, searchPluginName, searchIdentifier] = pluginKey;
1567
+ const [searchPluginName, searchIdentifier] = pluginKey;
1518
1568
  const pluginByPluginName = plugins.filter((plugin) => plugin[hookName]).filter((item) => {
1519
- const [kind, name, identifier] = item.key;
1569
+ const [name, identifier] = item.key;
1520
1570
  const identifierCheck = identifier?.toString() === searchIdentifier?.toString();
1521
- const kindCheck = kind === searchKind;
1522
1571
  const nameCheck = name === searchPluginName;
1523
1572
  if (searchIdentifier) {
1524
- return identifierCheck && kindCheck && nameCheck;
1573
+ return identifierCheck && nameCheck;
1525
1574
  }
1526
- return kindCheck && nameCheck;
1575
+ return nameCheck;
1527
1576
  });
1528
1577
  if (!pluginByPluginName?.length) {
1529
1578
  const corePlugin = plugins.find((plugin) => plugin.name === "core" && plugin[hookName]);
1530
- if (this.logger.logLevel === "info") {
1579
+ if (this.logger.logLevel === LogLevel.debug) {
1531
1580
  if (corePlugin) {
1532
1581
  this.logger.warn(`No hook '${hookName}' for pluginKey '${JSON.stringify(pluginKey)}' found, falling back on the '@kubb/core' plugin`);
1533
1582
  } else {
@@ -1555,7 +1604,7 @@ Names: ${JSON.stringify(names, void 0, 2)}`
1555
1604
  }
1556
1605
  // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
1557
1606
  static get hooks() {
1558
- return ["validate", "buildStart", "resolvePath", "resolveName", "load", "transform", "writeFile", "buildEnd"];
1607
+ return ["buildStart", "resolvePath", "resolveName", "load", "transform", "writeFile", "buildEnd"];
1559
1608
  }
1560
1609
  };
1561
1610
  _core = new WeakMap();
@@ -1565,7 +1614,7 @@ _getSortedPlugins = new WeakSet();
1565
1614
  getSortedPlugins_fn = function(hookName) {
1566
1615
  const plugins = [...this.plugins].filter((plugin) => plugin.name !== "core");
1567
1616
  if (hookName) {
1568
- if (this.logger.logLevel === "info") {
1617
+ if (this.logger.logLevel === LogLevel.info) {
1569
1618
  const containsHookName = plugins.some((item) => item[hookName]);
1570
1619
  if (!containsHookName) {
1571
1620
  this.logger.warn(`No hook ${hookName} found`);
@@ -1573,7 +1622,23 @@ getSortedPlugins_fn = function(hookName) {
1573
1622
  }
1574
1623
  return plugins.filter((item) => item[hookName]);
1575
1624
  }
1576
- return plugins;
1625
+ return plugins.map((plugin) => {
1626
+ if (plugin.pre) {
1627
+ const isValid = plugin.pre.every((pluginName2) => plugins.find((pluginToFind) => pluginToFind.name === pluginName2));
1628
+ if (!isValid) {
1629
+ throw new ValidationPluginError(`This plugin has a pre set that is not valid(${JSON.stringify(plugin.pre, void 0, 2)})`);
1630
+ }
1631
+ }
1632
+ return plugin;
1633
+ }).sort((a, b) => {
1634
+ if (b.pre?.includes(a.name)) {
1635
+ return 1;
1636
+ }
1637
+ if (b.post?.includes(a.name)) {
1638
+ return -1;
1639
+ }
1640
+ return 0;
1641
+ });
1577
1642
  };
1578
1643
  _addExecutedToCallStack = new WeakSet();
1579
1644
  addExecutedToCallStack_fn = function(executer) {
@@ -1664,7 +1729,7 @@ _parse = new WeakSet();
1664
1729
  parse_fn = function(plugin, pluginManager, context) {
1665
1730
  const usedPluginNames = __privateGet(pluginManager, _usedPluginNames);
1666
1731
  setUniqueName(plugin.name, usedPluginNames);
1667
- const key = plugin.key || [plugin.kind, plugin.name, usedPluginNames[plugin.name]].filter(Boolean);
1732
+ const key = [plugin.name, usedPluginNames[plugin.name]].filter(Boolean);
1668
1733
  if (plugin.name !== "core" && usedPluginNames[plugin.name] >= 2) {
1669
1734
  pluginManager.logger.warn("Using multiple of the same plugin is an experimental feature");
1670
1735
  }
@@ -1752,7 +1817,7 @@ async function setup(options) {
1752
1817
  if (logger.logLevel === LogLevel.info) {
1753
1818
  logger.spinner.start(`\u{1F4BE} Writing`);
1754
1819
  }
1755
- if (logger.logLevel === "debug") {
1820
+ if (logger.logLevel === LogLevel.debug) {
1756
1821
  logger.info(`PluginKey ${pc3__default.default.dim(JSON.stringify(plugin.key))}
1757
1822
  with source
1758
1823
 
@@ -1787,10 +1852,6 @@ ${code}`);
1787
1852
  async function build(options) {
1788
1853
  const pluginManager = await setup(options);
1789
1854
  const { fileManager, logger } = pluginManager;
1790
- await pluginManager.hookParallel({
1791
- hookName: "validate",
1792
- parameters: [pluginManager.plugins]
1793
- });
1794
1855
  await pluginManager.hookParallel({
1795
1856
  hookName: "buildStart",
1796
1857
  parameters: [options.config]
@@ -1806,10 +1867,6 @@ async function safeBuild(options) {
1806
1867
  const pluginManager = await setup(options);
1807
1868
  const { fileManager, logger } = pluginManager;
1808
1869
  try {
1809
- await pluginManager.hookParallel({
1810
- hookName: "validate",
1811
- parameters: [pluginManager.plugins]
1812
- });
1813
1870
  await pluginManager.hookParallel({
1814
1871
  hookName: "buildStart",
1815
1872
  parameters: [options.config]
@@ -1921,18 +1978,18 @@ function pLimit(concurrency) {
1921
1978
  queue.dequeue()();
1922
1979
  }
1923
1980
  };
1924
- const run = async (fn, resolve2, args) => {
1981
+ const run = async (fn, resolve3, args) => {
1925
1982
  activeCount++;
1926
1983
  const result = (async () => fn(...args))();
1927
- resolve2(result);
1984
+ resolve3(result);
1928
1985
  try {
1929
1986
  await result;
1930
1987
  } catch {
1931
1988
  }
1932
1989
  next();
1933
1990
  };
1934
- const enqueue = (fn, resolve2, args) => {
1935
- queue.enqueue(run.bind(void 0, fn, resolve2, args));
1991
+ const enqueue = (fn, resolve3, args) => {
1992
+ queue.enqueue(run.bind(void 0, fn, resolve3, args));
1936
1993
  (async () => {
1937
1994
  await Promise.resolve();
1938
1995
  if (activeCount < concurrency && queue.size > 0) {
@@ -1940,8 +1997,8 @@ function pLimit(concurrency) {
1940
1997
  }
1941
1998
  })();
1942
1999
  };
1943
- const generator = (fn, ...args) => new Promise((resolve2) => {
1944
- enqueue(fn, resolve2, args);
2000
+ const generator = (fn, ...args) => new Promise((resolve3) => {
2001
+ enqueue(fn, resolve3, args);
1945
2002
  });
1946
2003
  Object.defineProperties(generator, {
1947
2004
  activeCount: {
@@ -2251,10 +2308,6 @@ match_fn = function(packageJSON, dependency) {
2251
2308
  __privateAdd(_PackageManager, _cache2, {});
2252
2309
  var PackageManager = _PackageManager;
2253
2310
 
2254
- // src/SchemaGenerator.ts
2255
- var SchemaGenerator = class extends Generator {
2256
- };
2257
-
2258
2311
  // src/index.ts
2259
2312
  var src_default = build;
2260
2313
 
@@ -2263,7 +2316,6 @@ exports.Generator = Generator;
2263
2316
  exports.PackageManager = PackageManager;
2264
2317
  exports.PluginManager = PluginManager;
2265
2318
  exports.PromiseManager = PromiseManager;
2266
- exports.SchemaGenerator = SchemaGenerator;
2267
2319
  exports.ValidationPluginError = ValidationPluginError;
2268
2320
  exports.Warning = Warning;
2269
2321
  exports.build = build;