@kubb/fabric-core 0.0.0-canary-20251021083045 → 0.0.0-canary-20251021135548

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 (65) hide show
  1. package/dist/{types-lS0JaZqX.d.cts → KubbFile-BrN7Wwp6.d.cts} +3 -3
  2. package/dist/{types-BY5X8xoR.d.ts → KubbFile-BzVkcu9M.d.ts} +3 -3
  3. package/dist/createFileParser-BD8yn0LT.cjs +14 -0
  4. package/dist/createFileParser-BD8yn0LT.cjs.map +1 -0
  5. package/dist/createFileParser-Cix3AMLd.js +8 -0
  6. package/dist/createFileParser-Cix3AMLd.js.map +1 -0
  7. package/dist/default-DCpuPmrL.js +10 -0
  8. package/dist/default-DCpuPmrL.js.map +1 -0
  9. package/dist/default-DNBu_jsL.cjs +15 -0
  10. package/dist/default-DNBu_jsL.cjs.map +1 -0
  11. package/dist/defineApp-BX0gsgY3.d.cts +54 -0
  12. package/dist/defineApp-DygRR8LS.d.ts +54 -0
  13. package/dist/index.cjs +138 -87
  14. package/dist/index.cjs.map +1 -1
  15. package/dist/index.d.cts +44 -53
  16. package/dist/index.d.ts +44 -53
  17. package/dist/index.js +128 -76
  18. package/dist/index.js.map +1 -1
  19. package/dist/parsers/default.cjs +4 -0
  20. package/dist/parsers/default.d.cts +8 -0
  21. package/dist/parsers/default.d.ts +8 -0
  22. package/dist/parsers/default.js +4 -0
  23. package/dist/parsers/tsx.cjs +4 -2
  24. package/dist/parsers/tsx.d.cts +3 -3
  25. package/dist/parsers/tsx.d.ts +3 -3
  26. package/dist/parsers/tsx.js +3 -1
  27. package/dist/parsers/typescript.cjs +6 -5
  28. package/dist/parsers/typescript.d.cts +3 -3
  29. package/dist/parsers/typescript.d.ts +3 -3
  30. package/dist/parsers/typescript.js +2 -1
  31. package/dist/tsx-BSUaIML3.cjs +16 -0
  32. package/dist/tsx-BSUaIML3.cjs.map +1 -0
  33. package/dist/tsx-DBAk9dqS.js +11 -0
  34. package/dist/tsx-DBAk9dqS.js.map +1 -0
  35. package/dist/types-CkbelZaS.d.ts +15 -0
  36. package/dist/types-GueHciQ3.d.cts +15 -0
  37. package/dist/types.cjs +12 -0
  38. package/dist/types.cjs.map +1 -0
  39. package/dist/types.d.cts +3 -0
  40. package/dist/types.d.ts +3 -0
  41. package/dist/types.js +6 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/{parser-CWB_OBtr.js → typescript-C60gWBu8.js} +4 -34
  44. package/dist/typescript-C60gWBu8.js.map +1 -0
  45. package/dist/{parser-QF8j8-pj.cjs → typescript-Z90jN87k.cjs} +5 -47
  46. package/dist/typescript-Z90jN87k.cjs.map +1 -0
  47. package/package.json +15 -1
  48. package/src/FileManager.ts +11 -203
  49. package/src/FileProcessor.ts +86 -0
  50. package/src/KubbFile.ts +132 -0
  51. package/src/createFile.ts +167 -0
  52. package/src/defineApp.ts +8 -6
  53. package/src/index.ts +4 -2
  54. package/src/parsers/createFileParser.ts +5 -0
  55. package/src/parsers/default.ts +7 -0
  56. package/src/parsers/tsx.ts +1 -1
  57. package/src/parsers/types.ts +12 -0
  58. package/src/parsers/typescript.ts +1 -1
  59. package/src/types.ts +2 -132
  60. package/src/utils/EventEmitter.ts +23 -0
  61. package/dist/parser-Bck6QDwN.d.cts +0 -15
  62. package/dist/parser-CRl-iUw1.d.ts +0 -15
  63. package/dist/parser-CWB_OBtr.js.map +0 -1
  64. package/dist/parser-QF8j8-pj.cjs.map +0 -1
  65. package/src/parsers/parser.ts +0 -56
package/dist/index.d.cts CHANGED
@@ -1,65 +1,56 @@
1
- import { a as types_d_exports, i as ResolvedFile, n as File, r as Path, t as Extname } from "./types-lS0JaZqX.cjs";
1
+ import { a as ResolvedFile, n as File, t as Extname } from "./KubbFile-BrN7Wwp6.cjs";
2
+ import { a as FileManager, i as defineApp, n as AppContext, r as DefineApp } from "./defineApp-BX0gsgY3.cjs";
3
+ import { t as Parser } from "./types-GueHciQ3.cjs";
2
4
 
3
- //#region src/FileManager.d.ts
4
- type WriteFilesProps = {
5
- extension?: Record<Extname, Extname | ''>;
6
- dryRun?: boolean;
7
- };
8
- declare class FileManager {
5
+ //#region src/createApp.d.ts
6
+ declare const createApp: DefineApp<AppContext<unknown>>;
7
+ //#endregion
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/utils/EventEmitter.d.ts
15
+ declare class EventEmitter<TEvents extends Record<string, any>> {
9
16
  #private;
10
- constructor();
11
- add(...files: Array<File>): Promise<ResolvedFile<object>[]>;
12
- flush(): void;
13
- getByPath(path: Path): ResolvedFile | null;
14
- deleteByPath(path: Path): void;
15
- clear(): void;
16
- getFiles(): Array<ResolvedFile>;
17
- processFiles({
18
- dryRun,
19
- extension
20
- }: WriteFilesProps): Promise<Array<ResolvedFile>>;
17
+ constructor(maxListener?: number);
18
+ emit<TEventName extends keyof TEvents & string>(eventName: TEventName, ...eventArg: TEvents[TEventName]): void;
19
+ on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void;
20
+ off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void;
21
+ removeAll(): void;
21
22
  }
22
23
  //#endregion
23
- //#region src/defineApp.d.ts
24
- type Component = any;
25
- type PluginInstallFunction<Options$1 = any[]> = Options$1 extends unknown[] ? (app: App, ...options: Options$1) => any : (app: App, options: Options$1) => any;
26
- type ObjectPlugin<Options$1 = any[]> = {
27
- install: PluginInstallFunction<Options$1>;
28
- };
29
- type FunctionPlugin<Options$1 = any[]> = PluginInstallFunction<Options$1> & Partial<ObjectPlugin<Options$1>>;
30
- type AppRenderer = {
31
- render(): Promise<void> | void;
32
- renderToString(): Promise<string> | string;
33
- waitUntilExit(): Promise<void>;
24
+ //#region src/FileProcessor.d.ts
25
+ type FileProcessorEvents = {
26
+ start: [{
27
+ files: ResolvedFile[];
28
+ }];
29
+ finish: [{
30
+ files: ResolvedFile[];
31
+ }];
32
+ 'file:start': [{
33
+ file: ResolvedFile;
34
+ }];
35
+ 'file:finish': [{
36
+ file: ResolvedFile;
37
+ }];
34
38
  };
35
- type AppContext<TOptions = unknown> = {
36
- options?: TOptions;
37
- fileManager: FileManager;
38
- addFile(...files: Array<File>): Promise<void>;
39
- files: Array<ResolvedFile>;
40
- clear: () => void;
41
- };
42
- type RootRenderFunction<THostElement, TContext extends AppContext> = (this: TContext, container: THostElement, context: TContext) => AppRenderer;
43
- type Plugin<Options$1 = any[], P extends unknown[] = (Options$1 extends unknown[] ? Options$1 : [Options$1])> = FunctionPlugin<P> | ObjectPlugin<P>;
44
- type WriteOptions = {
39
+ type ProcessFilesProps = {
45
40
  extension?: Record<Extname, Extname | ''>;
46
41
  dryRun?: boolean;
47
42
  };
48
- interface App {
49
- _component: Component;
50
- render(): Promise<void>;
51
- renderToString(): Promise<string>;
52
- getFiles(): Promise<Array<ResolvedFile>>;
53
- use<Options>(plugin: Plugin<Options>, options: NoInfer<Options>): this;
54
- write(options?: WriteOptions): Promise<void>;
55
- addFile(...files: Array<File>): Promise<void>;
56
- waitUntilExit(): Promise<void>;
43
+ declare class FileProcessor extends EventEmitter<FileProcessorEvents> {
44
+ #private;
45
+ constructor(maxListener?: number);
46
+ run(files: Array<ResolvedFile>, {
47
+ dryRun,
48
+ extension
49
+ }: ProcessFilesProps): Promise<ResolvedFile[]>;
57
50
  }
58
- type DefineApp<TContext extends AppContext> = (rootComponent?: Component, options?: TContext['options']) => App;
59
- declare function defineApp<THostElement, TContext extends AppContext>(instance: RootRenderFunction<THostElement, TContext>): DefineApp<TContext>;
60
51
  //#endregion
61
- //#region src/createApp.d.ts
62
- declare const createApp: DefineApp<AppContext<unknown>>;
52
+ //#region src/parsers/createFileParser.d.ts
53
+ declare function createFileParser<TMeta extends object = object>(parser: Parser<TMeta>): Parser<TMeta>;
63
54
  //#endregion
64
- export { type AppContext, type DefineApp, types_d_exports as KubbFile, createApp, defineApp };
55
+ export { FileManager, FileProcessor, createApp, createFile, createFileParser, defineApp };
65
56
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.ts CHANGED
@@ -1,65 +1,56 @@
1
- import { a as types_d_exports, i as ResolvedFile, n as File, r as Path, t as Extname } from "./types-BY5X8xoR.js";
1
+ import { a as ResolvedFile, n as File, t as Extname } from "./KubbFile-BzVkcu9M.js";
2
+ import { a as FileManager, i as defineApp, n as AppContext, r as DefineApp } from "./defineApp-DygRR8LS.js";
3
+ import { t as Parser } from "./types-CkbelZaS.js";
2
4
 
3
- //#region src/FileManager.d.ts
4
- type WriteFilesProps = {
5
- extension?: Record<Extname, Extname | ''>;
6
- dryRun?: boolean;
7
- };
8
- declare class FileManager {
5
+ //#region src/createApp.d.ts
6
+ declare const createApp: DefineApp<AppContext<unknown>>;
7
+ //#endregion
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/utils/EventEmitter.d.ts
15
+ declare class EventEmitter<TEvents extends Record<string, any>> {
9
16
  #private;
10
- constructor();
11
- add(...files: Array<File>): Promise<ResolvedFile<object>[]>;
12
- flush(): void;
13
- getByPath(path: Path): ResolvedFile | null;
14
- deleteByPath(path: Path): void;
15
- clear(): void;
16
- getFiles(): Array<ResolvedFile>;
17
- processFiles({
18
- dryRun,
19
- extension
20
- }: WriteFilesProps): Promise<Array<ResolvedFile>>;
17
+ constructor(maxListener?: number);
18
+ emit<TEventName extends keyof TEvents & string>(eventName: TEventName, ...eventArg: TEvents[TEventName]): void;
19
+ on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void;
20
+ off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void;
21
+ removeAll(): void;
21
22
  }
22
23
  //#endregion
23
- //#region src/defineApp.d.ts
24
- type Component = any;
25
- type PluginInstallFunction<Options$1 = any[]> = Options$1 extends unknown[] ? (app: App, ...options: Options$1) => any : (app: App, options: Options$1) => any;
26
- type ObjectPlugin<Options$1 = any[]> = {
27
- install: PluginInstallFunction<Options$1>;
28
- };
29
- type FunctionPlugin<Options$1 = any[]> = PluginInstallFunction<Options$1> & Partial<ObjectPlugin<Options$1>>;
30
- type AppRenderer = {
31
- render(): Promise<void> | void;
32
- renderToString(): Promise<string> | string;
33
- waitUntilExit(): Promise<void>;
24
+ //#region src/FileProcessor.d.ts
25
+ type FileProcessorEvents = {
26
+ start: [{
27
+ files: ResolvedFile[];
28
+ }];
29
+ finish: [{
30
+ files: ResolvedFile[];
31
+ }];
32
+ 'file:start': [{
33
+ file: ResolvedFile;
34
+ }];
35
+ 'file:finish': [{
36
+ file: ResolvedFile;
37
+ }];
34
38
  };
35
- type AppContext<TOptions = unknown> = {
36
- options?: TOptions;
37
- fileManager: FileManager;
38
- addFile(...files: Array<File>): Promise<void>;
39
- files: Array<ResolvedFile>;
40
- clear: () => void;
41
- };
42
- type RootRenderFunction<THostElement, TContext extends AppContext> = (this: TContext, container: THostElement, context: TContext) => AppRenderer;
43
- type Plugin<Options$1 = any[], P extends unknown[] = (Options$1 extends unknown[] ? Options$1 : [Options$1])> = FunctionPlugin<P> | ObjectPlugin<P>;
44
- type WriteOptions = {
39
+ type ProcessFilesProps = {
45
40
  extension?: Record<Extname, Extname | ''>;
46
41
  dryRun?: boolean;
47
42
  };
48
- interface App {
49
- _component: Component;
50
- render(): Promise<void>;
51
- renderToString(): Promise<string>;
52
- getFiles(): Promise<Array<ResolvedFile>>;
53
- use<Options>(plugin: Plugin<Options>, options: NoInfer<Options>): this;
54
- write(options?: WriteOptions): Promise<void>;
55
- addFile(...files: Array<File>): Promise<void>;
56
- waitUntilExit(): Promise<void>;
43
+ declare class FileProcessor extends EventEmitter<FileProcessorEvents> {
44
+ #private;
45
+ constructor(maxListener?: number);
46
+ run(files: Array<ResolvedFile>, {
47
+ dryRun,
48
+ extension
49
+ }: ProcessFilesProps): Promise<ResolvedFile[]>;
57
50
  }
58
- type DefineApp<TContext extends AppContext> = (rootComponent?: Component, options?: TContext['options']) => App;
59
- declare function defineApp<THostElement, TContext extends AppContext>(instance: RootRenderFunction<THostElement, TContext>): DefineApp<TContext>;
60
51
  //#endregion
61
- //#region src/createApp.d.ts
62
- declare const createApp: DefineApp<AppContext<unknown>>;
52
+ //#region src/parsers/createFileParser.d.ts
53
+ declare function createFileParser<TMeta extends object = object>(parser: Parser<TMeta>): Parser<TMeta>;
63
54
  //#endregion
64
- export { type AppContext, type DefineApp, types_d_exports as KubbFile, createApp, defineApp };
55
+ export { FileManager, FileProcessor, createApp, createFile, createFileParser, defineApp };
65
56
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,9 +1,13 @@
1
- import { c as write, s as trimExtName, t as parseFile } from "./parser-CWB_OBtr.js";
2
- import pLimit from "p-limit";
1
+ import { a as trimExtName, i as typeScriptParser, o as write } from "./typescript-C60gWBu8.js";
2
+ import { t as createFileParser } from "./createFileParser-Cix3AMLd.js";
3
+ import { t as tsxParser } from "./tsx-DBAk9dqS.js";
4
+ import { t as defaultParser } from "./default-DCpuPmrL.js";
3
5
  import path from "node:path";
4
- import { createHash } from "node:crypto";
5
6
  import { orderBy } from "natural-orderby";
7
+ import { createHash } from "node:crypto";
6
8
  import { isDeepEqual, isPromise, uniqueBy } from "remeda";
9
+ import { EventEmitter } from "node:events";
10
+ import pLimit from "p-limit";
7
11
 
8
12
  //#region \0@oxc-project+runtime@0.95.0/helpers/checkPrivateRedeclaration.js
9
13
  function _checkPrivateRedeclaration(e, t) {
@@ -59,74 +63,11 @@ var Cache = class {
59
63
  };
60
64
 
61
65
  //#endregion
62
- //#region src/FileManager.ts
63
- var _cache = /* @__PURE__ */ new WeakMap();
64
- var _limit = /* @__PURE__ */ new WeakMap();
65
- var FileManager = class {
66
- constructor() {
67
- _classPrivateFieldInitSpec(this, _cache, new Cache());
68
- _classPrivateFieldInitSpec(this, _limit, pLimit(100));
69
- return this;
70
- }
71
- async add(...files) {
72
- const resolvedFiles = [];
73
- const mergedFiles = /* @__PURE__ */ new Map();
74
- files.forEach((file) => {
75
- const existing = mergedFiles.get(file.path);
76
- if (existing) mergedFiles.set(file.path, mergeFile(existing, file));
77
- else mergedFiles.set(file.path, file);
78
- });
79
- for (const file of mergedFiles.values()) {
80
- const existing = _classPrivateFieldGet2(_cache, this).get(file.path);
81
- const resolvedFile = createFile(existing ? mergeFile(existing, file) : file);
82
- _classPrivateFieldGet2(_cache, this).set(resolvedFile.path, resolvedFile);
83
- this.flush();
84
- resolvedFiles.push(resolvedFile);
85
- }
86
- return resolvedFiles;
87
- }
88
- flush() {
89
- _classPrivateFieldGet2(_cache, this).flush();
90
- }
91
- getByPath(path$1) {
92
- return _classPrivateFieldGet2(_cache, this).get(path$1);
93
- }
94
- deleteByPath(path$1) {
95
- _classPrivateFieldGet2(_cache, this).delete(path$1);
96
- }
97
- clear() {
98
- _classPrivateFieldGet2(_cache, this).clear();
99
- }
100
- getFiles() {
101
- return orderBy(_classPrivateFieldGet2(_cache, this).keys(), [(v) => v.length, (v) => trimExtName(v).endsWith("index")]).map((key) => _classPrivateFieldGet2(_cache, this).get(key)).filter(Boolean);
102
- }
103
- async processFiles({ dryRun, extension }) {
104
- const files = this.getFiles();
105
- const promises = files.map((resolvedFile) => {
106
- return _classPrivateFieldGet2(_limit, this).call(this, async () => {
107
- const extname = extension ? extension[resolvedFile.extname] || void 0 : resolvedFile.extname;
108
- if (!dryRun) {
109
- const source = await parseFile(resolvedFile, { extname });
110
- await write(resolvedFile.path, source, { sanity: false });
111
- }
112
- });
113
- });
114
- await Promise.all(promises);
115
- return files;
116
- }
117
- };
66
+ //#region src/createFile.ts
118
67
  function hashObject(obj) {
119
68
  const str = JSON.stringify(obj, Object.keys(obj).sort());
120
69
  return createHash("sha256").update(str).digest("hex");
121
70
  }
122
- function mergeFile(a, b) {
123
- return {
124
- ...a,
125
- sources: [...a.sources || [], ...b.sources || []],
126
- imports: [...a.imports || [], ...b.imports || []],
127
- exports: [...a.exports || [], ...b.exports || []]
128
- };
129
- }
130
71
  function combineSources(sources) {
131
72
  return uniqueBy(sources, (obj) => [
132
73
  obj.name,
@@ -214,6 +155,120 @@ function createFile(file) {
214
155
  };
215
156
  }
216
157
 
158
+ //#endregion
159
+ //#region src/FileManager.ts
160
+ function mergeFile(a, b) {
161
+ return {
162
+ ...a,
163
+ sources: [...a.sources || [], ...b.sources || []],
164
+ imports: [...a.imports || [], ...b.imports || []],
165
+ exports: [...a.exports || [], ...b.exports || []]
166
+ };
167
+ }
168
+ var _cache = /* @__PURE__ */ new WeakMap();
169
+ var FileManager = class {
170
+ constructor() {
171
+ _classPrivateFieldInitSpec(this, _cache, new Cache());
172
+ return this;
173
+ }
174
+ async add(...files) {
175
+ const resolvedFiles = [];
176
+ const mergedFiles = /* @__PURE__ */ new Map();
177
+ files.forEach((file) => {
178
+ const existing = mergedFiles.get(file.path);
179
+ if (existing) mergedFiles.set(file.path, mergeFile(existing, file));
180
+ else mergedFiles.set(file.path, file);
181
+ });
182
+ for (const file of mergedFiles.values()) {
183
+ const existing = _classPrivateFieldGet2(_cache, this).get(file.path);
184
+ const resolvedFile = createFile(existing ? mergeFile(existing, file) : file);
185
+ _classPrivateFieldGet2(_cache, this).set(resolvedFile.path, resolvedFile);
186
+ this.flush();
187
+ resolvedFiles.push(resolvedFile);
188
+ }
189
+ return resolvedFiles;
190
+ }
191
+ flush() {
192
+ _classPrivateFieldGet2(_cache, this).flush();
193
+ }
194
+ getByPath(path$1) {
195
+ return _classPrivateFieldGet2(_cache, this).get(path$1);
196
+ }
197
+ deleteByPath(path$1) {
198
+ _classPrivateFieldGet2(_cache, this).delete(path$1);
199
+ }
200
+ clear() {
201
+ _classPrivateFieldGet2(_cache, this).clear();
202
+ }
203
+ get files() {
204
+ return orderBy(_classPrivateFieldGet2(_cache, this).keys(), [(v) => v.length, (v) => trimExtName(v).endsWith("index")]).map((key) => _classPrivateFieldGet2(_cache, this).get(key)).filter(Boolean);
205
+ }
206
+ };
207
+
208
+ //#endregion
209
+ //#region src/utils/EventEmitter.ts
210
+ var _emitter = /* @__PURE__ */ new WeakMap();
211
+ var EventEmitter$1 = class {
212
+ constructor(maxListener = 100) {
213
+ _classPrivateFieldInitSpec(this, _emitter, new EventEmitter());
214
+ _classPrivateFieldGet2(_emitter, this).setMaxListeners(maxListener);
215
+ }
216
+ emit(eventName, ...eventArg) {
217
+ _classPrivateFieldGet2(_emitter, this).emit(eventName, ...eventArg);
218
+ }
219
+ on(eventName, handler) {
220
+ _classPrivateFieldGet2(_emitter, this).on(eventName, handler);
221
+ }
222
+ off(eventName, handler) {
223
+ _classPrivateFieldGet2(_emitter, this).off(eventName, handler);
224
+ }
225
+ removeAll() {
226
+ _classPrivateFieldGet2(_emitter, this).removeAllListeners();
227
+ }
228
+ };
229
+
230
+ //#endregion
231
+ //#region src/FileProcessor.ts
232
+ async function getParser(extname) {
233
+ const parsers = {
234
+ ".ts": typeScriptParser,
235
+ ".js": typeScriptParser,
236
+ ".jsx": tsxParser,
237
+ ".tsx": tsxParser,
238
+ ".json": defaultParser
239
+ };
240
+ if (!extname) return defaultParser;
241
+ const parser = parsers[extname];
242
+ if (!parser) console.warn(`[parser] No parser found for ${extname}, default parser will be used`);
243
+ return parser || defaultParser;
244
+ }
245
+ async function parseFile(file, { extname } = {}) {
246
+ return (await getParser(file.extname)).print(file, { extname });
247
+ }
248
+ var _limit = /* @__PURE__ */ new WeakMap();
249
+ var FileProcessor = class extends EventEmitter$1 {
250
+ constructor(maxListener = 1e3) {
251
+ super(maxListener);
252
+ _classPrivateFieldInitSpec(this, _limit, pLimit(100));
253
+ return this;
254
+ }
255
+ async run(files, { dryRun, extension }) {
256
+ this.emit("start", { files });
257
+ const promises = files.map((resolvedFile) => _classPrivateFieldGet2(_limit, this).call(this, async () => {
258
+ const extname = (extension === null || extension === void 0 ? void 0 : extension[resolvedFile.extname]) || void 0;
259
+ this.emit("file:start", { file: resolvedFile });
260
+ if (!dryRun) {
261
+ const source = await parseFile(resolvedFile, { extname });
262
+ await write(resolvedFile.path, source, { sanity: false });
263
+ }
264
+ this.emit("file:finish", { file: resolvedFile });
265
+ }));
266
+ await Promise.all(promises);
267
+ this.emit("finish", { files });
268
+ return files;
269
+ }
270
+ };
271
+
217
272
  //#endregion
218
273
  //#region src/defineApp.ts
219
274
  const isFunction = (val) => typeof val === "function";
@@ -221,6 +276,7 @@ function defineApp(instance) {
221
276
  function createApp$1(rootComponent, options) {
222
277
  const installedPlugins = /* @__PURE__ */ new WeakSet();
223
278
  const fileManager = new FileManager();
279
+ const fileProcessor = new FileProcessor();
224
280
  const context = {
225
281
  options,
226
282
  fileManager,
@@ -231,7 +287,7 @@ function defineApp(instance) {
231
287
  context.fileManager.clear();
232
288
  },
233
289
  get files() {
234
- return fileManager.getFiles();
290
+ return fileManager.files;
235
291
  }
236
292
  };
237
293
  const { render, renderToString, waitUntilExit } = instance.call(context, rootComponent, context);
@@ -244,8 +300,8 @@ function defineApp(instance) {
244
300
  async renderToString() {
245
301
  return renderToString();
246
302
  },
247
- async getFiles() {
248
- return fileManager.getFiles();
303
+ get files() {
304
+ return fileManager.files;
249
305
  },
250
306
  waitUntilExit,
251
307
  addFile: context.addFile,
@@ -253,7 +309,7 @@ function defineApp(instance) {
253
309
  extension: { ".ts": ".ts" },
254
310
  dryRun: false
255
311
  }) {
256
- await fileManager.processFiles({
312
+ await fileProcessor.run(fileManager.files, {
257
313
  extension: options$1.extension,
258
314
  dryRun: options$1.dryRun
259
315
  });
@@ -292,9 +348,5 @@ const createApp = defineApp(() => {
292
348
  });
293
349
 
294
350
  //#endregion
295
- //#region src/types.ts
296
- var types_exports = {};
297
-
298
- //#endregion
299
- export { types_exports as KubbFile, createApp, defineApp };
351
+ export { FileManager, FileProcessor, createApp, createFile, createFileParser, defineApp };
300
352
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["resolvedFiles: Array<KubbFile.ResolvedFile>","path","name","createApp","app: App","options"],"sources":["../src/utils/Cache.ts","../src/FileManager.ts","../src/defineApp.ts","../src/createApp.ts","../src/types.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 './types.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\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\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","import type * as KubbFile from './types.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","type BasePath<T extends string = string> = `${T}/`\n\nexport type Import = {\n /**\n * Import name to be used\n * @example [\"useState\"]\n * @example \"React\"\n */\n name:\n | string\n | Array<\n | string\n | {\n propertyName: string\n name?: string\n }\n >\n /**\n * Path for the import\n * @example '@kubb/core'\n */\n path: string\n /**\n * Add `type` prefix to the import, this will result in: `import type { Type } from './path'`.\n */\n isTypeOnly?: boolean\n\n isNameSpace?: boolean\n /**\n * When root is set it will get the path with relative getRelativePath(root, path).\n */\n root?: string\n}\n\nexport type Source = {\n name?: string\n value?: string\n isTypeOnly?: boolean\n /**\n * Has const or type 'export'\n * @default false\n */\n isExportable?: boolean\n /**\n * When set, barrel generation will add this\n * @default false\n */\n isIndexable?: boolean\n}\n\nexport type Export = {\n /**\n * Export name to be used.\n * @example [\"useState\"]\n * @example \"React\"\n */\n name?: string | Array<string>\n /**\n * Path for the import.\n * @example '@kubb/core'\n */\n path: string\n /**\n * Add `type` prefix to the export, this will result in: `export type { Type } from './path'`.\n */\n isTypeOnly?: boolean\n /**\n * Make it possible to override the name, this will result in: `export * as aliasName from './path'`.\n */\n asAlias?: boolean\n}\n\nexport type Extname = '.ts' | '.js' | '.tsx' | '.json' | `.${string}`\n\nexport type Mode = 'single' | 'split'\n\n/**\n * Name to be used to dynamicly create the baseName(based on input.path)\n * Based on UNIX basename\n * @link https://nodejs.org/api/path.html#pathbasenamepath-suffix\n */\nexport type BaseName = `${string}.${string}`\n\n/**\n * Path will be full qualified path to a specified file\n */\nexport type Path = string\n\nexport type AdvancedPath<T extends BaseName = BaseName> = `${BasePath}${T}`\n\nexport type OptionalPath = Path | undefined | null\n\nexport type File<TMeta extends object = object> = {\n /**\n * Name to be used to create the path\n * Based on UNIX basename, `${name}.extname`\n * @link https://nodejs.org/api/path.html#pathbasenamepath-suffix\n */\n baseName: BaseName\n /**\n * Path will be full qualified path to a specified file\n */\n path: AdvancedPath<BaseName> | Path\n sources: Array<Source>\n imports?: Array<Import>\n exports?: Array<Export>\n /**\n * Use extra meta, this is getting used to generate the barrel/index files.\n */\n meta?: TMeta\n banner?: string\n footer?: string\n}\n\nexport type ResolvedImport = Import\n\nexport type ResolvedExport = Export\n\nexport type ResolvedFile<TMeta extends object = object> = File<TMeta> & {\n /**\n * @default hash\n */\n id: string\n /**\n * Contains the first part of the baseName, generated based on baseName\n * @link https://nodejs.org/api/path.html#pathformatpathobject\n */\n name: string\n extname: Extname\n imports: Array<ResolvedImport>\n exports: Array<ResolvedExport>\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["name","resolvedFiles: Array<KubbFile.ResolvedFile>","path","EventEmitter","NodeEventEmitter","parsers: Record<KubbFile.Extname, Parser<any>>","EventEmitter","createApp","app: App","options"],"sources":["../src/utils/Cache.ts","../src/createFile.ts","../src/FileManager.ts","../src/utils/EventEmitter.ts","../src/FileProcessor.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 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'\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\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","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\ntype 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 { FileManager } from './FileManager.ts'\nimport { isPromise } from 'remeda'\nimport { FileProcessor } from './FileProcessor.ts'\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 fileProcessor = new FileProcessor()\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 fileProcessor.run(fileManager.files, {\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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"}
@@ -0,0 +1,4 @@
1
+ require('../createFileParser-BD8yn0LT.cjs');
2
+ const require_default = require('../default-DNBu_jsL.cjs');
3
+
4
+ exports.defaultParser = require_default.defaultParser;
@@ -0,0 +1,8 @@
1
+ import "../KubbFile-BrN7Wwp6.cjs";
2
+ import { t as Parser } from "../types-GueHciQ3.cjs";
3
+
4
+ //#region src/parsers/default.d.ts
5
+ declare const defaultParser: Parser<object>;
6
+ //#endregion
7
+ export { defaultParser };
8
+ //# sourceMappingURL=default.d.cts.map
@@ -0,0 +1,8 @@
1
+ import "../KubbFile-BzVkcu9M.js";
2
+ import { t as Parser } from "../types-CkbelZaS.js";
3
+
4
+ //#region src/parsers/default.d.ts
5
+ declare const defaultParser: Parser<object>;
6
+ //#endregion
7
+ export { defaultParser };
8
+ //# sourceMappingURL=default.d.ts.map
@@ -0,0 +1,4 @@
1
+ import "../createFileParser-Cix3AMLd.js";
2
+ import { t as defaultParser } from "../default-DCpuPmrL.js";
3
+
4
+ export { defaultParser };
@@ -1,3 +1,5 @@
1
- const require_parser = require('../parser-QF8j8-pj.cjs');
1
+ require('../typescript-Z90jN87k.cjs');
2
+ require('../createFileParser-BD8yn0LT.cjs');
3
+ const require_tsx = require('../tsx-BSUaIML3.cjs');
2
4
 
3
- exports.tsxParser = require_parser.tsxParser;
5
+ exports.tsxParser = require_tsx.tsxParser;
@@ -1,8 +1,8 @@
1
- import "../types-lS0JaZqX.cjs";
2
- import { t as ParserModule } from "../parser-Bck6QDwN.cjs";
1
+ import "../KubbFile-BrN7Wwp6.cjs";
2
+ import { t as Parser } from "../types-GueHciQ3.cjs";
3
3
 
4
4
  //#region src/parsers/tsx.d.ts
5
- declare const tsxParser: ParserModule<object>;
5
+ declare const tsxParser: Parser<object>;
6
6
  //#endregion
7
7
  export { tsxParser };
8
8
  //# sourceMappingURL=tsx.d.cts.map