Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/hip-apes-marry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/adapter-cloudflare': patch
---

fix: avoid overriding user's existing `_headers` rules
35 changes: 21 additions & 14 deletions packages/adapter-cloudflare/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import {
is_building_for_cloudflare_pages,
validate_worker_settings,
get_routes_json,
parse_redirects
parse_redirects,
append_headers
} from './utils.js';

const name = '@sveltejs/adapter-cloudflare';
Expand Down Expand Up @@ -133,10 +134,12 @@ export default function (options = {}) {
// _headers
const headers_src = '_headers';
const headers_dest = `${dest}/_headers`;
/** @type {string | undefined} */
let headers;
if (existsSync(headers_src)) {
copyFileSync(headers_src, headers_dest);
headers = readFileSync(headers_src, 'utf-8');
}
writeFileSync(headers_dest, generate_headers(builder.getAppPath()), { flag: 'a' });
writeFileSync(headers_dest, generate_headers(builder.getAppPath(), headers));

// _redirects
const redirects_src = '_redirects';
Expand Down Expand Up @@ -218,19 +221,23 @@ export default function (options = {}) {

/**
* @param {string} app_dir
* @param {string | undefined} content existing `_headers` file content
* @returns {string}
*/
function generate_headers(app_dir) {
return `
# === START AUTOGENERATED SVELTE IMMUTABLE HEADERS ===
/${app_dir}/*
X-Robots-Tag: noindex
Cache-Control: no-cache
/${app_dir}/immutable/*
! Cache-Control
Cache-Control: public, immutable, max-age=31536000
# === END AUTOGENERATED SVELTE IMMUTABLE HEADERS ===
`.trimEnd();
function generate_headers(app_dir, content = '') {
content = append_headers(
`/${app_dir}/*`,
['X-Robots-Tag: noindex', 'Cache-Control: no-cache'],
content
);

content = append_headers(
`/${app_dir}/immutable/*`,
['! Cache-Control', 'Cache-Control: public, immutable, max-age=31536000'],
content
);

return content;
}

/**
Expand Down
26 changes: 26 additions & 0 deletions packages/adapter-cloudflare/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -163,3 +163,29 @@ export function get_routes_json(builder, client_assets, redirects, routes) {
exclude
};
}

/**
* Adds header rules to the contents of a `_headers` file
* @param {string} url
* @param {string[]} rules
* @param {string} content
* @returns {string}
*/
export function append_headers(url, rules, content) {
const regex = new RegExp(`^(${url.replaceAll('*', '\\*')})$`, 'm');
const formatted_headers = rules.map((rule) => ` ${rule}`).join('\n');

// if the URL already exists, just add header rules to it
if (regex.test(content)) {
return content.replace(regex, `$1\n${formatted_headers}`);
}

// otherwise, we add the url and header rules
return `
${content}
# === START AUTOGENERATED SVELTE IMMUTABLE HEADERS ===
${url}
${formatted_headers}
# === END AUTOGENERATED SVELTE IMMUTABLE HEADERS ===
`.trim();
}
Loading
Loading