@tschk/moonshine-deploy-bun 0.4.0 → 0.4.4

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/package.json +13 -7
  2. package/src/index.ts +22 -28
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tschk/moonshine-deploy-bun",
3
- "version": "0.4.0",
3
+ "version": "0.4.4",
4
4
  "license": "ISC",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -15,17 +15,23 @@
15
15
  "test": "bun test"
16
16
  },
17
17
  "dependencies": {
18
- "@tschk/moonshine-compiler": "^0.3.6",
19
- "@tschk/moonshine-framework": "^0.3.6",
20
- "@tschk/moonshine-react": "^0.3.6",
21
- "@tschk/moonshine-server": "^0.3.6"
18
+ "@tschk/moonshine-framework": "^0.4.4",
19
+ "@tschk/moonshine-server": "^0.4.4"
22
20
  },
23
21
  "devDependencies": {
24
22
  "@types/bun": "1.3.14",
25
23
  "typescript": "7.0.2",
26
- "@tschk/moonshine-adapter-conformance": "^0.3.6"
24
+ "@tschk/moonshine-adapter-conformance": "^0.4.4"
27
25
  },
28
26
  "files": [
29
27
  "src"
30
- ]
28
+ ],
29
+ "peerDependencies": {
30
+ "@tschk/moonshine-react": "^0.4.4"
31
+ },
32
+ "peerDependenciesMeta": {
33
+ "@tschk/moonshine-react": {
34
+ "optional": true
35
+ }
36
+ }
31
37
  }
package/src/index.ts CHANGED
@@ -1,10 +1,12 @@
1
- import { copyFile, mkdir, writeFile } from "node:fs/promises";
2
- import { dirname, isAbsolute, resolve } from "node:path";
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
3
  import {
4
4
  type DeploymentAdapter,
5
5
  type MoonshineManifest,
6
6
  type Harness,
7
7
  type HarnessFactory,
8
+ copyAsset,
9
+ validateRuntime,
8
10
  } from "@tschk/moonshine-framework";
9
11
  import { tryServeStatic } from "@tschk/moonshine-server";
10
12
 
@@ -29,7 +31,12 @@ export function createBunServer(options: BunServerOptions): BunServer {
29
31
  (request.method === "GET" || request.method === "HEAD") &&
30
32
  pathname !== "/"
31
33
  ) {
32
- const res = await tryServeStatic(options.staticDir, pathname);
34
+ const res = await tryServeStatic(
35
+ options.staticDir,
36
+ pathname,
37
+ undefined,
38
+ request.method,
39
+ );
33
40
  if (res) return res;
34
41
  }
35
42
  return options.fetch(request);
@@ -56,29 +63,12 @@ export const bunHarness: HarnessFactory = (fetch, options) => {
56
63
  } as Harness;
57
64
  };
58
65
 
59
- async function copyAsset(
60
- asset: MoonshineManifest["assets"][number],
61
- outDir: string,
62
- ): Promise<string> {
63
- const source = isAbsolute(asset.file)
64
- ? asset.file
65
- : resolve(outDir, asset.file);
66
- const target = resolve(
67
- outDir,
68
- (asset.path ?? asset.file).replace(/^\/+/, ""),
69
- );
70
- await mkdir(dirname(target), { recursive: true });
71
- if (source !== target) {
72
- await copyFile(source, target);
73
- }
74
- return (asset.path ?? asset.file).replace(/^\/+/, "");
75
- }
76
-
77
66
  export const bunAdapter: DeploymentAdapter = {
78
67
  name: "bun",
79
68
  runtimes: ["bun"],
80
69
  capabilities: ["streaming", "islands", "revalidation"],
81
70
  build: async (manifest, outDir) => {
71
+ validateRuntime(bunAdapter, manifest);
82
72
  await mkdir(outDir, { recursive: true });
83
73
  const assets: MoonshineManifest["assets"] = await Promise.all(
84
74
  manifest.assets.map(async (asset) => {
@@ -91,12 +81,16 @@ export const bunAdapter: DeploymentAdapter = {
91
81
  resolve(outDir, "manifest.json"),
92
82
  JSON.stringify(builtManifest, null, 2) + "\n",
93
83
  );
84
+ const native = manifest.renderer === "native";
85
+ const rendererImport = native
86
+ ? 'import { modules, renderer } from "./dist/server.js";'
87
+ : 'import { modules } from "./dist/server.js";\nimport { reactRenderer as renderer } from "@tschk/moonshine-react";';
94
88
  const entry = `import { createRequestHandler } from "@tschk/moonshine-server";
95
- import { reactRenderer } from "@tschk/moonshine-react";
96
89
  import { createBunServer } from "@tschk/moonshine-deploy-bun";
97
90
  import { resolve } from "node:path";
98
91
  import manifest from "./manifest.json" with { type: "json" };
99
- import { modules } from "./dist/server.js";
92
+ ${rendererImport}
93
+ ${manifest.requestContext ? 'import { requestScope } from "./dist/server.js";' : ""}
100
94
 
101
95
  const projectDir = resolve(import.meta.dir, "..");
102
96
  const abs = (p) => (p ? resolve(projectDir, p) : undefined);
@@ -113,15 +107,15 @@ const resolvedManifest = {
113
107
  };
114
108
 
115
109
  const fetch = createRequestHandler({
116
- manifest: resolvedManifest,
110
+ manifest: ${native ? "manifest" : "resolvedManifest"},
117
111
  modules,
118
- renderer: reactRenderer,
112
+ renderer,${manifest.requestContext ? "\n requestScope," : ""}
119
113
  staticDir: import.meta.dir + "/public",
120
114
  });
121
- const server = createBunServer({
115
+ const envPort = Number(process.env.PORT);
116
+ export const server = createBunServer({
122
117
  fetch,
123
- port: Number(process.env.PORT) || 0,
124
- staticDir: import.meta.dir + "/public",
118
+ port: Number.isInteger(envPort) && envPort >= 0 && envPort <= 65535 ? envPort : 0,
125
119
  });
126
120
  `;
127
121
  await writeFile(resolve(outDir, "server.ts"), entry);