@kubb/core 1.1.11 → 1.1.13
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 +25 -1
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.js +25 -2
- package/dist/index.js.map +1 -0
- package/package.json +3 -4
- package/src/build.ts +0 -106
- package/src/config.ts +0 -15
- package/src/generators/Generator.ts +0 -23
- package/src/generators/SchemaGenerator.ts +0 -8
- package/src/generators/index.ts +0 -2
- package/src/index.ts +0 -12
- package/src/managers/fileManager/FileManager.ts +0 -127
- package/src/managers/fileManager/index.ts +0 -3
- package/src/managers/fileManager/types.ts +0 -40
- package/src/managers/fileManager/utils.ts +0 -167
- package/src/managers/index.ts +0 -2
- package/src/managers/pluginManager/ParallelPluginError.ts +0 -15
- package/src/managers/pluginManager/PluginError.ts +0 -11
- package/src/managers/pluginManager/PluginManager.ts +0 -474
- package/src/managers/pluginManager/index.ts +0 -5
- package/src/managers/pluginManager/types.ts +0 -29
- package/src/managers/pluginManager/validate.ts +0 -21
- package/src/plugin.ts +0 -111
- package/src/types.ts +0 -253
- package/src/utils/Queue.ts +0 -46
- package/src/utils/TreeNode.ts +0 -122
- package/src/utils/cache.ts +0 -33
- package/src/utils/clean.ts +0 -5
- package/src/utils/getEncodedText.ts +0 -3
- package/src/utils/getStackTrace.ts +0 -20
- package/src/utils/getUniqueName.ts +0 -9
- package/src/utils/index.ts +0 -19
- package/src/utils/isPromise.ts +0 -5
- package/src/utils/isURL.ts +0 -11
- package/src/utils/jsdoc.ts +0 -13
- package/src/utils/nameSorter.ts +0 -9
- package/src/utils/objectToParameters.ts +0 -28
- package/src/utils/read.ts +0 -45
- package/src/utils/renderTemplate.ts +0 -11
- package/src/utils/throttle.ts +0 -30
- package/src/utils/timeout.ts +0 -7
- package/src/utils/transformReservedWord.ts +0 -97
- package/src/utils/uniqueId.ts +0 -5
- package/src/utils/write.ts +0 -25
package/dist/index.cjs
CHANGED
|
@@ -526,9 +526,19 @@ ${file.source}`,
|
|
|
526
526
|
this.setStatus(id, "removed");
|
|
527
527
|
}
|
|
528
528
|
async write(...params) {
|
|
529
|
+
if (this.queue) {
|
|
530
|
+
return this.queue.run(async () => {
|
|
531
|
+
return write(...params);
|
|
532
|
+
});
|
|
533
|
+
}
|
|
529
534
|
return write(...params);
|
|
530
535
|
}
|
|
531
536
|
async read(...params) {
|
|
537
|
+
if (this.queue) {
|
|
538
|
+
return this.queue.run(async () => {
|
|
539
|
+
return read(...params);
|
|
540
|
+
});
|
|
541
|
+
}
|
|
532
542
|
return read(...params);
|
|
533
543
|
}
|
|
534
544
|
};
|
|
@@ -734,6 +744,7 @@ var ParallelPluginError = class extends Error {
|
|
|
734
744
|
pluginManager;
|
|
735
745
|
constructor(message, options) {
|
|
736
746
|
super(message, { cause: options.cause });
|
|
747
|
+
this.name = "ParallelPluginError";
|
|
737
748
|
this.errors = options.errors;
|
|
738
749
|
this.pluginManager = options.pluginManager;
|
|
739
750
|
}
|
|
@@ -744,6 +755,7 @@ var PluginError = class extends Error {
|
|
|
744
755
|
pluginManager;
|
|
745
756
|
constructor(message, options) {
|
|
746
757
|
super(message, { cause: options.cause });
|
|
758
|
+
this.name = "PluginError";
|
|
747
759
|
this.pluginManager = options.pluginManager;
|
|
748
760
|
}
|
|
749
761
|
};
|
|
@@ -926,7 +938,6 @@ var PluginManager = class {
|
|
|
926
938
|
const results = await Promise.allSettled(parallelPromises);
|
|
927
939
|
const errors = results.filter((result) => result.status === "rejected").map((result) => result.reason);
|
|
928
940
|
if (errors.length) {
|
|
929
|
-
console.log(errors);
|
|
930
941
|
throw new ParallelPluginError("Error", { errors, pluginManager: this });
|
|
931
942
|
}
|
|
932
943
|
return results.filter((result) => result.status === "fulfilled").map((result) => result.value);
|
|
@@ -1108,6 +1119,16 @@ function validatePlugins(plugins, dependedPluginNames) {
|
|
|
1108
1119
|
return true;
|
|
1109
1120
|
}
|
|
1110
1121
|
|
|
1122
|
+
// src/managers/pluginManager/SummaryError.ts
|
|
1123
|
+
var SummaryError = class extends Error {
|
|
1124
|
+
summary;
|
|
1125
|
+
constructor(message, options) {
|
|
1126
|
+
super(message, { cause: options.cause });
|
|
1127
|
+
this.name = "SummaryError";
|
|
1128
|
+
this.summary = options.summary || [];
|
|
1129
|
+
}
|
|
1130
|
+
};
|
|
1131
|
+
|
|
1111
1132
|
// src/build.ts
|
|
1112
1133
|
async function transformReducer(_previousCode, result, _plugin) {
|
|
1113
1134
|
return result;
|
|
@@ -1208,6 +1229,7 @@ exports.PluginError = PluginError;
|
|
|
1208
1229
|
exports.PluginManager = PluginManager;
|
|
1209
1230
|
exports.Queue = Queue;
|
|
1210
1231
|
exports.SchemaGenerator = SchemaGenerator;
|
|
1232
|
+
exports.SummaryError = SummaryError;
|
|
1211
1233
|
exports.TreeNode = TreeNode;
|
|
1212
1234
|
exports.ValidationPluginError = ValidationPluginError;
|
|
1213
1235
|
exports.build = build;
|
|
@@ -1239,3 +1261,5 @@ exports.uniqueId = uniqueId;
|
|
|
1239
1261
|
exports.validatePlugins = validatePlugins;
|
|
1240
1262
|
exports.write = write;
|
|
1241
1263
|
exports.writeIndexes = writeIndexes;
|
|
1264
|
+
//# sourceMappingURL=out.js.map
|
|
1265
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/managers/fileManager/FileManager.ts","../src/utils/isPromise.ts","../src/utils/write.ts","../src/utils/cache.ts","../src/utils/read.ts","../src/utils/isURL.ts","../src/utils/objectToParameters.ts","../src/utils/nameSorter.ts","../src/utils/jsdoc.ts","../src/utils/getUniqueName.ts","../src/utils/timeout.ts","../src/utils/Queue.ts","../src/utils/getEncodedText.ts","../src/utils/renderTemplate.ts","../src/utils/clean.ts","../src/utils/TreeNode.ts","../src/utils/transformReservedWord.ts","../src/utils/getStackTrace.ts","../src/utils/uniqueId.ts","../src/utils/throttle.ts","../src/managers/fileManager/utils.ts","../src/plugin.ts","../src/managers/pluginManager/ParallelPluginError.ts","../src/managers/pluginManager/PluginError.ts","../src/managers/pluginManager/PluginManager.ts","../src/managers/pluginManager/validate.ts","../src/managers/pluginManager/SummaryError.ts","../src/build.ts","../src/config.ts","../src/generators/Generator.ts","../src/generators/SchemaGenerator.ts","../src/index.ts"],"names":["pathParser","fs","dummyObject","v8StackTrace","timeout","files","name"],"mappings":";AAAA,OAAO,YAAY;;;ACEZ,SAAS,UAAa,QAA+C;AAC1E,SAAO,OAAQ,QAA6B,SAAS;AACvD;;;ACJA,OAAO,QAAQ;AACf,OAAO,gBAAgB;AAEvB,eAAe,oBAAoB,MAAc,MAA6B;AAE5E,QAAM,aAAa,WAAW,QAAQ,WAAW,QAAQ,IAAI,CAAC;AAE9D,QAAM,GAAG,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAE9C,SAAO,GAAG,UAAU,WAAW,QAAQ,IAAI,GAAG,MAAM,EAAE,UAAU,QAAQ,CAAC;AAC3E;AAEA,eAAsB,MAAM,MAAc,MAA6B;AACrE,MAAI;AACF,UAAM,GAAG,KAAK,IAAI;AAClB,UAAM,aAAa,MAAM,GAAG,SAAS,MAAM,EAAE,UAAU,QAAQ,CAAC;AAChE,QAAI,YAAY,SAAS,MAAM,MAAM;AACnC;AAAA,IACF;AAAA,EACF,SAAS,MAAP;AACA,WAAO,oBAAoB,MAAM,IAAI;AAAA,EACvC;AAEA,SAAO,oBAAoB,MAAM,IAAI;AACvC;;;ACjBO,SAAS,kBAAoE,OAA8B;AAChH,SAAO;AAAA,IACL,IAAI,IAAI,OAAa;AACnB,YAAM,EAAE,IAAI,CAAC,GAAG,KAAK;AAAA,IACvB;AAAA,IACA,IAAI,IAAiC;AACnC,YAAM,OAAO,MAAM,EAAE;AACrB,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AACA,WAAK,CAAC,IAAI;AACV,aAAO,KAAK,CAAC;AAAA,IACf;AAAA,IACA,IAAI,IAAa;AACf,YAAM,OAAO,MAAM,EAAE;AACrB,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AACA,WAAK,CAAC,IAAI;AACV,aAAO;AAAA,IACT;AAAA,IACA,OAAO,IAA2B;AAChC,aAAO,OAAO,MAAM,EAAE;AAAA,IACxB;AAAA,EACF;AACF;;;AChCA,OAAOA,iBAAgB;AACvB,OAAOC,SAAQ;AAEf,SAAS,MAAM,MAAc,WAAwC,SAAS;AAC5E,QAAM,gBAAgB,YAAY,KAAK,IAAI;AAE3C,MAAI,CAAC,SAAS,KAAK,EAAE,SAAS,QAAQ,KAAK,CAAC,eAAe;AAEzD,WAAO,KAAK,WAAW,OAAO,GAAG,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ;AAAA,EAChE;AAGA,SAAO,KAAK,WAAW,OAAO,GAAG,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ;AAChE;AAEO,SAAS,gBAAgB,SAAyB,UAA0B,WAAwC,SAAiB;AAC1I,MAAI,CAAC,WAAW,CAAC,UAAU;AACzB,UAAM,IAAI,MAAM,uEAAuE,WAAW,MAAM,YAAY,IAAI;AAAA,EAC1H;AAEA,QAAM,eAAeD,YAAW,SAAS,SAAS,QAAQ;AAI1D,QAAM,OAAO,MAAM,cAAc,QAAQ;AAEzC,MAAI,KAAK,WAAW,KAAK,GAAG;AAC1B,WAAO,KAAK,QAAQA,YAAW,SAAS,IAAI,GAAGA,YAAW,SAAS,MAAMA,YAAW,QAAQ,QAAQ,CAAC,CAAC;AAAA,EACxG;AAEA,SAAO,KAAK,KAAK,QAAQA,YAAW,SAAS,IAAI,GAAGA,YAAW,SAAS,MAAMA,YAAW,QAAQ,QAAQ,CAAC,CAAC;AAC7G;AAIO,SAAS,YAAY,MAA2C;AACrE,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,SAAOA,YAAW,QAAQ,IAAI,IAAI,SAAS;AAC7C;AAEA,eAAsB,KAAK,MAA+B;AACxD,SAAOC,IAAG,SAAS,MAAM,EAAE,UAAU,OAAO,CAAC;AAC/C;;;AC5CO,SAAS,MAAM,MAAc;AAClC,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,IAAI;AACxB,QAAI,KAAK,MAAM;AACb,aAAO;AAAA,IACT;AAAA,EACF,SAAS,OAAP;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ACVA,SAAS,WAAW,+BAA+B;AAW5C,SAAS,mBAAmB,MAAY,UAAmB,CAAC,GAAG;AACpE,QAAM,EAAE,MAAM,IAAI;AAElB,SAAO,KACJ,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AAC7B,UAAM,gBAAgB,UAAU,KAAK,EAAE,WAAW,IAAI,WAAW,wBAAwB,CAAC;AAE1F,QAAI,OAAO;AACT,UAAI,KAAK,GAAG,kBAAkB,UAAU,OAAO;AAAA,IACjD,OAAO;AACL,UAAI,KAAK,GAAG,eAAe;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,CAAa,EAChB,KAAK,IAAI;AACd;;;AC3BO,SAAS,WAAuC,GAAM,GAAM;AACjE,MAAI,EAAE,OAAO,EAAE,MAAM;AACnB,WAAO;AAAA,EACT;AACA,MAAI,EAAE,OAAO,EAAE,MAAM;AACnB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ACRO,SAAS,qBAAqB,EAAE,SAAS,GAAwC;AACtF,QAAM,mBAAmB,SAAS,OAAO,OAAO;AAEhD,MAAI,CAAC,iBAAiB,QAAQ;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,iBAAiB,OAAO,CAAC,KAAK,YAAY;AACrD,WAAO,GAAG;AAAA,IAAU;AAAA,EACtB,GAAG,KAAK;AAER,SAAO,GAAG;AAAA;AACZ;;;ACZO,SAAS,cAAc,cAAsB,MAA8B;AAChF,MAAI,OAAO,KAAK,YAAY,KAAK;AACjC,MAAI,MAAM;AACR,SAAK,YAAY,IAAI,EAAE;AACvB,oBAAgB;AAAA,EAClB;AACA,OAAK,YAAY,IAAI;AACrB,SAAO;AACT;;;ACRA,eAAsB,QAAQ,IAAY;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,MAAM;AACf,cAAQ,IAAI;AAAA,IACd,GAAG,EAAE;AAAA,EACP,CAAC;AACH;;;ACIO,IAAM,QAAN,MAAY;AAAA,EACA,QAAqB,CAAC;AAAA,EAEvC,cAAc;AAAA,EAEN;AAAA,EAER,YAAY,aAAqB;AAC/B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAO,MAAgC;AACrC,WAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,YAAM,OAAkB,EAAE,QAAQ,SAAS,KAAK;AAChD,WAAK,MAAM,KAAK,IAAI;AACpB,WAAK,KAAK;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEQ,OAAa;AACnB,QAAI,KAAK,eAAe,KAAK,aAAa;AACxC;AAAA,IACF;AACA,SAAK;AAEL,QAAI;AACJ,WAAQ,QAAQ,KAAK,MAAM,MAAM,GAAI;AACnC,YAAM,EAAE,QAAQ,SAAS,KAAK,IAAI;AAClC,WAAK,EACF,KAAK,CAAC,WAAW,QAAQ,MAAM,CAAC,EAChC,MAAM,CAAC,QAAQ,OAAO,GAAG,CAAC;AAAA,IAC/B;AAEA,SAAK;AAAA,EACP;AACF;;;AC7CO,SAAS,eAAe,MAAuB;AACpD,SAAO,OAAO,KAAK,WAAW,KAAK,KAAK,IAAI;AAC9C;;;ACFO,SAAS,eAA8E,UAAkB,OAA0B,QAAW;AACnJ,MAAI,CAAC,MAAM;AACT,WAAO,SAAS,QAAQ,cAAc,EAAE;AAAA,EAC1C;AAEA,SAAO,SAAS,QAAQ,cAAc,CAAC,UAAU;AAC/C,UAAM,QAAQ,KAAK,MAAM,MAAM,OAAO,EAAE,OAAO,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC;AAEjE,WAAO,SAAS;AAAA,EAClB,CAAC;AACH;;;ACVA,SAAS,cAAc;AAEvB,eAAsB,MAAM,MAAc;AACxC,SAAO,OAAO,IAAI;AACpB;;;ACJA,OAAO,aAAa;AAQb,IAAM,WAAN,MAA4B;AAAA,EAC1B;AAAA,EAEA;AAAA,EAEA,WAA+B,CAAC;AAAA,EAEvC,YAAY,MAAS,QAAsB;AACzC,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,MAAsB;AAC7B,UAAM,QAAQ,IAAI,SAAS,MAAM,IAAI;AACrC,QAAI,CAAC,KAAK,UAAU;AAClB,WAAK,WAAW,CAAC;AAAA,IACnB;AACA,SAAK,SAAS,KAAK,KAAK;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,MAA8B;AACjC,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,KAAK,MAAM;AACtB,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,UAAU,QAAQ;AACzB,eAAS,IAAI,GAAG,EAAE,OAAO,IAAI,KAAK,UAAU,SAA6B,MAAM,IAAI,QAAQ,KAAK;AAC9F,iBAAS,KAAK,SAAS,CAAC,EAAE,KAAK,IAAI;AACnC,YAAI,QAAQ;AACV,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAwB;AAC1B,QAAI,CAAC,KAAK,YAAY,KAAK,SAAS,WAAW,GAAG;AAEhD,aAAO,CAAC,IAAI;AAAA,IACd;AAGA,UAAM,SAAwB,CAAC;AAC/B,QAAI,KAAK,UAAU;AACjB,eAAS,IAAI,GAAG,EAAE,OAAO,IAAI,KAAK,UAAU,IAAI,QAAQ,KAAK;AAE3D,eAAO,KAAK,MAAM,QAAQ,KAAK,SAAS,CAAC,EAAE,MAAM;AAAA,MACnD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAoB;AACtB,QAAI,CAAC,KAAK,QAAQ;AAChB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,QAAQ,UAAiD;AACvD,QAAI,OAAO,aAAa,YAAY;AAClC,YAAM,IAAI,UAAU,uCAAuC;AAAA,IAC7D;AAGA,aAAS,IAAI;AAGb,QAAI,KAAK,UAAU;AACjB,eAAS,IAAI,GAAG,EAAE,OAAO,IAAI,KAAK,UAAU,IAAI,QAAQ,KAAK;AAC3D,aAAK,SAAS,CAAC,EAAE,QAAQ,QAAQ;AAAA,MACnC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAc,MAAmB,MAAc,UAA2B,CAAC,GAAuB;AAChG,QAAI;AACF,YAAM,UAAU,MAAM,QAAQ,QAAQ,OAAO,IAAI,QAAQ,UAAW,CAAC,QAAQ,OAAO,EAAE,OAAO,OAAO;AACpG,YAAM,eAAe,QAAQ,MAAM,EAAE,YAAY,QAAQ,YAAY,SAAS,CAAC,gBAAgB,GAAG,OAAO,EAAE,CAAC;AAE5G,UAAI,CAAC,cAAc;AACjB,eAAO;AAAA,MACT;AAEA,YAAM,WAAW,IAAI,SAAS,EAAE,MAAM,aAAa,MAAM,MAAM,aAAa,MAAM,MAAM,aAAa,QAAQ,YAAY,aAAa,IAAI,EAAE,CAAC;AAE7I,YAAM,UAAU,CAAC,MAAuB,SAAwB;AAC9D,cAAM,UAAU,KAAK,SAAS,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,QAAQ,YAAY,KAAK,IAAI,EAAE,CAAC;AAE7G,YAAI,KAAK,UAAU,QAAQ;AACzB,eAAK,UAAU,QAAQ,CAAC,UAAU;AAChC,oBAAQ,SAAS,KAAK;AAAA,UACxB,CAAC;AAAA,QACH;AAAA,MACF;AAEA,mBAAa,UAAU,QAAQ,CAAC,UAAU,QAAQ,UAAU,KAAK,CAAC;AAElE,aAAO;AAAA,IACT,SAAS,GAAP;AACA,YAAM,IAAI,MAAM,2EAA2E,EAAE,OAAO,EAAE,CAAC;AAAA,IACzG;AAAA,EACF;AACF;;;ACtHA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,sBAAsB,MAAsB;AAC1D,MAAI,QAAQ,cAAc,SAAS,IAAI,GAAG;AACxC,WAAO,IAAI;AAAA,EACb;AAEA,SAAO;AACT;;;AC9FO,SAAS,cAAc,SAAuC;AACnE,QAAM,WAAW,MAAM;AACvB,QAAM,kBAAkB;AAExB,QAAM,cAAc,CAAC;AAErB,QAAM,YAAY,MAAM;AACxB,QAAM,oBAAoB,SAAS,kBAAkBC,cAAaC,eAAc;AAC9E,WAAOA;AAAA,EACT;AACA,QAAM,kBAAkB,aAAuB,WAAW,aAAa;AAEvE,QAAM,eAAe,YAAY;AACjC,QAAM,oBAAoB;AAC1B,QAAM,kBAAkB;AAExB,SAAO;AACT;;;ACnBO,IAAM,YACX,CAAC,YACD,CAAC,MAAM,OACL,GAAG,MAAM,EAAE,WACb,CAAC;;;ACJI,IAAM,WAAW,CAAqB,IAAuB,UAA+D;AACjI,MAAI,OAAO;AACX,MAAIC;AACJ,MAAI,YAAY;AAEhB,SAAO;AAAA,IACL,IAAI,SAAY;AACd,UAAI,WAAW;AACb,eAAO;AAAA,MACT;AACA,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AAEA,YAAM,MAAM,GAAG,GAAG,IAAI;AAEtB,aAAO;AAEP,MAAAA,WAAU,WAAW,MAAM;AACzB,eAAO;AAAA,MACT,GAAG,KAAK;AAER,aAAO;AAAA,IACT;AAAA,IACA,MAAM;AACJ,kBAAY;AACZ,mBAAaA,QAAO;AAAA,IACtB;AAAA,EACF;AACF;;;AnBtBO,IAAM,cAAN,MAAkB;AAAA,EACf,QAA2C,oBAAI,IAAI;AAAA,EAEnD;AAAA,EAEA;AAAA,EAER,YAAY,SAAoD;AAC9D,QAAI,SAAS;AACX,WAAK,OAAO,QAAQ;AACpB,WAAK,QAAQ,QAAQ;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,SAAS,IAAU;AACzB,WAAO,KAAK,MAAM,IAAI,EAAE;AAAA,EAC1B;AAAA,EAEA,eAAe,MAAkD;AAC/D,QAAI;AAEJ,SAAK,MAAM,QAAQ,CAAC,SAAS;AAC3B,UAAI,KAAK,KAAK,SAAS,MAAM;AAC3B,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,QAAQ;AACV,UAAM,QAAgB,CAAC;AACvB,SAAK,MAAM,QAAQ,CAAC,SAAS;AAC3B,YAAM,KAAK,KAAK,IAAI;AAAA,IACtB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,cAAc;AAChB,UAAM,QAAsB,CAAC;AAC7B,SAAK,MAAM,QAAQ,CAAC,SAAS;AAC3B,YAAM,KAAK,IAAI;AAAA,IACjB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,MAAY;AACpB,UAAM,YAAwB,EAAE,IAAI,OAAO,WAAW,GAAG,MAAM,QAAQ,MAAgB;AAEvF,SAAK,MAAM,IAAI,UAAU,IAAI,SAAS;AAEtC,QAAI,KAAK,OAAO;AACd,YAAM,KAAK,MAAM,IAAI,YAAY;AAC/B,cAAM,KAAK,OAAO,UAAU,IAAI,IAAI;AAAA,MACtC,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,MAAY;AACtB,QAAI,CAAC,KAAK,KAAK,SAAS,KAAK,QAAQ,GAAG;AAAA,IAExC;AAEA,UAAM,gBAAgB,KAAK,eAAe,KAAK,IAAI;AAEnD,QAAI,eAAe;AAEjB,YAAM,sBAAsB,KAAK,UAAU,cAAc,KAAK,OAAO,SAAS,KAAK,MAAM;AAEzF,UAAI,qBAAqB;AACvB,eAAO,QAAQ,QAAQ,IAAI;AAAA,MAC7B;AAEA,WAAK,MAAM,OAAO,cAAc,EAAE;AAElC,aAAO,KAAK,IAAI;AAAA,QACd,GAAG;AAAA,QACH,QAAQ,GAAG,cAAc,KAAK;AAAA,EAAW,KAAK;AAAA,QAC9C,SAAS,CAAC,GAAI,cAAc,KAAK,WAAW,CAAC,GAAI,GAAI,KAAK,WAAW,CAAC,CAAE;AAAA,QACxE,SAAS,CAAC,GAAI,cAAc,KAAK,WAAW,CAAC,GAAI,GAAI,KAAK,WAAW,CAAC,CAAE;AAAA,MAC1E,CAAC;AAAA,IACH;AACA,WAAO,KAAK,IAAI,IAAI;AAAA,EACtB;AAAA,EAEA,UAAU,IAAU,QAAgB;AAClC,UAAM,YAAY,KAAK,SAAS,EAAE;AAClC,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,cAAU,SAAS;AACnB,SAAK,MAAM,IAAI,IAAI,SAAS;AAAA,EAC9B;AAAA,EAEA,IAAI,IAAU;AACZ,UAAM,YAAY,KAAK,SAAS,EAAE;AAClC,WAAO,WAAW;AAAA,EACpB;AAAA,EAEA,OAAO,IAAU;AACf,UAAM,YAAY,KAAK,SAAS,EAAE;AAClC,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,SAAK,UAAU,IAAI,SAAS;AAAA,EAC9B;AAAA,EAEA,MAAM,SAAS,QAAkC;AAC/C,QAAI,KAAK,OAAO;AACd,aAAO,KAAK,MAAM,IAAI,YAAY;AAChC,eAAO,MAAM,GAAG,MAAM;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,WAAO,MAAM,GAAG,MAAM;AAAA,EACxB;AAAA,EAEA,MAAM,QAAQ,QAAiC;AAC7C,QAAI,KAAK,OAAO;AACd,aAAO,KAAK,MAAM,IAAI,YAAY;AAChC,eAAO,KAAK,GAAG,MAAM;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,WAAO,KAAK,GAAG,MAAM;AAAA,EACvB;AACF;;;AoB1IA,OAAOJ,iBAAgB;AAEvB,SAAS,yBAAyB,yBAAyB,aAAa;AAWjE,SAAS,aAAa,MAAc,UAA2B,CAAC,GAAkB;AACvF,QAAM,OAAO,SAAS,MAAoB,MAAM,EAAE,YAAY,QAAQ,GAAG,QAAQ,CAAC;AAElF,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,CAACK,QAAe,gBAA6B;AAC/D,QAAI,CAAC,YAAY,UAAU;AACzB,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,YAAY,UAAU,SAAS,GAAG;AACpC,YAAM,OAAOL,YAAW,QAAQ,YAAY,KAAK,MAAM,UAAU;AACjE,YAAM,UAAU,YAAY,SACzB,IAAI,CAAC,SAAS;AACb,YAAI,CAAC,MAAM;AACT,iBAAO;AAAA,QACT;AAEA,cAAM,aAAqB,KAAK,KAAK,SAAS,cAAc,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,KAAK,QAAQ,YAAY,EAAE;AAG9H,YAAI,WAAW,SAAS,OAAO,KAAK,KAAK,SAAS,OAAO,GAAG;AAC1D,iBAAO;AAAA,QACT;AAEA,eAAO,EAAE,MAAM,WAAW;AAAA,MAC5B,CAAC,EACA,OAAO,OAAO;AAEjB,MAAAK,OAAM,KAAK;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,kBAAY,UAAU,QAAQ,CAAC,UAAU;AACvC,cAAM,OAAOL,YAAW,QAAQ,YAAY,KAAK,MAAM,UAAU;AACjE,cAAM,aAAa,MAAM,KAAK,SAAS,cAAc,KAAK,MAAM,KAAK,SAAS,KAAK,MAAM,KAAK,KAAK,QAAQ,YAAY,EAAE;AAEzH,QAAAK,OAAM,KAAK;AAAA,UACT;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,SAAS,CAAC,EAAE,MAAM,WAAW,CAAC;AAAA,QAChC,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,gBAAY,SAAS,QAAQ,CAAC,cAAc;AAC1C,kBAAYA,QAAO,SAAS;AAAA,IAC9B,CAAC;AAED,WAAOA;AAAA,EACT;AAEA,QAAM,QAAQ,YAAY,CAAC,GAAG,IAAI;AAElC,SAAO;AACT;AAEO,SAAS,aAAa,OAAmC;AAC9D,SAAQ,MAAM,OAAO,OAAO,EAAa,OAAO,CAAC,KAAK,SAAe;AACnE,UAAM,YAAY,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,KAAK,IAAI;AAEjE,QAAI,cAAc,IAAI;AACpB,YAAM,OAAO,IAAI,SAAS;AAC1B,UAAI,SAAS,IAAI;AAAA,QACf,GAAG;AAAA,QACH,QAAQ,KAAK,UAAU,KAAK,SAAS,GAAG,KAAK;AAAA,EAAW,KAAK,WAAW;AAAA,QACxE,SAAS,CAAC,GAAI,KAAK,WAAW,CAAC,GAAI,GAAI,KAAK,WAAW,CAAC,CAAE;AAAA,QAC1D,SAAS,CAAC,GAAI,KAAK,WAAW,CAAC,GAAI,GAAI,KAAK,WAAW,CAAC,CAAE;AAAA,MAC5D;AAAA,IACF,OAAO;AACL,UAAI,KAAK,IAAI;AAAA,IACf;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,CAAW;AACjB;AAEO,SAAS,cAAc,MAAoB;AAChD,MAAI,EAAE,OAAO,IAAI;AAGjB,MAAI,CAAC,KAAK,SAAS,SAAS,KAAK,GAAG;AAClC,WAAO,KAAK;AAAA,EACd;AACA,QAAM,UAA2B,CAAC;AAClC,QAAM,UAA2B,CAAC;AAElC,OAAK,SAAS,QAAQ,CAAC,SAAS;AAC9B,UAAM,iBAAiB,QAAQ,KAAK,CAAC,QAAQ,IAAI,SAAS,KAAK,IAAI;AAEnE,QAAI,CAAC,gBAAgB;AACnB,cAAQ,KAAK;AAAA,QACX,GAAG;AAAA,QACH,MAAM,MAAM,QAAQ,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK;AAAA,MAClE,CAAC;AAAA,IACH;AAEA,QAAI,kBAAkB,CAAC,MAAM,QAAQ,eAAe,IAAI,KAAK,eAAe,SAAS,KAAK,MAAM;AAC9F,cAAQ,KAAK,IAAI;AAAA,IACnB;AAEA,QAAI,kBAAkB,MAAM,QAAQ,eAAe,IAAI,GAAG;AACxD,UAAI,MAAM,QAAQ,KAAK,IAAI,GAAG;AAC5B,uBAAe,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,eAAe,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC;AAAA,MAC3E;AAAA,IACF;AAAA,EACF,CAAC;AAED,OAAK,SAAS,QAAQ,CAAC,SAAS;AAC9B,UAAM,SAAS,QAAQ,KAAK,CAAC,QAAQ,IAAI,SAAS,KAAK,IAAI;AAC3D,QAAI,CAAC,QAAQ;AACX,cAAQ,KAAK;AAAA,QACX,GAAG;AAAA,QACH,MAAM,MAAM,QAAQ,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK;AAAA,MAClE,CAAC;AAAA,IACH;AAEA,QAAI,UAAU,CAAC,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,SAAS,KAAK,QAAQ,OAAO,YAAY,KAAK,SAAS;AACzG,cAAQ,KAAK,IAAI;AAAA,IACnB;AAEA,QAAI,UAAU,MAAM,QAAQ,OAAO,IAAI,GAAG;AACxC,UAAI,MAAM,QAAQ,KAAK,IAAI,GAAG;AAC5B,eAAO,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC;AAAA,MAC3D;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,cAAc,QAAQ,OAAO,CAAC,MAAM,SAAS;AACjD,WAAO,CAAC,GAAG,MAAM,wBAAwB,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,YAAY,KAAK,WAAW,CAAC,CAAC;AAAA,EAC7G,GAAG,CAAC,CAA2B;AAC/B,QAAM,eAAe,MAAM,WAAW;AAEtC,QAAM,cAAc,QAAQ,OAAO,CAAC,MAAM,SAAS;AACjD,WAAO,CAAC,GAAG,MAAM,wBAAwB,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,YAAY,KAAK,YAAY,SAAS,KAAK,QAAQ,CAAC,CAAC;AAAA,EACpI,GAAG,CAAC,CAA2B;AAC/B,QAAM,eAAe,MAAM,WAAW;AAEtC,MAAI,cAAc;AAChB,aAAS,GAAG;AAAA,EAAiB;AAAA,EAC/B;AAEA,MAAI,cAAc;AAChB,aAAS,GAAG;AAAA,EAAiB;AAAA,EAC/B;AAEA,SAAO;AACT;;;ACtKA,OAAOL,iBAAgB;AAYhB,SAAS,aAAoE,SAA+B;AACjH,SAAO,CAAC,YAA0B;AAChC,UAAM,SAAS,QAAQ,OAAO;AAC9B,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AAGA,QAAI,CAAC,OAAO,WAAW;AACrB,aAAO,YAAY,SAAS,UAAU,MAAM;AAC1C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAcO,IAAM,OAAO;AAEb,IAAM,eAAe,aAAgC,CAAC,YAAY;AACvE,QAAM,EAAE,aAAa,aAAa,aAAa,KAAK,IAAI;AAExD,QAAM,MAAqB;AAAA,IACzB,IAAI,SAAS;AACX,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA;AAAA,IACA,MAAM,WAAW,OAAO;AAEtB,YAAM,QAAQ,cAAc;AAC5B,YAAM,UAAU,QAAQ,OAAO,SAC3B,OAAO,CAAC,WAAW,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,OAAO,IAAI,CAAC,EACjE,KAAK,CAAC,GAAG,MAAM;AACd,YAAI,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ;AACjC,iBAAO;AAAA,QACT;AACA,YAAI,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ;AACjC,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC;AAEH,YAAM,aAAa,UAAU,CAAC,GAAG;AAEjC,aAAO,QAAQ;AAAA,QACb,MAAM,IAAI,CAAC,SAAS;AAClB,gBAAM,eAAe;AAAA,YACnB,GAAG;AAAA,YACH,MAAM;AAAA,cACJ,GAAI,KAAK,QAAQ,CAAC;AAAA,cAClB;AAAA,YACF;AAAA,UACF;AAEA,cAAI,KAAK,UAAU;AACjB,mBAAO,YAAY,IAAI,YAAY;AAAA,UACrC;AAEA,iBAAO,YAAY,YAAY,YAAY;AAAA,QAC7C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA;AAAA,IACA,aAAa,CAAC,WAAW;AACvB,YAAMM,QAAO,YAAY,MAAM;AAE/B,aAAO,sBAAsBA,KAAI;AAAA,IACnC;AAAA,IACA;AAAA,IACA,OAAO,kBAAkB,uBAAO,OAAO,IAAI,CAAC;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,UAAU;AACpB,YAAM,OAAON,YAAW,QAAQ,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,IAAI;AAEzE,aAAOA,YAAW,QAAQ,MAAM,QAAQ;AAAA,IAC1C;AAAA,IACA,YAAYM,OAAM;AAChB,aAAOA;AAAA,IACT;AAAA,EACF;AACF,CAAC;;;AC3GM,IAAM,sBAAN,cAAkC,MAAM;AAAA,EACtC;AAAA,EAEA;AAAA,EAEP,YAAY,SAAiB,SAAiF;AAC5G,UAAM,SAAS,EAAE,OAAO,QAAQ,MAAM,CAAC;AAEvC,SAAK,OAAO;AACZ,SAAK,SAAS,QAAQ;AACtB,SAAK,gBAAgB,QAAQ;AAAA,EAC/B;AACF;;;ACbO,IAAM,cAAN,cAA0B,MAAM;AAAA,EAC9B;AAAA,EAEP,YAAY,SAAiB,SAA0D;AACrF,UAAM,SAAS,EAAE,OAAO,QAAQ,MAAM,CAAC;AAEvC,SAAK,OAAO;AACZ,SAAK,gBAAgB,QAAQ;AAAA,EAC/B;AACF;;;ACOA,IAAM,YAEF;AAAA,EACF,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AACZ;AACO,IAAM,QAAQ,OAAO,KAAK,SAAS;AAInC,IAAM,gBAAN,MAAoB;AAAA,EAClB;AAAA,EAES;AAAA,EAEC;AAAA,EAEA;AAAA,EAEV;AAAA,EAEA;AAAA,EAEA,WAAuB,CAAC;AAAA,EAE/B,YAAY,QAAoB,SAAkB;AAChD,SAAK,YAAY,QAAQ,WAAW,KAAK,IAAI;AAC7C,SAAK,QAAQ,IAAI,MAAM,EAAE;AAEzB,SAAK,cAAc,IAAI,YAAY,EAAE,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,CAAC;AAC5E,SAAK,OAAO,aAAa;AAAA,MACvB;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,aAAa,KAAK;AAAA,MAClB,aAAa,KAAK,YAAY,KAAK,IAAI;AAAA,IACzC,CAAC;AAGD,SAAK,UAAU,CAAC,KAAK,MAAM,GAAI,OAAO,WAAW,CAAC,CAAE;AAAA,EACtD;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc,CAAC,WAA8B;AAC3C,QAAI,OAAO,YAAY;AACrB,aAAO,KAAK,kBAAkB;AAAA,QAC5B,YAAY,OAAO;AAAA,QACnB,UAAU;AAAA,QACV,YAAY,CAAC,OAAO,UAAU,OAAO,WAAW,OAAO,OAAO;AAAA,MAChE,CAAC;AAAA,IACH;AACA,WAAO,KAAK,cAAc;AAAA,MACxB,UAAU;AAAA,MACV,YAAY,CAAC,OAAO,UAAU,OAAO,WAAW,OAAO,OAAO;AAAA,IAChE,CAAC,EAAE;AAAA,EACL;AAAA,EAEA,cAAc,CAAC,WAA8B;AAC3C,QAAI,OAAO,YAAY;AACrB,aAAO,KAAK,kBAAkB;AAAA,QAC5B,YAAY,OAAO;AAAA,QACnB,UAAU;AAAA,QACV,YAAY,CAAC,OAAO,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH;AACA,WAAO,KAAK,cAAc;AAAA,MACxB,UAAU;AAAA,MACV,YAAY,CAAC,OAAO,IAAI;AAAA,IAC1B,CAAC,EAAE;AAAA,EACL;AAAA,EAEA,OAAO,OAAO,OAAe;AAC3B,WAAO,KAAK,UAAU;AAAA,MACpB,UAAU;AAAA,MACV,YAAY,CAAC,EAAE;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAA8C;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIsD;AACpD,UAAM,SAAS,KAAK,UAAU,UAAU,UAAU;AAElD,WAAO,KAAK,QAAQ;AAAA,MAClB,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,kBAAkD;AAAA,IAChD;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIsC;AACpC,UAAM,SAAS,KAAK,UAAU,UAAU,UAAU;AAElD,WAAO,KAAK,YAAY;AAAA,MACtB,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAA0C;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIgC;AAC9B,QAAI,UAAuC,QAAQ,QAAQ,IAAqC;AAEhG,eAAW,UAAU,KAAK,iBAAiB,QAAQ,GAAG;AACpD,UAAI,WAAW,QAAQ,IAAI,MAAM,GAAG;AAClC;AAAA,MACF;AACA,gBAAU,QAAQ,KAAK,OAAO,gBAAgB;AAC5C,YAAI,aAAa,UAAU,MAAM;AAC/B,iBAAO;AAAA,QACT;AACA,cAAM,QAAQ,MAAM,KAAK,QAAW;AAAA,UAClC,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,eAAO,QAAQ,QAAQ;AAAA,UACrB;AAAA,UACA,QAAQ;AAAA,QACV,CAAuB;AAAA,MACzB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAA8C;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIuB;AACrB,QAAI,cAAkC;AAEtC,eAAW,UAAU,KAAK,iBAAiB,QAAQ,GAAG;AACpD,UAAI,WAAW,QAAQ,IAAI,MAAM,GAAG;AAClC;AAAA,MACF;AAEA,oBAAc;AAAA,QACZ,QAAQ,KAAK,YAAe;AAAA,UAC1B,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD;AAAA,MACF;AAEA,UAAI,aAAa,UAAU,MAAM;AAC/B;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAA4D;AAAA,IAChE;AAAA,IACA;AAAA,EACF,GAG+B;AAC7B,UAAM,mBAAsC,CAAC;AAE7C,eAAW,UAAU,KAAK,iBAAiB,QAAQ,GAAG;AAYpD,YAAM,UAAkC,KAAK,QAAQ,EAAE,UAAU,gBAAgB,UAAU,YAAY,OAAO,CAAC;AAE/G,UAAI,SAAS;AACX,yBAAiB,KAAK,OAAO;AAAA,MAC/B;AAAA,IACF;AACA,UAAM,UAAU,MAAM,QAAQ,WAAW,gBAAgB;AACzD,UAAM,SAAS,QAAQ,OAAO,CAAC,WAAW,OAAO,WAAW,UAAU,EAAE,IAAI,CAAC,WAAY,OAAiC,MAAM;AAEhI,QAAI,OAAO,QAAQ;AACjB,YAAM,IAAI,oBAAoB,SAAS,EAAE,QAAQ,eAAe,KAAK,CAAC;AAAA,IACxE;AAEA,WAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,WAAW,WAAW,EAAE,IAAI,CAAC,WAAY,OAAmD,KAAK;AAAA,EAC5I;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAA+C;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAI0B;AACxB,UAAM,CAAC,WAAW,GAAG,IAAI,IAAI;AAE7B,QAAI,UAAiC,QAAQ,QAAQ,SAAS;AAC9D,eAAW,UAAU,KAAK,iBAAiB,QAAQ,GAAG;AACpD,gBAAU,QACP,KAAK,CAAC,SAAS;AACd,cAAM,QAAQ,KAAK,QAAQ;AAAA,UACzB,UAAU;AAAA,UACV;AAAA,UACA,YAAY,CAAC,MAAM,GAAG,IAAI;AAAA,UAC1B;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT,CAAC,EACA,KAAK,CAAC,WAAW,OAAO,KAAK,KAAK,KAAK,KAAK,WAAW,QAAsC,MAAM,CAAC;AAAA,IACzG;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAwC,EAAE,UAAU,WAAW,GAAiE;AAC9H,QAAI,UAAgC,QAAQ,QAAQ;AACpD,eAAW,UAAU,KAAK,iBAAiB,QAAQ,GAAG;AACpD,gBAAU,QAAQ;AAAA,QAAK,MACrB,KAAK,QAAQ;AAAA,UACX,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO,QAAQ,KAAK,QAAQ;AAAA,EAC9B;AAAA,EAEQ,iBAAiB,WAAgD;AACvE,UAAM,UAAU,CAAC,GAAG,KAAK,OAAO,EAAE,OAAO,CAAC,WAAW,OAAO,SAAS,MAAM;AAE3E,WAAO;AAAA,EACT;AAAA,EAEO,UAAU,UAAiC,YAAgC;AAChF,UAAM,UAAU,CAAC,GAAG,KAAK,OAAO;AAEhC,UAAM,qBAAqB,QAAQ,KAAK,CAAC,SAAS,KAAK,SAAS,cAAc,KAAK,QAAQ,CAAC;AAC5F,QAAI,CAAC,oBAAoB;AAGvB,aAAO,KAAK;AAAA,IACd;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,UAAgC;AAClD,SAAK,WAAW,KAAK,MAAM,UAAU,IAAI;AAEzC,QAAI,UAAU;AACZ,WAAK,SAAS,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,QAAwD;AAAA,IAC9D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAK4B;AAC1B,UAAM,OAAO,OAAO,QAAQ;AAE5B,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,WAAO,QAAQ,QAAQ,EACpB,KAAK,MAAM;AAEV,WAAK,WAAW;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,YAAY;AAC9B,cAAM,aAAc,KAAkB,MAAM,KAAK,KAAK,KAAK,UAAU;AAErE,YAAI,UAAU,UAAU,GAAG;AACzB,iBAAO,QAAQ,QAAQ,UAAU,EAAE,KAAK,CAAC,WAAoB;AAC3D,iBAAK,YAAY;AAAA,cACf;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAED,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,MACT;AAEA,WAAK,YAAY;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT,CAAC,EACA,MAAM,CAAC,MAAa;AACnB,WAAK,QAAW,GAAG,QAAQ,QAAQ;AAAA,IACrC,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,YAA4C;AAAA,IAClD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAKsC;AACpC,UAAM,OAAO,OAAO,QAAQ;AAE5B,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI;AAEF,WAAK,WAAW;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,YAAY;AAC9B,cAAM,KAAM,KAAkB,MAAM,KAAK,KAAK,KAAK,UAAU;AAE7D,aAAK,YAAY;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,eAAO;AAAA,MACT;AAEA,WAAK,YAAY;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT,SAAS,GAAP;AACA,WAAK,QAAW,GAAY,QAAQ,QAAQ;AAE5C,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,QAAwC,GAAU,QAAoB,UAAa;AACzF,UAAM,OAAO,GAAG,EAAE,oBAAoB,OAAO,eAAe;AAAA;AAE5D,UAAM,IAAI,YAAY,MAAM,EAAE,OAAO,GAAG,eAAe,KAAK,CAAC;AAAA,EAC/D;AACF;AAGA,SAAS,WAAW;AAAC;;;ACtdd,IAAM,wBAAN,cAAoC,MAAM;AAAC;AAE3C,SAAS,gBAAgB,SAAuB,qBAA8C;AACnG,MAAI,cAAwB,CAAC;AAC7B,MAAI,OAAO,wBAAwB,UAAU;AAC3C,kBAAc,CAAC,mBAAmB;AAAA,EACpC,OAAO;AACL,kBAAc;AAAA,EAChB;AAEA,cAAY,QAAQ,CAAC,eAAe;AAClC,UAAM,SAAS,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,UAAU;AAClE,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,sBAAsB,8BAA8B,oBAAoB;AAAA,IACpF;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACpBO,IAAM,eAAN,cAA2B,MAAM;AAAA,EAC/B;AAAA,EAEP,YAAY,SAAiB,SAA+C;AAC1E,UAAM,SAAS,EAAE,OAAO,QAAQ,MAAM,CAAC;AAEvC,SAAK,OAAO;AACZ,SAAK,UAAU,QAAQ,WAAW,CAAC;AAAA,EACrC;AACF;;;ACWA,eAAe,iBAEb,eACA,QAEA,SACwB;AACxB,SAAO;AACT;AAEA,eAAsB,MAAM,SAA6C;AACvE,QAAM,EAAE,QAAQ,OAAO,IAAI;AAE3B,MAAI;AACF,QAAI,CAAC,MAAM,OAAO,MAAM,IAAI,GAAG;AAC7B,YAAM,KAAK,OAAO,MAAM,IAAI;AAAA,IAC9B;AAAA,EACF,SAAS,GAAP;AACA,UAAM,IAAI,MAAM,mGAAmG,EAAE,OAAO,EAAE,CAAC;AAAA,EACjI;AAEA,MAAI,OAAO,OAAO,OAAO;AACvB,UAAM,MAAM,OAAO,OAAO,IAAI;AAAA,EAChC;AAEA,QAAM,YAAY,OAAO,IAAY,SAAe;AAClD,UAAM,EAAE,KAAK,IAAI;AAEjB,QAAI,OAAsB,cAAc,IAAI;AAE5C,UAAM,EAAE,QAAQ,aAAa,IAAI,MAAM,cAAc,UAAU;AAAA,MAC7D,UAAU;AAAA,MACV,YAAY,CAAC,IAAI;AAAA,IACnB,CAAC;AACD,QAAI,gBAAgB,UAAU,YAAY,GAAG;AAC3C,aAAO,MAAM;AAAA,IACf;AACA,QAAI,gBAAgB,CAAC,UAAU,YAAY,GAAG;AAC5C,aAAO;AAAA,IACT;AAEA,QAAI,MAAM;AACR,YAAM,kBAAkB,MAAM,cAAc,eAAe;AAAA,QACzD,UAAU;AAAA,QACV,YAAY,CAAC,MAAM,IAAI;AAAA,QACvB,QAAQ;AAAA,MACV,CAAC;AAED,UAAI,OAAO,OAAO,SAAS,OAAO,OAAO,UAAU,QAAW;AAC5D,cAAM,cAAc,aAAa;AAAA,UAC/B,UAAU;AAAA,UACV,YAAY,CAAC,iBAAiB,IAAI;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAuB,CAAC,aAAa;AACzC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,EAAE,UAAU,OAAO,IAAI;AAE7B,QAAI,OAAO,aAAa,UAAU,QAAQ;AACxC,aAAO,IAAI,MAAM,EAAE,UAAU,OAAO,UAAU,QAAQ,EAAE,UAAU,YAAY,OAAO,KAAK,EAAE,CAAC;AAAA,IAC/F;AAAA,EACF;AAEA,QAAM,gBAAgB,IAAI,cAAc,QAAQ,EAAE,MAAM,WAA8B,UAAU,CAAC;AACjG,QAAM,EAAE,SAAS,YAAY,IAAI;AAEjC,QAAM,cAAc,aAA+B;AAAA,IACjD,UAAU;AAAA,IACV,YAAY,CAAC,OAAO;AAAA,EACtB,CAAC;AAED,QAAM,cAAc,aAAa;AAAA,IAC/B,UAAU;AAAA,IACV,YAAY,CAAC,MAAM;AAAA,EACrB,CAAC;AAED,QAAM,cAAc,aAAa,EAAE,UAAU,WAAW,CAAC;AAEzD,SAAO,EAAE,OAAO,YAAY,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,QAAQ,cAAc,IAAI,EAAE,EAAE,GAAG,cAAc;AAC7G;;;AClGO,IAAM,eAAe,CAC1B,YAMG;;;ACVE,IAAe,YAAf,MAA2D;AAAA,EACxD,WAAqB,CAAC;AAAA,EAE9B,YAAY,UAAoB,CAAC,GAAe;AAC9C,QAAI,SAAS;AACX,WAAK,WAAW;AAAA,QACd,GAAG,KAAK;AAAA,QACR,GAAG;AAAA,MACL;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK;AAAA,EACd;AAGF;;;ACjBO,IAAe,kBAAf,cAAiF,UAAoB;AAE5G;;;ACIA,IAAO,cAAQ","sourcesContent":["import crypto from 'node:crypto'\n\nimport { read, write } from '../../utils/index.ts'\n\nimport type { Queue, QueueTask } from '../../utils/index.ts'\nimport type { CacheStore, File, Status, UUID } from './types.ts'\n\nexport class FileManager {\n private cache: Map<CacheStore['id'], CacheStore> = new Map()\n\n private task?: QueueTask<File>\n\n private queue?: Queue\n\n constructor(options?: { queue: Queue; task?: QueueTask<File> }) {\n if (options) {\n this.task = options.task\n this.queue = options.queue\n }\n }\n\n private getCache(id: UUID) {\n return this.cache.get(id)\n }\n\n getCacheByPath(path: string | undefined): CacheStore | undefined {\n let cache\n\n this.cache.forEach((item) => {\n if (item.file.path === path) {\n cache = item\n }\n })\n return cache as unknown as CacheStore\n }\n\n get files() {\n const files: File[] = []\n this.cache.forEach((item) => {\n files.push(item.file)\n })\n\n return files\n }\n\n get cachedFiles() {\n const files: CacheStore[] = []\n this.cache.forEach((item) => {\n files.push(item)\n })\n\n return files\n }\n\n async add(file: File) {\n const cacheItem: CacheStore = { id: crypto.randomUUID(), file, status: 'new' as Status }\n\n this.cache.set(cacheItem.id, cacheItem)\n\n if (this.queue) {\n await this.queue.run(async () => {\n await this.task?.(cacheItem.id, file)\n })\n }\n\n return file\n }\n\n addOrAppend(file: File) {\n if (!file.path.endsWith(file.fileName)) {\n // console.warn(`Path ${file.path}(file.path) should end with the fileName ${file.fileName}(file.filename)`)\n }\n\n const previousCache = this.getCacheByPath(file.path)\n\n if (previousCache) {\n // empty source will also return true when using includes\n const sourceAlreadyExists = file.source && previousCache.file.source.includes(file.source)\n\n if (sourceAlreadyExists) {\n return Promise.resolve(file)\n }\n\n this.cache.delete(previousCache.id)\n\n return this.add({\n ...file,\n source: `${previousCache.file.source}\\n${file.source}`,\n imports: [...(previousCache.file.imports || []), ...(file.imports || [])],\n exports: [...(previousCache.file.exports || []), ...(file.exports || [])],\n })\n }\n return this.add(file)\n }\n\n setStatus(id: UUID, status: Status) {\n const cacheItem = this.getCache(id)\n if (!cacheItem) {\n return\n }\n\n cacheItem.status = status\n this.cache.set(id, cacheItem)\n }\n\n get(id: UUID) {\n const cacheItem = this.getCache(id)\n return cacheItem?.file\n }\n\n remove(id: UUID) {\n const cacheItem = this.getCache(id)\n if (!cacheItem) {\n return\n }\n\n this.setStatus(id, 'removed')\n }\n\n async write(...params: Parameters<typeof write>) {\n if (this.queue) {\n return this.queue.run(async () => {\n return write(...params)\n })\n }\n\n return write(...params)\n }\n\n async read(...params: Parameters<typeof read>) {\n if (this.queue) {\n return this.queue.run(async () => {\n return read(...params)\n })\n }\n\n return read(...params)\n }\n}\n","import type { MaybePromise } from '../types.ts'\n\nexport function isPromise<T>(result: MaybePromise<T>): result is Promise<T> {\n return typeof (result as Promise<unknown>)?.then === 'function'\n}\n","import fs from 'fs-extra'\nimport pathParser from 'node:path'\n\nasync function safeWriteFileToPath(path: string, data: string): Promise<void> {\n // resolve the full path and get just the directory, ignoring the file and extension\n const passedPath = pathParser.dirname(pathParser.resolve(path))\n // make the directory, recursively. Theoretically, if every directory in the path exists, this won't do anything.\n await fs.mkdir(passedPath, { recursive: true })\n // write the file to the newly created directory\n return fs.writeFile(pathParser.resolve(path), data, { encoding: 'utf-8' })\n}\n\nexport async function write(data: string, path: string): Promise<void> {\n try {\n await fs.stat(path)\n const oldContent = await fs.readFile(path, { encoding: 'utf-8' })\n if (oldContent?.toString() === data) {\n return\n }\n } catch (_err) {\n return safeWriteFileToPath(path, data)\n }\n\n return safeWriteFileToPath(path, data)\n}\n","export interface Cache<TStore extends object = object> {\n delete(id: keyof TStore): boolean\n get(id: keyof TStore): TStore[keyof TStore] | null\n has(id: keyof TStore): boolean\n set(id: keyof TStore, value: unknown): void\n}\n\nexport function createPluginCache<TStore extends Record<string, [number, unknown]>>(Store: TStore): Cache<TStore> {\n return {\n set(id, value): void {\n Store[id] = [0, value] as TStore[keyof TStore]\n },\n get(id): TStore[keyof TStore] | null {\n const item = Store[id]\n if (!item) {\n return null\n }\n item[0] = 0\n return item[1] as TStore[keyof TStore]\n },\n has(id): boolean {\n const item = Store[id]\n if (!item) {\n return false\n }\n item[0] = 0\n return true\n },\n delete(id: keyof TStore): boolean {\n return delete Store[id]\n },\n }\n}\n","import pathParser from 'node:path'\nimport fs from 'fs-extra'\n\nfunction slash(path: string, platform: 'windows' | 'mac' | 'linux' = 'linux') {\n const isWindowsPath = /^\\\\\\\\\\?\\\\/.test(path)\n\n if (['linux', 'mac'].includes(platform) && !isWindowsPath) {\n // linux and mac\n return path.replaceAll(/\\\\/g, '/').replace('../', '').trimEnd()\n }\n\n // windows\n return path.replaceAll(/\\\\/g, '/').replace('../', '').trimEnd()\n}\n\nexport function getRelativePath(rootDir?: string | null, filePath?: string | null, platform: 'windows' | 'mac' | 'linux' = 'linux'): string {\n if (!rootDir || !filePath) {\n throw new Error(`Root and file should be filled in when retrieving the relativePath, ${rootDir || ''} ${filePath || ''}`)\n }\n\n const relativePath = pathParser.relative(rootDir, filePath)\n\n // On Windows, paths are separated with a \"\\\"\n // However, web browsers use \"/\" no matter the platform\n const path = slash(relativePath, platform)\n\n if (path.startsWith('../')) {\n return path.replace(pathParser.basename(path), pathParser.basename(path, pathParser.extname(filePath)))\n }\n\n return `./${path.replace(pathParser.basename(path), pathParser.basename(path, pathParser.extname(filePath)))}`\n}\n\nexport type PathMode = 'file' | 'directory'\n\nexport function getPathMode(path: string | undefined | null): PathMode {\n if (!path) {\n return 'directory'\n }\n return pathParser.extname(path) ? 'file' : 'directory'\n}\n\nexport async function read(path: string): Promise<string> {\n return fs.readFile(path, { encoding: 'utf8' })\n}\n","export function isURL(data: string) {\n try {\n const url = new URL(data)\n if (url?.href) {\n return true\n }\n } catch (error) {\n return false\n }\n return false\n}\n","import { camelCase, camelCaseTransformMerge } from 'change-case'\n\ntype Data = string[][]\n\ntype Options = {\n typed?: boolean\n}\n/**\n * Convert an string array to a string of parameters that can be used inside a function\n * The parameter name is converted to `camelcase`\n */\nexport function objectToParameters(data: Data, options: Options = {}) {\n const { typed } = options\n\n return data\n .reduce((acc, [key, value]) => {\n const parameterName = camelCase(key, { delimiter: '', transform: camelCaseTransformMerge })\n\n if (typed) {\n acc.push(`${parameterName}: ${value}[\"${key}\"]`)\n } else {\n acc.push(`${parameterName}`)\n }\n\n return acc\n }, [] as string[])\n .join(', ')\n}\n","export function nameSorter<T extends { name: string }>(a: T, b: T) {\n if (a.name < b.name) {\n return -1\n }\n if (a.name > b.name) {\n return 1\n }\n return 0\n}\n","export function createJSDocBlockText({ comments }: { comments: Array<string> }): string {\n const filteredComments = comments.filter(Boolean)\n\n if (!filteredComments.length) {\n return ''\n }\n\n const text = filteredComments.reduce((acc, comment) => {\n return `${acc}\\n* ${comment}`\n }, '/**')\n\n return `${text}\\n*/`\n}\n","export function getUniqueName(originalName: string, data: Record<string, number>) {\n let used = data[originalName] || 0\n if (used) {\n data[originalName] = ++used\n originalName += used\n }\n data[originalName] = 1\n return originalName\n}\n","export async function timeout(ms: number) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(true)\n }, ms)\n })\n}\n","export type QueueTask<T = unknown> = {\n (...args: unknown[]): Promise<T> | Promise<void>\n}\n\ninterface QueueItem {\n reject: <T>(reason?: T) => void\n resolve: <T>(value: T | PromiseLike<T>) => void\n task: QueueTask<unknown>\n}\n\nexport class Queue {\n private readonly queue: QueueItem[] = []\n\n workerCount = 0\n\n private maxParallel: number\n\n constructor(maxParallel: number) {\n this.maxParallel = maxParallel\n }\n\n run<T>(task: QueueTask<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const item: QueueItem = { reject, resolve, task } as QueueItem\n this.queue.push(item)\n this.work()\n })\n }\n\n private work(): void {\n if (this.workerCount >= this.maxParallel) {\n return\n }\n this.workerCount++\n\n let entry: QueueItem | undefined\n while ((entry = this.queue.shift())) {\n const { reject, resolve, task } = entry\n task()\n .then((result) => resolve(result))\n .catch((err) => reject(err))\n }\n\n this.workerCount--\n }\n}\n","export function getEncodedText(text?: string): string {\n return text ? text.replaceAll('`', '\\\\`') : ''\n}\n","export function renderTemplate<TData extends Record<string, string> = Record<string, string>>(template: string, data: TData | undefined = undefined) {\n if (!data) {\n return template.replace(/{{(.*?)}}/g, '')\n }\n\n return template.replace(/{{(.*?)}}/g, (match) => {\n const value = data[match.split(/{{|}}/).filter(Boolean)[0].trim()]\n\n return value || ''\n })\n}\n","import { rimraf } from 'rimraf'\n\nexport async function clean(path: string) {\n return rimraf(path)\n}\n","import dirTree from 'directory-tree'\n\nimport { getPathMode } from '../utils/read.ts'\n\nimport type { DirectoryTree, DirectoryTreeOptions } from 'directory-tree'\n\nexport type TreeNodeOptions = DirectoryTreeOptions\n\nexport class TreeNode<T = unknown> {\n public data: T\n\n public parent?: TreeNode<T>\n\n public children: Array<TreeNode<T>> = []\n\n constructor(data: T, parent?: TreeNode<T>) {\n this.data = data\n this.parent = parent\n return this\n }\n\n addChild(data: T): TreeNode<T> {\n const child = new TreeNode(data, this)\n if (!this.children) {\n this.children = []\n }\n this.children.push(child)\n return child\n }\n\n find(data?: T): TreeNode<T> | null {\n if (!data) {\n return null\n }\n\n if (data === this.data) {\n return this\n }\n\n if (this.children?.length) {\n for (let i = 0, { length } = this.children, target: TreeNode<T> | null = null; i < length; i++) {\n target = this.children[i].find(data)\n if (target) {\n return target\n }\n }\n }\n\n return null\n }\n\n get leaves(): TreeNode<T>[] {\n if (!this.children || this.children.length === 0) {\n // this is a leaf\n return [this]\n }\n\n // if not a leaf, return all children's leaves recursively\n const leaves: TreeNode<T>[] = []\n if (this.children) {\n for (let i = 0, { length } = this.children; i < length; i++) {\n // eslint-disable-next-line prefer-spread\n leaves.push.apply(leaves, this.children[i].leaves)\n }\n }\n return leaves\n }\n\n get root(): TreeNode<T> {\n if (!this.parent) {\n return this\n }\n return this.parent.root\n }\n\n forEach(callback: (treeNode: TreeNode<T>) => void): this {\n if (typeof callback !== 'function') {\n throw new TypeError('forEach() callback must be a function')\n }\n\n // run this node through function\n callback(this)\n\n // do the same for all children\n if (this.children) {\n for (let i = 0, { length } = this.children; i < length; i++) {\n this.children[i].forEach(callback)\n }\n }\n\n return this\n }\n\n public static build<T = unknown>(path: string, options: TreeNodeOptions = {}): TreeNode<T> | null {\n try {\n const exclude = Array.isArray(options.exclude) ? options.exclude : ([options.exclude].filter(Boolean) as RegExp[])\n const filteredTree = dirTree(path, { extensions: options.extensions, exclude: [/node_modules/, ...exclude] })\n\n if (!filteredTree) {\n return null\n }\n\n const treeNode = new TreeNode({ name: filteredTree.name, path: filteredTree.path, type: filteredTree.type || getPathMode(filteredTree.path) })\n\n const recurse = (node: typeof treeNode, item: DirectoryTree) => {\n const subNode = node.addChild({ name: item.name, path: item.path, type: item.type || getPathMode(item.path) })\n\n if (item.children?.length) {\n item.children?.forEach((child) => {\n recurse(subNode, child)\n })\n }\n }\n\n filteredTree.children?.forEach((child) => recurse(treeNode, child))\n\n return treeNode as TreeNode<T>\n } catch (e) {\n throw new Error('Something went wrong with creating index files with the TreehNode class', { cause: e })\n }\n }\n}\n","/**\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = [\n 'abstract',\n 'arguments',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n\n 'Array',\n 'Date',\n 'eval',\n 'function',\n 'hasOwnProperty',\n 'Infinity',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'length',\n 'Math',\n 'name',\n 'NaN',\n 'Number',\n 'Object',\n 'prototype',\n 'String',\n 'toString',\n 'undefined',\n 'valueOf',\n]\n\nexport function transformReservedWord(word?: string | null) {\n if (word && reservedWords.includes(word)) {\n return `_${word}`\n }\n\n return word\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function getStackTrace(belowFn?: Function): NodeJS.CallSite[] {\n const oldLimit = Error.stackTraceLimit\n Error.stackTraceLimit = Infinity\n\n const dummyObject = {} as any\n\n const v8Handler = Error.prepareStackTrace\n Error.prepareStackTrace = function prepareStackTrace(dummyObject, v8StackTrace) {\n return v8StackTrace\n }\n Error.captureStackTrace(dummyObject as object, belowFn || getStackTrace)\n\n const v8StackTrace = dummyObject.stack\n Error.prepareStackTrace = v8Handler\n Error.stackTraceLimit = oldLimit\n\n return v8StackTrace as NodeJS.CallSite[]\n}\n","export const uniqueId = (\n (counter) =>\n (str = '') =>\n `${str}${++counter}`\n)(0)\n","export const throttle = <R, A extends any[]>(fn: (...args: A) => R, delay: number): [(...args: A) => R | undefined, () => void] => {\n let wait = false\n let timeout: NodeJS.Timeout\n let cancelled = false\n\n return [\n (...args: A) => {\n if (cancelled) {\n return undefined\n }\n if (wait) {\n return undefined\n }\n\n const val = fn(...args)\n\n wait = true\n\n timeout = setTimeout(() => {\n wait = false\n }, delay)\n\n return val\n },\n () => {\n cancelled = true\n clearTimeout(timeout)\n },\n ]\n}\n","import pathParser from 'node:path'\n\nimport { createExportDeclaration, createImportDeclaration, print } from '@kubb/ts-codegen'\n\nimport { TreeNode } from '../../utils/index.ts'\n\nimport type ts from 'typescript'\nimport type { Path } from '../../types.ts'\nimport type { PathMode, TreeNodeOptions } from '../../utils/index.ts'\nimport type { File } from './types.ts'\n\ntype TreeNodeData = { type: PathMode; path: Path; name: string }\n\nexport function writeIndexes(root: string, options: TreeNodeOptions = {}): File[] | null {\n const tree = TreeNode.build<TreeNodeData>(root, { extensions: /\\.ts/, ...options })\n\n if (!tree) {\n return null\n }\n\n const fileReducer = (files: File[], currentTree: typeof tree) => {\n if (!currentTree.children) {\n return []\n }\n\n if (currentTree.children?.length > 1) {\n const path = pathParser.resolve(currentTree.data.path, 'index.ts')\n const exports = currentTree.children\n .map((file) => {\n if (!file) {\n return undefined\n }\n\n const importPath: string = file.data.type === 'directory' ? `./${file.data.name}` : `./${file.data.name.replace(/\\.[^.]*$/, '')}`\n\n // TODO weird hacky fix\n if (importPath.includes('index') && path.includes('index')) {\n return undefined\n }\n\n return { path: importPath }\n })\n .filter(Boolean) as File['exports']\n\n files.push({\n path,\n fileName: 'index.ts',\n source: '',\n exports,\n })\n } else {\n currentTree.children?.forEach((child) => {\n const path = pathParser.resolve(currentTree.data.path, 'index.ts')\n const importPath = child.data.type === 'directory' ? `./${child.data.name}` : `./${child.data.name.replace(/\\.[^.]*$/, '')}`\n\n files.push({\n path,\n fileName: 'index.ts',\n source: '',\n exports: [{ path: importPath }],\n })\n })\n }\n\n currentTree.children.forEach((childItem) => {\n fileReducer(files, childItem)\n })\n\n return files\n }\n\n const files = fileReducer([], tree)\n\n return files\n}\n\nexport function combineFiles(files: Array<File | null>): File[] {\n return (files.filter(Boolean) as File[]).reduce((acc, curr: File) => {\n const prevIndex = acc.findIndex((item) => item.path === curr.path)\n\n if (prevIndex !== -1) {\n const prev = acc[prevIndex]\n acc[prevIndex] = {\n ...curr,\n source: prev.source && curr.source ? `${prev.source}\\n${curr.source}` : \"'\",\n imports: [...(prev.imports || []), ...(curr.imports || [])],\n exports: [...(prev.exports || []), ...(curr.exports || [])],\n }\n } else {\n acc.push(curr)\n }\n\n return acc\n }, [] as File[])\n}\n\nexport function getFileSource(file: File): string {\n let { source } = file\n\n // TODO make generic check\n if (!file.fileName.endsWith('.ts')) {\n return file.source\n }\n const imports: File['imports'] = []\n const exports: File['exports'] = []\n\n file.imports?.forEach((curr) => {\n const existingImport = imports.find((imp) => imp.path === curr.path)\n\n if (!existingImport) {\n imports.push({\n ...curr,\n name: Array.isArray(curr.name) ? [...new Set(curr.name)] : curr.name,\n })\n }\n\n if (existingImport && !Array.isArray(existingImport.name) && existingImport.name !== curr.name) {\n imports.push(curr)\n }\n\n if (existingImport && Array.isArray(existingImport.name)) {\n if (Array.isArray(curr.name)) {\n existingImport.name = [...new Set([...existingImport.name, ...curr.name])]\n }\n }\n })\n\n file.exports?.forEach((curr) => {\n const exists = exports.find((imp) => imp.path === curr.path)\n if (!exists) {\n exports.push({\n ...curr,\n name: Array.isArray(curr.name) ? [...new Set(curr.name)] : curr.name,\n })\n }\n\n if (exists && !Array.isArray(exists.name) && exists.name !== curr.name && exists.asAlias === curr.asAlias) {\n exports.push(curr)\n }\n\n if (exists && Array.isArray(exists.name)) {\n if (Array.isArray(curr.name)) {\n exists.name = [...new Set([...exists.name, ...curr.name])]\n }\n }\n })\n\n const importNodes = imports.reduce((prev, curr) => {\n return [...prev, createImportDeclaration({ name: curr.name, path: curr.path, isTypeOnly: curr.isTypeOnly })]\n }, [] as ts.ImportDeclaration[])\n const importSource = print(importNodes)\n\n const exportNodes = exports.reduce((prev, curr) => {\n return [...prev, createExportDeclaration({ name: curr.name, path: curr.path, isTypeOnly: curr.isTypeOnly, asAlias: curr.asAlias })]\n }, [] as ts.ExportDeclaration[])\n const exportSource = print(exportNodes)\n\n if (importSource) {\n source = `${importSource}\\n${source}`\n }\n\n if (exportSource) {\n source = `${exportSource}\\n${source}`\n }\n\n return source\n}\n","import pathParser from 'node:path'\n\nimport { createPluginCache, getStackTrace, transformReservedWord } from './utils/index.ts'\n\nimport type { FileManager } from './managers/fileManager/FileManager.ts'\nimport type { Executer } from './managers/index.ts'\nimport type { KubbPlugin, PluginContext, PluginFactoryOptions, PluginLifecycleHooks } from './types.ts'\n\ntype KubbPluginFactory<T extends PluginFactoryOptions = PluginFactoryOptions> = (\n options: T['options']\n) => T['nested'] extends true ? Array<KubbPlugin<T>> : KubbPlugin<T>\n\nexport function createPlugin<T extends PluginFactoryOptions = PluginFactoryOptions>(factory: KubbPluginFactory<T>) {\n return (options: T['options']) => {\n const plugin = factory(options)\n if (Array.isArray(plugin)) {\n throw new Error('Not implemented')\n }\n\n // default transform\n if (!plugin.transform) {\n plugin.transform = function transform(code) {\n return code\n }\n }\n\n return plugin\n }\n}\n\ntype Options = {\n config: PluginContext['config']\n fileManager: FileManager\n resolvePath: PluginContext['resolvePath']\n resolveName: PluginContext['resolveName']\n load: PluginContext['load']\n getExecuter: () => Executer<PluginLifecycleHooks> | undefined\n}\n\n// not publicly exported\nexport type CorePluginOptions = PluginFactoryOptions<Options, false, PluginContext>\n\nexport const name = 'core' as const\n\nexport const definePlugin = createPlugin<CorePluginOptions>((options) => {\n const { fileManager, resolvePath, resolveName, load } = options\n\n const api: PluginContext = {\n get config() {\n return options.config\n },\n fileManager,\n async addFile(...files) {\n // TODO unstable, based on stack trace and name of the file(can be different)\n const trace = getStackTrace()\n const plugins = options.config.plugins\n ?.filter((plugin) => trace[1].getFileName()?.includes(plugin.name))\n .sort((a, b) => {\n if (a.name.length < b.name.length) {\n return 1\n }\n if (a.name.length > b.name.length) {\n return -1\n }\n return 0\n })\n\n const pluginName = plugins?.[0]?.name\n\n return Promise.all(\n files.map((file) => {\n const fileWithMeta = {\n ...file,\n meta: {\n ...(file.meta || {}),\n pluginName,\n },\n }\n\n if (file.override) {\n return fileManager.add(fileWithMeta)\n }\n\n return fileManager.addOrAppend(fileWithMeta)\n })\n )\n },\n resolvePath,\n resolveName: (params) => {\n const name = resolveName(params)\n\n return transformReservedWord(name)\n },\n load,\n cache: createPluginCache(Object.create(null)),\n }\n\n return {\n name,\n options,\n api,\n resolvePath(fileName) {\n const root = pathParser.resolve(this.config.root, this.config.output.path)\n\n return pathParser.resolve(root, fileName)\n },\n resolveName(name) {\n return name\n },\n }\n})\n","import type { PluginError } from './PluginError.ts'\nimport type { PluginManager } from './PluginManager'\n\nexport class ParallelPluginError extends Error {\n public errors: PluginError[]\n\n public pluginManager: PluginManager\n\n constructor(message: string, options: { cause?: Error; errors: PluginError[]; pluginManager: PluginManager }) {\n super(message, { cause: options.cause })\n\n this.name = 'ParallelPluginError'\n this.errors = options.errors\n this.pluginManager = options.pluginManager\n }\n}\n","import type { PluginManager } from './PluginManager'\n\nexport class PluginError extends Error {\n public pluginManager: PluginManager\n\n constructor(message: string, options: { cause?: Error; pluginManager: PluginManager }) {\n super(message, { cause: options.cause })\n\n this.name = 'PluginError'\n this.pluginManager = options.pluginManager\n }\n}\n","/* eslint-disable @typescript-eslint/ban-types */\n\nimport { definePlugin } from '../../plugin.ts'\nimport { isPromise } from '../../utils/isPromise.ts'\nimport { Queue } from '../../utils/Queue.ts'\nimport { FileManager } from '../fileManager/FileManager.ts'\nimport type { File } from '../fileManager/types.ts'\nimport { ParallelPluginError } from './ParallelPluginError.ts'\nimport { PluginError } from './PluginError.ts'\n\nimport type { CorePluginOptions } from '../../plugin.ts'\nimport type { KubbConfig, KubbPlugin, MaybePromise, PluginLifecycle, PluginLifecycleHooks, ResolveNameParams, ResolvePathParams } from '../../types.ts'\nimport type { QueueTask } from '../../utils/Queue.ts'\nimport type { Argument0, Executer, OnExecute, ParseResult, SafeParseResult, Strategy } from './types.ts'\n\n// inspired by: https://github.com/rollup/rollup/blob/master/src/utils/PluginDriver.ts#\n\n// This will make sure no input hook is omitted\nconst hookNames: {\n [P in PluginLifecycleHooks]: 1\n} = {\n validate: 1,\n buildStart: 1,\n resolvePath: 1,\n resolveName: 1,\n load: 1,\n transform: 1,\n writeFile: 1,\n buildEnd: 1,\n}\nexport const hooks = Object.keys(hookNames) as [PluginLifecycleHooks]\n\ntype Options = { task: QueueTask<File>; onExecute?: OnExecute<PluginLifecycleHooks> }\n\nexport class PluginManager {\n public plugins: KubbPlugin[]\n\n public readonly fileManager: FileManager\n\n private readonly onExecute?: OnExecute\n\n private readonly core: KubbPlugin<CorePluginOptions>\n\n public queue: Queue\n\n public executer: Executer | undefined\n\n public executed: Executer[] = []\n\n constructor(config: KubbConfig, options: Options) {\n this.onExecute = options.onExecute?.bind(this)\n this.queue = new Queue(10)\n\n this.fileManager = new FileManager({ task: options.task, queue: this.queue })\n this.core = definePlugin({\n config,\n fileManager: this.fileManager,\n load: this.load,\n resolvePath: this.resolvePath,\n resolveName: this.resolveName,\n getExecuter: this.getExecuter.bind(this),\n }) as KubbPlugin<CorePluginOptions> & {\n api: CorePluginOptions['api']\n }\n this.plugins = [this.core, ...(config.plugins || [])]\n }\n\n getExecuter() {\n return this.executer\n }\n\n resolvePath = (params: ResolvePathParams) => {\n if (params.pluginName) {\n return this.hookForPluginSync({\n pluginName: params.pluginName,\n hookName: 'resolvePath',\n parameters: [params.fileName, params.directory, params.options],\n })\n }\n return this.hookFirstSync({\n hookName: 'resolvePath',\n parameters: [params.fileName, params.directory, params.options],\n }).result\n }\n\n resolveName = (params: ResolveNameParams) => {\n if (params.pluginName) {\n return this.hookForPluginSync({\n pluginName: params.pluginName,\n hookName: 'resolveName',\n parameters: [params.name],\n })\n }\n return this.hookFirstSync({\n hookName: 'resolveName',\n parameters: [params.name],\n }).result\n }\n\n load = async (id: string) => {\n return this.hookFirst({\n hookName: 'load',\n parameters: [id],\n })\n }\n\n /**\n *\n * Run only hook for a specific plugin name\n */\n hookForPlugin<H extends PluginLifecycleHooks>({\n pluginName,\n hookName,\n parameters,\n }: {\n pluginName: string\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n }): Promise<ReturnType<ParseResult<H>> | null> | null {\n const plugin = this.getPlugin(hookName, pluginName)\n\n return this.execute({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n })\n }\n\n hookForPluginSync<H extends PluginLifecycleHooks>({\n pluginName,\n hookName,\n parameters,\n }: {\n pluginName: string\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n }): ReturnType<ParseResult<H>> | null {\n const plugin = this.getPlugin(hookName, pluginName)\n\n return this.executeSync({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n })\n }\n\n /**\n *\n * Chains, first non-null result stops and returns\n */\n hookFirst<H extends PluginLifecycleHooks>({\n hookName,\n parameters,\n skipped,\n }: {\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n skipped?: ReadonlySet<KubbPlugin> | null\n }): Promise<SafeParseResult<H>> {\n let promise: Promise<SafeParseResult<H>> = Promise.resolve(null as unknown as SafeParseResult<H>)\n\n for (const plugin of this.getSortedPlugins(hookName)) {\n if (skipped && skipped.has(plugin)) {\n continue\n }\n promise = promise.then(async (parseResult) => {\n if (parseResult?.result != null) {\n return parseResult\n }\n const value = await this.execute<H>({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n })\n\n return Promise.resolve({\n plugin,\n result: value,\n } as typeof parseResult)\n })\n }\n\n return promise\n }\n\n /**\n *\n * Chains, first non-null result stops and returns\n */\n hookFirstSync<H extends PluginLifecycleHooks>({\n hookName,\n parameters,\n skipped,\n }: {\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n skipped?: ReadonlySet<KubbPlugin> | null\n }): SafeParseResult<H> {\n let parseResult: SafeParseResult<H> = null as unknown as SafeParseResult<H>\n\n for (const plugin of this.getSortedPlugins(hookName)) {\n if (skipped && skipped.has(plugin)) {\n continue\n }\n\n parseResult = {\n result: this.executeSync<H>({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n }),\n plugin,\n } as SafeParseResult<H>\n\n if (parseResult?.result != null) {\n break\n }\n }\n return parseResult\n }\n\n /**\n *\n * Parallel, runs all plugins\n */\n async hookParallel<H extends PluginLifecycleHooks, TOuput = void>({\n hookName,\n parameters,\n }: {\n hookName: H\n parameters?: Parameters<PluginLifecycle[H]> | undefined\n }): Promise<Awaited<TOuput>[]> {\n const parallelPromises: Promise<TOuput>[] = []\n\n for (const plugin of this.getSortedPlugins(hookName)) {\n // TODO implement sequential with `buildStart` as an object({ sequential: boolean; handler: PluginContext[\"buildStart\"] })\n // if ((plugin[hookName] as { sequential?: boolean })?.sequential) {\n // await Promise.all(parallelPromises)\n // parallelPromises.length = 0\n // await this.execute({\n // strategy: 'hookParallel',\n // hookName,\n // parameters,\n // plugin,\n // })\n // }\n const promise: Promise<TOuput> | null = this.execute({ strategy: 'hookParallel', hookName, parameters, plugin })\n\n if (promise) {\n parallelPromises.push(promise)\n }\n }\n const results = await Promise.allSettled(parallelPromises)\n const errors = results.filter((result) => result.status === 'rejected').map((result) => (result as PromiseRejectedResult).reason) as PluginError[]\n\n if (errors.length) {\n throw new ParallelPluginError('Error', { errors, pluginManager: this })\n }\n\n return results.filter((result) => result.status === 'fulfilled').map((result) => (result as PromiseFulfilledResult<Awaited<TOuput>>).value)\n }\n\n /**\n *\n * Chains, reduces returned value, handling the reduced value as the first hook argument\n */\n hookReduceArg0<H extends PluginLifecycleHooks>({\n hookName,\n parameters,\n reduce,\n }: {\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n reduce: (reduction: Argument0<H>, result: ReturnType<ParseResult<H>>, plugin: KubbPlugin) => MaybePromise<Argument0<H> | null>\n }): Promise<Argument0<H>> {\n const [argument0, ...rest] = parameters\n\n let promise: Promise<Argument0<H>> = Promise.resolve(argument0)\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise\n .then((arg0) => {\n const value = this.execute({\n strategy: 'hookReduceArg0',\n hookName,\n parameters: [arg0, ...rest] as Parameters<PluginLifecycle[H]>,\n plugin,\n })\n return value\n })\n .then((result) => reduce.call(this.core.api, argument0, result as ReturnType<ParseResult<H>>, plugin)) as Promise<Argument0<H>>\n }\n return promise\n }\n\n /**\n * Chains plugins\n */\n hookSeq<H extends PluginLifecycleHooks>({ hookName, parameters }: { hookName: H; parameters?: Parameters<PluginLifecycle[H]> }) {\n let promise: Promise<void | null> = Promise.resolve()\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise.then(() =>\n this.execute({\n strategy: 'hookSeq',\n hookName,\n parameters,\n plugin,\n })\n )\n }\n return promise.then(noReturn)\n }\n\n private getSortedPlugins(_hookName: keyof PluginLifecycle): KubbPlugin[] {\n const plugins = [...this.plugins].filter((plugin) => plugin.name !== 'core')\n\n return plugins\n }\n\n public getPlugin(hookName: keyof PluginLifecycle, pluginName: string): KubbPlugin {\n const plugins = [...this.plugins]\n\n const pluginByPluginName = plugins.find((item) => item.name === pluginName && item[hookName])\n if (!pluginByPluginName) {\n // fallback on the core plugin when there is no match\n\n return this.core\n }\n return pluginByPluginName\n }\n\n private addExecuter(executer: Executer | undefined) {\n this.onExecute?.call(this, executer, this)\n\n if (executer) {\n this.executed.push(executer)\n }\n }\n\n /**\n * Run an async plugin hook and return the result.\n * @param hookName Name of the plugin hook. Must be either in `PluginHooks` or `OutputPluginValueHooks`.\n * @param args Arguments passed to the plugin hook.\n * @param plugin The actual pluginObject to run.\n */\n // Implementation signature\n private execute<H extends PluginLifecycleHooks, TResult = void>({\n strategy,\n hookName,\n parameters,\n plugin,\n }: {\n strategy: Strategy\n hookName: H\n parameters: unknown[] | undefined\n plugin: KubbPlugin\n }): Promise<TResult> | null {\n const hook = plugin[hookName]\n\n if (!hook) {\n return null\n }\n\n return Promise.resolve()\n .then(() => {\n // add current execution to the variable `this.executer` so we can track which plugin is getting called\n this.executer = {\n strategy,\n hookName,\n plugin,\n }\n\n if (typeof hook === 'function') {\n const hookResult = (hook as Function).apply(this.core.api, parameters) as TResult\n\n if (isPromise(hookResult)) {\n return Promise.resolve(hookResult).then((result: TResult) => {\n this.addExecuter({\n strategy,\n hookName,\n plugin,\n })\n\n return result\n })\n }\n\n return hookResult\n }\n\n this.addExecuter({\n strategy,\n hookName,\n plugin,\n })\n\n return hook\n })\n .catch((e: Error) => {\n this.catcher<H>(e, plugin, hookName)\n }) as Promise<TResult>\n }\n\n /**\n * Run a sync plugin hook and return the result.\n * @param hookName Name of the plugin hook. Must be in `PluginHooks`.\n * @param args Arguments passed to the plugin hook.\n * @param plugin The acutal plugin\n * @param replaceContext When passed, the plugin context can be overridden.\n */\n private executeSync<H extends PluginLifecycleHooks>({\n strategy,\n hookName,\n parameters,\n plugin,\n }: {\n strategy: Strategy\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n plugin: KubbPlugin\n }): ReturnType<ParseResult<H>> | null {\n const hook = plugin[hookName]\n\n if (!hook) {\n return null\n }\n\n try {\n // add current execution to the variable `this.executer` so we can track which plugin is getting called\n this.executer = {\n strategy,\n hookName,\n plugin,\n }\n\n if (typeof hook === 'function') {\n const fn = (hook as Function).apply(this.core.api, parameters) as ReturnType<ParseResult<H>>\n\n this.addExecuter({\n strategy,\n hookName,\n plugin,\n })\n\n return fn\n }\n\n this.addExecuter({\n strategy,\n hookName,\n plugin,\n })\n\n return hook\n } catch (e) {\n this.catcher<H>(e as Error, plugin, hookName)\n\n return null as ReturnType<ParseResult<H>>\n }\n }\n\n private catcher<H extends PluginLifecycleHooks>(e: Error, plugin: KubbPlugin, hookName: H) {\n const text = `${e.message} (plugin: ${plugin.name}, hook: ${hookName})\\n`\n\n throw new PluginError(text, { cause: e, pluginManager: this })\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noReturn() {}\n","import type { KubbPlugin } from '../../types.ts'\n\nexport class ValidationPluginError extends Error {}\n\nexport function validatePlugins(plugins: KubbPlugin[], dependedPluginNames: string | string[]): true {\n let pluginNames: string[] = []\n if (typeof dependedPluginNames === 'string') {\n pluginNames = [dependedPluginNames]\n } else {\n pluginNames = dependedPluginNames\n }\n\n pluginNames.forEach((pluginName) => {\n const exists = plugins.some((plugin) => plugin.name === pluginName)\n if (!exists) {\n throw new ValidationPluginError(`This plugin depends on the ${pluginName} plugin.`)\n }\n })\n\n return true\n}\n","export class SummaryError extends Error {\n public summary: string[]\n\n constructor(message: string, options: { cause: Error; summary?: string[] }) {\n super(message, { cause: options.cause })\n\n this.name = 'SummaryError'\n this.summary = options.summary || []\n }\n}\n","import { getFileSource } from './managers/fileManager/index.ts'\nimport { PluginManager } from './managers/pluginManager/index.ts'\nimport { clean, isURL, read } from './utils/index.ts'\nimport { isPromise } from './utils/isPromise.ts'\n\nimport type { Ora } from 'ora'\nimport type { File } from './managers/fileManager/index.ts'\nimport type { OnExecute } from './managers/pluginManager/index.ts'\nimport type { BuildOutput, KubbPlugin, LogLevel, PluginContext, TransformResult } from './types.ts'\nimport type { QueueTask } from './utils/index.ts'\n\nexport type Logger<TParams = Record<string, any>> = {\n log: (message: string | null, options: { logLevel: LogLevel; params?: TParams }) => void\n spinner?: Ora\n}\ntype BuildOptions = {\n config: PluginContext['config']\n logger?: Logger\n}\n\nasync function transformReducer(\n this: PluginContext,\n _previousCode: string,\n result: TransformResult | Promise<TransformResult>,\n\n _plugin: KubbPlugin\n): Promise<string | null> {\n return result\n}\n\nexport async function build(options: BuildOptions): Promise<BuildOutput> {\n const { config, logger } = options\n\n try {\n if (!isURL(config.input.path)) {\n await read(config.input.path)\n }\n } catch (e: any) {\n throw new Error('Cannot read file/URL defined in `input.path` or set with --input in the CLI of your Kubb config', { cause: e })\n }\n\n if (config.output.clean) {\n await clean(config.output.path)\n }\n\n const queueTask = async (id: string, file: File) => {\n const { path } = file\n\n let code: string | null = getFileSource(file)\n\n const { result: loadedResult } = await pluginManager.hookFirst({\n hookName: 'load',\n parameters: [path],\n })\n if (loadedResult && isPromise(loadedResult)) {\n code = await loadedResult\n }\n if (loadedResult && !isPromise(loadedResult)) {\n code = loadedResult\n }\n\n if (code) {\n const transformedCode = await pluginManager.hookReduceArg0({\n hookName: 'transform',\n parameters: [code, path],\n reduce: transformReducer,\n })\n\n if (config.output.write || config.output.write === undefined) {\n await pluginManager.hookParallel({\n hookName: 'writeFile',\n parameters: [transformedCode, path],\n })\n }\n }\n }\n\n const onExecute: OnExecute = (executer) => {\n if (!executer) {\n return\n }\n\n const { hookName, plugin } = executer\n\n if (config.logLevel === 'info' && logger) {\n logger.log(null, { logLevel: config.logLevel, params: { hookName, pluginName: plugin.name } })\n }\n }\n\n const pluginManager = new PluginManager(config, { task: queueTask as QueueTask<File>, onExecute })\n const { plugins, fileManager } = pluginManager\n\n await pluginManager.hookParallel<'validate', true>({\n hookName: 'validate',\n parameters: [plugins],\n })\n\n await pluginManager.hookParallel({\n hookName: 'buildStart',\n parameters: [config],\n })\n\n await pluginManager.hookParallel({ hookName: 'buildEnd' })\n\n return { files: fileManager.files.map((file) => ({ ...file, source: getFileSource(file) })), pluginManager }\n}\n","import type { CLIOptions, KubbUserConfig, MaybePromise } from './types.ts'\n\n/**\n * Type helper to make it easier to use kubb.config.js\n * accepts a direct {@link KubbConfig} object, or a function that returns it.\n * The function receives a {@link ConfigEnv} object that exposes two properties:\n */\nexport const defineConfig = (\n options:\n | MaybePromise<KubbUserConfig>\n | ((\n /** The options derived from the CLI flags */\n cliOptions: CLIOptions\n ) => MaybePromise<KubbUserConfig>)\n) => options\n","/**\n * Abstract class that contains the building blocks for plugins to create their own Generator\n * @link idea based on https://github.com/colinhacks/zod/blob/master/src/types.ts#L137\n */\nexport abstract class Generator<TOptions extends object = object> {\n private _options: TOptions = {} as TOptions\n\n constructor(options: TOptions = {} as TOptions) {\n if (options) {\n this._options = {\n ...this._options,\n ...options,\n }\n }\n return this\n }\n\n get options() {\n return this._options\n }\n\n abstract build(...params: unknown[]): unknown\n}\n","import { Generator } from './Generator.ts'\n\n/**\n * Abstract class that contains the building blocks for plugins to create their own SchemaGenerator\n */\nexport abstract class SchemaGenerator<TOptions extends object, TInput, TOutput> extends Generator<TOptions> {\n abstract build(schema: TInput, name: string, description?: string): TOutput\n}\n","import { build } from './build.ts'\n\nexport * from './config.ts'\nexport * from './build.ts'\nexport * from './types.ts'\nexport { CorePluginOptions, createPlugin, name } from './plugin.ts'\n\nexport * from './utils/index.ts'\nexport * from './managers/index.ts'\nexport * from './generators/index.ts'\n\nexport default build\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -282,6 +282,14 @@ declare class ParallelPluginError extends Error {
|
|
|
282
282
|
});
|
|
283
283
|
}
|
|
284
284
|
|
|
285
|
+
declare class SummaryError extends Error {
|
|
286
|
+
summary: string[];
|
|
287
|
+
constructor(message: string, options: {
|
|
288
|
+
cause: Error;
|
|
289
|
+
summary?: string[];
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
|
|
285
293
|
interface Register {
|
|
286
294
|
}
|
|
287
295
|
type MaybePromise<T> = Promise<T> | T;
|
|
@@ -560,4 +568,4 @@ declare abstract class SchemaGenerator<TOptions extends object, TInput, TOutput>
|
|
|
560
568
|
abstract build(schema: TInput, name: string, description?: string): TOutput;
|
|
561
569
|
}
|
|
562
570
|
|
|
563
|
-
export { Argument0, BuildOutput, CLIOptions, Cache, CacheStore, CorePluginOptions, Executer, File, FileManager, FileName, Generator, KubbConfig, KubbJSONPlugin, KubbObjectPlugin, KubbPlugin, KubbPluginKind, KubbUserConfig, LogLevel, Logger, MaybePromise, OnExecute, OptionalPath, ParallelPluginError, ParseResult, Path, PathMode, PluginContext, PluginError, PluginFactoryOptions, PluginLifecycle, PluginLifecycleHooks, PluginManager, Queue, QueueTask, Register, ResolveNameParams, ResolvePathParams, SafeParseResult, SchemaGenerator, Status, Strategy, TransformResult, TreeNode, TreeNodeOptions, UUID, ValidationPluginError, build, clean, combineFiles, createJSDocBlockText, createPlugin, createPluginCache, build as default, defineConfig, getEncodedText, getFileSource, getPathMode, getRelativePath, getStackTrace, getUniqueName, hooks, isPromise, isURL, name, nameSorter, objectToParameters, read, renderTemplate, throttle, timeout, transformReservedWord, uniqueId, validatePlugins, write, writeIndexes };
|
|
571
|
+
export { Argument0, BuildOutput, CLIOptions, Cache, CacheStore, CorePluginOptions, Executer, File, FileManager, FileName, Generator, KubbConfig, KubbJSONPlugin, KubbObjectPlugin, KubbPlugin, KubbPluginKind, KubbUserConfig, LogLevel, Logger, MaybePromise, OnExecute, OptionalPath, ParallelPluginError, ParseResult, Path, PathMode, PluginContext, PluginError, PluginFactoryOptions, PluginLifecycle, PluginLifecycleHooks, PluginManager, Queue, QueueTask, Register, ResolveNameParams, ResolvePathParams, SafeParseResult, SchemaGenerator, Status, Strategy, SummaryError, TransformResult, TreeNode, TreeNodeOptions, UUID, ValidationPluginError, build, clean, combineFiles, createJSDocBlockText, createPlugin, createPluginCache, build as default, defineConfig, getEncodedText, getFileSource, getPathMode, getRelativePath, getStackTrace, getUniqueName, hooks, isPromise, isURL, name, nameSorter, objectToParameters, read, renderTemplate, throttle, timeout, transformReservedWord, uniqueId, validatePlugins, write, writeIndexes };
|
package/dist/index.js
CHANGED
|
@@ -516,9 +516,19 @@ ${file.source}`,
|
|
|
516
516
|
this.setStatus(id, "removed");
|
|
517
517
|
}
|
|
518
518
|
async write(...params) {
|
|
519
|
+
if (this.queue) {
|
|
520
|
+
return this.queue.run(async () => {
|
|
521
|
+
return write(...params);
|
|
522
|
+
});
|
|
523
|
+
}
|
|
519
524
|
return write(...params);
|
|
520
525
|
}
|
|
521
526
|
async read(...params) {
|
|
527
|
+
if (this.queue) {
|
|
528
|
+
return this.queue.run(async () => {
|
|
529
|
+
return read(...params);
|
|
530
|
+
});
|
|
531
|
+
}
|
|
522
532
|
return read(...params);
|
|
523
533
|
}
|
|
524
534
|
};
|
|
@@ -724,6 +734,7 @@ var ParallelPluginError = class extends Error {
|
|
|
724
734
|
pluginManager;
|
|
725
735
|
constructor(message, options) {
|
|
726
736
|
super(message, { cause: options.cause });
|
|
737
|
+
this.name = "ParallelPluginError";
|
|
727
738
|
this.errors = options.errors;
|
|
728
739
|
this.pluginManager = options.pluginManager;
|
|
729
740
|
}
|
|
@@ -734,6 +745,7 @@ var PluginError = class extends Error {
|
|
|
734
745
|
pluginManager;
|
|
735
746
|
constructor(message, options) {
|
|
736
747
|
super(message, { cause: options.cause });
|
|
748
|
+
this.name = "PluginError";
|
|
737
749
|
this.pluginManager = options.pluginManager;
|
|
738
750
|
}
|
|
739
751
|
};
|
|
@@ -916,7 +928,6 @@ var PluginManager = class {
|
|
|
916
928
|
const results = await Promise.allSettled(parallelPromises);
|
|
917
929
|
const errors = results.filter((result) => result.status === "rejected").map((result) => result.reason);
|
|
918
930
|
if (errors.length) {
|
|
919
|
-
console.log(errors);
|
|
920
931
|
throw new ParallelPluginError("Error", { errors, pluginManager: this });
|
|
921
932
|
}
|
|
922
933
|
return results.filter((result) => result.status === "fulfilled").map((result) => result.value);
|
|
@@ -1098,6 +1109,16 @@ function validatePlugins(plugins, dependedPluginNames) {
|
|
|
1098
1109
|
return true;
|
|
1099
1110
|
}
|
|
1100
1111
|
|
|
1112
|
+
// src/managers/pluginManager/SummaryError.ts
|
|
1113
|
+
var SummaryError = class extends Error {
|
|
1114
|
+
summary;
|
|
1115
|
+
constructor(message, options) {
|
|
1116
|
+
super(message, { cause: options.cause });
|
|
1117
|
+
this.name = "SummaryError";
|
|
1118
|
+
this.summary = options.summary || [];
|
|
1119
|
+
}
|
|
1120
|
+
};
|
|
1121
|
+
|
|
1101
1122
|
// src/build.ts
|
|
1102
1123
|
async function transformReducer(_previousCode, result, _plugin) {
|
|
1103
1124
|
return result;
|
|
@@ -1191,4 +1212,6 @@ var SchemaGenerator = class extends Generator {
|
|
|
1191
1212
|
// src/index.ts
|
|
1192
1213
|
var src_default = build;
|
|
1193
1214
|
|
|
1194
|
-
export { FileManager, Generator, ParallelPluginError, PluginError, PluginManager, Queue, SchemaGenerator, TreeNode, ValidationPluginError, build, clean, combineFiles, createJSDocBlockText, createPlugin, createPluginCache, src_default as default, defineConfig, getEncodedText, getFileSource, getPathMode, getRelativePath, getStackTrace, getUniqueName, hooks, isPromise, isURL, name, nameSorter, objectToParameters, read, renderTemplate, throttle, timeout, transformReservedWord, uniqueId, validatePlugins, write, writeIndexes };
|
|
1215
|
+
export { FileManager, Generator, ParallelPluginError, PluginError, PluginManager, Queue, SchemaGenerator, SummaryError, TreeNode, ValidationPluginError, build, clean, combineFiles, createJSDocBlockText, createPlugin, createPluginCache, src_default as default, defineConfig, getEncodedText, getFileSource, getPathMode, getRelativePath, getStackTrace, getUniqueName, hooks, isPromise, isURL, name, nameSorter, objectToParameters, read, renderTemplate, throttle, timeout, transformReservedWord, uniqueId, validatePlugins, write, writeIndexes };
|
|
1216
|
+
//# sourceMappingURL=out.js.map
|
|
1217
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/managers/fileManager/FileManager.ts","../src/utils/isPromise.ts","../src/utils/write.ts","../src/utils/cache.ts","../src/utils/read.ts","../src/utils/isURL.ts","../src/utils/objectToParameters.ts","../src/utils/nameSorter.ts","../src/utils/jsdoc.ts","../src/utils/getUniqueName.ts","../src/utils/timeout.ts","../src/utils/Queue.ts","../src/utils/getEncodedText.ts","../src/utils/renderTemplate.ts","../src/utils/clean.ts","../src/utils/TreeNode.ts","../src/utils/transformReservedWord.ts","../src/utils/getStackTrace.ts","../src/utils/uniqueId.ts","../src/utils/throttle.ts","../src/managers/fileManager/utils.ts","../src/plugin.ts","../src/managers/pluginManager/ParallelPluginError.ts","../src/managers/pluginManager/PluginError.ts","../src/managers/pluginManager/PluginManager.ts","../src/managers/pluginManager/validate.ts","../src/managers/pluginManager/SummaryError.ts","../src/build.ts","../src/config.ts","../src/generators/Generator.ts","../src/generators/SchemaGenerator.ts","../src/index.ts"],"names":["pathParser","fs","dummyObject","v8StackTrace","timeout","files","name"],"mappings":"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","sourcesContent":["import crypto from 'node:crypto'\n\nimport { read, write } from '../../utils/index.ts'\n\nimport type { Queue, QueueTask } from '../../utils/index.ts'\nimport type { CacheStore, File, Status, UUID } from './types.ts'\n\nexport class FileManager {\n private cache: Map<CacheStore['id'], CacheStore> = new Map()\n\n private task?: QueueTask<File>\n\n private queue?: Queue\n\n constructor(options?: { queue: Queue; task?: QueueTask<File> }) {\n if (options) {\n this.task = options.task\n this.queue = options.queue\n }\n }\n\n private getCache(id: UUID) {\n return this.cache.get(id)\n }\n\n getCacheByPath(path: string | undefined): CacheStore | undefined {\n let cache\n\n this.cache.forEach((item) => {\n if (item.file.path === path) {\n cache = item\n }\n })\n return cache as unknown as CacheStore\n }\n\n get files() {\n const files: File[] = []\n this.cache.forEach((item) => {\n files.push(item.file)\n })\n\n return files\n }\n\n get cachedFiles() {\n const files: CacheStore[] = []\n this.cache.forEach((item) => {\n files.push(item)\n })\n\n return files\n }\n\n async add(file: File) {\n const cacheItem: CacheStore = { id: crypto.randomUUID(), file, status: 'new' as Status }\n\n this.cache.set(cacheItem.id, cacheItem)\n\n if (this.queue) {\n await this.queue.run(async () => {\n await this.task?.(cacheItem.id, file)\n })\n }\n\n return file\n }\n\n addOrAppend(file: File) {\n if (!file.path.endsWith(file.fileName)) {\n // console.warn(`Path ${file.path}(file.path) should end with the fileName ${file.fileName}(file.filename)`)\n }\n\n const previousCache = this.getCacheByPath(file.path)\n\n if (previousCache) {\n // empty source will also return true when using includes\n const sourceAlreadyExists = file.source && previousCache.file.source.includes(file.source)\n\n if (sourceAlreadyExists) {\n return Promise.resolve(file)\n }\n\n this.cache.delete(previousCache.id)\n\n return this.add({\n ...file,\n source: `${previousCache.file.source}\\n${file.source}`,\n imports: [...(previousCache.file.imports || []), ...(file.imports || [])],\n exports: [...(previousCache.file.exports || []), ...(file.exports || [])],\n })\n }\n return this.add(file)\n }\n\n setStatus(id: UUID, status: Status) {\n const cacheItem = this.getCache(id)\n if (!cacheItem) {\n return\n }\n\n cacheItem.status = status\n this.cache.set(id, cacheItem)\n }\n\n get(id: UUID) {\n const cacheItem = this.getCache(id)\n return cacheItem?.file\n }\n\n remove(id: UUID) {\n const cacheItem = this.getCache(id)\n if (!cacheItem) {\n return\n }\n\n this.setStatus(id, 'removed')\n }\n\n async write(...params: Parameters<typeof write>) {\n if (this.queue) {\n return this.queue.run(async () => {\n return write(...params)\n })\n }\n\n return write(...params)\n }\n\n async read(...params: Parameters<typeof read>) {\n if (this.queue) {\n return this.queue.run(async () => {\n return read(...params)\n })\n }\n\n return read(...params)\n }\n}\n","import type { MaybePromise } from '../types.ts'\n\nexport function isPromise<T>(result: MaybePromise<T>): result is Promise<T> {\n return typeof (result as Promise<unknown>)?.then === 'function'\n}\n","import fs from 'fs-extra'\nimport pathParser from 'node:path'\n\nasync function safeWriteFileToPath(path: string, data: string): Promise<void> {\n // resolve the full path and get just the directory, ignoring the file and extension\n const passedPath = pathParser.dirname(pathParser.resolve(path))\n // make the directory, recursively. Theoretically, if every directory in the path exists, this won't do anything.\n await fs.mkdir(passedPath, { recursive: true })\n // write the file to the newly created directory\n return fs.writeFile(pathParser.resolve(path), data, { encoding: 'utf-8' })\n}\n\nexport async function write(data: string, path: string): Promise<void> {\n try {\n await fs.stat(path)\n const oldContent = await fs.readFile(path, { encoding: 'utf-8' })\n if (oldContent?.toString() === data) {\n return\n }\n } catch (_err) {\n return safeWriteFileToPath(path, data)\n }\n\n return safeWriteFileToPath(path, data)\n}\n","export interface Cache<TStore extends object = object> {\n delete(id: keyof TStore): boolean\n get(id: keyof TStore): TStore[keyof TStore] | null\n has(id: keyof TStore): boolean\n set(id: keyof TStore, value: unknown): void\n}\n\nexport function createPluginCache<TStore extends Record<string, [number, unknown]>>(Store: TStore): Cache<TStore> {\n return {\n set(id, value): void {\n Store[id] = [0, value] as TStore[keyof TStore]\n },\n get(id): TStore[keyof TStore] | null {\n const item = Store[id]\n if (!item) {\n return null\n }\n item[0] = 0\n return item[1] as TStore[keyof TStore]\n },\n has(id): boolean {\n const item = Store[id]\n if (!item) {\n return false\n }\n item[0] = 0\n return true\n },\n delete(id: keyof TStore): boolean {\n return delete Store[id]\n },\n }\n}\n","import pathParser from 'node:path'\nimport fs from 'fs-extra'\n\nfunction slash(path: string, platform: 'windows' | 'mac' | 'linux' = 'linux') {\n const isWindowsPath = /^\\\\\\\\\\?\\\\/.test(path)\n\n if (['linux', 'mac'].includes(platform) && !isWindowsPath) {\n // linux and mac\n return path.replaceAll(/\\\\/g, '/').replace('../', '').trimEnd()\n }\n\n // windows\n return path.replaceAll(/\\\\/g, '/').replace('../', '').trimEnd()\n}\n\nexport function getRelativePath(rootDir?: string | null, filePath?: string | null, platform: 'windows' | 'mac' | 'linux' = 'linux'): string {\n if (!rootDir || !filePath) {\n throw new Error(`Root and file should be filled in when retrieving the relativePath, ${rootDir || ''} ${filePath || ''}`)\n }\n\n const relativePath = pathParser.relative(rootDir, filePath)\n\n // On Windows, paths are separated with a \"\\\"\n // However, web browsers use \"/\" no matter the platform\n const path = slash(relativePath, platform)\n\n if (path.startsWith('../')) {\n return path.replace(pathParser.basename(path), pathParser.basename(path, pathParser.extname(filePath)))\n }\n\n return `./${path.replace(pathParser.basename(path), pathParser.basename(path, pathParser.extname(filePath)))}`\n}\n\nexport type PathMode = 'file' | 'directory'\n\nexport function getPathMode(path: string | undefined | null): PathMode {\n if (!path) {\n return 'directory'\n }\n return pathParser.extname(path) ? 'file' : 'directory'\n}\n\nexport async function read(path: string): Promise<string> {\n return fs.readFile(path, { encoding: 'utf8' })\n}\n","export function isURL(data: string) {\n try {\n const url = new URL(data)\n if (url?.href) {\n return true\n }\n } catch (error) {\n return false\n }\n return false\n}\n","import { camelCase, camelCaseTransformMerge } from 'change-case'\n\ntype Data = string[][]\n\ntype Options = {\n typed?: boolean\n}\n/**\n * Convert an string array to a string of parameters that can be used inside a function\n * The parameter name is converted to `camelcase`\n */\nexport function objectToParameters(data: Data, options: Options = {}) {\n const { typed } = options\n\n return data\n .reduce((acc, [key, value]) => {\n const parameterName = camelCase(key, { delimiter: '', transform: camelCaseTransformMerge })\n\n if (typed) {\n acc.push(`${parameterName}: ${value}[\"${key}\"]`)\n } else {\n acc.push(`${parameterName}`)\n }\n\n return acc\n }, [] as string[])\n .join(', ')\n}\n","export function nameSorter<T extends { name: string }>(a: T, b: T) {\n if (a.name < b.name) {\n return -1\n }\n if (a.name > b.name) {\n return 1\n }\n return 0\n}\n","export function createJSDocBlockText({ comments }: { comments: Array<string> }): string {\n const filteredComments = comments.filter(Boolean)\n\n if (!filteredComments.length) {\n return ''\n }\n\n const text = filteredComments.reduce((acc, comment) => {\n return `${acc}\\n* ${comment}`\n }, '/**')\n\n return `${text}\\n*/`\n}\n","export function getUniqueName(originalName: string, data: Record<string, number>) {\n let used = data[originalName] || 0\n if (used) {\n data[originalName] = ++used\n originalName += used\n }\n data[originalName] = 1\n return originalName\n}\n","export async function timeout(ms: number) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(true)\n }, ms)\n })\n}\n","export type QueueTask<T = unknown> = {\n (...args: unknown[]): Promise<T> | Promise<void>\n}\n\ninterface QueueItem {\n reject: <T>(reason?: T) => void\n resolve: <T>(value: T | PromiseLike<T>) => void\n task: QueueTask<unknown>\n}\n\nexport class Queue {\n private readonly queue: QueueItem[] = []\n\n workerCount = 0\n\n private maxParallel: number\n\n constructor(maxParallel: number) {\n this.maxParallel = maxParallel\n }\n\n run<T>(task: QueueTask<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const item: QueueItem = { reject, resolve, task } as QueueItem\n this.queue.push(item)\n this.work()\n })\n }\n\n private work(): void {\n if (this.workerCount >= this.maxParallel) {\n return\n }\n this.workerCount++\n\n let entry: QueueItem | undefined\n while ((entry = this.queue.shift())) {\n const { reject, resolve, task } = entry\n task()\n .then((result) => resolve(result))\n .catch((err) => reject(err))\n }\n\n this.workerCount--\n }\n}\n","export function getEncodedText(text?: string): string {\n return text ? text.replaceAll('`', '\\\\`') : ''\n}\n","export function renderTemplate<TData extends Record<string, string> = Record<string, string>>(template: string, data: TData | undefined = undefined) {\n if (!data) {\n return template.replace(/{{(.*?)}}/g, '')\n }\n\n return template.replace(/{{(.*?)}}/g, (match) => {\n const value = data[match.split(/{{|}}/).filter(Boolean)[0].trim()]\n\n return value || ''\n })\n}\n","import { rimraf } from 'rimraf'\n\nexport async function clean(path: string) {\n return rimraf(path)\n}\n","import dirTree from 'directory-tree'\n\nimport { getPathMode } from '../utils/read.ts'\n\nimport type { DirectoryTree, DirectoryTreeOptions } from 'directory-tree'\n\nexport type TreeNodeOptions = DirectoryTreeOptions\n\nexport class TreeNode<T = unknown> {\n public data: T\n\n public parent?: TreeNode<T>\n\n public children: Array<TreeNode<T>> = []\n\n constructor(data: T, parent?: TreeNode<T>) {\n this.data = data\n this.parent = parent\n return this\n }\n\n addChild(data: T): TreeNode<T> {\n const child = new TreeNode(data, this)\n if (!this.children) {\n this.children = []\n }\n this.children.push(child)\n return child\n }\n\n find(data?: T): TreeNode<T> | null {\n if (!data) {\n return null\n }\n\n if (data === this.data) {\n return this\n }\n\n if (this.children?.length) {\n for (let i = 0, { length } = this.children, target: TreeNode<T> | null = null; i < length; i++) {\n target = this.children[i].find(data)\n if (target) {\n return target\n }\n }\n }\n\n return null\n }\n\n get leaves(): TreeNode<T>[] {\n if (!this.children || this.children.length === 0) {\n // this is a leaf\n return [this]\n }\n\n // if not a leaf, return all children's leaves recursively\n const leaves: TreeNode<T>[] = []\n if (this.children) {\n for (let i = 0, { length } = this.children; i < length; i++) {\n // eslint-disable-next-line prefer-spread\n leaves.push.apply(leaves, this.children[i].leaves)\n }\n }\n return leaves\n }\n\n get root(): TreeNode<T> {\n if (!this.parent) {\n return this\n }\n return this.parent.root\n }\n\n forEach(callback: (treeNode: TreeNode<T>) => void): this {\n if (typeof callback !== 'function') {\n throw new TypeError('forEach() callback must be a function')\n }\n\n // run this node through function\n callback(this)\n\n // do the same for all children\n if (this.children) {\n for (let i = 0, { length } = this.children; i < length; i++) {\n this.children[i].forEach(callback)\n }\n }\n\n return this\n }\n\n public static build<T = unknown>(path: string, options: TreeNodeOptions = {}): TreeNode<T> | null {\n try {\n const exclude = Array.isArray(options.exclude) ? options.exclude : ([options.exclude].filter(Boolean) as RegExp[])\n const filteredTree = dirTree(path, { extensions: options.extensions, exclude: [/node_modules/, ...exclude] })\n\n if (!filteredTree) {\n return null\n }\n\n const treeNode = new TreeNode({ name: filteredTree.name, path: filteredTree.path, type: filteredTree.type || getPathMode(filteredTree.path) })\n\n const recurse = (node: typeof treeNode, item: DirectoryTree) => {\n const subNode = node.addChild({ name: item.name, path: item.path, type: item.type || getPathMode(item.path) })\n\n if (item.children?.length) {\n item.children?.forEach((child) => {\n recurse(subNode, child)\n })\n }\n }\n\n filteredTree.children?.forEach((child) => recurse(treeNode, child))\n\n return treeNode as TreeNode<T>\n } catch (e) {\n throw new Error('Something went wrong with creating index files with the TreehNode class', { cause: e })\n }\n }\n}\n","/**\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = [\n 'abstract',\n 'arguments',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n\n 'Array',\n 'Date',\n 'eval',\n 'function',\n 'hasOwnProperty',\n 'Infinity',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'length',\n 'Math',\n 'name',\n 'NaN',\n 'Number',\n 'Object',\n 'prototype',\n 'String',\n 'toString',\n 'undefined',\n 'valueOf',\n]\n\nexport function transformReservedWord(word?: string | null) {\n if (word && reservedWords.includes(word)) {\n return `_${word}`\n }\n\n return word\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function getStackTrace(belowFn?: Function): NodeJS.CallSite[] {\n const oldLimit = Error.stackTraceLimit\n Error.stackTraceLimit = Infinity\n\n const dummyObject = {} as any\n\n const v8Handler = Error.prepareStackTrace\n Error.prepareStackTrace = function prepareStackTrace(dummyObject, v8StackTrace) {\n return v8StackTrace\n }\n Error.captureStackTrace(dummyObject as object, belowFn || getStackTrace)\n\n const v8StackTrace = dummyObject.stack\n Error.prepareStackTrace = v8Handler\n Error.stackTraceLimit = oldLimit\n\n return v8StackTrace as NodeJS.CallSite[]\n}\n","export const uniqueId = (\n (counter) =>\n (str = '') =>\n `${str}${++counter}`\n)(0)\n","export const throttle = <R, A extends any[]>(fn: (...args: A) => R, delay: number): [(...args: A) => R | undefined, () => void] => {\n let wait = false\n let timeout: NodeJS.Timeout\n let cancelled = false\n\n return [\n (...args: A) => {\n if (cancelled) {\n return undefined\n }\n if (wait) {\n return undefined\n }\n\n const val = fn(...args)\n\n wait = true\n\n timeout = setTimeout(() => {\n wait = false\n }, delay)\n\n return val\n },\n () => {\n cancelled = true\n clearTimeout(timeout)\n },\n ]\n}\n","import pathParser from 'node:path'\n\nimport { createExportDeclaration, createImportDeclaration, print } from '@kubb/ts-codegen'\n\nimport { TreeNode } from '../../utils/index.ts'\n\nimport type ts from 'typescript'\nimport type { Path } from '../../types.ts'\nimport type { PathMode, TreeNodeOptions } from '../../utils/index.ts'\nimport type { File } from './types.ts'\n\ntype TreeNodeData = { type: PathMode; path: Path; name: string }\n\nexport function writeIndexes(root: string, options: TreeNodeOptions = {}): File[] | null {\n const tree = TreeNode.build<TreeNodeData>(root, { extensions: /\\.ts/, ...options })\n\n if (!tree) {\n return null\n }\n\n const fileReducer = (files: File[], currentTree: typeof tree) => {\n if (!currentTree.children) {\n return []\n }\n\n if (currentTree.children?.length > 1) {\n const path = pathParser.resolve(currentTree.data.path, 'index.ts')\n const exports = currentTree.children\n .map((file) => {\n if (!file) {\n return undefined\n }\n\n const importPath: string = file.data.type === 'directory' ? `./${file.data.name}` : `./${file.data.name.replace(/\\.[^.]*$/, '')}`\n\n // TODO weird hacky fix\n if (importPath.includes('index') && path.includes('index')) {\n return undefined\n }\n\n return { path: importPath }\n })\n .filter(Boolean) as File['exports']\n\n files.push({\n path,\n fileName: 'index.ts',\n source: '',\n exports,\n })\n } else {\n currentTree.children?.forEach((child) => {\n const path = pathParser.resolve(currentTree.data.path, 'index.ts')\n const importPath = child.data.type === 'directory' ? `./${child.data.name}` : `./${child.data.name.replace(/\\.[^.]*$/, '')}`\n\n files.push({\n path,\n fileName: 'index.ts',\n source: '',\n exports: [{ path: importPath }],\n })\n })\n }\n\n currentTree.children.forEach((childItem) => {\n fileReducer(files, childItem)\n })\n\n return files\n }\n\n const files = fileReducer([], tree)\n\n return files\n}\n\nexport function combineFiles(files: Array<File | null>): File[] {\n return (files.filter(Boolean) as File[]).reduce((acc, curr: File) => {\n const prevIndex = acc.findIndex((item) => item.path === curr.path)\n\n if (prevIndex !== -1) {\n const prev = acc[prevIndex]\n acc[prevIndex] = {\n ...curr,\n source: prev.source && curr.source ? `${prev.source}\\n${curr.source}` : \"'\",\n imports: [...(prev.imports || []), ...(curr.imports || [])],\n exports: [...(prev.exports || []), ...(curr.exports || [])],\n }\n } else {\n acc.push(curr)\n }\n\n return acc\n }, [] as File[])\n}\n\nexport function getFileSource(file: File): string {\n let { source } = file\n\n // TODO make generic check\n if (!file.fileName.endsWith('.ts')) {\n return file.source\n }\n const imports: File['imports'] = []\n const exports: File['exports'] = []\n\n file.imports?.forEach((curr) => {\n const existingImport = imports.find((imp) => imp.path === curr.path)\n\n if (!existingImport) {\n imports.push({\n ...curr,\n name: Array.isArray(curr.name) ? [...new Set(curr.name)] : curr.name,\n })\n }\n\n if (existingImport && !Array.isArray(existingImport.name) && existingImport.name !== curr.name) {\n imports.push(curr)\n }\n\n if (existingImport && Array.isArray(existingImport.name)) {\n if (Array.isArray(curr.name)) {\n existingImport.name = [...new Set([...existingImport.name, ...curr.name])]\n }\n }\n })\n\n file.exports?.forEach((curr) => {\n const exists = exports.find((imp) => imp.path === curr.path)\n if (!exists) {\n exports.push({\n ...curr,\n name: Array.isArray(curr.name) ? [...new Set(curr.name)] : curr.name,\n })\n }\n\n if (exists && !Array.isArray(exists.name) && exists.name !== curr.name && exists.asAlias === curr.asAlias) {\n exports.push(curr)\n }\n\n if (exists && Array.isArray(exists.name)) {\n if (Array.isArray(curr.name)) {\n exists.name = [...new Set([...exists.name, ...curr.name])]\n }\n }\n })\n\n const importNodes = imports.reduce((prev, curr) => {\n return [...prev, createImportDeclaration({ name: curr.name, path: curr.path, isTypeOnly: curr.isTypeOnly })]\n }, [] as ts.ImportDeclaration[])\n const importSource = print(importNodes)\n\n const exportNodes = exports.reduce((prev, curr) => {\n return [...prev, createExportDeclaration({ name: curr.name, path: curr.path, isTypeOnly: curr.isTypeOnly, asAlias: curr.asAlias })]\n }, [] as ts.ExportDeclaration[])\n const exportSource = print(exportNodes)\n\n if (importSource) {\n source = `${importSource}\\n${source}`\n }\n\n if (exportSource) {\n source = `${exportSource}\\n${source}`\n }\n\n return source\n}\n","import pathParser from 'node:path'\n\nimport { createPluginCache, getStackTrace, transformReservedWord } from './utils/index.ts'\n\nimport type { FileManager } from './managers/fileManager/FileManager.ts'\nimport type { Executer } from './managers/index.ts'\nimport type { KubbPlugin, PluginContext, PluginFactoryOptions, PluginLifecycleHooks } from './types.ts'\n\ntype KubbPluginFactory<T extends PluginFactoryOptions = PluginFactoryOptions> = (\n options: T['options']\n) => T['nested'] extends true ? Array<KubbPlugin<T>> : KubbPlugin<T>\n\nexport function createPlugin<T extends PluginFactoryOptions = PluginFactoryOptions>(factory: KubbPluginFactory<T>) {\n return (options: T['options']) => {\n const plugin = factory(options)\n if (Array.isArray(plugin)) {\n throw new Error('Not implemented')\n }\n\n // default transform\n if (!plugin.transform) {\n plugin.transform = function transform(code) {\n return code\n }\n }\n\n return plugin\n }\n}\n\ntype Options = {\n config: PluginContext['config']\n fileManager: FileManager\n resolvePath: PluginContext['resolvePath']\n resolveName: PluginContext['resolveName']\n load: PluginContext['load']\n getExecuter: () => Executer<PluginLifecycleHooks> | undefined\n}\n\n// not publicly exported\nexport type CorePluginOptions = PluginFactoryOptions<Options, false, PluginContext>\n\nexport const name = 'core' as const\n\nexport const definePlugin = createPlugin<CorePluginOptions>((options) => {\n const { fileManager, resolvePath, resolveName, load } = options\n\n const api: PluginContext = {\n get config() {\n return options.config\n },\n fileManager,\n async addFile(...files) {\n // TODO unstable, based on stack trace and name of the file(can be different)\n const trace = getStackTrace()\n const plugins = options.config.plugins\n ?.filter((plugin) => trace[1].getFileName()?.includes(plugin.name))\n .sort((a, b) => {\n if (a.name.length < b.name.length) {\n return 1\n }\n if (a.name.length > b.name.length) {\n return -1\n }\n return 0\n })\n\n const pluginName = plugins?.[0]?.name\n\n return Promise.all(\n files.map((file) => {\n const fileWithMeta = {\n ...file,\n meta: {\n ...(file.meta || {}),\n pluginName,\n },\n }\n\n if (file.override) {\n return fileManager.add(fileWithMeta)\n }\n\n return fileManager.addOrAppend(fileWithMeta)\n })\n )\n },\n resolvePath,\n resolveName: (params) => {\n const name = resolveName(params)\n\n return transformReservedWord(name)\n },\n load,\n cache: createPluginCache(Object.create(null)),\n }\n\n return {\n name,\n options,\n api,\n resolvePath(fileName) {\n const root = pathParser.resolve(this.config.root, this.config.output.path)\n\n return pathParser.resolve(root, fileName)\n },\n resolveName(name) {\n return name\n },\n }\n})\n","import type { PluginError } from './PluginError.ts'\nimport type { PluginManager } from './PluginManager'\n\nexport class ParallelPluginError extends Error {\n public errors: PluginError[]\n\n public pluginManager: PluginManager\n\n constructor(message: string, options: { cause?: Error; errors: PluginError[]; pluginManager: PluginManager }) {\n super(message, { cause: options.cause })\n\n this.name = 'ParallelPluginError'\n this.errors = options.errors\n this.pluginManager = options.pluginManager\n }\n}\n","import type { PluginManager } from './PluginManager'\n\nexport class PluginError extends Error {\n public pluginManager: PluginManager\n\n constructor(message: string, options: { cause?: Error; pluginManager: PluginManager }) {\n super(message, { cause: options.cause })\n\n this.name = 'PluginError'\n this.pluginManager = options.pluginManager\n }\n}\n","/* eslint-disable @typescript-eslint/ban-types */\n\nimport { definePlugin } from '../../plugin.ts'\nimport { isPromise } from '../../utils/isPromise.ts'\nimport { Queue } from '../../utils/Queue.ts'\nimport { FileManager } from '../fileManager/FileManager.ts'\nimport type { File } from '../fileManager/types.ts'\nimport { ParallelPluginError } from './ParallelPluginError.ts'\nimport { PluginError } from './PluginError.ts'\n\nimport type { CorePluginOptions } from '../../plugin.ts'\nimport type { KubbConfig, KubbPlugin, MaybePromise, PluginLifecycle, PluginLifecycleHooks, ResolveNameParams, ResolvePathParams } from '../../types.ts'\nimport type { QueueTask } from '../../utils/Queue.ts'\nimport type { Argument0, Executer, OnExecute, ParseResult, SafeParseResult, Strategy } from './types.ts'\n\n// inspired by: https://github.com/rollup/rollup/blob/master/src/utils/PluginDriver.ts#\n\n// This will make sure no input hook is omitted\nconst hookNames: {\n [P in PluginLifecycleHooks]: 1\n} = {\n validate: 1,\n buildStart: 1,\n resolvePath: 1,\n resolveName: 1,\n load: 1,\n transform: 1,\n writeFile: 1,\n buildEnd: 1,\n}\nexport const hooks = Object.keys(hookNames) as [PluginLifecycleHooks]\n\ntype Options = { task: QueueTask<File>; onExecute?: OnExecute<PluginLifecycleHooks> }\n\nexport class PluginManager {\n public plugins: KubbPlugin[]\n\n public readonly fileManager: FileManager\n\n private readonly onExecute?: OnExecute\n\n private readonly core: KubbPlugin<CorePluginOptions>\n\n public queue: Queue\n\n public executer: Executer | undefined\n\n public executed: Executer[] = []\n\n constructor(config: KubbConfig, options: Options) {\n this.onExecute = options.onExecute?.bind(this)\n this.queue = new Queue(10)\n\n this.fileManager = new FileManager({ task: options.task, queue: this.queue })\n this.core = definePlugin({\n config,\n fileManager: this.fileManager,\n load: this.load,\n resolvePath: this.resolvePath,\n resolveName: this.resolveName,\n getExecuter: this.getExecuter.bind(this),\n }) as KubbPlugin<CorePluginOptions> & {\n api: CorePluginOptions['api']\n }\n this.plugins = [this.core, ...(config.plugins || [])]\n }\n\n getExecuter() {\n return this.executer\n }\n\n resolvePath = (params: ResolvePathParams) => {\n if (params.pluginName) {\n return this.hookForPluginSync({\n pluginName: params.pluginName,\n hookName: 'resolvePath',\n parameters: [params.fileName, params.directory, params.options],\n })\n }\n return this.hookFirstSync({\n hookName: 'resolvePath',\n parameters: [params.fileName, params.directory, params.options],\n }).result\n }\n\n resolveName = (params: ResolveNameParams) => {\n if (params.pluginName) {\n return this.hookForPluginSync({\n pluginName: params.pluginName,\n hookName: 'resolveName',\n parameters: [params.name],\n })\n }\n return this.hookFirstSync({\n hookName: 'resolveName',\n parameters: [params.name],\n }).result\n }\n\n load = async (id: string) => {\n return this.hookFirst({\n hookName: 'load',\n parameters: [id],\n })\n }\n\n /**\n *\n * Run only hook for a specific plugin name\n */\n hookForPlugin<H extends PluginLifecycleHooks>({\n pluginName,\n hookName,\n parameters,\n }: {\n pluginName: string\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n }): Promise<ReturnType<ParseResult<H>> | null> | null {\n const plugin = this.getPlugin(hookName, pluginName)\n\n return this.execute({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n })\n }\n\n hookForPluginSync<H extends PluginLifecycleHooks>({\n pluginName,\n hookName,\n parameters,\n }: {\n pluginName: string\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n }): ReturnType<ParseResult<H>> | null {\n const plugin = this.getPlugin(hookName, pluginName)\n\n return this.executeSync({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n })\n }\n\n /**\n *\n * Chains, first non-null result stops and returns\n */\n hookFirst<H extends PluginLifecycleHooks>({\n hookName,\n parameters,\n skipped,\n }: {\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n skipped?: ReadonlySet<KubbPlugin> | null\n }): Promise<SafeParseResult<H>> {\n let promise: Promise<SafeParseResult<H>> = Promise.resolve(null as unknown as SafeParseResult<H>)\n\n for (const plugin of this.getSortedPlugins(hookName)) {\n if (skipped && skipped.has(plugin)) {\n continue\n }\n promise = promise.then(async (parseResult) => {\n if (parseResult?.result != null) {\n return parseResult\n }\n const value = await this.execute<H>({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n })\n\n return Promise.resolve({\n plugin,\n result: value,\n } as typeof parseResult)\n })\n }\n\n return promise\n }\n\n /**\n *\n * Chains, first non-null result stops and returns\n */\n hookFirstSync<H extends PluginLifecycleHooks>({\n hookName,\n parameters,\n skipped,\n }: {\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n skipped?: ReadonlySet<KubbPlugin> | null\n }): SafeParseResult<H> {\n let parseResult: SafeParseResult<H> = null as unknown as SafeParseResult<H>\n\n for (const plugin of this.getSortedPlugins(hookName)) {\n if (skipped && skipped.has(plugin)) {\n continue\n }\n\n parseResult = {\n result: this.executeSync<H>({\n strategy: 'hookFirst',\n hookName,\n parameters,\n plugin,\n }),\n plugin,\n } as SafeParseResult<H>\n\n if (parseResult?.result != null) {\n break\n }\n }\n return parseResult\n }\n\n /**\n *\n * Parallel, runs all plugins\n */\n async hookParallel<H extends PluginLifecycleHooks, TOuput = void>({\n hookName,\n parameters,\n }: {\n hookName: H\n parameters?: Parameters<PluginLifecycle[H]> | undefined\n }): Promise<Awaited<TOuput>[]> {\n const parallelPromises: Promise<TOuput>[] = []\n\n for (const plugin of this.getSortedPlugins(hookName)) {\n // TODO implement sequential with `buildStart` as an object({ sequential: boolean; handler: PluginContext[\"buildStart\"] })\n // if ((plugin[hookName] as { sequential?: boolean })?.sequential) {\n // await Promise.all(parallelPromises)\n // parallelPromises.length = 0\n // await this.execute({\n // strategy: 'hookParallel',\n // hookName,\n // parameters,\n // plugin,\n // })\n // }\n const promise: Promise<TOuput> | null = this.execute({ strategy: 'hookParallel', hookName, parameters, plugin })\n\n if (promise) {\n parallelPromises.push(promise)\n }\n }\n const results = await Promise.allSettled(parallelPromises)\n const errors = results.filter((result) => result.status === 'rejected').map((result) => (result as PromiseRejectedResult).reason) as PluginError[]\n\n if (errors.length) {\n throw new ParallelPluginError('Error', { errors, pluginManager: this })\n }\n\n return results.filter((result) => result.status === 'fulfilled').map((result) => (result as PromiseFulfilledResult<Awaited<TOuput>>).value)\n }\n\n /**\n *\n * Chains, reduces returned value, handling the reduced value as the first hook argument\n */\n hookReduceArg0<H extends PluginLifecycleHooks>({\n hookName,\n parameters,\n reduce,\n }: {\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n reduce: (reduction: Argument0<H>, result: ReturnType<ParseResult<H>>, plugin: KubbPlugin) => MaybePromise<Argument0<H> | null>\n }): Promise<Argument0<H>> {\n const [argument0, ...rest] = parameters\n\n let promise: Promise<Argument0<H>> = Promise.resolve(argument0)\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise\n .then((arg0) => {\n const value = this.execute({\n strategy: 'hookReduceArg0',\n hookName,\n parameters: [arg0, ...rest] as Parameters<PluginLifecycle[H]>,\n plugin,\n })\n return value\n })\n .then((result) => reduce.call(this.core.api, argument0, result as ReturnType<ParseResult<H>>, plugin)) as Promise<Argument0<H>>\n }\n return promise\n }\n\n /**\n * Chains plugins\n */\n hookSeq<H extends PluginLifecycleHooks>({ hookName, parameters }: { hookName: H; parameters?: Parameters<PluginLifecycle[H]> }) {\n let promise: Promise<void | null> = Promise.resolve()\n for (const plugin of this.getSortedPlugins(hookName)) {\n promise = promise.then(() =>\n this.execute({\n strategy: 'hookSeq',\n hookName,\n parameters,\n plugin,\n })\n )\n }\n return promise.then(noReturn)\n }\n\n private getSortedPlugins(_hookName: keyof PluginLifecycle): KubbPlugin[] {\n const plugins = [...this.plugins].filter((plugin) => plugin.name !== 'core')\n\n return plugins\n }\n\n public getPlugin(hookName: keyof PluginLifecycle, pluginName: string): KubbPlugin {\n const plugins = [...this.plugins]\n\n const pluginByPluginName = plugins.find((item) => item.name === pluginName && item[hookName])\n if (!pluginByPluginName) {\n // fallback on the core plugin when there is no match\n\n return this.core\n }\n return pluginByPluginName\n }\n\n private addExecuter(executer: Executer | undefined) {\n this.onExecute?.call(this, executer, this)\n\n if (executer) {\n this.executed.push(executer)\n }\n }\n\n /**\n * Run an async plugin hook and return the result.\n * @param hookName Name of the plugin hook. Must be either in `PluginHooks` or `OutputPluginValueHooks`.\n * @param args Arguments passed to the plugin hook.\n * @param plugin The actual pluginObject to run.\n */\n // Implementation signature\n private execute<H extends PluginLifecycleHooks, TResult = void>({\n strategy,\n hookName,\n parameters,\n plugin,\n }: {\n strategy: Strategy\n hookName: H\n parameters: unknown[] | undefined\n plugin: KubbPlugin\n }): Promise<TResult> | null {\n const hook = plugin[hookName]\n\n if (!hook) {\n return null\n }\n\n return Promise.resolve()\n .then(() => {\n // add current execution to the variable `this.executer` so we can track which plugin is getting called\n this.executer = {\n strategy,\n hookName,\n plugin,\n }\n\n if (typeof hook === 'function') {\n const hookResult = (hook as Function).apply(this.core.api, parameters) as TResult\n\n if (isPromise(hookResult)) {\n return Promise.resolve(hookResult).then((result: TResult) => {\n this.addExecuter({\n strategy,\n hookName,\n plugin,\n })\n\n return result\n })\n }\n\n return hookResult\n }\n\n this.addExecuter({\n strategy,\n hookName,\n plugin,\n })\n\n return hook\n })\n .catch((e: Error) => {\n this.catcher<H>(e, plugin, hookName)\n }) as Promise<TResult>\n }\n\n /**\n * Run a sync plugin hook and return the result.\n * @param hookName Name of the plugin hook. Must be in `PluginHooks`.\n * @param args Arguments passed to the plugin hook.\n * @param plugin The acutal plugin\n * @param replaceContext When passed, the plugin context can be overridden.\n */\n private executeSync<H extends PluginLifecycleHooks>({\n strategy,\n hookName,\n parameters,\n plugin,\n }: {\n strategy: Strategy\n hookName: H\n parameters: Parameters<PluginLifecycle[H]>\n plugin: KubbPlugin\n }): ReturnType<ParseResult<H>> | null {\n const hook = plugin[hookName]\n\n if (!hook) {\n return null\n }\n\n try {\n // add current execution to the variable `this.executer` so we can track which plugin is getting called\n this.executer = {\n strategy,\n hookName,\n plugin,\n }\n\n if (typeof hook === 'function') {\n const fn = (hook as Function).apply(this.core.api, parameters) as ReturnType<ParseResult<H>>\n\n this.addExecuter({\n strategy,\n hookName,\n plugin,\n })\n\n return fn\n }\n\n this.addExecuter({\n strategy,\n hookName,\n plugin,\n })\n\n return hook\n } catch (e) {\n this.catcher<H>(e as Error, plugin, hookName)\n\n return null as ReturnType<ParseResult<H>>\n }\n }\n\n private catcher<H extends PluginLifecycleHooks>(e: Error, plugin: KubbPlugin, hookName: H) {\n const text = `${e.message} (plugin: ${plugin.name}, hook: ${hookName})\\n`\n\n throw new PluginError(text, { cause: e, pluginManager: this })\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noReturn() {}\n","import type { KubbPlugin } from '../../types.ts'\n\nexport class ValidationPluginError extends Error {}\n\nexport function validatePlugins(plugins: KubbPlugin[], dependedPluginNames: string | string[]): true {\n let pluginNames: string[] = []\n if (typeof dependedPluginNames === 'string') {\n pluginNames = [dependedPluginNames]\n } else {\n pluginNames = dependedPluginNames\n }\n\n pluginNames.forEach((pluginName) => {\n const exists = plugins.some((plugin) => plugin.name === pluginName)\n if (!exists) {\n throw new ValidationPluginError(`This plugin depends on the ${pluginName} plugin.`)\n }\n })\n\n return true\n}\n","export class SummaryError extends Error {\n public summary: string[]\n\n constructor(message: string, options: { cause: Error; summary?: string[] }) {\n super(message, { cause: options.cause })\n\n this.name = 'SummaryError'\n this.summary = options.summary || []\n }\n}\n","import { getFileSource } from './managers/fileManager/index.ts'\nimport { PluginManager } from './managers/pluginManager/index.ts'\nimport { clean, isURL, read } from './utils/index.ts'\nimport { isPromise } from './utils/isPromise.ts'\n\nimport type { Ora } from 'ora'\nimport type { File } from './managers/fileManager/index.ts'\nimport type { OnExecute } from './managers/pluginManager/index.ts'\nimport type { BuildOutput, KubbPlugin, LogLevel, PluginContext, TransformResult } from './types.ts'\nimport type { QueueTask } from './utils/index.ts'\n\nexport type Logger<TParams = Record<string, any>> = {\n log: (message: string | null, options: { logLevel: LogLevel; params?: TParams }) => void\n spinner?: Ora\n}\ntype BuildOptions = {\n config: PluginContext['config']\n logger?: Logger\n}\n\nasync function transformReducer(\n this: PluginContext,\n _previousCode: string,\n result: TransformResult | Promise<TransformResult>,\n\n _plugin: KubbPlugin\n): Promise<string | null> {\n return result\n}\n\nexport async function build(options: BuildOptions): Promise<BuildOutput> {\n const { config, logger } = options\n\n try {\n if (!isURL(config.input.path)) {\n await read(config.input.path)\n }\n } catch (e: any) {\n throw new Error('Cannot read file/URL defined in `input.path` or set with --input in the CLI of your Kubb config', { cause: e })\n }\n\n if (config.output.clean) {\n await clean(config.output.path)\n }\n\n const queueTask = async (id: string, file: File) => {\n const { path } = file\n\n let code: string | null = getFileSource(file)\n\n const { result: loadedResult } = await pluginManager.hookFirst({\n hookName: 'load',\n parameters: [path],\n })\n if (loadedResult && isPromise(loadedResult)) {\n code = await loadedResult\n }\n if (loadedResult && !isPromise(loadedResult)) {\n code = loadedResult\n }\n\n if (code) {\n const transformedCode = await pluginManager.hookReduceArg0({\n hookName: 'transform',\n parameters: [code, path],\n reduce: transformReducer,\n })\n\n if (config.output.write || config.output.write === undefined) {\n await pluginManager.hookParallel({\n hookName: 'writeFile',\n parameters: [transformedCode, path],\n })\n }\n }\n }\n\n const onExecute: OnExecute = (executer) => {\n if (!executer) {\n return\n }\n\n const { hookName, plugin } = executer\n\n if (config.logLevel === 'info' && logger) {\n logger.log(null, { logLevel: config.logLevel, params: { hookName, pluginName: plugin.name } })\n }\n }\n\n const pluginManager = new PluginManager(config, { task: queueTask as QueueTask<File>, onExecute })\n const { plugins, fileManager } = pluginManager\n\n await pluginManager.hookParallel<'validate', true>({\n hookName: 'validate',\n parameters: [plugins],\n })\n\n await pluginManager.hookParallel({\n hookName: 'buildStart',\n parameters: [config],\n })\n\n await pluginManager.hookParallel({ hookName: 'buildEnd' })\n\n return { files: fileManager.files.map((file) => ({ ...file, source: getFileSource(file) })), pluginManager }\n}\n","import type { CLIOptions, KubbUserConfig, MaybePromise } from './types.ts'\n\n/**\n * Type helper to make it easier to use kubb.config.js\n * accepts a direct {@link KubbConfig} object, or a function that returns it.\n * The function receives a {@link ConfigEnv} object that exposes two properties:\n */\nexport const defineConfig = (\n options:\n | MaybePromise<KubbUserConfig>\n | ((\n /** The options derived from the CLI flags */\n cliOptions: CLIOptions\n ) => MaybePromise<KubbUserConfig>)\n) => options\n","/**\n * Abstract class that contains the building blocks for plugins to create their own Generator\n * @link idea based on https://github.com/colinhacks/zod/blob/master/src/types.ts#L137\n */\nexport abstract class Generator<TOptions extends object = object> {\n private _options: TOptions = {} as TOptions\n\n constructor(options: TOptions = {} as TOptions) {\n if (options) {\n this._options = {\n ...this._options,\n ...options,\n }\n }\n return this\n }\n\n get options() {\n return this._options\n }\n\n abstract build(...params: unknown[]): unknown\n}\n","import { Generator } from './Generator.ts'\n\n/**\n * Abstract class that contains the building blocks for plugins to create their own SchemaGenerator\n */\nexport abstract class SchemaGenerator<TOptions extends object, TInput, TOutput> extends Generator<TOptions> {\n abstract build(schema: TInput, name: string, description?: string): TOutput\n}\n","import { build } from './build.ts'\n\nexport * from './config.ts'\nexport * from './build.ts'\nexport * from './types.ts'\nexport { CorePluginOptions, createPlugin, name } from './plugin.ts'\n\nexport * from './utils/index.ts'\nexport * from './managers/index.ts'\nexport * from './generators/index.ts'\n\nexport default build\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubb/core",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.13",
|
|
4
4
|
"description": "Generator core",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -34,7 +34,6 @@
|
|
|
34
34
|
},
|
|
35
35
|
"files": [
|
|
36
36
|
"dist",
|
|
37
|
-
"src",
|
|
38
37
|
"schemas",
|
|
39
38
|
"!/**/**.test.**",
|
|
40
39
|
"!/**/__tests__/**"
|
|
@@ -42,10 +41,10 @@
|
|
|
42
41
|
"dependencies": {
|
|
43
42
|
"change-case": "^4.1.2",
|
|
44
43
|
"directory-tree": "^3.5.1",
|
|
45
|
-
"graceful-fs": "^4.2.11",
|
|
46
44
|
"fs-extra": "^11.1.1",
|
|
45
|
+
"graceful-fs": "^4.2.11",
|
|
47
46
|
"rimraf": "^5.0.1",
|
|
48
|
-
"@kubb/ts-codegen": "1.1.
|
|
47
|
+
"@kubb/ts-codegen": "1.1.13"
|
|
49
48
|
},
|
|
50
49
|
"devDependencies": {
|
|
51
50
|
"@types/fs-extra": "^11.0.1",
|