@torpor/adapter-cloudflare 0.0.33 → 0.2.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # @torpor/adapter-cloudflare
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 51dbba7: Chore: drop CJS build and go ESM only
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [bbdc8d3]
12
+ - Updated dependencies [e1ae2bb]
13
+ - Updated dependencies [51dbba7]
14
+ - Updated dependencies [62b0d2e]
15
+ - @torpor/build@0.3.0
16
+
17
+ ## 0.1.0
18
+
19
+ ### Minor Changes
20
+
21
+ - b716d5c: Feat: inline styles during SSR
22
+
23
+ ### Patch Changes
24
+
25
+ - Updated dependencies [a4f2573]
26
+ - Updated dependencies [67e6ca6]
27
+ - Updated dependencies [b716d5c]
28
+ - @torpor/build@0.2.0
29
+
3
30
  ## 0.0.33
4
31
 
5
32
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
- import { Adapter } from '@torpor/build';
1
+ import { Adapter } from "@torpor/build";
2
2
 
3
+ //#region src/adapter.d.ts
3
4
  declare const _default: Adapter;
4
-
5
+ //#endregion
5
6
  export { _default as cloudflare };
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/adapter.ts"],"sourcesContent":[],"mappings":";;;cAMA,UAKuB"}
package/dist/index.js CHANGED
@@ -1,81 +1,73 @@
1
- // src/adapter.ts
2
- import { promises as fs } from "fs";
3
- import path from "path";
1
+ import { promises } from "node:fs";
2
+ import path from "node:path";
4
3
  import { build, defineConfig } from "vite";
5
4
 
6
- // src/prepareTemplate.ts
5
+ //#region src/prepareTemplate.ts
7
6
  function prepareTemplate(template, clientScript) {
8
- let contentStart = regexIndexOf(template, /\<div\s+id=("app"|'app'|app)\s+/);
9
- contentStart = template.indexOf(">", contentStart) + 1;
10
- let contentEnd = template.indexOf("</div>", contentStart);
11
- if (contentStart === -1 || contentEnd === -1) {
12
- throw new Error(`Couldn't find <div id="app"></div>`);
13
- }
14
- return template.substring(0, contentStart) + "%COMPONENT_HTML%" + template.substring(contentEnd) + `<script type="module" src="${clientScript}"></script>`;
7
+ let result = template;
8
+ let headStart = result.indexOf("</head>");
9
+ if (headStart === -1) throw new Error(`Couldn't find <head> end tag`);
10
+ result = result.substring(0, headStart) + "%COMPONENT_HEAD%" + result.substring(headStart);
11
+ let bodyStart = regexIndexOf(result, /<div\s+id=("app"|'app'|app)\s+/);
12
+ bodyStart = result.indexOf(">", bodyStart) + 1;
13
+ let bodyEnd = result.indexOf("</div>", bodyStart);
14
+ if (bodyStart === -1 || bodyEnd === -1) throw new Error(`Couldn't find <div id="app"></div>`);
15
+ result = result.substring(0, bodyStart) + "%COMPONENT_BODY%" + result.substring(bodyEnd);
16
+ result += `<script type="module" src="${clientScript}"><\/script>`;
17
+ return result;
15
18
  }
16
19
  function regexIndexOf(string, regex, position) {
17
- var indexOf = string.substring(position || 0).search(regex);
18
- return indexOf >= 0 ? indexOf + (position || 0) : indexOf;
20
+ var indexOf = string.substring(position || 0).search(regex);
21
+ return indexOf >= 0 ? indexOf + (position || 0) : indexOf;
19
22
  }
20
23
 
21
- // src/adapter.ts
24
+ //#endregion
25
+ //#region src/adapter.ts
22
26
  var adapter_default = {
23
- postbuild,
24
- serve: () => {
25
- console.log("TODO: Cloudflare dev server");
26
- }
27
+ postbuild,
28
+ serve: () => {
29
+ console.log("TODO: Cloudflare dev server");
30
+ }
27
31
  };
28
32
  async function postbuild(site) {
29
- const distFolder = path.resolve(site.root, "dist");
30
- const clientFolder = path.join(distFolder, "client");
31
- const serverFolder = path.join(distFolder, "server");
32
- const tempFolder = path.join(distFolder, "temp");
33
- const cloudflareFolder = path.join(distFolder, "cloudflare");
34
- const buildSrcFolder = path.resolve(site.root, "./node_modules/@torpor/build/src/");
35
- const adapterSrcFolder = path.resolve(
36
- site.root,
37
- "./node_modules/@torpor/adapter-cloudflare/src/"
38
- );
39
- let workerFile = path.join(adapterSrcFolder, "_worker.ts");
40
- let workerSource = await fs.readFile(workerFile, "utf-8");
41
- let clientScript = (await fs.readdir(path.join(clientFolder, "assets"))).find(
42
- (f) => f.startsWith("clientEntry-")
43
- );
44
- if (!clientScript) {
45
- throw new Error("clientEntry.js not found");
46
- }
47
- clientScript = `/assets/${clientScript}`;
48
- let siteHtml = path.join(clientFolder, "site.html");
49
- let template = await fs.readFile(siteHtml, "utf-8");
50
- template = prepareTemplate(template, clientScript);
51
- const serverClass = path.join(buildSrcFolder, "server", "Server.ts");
52
- const serverScript = path.join(serverFolder, "serverEntry.js");
53
- workerSource = workerSource.replace("%SERVER_CLASS%", serverClass).replace("%SERVER_SCRIPT%", serverScript).replace("%HTML_TEMPLATE%", template);
54
- workerFile = path.join(tempFolder, "_worker.ts");
55
- await fs.mkdir(tempFolder);
56
- await fs.writeFile(workerFile, workerSource);
57
- const cloudflareConfig = structuredClone(site.viteConfig ?? {});
58
- cloudflareConfig.build ??= {};
59
- cloudflareConfig.build.outDir = cloudflareFolder;
60
- cloudflareConfig.build.rollupOptions ??= {};
61
- cloudflareConfig.build.rollupOptions.input = [workerFile, ...site.inputs];
62
- cloudflareConfig.build.rollupOptions.output = {
63
- entryFileNames: `[name].js`,
64
- chunkFileNames: `[name].js`,
65
- assetFileNames: `[name].[ext]`
66
- };
67
- cloudflareConfig.build.rollupOptions.preserveEntrySignatures = "strict";
68
- cloudflareConfig.build.minify = false;
69
- cloudflareConfig.build.ssr = true;
70
- await build(defineConfig(cloudflareConfig));
71
- await fs.mkdir(path.join(cloudflareFolder, "assets"));
72
- for (let file of await fs.readdir(path.join(clientFolder, "assets"))) {
73
- await fs.copyFile(
74
- path.join(clientFolder, "assets", file),
75
- path.join(cloudflareFolder, "assets", file)
76
- );
77
- }
78
- const wranglerConfig = `
33
+ const distFolder = path.resolve(site.root, "dist");
34
+ const clientFolder = path.join(distFolder, "client");
35
+ const serverFolder = path.join(distFolder, "server");
36
+ const tempFolder = path.join(distFolder, "temp");
37
+ const cloudflareFolder = path.join(distFolder, "cloudflare");
38
+ const buildSrcFolder = path.resolve(site.root, "./node_modules/@torpor/build/src/");
39
+ const adapterSrcFolder = path.resolve(site.root, "./node_modules/@torpor/adapter-cloudflare/src/");
40
+ let workerFile = path.join(adapterSrcFolder, "_worker.ts");
41
+ let workerSource = await promises.readFile(workerFile, "utf-8");
42
+ let clientScript = (await promises.readdir(path.join(clientFolder, "assets"))).find((f) => f.startsWith("clientEntry-"));
43
+ if (!clientScript) throw new Error("clientEntry.js not found");
44
+ clientScript = `/assets/${clientScript}`;
45
+ let siteHtml = path.join(clientFolder, "site.html");
46
+ let template = await promises.readFile(siteHtml, "utf-8");
47
+ template = prepareTemplate(template, clientScript);
48
+ const serverClass = path.join(buildSrcFolder, "server", "Server.ts");
49
+ const serverScript = path.join(serverFolder, "serverEntry.js");
50
+ workerSource = workerSource.replace("%SERVER_CLASS%", serverClass).replace("%SERVER_SCRIPT%", serverScript).replace("%HTML_TEMPLATE%", template);
51
+ workerFile = path.join(tempFolder, "_worker.ts");
52
+ await promises.mkdir(tempFolder);
53
+ await promises.writeFile(workerFile, workerSource);
54
+ const cloudflareConfig = structuredClone(site.viteConfig ?? {});
55
+ cloudflareConfig.build ??= {};
56
+ cloudflareConfig.build.outDir = cloudflareFolder;
57
+ cloudflareConfig.build.rollupOptions ??= {};
58
+ cloudflareConfig.build.rollupOptions.input = [workerFile, ...site.inputs];
59
+ cloudflareConfig.build.rollupOptions.output = {
60
+ entryFileNames: `[name].js`,
61
+ chunkFileNames: `[name].js`,
62
+ assetFileNames: `[name].[ext]`
63
+ };
64
+ cloudflareConfig.build.rollupOptions.preserveEntrySignatures = "strict";
65
+ cloudflareConfig.build.minify = false;
66
+ cloudflareConfig.build.ssr = true;
67
+ await build(defineConfig(cloudflareConfig));
68
+ await promises.mkdir(path.join(cloudflareFolder, "assets"));
69
+ for (let file of await promises.readdir(path.join(clientFolder, "assets"))) await promises.copyFile(path.join(clientFolder, "assets", file), path.join(cloudflareFolder, "assets", file));
70
+ const wranglerConfig = `
79
71
  name = "torpor-miniflare"
80
72
  main = "./cloudflare/_worker.js"
81
73
  compatibility_date = "2025-01-01"
@@ -84,19 +76,19 @@ compatibility_date = "2025-01-01"
84
76
  directory = "./cloudflare"
85
77
  binding = "ASSETS"
86
78
  `;
87
- const wranglerFile = path.join(distFolder, "wrangler.toml");
88
- await fs.writeFile(wranglerFile, wranglerConfig);
89
- const assetsIgnore = `
79
+ const wranglerFile = path.join(distFolder, "wrangler.toml");
80
+ await promises.writeFile(wranglerFile, wranglerConfig);
81
+ const assetsIgnore = `
90
82
  **/node_modules
91
83
  **/.DS_Store
92
84
  **/.git
93
85
  _worker.js
94
86
  `;
95
- const assetsIgnoreFile = path.join(cloudflareFolder, ".assetsignore");
96
- await fs.writeFile(assetsIgnoreFile, assetsIgnore);
97
- await fs.rm(tempFolder, { recursive: true });
87
+ const assetsIgnoreFile = path.join(cloudflareFolder, ".assetsignore");
88
+ await promises.writeFile(assetsIgnoreFile, assetsIgnore);
89
+ await promises.rm(tempFolder, { recursive: true });
98
90
  }
99
- export {
100
- adapter_default as cloudflare
101
- };
91
+
92
+ //#endregion
93
+ export { adapter_default as cloudflare };
102
94
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter.ts","../src/prepareTemplate.ts"],"sourcesContent":["import { type Adapter, Site } from \"@torpor/build\";\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { build, defineConfig } from \"vite\";\nimport prepareTemplate from \"./prepareTemplate\";\n\nexport default {\n\tpostbuild,\n\tserve: (/* server: Server, site: Site*/) => {\n\t\tconsole.log(\"TODO: Cloudflare dev server\");\n\t},\n} satisfies Adapter as Adapter;\n\nasync function postbuild(site: Site): Promise<void> {\n\t// Build _worker.js as per\n\t// https://developers.cloudflare.com/pages/functions/advanced-mode/\n\n\tconst distFolder = path.resolve(site.root, \"dist\");\n\tconst clientFolder = path.join(distFolder, \"client\");\n\tconst serverFolder = path.join(distFolder, \"server\");\n\tconst tempFolder = path.join(distFolder, \"temp\");\n\tconst cloudflareFolder = path.join(distFolder, \"cloudflare\");\n\n\t// TODO: Is this going to be the correct path after installing from npm?\n\tconst buildSrcFolder = path.resolve(site.root, \"./node_modules/@torpor/build/src/\");\n\tconst adapterSrcFolder = path.resolve(\n\t\tsite.root,\n\t\t\"./node_modules/@torpor/adapter-cloudflare/src/\",\n\t);\n\n\t// Compile _worker.ts\n\tlet workerFile = path.join(adapterSrcFolder, \"_worker.ts\");\n\tlet workerSource = await fs.readFile(workerFile, \"utf-8\");\n\n\t// Find the client script file in /assets\n\tlet clientScript = (await fs.readdir(path.join(clientFolder, \"assets\"))).find((f) =>\n\t\tf.startsWith(\"clientEntry-\"),\n\t);\n\tif (!clientScript) {\n\t\tthrow new Error(\"clientEntry.js not found\");\n\t}\n\tclientScript = `/assets/${clientScript}`;\n\n\t// Read and prepare site.html so that we can just splice components into it\n\tlet siteHtml = path.join(clientFolder, \"site.html\");\n\tlet template = await fs.readFile(siteHtml, \"utf-8\");\n\ttemplate = prepareTemplate(template, clientScript);\n\n\tconst serverClass = path.join(buildSrcFolder, \"server\", \"Server.ts\");\n\tconst serverScript = path.join(serverFolder, \"serverEntry.js\");\n\n\t// Splice file names into _worker.ts\n\tworkerSource = workerSource\n\t\t.replace(\"%SERVER_CLASS%\", serverClass)\n\t\t.replace(\"%SERVER_SCRIPT%\", serverScript)\n\t\t.replace(\"%HTML_TEMPLATE%\", template);\n\n\tworkerFile = path.join(tempFolder, \"_worker.ts\");\n\tawait fs.mkdir(tempFolder);\n\tawait fs.writeFile(workerFile, workerSource);\n\n\tconst cloudflareConfig = structuredClone(site.viteConfig ?? {});\n\tcloudflareConfig.build ??= {};\n\tcloudflareConfig.build.outDir = cloudflareFolder;\n\tcloudflareConfig.build.rollupOptions ??= {};\n\tcloudflareConfig.build.rollupOptions.input = [workerFile, ...site.inputs];\n\tcloudflareConfig.build.rollupOptions.output = {\n\t\tentryFileNames: `[name].js`,\n\t\tchunkFileNames: `[name].js`,\n\t\tassetFileNames: `[name].[ext]`,\n\t};\n\tcloudflareConfig.build.rollupOptions.preserveEntrySignatures = \"strict\";\n\t// HACK: We don't need to minify as the worker isn't downloaded?\n\t// And it makes debugging easier\n\tcloudflareConfig.build.minify = false;\n\t// HACK: Build for SSR so we don't get document and window references\n\tcloudflareConfig.build.ssr = true;\n\tawait build(defineConfig(cloudflareConfig));\n\n\t// Copy the client assets into the Cloudflare folder\n\tawait fs.mkdir(path.join(cloudflareFolder, \"assets\"));\n\tfor (let file of await fs.readdir(path.join(clientFolder, \"assets\"))) {\n\t\tawait fs.copyFile(\n\t\t\tpath.join(clientFolder, \"assets\", file),\n\t\t\tpath.join(cloudflareFolder, \"assets\", file),\n\t\t);\n\t}\n\n\t// Build a wrangler.toml file for running with `wrangler dev`\n\tconst wranglerConfig = `\nname = \"torpor-miniflare\"\nmain = \"./cloudflare/_worker.js\"\ncompatibility_date = \"2025-01-01\"\n\n[assets]\ndirectory = \"./cloudflare\"\nbinding = \"ASSETS\"\n\t`;\n\tconst wranglerFile = path.join(distFolder, \"wrangler.toml\");\n\tawait fs.writeFile(wranglerFile, wranglerConfig);\n\n\t// Build a .assetsignore file\n\tconst assetsIgnore = `\n**/node_modules\n**/.DS_Store\n**/.git\n_worker.js\n`;\n\tconst assetsIgnoreFile = path.join(cloudflareFolder, \".assetsignore\");\n\tawait fs.writeFile(assetsIgnoreFile, assetsIgnore);\n\n\tawait fs.rm(tempFolder, { recursive: true });\n}\n","export default function prepareTemplate(template: string, clientScript: string): string {\n\tlet contentStart = regexIndexOf(template, /\\<div\\s+id=(\"app\"|'app'|app)\\s+/);\n\tcontentStart = template.indexOf(\">\", contentStart) + 1;\n\tlet contentEnd = template.indexOf(\"</div>\", contentStart);\n\tif (contentStart === -1 || contentEnd === -1) {\n\t\tthrow new Error(`Couldn't find <div id=\"app\"></div>`);\n\t}\n\treturn (\n\t\ttemplate.substring(0, contentStart) +\n\t\t\"%COMPONENT_HTML%\" +\n\t\ttemplate.substring(contentEnd) +\n\t\t`<script type=\"module\" src=\"${clientScript}\"></script>`\n\t);\n}\n\n// From https://stackoverflow.com/a/274094\nfunction regexIndexOf(string: string, regex: RegExp, position?: number) {\n\tvar indexOf = string.substring(position || 0).search(regex);\n\treturn indexOf >= 0 ? indexOf + (position || 0) : indexOf;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"file":"index.js","names":["fs"],"sources":["../src/prepareTemplate.ts","../src/adapter.ts"],"sourcesContent":["export default function prepareTemplate(template: string, clientScript: string): string {\n\tlet result = template;\n\n\t// Put %COMPONENT_HEAD% before </head>\n\t// This is where styles will go\n\tlet headStart = result.indexOf(\"</head>\");\n\tif (headStart === -1) {\n\t\tthrow new Error(`Couldn't find <head> end tag`);\n\t}\n\tresult = result.substring(0, headStart) + \"%COMPONENT_HEAD%\" + result.substring(headStart);\n\n\t// Put %COMPONENT_BODY% inside <div id=\"app\"></div>\n\t// This is where the component's HTML will go\n\tlet bodyStart = regexIndexOf(result, /<div\\s+id=(\"app\"|'app'|app)\\s+/);\n\tbodyStart = result.indexOf(\">\", bodyStart) + 1;\n\tlet bodyEnd = result.indexOf(\"</div>\", bodyStart);\n\tif (bodyStart === -1 || bodyEnd === -1) {\n\t\tthrow new Error(`Couldn't find <div id=\"app\"></div>`);\n\t}\n\tresult = result.substring(0, bodyStart) + \"%COMPONENT_BODY%\" + result.substring(bodyEnd);\n\n\t// Add the clientEntry script at the very end, for hydrating and navigating\n\tresult += `<script type=\"module\" src=\"${clientScript}\"></script>`;\n\n\treturn result;\n}\n\n// From https://stackoverflow.com/a/274094\nfunction regexIndexOf(string: string, regex: RegExp, position?: number) {\n\tvar indexOf = string.substring(position || 0).search(regex);\n\treturn indexOf >= 0 ? indexOf + (position || 0) : indexOf;\n}\n","import { type Adapter, Site } from \"@torpor/build\";\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { build, defineConfig } from \"vite\";\nimport prepareTemplate from \"./prepareTemplate\";\n\nexport default {\n\tpostbuild,\n\tserve: (/* server: Server, site: Site*/) => {\n\t\tconsole.log(\"TODO: Cloudflare dev server\");\n\t},\n} satisfies Adapter as Adapter;\n\nasync function postbuild(site: Site): Promise<void> {\n\t// Build _worker.js as per\n\t// https://developers.cloudflare.com/pages/functions/advanced-mode/\n\n\tconst distFolder = path.resolve(site.root, \"dist\");\n\tconst clientFolder = path.join(distFolder, \"client\");\n\tconst serverFolder = path.join(distFolder, \"server\");\n\tconst tempFolder = path.join(distFolder, \"temp\");\n\tconst cloudflareFolder = path.join(distFolder, \"cloudflare\");\n\n\t// TODO: Is this going to be the correct path after installing from npm?\n\tconst buildSrcFolder = path.resolve(site.root, \"./node_modules/@torpor/build/src/\");\n\tconst adapterSrcFolder = path.resolve(\n\t\tsite.root,\n\t\t\"./node_modules/@torpor/adapter-cloudflare/src/\",\n\t);\n\n\t// Compile _worker.ts\n\tlet workerFile = path.join(adapterSrcFolder, \"_worker.ts\");\n\tlet workerSource = await fs.readFile(workerFile, \"utf-8\");\n\n\t// Find the client script file in /assets\n\tlet clientScript = (await fs.readdir(path.join(clientFolder, \"assets\"))).find((f) =>\n\t\tf.startsWith(\"clientEntry-\"),\n\t);\n\tif (!clientScript) {\n\t\tthrow new Error(\"clientEntry.js not found\");\n\t}\n\tclientScript = `/assets/${clientScript}`;\n\n\t// Read and prepare site.html so that we can just splice components into it\n\tlet siteHtml = path.join(clientFolder, \"site.html\");\n\tlet template = await fs.readFile(siteHtml, \"utf-8\");\n\ttemplate = prepareTemplate(template, clientScript);\n\n\tconst serverClass = path.join(buildSrcFolder, \"server\", \"Server.ts\");\n\tconst serverScript = path.join(serverFolder, \"serverEntry.js\");\n\n\t// Splice file names into _worker.ts\n\tworkerSource = workerSource\n\t\t.replace(\"%SERVER_CLASS%\", serverClass)\n\t\t.replace(\"%SERVER_SCRIPT%\", serverScript)\n\t\t.replace(\"%HTML_TEMPLATE%\", template);\n\n\tworkerFile = path.join(tempFolder, \"_worker.ts\");\n\tawait fs.mkdir(tempFolder);\n\tawait fs.writeFile(workerFile, workerSource);\n\n\tconst cloudflareConfig = structuredClone(site.viteConfig ?? {});\n\tcloudflareConfig.build ??= {};\n\tcloudflareConfig.build.outDir = cloudflareFolder;\n\tcloudflareConfig.build.rollupOptions ??= {};\n\tcloudflareConfig.build.rollupOptions.input = [workerFile, ...site.inputs];\n\tcloudflareConfig.build.rollupOptions.output = {\n\t\tentryFileNames: `[name].js`,\n\t\tchunkFileNames: `[name].js`,\n\t\tassetFileNames: `[name].[ext]`,\n\t};\n\tcloudflareConfig.build.rollupOptions.preserveEntrySignatures = \"strict\";\n\t// HACK: We don't need to minify as the worker isn't downloaded?\n\t// And it makes debugging easier\n\tcloudflareConfig.build.minify = false;\n\t// HACK: Build for SSR so we don't get document and window references\n\tcloudflareConfig.build.ssr = true;\n\tawait build(defineConfig(cloudflareConfig));\n\n\t// Copy the client assets into the Cloudflare folder\n\tawait fs.mkdir(path.join(cloudflareFolder, \"assets\"));\n\tfor (let file of await fs.readdir(path.join(clientFolder, \"assets\"))) {\n\t\tawait fs.copyFile(\n\t\t\tpath.join(clientFolder, \"assets\", file),\n\t\t\tpath.join(cloudflareFolder, \"assets\", file),\n\t\t);\n\t}\n\n\t// Build a wrangler.toml file for running with `wrangler dev`\n\tconst wranglerConfig = `\nname = \"torpor-miniflare\"\nmain = \"./cloudflare/_worker.js\"\ncompatibility_date = \"2025-01-01\"\n\n[assets]\ndirectory = \"./cloudflare\"\nbinding = \"ASSETS\"\n\t`;\n\tconst wranglerFile = path.join(distFolder, \"wrangler.toml\");\n\tawait fs.writeFile(wranglerFile, wranglerConfig);\n\n\t// Build a .assetsignore file\n\tconst assetsIgnore = `\n**/node_modules\n**/.DS_Store\n**/.git\n_worker.js\n`;\n\tconst assetsIgnoreFile = path.join(cloudflareFolder, \".assetsignore\");\n\tawait fs.writeFile(assetsIgnoreFile, assetsIgnore);\n\n\tawait fs.rm(tempFolder, { recursive: true });\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,11 @@
1
1
  {
2
2
  "name": "@torpor/adapter-cloudflare",
3
- "version": "0.0.33",
3
+ "version": "0.2.0",
4
4
  "description": "A @torpor/build adapter for deploying to Cloudflare Pages",
5
5
  "type": "module",
6
- "main": "dist/index.cjs",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
6
  "exports": {
10
7
  "types": "./dist/index.d.ts",
11
- "import": "./dist/index.js",
12
- "require": "./dist/index.cjs"
8
+ "import": "./dist/index.js"
13
9
  },
14
10
  "publishConfig": {
15
11
  "access": "public"
@@ -18,18 +14,19 @@
18
14
  "author": "",
19
15
  "license": "ISC",
20
16
  "dependencies": {
21
- "vite": "^6.3.5",
22
- "@torpor/build": "^0.1.31"
17
+ "vite": "^7.1.9",
18
+ "@torpor/build": "^0.3.0"
23
19
  },
24
20
  "devDependencies": {
25
21
  "@trivago/prettier-plugin-sort-imports": "^5.2.2",
26
- "tsup": "^8.5.0",
27
- "tsx": "^4.20.3",
28
- "typescript": "^5.8.3"
22
+ "@typescript/native-preview": "7.0.0-dev.20251005.1",
23
+ "oxlint-tsgolint": "^0.2.0",
24
+ "tsdown": "^0.15.6",
25
+ "typescript": "^5.9.3"
29
26
  },
30
27
  "scripts": {
31
- "build": "tsc --noEmit && tsup",
32
- "build:watch": "tsup --watch",
33
- "check": "tsc --noEmit"
28
+ "build": "tsgo --noEmit && tsdown",
29
+ "build:watch": "tsdown --watch",
30
+ "check": "tsgo --noEmit && pnpm dlx oxlint --type-aware"
34
31
  }
35
32
  }
@@ -1,16 +1,28 @@
1
1
  export default function prepareTemplate(template: string, clientScript: string): string {
2
- let contentStart = regexIndexOf(template, /\<div\s+id=("app"|'app'|app)\s+/);
3
- contentStart = template.indexOf(">", contentStart) + 1;
4
- let contentEnd = template.indexOf("</div>", contentStart);
5
- if (contentStart === -1 || contentEnd === -1) {
2
+ let result = template;
3
+
4
+ // Put %COMPONENT_HEAD% before </head>
5
+ // This is where styles will go
6
+ let headStart = result.indexOf("</head>");
7
+ if (headStart === -1) {
8
+ throw new Error(`Couldn't find <head> end tag`);
9
+ }
10
+ result = result.substring(0, headStart) + "%COMPONENT_HEAD%" + result.substring(headStart);
11
+
12
+ // Put %COMPONENT_BODY% inside <div id="app"></div>
13
+ // This is where the component's HTML will go
14
+ let bodyStart = regexIndexOf(result, /<div\s+id=("app"|'app'|app)\s+/);
15
+ bodyStart = result.indexOf(">", bodyStart) + 1;
16
+ let bodyEnd = result.indexOf("</div>", bodyStart);
17
+ if (bodyStart === -1 || bodyEnd === -1) {
6
18
  throw new Error(`Couldn't find <div id="app"></div>`);
7
19
  }
8
- return (
9
- template.substring(0, contentStart) +
10
- "%COMPONENT_HTML%" +
11
- template.substring(contentEnd) +
12
- `<script type="module" src="${clientScript}"></script>`
13
- );
20
+ result = result.substring(0, bodyStart) + "%COMPONENT_BODY%" + result.substring(bodyEnd);
21
+
22
+ // Add the clientEntry script at the very end, for hydrating and navigating
23
+ result += `<script type="module" src="${clientScript}"></script>`;
24
+
25
+ return result;
14
26
  }
15
27
 
16
28
  // From https://stackoverflow.com/a/274094
@@ -1,4 +1,4 @@
1
- import { type Options, defineConfig } from "tsup";
1
+ import { type Options, defineConfig } from "tsdown";
2
2
 
3
3
  type Config =
4
4
  | Options
@@ -7,9 +7,7 @@ type Config =
7
7
 
8
8
  export default defineConfig({
9
9
  entry: ["src/index.ts"],
10
- format: ["esm", "cjs"],
10
+ format: "esm",
11
11
  dts: true,
12
- clean: true,
13
- metafile: true,
14
12
  sourcemap: true,
15
13
  }) satisfies Config as Config;
package/dist/index.cjs DELETED
@@ -1,139 +0,0 @@
1
- "use strict";
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 __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/index.ts
31
- var index_exports = {};
32
- __export(index_exports, {
33
- cloudflare: () => adapter_default
34
- });
35
- module.exports = __toCommonJS(index_exports);
36
-
37
- // src/adapter.ts
38
- var import_node_fs = require("fs");
39
- var import_node_path = __toESM(require("path"), 1);
40
- var import_vite = require("vite");
41
-
42
- // src/prepareTemplate.ts
43
- function prepareTemplate(template, clientScript) {
44
- let contentStart = regexIndexOf(template, /\<div\s+id=("app"|'app'|app)\s+/);
45
- contentStart = template.indexOf(">", contentStart) + 1;
46
- let contentEnd = template.indexOf("</div>", contentStart);
47
- if (contentStart === -1 || contentEnd === -1) {
48
- throw new Error(`Couldn't find <div id="app"></div>`);
49
- }
50
- return template.substring(0, contentStart) + "%COMPONENT_HTML%" + template.substring(contentEnd) + `<script type="module" src="${clientScript}"></script>`;
51
- }
52
- function regexIndexOf(string, regex, position) {
53
- var indexOf = string.substring(position || 0).search(regex);
54
- return indexOf >= 0 ? indexOf + (position || 0) : indexOf;
55
- }
56
-
57
- // src/adapter.ts
58
- var adapter_default = {
59
- postbuild,
60
- serve: () => {
61
- console.log("TODO: Cloudflare dev server");
62
- }
63
- };
64
- async function postbuild(site) {
65
- const distFolder = import_node_path.default.resolve(site.root, "dist");
66
- const clientFolder = import_node_path.default.join(distFolder, "client");
67
- const serverFolder = import_node_path.default.join(distFolder, "server");
68
- const tempFolder = import_node_path.default.join(distFolder, "temp");
69
- const cloudflareFolder = import_node_path.default.join(distFolder, "cloudflare");
70
- const buildSrcFolder = import_node_path.default.resolve(site.root, "./node_modules/@torpor/build/src/");
71
- const adapterSrcFolder = import_node_path.default.resolve(
72
- site.root,
73
- "./node_modules/@torpor/adapter-cloudflare/src/"
74
- );
75
- let workerFile = import_node_path.default.join(adapterSrcFolder, "_worker.ts");
76
- let workerSource = await import_node_fs.promises.readFile(workerFile, "utf-8");
77
- let clientScript = (await import_node_fs.promises.readdir(import_node_path.default.join(clientFolder, "assets"))).find(
78
- (f) => f.startsWith("clientEntry-")
79
- );
80
- if (!clientScript) {
81
- throw new Error("clientEntry.js not found");
82
- }
83
- clientScript = `/assets/${clientScript}`;
84
- let siteHtml = import_node_path.default.join(clientFolder, "site.html");
85
- let template = await import_node_fs.promises.readFile(siteHtml, "utf-8");
86
- template = prepareTemplate(template, clientScript);
87
- const serverClass = import_node_path.default.join(buildSrcFolder, "server", "Server.ts");
88
- const serverScript = import_node_path.default.join(serverFolder, "serverEntry.js");
89
- workerSource = workerSource.replace("%SERVER_CLASS%", serverClass).replace("%SERVER_SCRIPT%", serverScript).replace("%HTML_TEMPLATE%", template);
90
- workerFile = import_node_path.default.join(tempFolder, "_worker.ts");
91
- await import_node_fs.promises.mkdir(tempFolder);
92
- await import_node_fs.promises.writeFile(workerFile, workerSource);
93
- const cloudflareConfig = structuredClone(site.viteConfig ?? {});
94
- cloudflareConfig.build ??= {};
95
- cloudflareConfig.build.outDir = cloudflareFolder;
96
- cloudflareConfig.build.rollupOptions ??= {};
97
- cloudflareConfig.build.rollupOptions.input = [workerFile, ...site.inputs];
98
- cloudflareConfig.build.rollupOptions.output = {
99
- entryFileNames: `[name].js`,
100
- chunkFileNames: `[name].js`,
101
- assetFileNames: `[name].[ext]`
102
- };
103
- cloudflareConfig.build.rollupOptions.preserveEntrySignatures = "strict";
104
- cloudflareConfig.build.minify = false;
105
- cloudflareConfig.build.ssr = true;
106
- await (0, import_vite.build)((0, import_vite.defineConfig)(cloudflareConfig));
107
- await import_node_fs.promises.mkdir(import_node_path.default.join(cloudflareFolder, "assets"));
108
- for (let file of await import_node_fs.promises.readdir(import_node_path.default.join(clientFolder, "assets"))) {
109
- await import_node_fs.promises.copyFile(
110
- import_node_path.default.join(clientFolder, "assets", file),
111
- import_node_path.default.join(cloudflareFolder, "assets", file)
112
- );
113
- }
114
- const wranglerConfig = `
115
- name = "torpor-miniflare"
116
- main = "./cloudflare/_worker.js"
117
- compatibility_date = "2025-01-01"
118
-
119
- [assets]
120
- directory = "./cloudflare"
121
- binding = "ASSETS"
122
- `;
123
- const wranglerFile = import_node_path.default.join(distFolder, "wrangler.toml");
124
- await import_node_fs.promises.writeFile(wranglerFile, wranglerConfig);
125
- const assetsIgnore = `
126
- **/node_modules
127
- **/.DS_Store
128
- **/.git
129
- _worker.js
130
- `;
131
- const assetsIgnoreFile = import_node_path.default.join(cloudflareFolder, ".assetsignore");
132
- await import_node_fs.promises.writeFile(assetsIgnoreFile, assetsIgnore);
133
- await import_node_fs.promises.rm(tempFolder, { recursive: true });
134
- }
135
- // Annotate the CommonJS export names for ESM import in node:
136
- 0 && (module.exports = {
137
- cloudflare
138
- });
139
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/prepareTemplate.ts"],"sourcesContent":["import cloudflare from \"./adapter\";\n\nexport { cloudflare };\n","import { type Adapter, Site } from \"@torpor/build\";\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { build, defineConfig } from \"vite\";\nimport prepareTemplate from \"./prepareTemplate\";\n\nexport default {\n\tpostbuild,\n\tserve: (/* server: Server, site: Site*/) => {\n\t\tconsole.log(\"TODO: Cloudflare dev server\");\n\t},\n} satisfies Adapter as Adapter;\n\nasync function postbuild(site: Site): Promise<void> {\n\t// Build _worker.js as per\n\t// https://developers.cloudflare.com/pages/functions/advanced-mode/\n\n\tconst distFolder = path.resolve(site.root, \"dist\");\n\tconst clientFolder = path.join(distFolder, \"client\");\n\tconst serverFolder = path.join(distFolder, \"server\");\n\tconst tempFolder = path.join(distFolder, \"temp\");\n\tconst cloudflareFolder = path.join(distFolder, \"cloudflare\");\n\n\t// TODO: Is this going to be the correct path after installing from npm?\n\tconst buildSrcFolder = path.resolve(site.root, \"./node_modules/@torpor/build/src/\");\n\tconst adapterSrcFolder = path.resolve(\n\t\tsite.root,\n\t\t\"./node_modules/@torpor/adapter-cloudflare/src/\",\n\t);\n\n\t// Compile _worker.ts\n\tlet workerFile = path.join(adapterSrcFolder, \"_worker.ts\");\n\tlet workerSource = await fs.readFile(workerFile, \"utf-8\");\n\n\t// Find the client script file in /assets\n\tlet clientScript = (await fs.readdir(path.join(clientFolder, \"assets\"))).find((f) =>\n\t\tf.startsWith(\"clientEntry-\"),\n\t);\n\tif (!clientScript) {\n\t\tthrow new Error(\"clientEntry.js not found\");\n\t}\n\tclientScript = `/assets/${clientScript}`;\n\n\t// Read and prepare site.html so that we can just splice components into it\n\tlet siteHtml = path.join(clientFolder, \"site.html\");\n\tlet template = await fs.readFile(siteHtml, \"utf-8\");\n\ttemplate = prepareTemplate(template, clientScript);\n\n\tconst serverClass = path.join(buildSrcFolder, \"server\", \"Server.ts\");\n\tconst serverScript = path.join(serverFolder, \"serverEntry.js\");\n\n\t// Splice file names into _worker.ts\n\tworkerSource = workerSource\n\t\t.replace(\"%SERVER_CLASS%\", serverClass)\n\t\t.replace(\"%SERVER_SCRIPT%\", serverScript)\n\t\t.replace(\"%HTML_TEMPLATE%\", template);\n\n\tworkerFile = path.join(tempFolder, \"_worker.ts\");\n\tawait fs.mkdir(tempFolder);\n\tawait fs.writeFile(workerFile, workerSource);\n\n\tconst cloudflareConfig = structuredClone(site.viteConfig ?? {});\n\tcloudflareConfig.build ??= {};\n\tcloudflareConfig.build.outDir = cloudflareFolder;\n\tcloudflareConfig.build.rollupOptions ??= {};\n\tcloudflareConfig.build.rollupOptions.input = [workerFile, ...site.inputs];\n\tcloudflareConfig.build.rollupOptions.output = {\n\t\tentryFileNames: `[name].js`,\n\t\tchunkFileNames: `[name].js`,\n\t\tassetFileNames: `[name].[ext]`,\n\t};\n\tcloudflareConfig.build.rollupOptions.preserveEntrySignatures = \"strict\";\n\t// HACK: We don't need to minify as the worker isn't downloaded?\n\t// And it makes debugging easier\n\tcloudflareConfig.build.minify = false;\n\t// HACK: Build for SSR so we don't get document and window references\n\tcloudflareConfig.build.ssr = true;\n\tawait build(defineConfig(cloudflareConfig));\n\n\t// Copy the client assets into the Cloudflare folder\n\tawait fs.mkdir(path.join(cloudflareFolder, \"assets\"));\n\tfor (let file of await fs.readdir(path.join(clientFolder, \"assets\"))) {\n\t\tawait fs.copyFile(\n\t\t\tpath.join(clientFolder, \"assets\", file),\n\t\t\tpath.join(cloudflareFolder, \"assets\", file),\n\t\t);\n\t}\n\n\t// Build a wrangler.toml file for running with `wrangler dev`\n\tconst wranglerConfig = `\nname = \"torpor-miniflare\"\nmain = \"./cloudflare/_worker.js\"\ncompatibility_date = \"2025-01-01\"\n\n[assets]\ndirectory = \"./cloudflare\"\nbinding = \"ASSETS\"\n\t`;\n\tconst wranglerFile = path.join(distFolder, \"wrangler.toml\");\n\tawait fs.writeFile(wranglerFile, wranglerConfig);\n\n\t// Build a .assetsignore file\n\tconst assetsIgnore = `\n**/node_modules\n**/.DS_Store\n**/.git\n_worker.js\n`;\n\tconst assetsIgnoreFile = path.join(cloudflareFolder, \".assetsignore\");\n\tawait fs.writeFile(assetsIgnoreFile, assetsIgnore);\n\n\tawait fs.rm(tempFolder, { recursive: true });\n}\n","export default function prepareTemplate(template: string, clientScript: string): string {\n\tlet contentStart = regexIndexOf(template, /\\<div\\s+id=(\"app\"|'app'|app)\\s+/);\n\tcontentStart = template.indexOf(\">\", contentStart) + 1;\n\tlet contentEnd = template.indexOf(\"</div>\", contentStart);\n\tif (contentStart === -1 || contentEnd === -1) {\n\t\tthrow new Error(`Couldn't find <div id=\"app\"></div>`);\n\t}\n\treturn (\n\t\ttemplate.substring(0, contentStart) +\n\t\t\"%COMPONENT_HTML%\" +\n\t\ttemplate.substring(contentEnd) +\n\t\t`<script type=\"module\" src=\"${clientScript}\"></script>`\n\t);\n}\n\n// From https://stackoverflow.com/a/274094\nfunction regexIndexOf(string: string, regex: RegExp, position?: number) {\n\tvar indexOf = string.substring(position || 0).search(regex);\n\treturn indexOf >= 0 ? indexOf + (position || 0) : indexOf;\n}\n"],"mappings":"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","names":["path","fs"]}
package/dist/index.d.cts DELETED
@@ -1,5 +0,0 @@
1
- import { Adapter } from '@torpor/build';
2
-
3
- declare const _default: Adapter;
4
-
5
- export { _default as cloudflare };
@@ -1 +0,0 @@
1
- {"inputs":{"src/prepareTemplate.ts":{"bytes":809,"imports":[],"format":"esm"},"src/adapter.ts":{"bytes":3932,"imports":[{"path":"@torpor/build","kind":"import-statement","external":true},{"path":"fs","kind":"import-statement","external":true},{"path":"path","kind":"import-statement","external":true},{"path":"vite","kind":"import-statement","external":true},{"path":"src/prepareTemplate.ts","kind":"import-statement","original":"./prepareTemplate"}],"format":"esm"},"src/index.ts":{"bytes":60,"imports":[{"path":"src/adapter.ts","kind":"import-statement","original":"./adapter"}],"format":"esm"}},"outputs":{"dist/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":7947},"dist/index.cjs":{"imports":[{"path":"fs","kind":"require-call","external":true},{"path":"path","kind":"require-call","external":true},{"path":"vite","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/index.ts","inputs":{"src/index.ts":{"bytesInOutput":136},"src/adapter.ts":{"bytesInOutput":3784},"src/prepareTemplate.ts":{"bytesInOutput":698}},"bytes":6200}}}
@@ -1 +0,0 @@
1
- {"inputs":{"src/prepareTemplate.ts":{"bytes":809,"imports":[],"format":"esm"},"src/adapter.ts":{"bytes":3932,"imports":[{"path":"@torpor/build","kind":"import-statement","external":true},{"path":"fs","kind":"import-statement","external":true},{"path":"path","kind":"import-statement","external":true},{"path":"vite","kind":"import-statement","external":true},{"path":"src/prepareTemplate.ts","kind":"import-statement","original":"./prepareTemplate"}],"format":"esm"},"src/index.ts":{"bytes":60,"imports":[{"path":"src/adapter.ts","kind":"import-statement","original":"./adapter"}],"format":"esm"}},"outputs":{"dist/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":7611},"dist/index.js":{"imports":[{"path":"fs","kind":"import-statement","external":true},{"path":"path","kind":"import-statement","external":true},{"path":"vite","kind":"import-statement","external":true}],"exports":["cloudflare"],"entryPoint":"src/index.ts","inputs":{"src/adapter.ts":{"bytesInOutput":3122},"src/prepareTemplate.ts":{"bytesInOutput":698},"src/index.ts":{"bytesInOutput":0}},"bytes":3928}}}