@yaonyan/jsr2npm 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,596 @@
1
+ #!/usr/bin/env node
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+
25
+ // __yao__jsr2npm_latest/node_modules/@yao/jsr2npm/config.js
26
+ var import_promises = require("node:fs/promises");
27
+ var import_node_path = require("node:path");
28
+ var import_node_process = __toESM(require("node:process"), 1);
29
+ async function loadConfig(configPath) {
30
+ try {
31
+ const absolutePath = (0, import_node_path.resolve)(import_node_process.default.cwd(), configPath);
32
+ const content = await (0, import_promises.readFile)(absolutePath, "utf-8");
33
+ return JSON.parse(content);
34
+ } catch {
35
+ return null;
36
+ }
37
+ }
38
+
39
+ // __yao__jsr2npm_latest/node_modules/@yao/jsr2npm/converter.js
40
+ var import_dax_sh = __toESM(require("dax-sh"), 1);
41
+ var import_promises4 = require("node:fs/promises");
42
+ var import_node_path4 = require("node:path");
43
+ var import_node_fs = require("node:fs");
44
+ var import_node_process2 = __toESM(require("node:process"), 1);
45
+
46
+ // __yao__jsr2npm_latest/node_modules/@yao/jsr2npm/bundler.js
47
+ var import_promises2 = require("node:fs/promises");
48
+ var import_node_path2 = require("node:path");
49
+ var import_esbuild = require("esbuild");
50
+ async function bundleWithEsbuild(packageDir, inputFile, outputFile, externalPackages = [], useBrowserPlatform = false) {
51
+ const entryPath = (0, import_node_path2.join)(process.cwd(), packageDir, inputFile);
52
+ const baseName = outputFile.replace(/\.mjs$/, "");
53
+ const esmOutputPath = (0, import_node_path2.join)(process.cwd(), packageDir, "dist", `${baseName}.mjs`);
54
+ const cjsOutputPath = (0, import_node_path2.join)(process.cwd(), packageDir, "dist", `${baseName}.cjs`);
55
+ const outputDir = esmOutputPath.split("/").slice(0, -1).join("/");
56
+ await (0, import_promises2.mkdir)(outputDir, {
57
+ recursive: true
58
+ });
59
+ const externalList = externalPackages.length > 0 ? externalPackages.join(", ") : "none";
60
+ console.log(` \u{1F4E6} External packages: ${externalList}`);
61
+ const platform = useBrowserPlatform ? "neutral" : "node";
62
+ const esmBanner = useBrowserPlatform ? {} : {
63
+ js: `#!/usr/bin/env node
64
+ import { createRequire } from 'node:module';
65
+ const require = createRequire(import.meta.url);`
66
+ };
67
+ const cjsBanner = useBrowserPlatform ? {} : {
68
+ js: `#!/usr/bin/env node`
69
+ };
70
+ console.log(` \u{1F527} Platform: ${platform}${useBrowserPlatform ? " (browser)" : ""}`);
71
+ await (0, import_esbuild.build)({
72
+ entryPoints: [
73
+ entryPath
74
+ ],
75
+ bundle: true,
76
+ platform,
77
+ format: "esm",
78
+ outfile: esmOutputPath,
79
+ external: externalPackages,
80
+ packages: "bundle",
81
+ banner: esmBanner,
82
+ write: true
83
+ });
84
+ await (0, import_esbuild.build)({
85
+ entryPoints: [
86
+ entryPath
87
+ ],
88
+ bundle: true,
89
+ platform,
90
+ format: "cjs",
91
+ outfile: cjsOutputPath,
92
+ external: externalPackages,
93
+ packages: "bundle",
94
+ banner: cjsBanner,
95
+ write: true
96
+ });
97
+ console.log(` \u2705 Built ESM: ${baseName}.mjs`);
98
+ console.log(` \u2705 Built CJS: ${baseName}.cjs`);
99
+ }
100
+ async function copyTypeDeclarations(packageDir) {
101
+ console.log("\n\u{1F4DD} Copying TypeScript declarations...");
102
+ const sourceDir = (0, import_node_path2.join)(packageDir, "_dist");
103
+ const targetDir = (0, import_node_path2.join)(packageDir, "dist", "types");
104
+ try {
105
+ await (0, import_promises2.stat)(sourceDir);
106
+ await (0, import_promises2.mkdir)(targetDir, {
107
+ recursive: true
108
+ });
109
+ const entries = await (0, import_promises2.readdir)(sourceDir, {
110
+ withFileTypes: true
111
+ });
112
+ for (const entry of entries) {
113
+ const source = (0, import_node_path2.join)(sourceDir, entry.name);
114
+ const target = (0, import_node_path2.join)(targetDir, entry.name);
115
+ if (entry.isFile()) {
116
+ await (0, import_promises2.copyFile)(source, target);
117
+ } else if (entry.isDirectory()) {
118
+ await copyDirectory(source, target);
119
+ }
120
+ console.log(` \u2705 Copied ${entry.name}`);
121
+ }
122
+ console.log("\u2705 TypeScript declarations copied");
123
+ } catch {
124
+ console.warn("\u26A0\uFE0F No TypeScript declarations found");
125
+ }
126
+ }
127
+ async function copyDirectory(source, target) {
128
+ await (0, import_promises2.mkdir)(target, {
129
+ recursive: true
130
+ });
131
+ const entries = await (0, import_promises2.readdir)(source, {
132
+ withFileTypes: true
133
+ });
134
+ for (const entry of entries) {
135
+ const sourcePath = (0, import_node_path2.join)(source, entry.name);
136
+ const targetPath = (0, import_node_path2.join)(target, entry.name);
137
+ if (entry.isFile()) {
138
+ await (0, import_promises2.copyFile)(sourcePath, targetPath);
139
+ } else if (entry.isDirectory()) {
140
+ await copyDirectory(sourcePath, targetPath);
141
+ }
142
+ }
143
+ }
144
+
145
+ // __yao__jsr2npm_latest/node_modules/@yao/jsr2npm/package-generator.js
146
+ var import_promises3 = require("node:fs/promises");
147
+ var import_node_path3 = require("node:path");
148
+ async function generatePackageJson(packageDir, bin, overrides, allDependencies) {
149
+ console.log("\n\u{1F4CB} Generating package.json...");
150
+ const jsrPkg = await readPackageJson(`${packageDir}/package.json`);
151
+ const denoJson = await readDenoJson(packageDir);
152
+ const dependencies = allDependencies || getNpmDependencies(jsrPkg.dependencies);
153
+ const newPkg = buildPackageJson(jsrPkg, denoJson, dependencies, bin, overrides);
154
+ await (0, import_promises3.writeFile)((0, import_node_path3.join)(packageDir, "dist", "package.json"), JSON.stringify(newPkg, null, 2));
155
+ console.log(`\u2705 Generated package.json with ${Object.keys(dependencies).length} dependencies`);
156
+ }
157
+ async function readPackageJson(path) {
158
+ try {
159
+ const content = await (0, import_promises3.readFile)(path, "utf-8");
160
+ return JSON.parse(content);
161
+ } catch {
162
+ return {
163
+ name: "converted-package",
164
+ version: "1.0.0",
165
+ license: "MIT"
166
+ };
167
+ }
168
+ }
169
+ async function readDenoJson(packageDir) {
170
+ for (const file of [
171
+ "deno.json",
172
+ "deno.jsonc"
173
+ ]) {
174
+ try {
175
+ const content = await (0, import_promises3.readFile)((0, import_node_path3.join)(packageDir, file), "utf-8");
176
+ console.log(`\u2705 Found ${file}`);
177
+ return JSON.parse(content);
178
+ } catch {
179
+ continue;
180
+ }
181
+ }
182
+ return {};
183
+ }
184
+ function getNpmDependencies(deps) {
185
+ if (!deps || typeof deps !== "object") return {};
186
+ const npmDeps = {};
187
+ for (const [name, version] of Object.entries(deps)) {
188
+ if (!name.startsWith("@jsr/")) {
189
+ npmDeps[name] = String(version);
190
+ console.log(` \u{1F4CC} ${name}: ${version}`);
191
+ }
192
+ }
193
+ return npmDeps;
194
+ }
195
+ function buildPackageJson(jsrPkg, denoJson, dependencies, bin, overrides) {
196
+ const pkg = {
197
+ ...jsrPkg,
198
+ dependencies
199
+ };
200
+ delete pkg.type;
201
+ mergeMetadata(pkg, denoJson);
202
+ addBugsUrl(pkg);
203
+ delete pkg._jsr_revision;
204
+ delete pkg.devDependencies;
205
+ buildExports(pkg, denoJson, bin);
206
+ const originalName = String(jsrPkg.name || "package");
207
+ pkg.name = `@jsr2npm/${originalName.split("/").pop()}`;
208
+ applyOverrides(pkg, overrides);
209
+ return pkg;
210
+ }
211
+ function mergeMetadata(pkg, denoJson) {
212
+ const fields = [
213
+ "description",
214
+ "author",
215
+ "license",
216
+ "repository",
217
+ "keywords"
218
+ ];
219
+ for (const field of fields) {
220
+ if (denoJson[field] && !pkg[field]) {
221
+ pkg[field] = denoJson[field];
222
+ const extra = field === "keywords" ? ` (${denoJson[field].length} items)` : "";
223
+ console.log(` \u{1F4DD} Using ${field} from deno.json${extra}`);
224
+ }
225
+ }
226
+ }
227
+ function addBugsUrl(pkg) {
228
+ if (!pkg.repository || pkg.bugs) return;
229
+ const repoUrl = typeof pkg.repository === "string" ? pkg.repository : pkg.repository?.url;
230
+ if (!repoUrl) return;
231
+ const cleanUrl = repoUrl.replace(/^git\+/, "").replace(/\.git$/, "");
232
+ pkg.bugs = {
233
+ url: `${cleanUrl}/issues`
234
+ };
235
+ console.log(` \u{1F41B} Added bugs URL`);
236
+ }
237
+ function buildExports(pkg, denoJson, bin) {
238
+ if (bin && Object.keys(bin).length > 0) {
239
+ buildBinExports(pkg, bin);
240
+ } else if (denoJson.exports) {
241
+ buildLibraryExports(pkg, denoJson);
242
+ } else {
243
+ pkg.exports = {
244
+ "./types/*": "./types/*"
245
+ };
246
+ console.log(` \u26A0\uFE0F No exports found, only exposing types`);
247
+ }
248
+ }
249
+ function buildBinExports(pkg, bin) {
250
+ const binCommands = {};
251
+ const exports2 = {};
252
+ for (const cmdName of Object.keys(bin)) {
253
+ binCommands[cmdName] = `./bin/${cmdName}.mjs`;
254
+ exports2[`./bin/${cmdName}`] = {
255
+ import: `./bin/${cmdName}.mjs`,
256
+ require: `./bin/${cmdName}.cjs`
257
+ };
258
+ }
259
+ pkg.bin = binCommands;
260
+ const firstCmd = Object.keys(bin)[0];
261
+ exports2["."] = {
262
+ import: `./bin/${firstCmd}.mjs`,
263
+ require: `./bin/${firstCmd}.cjs`
264
+ };
265
+ pkg.exports = exports2;
266
+ pkg.main = `./bin/${firstCmd}.cjs`;
267
+ pkg.module = `./bin/${firstCmd}.mjs`;
268
+ console.log(` \u{1F527} Added bin commands: ${Object.keys(binCommands).join(", ")}`);
269
+ }
270
+ function buildLibraryExports(pkg, denoJson) {
271
+ const exports2 = {};
272
+ const denoExports = denoJson.exports;
273
+ for (const [key, value] of Object.entries(denoExports)) {
274
+ const tsPath = typeof value === "string" ? value : null;
275
+ if (!tsPath) continue;
276
+ const baseName = key === "." ? "index" : key.replace(/^\.\//, "");
277
+ const dtsFile = tsPath.replace(/\.ts$/, ".d.ts").replace(/^\.\//, "");
278
+ exports2[key] = {
279
+ types: `./types/${dtsFile}`,
280
+ import: `./${baseName}.mjs`,
281
+ require: `./${baseName}.cjs`
282
+ };
283
+ }
284
+ exports2["./types/*"] = "./types/*";
285
+ pkg.exports = exports2;
286
+ const mainExport = exports2["."];
287
+ if (mainExport) {
288
+ pkg.main = mainExport.require;
289
+ pkg.module = mainExport.import;
290
+ }
291
+ console.log(` \u{1F4E6} Built exports for ${Object.keys(denoExports).length} entry points (ESM + CJS)`);
292
+ }
293
+ function applyOverrides(pkg, overrides) {
294
+ if (!overrides) return;
295
+ const fields = [
296
+ "name",
297
+ "version",
298
+ "description",
299
+ "license",
300
+ "author",
301
+ "repository",
302
+ "homepage"
303
+ ];
304
+ for (const field of fields) {
305
+ const value = overrides[field];
306
+ if (value) {
307
+ pkg[field] = value;
308
+ console.log(` \u270F\uFE0F Overriding ${field}`);
309
+ }
310
+ }
311
+ if (overrides.keywords) {
312
+ pkg.keywords = overrides.keywords;
313
+ console.log(` \u270F\uFE0F Overriding keywords (${overrides.keywords.length} items)`);
314
+ }
315
+ if (overrides.scripts) {
316
+ const existingScripts = pkg.scripts || {};
317
+ pkg.scripts = {
318
+ ...existingScripts,
319
+ ...overrides.scripts
320
+ };
321
+ console.log(` \u270F\uFE0F Merging scripts`);
322
+ }
323
+ }
324
+ async function copyExtraFiles(sourceDir, targetDir) {
325
+ console.log("\n\u{1F4C4} Copying extra files...");
326
+ const files = [
327
+ "README.md",
328
+ "README",
329
+ "LICENSE",
330
+ "LICENSE.md"
331
+ ];
332
+ for (const file of files) {
333
+ try {
334
+ await (0, import_promises3.stat)((0, import_node_path3.join)(sourceDir, file));
335
+ await (0, import_promises3.copyFile)((0, import_node_path3.join)(sourceDir, file), (0, import_node_path3.join)(targetDir, file));
336
+ console.log(` \u2705 Copied ${file}`);
337
+ } catch {
338
+ }
339
+ }
340
+ }
341
+
342
+ // __yao__jsr2npm_latest/node_modules/@yao/jsr2npm/converter.js
343
+ async function convertPackage(packageName, version, bin, overrides, browser) {
344
+ console.log(`
345
+ \u{1F4E6} Package: ${packageName}`);
346
+ console.log(`\u{1F3F7}\uFE0F Version: ${version}`);
347
+ if (bin) {
348
+ console.log(`\u{1F527} CLI Commands: ${Object.keys(bin).join(", ")}`);
349
+ }
350
+ if (browser) {
351
+ console.log(`\u{1F310} Browser mode: enabled`);
352
+ }
353
+ const workspaceDir = createWorkspace(packageName, version);
354
+ const originalCwd = import_node_process2.default.cwd();
355
+ try {
356
+ import_node_process2.default.chdir(workspaceDir);
357
+ await installJSRPackage(packageName, version);
358
+ const packageDir = (0, import_node_path4.join)("node_modules", packageName);
359
+ await (0, import_promises4.mkdir)((0, import_node_path4.join)(packageDir, "dist"), {
360
+ recursive: true
361
+ });
362
+ const { externals, allDependencies } = await getExternalPackages(packageDir, overrides);
363
+ await bundlePackage(packageDir, bin, externals, browser);
364
+ await copyTypeDeclarations(packageDir);
365
+ await copyExtraFiles(packageDir, `${packageDir}/dist`);
366
+ await generatePackageJson(packageDir, bin, overrides, allDependencies);
367
+ await moveDistToRoot(packageDir);
368
+ console.log("\n\u2705 Conversion completed!");
369
+ console.log(`\u{1F4C2} Output: ${workspaceDir}/dist`);
370
+ } finally {
371
+ import_node_process2.default.chdir(originalCwd);
372
+ }
373
+ }
374
+ function createWorkspace(packageName, version) {
375
+ const folderName = packageName.replace(/[@\/]/g, "__") + `_${version}`;
376
+ (0, import_node_fs.mkdirSync)(folderName, {
377
+ recursive: true
378
+ });
379
+ console.log(`\u{1F4C1} Created folder: ${folderName}`);
380
+ return folderName;
381
+ }
382
+ async function getExternalPackages(packageDir, overrides) {
383
+ try {
384
+ const content = await (0, import_promises4.readFile)((0, import_node_path4.join)(packageDir, "package.json"), "utf-8");
385
+ const pkgJson = JSON.parse(content);
386
+ const userDependencies = overrides?.dependencies || {};
387
+ if (!pkgJson.dependencies && Object.keys(userDependencies).length === 0) {
388
+ return {
389
+ externals: [],
390
+ allDependencies: {}
391
+ };
392
+ }
393
+ const topLevelDeps = {};
394
+ if (pkgJson.dependencies) {
395
+ for (const [name, version] of Object.entries(pkgJson.dependencies)) {
396
+ if (!name.startsWith("@jsr/")) {
397
+ topLevelDeps[name] = String(version);
398
+ }
399
+ }
400
+ }
401
+ for (const [name, version] of Object.entries(userDependencies)) {
402
+ topLevelDeps[name] = version;
403
+ }
404
+ const jsrPackages = pkgJson.dependencies ? Object.keys(pkgJson.dependencies).filter((name) => name.startsWith("@jsr/")) : [];
405
+ const conflictingPackages = await findConflictingPackages(packageDir, jsrPackages, topLevelDeps);
406
+ const externals = Object.keys(topLevelDeps).filter((name) => !conflictingPackages.has(name));
407
+ const externalList = externals.join(", ") || "none";
408
+ console.log(`
409
+ \u{1F4E6} External dependencies (${externals.length}): ${externalList}`);
410
+ if (Object.keys(userDependencies).length > 0) {
411
+ const userDepsList = Object.keys(userDependencies).join(", ");
412
+ console.log(`\u{1F4DD} User-configured dependencies: ${userDepsList}`);
413
+ }
414
+ if (conflictingPackages.size > 0) {
415
+ const conflictList = Array.from(conflictingPackages).join(", ");
416
+ console.log(`\u26A0\uFE0F Version conflicts, will bundle: ${conflictList}`);
417
+ }
418
+ return {
419
+ externals,
420
+ allDependencies: topLevelDeps
421
+ };
422
+ } catch {
423
+ return {
424
+ externals: [],
425
+ allDependencies: {}
426
+ };
427
+ }
428
+ }
429
+ async function findConflictingPackages(packageDir, jsrPackages, topLevelDeps) {
430
+ const conflicts = /* @__PURE__ */ new Set();
431
+ const parts = packageDir.split(/[\/\\]/);
432
+ const nodeModulesIndex = parts.indexOf("node_modules");
433
+ const rootNodeModules = parts.slice(0, nodeModulesIndex + 1).join("/");
434
+ for (const jsrPkg of jsrPackages) {
435
+ try {
436
+ const jsrPkgPath = (0, import_node_path4.join)(rootNodeModules, jsrPkg, "package.json");
437
+ const jsrContent = await (0, import_promises4.readFile)(jsrPkgPath, "utf-8");
438
+ const jsrPkgJson = JSON.parse(jsrContent);
439
+ if (!jsrPkgJson.dependencies) continue;
440
+ for (const [depName, depVersion] of Object.entries(jsrPkgJson.dependencies)) {
441
+ if (depName.startsWith("@jsr/")) continue;
442
+ if (topLevelDeps[depName]) {
443
+ if (topLevelDeps[depName] !== depVersion) {
444
+ conflicts.add(depName);
445
+ console.log(` \u26A0\uFE0F Version conflict for ${depName}:`);
446
+ console.log(` Top-level: ${topLevelDeps[depName]}`);
447
+ console.log(` ${jsrPkg}: ${depVersion}`);
448
+ }
449
+ } else {
450
+ topLevelDeps[depName] = String(depVersion);
451
+ }
452
+ }
453
+ } catch {
454
+ continue;
455
+ }
456
+ }
457
+ return conflicts;
458
+ }
459
+ async function bundlePackage(packageDir, bin, externalPackages, browser) {
460
+ if (bin) {
461
+ await bundleBinCommands(packageDir, bin, externalPackages, browser);
462
+ } else {
463
+ await bundleLibraryExports(packageDir, externalPackages, browser);
464
+ }
465
+ }
466
+ async function bundleBinCommands(packageDir, bin, externalPackages, browser) {
467
+ console.log("\n\u{1F528} Bundling CLI tools...");
468
+ for (const [cmdName, inputFile] of Object.entries(bin)) {
469
+ await verifyEntrypoint(packageDir, inputFile);
470
+ const outputFile = `bin/${cmdName}.mjs`;
471
+ await bundleWithEsbuild(packageDir, inputFile, outputFile, externalPackages, browser || false);
472
+ const outputPath = (0, import_node_path4.join)(packageDir, "dist", outputFile);
473
+ await (0, import_promises4.chmod)(outputPath, 493);
474
+ console.log(` \u2705 Created ${cmdName}: ${outputFile}`);
475
+ }
476
+ }
477
+ async function bundleLibraryExports(packageDir, externalPackages, browser) {
478
+ const exports2 = await readDenoJsonExports(packageDir);
479
+ if (!exports2) return;
480
+ console.log("\n\u{1F528} Bundling library exports...");
481
+ for (const [exportKey, inputFile] of Object.entries(exports2)) {
482
+ await verifyEntrypoint(packageDir, inputFile);
483
+ const outputFile = exportKey === "." ? "index.mjs" : `${exportKey.replace(/^\.\//, "")}.mjs`;
484
+ await bundleWithEsbuild(packageDir, inputFile, outputFile, externalPackages, browser || false);
485
+ console.log(` \u2705 Bundled ${exportKey}: ${outputFile}`);
486
+ }
487
+ }
488
+ async function installJSRPackage(packageName, version) {
489
+ await (0, import_promises4.writeFile)("package.json", "{}");
490
+ const packageSpec = version === "latest" ? packageName : `${packageName}@${version}`;
491
+ console.log(`\u{1F504} Installing: ${packageSpec}`);
492
+ await import_dax_sh.default`npx jsr add ${packageSpec}`.cwd(import_node_process2.default.cwd());
493
+ }
494
+ async function verifyEntrypoint(packageDir, entrypoint) {
495
+ try {
496
+ await (0, import_promises4.stat)((0, import_node_path4.join)(packageDir, entrypoint));
497
+ console.log(`\u2705 Found ${entrypoint}`);
498
+ } catch {
499
+ throw new Error(`\u274C ${entrypoint} not found in ${packageDir}`);
500
+ }
501
+ }
502
+ async function readDenoJsonExports(packageDir) {
503
+ for (const file of [
504
+ "deno.json",
505
+ "deno.jsonc"
506
+ ]) {
507
+ try {
508
+ const content = await (0, import_promises4.readFile)((0, import_node_path4.join)(packageDir, file), "utf-8");
509
+ const denoJson = JSON.parse(content);
510
+ if (!denoJson.exports) continue;
511
+ const exports2 = {};
512
+ for (const [key, value] of Object.entries(denoJson.exports)) {
513
+ const path = typeof value === "string" ? value : null;
514
+ if (path?.endsWith(".ts")) {
515
+ exports2[key] = path;
516
+ }
517
+ }
518
+ return Object.keys(exports2).length > 0 ? exports2 : null;
519
+ } catch {
520
+ continue;
521
+ }
522
+ }
523
+ return null;
524
+ }
525
+ async function moveDistToRoot(packageDir) {
526
+ const sourceDist = (0, import_node_path4.join)(packageDir, "dist");
527
+ const targetDist = (0, import_node_path4.join)(import_node_process2.default.cwd(), "dist");
528
+ try {
529
+ await (0, import_promises4.rm)(targetDist, {
530
+ recursive: true
531
+ });
532
+ } catch {
533
+ }
534
+ await (0, import_promises4.rename)(sourceDist, targetDist);
535
+ await copyExtraFiles(packageDir, targetDist);
536
+ }
537
+
538
+ // __yao__jsr2npm_latest/node_modules/@yao/jsr2npm/cli.ts
539
+ var import_meta = {};
540
+ async function main() {
541
+ console.log("\u{1F680} JSR to NPM Package Converter\n");
542
+ const configFile = process.argv[2] || "jsr2npm.config.json";
543
+ const config = await loadConfig(configFile);
544
+ if (!config?.packages?.length) {
545
+ console.error("\u274C No packages found in jsr2npm.config.json");
546
+ console.log("\n\u{1F4A1} Create a jsr2npm.config.json file with your packages:");
547
+ console.log(`
548
+ {
549
+ "packages": [
550
+ {
551
+ "name": "@scope/package",
552
+ "version": "1.0.0",
553
+ "bin": {
554
+ "your-command": "src/bin.ts"
555
+ },
556
+ "packageJson": {
557
+ "name": "@myorg/custom-name",
558
+ "description": "Package description"
559
+ }
560
+ }
561
+ ]
562
+ }
563
+ `);
564
+ process.exit(1);
565
+ }
566
+ console.log(`\u{1F4CB} Found ${config.packages.length} package(s) in config
567
+ `);
568
+ for (const pkg of config.packages) {
569
+ console.log(`
570
+ ${"=".repeat(60)}`);
571
+ console.log(`Converting: ${pkg.name}@${pkg.version}`);
572
+ console.log("=".repeat(60));
573
+ try {
574
+ await convertPackage(
575
+ pkg.name,
576
+ pkg.version,
577
+ pkg.bin,
578
+ pkg.packageJson,
579
+ pkg.browser
580
+ );
581
+ } catch (error) {
582
+ console.error(
583
+ `
584
+ \u274C Failed to convert ${pkg.name}:`,
585
+ error instanceof Error ? error.message : String(error)
586
+ );
587
+ }
588
+ }
589
+ console.log(`
590
+ ${"=".repeat(60)}`);
591
+ console.log("\u2705 All packages processed!");
592
+ console.log("=".repeat(60));
593
+ }
594
+ if (import_meta.main) {
595
+ main().catch(console.error);
596
+ }
package/bin/jsr2npm.mjs CHANGED
@@ -21,6 +21,7 @@ import $ from "dax-sh";
21
21
  import { chmod, mkdir as mkdir2, readFile as readFile3, rename, rm, stat as stat3, writeFile as writeFile2 } from "node:fs/promises";
22
22
  import { join as join3 } from "node:path";
23
23
  import { mkdirSync } from "node:fs";
24
+ import process3 from "node:process";
24
25
 
25
26
  // __yao__jsr2npm_latest/node_modules/@yao/jsr2npm/bundler.js
26
27
  import { copyFile, mkdir, readdir, stat } from "node:fs/promises";
@@ -28,19 +29,24 @@ import { join } from "node:path";
28
29
  import { build } from "esbuild";
29
30
  async function bundleWithEsbuild(packageDir, inputFile, outputFile, externalPackages = [], useBrowserPlatform = false) {
30
31
  const entryPath = join(process.cwd(), packageDir, inputFile);
31
- const outputPath = join(process.cwd(), packageDir, "dist", outputFile);
32
- const outputDir = outputPath.split("/").slice(0, -1).join("/");
32
+ const baseName = outputFile.replace(/\.mjs$/, "");
33
+ const esmOutputPath = join(process.cwd(), packageDir, "dist", `${baseName}.mjs`);
34
+ const cjsOutputPath = join(process.cwd(), packageDir, "dist", `${baseName}.cjs`);
35
+ const outputDir = esmOutputPath.split("/").slice(0, -1).join("/");
33
36
  await mkdir(outputDir, {
34
37
  recursive: true
35
38
  });
36
39
  const externalList = externalPackages.length > 0 ? externalPackages.join(", ") : "none";
37
40
  console.log(` \u{1F4E6} External packages: ${externalList}`);
38
41
  const platform = useBrowserPlatform ? "neutral" : "node";
39
- const banner = useBrowserPlatform ? {} : {
42
+ const esmBanner = useBrowserPlatform ? {} : {
40
43
  js: `#!/usr/bin/env node
41
44
  import { createRequire } from 'node:module';
42
45
  const require = createRequire(import.meta.url);`
43
46
  };
47
+ const cjsBanner = useBrowserPlatform ? {} : {
48
+ js: `#!/usr/bin/env node`
49
+ };
44
50
  console.log(` \u{1F527} Platform: ${platform}${useBrowserPlatform ? " (browser)" : ""}`);
45
51
  await build({
46
52
  entryPoints: [
@@ -49,12 +55,27 @@ const require = createRequire(import.meta.url);`
49
55
  bundle: true,
50
56
  platform,
51
57
  format: "esm",
52
- outfile: outputPath,
58
+ outfile: esmOutputPath,
59
+ external: externalPackages,
60
+ packages: "bundle",
61
+ banner: esmBanner,
62
+ write: true
63
+ });
64
+ await build({
65
+ entryPoints: [
66
+ entryPath
67
+ ],
68
+ bundle: true,
69
+ platform,
70
+ format: "cjs",
71
+ outfile: cjsOutputPath,
53
72
  external: externalPackages,
54
73
  packages: "bundle",
55
- banner,
74
+ banner: cjsBanner,
56
75
  write: true
57
76
  });
77
+ console.log(` \u2705 Built ESM: ${baseName}.mjs`);
78
+ console.log(` \u2705 Built CJS: ${baseName}.cjs`);
58
79
  }
59
80
  async function copyTypeDeclarations(packageDir) {
60
81
  console.log("\n\u{1F4DD} Copying TypeScript declarations...");
@@ -154,9 +175,9 @@ function getNpmDependencies(deps) {
154
175
  function buildPackageJson(jsrPkg, denoJson, dependencies, bin, overrides) {
155
176
  const pkg = {
156
177
  ...jsrPkg,
157
- type: "module",
158
178
  dependencies
159
179
  };
180
+ delete pkg.type;
160
181
  mergeMetadata(pkg, denoJson);
161
182
  addBugsUrl(pkg);
162
183
  delete pkg._jsr_revision;
@@ -210,13 +231,20 @@ function buildBinExports(pkg, bin) {
210
231
  const exports = {};
211
232
  for (const cmdName of Object.keys(bin)) {
212
233
  binCommands[cmdName] = `./bin/${cmdName}.mjs`;
213
- exports[`./bin/${cmdName}`] = `./bin/${cmdName}.mjs`;
234
+ exports[`./bin/${cmdName}`] = {
235
+ import: `./bin/${cmdName}.mjs`,
236
+ require: `./bin/${cmdName}.cjs`
237
+ };
214
238
  }
215
239
  pkg.bin = binCommands;
216
240
  const firstCmd = Object.keys(bin)[0];
217
- exports["."] = `./bin/${firstCmd}.mjs`;
241
+ exports["."] = {
242
+ import: `./bin/${firstCmd}.mjs`,
243
+ require: `./bin/${firstCmd}.cjs`
244
+ };
218
245
  pkg.exports = exports;
219
- pkg.main = `./bin/${firstCmd}.mjs`;
246
+ pkg.main = `./bin/${firstCmd}.cjs`;
247
+ pkg.module = `./bin/${firstCmd}.mjs`;
220
248
  console.log(` \u{1F527} Added bin commands: ${Object.keys(binCommands).join(", ")}`);
221
249
  }
222
250
  function buildLibraryExports(pkg, denoJson) {
@@ -225,20 +253,22 @@ function buildLibraryExports(pkg, denoJson) {
225
253
  for (const [key, value] of Object.entries(denoExports)) {
226
254
  const tsPath = typeof value === "string" ? value : null;
227
255
  if (!tsPath) continue;
228
- const mjsFile = key === "." ? "index.mjs" : `${key.replace(/^\.\//, "")}.mjs`;
256
+ const baseName = key === "." ? "index" : key.replace(/^\.\//, "");
229
257
  const dtsFile = tsPath.replace(/\.ts$/, ".d.ts").replace(/^\.\//, "");
230
258
  exports[key] = {
231
259
  types: `./types/${dtsFile}`,
232
- import: `./${mjsFile}`
260
+ import: `./${baseName}.mjs`,
261
+ require: `./${baseName}.cjs`
233
262
  };
234
263
  }
235
264
  exports["./types/*"] = "./types/*";
236
265
  pkg.exports = exports;
237
266
  const mainExport = exports["."];
238
- if (mainExport && typeof mainExport === "object" && "import" in mainExport) {
239
- pkg.main = mainExport.import;
267
+ if (mainExport) {
268
+ pkg.main = mainExport.require;
269
+ pkg.module = mainExport.import;
240
270
  }
241
- console.log(` \u{1F4E6} Built exports for ${Object.keys(denoExports).length} entry points`);
271
+ console.log(` \u{1F4E6} Built exports for ${Object.keys(denoExports).length} entry points (ESM + CJS)`);
242
272
  }
243
273
  function applyOverrides(pkg, overrides) {
244
274
  if (!overrides) return;
@@ -301,15 +331,15 @@ async function convertPackage(packageName, version, bin, overrides, browser) {
301
331
  console.log(`\u{1F310} Browser mode: enabled`);
302
332
  }
303
333
  const workspaceDir = createWorkspace(packageName, version);
304
- const originalCwd = process.cwd();
334
+ const originalCwd = process3.cwd();
305
335
  try {
306
- process.chdir(workspaceDir);
336
+ process3.chdir(workspaceDir);
307
337
  await installJSRPackage(packageName, version);
308
338
  const packageDir = join3("node_modules", packageName);
309
339
  await mkdir2(join3(packageDir, "dist"), {
310
340
  recursive: true
311
341
  });
312
- const { externals, allDependencies } = await getExternalPackages(packageDir);
342
+ const { externals, allDependencies } = await getExternalPackages(packageDir, overrides);
313
343
  await bundlePackage(packageDir, bin, externals, browser);
314
344
  await copyTypeDeclarations(packageDir);
315
345
  await copyExtraFiles(packageDir, `${packageDir}/dist`);
@@ -318,7 +348,7 @@ async function convertPackage(packageName, version, bin, overrides, browser) {
318
348
  console.log("\n\u2705 Conversion completed!");
319
349
  console.log(`\u{1F4C2} Output: ${workspaceDir}/dist`);
320
350
  } finally {
321
- process.chdir(originalCwd);
351
+ process3.chdir(originalCwd);
322
352
  }
323
353
  }
324
354
  function createWorkspace(packageName, version) {
@@ -329,26 +359,38 @@ function createWorkspace(packageName, version) {
329
359
  console.log(`\u{1F4C1} Created folder: ${folderName}`);
330
360
  return folderName;
331
361
  }
332
- async function getExternalPackages(packageDir) {
362
+ async function getExternalPackages(packageDir, overrides) {
333
363
  try {
334
364
  const content = await readFile3(join3(packageDir, "package.json"), "utf-8");
335
365
  const pkgJson = JSON.parse(content);
336
- if (!pkgJson.dependencies) return {
337
- externals: [],
338
- allDependencies: {}
339
- };
366
+ const userDependencies = overrides?.dependencies || {};
367
+ if (!pkgJson.dependencies && Object.keys(userDependencies).length === 0) {
368
+ return {
369
+ externals: [],
370
+ allDependencies: {}
371
+ };
372
+ }
340
373
  const topLevelDeps = {};
341
- for (const [name, version] of Object.entries(pkgJson.dependencies)) {
342
- if (!name.startsWith("@jsr/")) {
343
- topLevelDeps[name] = String(version);
374
+ if (pkgJson.dependencies) {
375
+ for (const [name, version] of Object.entries(pkgJson.dependencies)) {
376
+ if (!name.startsWith("@jsr/")) {
377
+ topLevelDeps[name] = String(version);
378
+ }
344
379
  }
345
380
  }
346
- const jsrPackages = Object.keys(pkgJson.dependencies).filter((name) => name.startsWith("@jsr/"));
381
+ for (const [name, version] of Object.entries(userDependencies)) {
382
+ topLevelDeps[name] = version;
383
+ }
384
+ const jsrPackages = pkgJson.dependencies ? Object.keys(pkgJson.dependencies).filter((name) => name.startsWith("@jsr/")) : [];
347
385
  const conflictingPackages = await findConflictingPackages(packageDir, jsrPackages, topLevelDeps);
348
386
  const externals = Object.keys(topLevelDeps).filter((name) => !conflictingPackages.has(name));
349
387
  const externalList = externals.join(", ") || "none";
350
388
  console.log(`
351
389
  \u{1F4E6} External dependencies (${externals.length}): ${externalList}`);
390
+ if (Object.keys(userDependencies).length > 0) {
391
+ const userDepsList = Object.keys(userDependencies).join(", ");
392
+ console.log(`\u{1F4DD} User-configured dependencies: ${userDepsList}`);
393
+ }
352
394
  if (conflictingPackages.size > 0) {
353
395
  const conflictList = Array.from(conflictingPackages).join(", ");
354
396
  console.log(`\u26A0\uFE0F Version conflicts, will bundle: ${conflictList}`);
@@ -427,7 +469,7 @@ async function installJSRPackage(packageName, version) {
427
469
  await writeFile2("package.json", "{}");
428
470
  const packageSpec = version === "latest" ? packageName : `${packageName}@${version}`;
429
471
  console.log(`\u{1F504} Installing: ${packageSpec}`);
430
- await $`npx jsr add ${packageSpec}`.cwd(process.cwd());
472
+ await $`npx jsr add ${packageSpec}`.cwd(process3.cwd());
431
473
  }
432
474
  async function verifyEntrypoint(packageDir, entrypoint) {
433
475
  try {
@@ -462,7 +504,7 @@ async function readDenoJsonExports(packageDir) {
462
504
  }
463
505
  async function moveDistToRoot(packageDir) {
464
506
  const sourceDist = join3(packageDir, "dist");
465
- const targetDist = join3(process.cwd(), "dist");
507
+ const targetDist = join3(process3.cwd(), "dist");
466
508
  try {
467
509
  await rm(targetDist, {
468
510
  recursive: true
package/package.json CHANGED
@@ -1,15 +1,20 @@
1
1
  {
2
2
  "name": "@yaonyan/jsr2npm",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "homepage": "https://jsr.io/@yao/jsr2npm",
5
- "type": "module",
6
5
  "dependencies": {
7
6
  "dax-sh": "^0.43.2",
8
7
  "esbuild": "^0.25.10"
9
8
  },
10
9
  "exports": {
11
- "./bin/jsr2npm": "./bin/jsr2npm.mjs",
12
- ".": "./bin/jsr2npm.mjs"
10
+ "./bin/jsr2npm": {
11
+ "import": "./bin/jsr2npm.mjs",
12
+ "require": "./bin/jsr2npm.cjs"
13
+ },
14
+ ".": {
15
+ "import": "./bin/jsr2npm.mjs",
16
+ "require": "./bin/jsr2npm.cjs"
17
+ }
13
18
  },
14
19
  "license": "MIT",
15
20
  "repository": {
@@ -22,5 +27,6 @@
22
27
  "bin": {
23
28
  "jsr2npm": "./bin/jsr2npm.mjs"
24
29
  },
25
- "main": "./bin/jsr2npm.mjs"
30
+ "main": "./bin/jsr2npm.cjs",
31
+ "module": "./bin/jsr2npm.mjs"
26
32
  }