@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.
Files changed (2) hide show
  1. package/bin/cli.js +80 -29
  2. 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 = dirname(entryPath);
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 !== dirname(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 = dirname(workspaceRoot);
152
+ workspaceRoot = dirname2(workspaceRoot);
102
153
  }
103
- if (workspaceRoot === dirname(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 dirname2 } from "path";
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 readFile(entryPath, "utf8");
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 !== dirname2(workspaceRoot)) {
484
+ while (workspaceRoot !== dirname3(workspaceRoot)) {
437
485
  try {
438
486
  const packageJSON = JSON.parse(
439
- await readFile(resolve2(workspaceRoot, "package.json"), "utf8")
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 = dirname2(workspaceRoot);
494
+ workspaceRoot = dirname3(workspaceRoot);
447
495
  }
448
496
  return workspaceRoot;
449
497
  }
450
498
  async function findShovelPackageRoot() {
451
- let currentDir = dirname2(fileURLToPath(import.meta.url));
499
+ let currentDir = dirname3(fileURLToPath(import.meta.url));
452
500
  let packageRoot = currentDir;
453
- while (packageRoot !== dirname2(packageRoot)) {
501
+ while (packageRoot !== dirname3(packageRoot)) {
454
502
  try {
455
503
  const packageJSONPath = join2(packageRoot, "package.json");
456
- const content = await readFile(packageJSONPath, "utf8");
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 dirname2(packageRoot);
508
+ return dirname3(packageRoot);
461
509
  }
462
510
  return packageRoot;
463
511
  }
464
512
  } catch {
465
513
  }
466
- packageRoot = dirname2(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 || dirname2(entryPath),
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 || dirname2(entryPath),
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 = dirname2(fileURLToPath(import.meta.url));
657
+ let currentDir = dirname3(fileURLToPath(import.meta.url));
607
658
  let packageRoot = currentDir;
608
- while (packageRoot !== dirname2(packageRoot)) {
659
+ while (packageRoot !== dirname3(packageRoot)) {
609
660
  try {
610
661
  const packageJSONPath = join2(packageRoot, "package.json");
611
- await readFile(packageJSONPath, "utf8");
662
+ await readFile2(packageJSONPath, "utf8");
612
663
  break;
613
664
  } catch {
614
- packageRoot = dirname2(packageRoot);
665
+ packageRoot = dirname3(packageRoot);
615
666
  }
616
667
  }
617
668
  let templatePath = join2(packageRoot, "src/worker-entry.ts");
618
669
  try {
619
- await readFile(templatePath, "utf8");
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 = dirname2(entryPath);
699
+ const entryDir = dirname3(entryPath);
649
700
  const sourcePackageJsonPath = resolve2(entryDir, "package.json");
650
701
  try {
651
- const packageJSONContent = await readFile(sourcePackageJsonPath, "utf8");
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.0",
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.5",
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.5",
31
- "@b9g/platform-bun": "^0.1.5",
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.7",
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.5",
42
- "@b9g/platform-node": "^0.1.7",
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.5",
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"