@b9g/shovel 0.2.0-beta.0 → 0.2.0-beta.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/bin/cli.js +80 -29
- package/package.json +8 -8
package/bin/cli.js
CHANGED
|
@@ -24,10 +24,61 @@ import * as Platform from "@b9g/platform";
|
|
|
24
24
|
// src/esbuild/watcher.ts
|
|
25
25
|
import * as ESBuild from "esbuild";
|
|
26
26
|
import { watch } from "fs";
|
|
27
|
-
import { resolve, dirname, join } from "path";
|
|
27
|
+
import { resolve, dirname as dirname2, join } from "path";
|
|
28
28
|
import { readFileSync } from "fs";
|
|
29
29
|
import { mkdir } from "fs/promises";
|
|
30
30
|
import { assetsPlugin } from "@b9g/assets/plugin";
|
|
31
|
+
|
|
32
|
+
// src/esbuild/import-meta-plugin.ts
|
|
33
|
+
import { readFile } from "fs/promises";
|
|
34
|
+
import { dirname } from "path";
|
|
35
|
+
import { pathToFileURL } from "url";
|
|
36
|
+
function importMetaPlugin() {
|
|
37
|
+
return {
|
|
38
|
+
name: "import-meta-transform",
|
|
39
|
+
setup(build3) {
|
|
40
|
+
build3.onLoad({ filter: /\.[jt]sx?$/, namespace: "file" }, async (args) => {
|
|
41
|
+
if (args.path.includes("node_modules")) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const contents = await readFile(args.path, "utf8");
|
|
45
|
+
if (!contents.includes("import.meta.url") && !contents.includes("import.meta.dirname") && !contents.includes("import.meta.filename")) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const fileUrl = pathToFileURL(args.path).href;
|
|
49
|
+
const fileDirname = dirname(args.path);
|
|
50
|
+
const fileFilename = args.path;
|
|
51
|
+
let transformed = contents;
|
|
52
|
+
transformed = transformed.replace(
|
|
53
|
+
/\bimport\.meta\.url\b/g,
|
|
54
|
+
JSON.stringify(fileUrl)
|
|
55
|
+
);
|
|
56
|
+
transformed = transformed.replace(
|
|
57
|
+
/\bimport\.meta\.dirname\b/g,
|
|
58
|
+
JSON.stringify(fileDirname)
|
|
59
|
+
);
|
|
60
|
+
transformed = transformed.replace(
|
|
61
|
+
/\bimport\.meta\.filename\b/g,
|
|
62
|
+
JSON.stringify(fileFilename)
|
|
63
|
+
);
|
|
64
|
+
const ext = args.path.split(".").pop();
|
|
65
|
+
let loader = "js";
|
|
66
|
+
if (ext === "ts")
|
|
67
|
+
loader = "ts";
|
|
68
|
+
else if (ext === "tsx")
|
|
69
|
+
loader = "tsx";
|
|
70
|
+
else if (ext === "jsx")
|
|
71
|
+
loader = "jsx";
|
|
72
|
+
return {
|
|
73
|
+
contents: transformed,
|
|
74
|
+
loader
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// src/esbuild/watcher.ts
|
|
31
82
|
import { getLogger } from "@logtape/logtape";
|
|
32
83
|
var logger = getLogger(["watcher"]);
|
|
33
84
|
var Watcher = class {
|
|
@@ -44,7 +95,7 @@ var Watcher = class {
|
|
|
44
95
|
async start() {
|
|
45
96
|
const entryPath = resolve(this.#options.entrypoint);
|
|
46
97
|
await this.#build();
|
|
47
|
-
const watchDir =
|
|
98
|
+
const watchDir = dirname2(entryPath);
|
|
48
99
|
logger.info("Watching for changes", { watchDir });
|
|
49
100
|
this.#watcher = watch(
|
|
50
101
|
watchDir,
|
|
@@ -88,7 +139,7 @@ var Watcher = class {
|
|
|
88
139
|
const version = Date.now();
|
|
89
140
|
const initialCwd = process.cwd();
|
|
90
141
|
let workspaceRoot = initialCwd;
|
|
91
|
-
while (workspaceRoot !==
|
|
142
|
+
while (workspaceRoot !== dirname2(workspaceRoot)) {
|
|
92
143
|
try {
|
|
93
144
|
const packageJSON = JSON.parse(
|
|
94
145
|
readFileSync(resolve(workspaceRoot, "package.json"), "utf8")
|
|
@@ -98,9 +149,9 @@ var Watcher = class {
|
|
|
98
149
|
}
|
|
99
150
|
} catch {
|
|
100
151
|
}
|
|
101
|
-
workspaceRoot =
|
|
152
|
+
workspaceRoot = dirname2(workspaceRoot);
|
|
102
153
|
}
|
|
103
|
-
if (workspaceRoot ===
|
|
154
|
+
if (workspaceRoot === dirname2(workspaceRoot)) {
|
|
104
155
|
workspaceRoot = initialCwd;
|
|
105
156
|
}
|
|
106
157
|
logger.info("Building", { entryPath });
|
|
@@ -117,6 +168,7 @@ var Watcher = class {
|
|
|
117
168
|
packages: "external",
|
|
118
169
|
absWorkingDir: workspaceRoot,
|
|
119
170
|
plugins: [
|
|
171
|
+
importMetaPlugin(),
|
|
120
172
|
assetsPlugin({
|
|
121
173
|
outputDir: `${outputDir}/assets`,
|
|
122
174
|
manifest: `${outputDir}/server/asset-manifest.json`
|
|
@@ -303,14 +355,10 @@ async function infoCommand() {
|
|
|
303
355
|
|
|
304
356
|
// src/commands/build.ts
|
|
305
357
|
import * as ESBuild2 from "esbuild";
|
|
306
|
-
import { resolve as resolve2, join as join2, dirname as
|
|
307
|
-
import { mkdir as mkdir2, readFile, writeFile } from "fs/promises";
|
|
358
|
+
import { resolve as resolve2, join as join2, dirname as dirname3 } from "path";
|
|
359
|
+
import { mkdir as mkdir2, readFile as readFile2, writeFile } from "fs/promises";
|
|
308
360
|
import { fileURLToPath } from "url";
|
|
309
361
|
import { assetsPlugin as assetsPlugin2 } from "@b9g/assets/plugin";
|
|
310
|
-
import {
|
|
311
|
-
cloudflareWorkerBanner,
|
|
312
|
-
cloudflareWorkerFooter
|
|
313
|
-
} from "@b9g/platform-cloudflare";
|
|
314
362
|
import { configure as configure2, getConsoleSink as getConsoleSink2, getLogger as getLogger5 } from "@logtape/logtape";
|
|
315
363
|
import { AsyncContext as AsyncContext2 } from "@b9g/async-context";
|
|
316
364
|
await configure2({
|
|
@@ -390,7 +438,7 @@ async function initializeBuild({
|
|
|
390
438
|
const entryPath = resolve2(entrypoint);
|
|
391
439
|
const outputDir = resolve2(outDir);
|
|
392
440
|
try {
|
|
393
|
-
const stats = await
|
|
441
|
+
const stats = await readFile2(entryPath, "utf8");
|
|
394
442
|
if (stats.length === 0) {
|
|
395
443
|
logger5.warn("Entry point is empty", { entryPath });
|
|
396
444
|
}
|
|
@@ -433,37 +481,37 @@ async function initializeBuild({
|
|
|
433
481
|
}
|
|
434
482
|
async function findWorkspaceRoot() {
|
|
435
483
|
let workspaceRoot = process.cwd();
|
|
436
|
-
while (workspaceRoot !==
|
|
484
|
+
while (workspaceRoot !== dirname3(workspaceRoot)) {
|
|
437
485
|
try {
|
|
438
486
|
const packageJSON = JSON.parse(
|
|
439
|
-
await
|
|
487
|
+
await readFile2(resolve2(workspaceRoot, "package.json"), "utf8")
|
|
440
488
|
);
|
|
441
489
|
if (packageJSON.workspaces) {
|
|
442
490
|
return workspaceRoot;
|
|
443
491
|
}
|
|
444
492
|
} catch {
|
|
445
493
|
}
|
|
446
|
-
workspaceRoot =
|
|
494
|
+
workspaceRoot = dirname3(workspaceRoot);
|
|
447
495
|
}
|
|
448
496
|
return workspaceRoot;
|
|
449
497
|
}
|
|
450
498
|
async function findShovelPackageRoot() {
|
|
451
|
-
let currentDir =
|
|
499
|
+
let currentDir = dirname3(fileURLToPath(import.meta.url));
|
|
452
500
|
let packageRoot = currentDir;
|
|
453
|
-
while (packageRoot !==
|
|
501
|
+
while (packageRoot !== dirname3(packageRoot)) {
|
|
454
502
|
try {
|
|
455
503
|
const packageJSONPath = join2(packageRoot, "package.json");
|
|
456
|
-
const content = await
|
|
504
|
+
const content = await readFile2(packageJSONPath, "utf8");
|
|
457
505
|
const pkg2 = JSON.parse(content);
|
|
458
506
|
if (pkg2.name === "@b9g/shovel" || pkg2.name === "shovel") {
|
|
459
507
|
if (packageRoot.endsWith("/dist") || packageRoot.endsWith("\\dist")) {
|
|
460
|
-
return
|
|
508
|
+
return dirname3(packageRoot);
|
|
461
509
|
}
|
|
462
510
|
return packageRoot;
|
|
463
511
|
}
|
|
464
512
|
} catch {
|
|
465
513
|
}
|
|
466
|
-
packageRoot =
|
|
514
|
+
packageRoot = dirname3(packageRoot);
|
|
467
515
|
}
|
|
468
516
|
return currentDir;
|
|
469
517
|
}
|
|
@@ -492,10 +540,11 @@ async function createBuildConfig({
|
|
|
492
540
|
target: BUILD_DEFAULTS.target,
|
|
493
541
|
platform: "node",
|
|
494
542
|
outfile: join2(serverDir, "server.js"),
|
|
495
|
-
absWorkingDir: workspaceRoot ||
|
|
543
|
+
absWorkingDir: workspaceRoot || dirname3(entryPath),
|
|
496
544
|
mainFields: ["module", "main"],
|
|
497
545
|
conditions: ["import", "module"],
|
|
498
546
|
plugins: [
|
|
547
|
+
importMetaPlugin(),
|
|
499
548
|
assetsPlugin2({
|
|
500
549
|
outputDir: assetsDir,
|
|
501
550
|
manifest: join2(serverDir, "asset-manifest.json")
|
|
@@ -559,10 +608,11 @@ async function createBuildConfig({
|
|
|
559
608
|
serverDir,
|
|
560
609
|
isCloudflare ? "server.js" : BUILD_DEFAULTS.outputFile
|
|
561
610
|
),
|
|
562
|
-
absWorkingDir: workspaceRoot ||
|
|
611
|
+
absWorkingDir: workspaceRoot || dirname3(entryPath),
|
|
563
612
|
mainFields: ["module", "main"],
|
|
564
613
|
conditions: ["import", "module"],
|
|
565
614
|
plugins: isCloudflare ? [
|
|
615
|
+
importMetaPlugin(),
|
|
566
616
|
assetsPlugin2({
|
|
567
617
|
outputDir: assetsDir,
|
|
568
618
|
manifest: join2(serverDir, "asset-manifest.json")
|
|
@@ -587,6 +637,7 @@ async function createBuildConfig({
|
|
|
587
637
|
}
|
|
588
638
|
}
|
|
589
639
|
async function configureCloudflareTarget(buildConfig) {
|
|
640
|
+
const { cloudflareWorkerBanner, cloudflareWorkerFooter } = await import("@b9g/platform-cloudflare");
|
|
590
641
|
buildConfig.platform = "browser";
|
|
591
642
|
buildConfig.conditions = ["worker", "browser"];
|
|
592
643
|
buildConfig.banner = { js: cloudflareWorkerBanner };
|
|
@@ -603,20 +654,20 @@ import "${userEntryPath}";
|
|
|
603
654
|
return await createWorkerEntry(userEntryPath, workerCount, platform);
|
|
604
655
|
}
|
|
605
656
|
async function createWorkerEntry(userEntryPath, workerCount, platform) {
|
|
606
|
-
let currentDir =
|
|
657
|
+
let currentDir = dirname3(fileURLToPath(import.meta.url));
|
|
607
658
|
let packageRoot = currentDir;
|
|
608
|
-
while (packageRoot !==
|
|
659
|
+
while (packageRoot !== dirname3(packageRoot)) {
|
|
609
660
|
try {
|
|
610
661
|
const packageJSONPath = join2(packageRoot, "package.json");
|
|
611
|
-
await
|
|
662
|
+
await readFile2(packageJSONPath, "utf8");
|
|
612
663
|
break;
|
|
613
664
|
} catch {
|
|
614
|
-
packageRoot =
|
|
665
|
+
packageRoot = dirname3(packageRoot);
|
|
615
666
|
}
|
|
616
667
|
}
|
|
617
668
|
let templatePath = join2(packageRoot, "src/worker-entry.ts");
|
|
618
669
|
try {
|
|
619
|
-
await
|
|
670
|
+
await readFile2(templatePath, "utf8");
|
|
620
671
|
} catch {
|
|
621
672
|
templatePath = join2(packageRoot, "src/worker-entry.js");
|
|
622
673
|
}
|
|
@@ -645,10 +696,10 @@ async function logBundleAnalysis(metafile) {
|
|
|
645
696
|
}
|
|
646
697
|
}
|
|
647
698
|
async function generatePackageJSON({ serverDir, platform, verbose, entryPath }) {
|
|
648
|
-
const entryDir =
|
|
699
|
+
const entryDir = dirname3(entryPath);
|
|
649
700
|
const sourcePackageJsonPath = resolve2(entryDir, "package.json");
|
|
650
701
|
try {
|
|
651
|
-
const packageJSONContent = await
|
|
702
|
+
const packageJSONContent = await readFile2(sourcePackageJsonPath, "utf8");
|
|
652
703
|
try {
|
|
653
704
|
JSON.parse(packageJSONContent);
|
|
654
705
|
} catch (parseError) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@b9g/shovel",
|
|
3
|
-
"version": "0.2.0-beta.
|
|
3
|
+
"version": "0.2.0-beta.2",
|
|
4
4
|
"description": "ServiceWorker-first universal deployment platform. Write ServiceWorker apps once, deploy anywhere (Node/Bun/Cloudflare). Registry-based multi-app orchestration.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"bin": {
|
|
@@ -21,16 +21,16 @@
|
|
|
21
21
|
"source-map": "^0.7.4"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@b9g/assets": "^0.1.
|
|
24
|
+
"@b9g/assets": "^0.1.6",
|
|
25
25
|
"@b9g/cache": "^0.1.4",
|
|
26
26
|
"@b9g/crank": "^0.7.2",
|
|
27
27
|
"@b9g/filesystem": "^0.1.5",
|
|
28
28
|
"@b9g/http-errors": "^0.1.4",
|
|
29
29
|
"@b9g/libuild": "^0.1.17",
|
|
30
|
-
"@b9g/platform": "^0.1.
|
|
31
|
-
"@b9g/platform-bun": "^0.1.
|
|
30
|
+
"@b9g/platform": "^0.1.6",
|
|
31
|
+
"@b9g/platform-bun": "^0.1.6",
|
|
32
32
|
"@b9g/platform-cloudflare": "^0.1.5",
|
|
33
|
-
"@b9g/platform-node": "^0.1.
|
|
33
|
+
"@b9g/platform-node": "^0.1.8",
|
|
34
34
|
"@b9g/router": "^0.1.6",
|
|
35
35
|
"@types/bun": "^1.2.2",
|
|
36
36
|
"mitata": "^1.0.34",
|
|
@@ -38,10 +38,10 @@
|
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"@b9g/node-webworker": "^0.1.3",
|
|
41
|
-
"@b9g/platform": "^0.1.
|
|
42
|
-
"@b9g/platform-node": "^0.1.
|
|
41
|
+
"@b9g/platform": "^0.1.6",
|
|
42
|
+
"@b9g/platform-node": "^0.1.8",
|
|
43
43
|
"@b9g/platform-cloudflare": "^0.1.5",
|
|
44
|
-
"@b9g/platform-bun": "^0.1.
|
|
44
|
+
"@b9g/platform-bun": "^0.1.6",
|
|
45
45
|
"@b9g/cache": "^0.1.4",
|
|
46
46
|
"@b9g/filesystem": "^0.1.5",
|
|
47
47
|
"@b9g/http-errors": "^0.1.4"
|