@kubb/fabric-core 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/createFileParser-BD8yn0LT.cjs +14 -0
  2. package/dist/createFileParser-BD8yn0LT.cjs.map +1 -0
  3. package/dist/createFileParser-Cix3AMLd.js +8 -0
  4. package/dist/createFileParser-Cix3AMLd.js.map +1 -0
  5. package/dist/default-DCpuPmrL.js +10 -0
  6. package/dist/default-DCpuPmrL.js.map +1 -0
  7. package/dist/default-DNBu_jsL.cjs +15 -0
  8. package/dist/default-DNBu_jsL.cjs.map +1 -0
  9. package/dist/{defineApp-Bg7JewJQ.d.ts → defineApp-CZYKsxTp.d.ts} +43 -10
  10. package/dist/{defineApp-DKW3IRO8.d.cts → defineApp-c9lWJ96_.d.cts} +43 -10
  11. package/dist/index.cjs +107 -40
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +13 -4
  14. package/dist/index.d.ts +13 -4
  15. package/dist/index.js +97 -33
  16. package/dist/index.js.map +1 -1
  17. package/dist/parsers/default.cjs +4 -0
  18. package/dist/parsers/default.d.cts +8 -0
  19. package/dist/parsers/default.d.ts +8 -0
  20. package/dist/parsers/default.js +4 -0
  21. package/dist/parsers/tsx.cjs +4 -2
  22. package/dist/parsers/tsx.d.cts +2 -2
  23. package/dist/parsers/tsx.d.ts +2 -2
  24. package/dist/parsers/tsx.js +3 -1
  25. package/dist/parsers/typescript.cjs +6 -5
  26. package/dist/parsers/typescript.d.cts +2 -2
  27. package/dist/parsers/typescript.d.ts +2 -2
  28. package/dist/parsers/typescript.js +2 -1
  29. package/dist/tsx-BSUaIML3.cjs +16 -0
  30. package/dist/tsx-BSUaIML3.cjs.map +1 -0
  31. package/dist/tsx-DBAk9dqS.js +11 -0
  32. package/dist/tsx-DBAk9dqS.js.map +1 -0
  33. package/dist/types-CkbelZaS.d.ts +15 -0
  34. package/dist/types-GueHciQ3.d.cts +15 -0
  35. package/dist/types.d.cts +1 -1
  36. package/dist/types.d.ts +1 -1
  37. package/dist/{parser-CWB_OBtr.js → typescript-C60gWBu8.js} +4 -34
  38. package/dist/typescript-C60gWBu8.js.map +1 -0
  39. package/dist/{parser-QF8j8-pj.cjs → typescript-Z90jN87k.cjs} +5 -47
  40. package/dist/typescript-Z90jN87k.cjs.map +1 -0
  41. package/package.json +8 -1
  42. package/src/FileManager.ts +14 -193
  43. package/src/FileProcessor.ts +86 -0
  44. package/src/createFile.ts +167 -0
  45. package/src/defineApp.ts +5 -5
  46. package/src/index.ts +3 -1
  47. package/src/parsers/createFileParser.ts +5 -0
  48. package/src/parsers/default.ts +7 -0
  49. package/src/parsers/tsx.ts +1 -1
  50. package/src/parsers/types.ts +12 -0
  51. package/src/parsers/typescript.ts +1 -1
  52. package/src/utils/EventEmitter.ts +23 -0
  53. package/dist/parser-CWB_OBtr.js.map +0 -1
  54. package/dist/parser-D64DdV1v.d.cts +0 -21
  55. package/dist/parser-QF8j8-pj.cjs.map +0 -1
  56. package/dist/parser-yYqnryUV.d.ts +0 -21
  57. package/src/parsers/parser.ts +0 -56
@@ -0,0 +1,14 @@
1
+
2
+ //#region src/parsers/createFileParser.ts
3
+ function createFileParser(parser) {
4
+ return parser;
5
+ }
6
+
7
+ //#endregion
8
+ Object.defineProperty(exports, 'createFileParser', {
9
+ enumerable: true,
10
+ get: function () {
11
+ return createFileParser;
12
+ }
13
+ });
14
+ //# sourceMappingURL=createFileParser-BD8yn0LT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFileParser-BD8yn0LT.cjs","names":[],"sources":["../src/parsers/createFileParser.ts"],"sourcesContent":["import type { Parser } from './types.ts'\n\nexport function createFileParser<TMeta extends object = object>(parser: Parser<TMeta>): Parser<TMeta> {\n return parser\n}\n"],"mappings":";;AAEA,SAAgB,iBAAgD,QAAsC;AACpG,QAAO"}
@@ -0,0 +1,8 @@
1
+ //#region src/parsers/createFileParser.ts
2
+ function createFileParser(parser) {
3
+ return parser;
4
+ }
5
+
6
+ //#endregion
7
+ export { createFileParser as t };
8
+ //# sourceMappingURL=createFileParser-Cix3AMLd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFileParser-Cix3AMLd.js","names":[],"sources":["../src/parsers/createFileParser.ts"],"sourcesContent":["import type { Parser } from './types.ts'\n\nexport function createFileParser<TMeta extends object = object>(parser: Parser<TMeta>): Parser<TMeta> {\n return parser\n}\n"],"mappings":";AAEA,SAAgB,iBAAgD,QAAsC;AACpG,QAAO"}
@@ -0,0 +1,10 @@
1
+ import { t as createFileParser } from "./createFileParser-Cix3AMLd.js";
2
+
3
+ //#region src/parsers/default.ts
4
+ const defaultParser = createFileParser({ async print(file) {
5
+ return file.sources.map((item) => item.value).join("\n\n");
6
+ } });
7
+
8
+ //#endregion
9
+ export { defaultParser as t };
10
+ //# sourceMappingURL=default-DCpuPmrL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-DCpuPmrL.js","names":[],"sources":["../src/parsers/default.ts"],"sourcesContent":["import { createFileParser } from './createFileParser.ts'\n\nexport const defaultParser = createFileParser({\n async print(file) {\n return file.sources.map((item) => item.value).join('\\n\\n')\n },\n})\n"],"mappings":";;;AAEA,MAAa,gBAAgB,iBAAiB,EAC5C,MAAM,MAAM,MAAM;AAChB,QAAO,KAAK,QAAQ,KAAK,SAAS,KAAK,MAAM,CAAC,KAAK,OAAO;GAE7D,CAAC"}
@@ -0,0 +1,15 @@
1
+ const require_createFileParser = require('./createFileParser-BD8yn0LT.cjs');
2
+
3
+ //#region src/parsers/default.ts
4
+ const defaultParser = require_createFileParser.createFileParser({ async print(file) {
5
+ return file.sources.map((item) => item.value).join("\n\n");
6
+ } });
7
+
8
+ //#endregion
9
+ Object.defineProperty(exports, 'defaultParser', {
10
+ enumerable: true,
11
+ get: function () {
12
+ return defaultParser;
13
+ }
14
+ });
15
+ //# sourceMappingURL=default-DNBu_jsL.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-DNBu_jsL.cjs","names":["createFileParser"],"sources":["../src/parsers/default.ts"],"sourcesContent":["import { createFileParser } from './createFileParser.ts'\n\nexport const defaultParser = createFileParser({\n async print(file) {\n return file.sources.map((item) => item.value).join('\\n\\n')\n },\n})\n"],"mappings":";;;AAEA,MAAa,gBAAgBA,0CAAiB,EAC5C,MAAM,MAAM,MAAM;AAChB,QAAO,KAAK,QAAQ,KAAK,SAAS,KAAK,MAAM,CAAC,KAAK,OAAO;GAE7D,CAAC"}
@@ -1,10 +1,44 @@
1
1
  import { a as ResolvedFile, i as Path, n as File, t as Extname } from "./KubbFile-BzVkcu9M.js";
2
2
 
3
- //#region src/FileManager.d.ts
4
- type WriteFilesProps = {
3
+ //#region src/utils/EventEmitter.d.ts
4
+ declare class EventEmitter<TEvents extends Record<string, any>> {
5
+ #private;
6
+ constructor(maxListener?: number);
7
+ emit<TEventName extends keyof TEvents & string>(eventName: TEventName, ...eventArg: TEvents[TEventName]): void;
8
+ on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void;
9
+ off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void;
10
+ removeAll(): void;
11
+ }
12
+ //#endregion
13
+ //#region src/FileProcessor.d.ts
14
+ type FileProcessorEvents = {
15
+ start: [{
16
+ files: ResolvedFile[];
17
+ }];
18
+ finish: [{
19
+ files: ResolvedFile[];
20
+ }];
21
+ 'file:start': [{
22
+ file: ResolvedFile;
23
+ }];
24
+ 'file:finish': [{
25
+ file: ResolvedFile;
26
+ }];
27
+ };
28
+ type ProcessFilesProps = {
5
29
  extension?: Record<Extname, Extname | ''>;
6
30
  dryRun?: boolean;
7
31
  };
32
+ declare class FileProcessor extends EventEmitter<FileProcessorEvents> {
33
+ #private;
34
+ constructor(maxListener?: number);
35
+ run(files: Array<ResolvedFile>, {
36
+ dryRun,
37
+ extension
38
+ }: ProcessFilesProps): Promise<ResolvedFile[]>;
39
+ }
40
+ //#endregion
41
+ //#region src/FileManager.d.ts
8
42
  declare class FileManager {
9
43
  #private;
10
44
  constructor();
@@ -13,11 +47,10 @@ declare class FileManager {
13
47
  getByPath(path: Path): ResolvedFile | null;
14
48
  deleteByPath(path: Path): void;
15
49
  clear(): void;
16
- getFiles(): Array<ResolvedFile>;
17
- processFiles({
18
- dryRun,
19
- extension
20
- }: WriteFilesProps): Promise<Array<ResolvedFile>>;
50
+ get files(): Array<ResolvedFile>;
51
+ get processor(): {
52
+ run(options: ProcessFilesProps): Promise<ResolvedFile<object>[]>;
53
+ };
21
54
  }
22
55
  //#endregion
23
56
  //#region src/defineApp.d.ts
@@ -49,7 +82,7 @@ interface App {
49
82
  _component: Component;
50
83
  render(): Promise<void>;
51
84
  renderToString(): Promise<string>;
52
- getFiles(): Promise<Array<ResolvedFile>>;
85
+ files: Array<ResolvedFile>;
53
86
  use<Options>(plugin: Plugin<Options>, options: NoInfer<Options>): this;
54
87
  write(options?: WriteOptions): Promise<void>;
55
88
  addFile(...files: Array<File>): Promise<void>;
@@ -58,5 +91,5 @@ interface App {
58
91
  type DefineApp<TContext extends AppContext> = (rootComponent?: Component, options?: TContext['options']) => App;
59
92
  declare function defineApp<THostElement, TContext extends AppContext>(instance: RootRenderFunction<THostElement, TContext>): DefineApp<TContext>;
60
93
  //#endregion
61
- export { FileManager as a, defineApp as i, AppContext as n, DefineApp as r, App as t };
62
- //# sourceMappingURL=defineApp-Bg7JewJQ.d.ts.map
94
+ export { FileManager as a, defineApp as i, AppContext as n, FileProcessor as o, DefineApp as r, App as t };
95
+ //# sourceMappingURL=defineApp-CZYKsxTp.d.ts.map
@@ -1,10 +1,44 @@
1
1
  import { a as ResolvedFile, i as Path, n as File, t as Extname } from "./KubbFile-BrN7Wwp6.cjs";
2
2
 
3
- //#region src/FileManager.d.ts
4
- type WriteFilesProps = {
3
+ //#region src/utils/EventEmitter.d.ts
4
+ declare class EventEmitter<TEvents extends Record<string, any>> {
5
+ #private;
6
+ constructor(maxListener?: number);
7
+ emit<TEventName extends keyof TEvents & string>(eventName: TEventName, ...eventArg: TEvents[TEventName]): void;
8
+ on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void;
9
+ off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void;
10
+ removeAll(): void;
11
+ }
12
+ //#endregion
13
+ //#region src/FileProcessor.d.ts
14
+ type FileProcessorEvents = {
15
+ start: [{
16
+ files: ResolvedFile[];
17
+ }];
18
+ finish: [{
19
+ files: ResolvedFile[];
20
+ }];
21
+ 'file:start': [{
22
+ file: ResolvedFile;
23
+ }];
24
+ 'file:finish': [{
25
+ file: ResolvedFile;
26
+ }];
27
+ };
28
+ type ProcessFilesProps = {
5
29
  extension?: Record<Extname, Extname | ''>;
6
30
  dryRun?: boolean;
7
31
  };
32
+ declare class FileProcessor extends EventEmitter<FileProcessorEvents> {
33
+ #private;
34
+ constructor(maxListener?: number);
35
+ run(files: Array<ResolvedFile>, {
36
+ dryRun,
37
+ extension
38
+ }: ProcessFilesProps): Promise<ResolvedFile[]>;
39
+ }
40
+ //#endregion
41
+ //#region src/FileManager.d.ts
8
42
  declare class FileManager {
9
43
  #private;
10
44
  constructor();
@@ -13,11 +47,10 @@ declare class FileManager {
13
47
  getByPath(path: Path): ResolvedFile | null;
14
48
  deleteByPath(path: Path): void;
15
49
  clear(): void;
16
- getFiles(): Array<ResolvedFile>;
17
- processFiles({
18
- dryRun,
19
- extension
20
- }: WriteFilesProps): Promise<Array<ResolvedFile>>;
50
+ get files(): Array<ResolvedFile>;
51
+ get processor(): {
52
+ run(options: ProcessFilesProps): Promise<ResolvedFile<object>[]>;
53
+ };
21
54
  }
22
55
  //#endregion
23
56
  //#region src/defineApp.d.ts
@@ -49,7 +82,7 @@ interface App {
49
82
  _component: Component;
50
83
  render(): Promise<void>;
51
84
  renderToString(): Promise<string>;
52
- getFiles(): Promise<Array<ResolvedFile>>;
85
+ files: Array<ResolvedFile>;
53
86
  use<Options>(plugin: Plugin<Options>, options: NoInfer<Options>): this;
54
87
  write(options?: WriteOptions): Promise<void>;
55
88
  addFile(...files: Array<File>): Promise<void>;
@@ -58,5 +91,5 @@ interface App {
58
91
  type DefineApp<TContext extends AppContext> = (rootComponent?: Component, options?: TContext['options']) => App;
59
92
  declare function defineApp<THostElement, TContext extends AppContext>(instance: RootRenderFunction<THostElement, TContext>): DefineApp<TContext>;
60
93
  //#endregion
61
- export { FileManager as a, defineApp as i, AppContext as n, DefineApp as r, App as t };
62
- //# sourceMappingURL=defineApp-DKW3IRO8.d.cts.map
94
+ export { FileManager as a, defineApp as i, AppContext as n, FileProcessor as o, DefineApp as r, App as t };
95
+ //# sourceMappingURL=defineApp-c9lWJ96_.d.cts.map
package/dist/index.cjs CHANGED
@@ -1,14 +1,19 @@
1
- const require_parser = require('./parser-QF8j8-pj.cjs');
2
- let p_limit = require("p-limit");
3
- p_limit = require_parser.__toESM(p_limit);
1
+ const require_typescript = require('./typescript-Z90jN87k.cjs');
2
+ const require_createFileParser = require('./createFileParser-BD8yn0LT.cjs');
3
+ const require_tsx = require('./tsx-BSUaIML3.cjs');
4
+ const require_default = require('./default-DNBu_jsL.cjs');
4
5
  let node_path = require("node:path");
5
- node_path = require_parser.__toESM(node_path);
6
- let node_crypto = require("node:crypto");
7
- node_crypto = require_parser.__toESM(node_crypto);
6
+ node_path = require_typescript.__toESM(node_path);
8
7
  let natural_orderby = require("natural-orderby");
9
- natural_orderby = require_parser.__toESM(natural_orderby);
8
+ natural_orderby = require_typescript.__toESM(natural_orderby);
9
+ let node_crypto = require("node:crypto");
10
+ node_crypto = require_typescript.__toESM(node_crypto);
10
11
  let remeda = require("remeda");
11
- remeda = require_parser.__toESM(remeda);
12
+ remeda = require_typescript.__toESM(remeda);
13
+ let node_events = require("node:events");
14
+ node_events = require_typescript.__toESM(node_events);
15
+ let p_limit = require("p-limit");
16
+ p_limit = require_typescript.__toESM(p_limit);
12
17
 
13
18
  //#region \0@oxc-project+runtime@0.95.0/helpers/checkPrivateRedeclaration.js
14
19
  function _checkPrivateRedeclaration(e, t) {
@@ -64,19 +69,11 @@ var Cache = class {
64
69
  };
65
70
 
66
71
  //#endregion
67
- //#region src/FileManager.ts
72
+ //#region src/createFile.ts
68
73
  function hashObject(obj) {
69
74
  const str = JSON.stringify(obj, Object.keys(obj).sort());
70
75
  return (0, node_crypto.createHash)("sha256").update(str).digest("hex");
71
76
  }
72
- function mergeFile(a, b) {
73
- return {
74
- ...a,
75
- sources: [...a.sources || [], ...b.sources || []],
76
- imports: [...a.imports || [], ...b.imports || []],
77
- exports: [...a.exports || [], ...b.exports || []]
78
- };
79
- }
80
77
  function combineSources(sources) {
81
78
  return (0, remeda.uniqueBy)(sources, (obj) => [
82
79
  obj.name,
@@ -155,7 +152,7 @@ function createFile(file) {
155
152
  return {
156
153
  ...file,
157
154
  id: hashObject({ path: file.path }),
158
- name: require_parser.trimExtName(file.baseName),
155
+ name: require_typescript.trimExtName(file.baseName),
159
156
  extname,
160
157
  imports,
161
158
  exports: exports$1,
@@ -163,12 +160,87 @@ function createFile(file) {
163
160
  meta: file.meta || {}
164
161
  };
165
162
  }
166
- var _cache = /* @__PURE__ */ new WeakMap();
163
+
164
+ //#endregion
165
+ //#region src/utils/EventEmitter.ts
166
+ var _emitter = /* @__PURE__ */ new WeakMap();
167
+ var EventEmitter = class {
168
+ constructor(maxListener = 100) {
169
+ _classPrivateFieldInitSpec(this, _emitter, new node_events.EventEmitter());
170
+ _classPrivateFieldGet2(_emitter, this).setMaxListeners(maxListener);
171
+ }
172
+ emit(eventName, ...eventArg) {
173
+ _classPrivateFieldGet2(_emitter, this).emit(eventName, ...eventArg);
174
+ }
175
+ on(eventName, handler) {
176
+ _classPrivateFieldGet2(_emitter, this).on(eventName, handler);
177
+ }
178
+ off(eventName, handler) {
179
+ _classPrivateFieldGet2(_emitter, this).off(eventName, handler);
180
+ }
181
+ removeAll() {
182
+ _classPrivateFieldGet2(_emitter, this).removeAllListeners();
183
+ }
184
+ };
185
+
186
+ //#endregion
187
+ //#region src/FileProcessor.ts
188
+ async function getParser(extname) {
189
+ const parsers = {
190
+ ".ts": require_typescript.typeScriptParser,
191
+ ".js": require_typescript.typeScriptParser,
192
+ ".jsx": require_tsx.tsxParser,
193
+ ".tsx": require_tsx.tsxParser,
194
+ ".json": require_default.defaultParser
195
+ };
196
+ if (!extname) return require_default.defaultParser;
197
+ const parser = parsers[extname];
198
+ if (!parser) console.warn(`[parser] No parser found for ${extname}, default parser will be used`);
199
+ return parser || require_default.defaultParser;
200
+ }
201
+ async function parseFile(file, { extname } = {}) {
202
+ return (await getParser(file.extname)).print(file, { extname });
203
+ }
167
204
  var _limit = /* @__PURE__ */ new WeakMap();
205
+ var FileProcessor = class extends EventEmitter {
206
+ constructor(maxListener = 1e3) {
207
+ super(maxListener);
208
+ _classPrivateFieldInitSpec(this, _limit, (0, p_limit.default)(100));
209
+ return this;
210
+ }
211
+ async run(files, { dryRun, extension }) {
212
+ this.emit("start", { files });
213
+ const promises = files.map((resolvedFile) => _classPrivateFieldGet2(_limit, this).call(this, async () => {
214
+ const extname = (extension === null || extension === void 0 ? void 0 : extension[resolvedFile.extname]) || void 0;
215
+ this.emit("file:start", { file: resolvedFile });
216
+ if (!dryRun) {
217
+ const source = await parseFile(resolvedFile, { extname });
218
+ await require_typescript.write(resolvedFile.path, source, { sanity: false });
219
+ }
220
+ this.emit("file:finish", { file: resolvedFile });
221
+ }));
222
+ await Promise.all(promises);
223
+ this.emit("finish", { files });
224
+ return files;
225
+ }
226
+ };
227
+
228
+ //#endregion
229
+ //#region src/FileManager.ts
230
+ function mergeFile(a, b) {
231
+ return {
232
+ ...a,
233
+ sources: [...a.sources || [], ...b.sources || []],
234
+ imports: [...a.imports || [], ...b.imports || []],
235
+ exports: [...a.exports || [], ...b.exports || []]
236
+ };
237
+ }
238
+ var _cache = /* @__PURE__ */ new WeakMap();
239
+ var _processor = /* @__PURE__ */ new WeakMap();
168
240
  var FileManager = class {
169
241
  constructor() {
170
242
  _classPrivateFieldInitSpec(this, _cache, new Cache());
171
- _classPrivateFieldInitSpec(this, _limit, (0, p_limit.default)(100));
243
+ _classPrivateFieldInitSpec(this, _processor, new FileProcessor());
172
244
  return this;
173
245
  }
174
246
  async add(...files) {
@@ -200,22 +272,15 @@ var FileManager = class {
200
272
  clear() {
201
273
  _classPrivateFieldGet2(_cache, this).clear();
202
274
  }
203
- getFiles() {
204
- return (0, natural_orderby.orderBy)(_classPrivateFieldGet2(_cache, this).keys(), [(v) => v.length, (v) => require_parser.trimExtName(v).endsWith("index")]).map((key) => _classPrivateFieldGet2(_cache, this).get(key)).filter(Boolean);
275
+ get files() {
276
+ return (0, natural_orderby.orderBy)(_classPrivateFieldGet2(_cache, this).keys(), [(v) => v.length, (v) => require_typescript.trimExtName(v).endsWith("index")]).map((key) => _classPrivateFieldGet2(_cache, this).get(key)).filter(Boolean);
205
277
  }
206
- async processFiles({ dryRun, extension }) {
207
- const files = this.getFiles();
208
- const promises = files.map((resolvedFile) => {
209
- return _classPrivateFieldGet2(_limit, this).call(this, async () => {
210
- const extname = extension ? extension[resolvedFile.extname] || void 0 : resolvedFile.extname;
211
- if (!dryRun) {
212
- const source = await require_parser.parseFile(resolvedFile, { extname });
213
- await require_parser.write(resolvedFile.path, source, { sanity: false });
214
- }
215
- });
216
- });
217
- await Promise.all(promises);
218
- return files;
278
+ get processor() {
279
+ const files = this.files;
280
+ const processor = _classPrivateFieldGet2(_processor, this);
281
+ return { async run(options) {
282
+ return processor.run(files, options);
283
+ } };
219
284
  }
220
285
  };
221
286
 
@@ -236,7 +301,7 @@ function defineApp(instance) {
236
301
  context.fileManager.clear();
237
302
  },
238
303
  get files() {
239
- return fileManager.getFiles();
304
+ return fileManager.files;
240
305
  }
241
306
  };
242
307
  const { render, renderToString, waitUntilExit } = instance.call(context, rootComponent, context);
@@ -249,8 +314,8 @@ function defineApp(instance) {
249
314
  async renderToString() {
250
315
  return renderToString();
251
316
  },
252
- async getFiles() {
253
- return fileManager.getFiles();
317
+ get files() {
318
+ return fileManager.files;
254
319
  },
255
320
  waitUntilExit,
256
321
  addFile: context.addFile,
@@ -258,7 +323,7 @@ function defineApp(instance) {
258
323
  extension: { ".ts": ".ts" },
259
324
  dryRun: false
260
325
  }) {
261
- await fileManager.processFiles({
326
+ await fileManager.processor.run({
262
327
  extension: options$1.extension,
263
328
  dryRun: options$1.dryRun
264
329
  });
@@ -298,7 +363,9 @@ const createApp = defineApp(() => {
298
363
 
299
364
  //#endregion
300
365
  exports.FileManager = FileManager;
366
+ exports.FileProcessor = FileProcessor;
301
367
  exports.createApp = createApp;
368
+ exports.createFile = createFile;
369
+ exports.createFileParser = require_createFileParser.createFileParser;
302
370
  exports.defineApp = defineApp;
303
- exports.parseFile = require_parser.parseFile;
304
371
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["exports","name","path","trimExtName","resolvedFiles: Array<KubbFile.ResolvedFile>","parseFile","write","createApp","app: App","options"],"sources":["../src/utils/Cache.ts","../src/FileManager.ts","../src/defineApp.ts","../src/createApp.ts"],"sourcesContent":["export class Cache<T> {\n #buffer = new Map<string, T>()\n\n get(key: string): T | null {\n return this.#buffer.get(key) ?? null\n }\n\n set(key: string, value: T): void {\n this.#buffer.set(key, value)\n }\n\n delete(key: string): void {\n this.#buffer.delete(key)\n }\n\n clear(): void {\n this.#buffer.clear()\n }\n\n keys(): string[] {\n return [...this.#buffer.keys()]\n }\n\n values(): Array<T> {\n return [...this.#buffer.values()]\n }\n\n flush(): void {\n // No-op for base cache\n }\n}\n","import pLimit from 'p-limit'\n\nimport type * as KubbFile from './KubbFile.ts'\nimport { parseFile } from './parsers/parser.ts'\nimport { Cache } from './utils/Cache.ts'\nimport { trimExtName, write } from './fs.ts'\nimport { createHash } from 'node:crypto'\nimport path from 'node:path'\nimport { orderBy } from 'natural-orderby'\nimport { isDeepEqual, uniqueBy } from 'remeda'\n\ntype WriteFilesProps = {\n extension?: Record<KubbFile.Extname, KubbFile.Extname | ''>\n dryRun?: boolean\n}\n\nfunction hashObject(obj: Record<string, unknown>): string {\n const str = JSON.stringify(obj, Object.keys(obj).sort())\n return createHash('sha256').update(str).digest('hex')\n}\n\nexport function mergeFile<TMeta extends object = object>(a: KubbFile.File<TMeta>, b: KubbFile.File<TMeta>): KubbFile.File<TMeta> {\n return {\n ...a,\n sources: [...(a.sources || []), ...(b.sources || [])],\n imports: [...(a.imports || []), ...(b.imports || [])],\n exports: [...(a.exports || []), ...(b.exports || [])],\n }\n}\n\nexport function combineSources(sources: Array<KubbFile.Source>): Array<KubbFile.Source> {\n return uniqueBy(sources, (obj) => [obj.name, obj.isExportable, obj.isTypeOnly] as const)\n}\n\nexport function combineExports(exports: Array<KubbFile.Export>): Array<KubbFile.Export> {\n return orderBy(exports, [\n (v) => !!Array.isArray(v.name),\n (v) => !v.isTypeOnly,\n (v) => v.path,\n (v) => !!v.name,\n (v) => (Array.isArray(v.name) ? orderBy(v.name) : v.name),\n ]).reduce(\n (prev, curr) => {\n const name = curr.name\n const prevByPath = prev.findLast((imp) => imp.path === curr.path)\n const prevByPathAndIsTypeOnly = prev.findLast((imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly)\n\n if (prevByPathAndIsTypeOnly) {\n // we already have an export that has the same path but uses `isTypeOnly` (export type ...)\n return prev\n }\n\n const uniquePrev = prev.findLast(\n (imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly && imp.asAlias === curr.asAlias,\n )\n\n // we already have an item that was unique enough or name field is empty or prev asAlias is set but current has no changes\n if (uniquePrev || (Array.isArray(name) && !name.length) || (prevByPath?.asAlias && !curr.asAlias)) {\n return prev\n }\n\n if (!prevByPath) {\n return [\n ...prev,\n {\n ...curr,\n name: Array.isArray(name) ? [...new Set(name)] : name,\n },\n ]\n }\n\n // merge all names when prev and current both have the same isTypeOnly set\n if (prevByPath && Array.isArray(prevByPath.name) && Array.isArray(curr.name) && prevByPath.isTypeOnly === curr.isTypeOnly) {\n prevByPath.name = [...new Set([...prevByPath.name, ...curr.name])]\n\n return prev\n }\n\n return [...prev, curr]\n },\n [] as Array<KubbFile.Export>,\n )\n}\n\nexport function combineImports(imports: Array<KubbFile.Import>, exports: Array<KubbFile.Export>, source?: string): Array<KubbFile.Import> {\n return orderBy(imports, [\n (v) => !!Array.isArray(v.name),\n (v) => !v.isTypeOnly,\n (v) => v.path,\n (v) => !!v.name,\n (v) => (Array.isArray(v.name) ? orderBy(v.name) : v.name),\n ]).reduce(\n (prev, curr) => {\n let name = Array.isArray(curr.name) ? [...new Set(curr.name)] : curr.name\n\n const hasImportInSource = (importName: string) => {\n if (!source) {\n return true\n }\n\n const checker = (name?: string) => {\n return name && source.includes(name)\n }\n\n return checker(importName) || exports.some(({ name }) => (Array.isArray(name) ? name.some(checker) : checker(name)))\n }\n\n if (curr.path === curr.root) {\n // root and path are the same file, remove the \"./\" import\n return prev\n }\n\n // merge all names and check if the importName is being used in the generated source and if not filter those imports out\n if (Array.isArray(name)) {\n name = name.filter((item) => (typeof item === 'string' ? hasImportInSource(item) : hasImportInSource(item.propertyName)))\n }\n\n const prevByPath = prev.findLast((imp) => imp.path === curr.path && imp.isTypeOnly === curr.isTypeOnly)\n const uniquePrev = prev.findLast((imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly)\n const prevByPathNameAndIsTypeOnly = prev.findLast((imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly)\n\n if (prevByPathNameAndIsTypeOnly) {\n // we already have an export that has the same path but uses `isTypeOnly` (import type ...)\n return prev\n }\n\n // already unique enough or name is empty\n if (uniquePrev || (Array.isArray(name) && !name.length)) {\n return prev\n }\n\n // new item, append name\n if (!prevByPath) {\n return [\n ...prev,\n {\n ...curr,\n name,\n },\n ]\n }\n\n // merge all names when prev and current both have the same isTypeOnly set\n if (prevByPath && Array.isArray(prevByPath.name) && Array.isArray(name) && prevByPath.isTypeOnly === curr.isTypeOnly) {\n prevByPath.name = [...new Set([...prevByPath.name, ...name])]\n\n return prev\n }\n\n // no import was found in the source, ignore import\n if (!Array.isArray(name) && name && !hasImportInSource(name)) {\n return prev\n }\n\n return [...prev, curr]\n },\n [] as Array<KubbFile.Import>,\n )\n}\n\n/**\n * Helper to create a file with name and id set\n */\nexport function createFile<TMeta extends object = object>(file: KubbFile.File<TMeta>): KubbFile.ResolvedFile<TMeta> {\n const extname = path.extname(file.baseName) as KubbFile.Extname\n if (!extname) {\n throw new Error(`No extname found for ${file.baseName}`)\n }\n\n const source = file.sources.map((item) => item.value).join('\\n\\n')\n const exports = file.exports?.length ? combineExports(file.exports) : []\n const imports = file.imports?.length && source ? combineImports(file.imports, exports, source) : []\n const sources = file.sources?.length ? combineSources(file.sources) : []\n\n return {\n ...file,\n id: hashObject({ path: file.path }),\n name: trimExtName(file.baseName),\n extname,\n imports: imports,\n exports: exports,\n sources: sources,\n meta: file.meta || ({} as TMeta),\n }\n}\n\nexport class FileManager {\n #cache = new Cache<KubbFile.ResolvedFile>()\n #limit = pLimit(100)\n\n constructor() {\n return this\n }\n\n async add(...files: Array<KubbFile.File>) {\n const resolvedFiles: Array<KubbFile.ResolvedFile> = []\n\n const mergedFiles = new Map<string, KubbFile.File>()\n\n files.forEach((file) => {\n const existing = mergedFiles.get(file.path)\n if (existing) {\n mergedFiles.set(file.path, mergeFile(existing, file))\n } else {\n mergedFiles.set(file.path, file)\n }\n })\n\n for (const file of mergedFiles.values()) {\n const existing = this.#cache.get(file.path)\n\n const merged = existing ? mergeFile(existing, file) : file\n const resolvedFile = createFile(merged)\n\n this.#cache.set(resolvedFile.path, resolvedFile)\n this.flush()\n\n resolvedFiles.push(resolvedFile)\n }\n\n return resolvedFiles\n }\n\n flush() {\n this.#cache.flush()\n }\n\n getByPath(path: KubbFile.Path): KubbFile.ResolvedFile | null {\n return this.#cache.get(path)\n }\n\n deleteByPath(path: KubbFile.Path): void {\n this.#cache.delete(path)\n }\n\n clear(): void {\n this.#cache.clear()\n }\n\n getFiles(): Array<KubbFile.ResolvedFile> {\n const cachedKeys = this.#cache.keys()\n\n // order by path length and if file is a barrel file\n const keys = orderBy(cachedKeys, [(v) => v.length, (v) => trimExtName(v).endsWith('index')])\n\n const files = keys.map((key) => this.#cache.get(key))\n\n return files.filter(Boolean)\n }\n\n async processFiles({ dryRun, extension }: WriteFilesProps): Promise<Array<KubbFile.ResolvedFile>> {\n const files = this.getFiles()\n\n const promises = files.map((resolvedFile) => {\n return this.#limit(async () => {\n const extname = extension ? extension[resolvedFile.extname] || undefined : resolvedFile.extname\n\n if (!dryRun) {\n const source = await parseFile(resolvedFile, { extname })\n\n await write(resolvedFile.path, source, { sanity: false })\n }\n })\n })\n\n await Promise.all(promises)\n\n return files\n }\n}\n","import type * as KubbFile from './KubbFile.ts'\nimport { FileManager } from './FileManager.ts'\nimport { isPromise } from 'remeda'\n\nconst isFunction = (val: unknown): val is Function => typeof val === 'function'\n\ntype Component = any\n\ntype PluginInstallFunction<Options = any[]> = Options extends unknown[] ? (app: App, ...options: Options) => any : (app: App, options: Options) => any\n\nexport type ObjectPlugin<Options = any[]> = {\n install: PluginInstallFunction<Options>\n}\nexport type FunctionPlugin<Options = any[]> = PluginInstallFunction<Options> & Partial<ObjectPlugin<Options>>\n\ntype AppRenderer = {\n render(): Promise<void> | void\n renderToString(): Promise<string> | string\n waitUntilExit(): Promise<void>\n}\n\nexport type AppContext<TOptions = unknown> = {\n options?: TOptions\n fileManager: FileManager\n addFile(...files: Array<KubbFile.File>): Promise<void>\n files: Array<KubbFile.ResolvedFile>\n clear: () => void\n}\n\ntype RootRenderFunction<THostElement, TContext extends AppContext> = (this: TContext, container: THostElement, context: TContext) => AppRenderer\n\ntype Plugin<Options = any[], P extends unknown[] = Options extends unknown[] ? Options : [Options]> = FunctionPlugin<P> | ObjectPlugin<P>\n\ntype WriteOptions = {\n extension?: Record<KubbFile.Extname, KubbFile.Extname | ''>\n dryRun?: boolean\n}\n\nexport interface App {\n _component: Component\n render(): Promise<void>\n renderToString(): Promise<string>\n getFiles(): Promise<Array<KubbFile.ResolvedFile>>\n use<Options>(plugin: Plugin<Options>, options: NoInfer<Options>): this\n write(options?: WriteOptions): Promise<void>\n addFile(...files: Array<KubbFile.File>): Promise<void>\n waitUntilExit(): Promise<void>\n}\n\nexport type DefineApp<TContext extends AppContext> = (rootComponent?: Component, options?: TContext['options']) => App\n\nexport function defineApp<THostElement, TContext extends AppContext>(instance: RootRenderFunction<THostElement, TContext>): DefineApp<TContext> {\n function createApp(rootComponent: Component, options?: TContext['options']): App {\n const installedPlugins = new WeakSet()\n const fileManager = new FileManager()\n const context = {\n options,\n fileManager,\n async addFile(...newFiles) {\n await fileManager.add(...newFiles)\n },\n clear() {\n context.fileManager.clear()\n },\n get files() {\n return fileManager.getFiles()\n },\n } as TContext\n\n const { render, renderToString, waitUntilExit } = instance.call(context, rootComponent, context)\n\n const app: App = {\n _component: rootComponent,\n async render() {\n if (isPromise(render)) {\n await render()\n } else {\n render()\n }\n },\n async renderToString() {\n return renderToString()\n },\n async getFiles() {\n return fileManager.getFiles()\n },\n waitUntilExit,\n addFile: context.addFile,\n async write(\n options = {\n extension: { '.ts': '.ts' },\n dryRun: false,\n },\n ) {\n await fileManager.processFiles({\n extension: options.extension,\n dryRun: options.dryRun,\n })\n },\n use(plugin: Plugin, ...options: any[]) {\n if (installedPlugins.has(plugin)) {\n console.warn('Plugin has already been applied to target app.')\n } else if (plugin && isFunction(plugin.install)) {\n installedPlugins.add(plugin)\n plugin.install(app, ...options)\n } else if (isFunction(plugin)) {\n installedPlugins.add(plugin)\n plugin(app, ...options)\n }\n\n return app\n },\n }\n\n return app\n }\n\n return createApp\n}\n","import { defineApp } from './defineApp.ts'\n\nexport const createApp = defineApp(() => {\n return {\n async render() {\n throw new Error('Method not implemented')\n },\n async renderToString() {\n throw new Error('Method not implemented')\n },\n async waitUntilExit() {\n throw new Error('Method not implemented')\n },\n }\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["exports","name","path","trimExtName","NodeEventEmitter","parsers: Record<KubbFile.Extname, Parser<any>>","typeScriptParser","tsxParser","defaultParser","write","resolvedFiles: Array<KubbFile.ResolvedFile>","path","trimExtName","createApp","app: App","options"],"sources":["../src/utils/Cache.ts","../src/createFile.ts","../src/utils/EventEmitter.ts","../src/FileProcessor.ts","../src/FileManager.ts","../src/defineApp.ts","../src/createApp.ts"],"sourcesContent":["export class Cache<T> {\n #buffer = new Map<string, T>()\n\n get(key: string): T | null {\n return this.#buffer.get(key) ?? null\n }\n\n set(key: string, value: T): void {\n this.#buffer.set(key, value)\n }\n\n delete(key: string): void {\n this.#buffer.delete(key)\n }\n\n clear(): void {\n this.#buffer.clear()\n }\n\n keys(): string[] {\n return [...this.#buffer.keys()]\n }\n\n values(): Array<T> {\n return [...this.#buffer.values()]\n }\n\n flush(): void {\n // No-op for base cache\n }\n}\n","import type * as KubbFile from './KubbFile.ts'\nimport { trimExtName } from './fs.ts'\nimport { createHash } from 'node:crypto'\nimport path from 'node:path'\nimport { isDeepEqual, uniqueBy } from 'remeda'\nimport { orderBy } from 'natural-orderby'\n\nfunction hashObject(obj: Record<string, unknown>): string {\n const str = JSON.stringify(obj, Object.keys(obj).sort())\n return createHash('sha256').update(str).digest('hex')\n}\n\nexport function combineSources(sources: Array<KubbFile.Source>): Array<KubbFile.Source> {\n return uniqueBy(sources, (obj) => [obj.name, obj.isExportable, obj.isTypeOnly] as const)\n}\n\nexport function combineExports(exports: Array<KubbFile.Export>): Array<KubbFile.Export> {\n return orderBy(exports, [\n (v) => !!Array.isArray(v.name),\n (v) => !v.isTypeOnly,\n (v) => v.path,\n (v) => !!v.name,\n (v) => (Array.isArray(v.name) ? orderBy(v.name) : v.name),\n ]).reduce(\n (prev, curr) => {\n const name = curr.name\n const prevByPath = prev.findLast((imp) => imp.path === curr.path)\n const prevByPathAndIsTypeOnly = prev.findLast((imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly)\n\n if (prevByPathAndIsTypeOnly) {\n // we already have an export that has the same path but uses `isTypeOnly` (export type ...)\n return prev\n }\n\n const uniquePrev = prev.findLast(\n (imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly && imp.asAlias === curr.asAlias,\n )\n\n // we already have an item that was unique enough or name field is empty or prev asAlias is set but current has no changes\n if (uniquePrev || (Array.isArray(name) && !name.length) || (prevByPath?.asAlias && !curr.asAlias)) {\n return prev\n }\n\n if (!prevByPath) {\n return [\n ...prev,\n {\n ...curr,\n name: Array.isArray(name) ? [...new Set(name)] : name,\n },\n ]\n }\n\n // merge all names when prev and current both have the same isTypeOnly set\n if (prevByPath && Array.isArray(prevByPath.name) && Array.isArray(curr.name) && prevByPath.isTypeOnly === curr.isTypeOnly) {\n prevByPath.name = [...new Set([...prevByPath.name, ...curr.name])]\n\n return prev\n }\n\n return [...prev, curr]\n },\n [] as Array<KubbFile.Export>,\n )\n}\n\nexport function combineImports(imports: Array<KubbFile.Import>, exports: Array<KubbFile.Export>, source?: string): Array<KubbFile.Import> {\n return orderBy(imports, [\n (v) => !!Array.isArray(v.name),\n (v) => !v.isTypeOnly,\n (v) => v.path,\n (v) => !!v.name,\n (v) => (Array.isArray(v.name) ? orderBy(v.name) : v.name),\n ]).reduce(\n (prev, curr) => {\n let name = Array.isArray(curr.name) ? [...new Set(curr.name)] : curr.name\n\n const hasImportInSource = (importName: string) => {\n if (!source) {\n return true\n }\n\n const checker = (name?: string) => {\n return name && source.includes(name)\n }\n\n return checker(importName) || exports.some(({ name }) => (Array.isArray(name) ? name.some(checker) : checker(name)))\n }\n\n if (curr.path === curr.root) {\n // root and path are the same file, remove the \"./\" import\n return prev\n }\n\n // merge all names and check if the importName is being used in the generated source and if not filter those imports out\n if (Array.isArray(name)) {\n name = name.filter((item) => (typeof item === 'string' ? hasImportInSource(item) : hasImportInSource(item.propertyName)))\n }\n\n const prevByPath = prev.findLast((imp) => imp.path === curr.path && imp.isTypeOnly === curr.isTypeOnly)\n const uniquePrev = prev.findLast((imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly === curr.isTypeOnly)\n const prevByPathNameAndIsTypeOnly = prev.findLast((imp) => imp.path === curr.path && isDeepEqual(imp.name, name) && imp.isTypeOnly)\n\n if (prevByPathNameAndIsTypeOnly) {\n // we already have an export that has the same path but uses `isTypeOnly` (import type ...)\n return prev\n }\n\n // already unique enough or name is empty\n if (uniquePrev || (Array.isArray(name) && !name.length)) {\n return prev\n }\n\n // new item, append name\n if (!prevByPath) {\n return [\n ...prev,\n {\n ...curr,\n name,\n },\n ]\n }\n\n // merge all names when prev and current both have the same isTypeOnly set\n if (prevByPath && Array.isArray(prevByPath.name) && Array.isArray(name) && prevByPath.isTypeOnly === curr.isTypeOnly) {\n prevByPath.name = [...new Set([...prevByPath.name, ...name])]\n\n return prev\n }\n\n // no import was found in the source, ignore import\n if (!Array.isArray(name) && name && !hasImportInSource(name)) {\n return prev\n }\n\n return [...prev, curr]\n },\n [] as Array<KubbFile.Import>,\n )\n}\n\n/**\n * Helper to create a file with name and id set\n */\nexport function createFile<TMeta extends object = object>(file: KubbFile.File<TMeta>): KubbFile.ResolvedFile<TMeta> {\n const extname = path.extname(file.baseName) as KubbFile.Extname\n if (!extname) {\n throw new Error(`No extname found for ${file.baseName}`)\n }\n\n const source = file.sources.map((item) => item.value).join('\\n\\n')\n const exports = file.exports?.length ? combineExports(file.exports) : []\n const imports = file.imports?.length && source ? combineImports(file.imports, exports, source) : []\n const sources = file.sources?.length ? combineSources(file.sources) : []\n\n return {\n ...file,\n id: hashObject({ path: file.path }),\n name: trimExtName(file.baseName),\n extname,\n imports: imports,\n exports: exports,\n sources: sources,\n meta: file.meta || ({} as TMeta),\n }\n}\n","import { EventEmitter as NodeEventEmitter } from 'node:events'\n\nexport class EventEmitter<TEvents extends Record<string, any>> {\n constructor(maxListener = 100) {\n this.#emitter.setMaxListeners(maxListener)\n }\n #emitter = new NodeEventEmitter()\n\n emit<TEventName extends keyof TEvents & string>(eventName: TEventName, ...eventArg: TEvents[TEventName]): void {\n this.#emitter.emit(eventName, ...(eventArg as any))\n }\n\n on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void {\n this.#emitter.on(eventName, handler as any)\n }\n\n off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void {\n this.#emitter.off(eventName, handler as any)\n }\n removeAll(): void {\n this.#emitter.removeAllListeners()\n }\n}\n","import type * as KubbFile from './KubbFile.ts'\nimport { EventEmitter } from './utils/EventEmitter.ts'\nimport { write } from './fs.ts'\nimport pLimit from 'p-limit'\nimport type { Parser } from './parsers/types.ts'\nimport { typeScriptParser } from './parsers/typescript.ts'\nimport { tsxParser } from './parsers/tsx.ts'\nimport { defaultParser } from './parsers/default.ts'\n\ntype FileProcessorEvents = {\n start: [{ files: KubbFile.ResolvedFile[] }]\n finish: [{ files: KubbFile.ResolvedFile[] }]\n 'file:start': [{ file: KubbFile.ResolvedFile }]\n 'file:finish': [{ file: KubbFile.ResolvedFile }]\n}\n\nexport type ProcessFilesProps = {\n extension?: Record<KubbFile.Extname, KubbFile.Extname | ''>\n dryRun?: boolean\n}\n\ntype GetSourceOptions = {\n extname?: KubbFile.Extname\n}\n\nasync function getParser<TMeta extends object = object>(extname: KubbFile.Extname | undefined): Promise<Parser<TMeta>> {\n const parsers: Record<KubbFile.Extname, Parser<any>> = {\n '.ts': typeScriptParser,\n '.js': typeScriptParser,\n '.jsx': tsxParser,\n '.tsx': tsxParser,\n '.json': defaultParser,\n }\n\n if (!extname) {\n return defaultParser\n }\n\n const parser = parsers[extname]\n\n if (!parser) {\n console.warn(`[parser] No parser found for ${extname}, default parser will be used`)\n }\n\n return parser || defaultParser\n}\n\nexport async function parseFile(file: KubbFile.ResolvedFile, { extname }: GetSourceOptions = {}): Promise<string> {\n const parser = await getParser(file.extname)\n\n return parser.print(file, { extname })\n}\n\nexport class FileProcessor extends EventEmitter<FileProcessorEvents> {\n #limit = pLimit(100)\n\n constructor(maxListener = 1000) {\n super(maxListener)\n return this\n }\n\n async run(files: Array<KubbFile.ResolvedFile>, { dryRun, extension }: ProcessFilesProps): Promise<KubbFile.ResolvedFile[]> {\n this.emit('start', { files })\n\n const promises = files.map((resolvedFile) =>\n this.#limit(async () => {\n const extname = extension?.[resolvedFile.extname] || undefined\n\n this.emit('file:start', { file: resolvedFile })\n\n if (!dryRun) {\n const source = await parseFile(resolvedFile, { extname })\n await write(resolvedFile.path, source, { sanity: false })\n }\n\n this.emit('file:finish', { file: resolvedFile })\n }),\n )\n\n await Promise.all(promises)\n\n this.emit('finish', { files })\n\n return files\n }\n}\n","import type * as KubbFile from './KubbFile.ts'\nimport { Cache } from './utils/Cache.ts'\nimport { trimExtName } from './fs.ts'\nimport { orderBy } from 'natural-orderby'\nimport { createFile } from './createFile.ts'\nimport { FileProcessor, type ProcessFilesProps } from './FileProcessor.ts'\n\nfunction mergeFile<TMeta extends object = object>(a: KubbFile.File<TMeta>, b: KubbFile.File<TMeta>): KubbFile.File<TMeta> {\n return {\n ...a,\n sources: [...(a.sources || []), ...(b.sources || [])],\n imports: [...(a.imports || []), ...(b.imports || [])],\n exports: [...(a.exports || []), ...(b.exports || [])],\n }\n}\n\nexport class FileManager {\n #cache = new Cache<KubbFile.ResolvedFile>()\n #processor = new FileProcessor()\n\n constructor() {\n return this\n }\n\n async add(...files: Array<KubbFile.File>) {\n const resolvedFiles: Array<KubbFile.ResolvedFile> = []\n\n const mergedFiles = new Map<string, KubbFile.File>()\n\n files.forEach((file) => {\n const existing = mergedFiles.get(file.path)\n if (existing) {\n mergedFiles.set(file.path, mergeFile(existing, file))\n } else {\n mergedFiles.set(file.path, file)\n }\n })\n\n for (const file of mergedFiles.values()) {\n const existing = this.#cache.get(file.path)\n\n const merged = existing ? mergeFile(existing, file) : file\n const resolvedFile = createFile(merged)\n\n this.#cache.set(resolvedFile.path, resolvedFile)\n this.flush()\n\n resolvedFiles.push(resolvedFile)\n }\n\n return resolvedFiles\n }\n\n flush() {\n this.#cache.flush()\n }\n\n getByPath(path: KubbFile.Path): KubbFile.ResolvedFile | null {\n return this.#cache.get(path)\n }\n\n deleteByPath(path: KubbFile.Path): void {\n this.#cache.delete(path)\n }\n\n clear(): void {\n this.#cache.clear()\n }\n\n get files(): Array<KubbFile.ResolvedFile> {\n const cachedKeys = this.#cache.keys()\n\n // order by path length and if file is a barrel file\n const keys = orderBy(cachedKeys, [(v) => v.length, (v) => trimExtName(v).endsWith('index')])\n\n const files = keys.map((key) => this.#cache.get(key))\n\n return files.filter(Boolean)\n }\n\n get processor() {\n const files = this.files\n const processor = this.#processor\n\n return {\n async run(options: ProcessFilesProps) {\n return processor.run(files, options)\n },\n }\n }\n}\n","import type * as KubbFile from './KubbFile.ts'\nimport { FileManager } from './FileManager.ts'\nimport { isPromise } from 'remeda'\n\nconst isFunction = (val: unknown): val is Function => typeof val === 'function'\n\ntype Component = any\n\ntype PluginInstallFunction<Options = any[]> = Options extends unknown[] ? (app: App, ...options: Options) => any : (app: App, options: Options) => any\n\nexport type ObjectPlugin<Options = any[]> = {\n install: PluginInstallFunction<Options>\n}\nexport type FunctionPlugin<Options = any[]> = PluginInstallFunction<Options> & Partial<ObjectPlugin<Options>>\n\ntype AppRenderer = {\n render(): Promise<void> | void\n renderToString(): Promise<string> | string\n waitUntilExit(): Promise<void>\n}\n\nexport type AppContext<TOptions = unknown> = {\n options?: TOptions\n fileManager: FileManager\n addFile(...files: Array<KubbFile.File>): Promise<void>\n files: Array<KubbFile.ResolvedFile>\n clear: () => void\n}\n\ntype RootRenderFunction<THostElement, TContext extends AppContext> = (this: TContext, container: THostElement, context: TContext) => AppRenderer\n\ntype Plugin<Options = any[], P extends unknown[] = Options extends unknown[] ? Options : [Options]> = FunctionPlugin<P> | ObjectPlugin<P>\n\ntype WriteOptions = {\n extension?: Record<KubbFile.Extname, KubbFile.Extname | ''>\n dryRun?: boolean\n}\n\nexport interface App {\n _component: Component\n render(): Promise<void>\n renderToString(): Promise<string>\n files: Array<KubbFile.ResolvedFile>\n use<Options>(plugin: Plugin<Options>, options: NoInfer<Options>): this\n write(options?: WriteOptions): Promise<void>\n addFile(...files: Array<KubbFile.File>): Promise<void>\n waitUntilExit(): Promise<void>\n}\n\nexport type DefineApp<TContext extends AppContext> = (rootComponent?: Component, options?: TContext['options']) => App\n\nexport function defineApp<THostElement, TContext extends AppContext>(instance: RootRenderFunction<THostElement, TContext>): DefineApp<TContext> {\n function createApp(rootComponent: Component, options?: TContext['options']): App {\n const installedPlugins = new WeakSet()\n const fileManager = new FileManager()\n const context = {\n options,\n fileManager,\n async addFile(...newFiles) {\n await fileManager.add(...newFiles)\n },\n clear() {\n context.fileManager.clear()\n },\n get files() {\n return fileManager.files\n },\n } as TContext\n\n const { render, renderToString, waitUntilExit } = instance.call(context, rootComponent, context)\n\n const app: App = {\n _component: rootComponent,\n async render() {\n if (isPromise(render)) {\n await render()\n } else {\n render()\n }\n },\n async renderToString() {\n return renderToString()\n },\n get files() {\n return fileManager.files\n },\n waitUntilExit,\n addFile: context.addFile,\n async write(\n options = {\n extension: { '.ts': '.ts' },\n dryRun: false,\n },\n ) {\n await fileManager.processor.run({\n extension: options.extension,\n dryRun: options.dryRun,\n })\n },\n use(plugin: Plugin, ...options: any[]) {\n if (installedPlugins.has(plugin)) {\n console.warn('Plugin has already been applied to target app.')\n } else if (plugin && isFunction(plugin.install)) {\n installedPlugins.add(plugin)\n plugin.install(app, ...options)\n } else if (isFunction(plugin)) {\n installedPlugins.add(plugin)\n plugin(app, ...options)\n }\n\n return app\n },\n }\n\n return app\n }\n\n return createApp\n}\n","import { defineApp } from './defineApp.ts'\n\nexport const createApp = defineApp(() => {\n return {\n async render() {\n throw new Error('Method not implemented')\n },\n async renderToString() {\n throw new Error('Method not implemented')\n },\n async waitUntilExit() {\n throw new Error('Method not implemented')\n },\n }\n})\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,9 +1,18 @@
1
- import "./KubbFile-BrN7Wwp6.cjs";
2
- import { a as FileManager, i as defineApp, n as AppContext, r as DefineApp } from "./defineApp-DKW3IRO8.cjs";
3
- import { n as parseFile } from "./parser-D64DdV1v.cjs";
1
+ import { a as ResolvedFile, n as File } from "./KubbFile-BrN7Wwp6.cjs";
2
+ import { a as FileManager, i as defineApp, n as AppContext, o as FileProcessor, r as DefineApp } from "./defineApp-c9lWJ96_.cjs";
3
+ import { t as Parser } from "./types-GueHciQ3.cjs";
4
4
 
5
5
  //#region src/createApp.d.ts
6
6
  declare const createApp: DefineApp<AppContext<unknown>>;
7
7
  //#endregion
8
- export { FileManager, createApp, defineApp, parseFile };
8
+ //#region src/createFile.d.ts
9
+ /**
10
+ * Helper to create a file with name and id set
11
+ */
12
+ declare function createFile<TMeta extends object = object>(file: File<TMeta>): ResolvedFile<TMeta>;
13
+ //#endregion
14
+ //#region src/parsers/createFileParser.d.ts
15
+ declare function createFileParser<TMeta extends object = object>(parser: Parser<TMeta>): Parser<TMeta>;
16
+ //#endregion
17
+ export { FileManager, FileProcessor, createApp, createFile, createFileParser, defineApp };
9
18
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.ts CHANGED
@@ -1,9 +1,18 @@
1
- import "./KubbFile-BzVkcu9M.js";
2
- import { a as FileManager, i as defineApp, n as AppContext, r as DefineApp } from "./defineApp-Bg7JewJQ.js";
3
- import { n as parseFile } from "./parser-yYqnryUV.js";
1
+ import { a as ResolvedFile, n as File } from "./KubbFile-BzVkcu9M.js";
2
+ import { a as FileManager, i as defineApp, n as AppContext, o as FileProcessor, r as DefineApp } from "./defineApp-CZYKsxTp.js";
3
+ import { t as Parser } from "./types-CkbelZaS.js";
4
4
 
5
5
  //#region src/createApp.d.ts
6
6
  declare const createApp: DefineApp<AppContext<unknown>>;
7
7
  //#endregion
8
- export { FileManager, createApp, defineApp, parseFile };
8
+ //#region src/createFile.d.ts
9
+ /**
10
+ * Helper to create a file with name and id set
11
+ */
12
+ declare function createFile<TMeta extends object = object>(file: File<TMeta>): ResolvedFile<TMeta>;
13
+ //#endregion
14
+ //#region src/parsers/createFileParser.d.ts
15
+ declare function createFileParser<TMeta extends object = object>(parser: Parser<TMeta>): Parser<TMeta>;
16
+ //#endregion
17
+ export { FileManager, FileProcessor, createApp, createFile, createFileParser, defineApp };
9
18
  //# sourceMappingURL=index.d.ts.map