-
-
Notifications
You must be signed in to change notification settings - Fork 51
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
chore: improve support for Workers Assets beta #406
Open
alexanderniebuhr
wants to merge
9
commits into
main
Choose a base branch
from
workers-assets
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
3c1c7c1
chore: improve support for Workers Assets beta
alexanderniebuhr c987165
format
alexanderniebuhr 8fb4417
change to be experimental
alexanderniebuhr b121b24
add changeset
alexanderniebuhr af544f4
Update honest-ghosts-float.md
alexanderniebuhr 715521d
Merge branch 'main' into workers-assets
alexanderniebuhr 955eb97
Merge branch 'workers-assets' of https://github.com/withastro/adapter…
alexanderniebuhr 36943a7
chore: move flag
alexanderniebuhr 7d5d92a
chore: cleanup
alexanderniebuhr File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
--- | ||
'@astrojs/cloudflare': minor | ||
--- | ||
|
||
Adds experimental support for Cloudflare Workers Assets mode. To use this, update your settings as follows: | ||
|
||
```diff | ||
import cloudflare from '@astrojs/cloudflare'; | ||
import { defineConfig } from 'astro/config'; | ||
|
||
export default defineConfig({ | ||
output: 'server', | ||
adapter: cloudflare({ | ||
+ experimental: { | ||
+ workerAssets: true, | ||
+ } | ||
}), | ||
}); | ||
``` | ||
|
||
Note: Currently Cloudflare Workers Assets mode, does not read any of `_headers`, `_redirects`, nor `_routes.json` files. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -66,6 +66,16 @@ export type Options = { | |
* for reference on how these file types are exported | ||
*/ | ||
cloudflareModules?: boolean; | ||
|
||
/** | ||
* Lists all experimental features the adapter supports. | ||
*/ | ||
experimental?: { | ||
/** | ||
* Enables support for Cloudflare Workers assets. Defaults to false. | ||
*/ | ||
workerAssets?: boolean; | ||
}; | ||
}; | ||
|
||
function wrapWithSlashes(path: string): string { | ||
|
@@ -103,12 +113,17 @@ export default function createIntegration(args?: Options): AstroIntegration { | |
addWatchFile, | ||
addMiddleware, | ||
}) => { | ||
let clientURL = new URL(`.${wrapWithSlashes(config.base)}`, config.outDir); | ||
if (args?.experimental?.workerAssets) { | ||
clientURL = new URL(`./assets/${wrapWithSlashes(config.base)}`, config.outDir); | ||
} | ||
|
||
updateConfig({ | ||
build: { | ||
client: new URL(`.${wrapWithSlashes(config.base)}`, config.outDir), | ||
client: clientURL, | ||
server: new URL('./_worker.js/', config.outDir), | ||
serverEntry: 'index.js', | ||
redirects: false, | ||
redirects: !!args?.experimental?.workerAssets, | ||
}, | ||
vite: { | ||
plugins: [ | ||
|
@@ -281,79 +296,81 @@ export default function createIntegration(args?: Options): AstroIntegration { | |
} | ||
} | ||
|
||
let redirectsExists = false; | ||
try { | ||
const redirectsStat = await stat(new URL('./_redirects', _config.outDir)); | ||
if (redirectsStat.isFile()) { | ||
redirectsExists = true; | ||
if (!args?.experimental?.workerAssets) { | ||
let redirectsExists = false; | ||
try { | ||
const redirectsStat = await stat(new URL('./_redirects', _config.outDir)); | ||
if (redirectsStat.isFile()) { | ||
redirectsExists = true; | ||
} | ||
} catch (error) { | ||
redirectsExists = false; | ||
} | ||
} catch (error) { | ||
redirectsExists = false; | ||
} | ||
|
||
const redirects: IntegrationRouteData['segments'][] = []; | ||
if (redirectsExists) { | ||
const rl = createInterface({ | ||
input: createReadStream(new URL('./_redirects', _config.outDir)), | ||
crlfDelay: Number.POSITIVE_INFINITY, | ||
}); | ||
const redirects: IntegrationRouteData['segments'][] = []; | ||
if (redirectsExists) { | ||
const rl = createInterface({ | ||
input: createReadStream(new URL('./_redirects', _config.outDir)), | ||
crlfDelay: Number.POSITIVE_INFINITY, | ||
}); | ||
|
||
for await (const line of rl) { | ||
const parts = line.split(' '); | ||
if (parts.length >= 2) { | ||
const p = removeLeadingForwardSlash(parts[0]) | ||
.split('/') | ||
.filter(Boolean) | ||
.map((s: string) => { | ||
const syntax = s | ||
.replace(/\/:.*?(?=\/|$)/g, '/*') | ||
// remove query params as they are not supported by cloudflare | ||
.replace(/\?.*$/, ''); | ||
return getParts(syntax); | ||
}); | ||
redirects.push(p); | ||
for await (const line of rl) { | ||
const parts = line.split(' '); | ||
if (parts.length >= 2) { | ||
const p = removeLeadingForwardSlash(parts[0]) | ||
.split('/') | ||
.filter(Boolean) | ||
.map((s: string) => { | ||
const syntax = s | ||
.replace(/\/:.*?(?=\/|$)/g, '/*') | ||
// remove query params as they are not supported by cloudflare | ||
.replace(/\?.*$/, ''); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same here |
||
return getParts(syntax); | ||
}); | ||
redirects.push(p); | ||
} | ||
} | ||
} | ||
} | ||
|
||
let routesExists = false; | ||
try { | ||
const routesStat = await stat(new URL('./_routes.json', _config.outDir)); | ||
if (routesStat.isFile()) { | ||
routesExists = true; | ||
let routesExists = false; | ||
try { | ||
const routesStat = await stat(new URL('./_routes.json', _config.outDir)); | ||
if (routesStat.isFile()) { | ||
routesExists = true; | ||
} | ||
} catch (error) { | ||
routesExists = false; | ||
} | ||
} catch (error) { | ||
routesExists = false; | ||
} | ||
|
||
if (!routesExists) { | ||
await createRoutesFile( | ||
_config, | ||
logger, | ||
routes, | ||
pages, | ||
redirects, | ||
args?.routes?.extend?.include, | ||
args?.routes?.extend?.exclude | ||
); | ||
} | ||
if (!routesExists) { | ||
await createRoutesFile( | ||
_config, | ||
logger, | ||
routes, | ||
pages, | ||
redirects, | ||
args?.routes?.extend?.include, | ||
args?.routes?.extend?.exclude | ||
); | ||
} | ||
|
||
const redirectRoutes: [IntegrationRouteData, string][] = []; | ||
for (const route of routes) { | ||
if (route.type === 'redirect') redirectRoutes.push([route, '']); | ||
} | ||
const redirectRoutes: [IntegrationRouteData, string][] = []; | ||
for (const route of routes) { | ||
if (route.type === 'redirect') redirectRoutes.push([route, '']); | ||
} | ||
|
||
const trueRedirects = createRedirectsFromAstroRoutes({ | ||
config: _config, | ||
routeToDynamicTargetMap: new Map(Array.from(redirectRoutes)), | ||
dir, | ||
}); | ||
const trueRedirects = createRedirectsFromAstroRoutes({ | ||
config: _config, | ||
routeToDynamicTargetMap: new Map(Array.from(redirectRoutes)), | ||
dir, | ||
}); | ||
|
||
if (!trueRedirects.empty()) { | ||
try { | ||
await appendFile(new URL('./_redirects', _config.outDir), trueRedirects.print()); | ||
} catch (error) { | ||
logger.error('Failed to write _redirects file'); | ||
if (!trueRedirects.empty()) { | ||
try { | ||
await appendFile(new URL('./_redirects', _config.outDir), trueRedirects.print()); | ||
} catch (error) { | ||
logger.error('Failed to write _redirects file'); | ||
} | ||
} | ||
} | ||
}, | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Regex created in a for loop are wasteful. They can be created in a top-level function and re-used