@kubb/core 4.11.1 → 4.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{getBarrelFiles-BkDzzugQ.cjs → getBarrelFiles-8VEWWk9Z.cjs} +80 -111
- package/dist/getBarrelFiles-8VEWWk9Z.cjs.map +1 -0
- package/dist/{getBarrelFiles-BVMBhc50.d.cts → getBarrelFiles-B_2WDywH.d.cts} +3 -3
- package/dist/{getBarrelFiles-a-GlnjYa.js → getBarrelFiles-DQ0hksqD.js} +80 -111
- package/dist/getBarrelFiles-DQ0hksqD.js.map +1 -0
- package/dist/{getBarrelFiles-DjQ68d4e.d.ts → getBarrelFiles-ZIHk_1ln.d.ts} +3 -3
- package/dist/hooks.d.cts +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/index.cjs +261 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -7
- package/dist/index.d.ts +5 -7
- package/dist/index.js +262 -43
- package/dist/index.js.map +1 -1
- package/dist/{logger-DIA19Yfz.js → logger-CQn6sdC0.js} +72 -7
- package/dist/{logger-CPt4U57Z.cjs.map → logger-CQn6sdC0.js.map} +1 -1
- package/dist/{logger-CPt4U57Z.cjs → logger-US5g7KdM.cjs} +72 -7
- package/dist/logger-US5g7KdM.cjs.map +1 -0
- package/dist/{logger-C96jDrSt.d.ts → logger-mq06Cxxv.d.cts} +29 -4
- package/dist/{logger-BJDkLsF0.d.cts → logger-o16AyvGp.d.ts} +29 -4
- package/dist/logger.cjs +1 -1
- package/dist/logger.d.cts +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/logger.js +1 -1
- package/dist/{types-tSSA1oz8.d.cts → types-CCEy_FVr.d.cts} +36 -27
- package/dist/{types-69-evK37.d.ts → types-DgfEZ3IN.d.ts} +36 -27
- package/dist/utils.cjs +1 -1
- package/dist/utils.d.cts +2 -2
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +1 -1
- package/package.json +1 -1
- package/src/PluginManager.ts +81 -114
- package/src/build.ts +229 -25
- package/src/logger.ts +87 -9
- package/src/utils/ciDetection.ts +40 -0
- package/src/utils/diagnostics.ts +15 -0
- package/dist/getBarrelFiles-BkDzzugQ.cjs.map +0 -1
- package/dist/getBarrelFiles-a-GlnjYa.js.map +0 -1
- package/dist/logger-DIA19Yfz.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { n as Logger } from "./logger-
|
|
2
|
-
import { C as getMode, S as PluginManager, _ as ResolvePathParams, a as InputData, b as UserPluginWithLifeCycle, c as Plugin, d as PluginKey, f as PluginLifecycle, g as ResolveNameParams, h as PluginWithLifeCycle, i as Group, l as PluginContext, m as PluginParameter, n as Config, o as InputPath, p as PluginLifecycleHooks, r as GetPluginFactoryOptions, s as Output, t as BarrelType, u as PluginFactoryOptions, v as UserConfig, x as PossiblePromise, y as UserPlugin } from "./types-
|
|
3
|
-
import { n as getBarrelFiles, t as FileMetaBase } from "./getBarrelFiles-
|
|
1
|
+
import { n as Logger } from "./logger-o16AyvGp.js";
|
|
2
|
+
import { C as getMode, S as PluginManager, _ as ResolvePathParams, a as InputData, b as UserPluginWithLifeCycle, c as Plugin, d as PluginKey, f as PluginLifecycle, g as ResolveNameParams, h as PluginWithLifeCycle, i as Group, l as PluginContext, m as PluginParameter, n as Config, o as InputPath, p as PluginLifecycleHooks, r as GetPluginFactoryOptions, s as Output, t as BarrelType, u as PluginFactoryOptions, v as UserConfig, x as PossiblePromise, y as UserPlugin } from "./types-DgfEZ3IN.js";
|
|
3
|
+
import { n as getBarrelFiles, t as FileMetaBase } from "./getBarrelFiles-ZIHk_1ln.js";
|
|
4
4
|
import { Fabric } from "@kubb/react-fabric";
|
|
5
5
|
import { KubbFile } from "@kubb/fabric-core/types";
|
|
6
6
|
|
|
@@ -34,13 +34,11 @@ type BuildOutput = {
|
|
|
34
34
|
fabric: Fabric;
|
|
35
35
|
files: Array<KubbFile.ResolvedFile>;
|
|
36
36
|
pluginManager: PluginManager;
|
|
37
|
-
|
|
38
|
-
* Only for safeBuild,
|
|
39
|
-
* @deprecated
|
|
40
|
-
*/
|
|
37
|
+
pluginTimings: Map<string, number>;
|
|
41
38
|
error?: Error;
|
|
42
39
|
};
|
|
43
40
|
type SetupResult = {
|
|
41
|
+
logger: Logger;
|
|
44
42
|
fabric: Fabric;
|
|
45
43
|
pluginManager: PluginManager;
|
|
46
44
|
};
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { c as Queue, i as getMode, l as getRelativePath, n as URLPath, r as PluginManager, s as PromiseManager, t as getBarrelFiles } from "./getBarrelFiles-
|
|
2
|
-
import { a as write, n as createLogger } from "./logger-
|
|
1
|
+
import { c as Queue, i as getMode, l as getRelativePath, n as URLPath, r as PluginManager, s as PromiseManager, t as getBarrelFiles } from "./getBarrelFiles-DQ0hksqD.js";
|
|
2
|
+
import { a as write, n as createLogger } from "./logger-CQn6sdC0.js";
|
|
3
3
|
import "./transformers-CjdbeLAK.js";
|
|
4
4
|
import mod from "node:module";
|
|
5
5
|
import path, { join, relative, resolve } from "node:path";
|
|
6
|
+
import { performance } from "node:perf_hooks";
|
|
6
7
|
import { createFabric } from "@kubb/react-fabric";
|
|
7
8
|
import { typescriptParser } from "@kubb/react-fabric/parsers";
|
|
8
9
|
import { fsPlugin } from "@kubb/react-fabric/plugins";
|
|
@@ -10,7 +11,7 @@ import pc from "picocolors";
|
|
|
10
11
|
import { isDeepEqual } from "remeda";
|
|
11
12
|
import fs from "fs-extra";
|
|
12
13
|
import { switcher } from "js-runtime";
|
|
13
|
-
import g$1 from "node:process";
|
|
14
|
+
import g$1, { version } from "node:process";
|
|
14
15
|
import os from "node:os";
|
|
15
16
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
16
17
|
import fs$1, { promises } from "node:fs";
|
|
@@ -122,15 +123,62 @@ function readSync(path$1) {
|
|
|
122
123
|
return syncReader(path$1);
|
|
123
124
|
}
|
|
124
125
|
|
|
126
|
+
//#endregion
|
|
127
|
+
//#region package.json
|
|
128
|
+
var version$1 = "4.11.2";
|
|
129
|
+
|
|
130
|
+
//#endregion
|
|
131
|
+
//#region src/utils/diagnostics.ts
|
|
132
|
+
/**
|
|
133
|
+
* Get diagnostic information for debugging
|
|
134
|
+
*/
|
|
135
|
+
function getDiagnosticInfo() {
|
|
136
|
+
return {
|
|
137
|
+
nodeVersion: version,
|
|
138
|
+
KubbVersion: version$1,
|
|
139
|
+
platform: process.platform,
|
|
140
|
+
arch: process.arch,
|
|
141
|
+
cwd: process.cwd()
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
125
145
|
//#endregion
|
|
126
146
|
//#region src/build.ts
|
|
127
147
|
async function setup(options) {
|
|
128
148
|
const { config: userConfig, logger = createLogger() } = options;
|
|
149
|
+
const diagnosticInfo = getDiagnosticInfo();
|
|
129
150
|
if (Array.isArray(userConfig.input)) console.warn(pc.yellow("This feature is still under development — use with caution"));
|
|
151
|
+
logger.emit("debug", {
|
|
152
|
+
date: /* @__PURE__ */ new Date(),
|
|
153
|
+
category: "setup",
|
|
154
|
+
logs: [
|
|
155
|
+
"Configuration:",
|
|
156
|
+
` • Name: ${userConfig.name || "unnamed"}`,
|
|
157
|
+
` • Root: ${userConfig.root || process.cwd()}`,
|
|
158
|
+
` • Output: ${userConfig.output?.path || "not specified"}`,
|
|
159
|
+
` • Plugins: ${userConfig.plugins?.length || 0}`,
|
|
160
|
+
"Output Settings:",
|
|
161
|
+
` • Write: ${userConfig.output?.write !== false ? "enabled" : "disabled"}`,
|
|
162
|
+
` • Formater: ${userConfig.output?.format || "none"}`,
|
|
163
|
+
` • Linter: ${userConfig.output?.lint || "none"}`,
|
|
164
|
+
"Environment:",
|
|
165
|
+
Object.entries(diagnosticInfo).map(([key, value]) => ` • ${key}: ${value}`).join("\n")
|
|
166
|
+
]
|
|
167
|
+
});
|
|
130
168
|
try {
|
|
131
|
-
if (isInputPath(userConfig) && !new URLPath(userConfig.input.path).isURL)
|
|
169
|
+
if (isInputPath(userConfig) && !new URLPath(userConfig.input.path).isURL) {
|
|
170
|
+
await exists(userConfig.input.path);
|
|
171
|
+
logger.emit("debug", {
|
|
172
|
+
date: /* @__PURE__ */ new Date(),
|
|
173
|
+
category: "setup",
|
|
174
|
+
logs: [`✓ Input file validated: ${userConfig.input.path}`]
|
|
175
|
+
});
|
|
176
|
+
}
|
|
132
177
|
} catch (e) {
|
|
133
|
-
if (isInputPath(userConfig))
|
|
178
|
+
if (isInputPath(userConfig)) {
|
|
179
|
+
const error = e;
|
|
180
|
+
throw new Error(`Cannot read file/URL defined in \`input.path\` or set with \`kubb generate PATH\` in the CLI of your Kubb config ${userConfig.input.path}`, { cause: error });
|
|
181
|
+
}
|
|
134
182
|
}
|
|
135
183
|
const definedConfig = {
|
|
136
184
|
root: userConfig.root || process.cwd(),
|
|
@@ -145,57 +193,239 @@ async function setup(options) {
|
|
|
145
193
|
plugins: userConfig.plugins
|
|
146
194
|
};
|
|
147
195
|
if (definedConfig.output.clean) {
|
|
196
|
+
logger.emit("debug", {
|
|
197
|
+
date: /* @__PURE__ */ new Date(),
|
|
198
|
+
category: "setup",
|
|
199
|
+
logs: [
|
|
200
|
+
"Cleaning output directories",
|
|
201
|
+
` • Output: ${definedConfig.output.path}`,
|
|
202
|
+
" • Cache: .kubb"
|
|
203
|
+
]
|
|
204
|
+
});
|
|
148
205
|
await clean(definedConfig.output.path);
|
|
149
206
|
await clean(join(definedConfig.root, ".kubb"));
|
|
150
207
|
}
|
|
151
208
|
const fabric = createFabric();
|
|
152
209
|
fabric.use(fsPlugin, { dryRun: !definedConfig.output.write });
|
|
153
210
|
fabric.use(typescriptParser);
|
|
211
|
+
fabric.context.on("process:start", ({ files }) => {
|
|
212
|
+
logger.emit("progress_start", {
|
|
213
|
+
id: "files",
|
|
214
|
+
size: files.length,
|
|
215
|
+
message: "Writing files ..."
|
|
216
|
+
});
|
|
217
|
+
logger.emit("debug", {
|
|
218
|
+
date: /* @__PURE__ */ new Date(),
|
|
219
|
+
category: "file",
|
|
220
|
+
logs: [`Writing ${files.length} files...`]
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
fabric.context.on("process:progress", async ({ file, source }) => {
|
|
224
|
+
const message = file ? `Writing ${relative(definedConfig.root, file.path)}` : "";
|
|
225
|
+
logger.emit("progressed", {
|
|
226
|
+
id: "files",
|
|
227
|
+
message
|
|
228
|
+
});
|
|
229
|
+
if (source) await write(file.path, source, { sanity: false });
|
|
230
|
+
});
|
|
231
|
+
fabric.context.on("process:end", () => {
|
|
232
|
+
logger.emit("progress_stop", { id: "files" });
|
|
233
|
+
logger.emit("debug", {
|
|
234
|
+
date: /* @__PURE__ */ new Date(),
|
|
235
|
+
category: "file",
|
|
236
|
+
logs: ["✓ File write process completed"]
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
logger.emit("debug", {
|
|
240
|
+
date: /* @__PURE__ */ new Date(),
|
|
241
|
+
category: "setup",
|
|
242
|
+
logs: [
|
|
243
|
+
"✓ Fabric initialized",
|
|
244
|
+
` • File writing: ${definedConfig.output.write ? "enabled" : "disabled (dry-run)"}`,
|
|
245
|
+
` • Barrel type: ${definedConfig.output.barrelType || "none"}`
|
|
246
|
+
]
|
|
247
|
+
});
|
|
248
|
+
const pluginManager = new PluginManager(definedConfig, {
|
|
249
|
+
fabric,
|
|
250
|
+
logger,
|
|
251
|
+
concurrency: 5
|
|
252
|
+
});
|
|
253
|
+
pluginManager.on("executing", ({ plugin, hookName, strategy, parameters }) => {
|
|
254
|
+
logger.emit("debug", {
|
|
255
|
+
date: /* @__PURE__ */ new Date(),
|
|
256
|
+
category: "hook",
|
|
257
|
+
pluginName: plugin.name,
|
|
258
|
+
logs: [
|
|
259
|
+
`Executing hook: ${hookName}`,
|
|
260
|
+
` • Strategy: ${strategy}`,
|
|
261
|
+
" • Parameters:",
|
|
262
|
+
JSON.stringify(parameters, null, 2)
|
|
263
|
+
]
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
pluginManager.on("executed", ({ plugin, hookName, duration, parameters }) => {
|
|
267
|
+
let message = "";
|
|
268
|
+
if (hookName === "resolvePath") {
|
|
269
|
+
const [path$1] = parameters || [];
|
|
270
|
+
message = `Resolving path '${path$1}'`;
|
|
271
|
+
}
|
|
272
|
+
if (hookName === "resolveName") {
|
|
273
|
+
const [name, type] = parameters || [];
|
|
274
|
+
message = `Resolving name '${name}' and type '${type}'`;
|
|
275
|
+
}
|
|
276
|
+
logger.emit("progressed", {
|
|
277
|
+
id: hookName,
|
|
278
|
+
message: `${plugin.name}: ${message}`
|
|
279
|
+
});
|
|
280
|
+
logger.emit("debug", {
|
|
281
|
+
date: /* @__PURE__ */ new Date(),
|
|
282
|
+
category: "hook",
|
|
283
|
+
pluginName: plugin.name,
|
|
284
|
+
logs: [`✓ Completed in ${duration}ms`]
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
pluginManager.on("progress_start", ({ hookName, plugins }) => {
|
|
288
|
+
logger.emit("progress_start", {
|
|
289
|
+
id: hookName,
|
|
290
|
+
size: plugins.length,
|
|
291
|
+
message: "Running plugins..."
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
pluginManager.on("progress_stop", ({ hookName }) => {
|
|
295
|
+
logger.emit("progress_stop", { id: hookName });
|
|
296
|
+
});
|
|
297
|
+
pluginManager.on("error", (error, { plugin, strategy, duration, parameters, hookName }) => {
|
|
298
|
+
const text = `${error.message} (plugin: ${plugin?.name || "unknown"}, hook: ${hookName || "unknown"})`;
|
|
299
|
+
logger.emit("error", text, error);
|
|
300
|
+
logger.emit("debug", {
|
|
301
|
+
date: /* @__PURE__ */ new Date(),
|
|
302
|
+
category: "error",
|
|
303
|
+
pluginName: plugin.name,
|
|
304
|
+
logs: [
|
|
305
|
+
`✗ Hook '${hookName}' failed after ${duration}ms`,
|
|
306
|
+
` • Strategy: ${strategy}`,
|
|
307
|
+
` • Error: ${error.constructor.name} - ${error.message}`,
|
|
308
|
+
" • Stack Trace:",
|
|
309
|
+
error.stack || "No stack trace available",
|
|
310
|
+
" • Parameters:",
|
|
311
|
+
JSON.stringify(parameters, null, 2)
|
|
312
|
+
]
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
logger.emit("debug", {
|
|
316
|
+
date: /* @__PURE__ */ new Date(),
|
|
317
|
+
category: "setup",
|
|
318
|
+
logs: [
|
|
319
|
+
"✓ PluginManager initialized",
|
|
320
|
+
" • Concurrency: 5",
|
|
321
|
+
` • Total plugins: ${pluginManager.plugins.length}`
|
|
322
|
+
]
|
|
323
|
+
});
|
|
154
324
|
return {
|
|
325
|
+
logger,
|
|
155
326
|
fabric,
|
|
156
|
-
pluginManager
|
|
157
|
-
fabric,
|
|
158
|
-
logger,
|
|
159
|
-
concurrency: 5
|
|
160
|
-
})
|
|
327
|
+
pluginManager
|
|
161
328
|
};
|
|
162
329
|
}
|
|
163
330
|
async function build(options, overrides) {
|
|
164
|
-
const { fabric, files, pluginManager, failedPlugins, error } = await safeBuild(options, overrides);
|
|
331
|
+
const { fabric, files, pluginManager, failedPlugins, pluginTimings, error } = await safeBuild(options, overrides);
|
|
165
332
|
if (error) throw error;
|
|
166
333
|
return {
|
|
167
334
|
failedPlugins,
|
|
168
335
|
fabric,
|
|
169
336
|
files,
|
|
170
337
|
pluginManager,
|
|
338
|
+
pluginTimings,
|
|
171
339
|
error
|
|
172
340
|
};
|
|
173
341
|
}
|
|
174
342
|
async function safeBuild(options, overrides) {
|
|
175
|
-
const { fabric, pluginManager } = overrides ? overrides : await setup(options);
|
|
343
|
+
const { fabric, pluginManager, logger } = overrides ? overrides : await setup(options);
|
|
176
344
|
const failedPlugins = /* @__PURE__ */ new Set();
|
|
345
|
+
const pluginTimings = /* @__PURE__ */ new Map();
|
|
177
346
|
const config = pluginManager.config;
|
|
178
347
|
try {
|
|
179
348
|
for (const plugin of pluginManager.plugins) {
|
|
180
349
|
const context = pluginManager.getContext(plugin);
|
|
181
350
|
const installer = plugin.install.bind(context);
|
|
182
351
|
try {
|
|
352
|
+
const startTime = performance.now();
|
|
353
|
+
const timestamp = /* @__PURE__ */ new Date();
|
|
354
|
+
logger.emit("debug", {
|
|
355
|
+
date: timestamp,
|
|
356
|
+
pluginGroupMarker: "start",
|
|
357
|
+
pluginName: plugin.name,
|
|
358
|
+
logs: []
|
|
359
|
+
});
|
|
360
|
+
logger.emit("debug", {
|
|
361
|
+
date: timestamp,
|
|
362
|
+
category: "plugin",
|
|
363
|
+
pluginName: plugin.name,
|
|
364
|
+
logs: ["Installing plugin...", ` • Plugin Key: ${JSON.stringify(plugin.key)}`]
|
|
365
|
+
});
|
|
183
366
|
await installer(context);
|
|
367
|
+
const duration = Math.round(performance.now() - startTime);
|
|
368
|
+
pluginTimings.set(plugin.name, duration);
|
|
369
|
+
logger.emit("debug", {
|
|
370
|
+
date: /* @__PURE__ */ new Date(),
|
|
371
|
+
category: "plugin",
|
|
372
|
+
pluginName: plugin.name,
|
|
373
|
+
logs: [`✓ Plugin installed successfully (${duration}ms)`]
|
|
374
|
+
});
|
|
375
|
+
logger.emit("debug", {
|
|
376
|
+
date: /* @__PURE__ */ new Date(),
|
|
377
|
+
pluginGroupMarker: "end",
|
|
378
|
+
pluginName: plugin.name,
|
|
379
|
+
logs: []
|
|
380
|
+
});
|
|
184
381
|
} catch (e) {
|
|
382
|
+
const error = e;
|
|
383
|
+
const errorTimestamp = /* @__PURE__ */ new Date();
|
|
384
|
+
logger.emit("debug", {
|
|
385
|
+
date: errorTimestamp,
|
|
386
|
+
category: "error",
|
|
387
|
+
pluginName: plugin.name,
|
|
388
|
+
logs: [
|
|
389
|
+
"✗ Plugin installation failed",
|
|
390
|
+
` • Plugin Key: ${JSON.stringify(plugin.key)}`,
|
|
391
|
+
` • Error: ${error.constructor.name} - ${error.message}`,
|
|
392
|
+
" • Stack Trace:",
|
|
393
|
+
error.stack || "No stack trace available"
|
|
394
|
+
]
|
|
395
|
+
});
|
|
396
|
+
logger.emit("debug", {
|
|
397
|
+
date: errorTimestamp,
|
|
398
|
+
pluginGroupMarker: "end",
|
|
399
|
+
pluginName: plugin.name,
|
|
400
|
+
logs: []
|
|
401
|
+
});
|
|
185
402
|
failedPlugins.add({
|
|
186
403
|
plugin,
|
|
187
|
-
error
|
|
404
|
+
error
|
|
188
405
|
});
|
|
189
406
|
}
|
|
190
407
|
}
|
|
191
408
|
if (config.output.barrelType) {
|
|
192
409
|
const rootPath = resolve(resolve(config.root), config.output.path, "index.ts");
|
|
410
|
+
logger.emit("debug", {
|
|
411
|
+
date: /* @__PURE__ */ new Date(),
|
|
412
|
+
logs: [
|
|
413
|
+
"Generating barrel file",
|
|
414
|
+
` • Type: ${config.output.barrelType}`,
|
|
415
|
+
` • Path: ${rootPath}`
|
|
416
|
+
]
|
|
417
|
+
});
|
|
418
|
+
const barrelFiles = fabric.files.filter((file) => {
|
|
419
|
+
return file.sources.some((source) => source.isIndexable);
|
|
420
|
+
});
|
|
421
|
+
logger.emit("debug", {
|
|
422
|
+
date: /* @__PURE__ */ new Date(),
|
|
423
|
+
logs: [`Found ${barrelFiles.length} indexable files for barrel export`]
|
|
424
|
+
});
|
|
193
425
|
const rootFile = {
|
|
194
426
|
path: rootPath,
|
|
195
427
|
baseName: "index.ts",
|
|
196
|
-
exports:
|
|
197
|
-
return file.sources.some((source) => source.isIndexable);
|
|
198
|
-
}).flatMap((file) => {
|
|
428
|
+
exports: barrelFiles.flatMap((file) => {
|
|
199
429
|
const containsOnlyTypes = file.sources?.every((source) => source.isTypeOnly);
|
|
200
430
|
return file.sources?.map((source) => {
|
|
201
431
|
if (!file.path || !source.isIndexable) return;
|
|
@@ -215,32 +445,20 @@ async function safeBuild(options, overrides) {
|
|
|
215
445
|
meta: {}
|
|
216
446
|
};
|
|
217
447
|
await fabric.upsertFile(rootFile);
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
size: files$1.length,
|
|
223
|
-
message: "Writing files ..."
|
|
448
|
+
logger.emit("debug", {
|
|
449
|
+
date: /* @__PURE__ */ new Date(),
|
|
450
|
+
category: "file",
|
|
451
|
+
logs: [`✓ Generated barrel file (${rootFile.exports?.length || 0} exports)`]
|
|
224
452
|
});
|
|
225
|
-
}
|
|
226
|
-
fabric.context.on("process:progress", async ({ file, source }) => {
|
|
227
|
-
const message = file ? `Writing ${relative(config.root, file.path)}` : "";
|
|
228
|
-
pluginManager.logger.emit("progressed", {
|
|
229
|
-
id: "files",
|
|
230
|
-
message
|
|
231
|
-
});
|
|
232
|
-
if (source) await write(file.path, source, { sanity: false });
|
|
233
|
-
});
|
|
234
|
-
fabric.context.on("process:end", () => {
|
|
235
|
-
pluginManager.logger.emit("progress_stop", { id: "files" });
|
|
236
|
-
});
|
|
453
|
+
}
|
|
237
454
|
const files = [...fabric.files];
|
|
238
455
|
await fabric.write({ extension: config.output.extension });
|
|
239
456
|
return {
|
|
240
457
|
failedPlugins,
|
|
241
458
|
fabric,
|
|
242
459
|
files,
|
|
243
|
-
pluginManager
|
|
460
|
+
pluginManager,
|
|
461
|
+
pluginTimings
|
|
244
462
|
};
|
|
245
463
|
} catch (e) {
|
|
246
464
|
return {
|
|
@@ -248,6 +466,7 @@ async function safeBuild(options, overrides) {
|
|
|
248
466
|
fabric,
|
|
249
467
|
files: [],
|
|
250
468
|
pluginManager,
|
|
469
|
+
pluginTimings,
|
|
251
470
|
error: e
|
|
252
471
|
};
|
|
253
472
|
}
|
|
@@ -485,8 +704,8 @@ var PackageManager = class PackageManager {
|
|
|
485
704
|
const json = readSync(pkgPath);
|
|
486
705
|
return JSON.parse(json);
|
|
487
706
|
}
|
|
488
|
-
static setVersion(dependency, version) {
|
|
489
|
-
PackageManager.#cache[dependency] = version;
|
|
707
|
+
static setVersion(dependency, version$2) {
|
|
708
|
+
PackageManager.#cache[dependency] = version$2;
|
|
490
709
|
}
|
|
491
710
|
#match(packageJSON, dependency) {
|
|
492
711
|
const dependencies = {
|
|
@@ -509,21 +728,21 @@ var PackageManager = class PackageManager {
|
|
|
509
728
|
if (!packageJSON) return;
|
|
510
729
|
return this.#match(packageJSON, dependency);
|
|
511
730
|
}
|
|
512
|
-
async isValid(dependency, version) {
|
|
731
|
+
async isValid(dependency, version$2) {
|
|
513
732
|
const packageVersion = await this.getVersion(dependency);
|
|
514
733
|
if (!packageVersion) return false;
|
|
515
|
-
if (packageVersion === version) return true;
|
|
734
|
+
if (packageVersion === version$2) return true;
|
|
516
735
|
const semVer = coerce(packageVersion);
|
|
517
736
|
if (!semVer) throw new Error(`${packageVersion} is not valid`);
|
|
518
|
-
return satisfies(semVer, version);
|
|
737
|
+
return satisfies(semVer, version$2);
|
|
519
738
|
}
|
|
520
|
-
isValidSync(dependency, version) {
|
|
739
|
+
isValidSync(dependency, version$2) {
|
|
521
740
|
const packageVersion = this.getVersionSync(dependency);
|
|
522
741
|
if (!packageVersion) return false;
|
|
523
|
-
if (version === "next" && packageVersion === version) return true;
|
|
742
|
+
if (version$2 === "next" && packageVersion === version$2) return true;
|
|
524
743
|
const semVer = coerce(packageVersion);
|
|
525
744
|
if (!semVer) return false;
|
|
526
|
-
return satisfies(semVer, version);
|
|
745
|
+
return satisfies(semVer, version$2);
|
|
527
746
|
}
|
|
528
747
|
};
|
|
529
748
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#context","#options","path","reader","path","syncReader","path","definedConfig: Config","rootFile: KubbFile.File","files","build","resolve","toPath","process","fsPromises","fs","#cache","#cwd","#SLASHES","path","#match"],"sources":["../src/BaseGenerator.ts","../src/config.ts","../src/fs/clean.ts","../src/fs/exists.ts","../src/fs/read.ts","../src/build.ts","../src/definePlugin.ts","../../../node_modules/.pnpm/p-limit@4.0.0/node_modules/p-limit/index.js","../../../node_modules/.pnpm/p-locate@6.0.0/node_modules/p-locate/index.js","../../../node_modules/.pnpm/locate-path@7.2.0/node_modules/locate-path/index.js","../../../node_modules/.pnpm/unicorn-magic@0.1.0/node_modules/unicorn-magic/node.js","../../../node_modules/.pnpm/find-up@7.0.0/node_modules/find-up/index.js","../src/PackageManager.ts"],"sourcesContent":["/**\n * Abstract class that contains the building blocks for plugins to create their own Generator\n * @link idea based on https://github.com/colinhacks/zod/blob/master/src/types.ts#L137\n */\nexport abstract class BaseGenerator<TOptions = unknown, TContext = unknown> {\n #options: TOptions = {} as TOptions\n #context: TContext = {} as TContext\n\n constructor(options?: TOptions, context?: TContext) {\n if (context) {\n this.#context = context\n }\n\n if (options) {\n this.#options = options\n }\n\n return this\n }\n\n get options(): TOptions {\n return this.#options\n }\n\n get context(): TContext {\n return this.#context\n }\n\n set options(options: TOptions) {\n this.#options = { ...this.#options, ...options }\n }\n\n abstract build(...params: unknown[]): unknown\n}\n","import type { InputPath, UserConfig } from './types.ts'\nimport type { PossiblePromise } from './utils/types.ts'\n\n/**\n * CLI options derived from command-line flags.\n */\nexport type CLIOptions = {\n /** Path to `kubb.config.js` */\n config?: string\n\n /** Enable watch mode for input files */\n watch?: boolean\n\n /**\n * Logging verbosity for CLI usage.\n *\n * - `silent`: hide non-essential logs\n * - `info`: show general logs (non-plugin-related)\n * - `debug`: include detailed plugin lifecycle logs\n * @default 'silent'\n */\n logLevel?: 'silent' | 'info' | 'debug'\n\n /** Run Kubb with Bun */\n bun?: boolean\n}\n\n/**\n * Helper for defining a Kubb configuration.\n *\n * Accepts either:\n * - A config object or array of configs\n * - A function returning the config(s), optionally async,\n * receiving the CLI options as argument\n *\n * @example\n * export default defineConfig(({ logLevel }) => ({\n * root: 'src',\n * plugins: [myPlugin()],\n * }))\n */\nexport function defineConfig(\n config: PossiblePromise<UserConfig | UserConfig[]> | ((cli: CLIOptions) => PossiblePromise<UserConfig | UserConfig[]>),\n): typeof config {\n return config\n}\n\n/**\n * Type guard to check if a given config has an `input.path`.\n */\nexport function isInputPath(config: UserConfig | undefined): config is UserConfig<InputPath> {\n return typeof config?.input === 'object' && config.input !== null && 'path' in config.input\n}\n","import fs from 'fs-extra'\n\nexport async function clean(path: string): Promise<void> {\n return fs.remove(path)\n}\n","import fs from 'fs-extra'\nimport { switcher } from 'js-runtime'\n\nconst reader = switcher(\n {\n node: async (path: string) => {\n return fs.pathExists(path)\n },\n bun: async (path: string) => {\n const file = Bun.file(path)\n\n return file.exists()\n },\n },\n 'node',\n)\n\nconst syncReader = switcher(\n {\n node: (path: string) => {\n return fs.pathExistsSync(path)\n },\n bun: () => {\n throw new Error('Bun cannot read sync')\n },\n },\n 'node',\n)\n\nexport async function exists(path: string): Promise<boolean> {\n return reader(path)\n}\n\nexport function existsSync(path: string): boolean {\n return syncReader(path)\n}\n","import fs from 'fs-extra'\nimport { switcher } from 'js-runtime'\n\nconst reader = switcher(\n {\n node: async (path: string) => {\n return fs.readFile(path, { encoding: 'utf8' })\n },\n bun: async (path: string) => {\n const file = Bun.file(path)\n\n return file.text()\n },\n },\n 'node',\n)\n\nconst syncReader = switcher(\n {\n node: (path: string) => {\n return fs.readFileSync(path, { encoding: 'utf8' })\n },\n bun: () => {\n throw new Error('Bun cannot read sync')\n },\n },\n 'node',\n)\n\nexport async function read(path: string): Promise<string> {\n return reader(path)\n}\n\nexport function readSync(path: string): string {\n return syncReader(path)\n}\n","import { join, relative, resolve } from 'node:path'\nimport type { KubbFile } from '@kubb/fabric-core/types'\nimport type { Fabric } from '@kubb/react-fabric'\nimport { createFabric } from '@kubb/react-fabric'\nimport { typescriptParser } from '@kubb/react-fabric/parsers'\nimport { fsPlugin } from '@kubb/react-fabric/plugins'\nimport pc from 'picocolors'\nimport { isDeepEqual } from 'remeda'\nimport { isInputPath } from './config.ts'\nimport { clean, exists, getRelativePath, write } from './fs/index.ts'\nimport type { Logger } from './logger.ts'\nimport { createLogger } from './logger.ts'\nimport { PluginManager } from './PluginManager.ts'\nimport type { Config, Output, Plugin, UserConfig } from './types.ts'\nimport { URLPath } from './utils/URLPath.ts'\n\ntype BuildOptions = {\n config: UserConfig\n /**\n * @default Logger without the spinner\n */\n logger?: Logger\n}\n\ntype BuildOutput = {\n failedPlugins: Set<{ plugin: Plugin; error: Error }>\n fabric: Fabric\n files: Array<KubbFile.ResolvedFile>\n pluginManager: PluginManager\n // TODO check if we can remove error\n /**\n * Only for safeBuild,\n * @deprecated\n */\n error?: Error\n}\n\ntype SetupResult = {\n fabric: Fabric\n pluginManager: PluginManager\n}\n\nexport async function setup(options: BuildOptions): Promise<SetupResult> {\n const { config: userConfig, logger = createLogger() } = options\n\n if (Array.isArray(userConfig.input)) {\n console.warn(pc.yellow('This feature is still under development — use with caution'))\n }\n\n try {\n if (isInputPath(userConfig) && !new URLPath(userConfig.input.path).isURL) {\n await exists(userConfig.input.path)\n }\n } catch (e) {\n if (isInputPath(userConfig)) {\n throw new Error(\n `Cannot read file/URL defined in \\`input.path\\` or set with \\`kubb generate PATH\\` in the CLI of your Kubb config ${userConfig.input.path}`,\n {\n cause: e,\n },\n )\n }\n }\n\n const definedConfig: Config = {\n root: userConfig.root || process.cwd(),\n ...userConfig,\n output: {\n write: true,\n barrelType: 'named',\n extension: {\n '.ts': '.ts',\n },\n defaultBanner: 'simple',\n ...userConfig.output,\n },\n plugins: userConfig.plugins as Config['plugins'],\n }\n\n if (definedConfig.output.clean) {\n await clean(definedConfig.output.path)\n await clean(join(definedConfig.root, '.kubb'))\n }\n\n const fabric = createFabric()\n fabric.use(fsPlugin, { dryRun: !definedConfig.output.write })\n fabric.use(typescriptParser)\n\n const pluginManager = new PluginManager(definedConfig, { fabric, logger, concurrency: 5 })\n\n return {\n fabric,\n pluginManager,\n }\n}\n\nexport async function build(options: BuildOptions, overrides?: SetupResult): Promise<BuildOutput> {\n const { fabric, files, pluginManager, failedPlugins, error } = await safeBuild(options, overrides)\n\n if (error) {\n throw error\n }\n\n return {\n failedPlugins,\n fabric,\n files,\n pluginManager,\n error,\n }\n}\n\nexport async function safeBuild(options: BuildOptions, overrides?: SetupResult): Promise<BuildOutput> {\n const { fabric, pluginManager } = overrides ? overrides : await setup(options)\n\n const failedPlugins = new Set<{ plugin: Plugin; error: Error }>()\n const config = pluginManager.config\n\n try {\n for (const plugin of pluginManager.plugins) {\n const context = pluginManager.getContext(plugin)\n\n const installer = plugin.install.bind(context)\n\n try {\n await installer(context)\n } catch (e) {\n failedPlugins.add({ plugin, error: e as Error })\n }\n }\n\n if (config.output.barrelType) {\n const root = resolve(config.root)\n const rootPath = resolve(root, config.output.path, 'index.ts')\n\n const barrelFiles = fabric.files.filter((file) => {\n return file.sources.some((source) => source.isIndexable)\n })\n\n const rootFile: KubbFile.File = {\n path: rootPath,\n baseName: 'index.ts',\n exports: barrelFiles\n .flatMap((file) => {\n const containsOnlyTypes = file.sources?.every((source) => source.isTypeOnly)\n\n return file.sources\n ?.map((source) => {\n if (!file.path || !source.isIndexable) {\n return undefined\n }\n\n // validate of the file is coming from plugin x, needs pluginKey on every file TODO update typing\n const plugin = [...pluginManager.plugins].find((item) => {\n const meta = file.meta as any\n return isDeepEqual(item.key, meta?.pluginKey)\n })\n const pluginOptions = plugin?.options as { output?: Output<any> }\n\n if (!pluginOptions || pluginOptions?.output?.barrelType === false) {\n return undefined\n }\n\n return {\n name: config.output.barrelType === 'all' ? undefined : [source.name],\n path: getRelativePath(rootPath, file.path),\n isTypeOnly: config.output.barrelType === 'all' ? containsOnlyTypes : source.isTypeOnly,\n } as KubbFile.Export\n })\n .filter(Boolean)\n })\n .filter(Boolean),\n sources: [],\n meta: {},\n }\n\n await fabric.upsertFile(rootFile)\n }\n\n fabric.context.on('process:start', ({ files }) => {\n pluginManager.logger.emit('progress_start', { id: 'files', size: files.length, message: 'Writing files ...' })\n })\n\n fabric.context.on('process:progress', async ({ file, source }) => {\n const message = file ? `Writing ${relative(config.root, file.path)}` : ''\n pluginManager.logger.emit('progressed', { id: 'files', message })\n\n if (source) {\n await write(file.path, source, { sanity: false })\n }\n })\n\n fabric.context.on('process:end', () => {\n pluginManager.logger.emit('progress_stop', { id: 'files' })\n })\n const files = [...fabric.files]\n\n await fabric.write({ extension: config.output.extension })\n\n return {\n failedPlugins,\n fabric,\n files,\n pluginManager,\n }\n } catch (e) {\n return {\n failedPlugins,\n fabric,\n files: [],\n pluginManager,\n error: e as Error,\n }\n }\n}\n","import type { PluginFactoryOptions, UserPluginWithLifeCycle } from './types.ts'\n\ntype PluginBuilder<T extends PluginFactoryOptions = PluginFactoryOptions> = (options: T['options']) => UserPluginWithLifeCycle<T>\n\n/**\n * Wraps a plugin builder to make the options parameter optional.\n */\nexport function definePlugin<T extends PluginFactoryOptions = PluginFactoryOptions>(\n build: PluginBuilder<T>,\n): (options?: T['options']) => UserPluginWithLifeCycle<T> {\n return (options) => build(options ?? ({} as T['options']))\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tif (queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t}\n\t};\n\n\tconst run = async (fn, resolve, args) => {\n\t\tactiveCount++;\n\n\t\tconst result = (async () => fn(...args))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (fn, resolve, args) => {\n\t\tqueue.enqueue(run.bind(undefined, fn, resolve, args));\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// when the run function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\t\tqueue.dequeue()();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (fn, ...args) => new Promise(resolve => {\n\t\tenqueue(fn, resolve, args);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue: () => {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n","import pLimit from 'p-limit';\n\nclass EndError extends Error {\n\tconstructor(value) {\n\t\tsuper();\n\t\tthis.value = value;\n\t}\n}\n\n// The input can also be a promise, so we await it.\nconst testElement = async (element, tester) => tester(await element);\n\n// The input can also be a promise, so we `Promise.all()` them both.\nconst finder = async element => {\n\tconst values = await Promise.all(element);\n\tif (values[1] === true) {\n\t\tthrow new EndError(values[0]);\n\t}\n\n\treturn false;\n};\n\nexport default async function pLocate(\n\titerable,\n\ttester,\n\t{\n\t\tconcurrency = Number.POSITIVE_INFINITY,\n\t\tpreserveOrder = true,\n\t} = {},\n) {\n\tconst limit = pLimit(concurrency);\n\n\t// Start all the promises concurrently with optional limit.\n\tconst items = [...iterable].map(element => [element, limit(testElement, element, tester)]);\n\n\t// Check the promises either serially or concurrently.\n\tconst checkLimit = pLimit(preserveOrder ? 1 : Number.POSITIVE_INFINITY);\n\n\ttry {\n\t\tawait Promise.all(items.map(element => checkLimit(finder, element)));\n\t} catch (error) {\n\t\tif (error instanceof EndError) {\n\t\t\treturn error.value;\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n","import process from 'node:process';\nimport path from 'node:path';\nimport fs, {promises as fsPromises} from 'node:fs';\nimport {fileURLToPath} from 'node:url';\nimport pLocate from 'p-locate';\n\nconst typeMappings = {\n\tdirectory: 'isDirectory',\n\tfile: 'isFile',\n};\n\nfunction checkType(type) {\n\tif (Object.hasOwnProperty.call(typeMappings, type)) {\n\t\treturn;\n\t}\n\n\tthrow new Error(`Invalid type specified: ${type}`);\n}\n\nconst matchType = (type, stat) => stat[typeMappings[type]]();\n\nconst toPath = urlOrPath => urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;\n\nexport async function locatePath(\n\tpaths,\n\t{\n\t\tcwd = process.cwd(),\n\t\ttype = 'file',\n\t\tallowSymlinks = true,\n\t\tconcurrency,\n\t\tpreserveOrder,\n\t} = {},\n) {\n\tcheckType(type);\n\tcwd = toPath(cwd);\n\n\tconst statFunction = allowSymlinks ? fsPromises.stat : fsPromises.lstat;\n\n\treturn pLocate(paths, async path_ => {\n\t\ttry {\n\t\t\tconst stat = await statFunction(path.resolve(cwd, path_));\n\t\t\treturn matchType(type, stat);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}, {concurrency, preserveOrder});\n}\n\nexport function locatePathSync(\n\tpaths,\n\t{\n\t\tcwd = process.cwd(),\n\t\ttype = 'file',\n\t\tallowSymlinks = true,\n\t} = {},\n) {\n\tcheckType(type);\n\tcwd = toPath(cwd);\n\n\tconst statFunction = allowSymlinks ? fs.statSync : fs.lstatSync;\n\n\tfor (const path_ of paths) {\n\t\ttry {\n\t\t\tconst stat = statFunction(path.resolve(cwd, path_), {\n\t\t\t\tthrowIfNoEntry: false,\n\t\t\t});\n\n\t\t\tif (!stat) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (matchType(type, stat)) {\n\t\t\t\treturn path_;\n\t\t\t}\n\t\t} catch {}\n\t}\n}\n","import {fileURLToPath} from 'node:url';\n\nexport function toPath(urlOrPath) {\n\treturn urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;\n}\n\nexport * from './default.js';\n","import path from 'node:path';\nimport {locatePath, locatePathSync} from 'locate-path';\nimport {toPath} from 'unicorn-magic';\n\nexport const findUpStop = Symbol('findUpStop');\n\nexport async function findUpMultiple(name, options = {}) {\n\tlet directory = path.resolve(toPath(options.cwd) ?? '');\n\tconst {root} = path.parse(directory);\n\tconst stopAt = path.resolve(directory, toPath(options.stopAt ?? root));\n\tconst limit = options.limit ?? Number.POSITIVE_INFINITY;\n\tconst paths = [name].flat();\n\n\tconst runMatcher = async locateOptions => {\n\t\tif (typeof name !== 'function') {\n\t\t\treturn locatePath(paths, locateOptions);\n\t\t}\n\n\t\tconst foundPath = await name(locateOptions.cwd);\n\t\tif (typeof foundPath === 'string') {\n\t\t\treturn locatePath([foundPath], locateOptions);\n\t\t}\n\n\t\treturn foundPath;\n\t};\n\n\tconst matches = [];\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst foundPath = await runMatcher({...options, cwd: directory});\n\n\t\tif (foundPath === findUpStop) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (foundPath) {\n\t\t\tmatches.push(path.resolve(directory, foundPath));\n\t\t}\n\n\t\tif (directory === stopAt || matches.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tdirectory = path.dirname(directory);\n\t}\n\n\treturn matches;\n}\n\nexport function findUpMultipleSync(name, options = {}) {\n\tlet directory = path.resolve(toPath(options.cwd) ?? '');\n\tconst {root} = path.parse(directory);\n\tconst stopAt = path.resolve(directory, toPath(options.stopAt) ?? root);\n\tconst limit = options.limit ?? Number.POSITIVE_INFINITY;\n\tconst paths = [name].flat();\n\n\tconst runMatcher = locateOptions => {\n\t\tif (typeof name !== 'function') {\n\t\t\treturn locatePathSync(paths, locateOptions);\n\t\t}\n\n\t\tconst foundPath = name(locateOptions.cwd);\n\t\tif (typeof foundPath === 'string') {\n\t\t\treturn locatePathSync([foundPath], locateOptions);\n\t\t}\n\n\t\treturn foundPath;\n\t};\n\n\tconst matches = [];\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\tconst foundPath = runMatcher({...options, cwd: directory});\n\n\t\tif (foundPath === findUpStop) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (foundPath) {\n\t\t\tmatches.push(path.resolve(directory, foundPath));\n\t\t}\n\n\t\tif (directory === stopAt || matches.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tdirectory = path.dirname(directory);\n\t}\n\n\treturn matches;\n}\n\nexport async function findUp(name, options = {}) {\n\tconst matches = await findUpMultiple(name, {...options, limit: 1});\n\treturn matches[0];\n}\n\nexport function findUpSync(name, options = {}) {\n\tconst matches = findUpMultipleSync(name, {...options, limit: 1});\n\treturn matches[0];\n}\n\nexport {\n\tpathExists,\n\tpathExistsSync,\n} from 'path-exists';\n","import mod from 'node:module'\nimport os from 'node:os'\nimport { pathToFileURL } from 'node:url'\n\nimport { findUp, findUpSync } from 'find-up'\nimport { coerce, satisfies } from 'semver'\n\nimport { read, readSync } from './fs/index.ts'\n\ntype PackageJSON = {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n}\n\ntype DependencyName = string\n\ntype DependencyVersion = string\n\nexport class PackageManager {\n static #cache: Record<DependencyName, DependencyVersion> = {}\n\n #cwd?: string\n #SLASHES = new Set(['/', '\\\\'])\n constructor(workspace?: string) {\n if (workspace) {\n this.#cwd = workspace\n }\n\n return this\n }\n\n set workspace(workspace: string) {\n this.#cwd = workspace\n }\n\n get workspace(): string | undefined {\n return this.#cwd\n }\n\n normalizeDirectory(directory: string): string {\n if (!this.#SLASHES.has(directory[directory.length - 1]!)) {\n return `${directory}/`\n }\n\n return directory\n }\n\n getLocation(path: string): string {\n let location = path\n\n if (this.#cwd) {\n const require = mod.createRequire(this.normalizeDirectory(this.#cwd))\n location = require.resolve(path)\n }\n\n return location\n }\n\n async import(path: string): Promise<any | undefined> {\n try {\n let location = this.getLocation(path)\n\n if (os.platform() === 'win32') {\n location = pathToFileURL(location).href\n }\n\n const module = await import(location)\n\n return module?.default ?? module\n } catch (e) {\n console.error(e)\n return undefined\n }\n }\n\n async getPackageJSON(): Promise<PackageJSON | undefined> {\n const pkgPath = await findUp(['package.json'], {\n cwd: this.#cwd,\n })\n if (!pkgPath) {\n return undefined\n }\n\n const json = await read(pkgPath)\n\n return JSON.parse(json) as PackageJSON\n }\n\n getPackageJSONSync(): PackageJSON | undefined {\n const pkgPath = findUpSync(['package.json'], {\n cwd: this.#cwd,\n })\n if (!pkgPath) {\n return undefined\n }\n\n const json = readSync(pkgPath)\n\n return JSON.parse(json) as PackageJSON\n }\n\n static setVersion(dependency: DependencyName, version: DependencyVersion): void {\n PackageManager.#cache[dependency] = version\n }\n\n #match(packageJSON: PackageJSON, dependency: DependencyName | RegExp): string | undefined {\n const dependencies = {\n ...(packageJSON['dependencies'] || {}),\n ...(packageJSON['devDependencies'] || {}),\n }\n\n if (typeof dependency === 'string' && dependencies[dependency]) {\n return dependencies[dependency]\n }\n\n const matchedDependency = Object.keys(dependencies).find((dep) => dep.match(dependency))\n\n return matchedDependency ? dependencies[matchedDependency] : undefined\n }\n\n async getVersion(dependency: DependencyName | RegExp): Promise<DependencyVersion | undefined> {\n if (typeof dependency === 'string' && PackageManager.#cache[dependency]) {\n return PackageManager.#cache[dependency]\n }\n\n const packageJSON = await this.getPackageJSON()\n\n if (!packageJSON) {\n return undefined\n }\n\n return this.#match(packageJSON, dependency)\n }\n\n getVersionSync(dependency: DependencyName | RegExp): DependencyVersion | undefined {\n if (typeof dependency === 'string' && PackageManager.#cache[dependency]) {\n return PackageManager.#cache[dependency]\n }\n\n const packageJSON = this.getPackageJSONSync()\n\n if (!packageJSON) {\n return undefined\n }\n\n return this.#match(packageJSON, dependency)\n }\n\n async isValid(dependency: DependencyName | RegExp, version: DependencyVersion): Promise<boolean> {\n const packageVersion = await this.getVersion(dependency)\n\n if (!packageVersion) {\n return false\n }\n\n if (packageVersion === version) {\n return true\n }\n\n const semVer = coerce(packageVersion)\n\n if (!semVer) {\n throw new Error(`${packageVersion} is not valid`)\n }\n\n return satisfies(semVer, version)\n }\n isValidSync(dependency: DependencyName | RegExp, version: DependencyVersion): boolean {\n const packageVersion = this.getVersionSync(dependency)\n\n if (!packageVersion) {\n return false\n }\n\n if (version === 'next' && packageVersion === version) {\n return true\n }\n\n const semVer = coerce(packageVersion)\n\n if (!semVer) {\n return false\n }\n\n return satisfies(semVer, version)\n }\n}\n"],"x_google_ignoreList":[7,8,9,10,11],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["#context","#options","path","reader","path","syncReader","path","definedConfig: Config","path","rootFile: KubbFile.File","build","resolve","toPath","process","fsPromises","fs","#cache","#cwd","#SLASHES","path","version","#match"],"sources":["../src/BaseGenerator.ts","../src/config.ts","../src/fs/clean.ts","../src/fs/exists.ts","../src/fs/read.ts","../package.json","../src/utils/diagnostics.ts","../src/build.ts","../src/definePlugin.ts","../../../node_modules/.pnpm/p-limit@4.0.0/node_modules/p-limit/index.js","../../../node_modules/.pnpm/p-locate@6.0.0/node_modules/p-locate/index.js","../../../node_modules/.pnpm/locate-path@7.2.0/node_modules/locate-path/index.js","../../../node_modules/.pnpm/unicorn-magic@0.1.0/node_modules/unicorn-magic/node.js","../../../node_modules/.pnpm/find-up@7.0.0/node_modules/find-up/index.js","../src/PackageManager.ts"],"sourcesContent":["/**\n * Abstract class that contains the building blocks for plugins to create their own Generator\n * @link idea based on https://github.com/colinhacks/zod/blob/master/src/types.ts#L137\n */\nexport abstract class BaseGenerator<TOptions = unknown, TContext = unknown> {\n #options: TOptions = {} as TOptions\n #context: TContext = {} as TContext\n\n constructor(options?: TOptions, context?: TContext) {\n if (context) {\n this.#context = context\n }\n\n if (options) {\n this.#options = options\n }\n\n return this\n }\n\n get options(): TOptions {\n return this.#options\n }\n\n get context(): TContext {\n return this.#context\n }\n\n set options(options: TOptions) {\n this.#options = { ...this.#options, ...options }\n }\n\n abstract build(...params: unknown[]): unknown\n}\n","import type { InputPath, UserConfig } from './types.ts'\nimport type { PossiblePromise } from './utils/types.ts'\n\n/**\n * CLI options derived from command-line flags.\n */\nexport type CLIOptions = {\n /** Path to `kubb.config.js` */\n config?: string\n\n /** Enable watch mode for input files */\n watch?: boolean\n\n /**\n * Logging verbosity for CLI usage.\n *\n * - `silent`: hide non-essential logs\n * - `info`: show general logs (non-plugin-related)\n * - `debug`: include detailed plugin lifecycle logs\n * @default 'silent'\n */\n logLevel?: 'silent' | 'info' | 'debug'\n\n /** Run Kubb with Bun */\n bun?: boolean\n}\n\n/**\n * Helper for defining a Kubb configuration.\n *\n * Accepts either:\n * - A config object or array of configs\n * - A function returning the config(s), optionally async,\n * receiving the CLI options as argument\n *\n * @example\n * export default defineConfig(({ logLevel }) => ({\n * root: 'src',\n * plugins: [myPlugin()],\n * }))\n */\nexport function defineConfig(\n config: PossiblePromise<UserConfig | UserConfig[]> | ((cli: CLIOptions) => PossiblePromise<UserConfig | UserConfig[]>),\n): typeof config {\n return config\n}\n\n/**\n * Type guard to check if a given config has an `input.path`.\n */\nexport function isInputPath(config: UserConfig | undefined): config is UserConfig<InputPath> {\n return typeof config?.input === 'object' && config.input !== null && 'path' in config.input\n}\n","import fs from 'fs-extra'\n\nexport async function clean(path: string): Promise<void> {\n return fs.remove(path)\n}\n","import fs from 'fs-extra'\nimport { switcher } from 'js-runtime'\n\nconst reader = switcher(\n {\n node: async (path: string) => {\n return fs.pathExists(path)\n },\n bun: async (path: string) => {\n const file = Bun.file(path)\n\n return file.exists()\n },\n },\n 'node',\n)\n\nconst syncReader = switcher(\n {\n node: (path: string) => {\n return fs.pathExistsSync(path)\n },\n bun: () => {\n throw new Error('Bun cannot read sync')\n },\n },\n 'node',\n)\n\nexport async function exists(path: string): Promise<boolean> {\n return reader(path)\n}\n\nexport function existsSync(path: string): boolean {\n return syncReader(path)\n}\n","import fs from 'fs-extra'\nimport { switcher } from 'js-runtime'\n\nconst reader = switcher(\n {\n node: async (path: string) => {\n return fs.readFile(path, { encoding: 'utf8' })\n },\n bun: async (path: string) => {\n const file = Bun.file(path)\n\n return file.text()\n },\n },\n 'node',\n)\n\nconst syncReader = switcher(\n {\n node: (path: string) => {\n return fs.readFileSync(path, { encoding: 'utf8' })\n },\n bun: () => {\n throw new Error('Bun cannot read sync')\n },\n },\n 'node',\n)\n\nexport async function read(path: string): Promise<string> {\n return reader(path)\n}\n\nexport function readSync(path: string): string {\n return syncReader(path)\n}\n","{\n \"name\": \"@kubb/core\",\n \"version\": \"4.11.2\",\n \"description\": \"Core functionality for Kubb's plugin-based code generation system, providing the foundation for transforming OpenAPI specifications.\",\n \"keywords\": [\n \"typescript\",\n \"plugins\",\n \"plugin-system\",\n \"code-generator\",\n \"codegen\",\n \"openapi\",\n \"swagger\",\n \"kubb\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/kubb-labs/kubb.git\",\n \"directory\": \"packages/core\"\n },\n \"license\": \"MIT\",\n \"author\": \"stijnvanhulle\",\n \"sideEffects\": false,\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\"\n },\n \"./hooks\": {\n \"require\": \"./dist/hooks.cjs\",\n \"import\": \"./dist/hooks.js\"\n },\n \"./logger\": {\n \"require\": \"./dist/logger.cjs\",\n \"import\": \"./dist/logger.js\"\n },\n \"./transformers\": {\n \"require\": \"./dist/transformers.cjs\",\n \"import\": \"./dist/transformers.js\"\n },\n \"./utils\": {\n \"require\": \"./dist/utils.cjs\",\n \"import\": \"./dist/utils.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.cts\",\n \"typesVersions\": {\n \"*\": {\n \"utils\": [\n \"./dist/utils.d.ts\"\n ],\n \"transformers\": [\n \"./dist/transformers.d.ts\"\n ],\n \"logger\": [\n \"./dist/logger.d.ts\"\n ],\n \"hooks\": [\n \"./dist/hooks.d.ts\"\n ],\n \"fs\": [\n \"./dist/fs.d.ts\"\n ]\n }\n },\n \"files\": [\n \"src\",\n \"dist\",\n \"*.d.ts\",\n \"*.d.cts\",\n \"schema.json\",\n \"!/**/**.test.**\",\n \"!/**/__tests__/**\"\n ],\n \"size-limit\": [\n {\n \"path\": \"./dist/*.js\",\n \"limit\": \"510 KiB\",\n \"gzip\": true\n }\n ],\n \"scripts\": {\n \"build\": \"tsdown && size-limit\",\n \"clean\": \"npx rimraf ./dist\",\n \"lint\": \"bun biome lint .\",\n \"lint:fix\": \"bun biome lint --fix --unsafe .\",\n \"release\": \"pnpm publish --no-git-check\",\n \"release:canary\": \"bash ../../.github/canary.sh && node ../../scripts/build.js canary && pnpm publish --no-git-check\",\n \"start\": \"tsdown --watch\",\n \"test\": \"vitest --passWithNoTests\",\n \"typecheck\": \"tsc -p ./tsconfig.json --noEmit --emitDeclarationOnly false\"\n },\n \"dependencies\": {\n \"@kubb/react-fabric\": \"catalog:\",\n \"camelcase\": \"^8.0.0\",\n \"find-up\": \"^7.0.0\",\n \"fs-extra\": \"^11.3.2\",\n \"jiti\": \"^2.6.1\",\n \"js-runtime\": \"^0.0.8\",\n \"natural-orderby\": \"^5.0.0\",\n \"object-hash\": \"^3.0.0\",\n \"p-limit\": \"catalog:\",\n \"picocolors\": \"^1.1.1\",\n \"remeda\": \"catalog:\",\n \"seedrandom\": \"^3.0.5\",\n \"semver\": \"^7.7.3\"\n },\n \"devDependencies\": {\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/object-hash\": \"^3.0.6\",\n \"@types/seedrandom\": \"^3.0.8\",\n \"@types/semver\": \"^7.7.1\",\n \"consola\": \"^3.4.2\",\n \"zod\": \"^4.1.13\"\n },\n \"peerDependencies\": {\n \"@kubb/react-fabric\": \"0.5.4\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","import { version as nodeVersion } from 'node:process'\nimport { version as KubbVersion } from '../../package.json'\n\n/**\n * Get diagnostic information for debugging\n */\nexport function getDiagnosticInfo() {\n return {\n nodeVersion,\n KubbVersion,\n platform: process.platform,\n arch: process.arch,\n cwd: process.cwd(),\n } as const\n}\n","import { join, relative, resolve } from 'node:path'\nimport { performance } from 'node:perf_hooks'\nimport type { KubbFile } from '@kubb/fabric-core/types'\nimport type { Fabric } from '@kubb/react-fabric'\nimport { createFabric } from '@kubb/react-fabric'\nimport { typescriptParser } from '@kubb/react-fabric/parsers'\nimport { fsPlugin } from '@kubb/react-fabric/plugins'\nimport pc from 'picocolors'\nimport { isDeepEqual } from 'remeda'\nimport { isInputPath } from './config.ts'\nimport { clean, exists, getRelativePath, write } from './fs/index.ts'\nimport type { Logger } from './logger.ts'\nimport { createLogger } from './logger.ts'\nimport { PluginManager } from './PluginManager.ts'\nimport type { Config, Output, Plugin, UserConfig } from './types.ts'\nimport { getDiagnosticInfo } from './utils/diagnostics.ts'\nimport { URLPath } from './utils/URLPath.ts'\n\ntype BuildOptions = {\n config: UserConfig\n /**\n * @default Logger without the spinner\n */\n logger?: Logger\n}\n\ntype BuildOutput = {\n failedPlugins: Set<{ plugin: Plugin; error: Error }>\n fabric: Fabric\n files: Array<KubbFile.ResolvedFile>\n pluginManager: PluginManager\n pluginTimings: Map<string, number>\n error?: Error\n}\n\ntype SetupResult = {\n logger: Logger\n fabric: Fabric\n pluginManager: PluginManager\n}\n\nexport async function setup(options: BuildOptions): Promise<SetupResult> {\n const { config: userConfig, logger = createLogger() } = options\n\n const diagnosticInfo = getDiagnosticInfo()\n\n if (Array.isArray(userConfig.input)) {\n console.warn(pc.yellow('This feature is still under development — use with caution'))\n }\n\n logger.emit('debug', {\n date: new Date(),\n category: 'setup',\n logs: [\n 'Configuration:',\n ` • Name: ${userConfig.name || 'unnamed'}`,\n ` • Root: ${userConfig.root || process.cwd()}`,\n ` • Output: ${userConfig.output?.path || 'not specified'}`,\n ` • Plugins: ${userConfig.plugins?.length || 0}`,\n 'Output Settings:',\n ` • Write: ${userConfig.output?.write !== false ? 'enabled' : 'disabled'}`,\n ` • Formater: ${userConfig.output?.format || 'none'}`,\n ` • Linter: ${userConfig.output?.lint || 'none'}`,\n 'Environment:',\n Object.entries(diagnosticInfo)\n .map(([key, value]) => ` • ${key}: ${value}`)\n .join('\\n'),\n ],\n })\n\n try {\n if (isInputPath(userConfig) && !new URLPath(userConfig.input.path).isURL) {\n await exists(userConfig.input.path)\n\n logger.emit('debug', {\n date: new Date(),\n category: 'setup',\n logs: [`✓ Input file validated: ${userConfig.input.path}`],\n })\n }\n } catch (e) {\n if (isInputPath(userConfig)) {\n const error = e as Error\n\n throw new Error(\n `Cannot read file/URL defined in \\`input.path\\` or set with \\`kubb generate PATH\\` in the CLI of your Kubb config ${userConfig.input.path}`,\n {\n cause: error,\n },\n )\n }\n }\n\n const definedConfig: Config = {\n root: userConfig.root || process.cwd(),\n ...userConfig,\n output: {\n write: true,\n barrelType: 'named',\n extension: {\n '.ts': '.ts',\n },\n defaultBanner: 'simple',\n ...userConfig.output,\n },\n plugins: userConfig.plugins as Config['plugins'],\n }\n\n if (definedConfig.output.clean) {\n logger.emit('debug', {\n date: new Date(),\n category: 'setup',\n logs: ['Cleaning output directories', ` • Output: ${definedConfig.output.path}`, ' • Cache: .kubb'],\n })\n await clean(definedConfig.output.path)\n await clean(join(definedConfig.root, '.kubb'))\n }\n\n const fabric = createFabric()\n fabric.use(fsPlugin, { dryRun: !definedConfig.output.write })\n fabric.use(typescriptParser)\n\n fabric.context.on('process:start', ({ files }) => {\n logger.emit('progress_start', { id: 'files', size: files.length, message: 'Writing files ...' })\n logger.emit('debug', {\n date: new Date(),\n category: 'file',\n logs: [`Writing ${files.length} files...`],\n })\n })\n\n fabric.context.on('process:progress', async ({ file, source }) => {\n const message = file ? `Writing ${relative(definedConfig.root, file.path)}` : ''\n logger.emit('progressed', { id: 'files', message })\n\n if (source) {\n await write(file.path, source, { sanity: false })\n }\n })\n\n fabric.context.on('process:end', () => {\n logger.emit('progress_stop', { id: 'files' })\n logger.emit('debug', {\n date: new Date(),\n category: 'file',\n logs: ['✓ File write process completed'],\n })\n })\n\n logger.emit('debug', {\n date: new Date(),\n category: 'setup',\n logs: [\n '✓ Fabric initialized',\n ` • File writing: ${definedConfig.output.write ? 'enabled' : 'disabled (dry-run)'}`,\n ` • Barrel type: ${definedConfig.output.barrelType || 'none'}`,\n ],\n })\n\n const pluginManager = new PluginManager(definedConfig, { fabric, logger, concurrency: 5 })\n\n pluginManager.on('executing', ({ plugin, hookName, strategy, parameters }) => {\n logger.emit('debug', {\n date: new Date(),\n category: 'hook',\n pluginName: plugin.name,\n logs: [`Executing hook: ${hookName}`, ` • Strategy: ${strategy}`, ' • Parameters:', JSON.stringify(parameters, null, 2)],\n })\n })\n\n pluginManager.on('executed', ({ plugin, hookName, duration, parameters }) => {\n let message = ''\n if (hookName === 'resolvePath') {\n const [path] = parameters || []\n message = `Resolving path '${path}'`\n }\n\n if (hookName === 'resolveName') {\n const [name, type] = parameters || []\n message = `Resolving name '${name}' and type '${type}'`\n }\n\n logger.emit('progressed', {\n id: hookName,\n message: `${plugin.name}: ${message}`,\n })\n logger.emit('debug', {\n date: new Date(),\n category: 'hook',\n pluginName: plugin.name,\n logs: [`✓ Completed in ${duration}ms`],\n })\n })\n\n pluginManager.on('progress_start', ({ hookName, plugins }) => {\n logger.emit('progress_start', { id: hookName, size: plugins.length, message: 'Running plugins...' })\n })\n\n pluginManager.on('progress_stop', ({ hookName }) => {\n logger.emit('progress_stop', { id: hookName })\n })\n\n pluginManager.on('error', (error, { plugin, strategy, duration, parameters, hookName }) => {\n const text = `${error.message} (plugin: ${plugin?.name || 'unknown'}, hook: ${hookName || 'unknown'})`\n\n logger.emit('error', text, error)\n\n logger.emit('debug', {\n date: new Date(),\n category: 'error',\n pluginName: plugin.name,\n logs: [\n `✗ Hook '${hookName}' failed after ${duration}ms`,\n ` • Strategy: ${strategy}`,\n ` • Error: ${error.constructor.name} - ${error.message}`,\n ' • Stack Trace:',\n error.stack || 'No stack trace available',\n ' • Parameters:',\n JSON.stringify(parameters, null, 2),\n ],\n })\n })\n\n logger.emit('debug', {\n date: new Date(),\n category: 'setup',\n logs: ['✓ PluginManager initialized', ' • Concurrency: 5', ` • Total plugins: ${pluginManager.plugins.length}`],\n })\n\n return {\n logger,\n fabric,\n pluginManager,\n }\n}\n\nexport async function build(options: BuildOptions, overrides?: SetupResult): Promise<BuildOutput> {\n const { fabric, files, pluginManager, failedPlugins, pluginTimings, error } = await safeBuild(options, overrides)\n\n if (error) {\n throw error\n }\n\n return {\n failedPlugins,\n fabric,\n files,\n pluginManager,\n pluginTimings,\n error,\n }\n}\n\nexport async function safeBuild(options: BuildOptions, overrides?: SetupResult): Promise<BuildOutput> {\n const { fabric, pluginManager, logger } = overrides ? overrides : await setup(options)\n\n const failedPlugins = new Set<{ plugin: Plugin; error: Error }>()\n const pluginTimings = new Map<string, number>()\n const config = pluginManager.config\n\n try {\n for (const plugin of pluginManager.plugins) {\n const context = pluginManager.getContext(plugin)\n\n const installer = plugin.install.bind(context)\n\n try {\n const startTime = performance.now()\n const timestamp = new Date()\n\n // Start plugin group\n logger.emit('debug', {\n date: timestamp,\n pluginGroupMarker: 'start',\n pluginName: plugin.name,\n logs: [],\n })\n\n logger.emit('debug', {\n date: timestamp,\n category: 'plugin',\n pluginName: plugin.name,\n logs: ['Installing plugin...', ` • Plugin Key: ${JSON.stringify(plugin.key)}`],\n })\n\n await installer(context)\n\n const duration = Math.round(performance.now() - startTime)\n pluginTimings.set(plugin.name, duration)\n\n logger.emit('debug', {\n date: new Date(),\n category: 'plugin',\n pluginName: plugin.name,\n logs: [`✓ Plugin installed successfully (${duration}ms)`],\n })\n\n // End plugin group\n logger.emit('debug', {\n date: new Date(),\n pluginGroupMarker: 'end',\n pluginName: plugin.name,\n logs: [],\n })\n } catch (e) {\n const error = e as Error\n const errorTimestamp = new Date()\n\n logger.emit('debug', {\n date: errorTimestamp,\n category: 'error',\n pluginName: plugin.name,\n logs: [\n '✗ Plugin installation failed',\n ` • Plugin Key: ${JSON.stringify(plugin.key)}`,\n ` • Error: ${error.constructor.name} - ${error.message}`,\n ' • Stack Trace:',\n error.stack || 'No stack trace available',\n ],\n })\n\n // End plugin group even on error\n logger.emit('debug', {\n date: errorTimestamp,\n pluginGroupMarker: 'end',\n pluginName: plugin.name,\n logs: [],\n })\n\n failedPlugins.add({ plugin, error })\n }\n }\n\n if (config.output.barrelType) {\n const root = resolve(config.root)\n const rootPath = resolve(root, config.output.path, 'index.ts')\n\n logger.emit('debug', {\n date: new Date(),\n logs: ['Generating barrel file', ` • Type: ${config.output.barrelType}`, ` • Path: ${rootPath}`],\n })\n\n const barrelFiles = fabric.files.filter((file) => {\n return file.sources.some((source) => source.isIndexable)\n })\n\n logger.emit('debug', {\n date: new Date(),\n logs: [`Found ${barrelFiles.length} indexable files for barrel export`],\n })\n\n const rootFile: KubbFile.File = {\n path: rootPath,\n baseName: 'index.ts',\n exports: barrelFiles\n .flatMap((file) => {\n const containsOnlyTypes = file.sources?.every((source) => source.isTypeOnly)\n\n return file.sources\n ?.map((source) => {\n if (!file.path || !source.isIndexable) {\n return undefined\n }\n\n // validate of the file is coming from plugin x, needs pluginKey on every file TODO update typing\n const plugin = [...pluginManager.plugins].find((item) => {\n const meta = file.meta as any\n return isDeepEqual(item.key, meta?.pluginKey)\n })\n const pluginOptions = plugin?.options as { output?: Output<any> }\n\n if (!pluginOptions || pluginOptions?.output?.barrelType === false) {\n return undefined\n }\n\n return {\n name: config.output.barrelType === 'all' ? undefined : [source.name],\n path: getRelativePath(rootPath, file.path),\n isTypeOnly: config.output.barrelType === 'all' ? containsOnlyTypes : source.isTypeOnly,\n } as KubbFile.Export\n })\n .filter(Boolean)\n })\n .filter(Boolean),\n sources: [],\n meta: {},\n }\n\n await fabric.upsertFile(rootFile)\n\n logger.emit('debug', {\n date: new Date(),\n category: 'file',\n logs: [`✓ Generated barrel file (${rootFile.exports?.length || 0} exports)`],\n })\n }\n\n const files = [...fabric.files]\n\n await fabric.write({ extension: config.output.extension })\n\n return {\n failedPlugins,\n fabric,\n files,\n pluginManager,\n pluginTimings,\n }\n } catch (e) {\n return {\n failedPlugins,\n fabric,\n files: [],\n pluginManager,\n pluginTimings,\n error: e as Error,\n }\n }\n}\n","import type { PluginFactoryOptions, UserPluginWithLifeCycle } from './types.ts'\n\ntype PluginBuilder<T extends PluginFactoryOptions = PluginFactoryOptions> = (options: T['options']) => UserPluginWithLifeCycle<T>\n\n/**\n * Wraps a plugin builder to make the options parameter optional.\n */\nexport function definePlugin<T extends PluginFactoryOptions = PluginFactoryOptions>(\n build: PluginBuilder<T>,\n): (options?: T['options']) => UserPluginWithLifeCycle<T> {\n return (options) => build(options ?? ({} as T['options']))\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tif (queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t}\n\t};\n\n\tconst run = async (fn, resolve, args) => {\n\t\tactiveCount++;\n\n\t\tconst result = (async () => fn(...args))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (fn, resolve, args) => {\n\t\tqueue.enqueue(run.bind(undefined, fn, resolve, args));\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// when the run function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\t\tqueue.dequeue()();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (fn, ...args) => new Promise(resolve => {\n\t\tenqueue(fn, resolve, args);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue: () => {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n","import pLimit from 'p-limit';\n\nclass EndError extends Error {\n\tconstructor(value) {\n\t\tsuper();\n\t\tthis.value = value;\n\t}\n}\n\n// The input can also be a promise, so we await it.\nconst testElement = async (element, tester) => tester(await element);\n\n// The input can also be a promise, so we `Promise.all()` them both.\nconst finder = async element => {\n\tconst values = await Promise.all(element);\n\tif (values[1] === true) {\n\t\tthrow new EndError(values[0]);\n\t}\n\n\treturn false;\n};\n\nexport default async function pLocate(\n\titerable,\n\ttester,\n\t{\n\t\tconcurrency = Number.POSITIVE_INFINITY,\n\t\tpreserveOrder = true,\n\t} = {},\n) {\n\tconst limit = pLimit(concurrency);\n\n\t// Start all the promises concurrently with optional limit.\n\tconst items = [...iterable].map(element => [element, limit(testElement, element, tester)]);\n\n\t// Check the promises either serially or concurrently.\n\tconst checkLimit = pLimit(preserveOrder ? 1 : Number.POSITIVE_INFINITY);\n\n\ttry {\n\t\tawait Promise.all(items.map(element => checkLimit(finder, element)));\n\t} catch (error) {\n\t\tif (error instanceof EndError) {\n\t\t\treturn error.value;\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n","import process from 'node:process';\nimport path from 'node:path';\nimport fs, {promises as fsPromises} from 'node:fs';\nimport {fileURLToPath} from 'node:url';\nimport pLocate from 'p-locate';\n\nconst typeMappings = {\n\tdirectory: 'isDirectory',\n\tfile: 'isFile',\n};\n\nfunction checkType(type) {\n\tif (Object.hasOwnProperty.call(typeMappings, type)) {\n\t\treturn;\n\t}\n\n\tthrow new Error(`Invalid type specified: ${type}`);\n}\n\nconst matchType = (type, stat) => stat[typeMappings[type]]();\n\nconst toPath = urlOrPath => urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;\n\nexport async function locatePath(\n\tpaths,\n\t{\n\t\tcwd = process.cwd(),\n\t\ttype = 'file',\n\t\tallowSymlinks = true,\n\t\tconcurrency,\n\t\tpreserveOrder,\n\t} = {},\n) {\n\tcheckType(type);\n\tcwd = toPath(cwd);\n\n\tconst statFunction = allowSymlinks ? fsPromises.stat : fsPromises.lstat;\n\n\treturn pLocate(paths, async path_ => {\n\t\ttry {\n\t\t\tconst stat = await statFunction(path.resolve(cwd, path_));\n\t\t\treturn matchType(type, stat);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}, {concurrency, preserveOrder});\n}\n\nexport function locatePathSync(\n\tpaths,\n\t{\n\t\tcwd = process.cwd(),\n\t\ttype = 'file',\n\t\tallowSymlinks = true,\n\t} = {},\n) {\n\tcheckType(type);\n\tcwd = toPath(cwd);\n\n\tconst statFunction = allowSymlinks ? fs.statSync : fs.lstatSync;\n\n\tfor (const path_ of paths) {\n\t\ttry {\n\t\t\tconst stat = statFunction(path.resolve(cwd, path_), {\n\t\t\t\tthrowIfNoEntry: false,\n\t\t\t});\n\n\t\t\tif (!stat) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (matchType(type, stat)) {\n\t\t\t\treturn path_;\n\t\t\t}\n\t\t} catch {}\n\t}\n}\n","import {fileURLToPath} from 'node:url';\n\nexport function toPath(urlOrPath) {\n\treturn urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;\n}\n\nexport * from './default.js';\n","import path from 'node:path';\nimport {locatePath, locatePathSync} from 'locate-path';\nimport {toPath} from 'unicorn-magic';\n\nexport const findUpStop = Symbol('findUpStop');\n\nexport async function findUpMultiple(name, options = {}) {\n\tlet directory = path.resolve(toPath(options.cwd) ?? '');\n\tconst {root} = path.parse(directory);\n\tconst stopAt = path.resolve(directory, toPath(options.stopAt ?? root));\n\tconst limit = options.limit ?? Number.POSITIVE_INFINITY;\n\tconst paths = [name].flat();\n\n\tconst runMatcher = async locateOptions => {\n\t\tif (typeof name !== 'function') {\n\t\t\treturn locatePath(paths, locateOptions);\n\t\t}\n\n\t\tconst foundPath = await name(locateOptions.cwd);\n\t\tif (typeof foundPath === 'string') {\n\t\t\treturn locatePath([foundPath], locateOptions);\n\t\t}\n\n\t\treturn foundPath;\n\t};\n\n\tconst matches = [];\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst foundPath = await runMatcher({...options, cwd: directory});\n\n\t\tif (foundPath === findUpStop) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (foundPath) {\n\t\t\tmatches.push(path.resolve(directory, foundPath));\n\t\t}\n\n\t\tif (directory === stopAt || matches.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tdirectory = path.dirname(directory);\n\t}\n\n\treturn matches;\n}\n\nexport function findUpMultipleSync(name, options = {}) {\n\tlet directory = path.resolve(toPath(options.cwd) ?? '');\n\tconst {root} = path.parse(directory);\n\tconst stopAt = path.resolve(directory, toPath(options.stopAt) ?? root);\n\tconst limit = options.limit ?? Number.POSITIVE_INFINITY;\n\tconst paths = [name].flat();\n\n\tconst runMatcher = locateOptions => {\n\t\tif (typeof name !== 'function') {\n\t\t\treturn locatePathSync(paths, locateOptions);\n\t\t}\n\n\t\tconst foundPath = name(locateOptions.cwd);\n\t\tif (typeof foundPath === 'string') {\n\t\t\treturn locatePathSync([foundPath], locateOptions);\n\t\t}\n\n\t\treturn foundPath;\n\t};\n\n\tconst matches = [];\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\tconst foundPath = runMatcher({...options, cwd: directory});\n\n\t\tif (foundPath === findUpStop) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (foundPath) {\n\t\t\tmatches.push(path.resolve(directory, foundPath));\n\t\t}\n\n\t\tif (directory === stopAt || matches.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tdirectory = path.dirname(directory);\n\t}\n\n\treturn matches;\n}\n\nexport async function findUp(name, options = {}) {\n\tconst matches = await findUpMultiple(name, {...options, limit: 1});\n\treturn matches[0];\n}\n\nexport function findUpSync(name, options = {}) {\n\tconst matches = findUpMultipleSync(name, {...options, limit: 1});\n\treturn matches[0];\n}\n\nexport {\n\tpathExists,\n\tpathExistsSync,\n} from 'path-exists';\n","import mod from 'node:module'\nimport os from 'node:os'\nimport { pathToFileURL } from 'node:url'\n\nimport { findUp, findUpSync } from 'find-up'\nimport { coerce, satisfies } from 'semver'\n\nimport { read, readSync } from './fs/index.ts'\n\ntype PackageJSON = {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n}\n\ntype DependencyName = string\n\ntype DependencyVersion = string\n\nexport class PackageManager {\n static #cache: Record<DependencyName, DependencyVersion> = {}\n\n #cwd?: string\n #SLASHES = new Set(['/', '\\\\'])\n constructor(workspace?: string) {\n if (workspace) {\n this.#cwd = workspace\n }\n\n return this\n }\n\n set workspace(workspace: string) {\n this.#cwd = workspace\n }\n\n get workspace(): string | undefined {\n return this.#cwd\n }\n\n normalizeDirectory(directory: string): string {\n if (!this.#SLASHES.has(directory[directory.length - 1]!)) {\n return `${directory}/`\n }\n\n return directory\n }\n\n getLocation(path: string): string {\n let location = path\n\n if (this.#cwd) {\n const require = mod.createRequire(this.normalizeDirectory(this.#cwd))\n location = require.resolve(path)\n }\n\n return location\n }\n\n async import(path: string): Promise<any | undefined> {\n try {\n let location = this.getLocation(path)\n\n if (os.platform() === 'win32') {\n location = pathToFileURL(location).href\n }\n\n const module = await import(location)\n\n return module?.default ?? module\n } catch (e) {\n console.error(e)\n return undefined\n }\n }\n\n async getPackageJSON(): Promise<PackageJSON | undefined> {\n const pkgPath = await findUp(['package.json'], {\n cwd: this.#cwd,\n })\n if (!pkgPath) {\n return undefined\n }\n\n const json = await read(pkgPath)\n\n return JSON.parse(json) as PackageJSON\n }\n\n getPackageJSONSync(): PackageJSON | undefined {\n const pkgPath = findUpSync(['package.json'], {\n cwd: this.#cwd,\n })\n if (!pkgPath) {\n return undefined\n }\n\n const json = readSync(pkgPath)\n\n return JSON.parse(json) as PackageJSON\n }\n\n static setVersion(dependency: DependencyName, version: DependencyVersion): void {\n PackageManager.#cache[dependency] = version\n }\n\n #match(packageJSON: PackageJSON, dependency: DependencyName | RegExp): string | undefined {\n const dependencies = {\n ...(packageJSON['dependencies'] || {}),\n ...(packageJSON['devDependencies'] || {}),\n }\n\n if (typeof dependency === 'string' && dependencies[dependency]) {\n return dependencies[dependency]\n }\n\n const matchedDependency = Object.keys(dependencies).find((dep) => dep.match(dependency))\n\n return matchedDependency ? dependencies[matchedDependency] : undefined\n }\n\n async getVersion(dependency: DependencyName | RegExp): Promise<DependencyVersion | undefined> {\n if (typeof dependency === 'string' && PackageManager.#cache[dependency]) {\n return PackageManager.#cache[dependency]\n }\n\n const packageJSON = await this.getPackageJSON()\n\n if (!packageJSON) {\n return undefined\n }\n\n return this.#match(packageJSON, dependency)\n }\n\n getVersionSync(dependency: DependencyName | RegExp): DependencyVersion | undefined {\n if (typeof dependency === 'string' && PackageManager.#cache[dependency]) {\n return PackageManager.#cache[dependency]\n }\n\n const packageJSON = this.getPackageJSONSync()\n\n if (!packageJSON) {\n return undefined\n }\n\n return this.#match(packageJSON, dependency)\n }\n\n async isValid(dependency: DependencyName | RegExp, version: DependencyVersion): Promise<boolean> {\n const packageVersion = await this.getVersion(dependency)\n\n if (!packageVersion) {\n return false\n }\n\n if (packageVersion === version) {\n return true\n }\n\n const semVer = coerce(packageVersion)\n\n if (!semVer) {\n throw new Error(`${packageVersion} is not valid`)\n }\n\n return satisfies(semVer, version)\n }\n isValidSync(dependency: DependencyName | RegExp, version: DependencyVersion): boolean {\n const packageVersion = this.getVersionSync(dependency)\n\n if (!packageVersion) {\n return false\n }\n\n if (version === 'next' && packageVersion === version) {\n return true\n }\n\n const semVer = coerce(packageVersion)\n\n if (!semVer) {\n return false\n }\n\n return satisfies(semVer, version)\n }\n}\n"],"x_google_ignoreList":[9,10,11,12,13],"mappings":"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"}
|