@astrojs/cloudflare 7.4.0 → 7.5.1
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/README.md +8 -1
- package/dist/index.js +60 -20
- package/dist/utils/parser.d.ts +8 -0
- package/dist/utils/parser.js +58 -1
- package/package.json +8 -4
package/README.md
CHANGED
|
@@ -212,7 +212,14 @@ export default defineConfig({
|
|
|
212
212
|
|
|
213
213
|
## Cloudflare runtime
|
|
214
214
|
|
|
215
|
-
Gives you access to [environment variables](https://developers.cloudflare.com/pages/platform/functions/bindings/#environment-variables).
|
|
215
|
+
Gives you access to [environment variables](https://developers.cloudflare.com/pages/platform/functions/bindings/#environment-variables), and [Cloudflare bindings](https://developers.cloudflare.com/pages/platform/functions/bindings).
|
|
216
|
+
|
|
217
|
+
Currently supported bindings:
|
|
218
|
+
|
|
219
|
+
- [Cloudflare D1](https://developers.cloudflare.com/d1/)
|
|
220
|
+
- [Cloudflare R2](https://developers.cloudflare.com/r2/)
|
|
221
|
+
- [Cloudflare Workers KV](https://developers.cloudflare.com/kv/)
|
|
222
|
+
- [Cloudflare Durable Objects](https://developers.cloudflare.com/durable-objects/)
|
|
216
223
|
|
|
217
224
|
You can access the runtime from Astro components through `Astro.locals` inside any .astro` file.
|
|
218
225
|
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { createRedirectsFromAstroRoutes } from "@astrojs/underscore-redirects";
|
|
2
|
-
import { CacheStorage } from "@miniflare/cache";
|
|
3
|
-
import { NoOpLog } from "@miniflare/shared";
|
|
4
|
-
import { MemoryStorage } from "@miniflare/storage-memory";
|
|
5
2
|
import { AstroError } from "astro/errors";
|
|
6
3
|
import esbuild from "esbuild";
|
|
4
|
+
import { Miniflare } from "miniflare";
|
|
7
5
|
import * as fs from "node:fs";
|
|
8
6
|
import * as os from "node:os";
|
|
9
7
|
import { dirname, relative, sep } from "node:path";
|
|
@@ -12,23 +10,20 @@ import glob from "tiny-glob";
|
|
|
12
10
|
import { getAdapter } from "./getAdapter.js";
|
|
13
11
|
import { deduplicatePatterns } from "./utils/deduplicatePatterns.js";
|
|
14
12
|
import { getCFObject } from "./utils/getCFObject.js";
|
|
15
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
getD1Bindings,
|
|
15
|
+
getDOBindings,
|
|
16
|
+
getEnvVars,
|
|
17
|
+
getKVBindings,
|
|
18
|
+
getR2Bindings
|
|
19
|
+
} from "./utils/parser.js";
|
|
16
20
|
import { prependForwardSlash } from "./utils/prependForwardSlash.js";
|
|
17
21
|
import { rewriteWasmImportPath } from "./utils/rewriteWasmImportPath.js";
|
|
18
22
|
import { wasmModuleLoader } from "./utils/wasm-module-loader.js";
|
|
19
|
-
class StorageFactory {
|
|
20
|
-
storages = /* @__PURE__ */ new Map();
|
|
21
|
-
storage(namespace) {
|
|
22
|
-
let storage = this.storages.get(namespace);
|
|
23
|
-
if (storage)
|
|
24
|
-
return storage;
|
|
25
|
-
this.storages.set(namespace, storage = new MemoryStorage());
|
|
26
|
-
return storage;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
23
|
function createIntegration(args) {
|
|
30
24
|
let _config;
|
|
31
25
|
let _buildConfig;
|
|
26
|
+
let _mf;
|
|
32
27
|
let _entryPoints = /* @__PURE__ */ new Map();
|
|
33
28
|
const SERVER_BUILD_FOLDER = "/$server_build/";
|
|
34
29
|
const isModeDirectory = args?.mode === "directory";
|
|
@@ -77,6 +72,49 @@ function createIntegration(args) {
|
|
|
77
72
|
try {
|
|
78
73
|
const cf = await getCFObject(runtimeMode);
|
|
79
74
|
const vars = await getEnvVars();
|
|
75
|
+
const D1Bindings = await getD1Bindings();
|
|
76
|
+
const R2Bindings = await getR2Bindings();
|
|
77
|
+
const KVBindings = await getKVBindings();
|
|
78
|
+
const DOBindings = await getDOBindings();
|
|
79
|
+
let bindingsEnv = new Object({});
|
|
80
|
+
const originalPWD = process.env.PWD;
|
|
81
|
+
process.env.PWD = process.cwd();
|
|
82
|
+
_mf = new Miniflare({
|
|
83
|
+
modules: true,
|
|
84
|
+
script: "",
|
|
85
|
+
cache: true,
|
|
86
|
+
cachePersist: true,
|
|
87
|
+
cacheWarnUsage: true,
|
|
88
|
+
d1Databases: D1Bindings,
|
|
89
|
+
d1Persist: true,
|
|
90
|
+
r2Buckets: R2Bindings,
|
|
91
|
+
r2Persist: true,
|
|
92
|
+
kvNamespaces: KVBindings,
|
|
93
|
+
kvPersist: true,
|
|
94
|
+
durableObjects: DOBindings,
|
|
95
|
+
durableObjectsPersist: true
|
|
96
|
+
});
|
|
97
|
+
await _mf.ready;
|
|
98
|
+
for (const D1Binding of D1Bindings) {
|
|
99
|
+
const db = await _mf.getD1Database(D1Binding);
|
|
100
|
+
Reflect.set(bindingsEnv, D1Binding, db);
|
|
101
|
+
}
|
|
102
|
+
for (const R2Binding of R2Bindings) {
|
|
103
|
+
const bucket = await _mf.getR2Bucket(R2Binding);
|
|
104
|
+
Reflect.set(bindingsEnv, R2Binding, bucket);
|
|
105
|
+
}
|
|
106
|
+
for (const KVBinding of KVBindings) {
|
|
107
|
+
const namespace = await _mf.getKVNamespace(KVBinding);
|
|
108
|
+
Reflect.set(bindingsEnv, KVBinding, namespace);
|
|
109
|
+
}
|
|
110
|
+
for (const key in DOBindings) {
|
|
111
|
+
if (Object.prototype.hasOwnProperty.call(DOBindings, key)) {
|
|
112
|
+
const DO = await _mf.getDurableObjectNamespace(key);
|
|
113
|
+
Reflect.set(bindingsEnv, key, DO);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const mfCache = await _mf.getCaches();
|
|
117
|
+
process.env.PWD = originalPWD;
|
|
80
118
|
const clientLocalsSymbol = Symbol.for("astro.locals");
|
|
81
119
|
Reflect.set(req, clientLocalsSymbol, {
|
|
82
120
|
runtime: {
|
|
@@ -90,18 +128,14 @@ function createIntegration(args) {
|
|
|
90
128
|
// will be fetched from git dynamically once we support mocking of bindings
|
|
91
129
|
CF_PAGES_COMMIT_SHA: "TBA",
|
|
92
130
|
CF_PAGES_URL: `http://${req.headers.host}`,
|
|
131
|
+
...bindingsEnv,
|
|
93
132
|
...vars
|
|
94
133
|
},
|
|
95
134
|
cf,
|
|
96
135
|
waitUntil: (_promise) => {
|
|
97
136
|
return;
|
|
98
137
|
},
|
|
99
|
-
caches:
|
|
100
|
-
{ cache: true, cachePersist: false },
|
|
101
|
-
new NoOpLog(),
|
|
102
|
-
new StorageFactory(),
|
|
103
|
-
{}
|
|
104
|
-
)
|
|
138
|
+
caches: mfCache
|
|
105
139
|
}
|
|
106
140
|
});
|
|
107
141
|
next();
|
|
@@ -111,6 +145,12 @@ function createIntegration(args) {
|
|
|
111
145
|
});
|
|
112
146
|
}
|
|
113
147
|
},
|
|
148
|
+
"astro:server:done": async ({ logger }) => {
|
|
149
|
+
if (_mf) {
|
|
150
|
+
logger.info("Cleaning up the Miniflare instance, and shutting down the workerd server.");
|
|
151
|
+
await _mf.dispose();
|
|
152
|
+
}
|
|
153
|
+
},
|
|
114
154
|
"astro:build:setup": ({ vite, target }) => {
|
|
115
155
|
if (target === "server") {
|
|
116
156
|
vite.resolve ||= {};
|
package/dist/utils/parser.d.ts
CHANGED
|
@@ -17,3 +17,11 @@ export interface DotEnv {
|
|
|
17
17
|
*/
|
|
18
18
|
export declare function loadDotEnv(path: string): DotEnv | undefined;
|
|
19
19
|
export declare function getEnvVars(): Promise<any>;
|
|
20
|
+
export declare function getD1Bindings(): Promise<string[]>;
|
|
21
|
+
export declare function getR2Bindings(): Promise<string[]>;
|
|
22
|
+
export declare function getKVBindings(): Promise<string[]>;
|
|
23
|
+
export declare function getDOBindings(): Record<string, {
|
|
24
|
+
scriptName?: string | undefined;
|
|
25
|
+
unsafeUniqueKey?: string | undefined;
|
|
26
|
+
className: string;
|
|
27
|
+
}>;
|
package/dist/utils/parser.js
CHANGED
|
@@ -3,6 +3,7 @@ import dotenv from "dotenv";
|
|
|
3
3
|
import { findUpSync } from "find-up";
|
|
4
4
|
import * as fs from "node:fs";
|
|
5
5
|
import { dirname, resolve } from "node:path";
|
|
6
|
+
let _wrangler;
|
|
6
7
|
function findWranglerToml(referencePath = process.cwd(), preferJson = false) {
|
|
7
8
|
if (preferJson) {
|
|
8
9
|
return findUpSync(`wrangler.json`, { cwd: referencePath }) ?? findUpSync(`wrangler.toml`, { cwd: referencePath });
|
|
@@ -69,7 +70,9 @@ function getVarsForDev(config, configPath) {
|
|
|
69
70
|
return config.vars;
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
|
-
|
|
73
|
+
function parseConfig() {
|
|
74
|
+
if (_wrangler)
|
|
75
|
+
return _wrangler;
|
|
73
76
|
let rawConfig;
|
|
74
77
|
const configPath = findWranglerToml(process.cwd(), false);
|
|
75
78
|
if (!configPath) {
|
|
@@ -78,10 +81,64 @@ async function getEnvVars() {
|
|
|
78
81
|
if (configPath?.endsWith("toml")) {
|
|
79
82
|
rawConfig = parseTOML(fs.readFileSync(configPath).toString(), configPath);
|
|
80
83
|
}
|
|
84
|
+
_wrangler = { rawConfig, configPath };
|
|
85
|
+
return { rawConfig, configPath };
|
|
86
|
+
}
|
|
87
|
+
async function getEnvVars() {
|
|
88
|
+
const { rawConfig, configPath } = parseConfig();
|
|
81
89
|
const vars = getVarsForDev(rawConfig, configPath);
|
|
82
90
|
return vars;
|
|
83
91
|
}
|
|
92
|
+
async function getD1Bindings() {
|
|
93
|
+
const { rawConfig } = parseConfig();
|
|
94
|
+
if (!rawConfig)
|
|
95
|
+
return [];
|
|
96
|
+
if (!rawConfig?.d1_databases)
|
|
97
|
+
return [];
|
|
98
|
+
const bindings = (rawConfig?.d1_databases).map(
|
|
99
|
+
(binding) => binding.binding
|
|
100
|
+
);
|
|
101
|
+
return bindings;
|
|
102
|
+
}
|
|
103
|
+
async function getR2Bindings() {
|
|
104
|
+
const { rawConfig } = parseConfig();
|
|
105
|
+
if (!rawConfig)
|
|
106
|
+
return [];
|
|
107
|
+
if (!rawConfig?.r2_buckets)
|
|
108
|
+
return [];
|
|
109
|
+
const bindings = (rawConfig?.r2_buckets).map(
|
|
110
|
+
(binding) => binding.binding
|
|
111
|
+
);
|
|
112
|
+
return bindings;
|
|
113
|
+
}
|
|
114
|
+
async function getKVBindings() {
|
|
115
|
+
const { rawConfig } = parseConfig();
|
|
116
|
+
if (!rawConfig)
|
|
117
|
+
return [];
|
|
118
|
+
if (!rawConfig?.kv_namespaces)
|
|
119
|
+
return [];
|
|
120
|
+
const bindings = (rawConfig?.kv_namespaces).map(
|
|
121
|
+
(binding) => binding.binding
|
|
122
|
+
);
|
|
123
|
+
return bindings;
|
|
124
|
+
}
|
|
125
|
+
function getDOBindings() {
|
|
126
|
+
const { rawConfig } = parseConfig();
|
|
127
|
+
if (!rawConfig)
|
|
128
|
+
return {};
|
|
129
|
+
if (!rawConfig?.durable_objects)
|
|
130
|
+
return {};
|
|
131
|
+
const output = new Object({});
|
|
132
|
+
for (const binding of rawConfig?.durable_objects.bindings) {
|
|
133
|
+
Reflect.set(output, binding.name, { className: binding.class_name });
|
|
134
|
+
}
|
|
135
|
+
return output;
|
|
136
|
+
}
|
|
84
137
|
export {
|
|
138
|
+
getD1Bindings,
|
|
139
|
+
getDOBindings,
|
|
85
140
|
getEnvVars,
|
|
141
|
+
getKVBindings,
|
|
142
|
+
getR2Bindings,
|
|
86
143
|
loadDotEnv
|
|
87
144
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@astrojs/cloudflare",
|
|
3
3
|
"description": "Deploy your site to Cloudflare Workers/Pages",
|
|
4
|
-
"version": "7.
|
|
4
|
+
"version": "7.5.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
7
7
|
"author": "withastro",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
],
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@cloudflare/workers-types": "^4.20230821.0",
|
|
31
|
+
"miniflare": "^3.20230918.0",
|
|
31
32
|
"@iarna/toml": "^2.2.5",
|
|
32
33
|
"@miniflare/cache": "^2.14.1",
|
|
33
34
|
"@miniflare/shared": "^2.14.1",
|
|
@@ -37,10 +38,10 @@
|
|
|
37
38
|
"find-up": "^6.3.0",
|
|
38
39
|
"tiny-glob": "^0.2.9",
|
|
39
40
|
"vite": "^4.4.9",
|
|
40
|
-
"@astrojs/underscore-redirects": "0.3.
|
|
41
|
+
"@astrojs/underscore-redirects": "0.3.1"
|
|
41
42
|
},
|
|
42
43
|
"peerDependencies": {
|
|
43
|
-
"astro": "^3.2.
|
|
44
|
+
"astro": "^3.2.3"
|
|
44
45
|
},
|
|
45
46
|
"devDependencies": {
|
|
46
47
|
"@types/iarna__toml": "^2.0.2",
|
|
@@ -48,9 +49,12 @@
|
|
|
48
49
|
"cheerio": "1.0.0-rc.12",
|
|
49
50
|
"mocha": "^10.2.0",
|
|
50
51
|
"wrangler": "^3.5.1",
|
|
51
|
-
"astro": "3.2.
|
|
52
|
+
"astro": "3.2.3",
|
|
52
53
|
"astro-scripts": "0.0.14"
|
|
53
54
|
},
|
|
55
|
+
"publishConfig": {
|
|
56
|
+
"provenance": true
|
|
57
|
+
},
|
|
54
58
|
"scripts": {
|
|
55
59
|
"build": "astro-scripts build \"src/**/*.ts\" && tsc",
|
|
56
60
|
"build:ci": "astro-scripts build \"src/**/*.ts\"",
|