From 47076c19fd7eaece21d7daf80b6dd4ed696fe8f9 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 29 Jul 2022 15:21:56 +0200 Subject: [PATCH 001/172] skeleton --- packages/kit/src/cli.js | 17 ++++++ .../kit/src/migrate/adjust-page-endpoints.js | 18 ++++++ .../migrate/adjust-standalone-endpoints.js | 19 ++++++ packages/kit/src/migrate/extract-load.js | 59 +++++++++++++++++++ packages/kit/src/migrate/index.js | 49 +++++++++++++++ packages/kit/src/migrate/move-files.js | 9 +++ packages/kit/src/migrate/types.d.ts | 5 ++ packages/kit/src/migrate/utils.js | 40 +++++++++++++ packages/kit/src/utils/filesystem.js | 5 ++ 9 files changed, 221 insertions(+) create mode 100644 packages/kit/src/migrate/adjust-page-endpoints.js create mode 100644 packages/kit/src/migrate/adjust-standalone-endpoints.js create mode 100644 packages/kit/src/migrate/extract-load.js create mode 100644 packages/kit/src/migrate/index.js create mode 100644 packages/kit/src/migrate/move-files.js create mode 100644 packages/kit/src/migrate/types.d.ts create mode 100644 packages/kit/src/migrate/utils.js diff --git a/packages/kit/src/cli.js b/packages/kit/src/cli.js index 7168b2a67d67..1b56d9954466 100755 --- a/packages/kit/src/cli.js +++ b/packages/kit/src/cli.js @@ -58,6 +58,23 @@ prog replace('dev'); replace('build'); replace('preview'); +prog + .command('migrate') + .describe('Migration script for https://TODO') + .action(async () => { + if (!fs.existsSync('svelte.config.js')) { + console.warn('Missing svelte.config.js — skipping'); + return; + } + + try { + const config = await load_config(); + const migrate = await import('./migrate/index.js'); + migrate.migrate(config); + } catch (error) { + handle_error(error); + } + }); prog.parse(process.argv, { unknown: (arg) => `Unknown option: ${arg}` }); diff --git a/packages/kit/src/migrate/adjust-page-endpoints.js b/packages/kit/src/migrate/adjust-page-endpoints.js new file mode 100644 index 000000000000..48405fb1eb7d --- /dev/null +++ b/packages/kit/src/migrate/adjust-page-endpoints.js @@ -0,0 +1,18 @@ +import { forEachFile } from './utils'; + +/** + * Adjust code in page endpoints + * + * @param {import('./types').BranchHierarchy} branch_hierarchy + */ +export function adjust_page_endpoints(branch_hierarchy) { + const todos = forEachFile(branch_hierarchy, /\+page-data\.(\w+)/, (content) => ({ + content: + 'throw new Error("@migration task: update page endpoint. See https://TODO how")\n' + content, + todo: 'update page endpoint' + })); + + return `## Page Endpoints + +${todos.join('\n')}`; +} diff --git a/packages/kit/src/migrate/adjust-standalone-endpoints.js b/packages/kit/src/migrate/adjust-standalone-endpoints.js new file mode 100644 index 000000000000..d1e11f7f1970 --- /dev/null +++ b/packages/kit/src/migrate/adjust-standalone-endpoints.js @@ -0,0 +1,19 @@ +import { forEachFile } from './utils'; + +/** + * Adjust code in standalone endpoints + * + * @param {import('./types').BranchHierarchy} branch_hierarchy + */ +export function adjust_standalone_endpoints(branch_hierarchy) { + const todos = forEachFile(branch_hierarchy, /\+data\.(\w+)/, (content) => ({ + content: + 'throw new Error("@migration task: update standalone endpoint. See https://TODO how")\n' + + content, + todo: 'update standalone endpoint' + })); + + return `## Standalone Endpoints + +${todos.join('\n')}`; +} diff --git a/packages/kit/src/migrate/extract-load.js b/packages/kit/src/migrate/extract-load.js new file mode 100644 index 000000000000..a0904fcd2ff5 --- /dev/null +++ b/packages/kit/src/migrate/extract-load.js @@ -0,0 +1,59 @@ +import { forEachFile } from './utils'; + +/** + * Move load function in out of module context of Svelte files into own file and adjust code + * + * @param {import('./types').BranchHierarchy} branch_hierarchy + * @param {string[]} ext File extensions that signal Svelte files + */ +export function extract_load(branch_hierarchy, ext) { + const ext_regex = ext.map((e) => e.replace('.', '\\.')).join('|'); + + const page_todos = forEachFile( + branch_hierarchy, + new RegExp(`\\+page(@\\w+)?(${ext_regex})`), + (content, [, referenced_layout]) => { + // TODO: + // 1. use regex to extra context=module (don't parse, we could be using TS) + // 2. use TS to parse contents and + // - find .svelte imports which should be left in the Svelte file and removed from the new file + // - replace __types import (for jsdocs try regex-replace) + // - adjust imports if this was moved into a folder + // 3. throw an error in the new ts/js file to tell people to adjust the code + // 4. see if we can update props in load + return { + content: content, + todo: 'check if page file was updated properly', // TODO check if props present, if yes, also add this to the todo + file: { + content: 'todo', + name: `+load${referenced_layout ? `@${referenced_layout}` : ''}.js`, // TODO TS or JS? -> check lang="ts" presence in Svelte file + todo: 'update load' + } + }; + } + ); + const layout_todos = forEachFile( + branch_hierarchy, + new RegExp(`\\+layout(-\\w+)?(@\\w+)?${ext_regex}`), + (content, [, layout_name, referenced_layout]) => { + // TODO: same as above + return { + content: content, + todo: 'check if layout file was updated properly', // TODO check if props present, if yes, also add this to the todo + file: { + content: 'todo', + name: `+layout${layout_name ? `-${layout_name}` : ''}${ + referenced_layout ? `@${referenced_layout}` : '' + }.js`, // TODO TS or JS? -> check lang="ts" presence in Svelte file + todo: 'update load' + } + }; + } + ); + + return `## Pages +${page_todos.join('\n')} + +## Layouts +${layout_todos.join('\n')}`; +} diff --git a/packages/kit/src/migrate/index.js b/packages/kit/src/migrate/index.js new file mode 100644 index 000000000000..966ff2866f65 --- /dev/null +++ b/packages/kit/src/migrate/index.js @@ -0,0 +1,49 @@ +import fs from 'fs'; +import path from 'path'; +import { walk } from '../utils/filesystem'; +import { adjust_page_endpoints } from './adjust-page-endpoints'; +import { adjust_standalone_endpoints } from './adjust-standalone-endpoints'; +import { extract_load } from './extract-load'; +import { move_files } from './move-files'; + +/** + * @param {import('types').ValidatedConfig} config + * @param {string} cwd + */ +export function migrate(config, cwd = process.cwd()) { + check_if_already_migrated(); + + const migration_folder_tmp = path.join(config.kit.outDir, '.migration'); + + const old_branch_hierarchy = walk_hierarchical(config.kit.files.routes); + move_files(old_branch_hierarchy, migration_folder_tmp); + + const new_branch_hierarchy = walk_hierarchical(migration_folder_tmp); + const load_todos = extract_load(new_branch_hierarchy, config.extensions); + const page_endpoint_todos = adjust_page_endpoints(new_branch_hierarchy); + const standalone_endpoint_todos = adjust_standalone_endpoints(new_branch_hierarchy); + + // Write todos + fs.writeFileSync( + path.join(cwd, 'migration-todos.md'), + `# Migration TODOs + +TODO some prosa and link to PR +` + [load_todos, page_endpoint_todos, standalone_endpoint_todos].join('\n\n') + ); +} + +function check_if_already_migrated() { + // TODO throw if that's the case +} + +/** + * @param {string} root + */ +function walk_hierarchical(root) { + const files = walk(root); + /** @type {import('./types').BranchHierarchy} */ + const hierarchy = { path: root, files: [], folders: [] }; + // TODO + return hierarchy; +} diff --git a/packages/kit/src/migrate/move-files.js b/packages/kit/src/migrate/move-files.js new file mode 100644 index 000000000000..7c54f2b25ce7 --- /dev/null +++ b/packages/kit/src/migrate/move-files.js @@ -0,0 +1,9 @@ +/** + * Convert to folder-based routing system and adjust names for pages, layouts etc. + * + * @param {import('./types').BranchHierarchy} branch_hierarchy + * @param {string} dest + */ +export function move_files(branch_hierarchy, dest) { + // TODO +} diff --git a/packages/kit/src/migrate/types.d.ts b/packages/kit/src/migrate/types.d.ts new file mode 100644 index 000000000000..756c97bbd07d --- /dev/null +++ b/packages/kit/src/migrate/types.d.ts @@ -0,0 +1,5 @@ +export interface BranchHierarchy { + path: string; + files: string[]; + folders: BranchHierarchy[]; +} diff --git a/packages/kit/src/migrate/utils.js b/packages/kit/src/migrate/utils.js new file mode 100644 index 000000000000..b3ffeb1a88fb --- /dev/null +++ b/packages/kit/src/migrate/utils.js @@ -0,0 +1,40 @@ +import fs from 'fs'; +import path from 'path'; + +/** + * For each file in the tree that matches `file_matcher`, do something. Returns a list of todos that are + * collected from `fun` invocations. + * + * @param {import('./types').BranchHierarchy} branch_hierarchy + * @param {RegExp} file_matcher If string, invokes ".startsWith" on the file + * @param {(content: string, match: RegExpMatchArray) => {content: string, todo?: string, file?: {name: string; content: string; todo?: string}}} fun File content and match in, new content and possibly a todo and new file out + */ +export function forEachFile(branch_hierarchy, file_matcher, fun) { + /** @type {string[]} */ + const todos = []; + + /** @type {RegExpMatchArray|null} */ + let match = null; + const file = branch_hierarchy.files.find((file) => (match = file_matcher.exec(file))); + if (file && match) { + const { content, todo, file: new_file } = fun(fs.readFileSync(file, 'utf-8'), match); + fs.writeFileSync(file, content); + if (todo) { + todos.push(`- [ ] ${todo} (at ${file})`); + } + if (new_file) { + fs.writeFileSync(path.join(branch_hierarchy.path, new_file.name), new_file.content, 'utf-8'); + if (new_file.todo) { + todos.push( + `- [ ] ${new_file.todo} (at ${path.join(branch_hierarchy.path, new_file.name)})` + ); + } + } + } + + for (const folder of branch_hierarchy.folders) { + todos.push(...forEachFile(folder, file_matcher, fun)); + } + + return todos; +} diff --git a/packages/kit/src/utils/filesystem.js b/packages/kit/src/utils/filesystem.js index 5b907ca09bd1..7fa379593390 100644 --- a/packages/kit/src/utils/filesystem.js +++ b/packages/kit/src/utils/filesystem.js @@ -101,6 +101,11 @@ export function walk(cwd, dirs = false) { return walk_dir(''), all_files; } +// foo +// foo/bar +// foo/bar/baz.ts +// foo/barr.ts +// foo /** @param {string} str */ export function posixify(str) { From 5b49486d64ea77c44259486decc7a959b6b19521 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 29 Jul 2022 16:12:27 +0200 Subject: [PATCH 002/172] add moved info to files to be able to rewrite imports later --- packages/kit/src/migrate/index.js | 3 ++- packages/kit/src/migrate/move-files.js | 2 ++ packages/kit/src/migrate/types.d.ts | 11 ++++++++++- packages/kit/src/migrate/utils.js | 6 +++--- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/kit/src/migrate/index.js b/packages/kit/src/migrate/index.js index 966ff2866f65..2adf80ac1889 100644 --- a/packages/kit/src/migrate/index.js +++ b/packages/kit/src/migrate/index.js @@ -39,8 +39,9 @@ function check_if_already_migrated() { /** * @param {string} root + * @param {string[]} moved_files */ -function walk_hierarchical(root) { +function walk_hierarchical(root, moved_files = []) { const files = walk(root); /** @type {import('./types').BranchHierarchy} */ const hierarchy = { path: root, files: [], folders: [] }; diff --git a/packages/kit/src/migrate/move-files.js b/packages/kit/src/migrate/move-files.js index 7c54f2b25ce7..aad8e72b2fc2 100644 --- a/packages/kit/src/migrate/move-files.js +++ b/packages/kit/src/migrate/move-files.js @@ -3,7 +3,9 @@ * * @param {import('./types').BranchHierarchy} branch_hierarchy * @param {string} dest + * @returns {string[]} Files that were moved down (/about.svelte -> /about/+page.svelte) */ export function move_files(branch_hierarchy, dest) { // TODO + return []; } diff --git a/packages/kit/src/migrate/types.d.ts b/packages/kit/src/migrate/types.d.ts index 756c97bbd07d..972f0afd49d0 100644 --- a/packages/kit/src/migrate/types.d.ts +++ b/packages/kit/src/migrate/types.d.ts @@ -1,5 +1,14 @@ export interface BranchHierarchy { + /** + * The whole relative path to this dir + */ path: string; - files: string[]; + /** + * Files in that dir + */ + files: Array<{ moved_down: boolean; name: string }>; + /** + * Recurse + */ folders: BranchHierarchy[]; } diff --git a/packages/kit/src/migrate/utils.js b/packages/kit/src/migrate/utils.js index b3ffeb1a88fb..1faecc07f27e 100644 --- a/packages/kit/src/migrate/utils.js +++ b/packages/kit/src/migrate/utils.js @@ -15,10 +15,10 @@ export function forEachFile(branch_hierarchy, file_matcher, fun) { /** @type {RegExpMatchArray|null} */ let match = null; - const file = branch_hierarchy.files.find((file) => (match = file_matcher.exec(file))); + const file = branch_hierarchy.files.find((file) => (match = file_matcher.exec(file.name))); if (file && match) { - const { content, todo, file: new_file } = fun(fs.readFileSync(file, 'utf-8'), match); - fs.writeFileSync(file, content); + const { content, todo, file: new_file } = fun(fs.readFileSync(file.name, 'utf-8'), match); + fs.writeFileSync(file.name, content); if (todo) { todos.push(`- [ ] ${todo} (at ${file})`); } From 9f830326dd534d20b6335d297f4cef7eff71de42 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 29 Jul 2022 18:11:35 +0200 Subject: [PATCH 003/172] add magic-string, start load extraction and manipulation logic --- packages/kit/package.json | 1 + packages/kit/src/migrate/extract-load.js | 294 ++++++++++++++++++++++- packages/kit/src/migrate/types.d.ts | 21 ++ packages/kit/src/migrate/utils.js | 36 ++- pnpm-lock.yaml | 2 + 5 files changed, 339 insertions(+), 15 deletions(-) diff --git a/packages/kit/package.json b/packages/kit/package.json index 37c7855cc405..67e7be3dd95d 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -29,6 +29,7 @@ "devalue": "^2.0.1", "kleur": "^4.1.4", "locate-character": "^2.0.5", + "magic-string": "~0.26.2", "marked": "^4.0.16", "mime": "^3.0.0", "node-fetch": "^3.2.4", diff --git a/packages/kit/src/migrate/extract-load.js b/packages/kit/src/migrate/extract-load.js index a0904fcd2ff5..1d17cd0c3ae9 100644 --- a/packages/kit/src/migrate/extract-load.js +++ b/packages/kit/src/migrate/extract-load.js @@ -1,4 +1,7 @@ +import { parse } from 'svelte/compiler'; import { forEachFile } from './utils'; +import MagicString from 'magic-string'; +import ts from 'typescript'; /** * Move load function in out of module context of Svelte files into own file and adjust code @@ -12,7 +15,135 @@ export function extract_load(branch_hierarchy, ext) { const page_todos = forEachFile( branch_hierarchy, new RegExp(`\\+page(@\\w+)?(${ext_regex})`), - (content, [, referenced_layout]) => { + (content, [, referenced_layout], moved_down) => { + const result = parseHtmlx(content); + if (!result) { + return; + } + const { htmlx_ast, is_ts, module_ts_ast, html_str, module_str, module_context } = result; + + const module_ast_offset = module_context.content.start; + /** @type {string[]} imports to be kept in the Svelte file */ + const svelte_imports = []; + /** + * @param {ts.Node} node + * @param {ts.Node} parent + */ + const walk = (node, parent) => { + // type onLeaveCallback = () => void; + // const onLeaveCallbacks: onLeaveCallback[] = []; + + // early stop gaps to not confuse ourselves + if ( + ts.isClassDeclaration(node) || + ts.isTypeAliasDeclaration(node) || + ts.isInterfaceDeclaration(node) + ) { + return; + } + + // Update imports + if (ts.isImportDeclaration(node)) { + if (moved_down) { + adjust_relative_import(node.moduleSpecifier, module_str); + } + const import_path = node.moduleSpecifier.getText().slice(1, -1); // omit " / ' + if (import_path.endsWith('.svelte')) { + svelte_imports.push(node.getText()); + } + if (import_path.startsWith('./__types')) { + module_str.overwrite( + node.moduleSpecifier.getStart() + 1, + node.moduleSpecifier.getEnd() - 1, + './$types' + ); + } + } else if ( + moved_down && + ts.isCallExpression(node) && + node.expression.kind === ts.SyntaxKind.ImportKeyword + ) { + // import('..') + adjust_relative_import(node.arguments[0], module_str); + } + + // if (ts.isVariableStatement(node)) { + // exportedNames.handleVariableStatement(node, parent); + // } + + // if (ts.isFunctionDeclaration(node)) { + // exportedNames.handleExportFunctionOrClass(node); + + // pushScope(); + // onLeaveCallbacks.push(() => popScope()); + // } + + // if (ts.isBlock(node) || ts.isArrowFunction(node) || ts.isFunctionExpression(node)) { + // pushScope(); + // onLeaveCallbacks.push(() => popScope()); + // } + + // if (ts.isExportDeclaration(node)) { + // exportedNames.handleExportDeclaration(node); + // } + + // if (ts.isImportDeclaration(node)) { + // handleImportDeclaration(node, str, astOffset, script.start, tsAst); + + // // Check if import is the event dispatcher + // events.checkIfImportIsEventDispatcher(node); + // } + + // // workaround for import statement completion + // if (ts.isImportEqualsDeclaration(node)) { + // const end = node.getEnd() + astOffset; + + // if (str.original[end - 1] !== ';') { + // preprendStr(str, end, ';'); + // } + // } + + // if (ts.isVariableDeclaration(node)) { + // events.checkIfIsStringLiteralDeclaration(node); + // events.checkIfDeclarationInstantiatedEventDispatcher(node); + // implicitStoreValues.addVariableDeclaration(node); + // } + + // if (ts.isCallExpression(node)) { + // events.checkIfCallExpressionIsDispatch(node); + // } + + // if (ts.isVariableDeclaration(parent) && parent.name == node) { + // isDeclaration = true; + // onLeaveCallbacks.push(() => (isDeclaration = false)); + // } + + // if (ts.isBindingElement(parent) && parent.name == node) { + // isDeclaration = true; + // onLeaveCallbacks.push(() => (isDeclaration = false)); + // } + + // if (ts.isImportClause(node)) { + // isDeclaration = true; + // onLeaveCallbacks.push(() => (isDeclaration = false)); + // implicitStoreValues.addImportStatement(node); + // } + + // if (ts.isImportSpecifier(node)) { + // implicitStoreValues.addImportStatement(node); + // } + + // //handle stores etc + // if (ts.isIdentifier(node)) { + // handleIdentifier(node, parent); + // } + + ts.forEachChild(node, (n) => walk(n, node)); + // onLeaveCallbacks.map((c) => c()); + }; + + module_ts_ast.forEachChild((n) => walk(n, module_ts_ast)); + // TODO: // 1. use regex to extra context=module (don't parse, we could be using TS) // 2. use TS to parse contents and @@ -25,8 +156,8 @@ export function extract_load(branch_hierarchy, ext) { content: content, todo: 'check if page file was updated properly', // TODO check if props present, if yes, also add this to the todo file: { - content: 'todo', - name: `+load${referenced_layout ? `@${referenced_layout}` : ''}.js`, // TODO TS or JS? -> check lang="ts" presence in Svelte file + content: module_str.toString(), + name: `+load${referenced_layout ? `@${referenced_layout}` : ''}.${is_ts ? 'ts' : 'js'}`, todo: 'update load' } }; @@ -36,6 +167,12 @@ export function extract_load(branch_hierarchy, ext) { branch_hierarchy, new RegExp(`\\+layout(-\\w+)?(@\\w+)?${ext_regex}`), (content, [, layout_name, referenced_layout]) => { + const result = parseHtmlx(content); + if (!result) { + return; + } + const { htmlx_ast, is_ts, module_ts_ast, html_str, module_str, module_context } = result; + // TODO: same as above return { content: content, @@ -44,7 +181,7 @@ export function extract_load(branch_hierarchy, ext) { content: 'todo', name: `+layout${layout_name ? `-${layout_name}` : ''}${ referenced_layout ? `@${referenced_layout}` : '' - }.js`, // TODO TS or JS? -> check lang="ts" presence in Svelte file + }.${is_ts ? 'ts' : 'js'}`, todo: 'update load' } }; @@ -57,3 +194,152 @@ ${page_todos.join('\n')} ## Layouts ${layout_todos.join('\n')}`; } + +/** + * @param {ts.Expression} expr + * @param {MagicString} str + */ +function adjust_relative_import(expr, str) { + const text = expr.getText().substring(1); + if (text.startsWith('../')) { + str.overwrite(expr.getFullStart() + 1, expr.getFullStart() + 4, '../../'); + } else if (text.startsWith('./')) { + str.overwrite(expr.getFullStart() + 1, expr.getFullStart() + 3, '../'); + } +} + +/** + * @param {string} str + */ +function parseAttributes(str) { + /** @type {import('./types').Attribute[]} */ + const attrs = []; + str + .split(/\s+/) + .filter(Boolean) + .forEach((attr) => { + const [name, value] = attr.split('='); + attrs.push({ + name, + value: value.startsWith('"') || value.startsWith("'") ? value.slice(1, -1) : value + }); + }); + + return attrs; +} + +/** + * @param {string} htmlx + * @param {string} tag + */ +function extractTag(htmlx, tag) { + const exp = new RegExp(`()|(<${tag}([\\S\\s]*?)>)([\\S\\s]*?)<\\/${tag}>`, 'g'); + /**@type {import('./types').VerbatimElement[]} */ + const matches = []; + + /** @type { RegExpExecArray | null } */ + let match = null; + while ((match = exp.exec(htmlx)) != null) { + if (match[0].startsWith(''; + } ); + + return { module, main }; } -function check_if_already_migrated() { - // TODO throw if that's the case +/** @param {string} content */ +function adjust_imports(content) { + const ast = ts.createSourceFile( + 'filename.ts', + content, + ts.ScriptTarget.Latest, + true, + ts.ScriptKind.TS + ); + + const code = new MagicString(content); + + /** @param {number} pos */ + function adjust(pos) { + // TypeScript AST is a clusterfuck, we need to step forward to find + // where the node _actually_ starts + while (content[pos] !== '.') pos += 1; + + // replace ../ with ../../ and ./ with ../ + code.prependLeft(pos, content[pos + 1] === '.' ? '../' : '.'); + } + + /** @param {ts.Node} node */ + function walk(node) { + if (ts.isImportDeclaration(node)) { + const text = /** @type {ts.StringLiteral} */ (node.moduleSpecifier).text; + if (text[0] === '.') adjust(node.moduleSpecifier.pos); + } + + if (ts.isCallExpression(node) && node.expression.getText() === 'import') { + const arg = node.arguments[0]; + + if (ts.isStringLiteral(arg)) { + if (arg.text[0] === '.') adjust(arg.pos); + } else if (ts.isTemplateLiteral(arg) && !ts.isNoSubstitutionTemplateLiteral(arg)) { + if (arg.head.text[0] === '.') adjust(arg.head.pos); + } + } + + node.forEachChild(walk); + } + + ast.forEachChild(walk); + + return code.toString(); } -/** - * @param {string} root - * @param {string[]} moved_files - */ -function walk_hierarchical(root, moved_files = []) { - const files = walk(root); - /** @type {import('./types').BranchHierarchy} */ - const hierarchy = { path: root, files: [], folders: [] }; - // TODO - return hierarchy; +/** @param {string} content */ +function dedent(content) { + const indent = guess_indent(content); + if (!indent) return content; + + /** @type {string[]} */ + const substitutions = []; + + const ast = ts.createSourceFile( + 'filename.ts', + content, + ts.ScriptTarget.Latest, + true, + ts.ScriptKind.TS + ); + + const code = new MagicString(content); + + /** @param {ts.Node} node */ + function walk(node) { + if (ts.isTemplateLiteral(node)) { + let pos = node.pos; + while (/\s/.test(content[pos])) pos += 1; + + code.overwrite(pos, node.end, `____SUBSTITUTION_${substitutions.length}____`); + substitutions.push(node.getText()); + } + + node.forEachChild(walk); + } + + ast.forEachChild(walk); + + return code + .toString() + .replace(new RegExp(`^${indent}`, 'gm'), '') + .replace(/____SUBSTITUTION_(\d+)____/g, (match, index) => substitutions[index]); +} + +/** @param {string} content */ +function guess_indent(content) { + const lines = content.split('\n'); + + const tabbed = lines.filter((line) => /^\t+/.test(line)); + const spaced = lines.filter((line) => /^ {2,}/.test(line)); + + if (tabbed.length === 0 && spaced.length === 0) { + return null; + } + + // More lines tabbed than spaced? Assume tabs, and + // default to tabs in the case of a tie (or nothing + // to go on) + if (tabbed.length >= spaced.length) { + return '\t'; + } + + // Otherwise, we need to guess the multiple + const min = spaced.reduce((previous, current) => { + const count = /^ +/.exec(current)[0].length; + return Math.min(count, previous); + }, Infinity); + + return new Array(min + 1).join(' '); } diff --git a/packages/migrate/migrations/routes/move-files.js b/packages/migrate/migrations/routes/move-files.js deleted file mode 100644 index aad8e72b2fc2..000000000000 --- a/packages/migrate/migrations/routes/move-files.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Convert to folder-based routing system and adjust names for pages, layouts etc. - * - * @param {import('./types').BranchHierarchy} branch_hierarchy - * @param {string} dest - * @returns {string[]} Files that were moved down (/about.svelte -> /about/+page.svelte) - */ -export function move_files(branch_hierarchy, dest) { - // TODO - return []; -} diff --git a/packages/migrate/migrations/routes/utils.js b/packages/migrate/migrations/routes/utils.js deleted file mode 100644 index ea5d53c4dcc4..000000000000 --- a/packages/migrate/migrations/routes/utils.js +++ /dev/null @@ -1,54 +0,0 @@ -import fs from 'fs'; -import path from 'path'; - -/** - * For each file in the tree that matches `file_matcher`, do something. Returns a list of todos that are - * collected from `fun` invocations. - * - * @param {import('./types').BranchHierarchy} branch_hierarchy - * - * @param {RegExp} file_matcher If string, invokes ".startsWith" on the file - * - * @param {(content: string, match: RegExpMatchArray, moved_down: boolean) => undefined | {content: string, todo?: string, file?: {name: string; content: string; todo?: string}}} fun - * File content and match in, new content and possibly a todo and new file out - */ -export function forEachFile(branch_hierarchy, file_matcher, fun) { - /** @type {string[]} */ - const todos = []; - - /** @type {RegExpMatchArray|null} */ - let match = null; - const file = branch_hierarchy.files.find((file) => (match = file_matcher.exec(file.name))); - if (file && match) { - const result = fun( - fs.readFileSync(path.join(branch_hierarchy.path, file.name), 'utf-8'), - match, - file.moved_down - ); - if (result) { - const { content, todo, file: new_file } = result; - fs.writeFileSync(path.join(branch_hierarchy.path, file.name), content); - if (todo) { - todos.push(`- [ ] ${todo} (at ${file})`); - } - if (new_file) { - fs.writeFileSync( - path.join(branch_hierarchy.path, new_file.name), - new_file.content, - 'utf-8' - ); - if (new_file.todo) { - todos.push( - `- [ ] ${new_file.todo} (at ${path.join(branch_hierarchy.path, new_file.name)})` - ); - } - } - } - } - - for (const folder of branch_hierarchy.folders) { - todos.push(...forEachFile(folder, file_matcher, fun)); - } - - return todos; -} diff --git a/packages/migrate/package.json b/packages/migrate/package.json index 375d7822bd18..d17e9c1d6aa4 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -20,6 +20,15 @@ "migrations" ], "dependencies": { - "kleur": "^4.1.4" + "kleur": "^4.1.4", + "magic-string": "^0.26.2", + "prompts": "^2.4.2", + "tiny-glob": "^0.2.9", + "tippex": "^3.0.0", + "typescript": "^4.7.4" + }, + "devDependencies": { + "@types/prompts": "^2.0.14", + "prettier": "^2.6.2" } } diff --git a/packages/migrate/tsconfig.json b/packages/migrate/tsconfig.json new file mode 100644 index 000000000000..935dd8553604 --- /dev/null +++ b/packages/migrate/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "noEmit": true, + "noImplicitAny": true, + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true + }, + "include": ["./migrations/**/*", "./bin.js"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86b9587e8757..c4b63036297d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -509,9 +509,24 @@ importers: packages/migrate: specifiers: + '@types/prompts': ^2.0.14 kleur: ^4.1.4 + magic-string: ^0.26.2 + prettier: ^2.6.2 + prompts: ^2.4.2 + tiny-glob: ^0.2.9 + tippex: ^3.0.0 + typescript: ^4.7.4 dependencies: kleur: 4.1.5 + magic-string: 0.26.2 + prompts: 2.4.2 + tiny-glob: 0.2.9 + tippex: 3.0.0 + typescript: 4.7.4 + devDependencies: + '@types/prompts': 2.0.14 + prettier: 2.7.1 sites/kit.svelte.dev: specifiers: @@ -4181,6 +4196,10 @@ packages: engines: {node: '>=4'} dev: true + /tippex/3.0.0: + resolution: {integrity: sha512-64i7qAmJgPzsIOa3LbH6zeZ29qHD4UCD9kx8s2F2USDJ1abRE8eG7G6RRAOhJvQxOqnAmAQaREvFa5LUwf048Q==} + dev: false + /tmp/0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -4394,7 +4413,6 @@ packages: resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} engines: {node: '>=4.2.0'} hasBin: true - dev: true /uglify-js/3.16.1: resolution: {integrity: sha512-X5BGTIDH8U6IQ1TIRP62YC36k+ULAa1d59BxlWvPUJ1NkW5L3FwcGfEzuVvGmhJFBu0YJ5Ge25tmRISqCmLiRQ==} From 07ca11fee2c27daf76e7127ab090fa871c7c7ee5 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 31 Jul 2022 15:50:50 -0400 Subject: [PATCH 008/172] +page.server.js and +server.js --- packages/migrate/migrations/routes/index.js | 24 ++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js index d3d01a99f632..953d273b71e3 100644 --- a/packages/migrate/migrations/routes/index.js +++ b/packages/migrate/migrations/routes/index.js @@ -124,7 +124,29 @@ export async function migrate() { } } else if (module_ext) { const bare = basename.slice(0, -module_ext.length); - // TODO +page.server.js, +layout.server.js, +server.js + const [name] = bare.split('@'); + + const is_page_endpoint = extensions.some((ext) => + files.includes(`${file.slice(0, -module_ext.length)}${ext}`) + ); + + const type = is_page_endpoint ? '+page.server' : '+server'; + + const move_to_directory = name !== 'index'; + const renamed = + file.slice(0, -basename.length) + + (move_to_directory ? `${name}/${type}${module_ext}` : `${type}${module_ext}`); + + fs.unlinkSync(file); + + if (move_to_directory) { + const dir = path.dirname(renamed); + if (!fs.existsSync(dir)) fs.mkdirSync(dir); + + fs.writeFileSync(renamed, adjust_imports(content)); + } else { + fs.writeFileSync(renamed, content); + } } } } From 836227b260a6c5b7289d5c7d7a23f06ec4f29584 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 31 Jul 2022 16:01:42 -0400 Subject: [PATCH 009/172] remove unused code --- .../migrate/migrations/routes/extract-load.js | 345 ------------------ packages/migrate/migrations/routes/types.d.ts | 35 -- 2 files changed, 380 deletions(-) delete mode 100644 packages/migrate/migrations/routes/extract-load.js delete mode 100644 packages/migrate/migrations/routes/types.d.ts diff --git a/packages/migrate/migrations/routes/extract-load.js b/packages/migrate/migrations/routes/extract-load.js deleted file mode 100644 index 08bb8ffeaaff..000000000000 --- a/packages/migrate/migrations/routes/extract-load.js +++ /dev/null @@ -1,345 +0,0 @@ -import { parse } from 'svelte/compiler'; -import MagicString from 'magic-string'; -import ts from 'typescript'; -import { forEachFile } from './utils.js'; - -/** - * Move load function in out of module context of Svelte files into own file and adjust code - * - * @param {import('./types').BranchHierarchy} branch_hierarchy - * @param {string[]} ext File extensions that signal Svelte files - */ -export function extract_load(branch_hierarchy, ext) { - const ext_regex = ext.map((e) => e.replace('.', '\\.')).join('|'); - - const page_todos = forEachFile( - branch_hierarchy, - new RegExp(`\\+page(@\\w+)?(${ext_regex})`), - (content, [, referenced_layout], moved_down) => { - const result = parseHtmlx(content); - if (!result) { - return; - } - const { htmlx_ast, is_ts, module_ts_ast, html_str, module_str, module_context } = result; - - const module_ast_offset = module_context.content.start; - /** @type {string[]} imports to be kept in the Svelte file */ - const svelte_imports = []; - /** - * @param {ts.Node} node - * @param {ts.Node} parent - */ - const walk = (node, parent) => { - // type onLeaveCallback = () => void; - // const onLeaveCallbacks: onLeaveCallback[] = []; - - // early stop gaps to not confuse ourselves - if ( - ts.isClassDeclaration(node) || - ts.isTypeAliasDeclaration(node) || - ts.isInterfaceDeclaration(node) - ) { - return; - } - - // Update imports - if (ts.isImportDeclaration(node)) { - if (moved_down) { - adjust_relative_import(node.moduleSpecifier, module_str); - } - const import_path = node.moduleSpecifier.getText().slice(1, -1); // omit " / ' - if (import_path.endsWith('.svelte')) { - svelte_imports.push(node.getText()); - } - if (import_path.startsWith('./__types')) { - module_str.overwrite( - node.moduleSpecifier.getStart() + 1, - node.moduleSpecifier.getEnd() - 1, - './$types' - ); - } - } else if ( - moved_down && - ts.isCallExpression(node) && - node.expression.kind === ts.SyntaxKind.ImportKeyword - ) { - // import('..') - adjust_relative_import(node.arguments[0], module_str); - } - - // if (ts.isVariableStatement(node)) { - // exportedNames.handleVariableStatement(node, parent); - // } - - // if (ts.isFunctionDeclaration(node)) { - // exportedNames.handleExportFunctionOrClass(node); - - // pushScope(); - // onLeaveCallbacks.push(() => popScope()); - // } - - // if (ts.isBlock(node) || ts.isArrowFunction(node) || ts.isFunctionExpression(node)) { - // pushScope(); - // onLeaveCallbacks.push(() => popScope()); - // } - - // if (ts.isExportDeclaration(node)) { - // exportedNames.handleExportDeclaration(node); - // } - - // if (ts.isImportDeclaration(node)) { - // handleImportDeclaration(node, str, astOffset, script.start, tsAst); - - // // Check if import is the event dispatcher - // events.checkIfImportIsEventDispatcher(node); - // } - - // // workaround for import statement completion - // if (ts.isImportEqualsDeclaration(node)) { - // const end = node.getEnd() + astOffset; - - // if (str.original[end - 1] !== ';') { - // preprendStr(str, end, ';'); - // } - // } - - // if (ts.isVariableDeclaration(node)) { - // events.checkIfIsStringLiteralDeclaration(node); - // events.checkIfDeclarationInstantiatedEventDispatcher(node); - // implicitStoreValues.addVariableDeclaration(node); - // } - - // if (ts.isCallExpression(node)) { - // events.checkIfCallExpressionIsDispatch(node); - // } - - // if (ts.isVariableDeclaration(parent) && parent.name == node) { - // isDeclaration = true; - // onLeaveCallbacks.push(() => (isDeclaration = false)); - // } - - // if (ts.isBindingElement(parent) && parent.name == node) { - // isDeclaration = true; - // onLeaveCallbacks.push(() => (isDeclaration = false)); - // } - - // if (ts.isImportClause(node)) { - // isDeclaration = true; - // onLeaveCallbacks.push(() => (isDeclaration = false)); - // implicitStoreValues.addImportStatement(node); - // } - - // if (ts.isImportSpecifier(node)) { - // implicitStoreValues.addImportStatement(node); - // } - - // //handle stores etc - // if (ts.isIdentifier(node)) { - // handleIdentifier(node, parent); - // } - - ts.forEachChild(node, (n) => walk(n, node)); - // onLeaveCallbacks.map((c) => c()); - }; - - module_ts_ast.forEachChild((n) => walk(n, module_ts_ast)); - - // TODO: - // 1. use regex to extra context=module (don't parse, we could be using TS) - // 2. use TS to parse contents and - // - find .svelte imports which should be left in the Svelte file and removed from the new file - // - replace __types import (for jsdocs try regex-replace) - // - adjust imports if this was moved into a folder - // 3. throw an error in the new ts/js file to tell people to adjust the code - // 4. see if we can update props in load - return { - content: content, - todo: 'check if page file was updated properly', // TODO check if props present, if yes, also add this to the todo - file: { - content: module_str.toString(), - name: `+load${referenced_layout ? `@${referenced_layout}` : ''}.${is_ts ? 'ts' : 'js'}`, - todo: 'update load' - } - }; - } - ); - const layout_todos = forEachFile( - branch_hierarchy, - new RegExp(`\\+layout(-\\w+)?(@\\w+)?${ext_regex}`), - (content, [, layout_name, referenced_layout]) => { - const result = parseHtmlx(content); - if (!result) { - return; - } - const { htmlx_ast, is_ts, module_ts_ast, html_str, module_str, module_context } = result; - - // TODO: same as above - return { - content: content, - todo: 'check if layout file was updated properly', // TODO check if props present, if yes, also add this to the todo - file: { - content: 'todo', - name: `+layout${layout_name ? `-${layout_name}` : ''}${ - referenced_layout ? `@${referenced_layout}` : '' - }.${is_ts ? 'ts' : 'js'}`, - todo: 'update load' - } - }; - } - ); - - return `## Pages -${page_todos.join('\n')} - -## Layouts -${layout_todos.join('\n')}`; -} - -/** - * @param {ts.Expression} expr - * @param {MagicString} str - */ -function adjust_relative_import(expr, str) { - const text = expr.getText().substring(1); - if (text.startsWith('../')) { - str.overwrite(expr.getFullStart() + 1, expr.getFullStart() + 4, '../../'); - } else if (text.startsWith('./')) { - str.overwrite(expr.getFullStart() + 1, expr.getFullStart() + 3, '../'); - } -} - -/** - * @param {string} str - */ -function parseAttributes(str) { - /** @type {import('./types').Attribute[]} */ - const attrs = []; - str - .split(/\s+/) - .filter(Boolean) - .forEach((attr) => { - const [name, value] = attr.split('='); - attrs.push({ - name, - value: value.startsWith('"') || value.startsWith("'") ? value.slice(1, -1) : value - }); - }); - - return attrs; -} - -/** - * @param {string} htmlx - * @param {string} tag - */ -function extractTag(htmlx, tag) { - const exp = new RegExp(`()|(<${tag}([\\S\\s]*?)>)([\\S\\s]*?)<\\/${tag}>`, 'g'); - /**@type {import('./types').VerbatimElement[]} */ - const matches = []; - - /** @type { RegExpExecArray | null } */ - let match = null; - while ((match = exp.exec(htmlx)) != null) { - if (match[0].startsWith(''; + return ``; } ); From f08c6cd1a6458bd79a6549becdb85be083f41147 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 31 Jul 2022 16:51:06 -0400 Subject: [PATCH 012/172] fix detection --- packages/migrate/migrations/routes/index.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js index ea91aedb8305..ff5ca17e5858 100644 --- a/packages/migrate/migrations/routes/index.js +++ b/packages/migrate/migrations/routes/index.js @@ -58,8 +58,13 @@ export async function migrate() { // validate before proceeding for (const file of files) { const basename = path.basename(file); - if (basename.startsWith('+page.')) { - bail(`It looks like this migration has already run (found ${relative(file)}). Aborting`); + if ( + basename.startsWith('+page.') || + basename.startsWith('+layout.') || + basename.startsWith('+server.') || + basename.startsWith('+error.') + ) { + bail(`It looks like this migration has already been run (found ${relative(file)}). Aborting`); } if (basename.startsWith('+')) { From 3a119b5d7e5a51a77c53144a0798abed47a94e4a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 31 Jul 2022 16:51:52 -0400 Subject: [PATCH 013/172] consistent casing --- packages/migrate/migrations/routes/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js index ff5ca17e5858..d1d838818663 100644 --- a/packages/migrate/migrations/routes/index.js +++ b/packages/migrate/migrations/routes/index.js @@ -149,7 +149,7 @@ export async function migrate() { if (module) { const ext = /]+lang=['"](ts|typescript)['"][^]*>/.test(module) ? '.js' : '.ts'; const injected = /load/.test(module) - ? `${error('update load function', '3292693')}\n\n` + ? `${error('Update load function', '3292693')}\n\n` : ''; const content = dedent(move_to_directory ? adjust_imports(module) : module); From f3a2d7cbabe99b0c13ceaf3a7babf02f3411f7e3 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 31 Jul 2022 19:55:02 -0400 Subject: [PATCH 014/172] not sure if typescript will ever fail to parse, but in any case its handled now --- packages/migrate/migrations/routes/index.js | 141 +++++++++++--------- 1 file changed, 76 insertions(+), 65 deletions(-) diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js index d1d838818663..3340f67d958f 100644 --- a/packages/migrate/migrations/routes/index.js +++ b/packages/migrate/migrations/routes/index.js @@ -171,16 +171,16 @@ export async function migrate() { file.slice(0, -basename.length) + (move_to_directory ? `${name}/${type}${module_ext}` : `${type}${module_ext}`); - fs.unlinkSync(file); + const injected = error(`Update ${type}.js`, is_page_endpoint ? '3292699' : '3292701'); + const edited = `${injected}\n\n${move_to_directory ? adjust_imports(content) : content}`; if (move_to_directory) { const dir = path.dirname(renamed); if (!fs.existsSync(dir)) fs.mkdirSync(dir); - - fs.writeFileSync(renamed, adjust_imports(content)); - } else { - fs.writeFileSync(renamed, content); } + + fs.unlinkSync(file); + fs.writeFileSync(renamed, edited); } } } @@ -203,49 +203,55 @@ function extract_load(content) { /** @param {string} content */ function adjust_imports(content) { - const ast = ts.createSourceFile( - 'filename.ts', - content, - ts.ScriptTarget.Latest, - true, - ts.ScriptKind.TS - ); + try { + const ast = ts.createSourceFile( + 'filename.ts', + content, + ts.ScriptTarget.Latest, + true, + ts.ScriptKind.TS + ); + + const code = new MagicString(content); + + /** @param {number} pos */ + function adjust(pos) { + // TypeScript AST is a clusterfuck, we need to step forward to find + // where the node _actually_ starts + while (content[pos] !== '.') pos += 1; + + // replace ../ with ../../ and ./ with ../ + code.prependLeft(pos, content[pos + 1] === '.' ? '../' : '.'); + } - const code = new MagicString(content); + /** @param {ts.Node} node */ + function walk(node) { + if (ts.isImportDeclaration(node)) { + const text = /** @type {ts.StringLiteral} */ (node.moduleSpecifier).text; + if (text[0] === '.') adjust(node.moduleSpecifier.pos); + } - /** @param {number} pos */ - function adjust(pos) { - // TypeScript AST is a clusterfuck, we need to step forward to find - // where the node _actually_ starts - while (content[pos] !== '.') pos += 1; + if (ts.isCallExpression(node) && node.expression.getText() === 'import') { + const arg = node.arguments[0]; - // replace ../ with ../../ and ./ with ../ - code.prependLeft(pos, content[pos + 1] === '.' ? '../' : '.'); - } + if (ts.isStringLiteral(arg)) { + if (arg.text[0] === '.') adjust(arg.pos); + } else if (ts.isTemplateLiteral(arg) && !ts.isNoSubstitutionTemplateLiteral(arg)) { + if (arg.head.text[0] === '.') adjust(arg.head.pos); + } + } - /** @param {ts.Node} node */ - function walk(node) { - if (ts.isImportDeclaration(node)) { - const text = /** @type {ts.StringLiteral} */ (node.moduleSpecifier).text; - if (text[0] === '.') adjust(node.moduleSpecifier.pos); + node.forEachChild(walk); } - if (ts.isCallExpression(node) && node.expression.getText() === 'import') { - const arg = node.arguments[0]; + ast.forEachChild(walk); - if (ts.isStringLiteral(arg)) { - if (arg.text[0] === '.') adjust(arg.pos); - } else if (ts.isTemplateLiteral(arg) && !ts.isNoSubstitutionTemplateLiteral(arg)) { - if (arg.head.text[0] === '.') adjust(arg.head.pos); - } - } - - node.forEachChild(walk); + return code.toString(); + } catch { + // this is enough of an edge case that it's probably fine to + // just leave the code as we found it + return content; } - - ast.forEachChild(walk); - - return code.toString(); } /** @param {string} content */ @@ -256,35 +262,40 @@ function dedent(content) { /** @type {string[]} */ const substitutions = []; - const ast = ts.createSourceFile( - 'filename.ts', - content, - ts.ScriptTarget.Latest, - true, - ts.ScriptKind.TS - ); - - const code = new MagicString(content); - - /** @param {ts.Node} node */ - function walk(node) { - if (ts.isTemplateLiteral(node)) { - let pos = node.pos; - while (/\s/.test(content[pos])) pos += 1; + try { + const ast = ts.createSourceFile( + 'filename.ts', + content, + ts.ScriptTarget.Latest, + true, + ts.ScriptKind.TS + ); + + const code = new MagicString(content); + + /** @param {ts.Node} node */ + function walk(node) { + if (ts.isTemplateLiteral(node)) { + let pos = node.pos; + while (/\s/.test(content[pos])) pos += 1; + + code.overwrite(pos, node.end, `____SUBSTITUTION_${substitutions.length}____`); + substitutions.push(node.getText()); + } - code.overwrite(pos, node.end, `____SUBSTITUTION_${substitutions.length}____`); - substitutions.push(node.getText()); + node.forEachChild(walk); } - node.forEachChild(walk); - } - - ast.forEachChild(walk); + ast.forEachChild(walk); - return code - .toString() - .replace(new RegExp(`^${indent}`, 'gm'), '') - .replace(/____SUBSTITUTION_(\d+)____/g, (match, index) => substitutions[index]); + return code + .toString() + .replace(new RegExp(`^${indent}`, 'gm'), '') + .replace(/____SUBSTITUTION_(\d+)____/g, (match, index) => substitutions[index]); + } catch { + // as above — ignore this edge case + return content; + } } /** @param {string} content */ From d9b988f4dd7bc29faeea4b866bd771a827ee4346 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 31 Jul 2022 20:05:57 -0400 Subject: [PATCH 015/172] handle error with module context --- packages/migrate/migrations/routes/index.js | 23 ++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js index 3340f67d958f..03cefe04afac 100644 --- a/packages/migrate/migrations/routes/index.js +++ b/packages/migrate/migrations/routes/index.js @@ -99,7 +99,7 @@ export async function migrate() { const bare = basename.slice(0, -svelte_ext.length); const [name, layout] = bare.split('@'); - const { module, main } = extract_load(content); + const { module, main } = extract_load(content, bare === '__error'); let move_to_directory = false; let renamed = file.slice(0, -basename.length); @@ -185,14 +185,27 @@ export async function migrate() { } } -/** @param {string} content */ -function extract_load(content) { +/** + * @param {string} content + * @param {boolean} is_error + */ +function extract_load(content, is_error) { /** @type {string | null} */ let module = null; const main = content.replace( - /]+context=(['"])module\1[^>]*>([^]*?)<\/script>/, - (match, quote, contents) => { + /]+context=(['"])module\1[^>]*)>([^]*?)<\/script>/, + (match, attrs, quote, contents) => { + if (is_error) { + // special case — load is no longer supported in load + const indent = guess_indent(contents) ?? ''; + + contents = contents.replace(/^(.+)/gm, '// $1'); + const body = `\n${indent}${error('Replace error load function', '3293209')}\n${contents}`; + + return `${body}`; + } + module = contents.replace(/^\n/, ''); return ``; } From c3a2987d17819dcf45309babebf4c3ca499685fe Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 31 Jul 2022 20:16:26 -0400 Subject: [PATCH 016/172] add some comments --- packages/migrate/migrations/routes/index.js | 25 +++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js index 03cefe04afac..646f6f72b103 100644 --- a/packages/migrate/migrations/routes/index.js +++ b/packages/migrate/migrations/routes/index.js @@ -90,19 +90,34 @@ export async function migrate() { const basename = path.basename(file); if (!filter(file) && !basename.startsWith('__')) continue; - const content = fs.readFileSync(file, 'utf8'); + // replace `./__types` or `./__types/foo` with `./$types` + const content = fs.readFileSync(file, 'utf8').replace(/\.\/__types(?:\/[^'"]+)?/g, './$types'); const svelte_ext = extensions.find((ext) => file.endsWith(ext)); const module_ext = module_extensions.find((ext) => file.endsWith(ext)); if (svelte_ext) { + // file is a component const bare = basename.slice(0, -svelte_ext.length); const [name, layout] = bare.split('@'); const { module, main } = extract_load(content, bare === '__error'); + /** + * Whether file should be moved to a subdirectory — e.g. `src/routes/about.svelte` + * should become `src/routes/about/+page.svelte` + */ let move_to_directory = false; + + /** + * The new name of the file + */ let renamed = file.slice(0, -basename.length); + + /** + * If a component has ` - diff --git a/packages/create-svelte/templates/default/src/routes/+page.ts b/packages/create-svelte/templates/default/src/routes/+page.ts new file mode 100644 index 000000000000..189f71e2e1b3 --- /dev/null +++ b/packages/create-svelte/templates/default/src/routes/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/packages/create-svelte/templates/default/src/routes/about.svelte b/packages/create-svelte/templates/default/src/routes/about/+page.svelte similarity index 63% rename from packages/create-svelte/templates/default/src/routes/about.svelte rename to packages/create-svelte/templates/default/src/routes/about/+page.svelte index 1817ae41ba3b..b034478a5b15 100644 --- a/packages/create-svelte/templates/default/src/routes/about.svelte +++ b/packages/create-svelte/templates/default/src/routes/about/+page.svelte @@ -1,19 +1,3 @@ - - About diff --git a/packages/create-svelte/templates/default/src/routes/about/+page.ts b/packages/create-svelte/templates/default/src/routes/about/+page.ts new file mode 100644 index 000000000000..3e094ec8e74a --- /dev/null +++ b/packages/create-svelte/templates/default/src/routes/about/+page.ts @@ -0,0 +1,13 @@ +import { browser, dev } from '$app/env'; + +// we don't need any JS on this page, though we'll load +// it in dev so that we get hot module replacement... +export const hydrate = dev; + +// ...but if the client-side router is already loaded +// (i.e. we came here from elsewhere in the app), use it +export const router = browser; + +// since there's no dynamic data here, we can prerender +// it so that it gets served as a static asset in prod +export const prerender = true; diff --git a/packages/create-svelte/templates/default/src/routes/todos/+page.server.ts b/packages/create-svelte/templates/default/src/routes/todos/+page.server.ts new file mode 100644 index 000000000000..9e18e79c249e --- /dev/null +++ b/packages/create-svelte/templates/default/src/routes/todos/+page.server.ts @@ -0,0 +1,52 @@ +import { error } from '@sveltejs/kit/data'; +import { api } from './api'; +import type { GET, POST, PATCH, DELETE } from './$types'; +import type { Todo } from './types'; + +/** @type {import('./$types').GET} */ +export const GET: GET = async ({ locals }) => { + // locals.userid comes from src/hooks.js + const response = await api('GET', `todos/${locals.userid}`); + + if (response.status === 404) { + // user hasn't created a todo list. + // start with an empty array + return { + todos: [] + }; + } + + if (response.status === 200) { + return { + todos: await response.json() + }; + } + + throw error(response.status); +}; + +/** @type {import('./$types').POST} */ +export const POST: POST = async ({ request, locals }) => { + const form = await request.formData(); + + await api('POST', `todos/${locals.userid}`, { + text: form.get('text') + }); +}; + +/** @type {import('./$types').PATCH} */ +export const PATCH: PATCH = async ({ request, locals }) => { + const form = await request.formData(); + + await api('PATCH', `todos/${locals.userid}/${form.get('uid')}`, { + text: form.has('text') ? form.get('text') : undefined, + done: form.has('done') ? !!form.get('done') : undefined + }); +}; + +/** @type {import('./$types').DELETE} */ +export const DELETE: DELETE = async ({ request, locals }) => { + const form = await request.formData(); + + await api('DELETE', `todos/${locals.userid}/${form.get('uid')}`); +}; diff --git a/packages/create-svelte/templates/default/src/routes/todos/index.svelte b/packages/create-svelte/templates/default/src/routes/todos/+page.svelte similarity index 93% rename from packages/create-svelte/templates/default/src/routes/todos/index.svelte rename to packages/create-svelte/templates/default/src/routes/todos/+page.svelte index 4bbe290286fa..5953ade2d922 100644 --- a/packages/create-svelte/templates/default/src/routes/todos/index.svelte +++ b/packages/create-svelte/templates/default/src/routes/todos/+page.svelte @@ -2,27 +2,10 @@ import { enhance } from '$lib/form'; import { scale } from 'svelte/transition'; import { flip } from 'svelte/animate'; + import type { Data } from './$types'; - /** - * @typedef {{ - * uid: string; - * created_at: Date; - * text: string; - * done: boolean; - * pending_delete: boolean; - * }} Todo - */ - - type Todo = { - uid: string; - created_at: Date; - text: string; - done: boolean; - pending_delete: boolean; - }; - - /** @type {Todo[]} */ - export let todos: Todo[]; + /** @type {import('./$types').Data} */ + export let data: Data; @@ -46,7 +29,7 @@ - {#each todos as todo (todo.uid)} + {#each data.todos as todo (todo.uid)}
{ - // locals.userid comes from src/hooks.js - const response = await api('GET', `todos/${locals.userid}`); - - if (response.status === 404) { - // user hasn't created a todo list. - // start with an empty array - return { - body: { - todos: [] - } - }; - } - - if (response.status === 200) { - return { - body: { - todos: await response.json() - } - }; - } - - return { - status: response.status - }; -}; - -/** @type {import('./__types').RequestHandler} */ -export const POST: RequestHandler = async ({ request, locals }) => { - const form = await request.formData(); - - await api('POST', `todos/${locals.userid}`, { - text: form.get('text') - }); - - return {}; -}; - -// If the user has JavaScript disabled, the URL will change to -// include the method override unless we redirect back to /todos -const redirect = { - status: 303, - headers: { - location: '/todos' - } -}; - -/** @type {import('./__types').RequestHandler} */ -export const PATCH: RequestHandler = async ({ request, locals }) => { - const form = await request.formData(); - - await api('PATCH', `todos/${locals.userid}/${form.get('uid')}`, { - text: form.has('text') ? form.get('text') : undefined, - done: form.has('done') ? !!form.get('done') : undefined - }); - - return redirect; -}; - -/** @type {import('./__types').RequestHandler} */ -export const DELETE: RequestHandler = async ({ request, locals }) => { - const form = await request.formData(); - - await api('DELETE', `todos/${locals.userid}/${form.get('uid')}`); - - return redirect; -}; diff --git a/packages/create-svelte/templates/default/src/routes/todos/types.d.ts b/packages/create-svelte/templates/default/src/routes/todos/types.d.ts new file mode 100644 index 000000000000..0d3dd711dcdd --- /dev/null +++ b/packages/create-svelte/templates/default/src/routes/todos/types.d.ts @@ -0,0 +1,7 @@ +export type Todo = { + uid: string; + created_at: Date; + text: string; + done: boolean; + pending_delete: boolean; +}; From 84177d4c022c8d3b7a66c756ecae8e4d660a7380 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 31 Jul 2022 22:24:17 -0400 Subject: [PATCH 018/172] update skeleton app --- packages/create-svelte/templates/skeleton/package.json | 6 ++++++ .../skeleton/src/routes/{index.svelte => +page.svelte} | 0 pnpm-lock.yaml | 6 ++++++ 3 files changed, 12 insertions(+) create mode 100644 packages/create-svelte/templates/skeleton/package.json rename packages/create-svelte/templates/skeleton/src/routes/{index.svelte => +page.svelte} (100%) diff --git a/packages/create-svelte/templates/skeleton/package.json b/packages/create-svelte/templates/skeleton/package.json new file mode 100644 index 000000000000..f0c2b204dfa4 --- /dev/null +++ b/packages/create-svelte/templates/skeleton/package.json @@ -0,0 +1,6 @@ +{ + "devDependencies": { + "@sveltejs/adapter-auto": "workspace:1.0.0-next.64" + }, + "type": "module" +} diff --git a/packages/create-svelte/templates/skeleton/src/routes/index.svelte b/packages/create-svelte/templates/skeleton/src/routes/+page.svelte similarity index 100% rename from packages/create-svelte/templates/skeleton/src/routes/index.svelte rename to packages/create-svelte/templates/skeleton/src/routes/+page.svelte diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c4b63036297d..5389d8527640 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -266,6 +266,12 @@ importers: typescript: 4.7.4 vite: 3.0.0 + packages/create-svelte/templates/skeleton: + specifiers: + '@sveltejs/adapter-auto': workspace:1.0.0-next.64 + devDependencies: + '@sveltejs/adapter-auto': link:../../../adapter-auto + packages/kit: specifiers: '@playwright/test': ^1.23.4 From 6640599f799ea0c0da60f755f16db7a5b25e8c73 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 31 Jul 2022 22:36:49 -0400 Subject: [PATCH 019/172] migrate kit.svelte.dev --- .../routes/{__error.svelte => +error.svelte} | 34 +++++--------- .../{__layout.svelte => +layout.svelte} | 0 .../src/routes/{index.svelte => +page.svelte} | 14 ++---- sites/kit.svelte.dev/src/routes/+page.ts | 5 +++ .../+server.js} | 6 +-- .../docs/{__layout.svelte => +layout.svelte} | 14 ------ .../kit.svelte.dev/src/routes/docs/+layout.ts | 9 ++++ sites/kit.svelte.dev/src/routes/docs/+page.ts | 6 +++ .../src/routes/docs/[slug].json.js | 18 -------- .../src/routes/docs/[slug].json/+server.js | 16 +++++++ .../{[slug].svelte => [slug]/+page.svelte} | 44 ++++++------------- .../src/routes/docs/[slug]/+page.ts | 12 +++++ .../{index.json.js => index.json/+server.js} | 4 +- .../src/routes/docs/index.svelte | 9 ---- .../routes/faq/{index.js => +page.server.js} | 4 +- .../routes/faq/{index.svelte => +page.svelte} | 5 ++- .../search/{index.js => +page.server.js} | 8 ++-- .../search/{index.svelte => +page.svelte} | 15 ++----- .../kit.svelte.dev/src/routes/search/+page.ts | 1 + 19 files changed, 91 insertions(+), 133 deletions(-) rename sites/kit.svelte.dev/src/routes/{__error.svelte => +error.svelte} (69%) rename sites/kit.svelte.dev/src/routes/{__layout.svelte => +layout.svelte} (100%) rename sites/kit.svelte.dev/src/routes/{index.svelte => +page.svelte} (92%) create mode 100644 sites/kit.svelte.dev/src/routes/+page.ts rename sites/kit.svelte.dev/src/routes/{content.json.js => content.json/+server.js} (97%) rename sites/kit.svelte.dev/src/routes/docs/{__layout.svelte => +layout.svelte} (79%) create mode 100644 sites/kit.svelte.dev/src/routes/docs/+layout.ts create mode 100644 sites/kit.svelte.dev/src/routes/docs/+page.ts delete mode 100644 sites/kit.svelte.dev/src/routes/docs/[slug].json.js create mode 100644 sites/kit.svelte.dev/src/routes/docs/[slug].json/+server.js rename sites/kit.svelte.dev/src/routes/docs/{[slug].svelte => [slug]/+page.svelte} (59%) create mode 100644 sites/kit.svelte.dev/src/routes/docs/[slug]/+page.ts rename sites/kit.svelte.dev/src/routes/docs/{index.json.js => index.json/+server.js} (63%) delete mode 100644 sites/kit.svelte.dev/src/routes/docs/index.svelte rename sites/kit.svelte.dev/src/routes/faq/{index.js => +page.server.js} (65%) rename sites/kit.svelte.dev/src/routes/faq/{index.svelte => +page.svelte} (97%) rename sites/kit.svelte.dev/src/routes/search/{index.js => +page.server.js} (81%) rename sites/kit.svelte.dev/src/routes/search/{index.svelte => +page.svelte} (69%) create mode 100644 sites/kit.svelte.dev/src/routes/search/+page.ts diff --git a/sites/kit.svelte.dev/src/routes/__error.svelte b/sites/kit.svelte.dev/src/routes/+error.svelte similarity index 69% rename from sites/kit.svelte.dev/src/routes/__error.svelte rename to sites/kit.svelte.dev/src/routes/+error.svelte index 3821ec40c029..522caa3b09f2 100644 --- a/sites/kit.svelte.dev/src/routes/__error.svelte +++ b/sites/kit.svelte.dev/src/routes/+error.svelte @@ -1,16 +1,6 @@ - - - {status} + {$page.status}
{#if online}

Yikes!

- {#if error.message} -

{status}: {error.message}

+ {#if $page.error.message} +

{$page.status}: {$page.error.message}

{:else} -

Encountered a {status} error

+

Encountered a {$page.status} error

{/if} - {#if status >= 500} - {#if dev && error.stack} -
{error.stack}
+ {#if $page.status >= 500} + {#if dev && $page.error.stack} +
{$page.error.stack}
{:else}

Please try reloading the page.

- If the error persists, please drop by Discord chatroom + If the error persists, please drop by Discord chatroom and let us know, or raise an issue on GitHub. Thanks!

@@ -79,8 +71,4 @@ font: 600 16px/1.7 var(--font); border-radius: 2px; } - - /* @media (min-width: 480px) { - h1 { font-size: 4em } - } */ diff --git a/sites/kit.svelte.dev/src/routes/__layout.svelte b/sites/kit.svelte.dev/src/routes/+layout.svelte similarity index 100% rename from sites/kit.svelte.dev/src/routes/__layout.svelte rename to sites/kit.svelte.dev/src/routes/+layout.svelte diff --git a/sites/kit.svelte.dev/src/routes/index.svelte b/sites/kit.svelte.dev/src/routes/+page.svelte similarity index 92% rename from sites/kit.svelte.dev/src/routes/index.svelte rename to sites/kit.svelte.dev/src/routes/+page.svelte index 82257ffd6c66..0207d176115a 100644 --- a/sites/kit.svelte.dev/src/routes/index.svelte +++ b/sites/kit.svelte.dev/src/routes/+page.svelte @@ -1,11 +1,3 @@ - - - - - {section.title} • Docs • SvelteKit + {data.section.title} • Docs • SvelteKit - - + +
-

{section.title}

+

{data.section.title}

Edit this page on GitHub
- {@html section.content} + {@html data.section.content}
- previous - {#if prev} - {prev.title} + previous + {#if data.prev} + {data.prev.title} {/if}
- next - {#if next} - {next.title} + next + {#if data.next} + {data.next.title} {/if}
diff --git a/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.ts b/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.ts new file mode 100644 index 000000000000..b68f519cd677 --- /dev/null +++ b/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.ts @@ -0,0 +1,12 @@ +// TODO should use a shadow endpoint instead, need to fix a bug first +/** @type {import('./$types').Load} */ +export async function load({ fetch, params }) { + const res = await fetch(`/docs/${params.slug}.json`); + const { prev, next, section } = await res.json(); + + return { + prev, + next, + section + }; +} diff --git a/sites/kit.svelte.dev/src/routes/docs/index.json.js b/sites/kit.svelte.dev/src/routes/docs/index.json/+server.js similarity index 63% rename from sites/kit.svelte.dev/src/routes/docs/index.json.js rename to sites/kit.svelte.dev/src/routes/docs/index.json/+server.js index a1bb571fffaa..803ab85b2c10 100644 --- a/sites/kit.svelte.dev/src/routes/docs/index.json.js +++ b/sites/kit.svelte.dev/src/routes/docs/index.json/+server.js @@ -1,7 +1,5 @@ import { read_headings } from '$lib/docs/server'; export function GET() { - return { - body: read_headings('docs') - }; + return read_headings('docs'); } diff --git a/sites/kit.svelte.dev/src/routes/docs/index.svelte b/sites/kit.svelte.dev/src/routes/docs/index.svelte deleted file mode 100644 index f70429adf707..000000000000 --- a/sites/kit.svelte.dev/src/routes/docs/index.svelte +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/sites/kit.svelte.dev/src/routes/faq/index.js b/sites/kit.svelte.dev/src/routes/faq/+page.server.js similarity index 65% rename from sites/kit.svelte.dev/src/routes/faq/index.js rename to sites/kit.svelte.dev/src/routes/faq/+page.server.js index 65c4a6a63898..8781da4dc855 100644 --- a/sites/kit.svelte.dev/src/routes/faq/index.js +++ b/sites/kit.svelte.dev/src/routes/faq/+page.server.js @@ -2,8 +2,6 @@ import { read_all } from '$lib/docs/server'; export async function GET() { return { - body: { - sections: await read_all('faq') - } + sections: await read_all('faq') }; } diff --git a/sites/kit.svelte.dev/src/routes/faq/index.svelte b/sites/kit.svelte.dev/src/routes/faq/+page.svelte similarity index 97% rename from sites/kit.svelte.dev/src/routes/faq/index.svelte rename to sites/kit.svelte.dev/src/routes/faq/+page.svelte index 0cb5b5f02f33..05c28ac433b2 100644 --- a/sites/kit.svelte.dev/src/routes/faq/index.svelte +++ b/sites/kit.svelte.dev/src/routes/faq/+page.svelte @@ -5,7 +5,8 @@ import '@sveltejs/site-kit/code.css'; import * as hovers from '$lib/docs/client/hovers.js'; - export let sections; + /** @type {import('./$types').Data} */ + export let data; hovers.setup(); @@ -20,7 +21,7 @@

Frequently Asked Questions

- {#each sections as faq} + {#each data.sections as faq}

{faq.title} diff --git a/sites/kit.svelte.dev/src/routes/search/index.js b/sites/kit.svelte.dev/src/routes/search/+page.server.js similarity index 81% rename from sites/kit.svelte.dev/src/routes/search/index.js rename to sites/kit.svelte.dev/src/routes/search/+page.server.js index eb1334518231..4cf73575b609 100644 --- a/sites/kit.svelte.dev/src/routes/search/index.js +++ b/sites/kit.svelte.dev/src/routes/search/+page.server.js @@ -1,6 +1,6 @@ import { init, inited, search } from '$lib/search/search'; -/** @type {import('./__types/index').RequestHandler} */ +/** @type {import('./$types').GET} */ export async function GET({ url }) { if (!inited) { // TODO this feels a bit hacky, not sure if there's a better approach @@ -14,9 +14,7 @@ export async function GET({ url }) { const results = search(query); return { - body: { - query, - results - } + query, + results }; } diff --git a/sites/kit.svelte.dev/src/routes/search/index.svelte b/sites/kit.svelte.dev/src/routes/search/+page.svelte similarity index 69% rename from sites/kit.svelte.dev/src/routes/search/index.svelte rename to sites/kit.svelte.dev/src/routes/search/+page.svelte index 92505a780fd0..b3b640f8b18e 100644 --- a/sites/kit.svelte.dev/src/routes/search/index.svelte +++ b/sites/kit.svelte.dev/src/routes/search/+page.svelte @@ -1,15 +1,8 @@ - - @@ -18,10 +11,10 @@
- +
- +
\ No newline at end of file + diff --git a/packages/kit/test/apps/amp/src/routes/http-equiv/cache-control.svelte b/packages/kit/test/apps/amp/src/routes/http-equiv/cache-control.svelte deleted file mode 100644 index fa919cc9f0ad..000000000000 --- a/packages/kit/test/apps/amp/src/routes/http-equiv/cache-control.svelte +++ /dev/null @@ -1,14 +0,0 @@ - - -

the cache-control headers should be removed from this page

diff --git a/packages/kit/test/apps/amp/src/routes/http-equiv/cache-control/+page.js b/packages/kit/test/apps/amp/src/routes/http-equiv/cache-control/+page.js new file mode 100644 index 000000000000..c3d97a9ee679 --- /dev/null +++ b/packages/kit/test/apps/amp/src/routes/http-equiv/cache-control/+page.js @@ -0,0 +1,8 @@ +export const prerender = true; + +/** @type {import('./$types').Load} */ +export function load({ setHeaders }) { + setHeaders({ + 'cache-control': 'public, max-age=300' + }); +} diff --git a/packages/kit/test/apps/amp/src/routes/http-equiv/cache-control/+page.svelte b/packages/kit/test/apps/amp/src/routes/http-equiv/cache-control/+page.svelte new file mode 100644 index 000000000000..63edda10a55f --- /dev/null +++ b/packages/kit/test/apps/amp/src/routes/http-equiv/cache-control/+page.svelte @@ -0,0 +1 @@ +

the cache-control headers should be removed from this page

diff --git a/packages/kit/test/apps/amp/src/routes/invalid/index.svelte b/packages/kit/test/apps/amp/src/routes/invalid/+page.svelte similarity index 100% rename from packages/kit/test/apps/amp/src/routes/invalid/index.svelte rename to packages/kit/test/apps/amp/src/routes/invalid/+page.svelte diff --git a/packages/kit/test/apps/amp/src/routes/invalid/has-stylesheet.svelte b/packages/kit/test/apps/amp/src/routes/invalid/has-stylesheet/+page.svelte similarity index 100% rename from packages/kit/test/apps/amp/src/routes/invalid/has-stylesheet.svelte rename to packages/kit/test/apps/amp/src/routes/invalid/has-stylesheet/+page.svelte diff --git a/packages/kit/test/apps/amp/src/routes/origin/index.json.js b/packages/kit/test/apps/amp/src/routes/origin.json/+server.js similarity index 58% rename from packages/kit/test/apps/amp/src/routes/origin/index.json.js rename to packages/kit/test/apps/amp/src/routes/origin.json/+server.js index c5518fd7425b..8f073b1d8e3c 100644 --- a/packages/kit/test/apps/amp/src/routes/origin/index.json.js +++ b/packages/kit/test/apps/amp/src/routes/origin.json/+server.js @@ -1,6 +1,4 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET({ url }) { - return { - body: { origin: url.origin } - }; + return new Response(JSON.stringify({ origin: url.origin })); } diff --git a/packages/kit/test/apps/amp/src/routes/origin/+page.js b/packages/kit/test/apps/amp/src/routes/origin/+page.js new file mode 100644 index 000000000000..298a00a667d7 --- /dev/null +++ b/packages/kit/test/apps/amp/src/routes/origin/+page.js @@ -0,0 +1,10 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ url, fetch }) { + const res = await fetch('/origin.json'); + const data = await res.json(); + + return { + origin: url.origin, + data + }; +} diff --git a/packages/kit/test/apps/amp/src/routes/origin/+page.svelte b/packages/kit/test/apps/amp/src/routes/origin/+page.svelte new file mode 100644 index 000000000000..b8ac40fd3b0a --- /dev/null +++ b/packages/kit/test/apps/amp/src/routes/origin/+page.svelte @@ -0,0 +1,12 @@ + + + + +

{data.origin}

+

{$page.url.origin}

+

{data.data.origin}

diff --git a/packages/kit/test/apps/amp/src/routes/origin/index.svelte b/packages/kit/test/apps/amp/src/routes/origin/index.svelte deleted file mode 100644 index ae0b97528978..000000000000 --- a/packages/kit/test/apps/amp/src/routes/origin/index.svelte +++ /dev/null @@ -1,28 +0,0 @@ - - - - -

{origin}

-

{$page.url.origin}

-

{data.origin}

diff --git a/packages/kit/test/apps/amp/src/routes/styles/index.svelte b/packages/kit/test/apps/amp/src/routes/styles/+page.svelte similarity index 100% rename from packages/kit/test/apps/amp/src/routes/styles/index.svelte rename to packages/kit/test/apps/amp/src/routes/styles/+page.svelte diff --git a/packages/kit/test/apps/amp/src/routes/styles/Unused.svelte b/packages/kit/test/apps/amp/src/routes/styles/Unused/+page.svelte similarity index 100% rename from packages/kit/test/apps/amp/src/routes/styles/Unused.svelte rename to packages/kit/test/apps/amp/src/routes/styles/Unused/+page.svelte diff --git a/packages/kit/test/apps/amp/src/routes/valid.json/+server.js b/packages/kit/test/apps/amp/src/routes/valid.json/+server.js new file mode 100644 index 000000000000..26b312b3a084 --- /dev/null +++ b/packages/kit/test/apps/amp/src/routes/valid.json/+server.js @@ -0,0 +1,3 @@ +export function GET() { + return new Response(JSON.stringify({ answer: 42 })); +} diff --git a/packages/kit/test/apps/amp/src/routes/valid/+page.js b/packages/kit/test/apps/amp/src/routes/valid/+page.js new file mode 100644 index 000000000000..cf5d09d658c1 --- /dev/null +++ b/packages/kit/test/apps/amp/src/routes/valid/+page.js @@ -0,0 +1,5 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/valid.json'); + return await res.json(); +} diff --git a/packages/kit/test/apps/amp/src/routes/valid/+page.svelte b/packages/kit/test/apps/amp/src/routes/valid/+page.svelte new file mode 100644 index 000000000000..91ce7efd6c7a --- /dev/null +++ b/packages/kit/test/apps/amp/src/routes/valid/+page.svelte @@ -0,0 +1,18 @@ + + + + +

Hello from the {browser ? 'client' : 'server'} in {dev ? 'dev' : 'prod'} mode!

+

The answer is {data.answer}

+

This text is red

+ + diff --git a/packages/kit/test/apps/amp/src/routes/valid/index.json.js b/packages/kit/test/apps/amp/src/routes/valid/index.json.js deleted file mode 100644 index 863b891d5c88..000000000000 --- a/packages/kit/test/apps/amp/src/routes/valid/index.json.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - answer: 42 - } - }; -} diff --git a/packages/kit/test/apps/amp/src/routes/valid/index.svelte b/packages/kit/test/apps/amp/src/routes/valid/index.svelte deleted file mode 100644 index a69b92bd267e..000000000000 --- a/packages/kit/test/apps/amp/src/routes/valid/index.svelte +++ /dev/null @@ -1,26 +0,0 @@ - - - - -

Hello from the {browser ? 'client' : 'server'} in {dev ? 'dev' : 'prod'} mode!

-

The answer is {answer}

-

This text is red

- - From 2d01f3049545866b9f29c07da2ad9b57cff90ddb Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 1 Aug 2022 13:08:28 +0200 Subject: [PATCH 023/172] show message either way, could be other things gone wrong --- packages/migrate/migrations/routes/index.js | 22 ++++----------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js index 238fdb10fbe7..b094a2142805 100644 --- a/packages/migrate/migrations/routes/index.js +++ b/packages/migrate/migrations/routes/index.js @@ -252,12 +252,10 @@ function extract_load(content, is_error, moved) { } module = contents.replace(/^\n/, ''); - return imports.length - ? `` - : ''; + return ``; } ); @@ -328,21 +326,9 @@ function extract_static_imports(content) { ts.ScriptKind.TS ); - const code = new MagicString(content); - /** @type {string[]} */ let imports = []; - /** @param {number} pos */ - function adjust(pos) { - // TypeScript AST is a clusterfuck, we need to step forward to find - // where the node _actually_ starts - while (content[pos] !== '.') pos += 1; - - // replace ../ with ../../ and ./ with ../ - code.prependLeft(pos, content[pos + 1] === '.' ? '../' : '.'); - } - /** @param {ts.Node} node */ function walk(node) { if (ts.isImportDeclaration(node)) { From 4f88ead27cad562551fc11a930161dbc2bca4865 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 1 Aug 2022 13:58:24 +0200 Subject: [PATCH 024/172] windooows --- packages/migrate/migrations/routes/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js index b094a2142805..31fd556beb75 100644 --- a/packages/migrate/migrations/routes/index.js +++ b/packages/migrate/migrations/routes/index.js @@ -59,7 +59,7 @@ export async function migrate() { config.kit?.routes ?? ((filepath) => !/(?:(?:^_|\/_)|(?:^\.|\/\.)(?!well-known))/.test(filepath)); - const files = glob(`${routes}/**`, { filesOnly: true }); + const files = glob(`${routes}/**`, { filesOnly: true }).map((file) => file.replace(/\\/g, '/')); // validate before proceeding for (const file of files) { From 8ccb1f9b7870ffdb710fad6770d2101e0401780d Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 1 Aug 2022 17:54:36 +0200 Subject: [PATCH 025/172] more sophisticated auto migrations - unpack props/body - redirect/error in load - standalone endpoint --- packages/migrate/migrations/routes/index.js | 316 +++++++++++++++++++- 1 file changed, 314 insertions(+), 2 deletions(-) diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js index 31fd556beb75..40c5debf3b12 100644 --- a/packages/migrate/migrations/routes/index.js +++ b/packages/migrate/migrations/routes/index.js @@ -174,7 +174,7 @@ export async function migrate() { ? `${error('Update load function', '3292693')}\n\n` : ''; - const content = dedent(move_to_directory ? adjust_imports(module) : module); + const content = migrate_load(dedent(move_to_directory ? adjust_imports(module) : module)); fs.writeFileSync(sibling + ext, injected + content); } @@ -222,7 +222,10 @@ export async function migrate() { } fs.unlinkSync(file); - fs.writeFileSync(renamed, edited); + fs.writeFileSync( + renamed, + is_page_endpoint ? migrate_page_endpoint(edited) : migrate_standalone(edited) + ); } } } @@ -416,3 +419,312 @@ function guess_indent(content) { return new Array(min + 1).join(' '); } + +/** + * @param {string} content + * */ +function migrate_load(content) { + let imports = new Set(); + try { + const ast = ts.createSourceFile( + 'filename.ts', + content, + ts.ScriptTarget.Latest, + true, + ts.ScriptKind.TS + ); + const str = new MagicString(content); + + /** @param {ts.Node} node */ + function walk(node) { + if ( + ts.isReturnStatement(node) && + is_directly_in_exported_fn(node, ['load']) && + node.expression && + ts.isObjectLiteralExpression(node.expression) + ) { + if (contains_only(node.expression, ['props'])) { + str.overwrite( + node.getStart(), + node.getEnd(), + automigration_comment(node) + + 'return ' + + get_prop_initializer_text(node.expression.properties, 'props') + ); + } else if (contains_only(node.expression, ['redirect', 'status'])) { + str.overwrite( + node.getStart(), + node.getEnd(), + automigration_comment(node) + + 'throw redirect(' + + get_prop_initializer_text(node.expression.properties, 'status') + + ', ' + + get_prop_initializer_text(node.expression.properties, 'redirect') + + ');' + ); + imports.add('redirect'); + } else if (contains_only(node.expression, ['error', 'status'])) { + str.overwrite( + node.getStart(), + node.getEnd(), + automigration_comment(node) + + 'throw error(' + + get_prop_initializer_text(node.expression.properties, 'status') + + ', ' + + get_prop_initializer_text(node.expression.properties, 'error') + + ');' + ); + imports.add('error'); + } + } + + node.forEachChild(walk); + } + + ast.forEachChild(walk); + + const import_str = + imports.size > 0 + ? `import { ${[...imports.keys()].join(', ')} } from '@sveltejs/kit/data';` + : ''; + + return import_str + '\n' + str.toString(); + } catch { + return content; + } +} + +/** + * @param {string} content + * */ +function migrate_page_endpoint(content) { + try { + const ast = ts.createSourceFile( + 'filename.ts', + content, + ts.ScriptTarget.Latest, + true, + ts.ScriptKind.TS + ); + const str = new MagicString(content); + + /** @param {ts.Node} node */ + function walk(node) { + if ( + ts.isReturnStatement(node) && + is_directly_in_exported_fn(node, ['GET']) && + node.expression && + ts.isObjectLiteralExpression(node.expression) && + contains_only(node.expression, ['body']) + ) { + str.overwrite( + node.getStart(), + node.getEnd(), + automigration_comment(node) + + 'return ' + + get_prop_initializer_text(node.expression.properties, 'body') + ); + } + + node.forEachChild(walk); + } + + ast.forEachChild(walk); + + return str.toString(); + } catch { + return content; + } +} + +/** + * @param {string} content + * */ +function migrate_standalone(content) { + try { + const ast = ts.createSourceFile( + 'filename.ts', + content, + ts.ScriptTarget.Latest, + true, + ts.ScriptKind.TS + ); + const str = new MagicString(content); + + /** @param {ts.Node} node */ + function walk(node) { + if ( + ts.isReturnStatement(node) && + is_directly_in_exported_fn(node, ['GET', 'PUT', 'POST', 'DELETE']) && + node.expression && + ts.isObjectLiteralExpression(node.expression) && + contains_only(node.expression, ['body', 'status', 'headers'], true) + ) { + const body = get_prop(node.expression.properties, 'body'); + const headers = get_prop(node.expression.properties, 'headers'); + const status = get_prop(node.expression.properties, 'status'); + const headers_str = + body && + (!ts.isPropertyAssignment(body) || + !( + ts.isStringLiteral(body.initializer) || + ts.isTemplateExpression(body.initializer) || + ts.isNoSubstitutionTemplateLiteral(body.initializer) + )) && + (!headers || !headers.getText().includes('content-type')) + ? `headers: { 'content-type': 'application/json; charset=utf-8'${ + headers + ? ', ' + + (ts.isPropertyAssignment(headers) + ? remove_outer_braces( + get_prop_initializer_text(node.expression.properties, 'headers') + ) + : '...headers') + : '' + } }` + : headers + ? headers.getText() + : undefined; + + str.overwrite( + node.getStart(), + node.getEnd(), + automigration_comment(node) + + `\nreturn new Response(${ + body + ? (!ts.isPropertyAssignment(body) || + !( + ts.isStringLiteral(body.initializer) || + ts.isTemplateExpression(body.initializer) || + ts.isNoSubstitutionTemplateLiteral(body.initializer) + )) && + (!headers || + !headers.getText().includes('content-type') || + headers.getText().includes('application/json')) + ? // prettier-ignore + `/* double-check if value is a POJO, else remove outer JSON.stringify and the content-type header */ JSON.stringify(${get_prop_initializer_text(node.expression.properties,'body')})` + : get_prop_initializer_text(node.expression.properties, 'body') + : 'undefined' + }${ + headers_str || status + ? // prettier-ignore + `, { ${headers_str ? `${headers_str}${status ? ', ' : ''}` : ''}${status ? status.getText() : ''} }` + : '' + });` + ); + } + + node.forEachChild(walk); + } + + ast.forEachChild(walk); + + return str.toString(); + } catch { + return content; + } +} + +/** + * + * @param {ts.ObjectLiteralExpression} node + * @param {string[]} valid_keys + * @param {boolean} [allow_empty] + */ +function contains_only(node, valid_keys, allow_empty = false) { + return ( + (allow_empty || node.properties.length > 0) && + node.properties.every( + (prop) => + (ts.isPropertyAssignment(prop) || ts.isShorthandPropertyAssignment(prop)) && + ts.isIdentifier(prop.name) && + valid_keys.includes(prop.name.text) + ) + ); +} + +/** + * @param {ts.Node} node + */ +function automigration_comment(node) { + return '// @migrate automigrated. Original:\n//' + node.getText().split('\n').join('\n//') + '\n'; +} + +/** + * @param {ts.NodeArray} node + * @param {string} name + * @returns {undefined | ts.ShorthandPropertyAssignment | ts.PropertyAssignment} + */ +function get_prop(node, name) { + return /** @type {any} */ ( + node.find( + (prop) => + (ts.isPropertyAssignment(prop) || ts.isShorthandPropertyAssignment(prop)) && + ts.isIdentifier(prop.name) && + prop.name.text === name + ) + ); +} + +/** + * @param {ts.NodeArray} node + * @param {string} name + */ +function get_prop_initializer_text(node, name) { + const prop = get_prop(node, name); + return prop + ? ts.isShorthandPropertyAssignment(prop) + ? name + : prop.initializer.getText() + : 'undefined'; +} + +/** + * @param {string} str + */ +function remove_outer_braces(str) { + return str.substring(str.indexOf('{') + 1, str.lastIndexOf('}')); +} + +/** + * True if this node is inside the given function that is `export`ed. + * + * @param {ts.Node} node + * @param {string[]} fn_name + * @returns {boolean} + */ +function is_directly_in_exported_fn(node, fn_name) { + if (node.parent === node || !node.parent) { + return false; + } else if (is_exported_fn(node, fn_name)) { + return true; + } else if ( + ts.isFunctionDeclaration(node) || + ts.isVariableStatement(node) || + (ts.isArrowFunction(node) && !is_exported_fn(node.parent.parent.parent, fn_name)) + ) { + return false; + } + return is_directly_in_exported_fn(node.parent, fn_name); +} + +/** + * True if node is `export function ` or `export let/const = ..` + * + * @param {ts.Node} node + * @param {string[]} fn_name + */ +function is_exported_fn(node, fn_name) { + // export function X + return ( + (ts.isFunctionDeclaration(node) && + node.modifiers?.[0]?.kind === ts.SyntaxKind.ExportKeyword && + fn_name.includes(node.name.text)) || + // export const/let X + (ts.isVariableStatement(node) && + node.modifiers?.[0]?.kind === ts.SyntaxKind.ExportKeyword && + node.declarationList.declarations.length === 1 && + ts.isIdentifier(node.declarationList.declarations[0].name) && + fn_name.includes(node.declarationList.declarations[0].name.text)) + ); +} From b0660769c61ef0e955ee190820079816549a7310 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 2 Aug 2022 14:17:02 +0200 Subject: [PATCH 026/172] migrate test/apps/basics --- .../test/apps/basics/src/routes/+error.svelte | 37 +++++++++++ ...yout-blank.svelte => +layout-blank.svelte} | 0 .../test/apps/basics/src/routes/+layout.js | 15 +++++ .../apps/basics/src/routes/+layout.svelte | 34 +++++++++++ .../kit/test/apps/basics/src/routes/+page.js | 6 ++ .../test/apps/basics/src/routes/+page.svelte | 8 +++ .../apps/basics/src/routes/__error.svelte | 61 ------------------- .../apps/basics/src/routes/__layout.svelte | 55 ----------------- .../{__layout.svelte => +layout.svelte} | 0 .../{a.svelte => a/+page.svelte} | 0 .../{b.svelte => b/+page.svelte} | 0 .../{a.svelte => a/+page.svelte} | 0 .../{b.svelte => b/+page.svelte} | 0 .../{index.svelte => +page.svelte} | 0 .../+page.svelte} | 0 .../+page.svelte} | 0 .../anchor/{index.svelte => +page.svelte} | 0 .../{anchor.svelte => anchor/+page.svelte} | 0 .../apps/basics/src/routes/answer.json.js | 7 --- .../basics/src/routes/answer.json/+server.js | 8 +++ .../{index.svelte => +page.svelte} | 0 .../assets/{index.svelte => +page.svelte} | 0 .../{a.svelte => a/+page.svelte} | 0 .../+page.svelte} | 0 .../apps/basics/src/routes/caching/+page.js | 4 ++ .../basics/src/routes/caching/+page.svelte | 1 + .../basics/src/routes/caching/index.svelte | 10 --- .../routes/caching/private/has-session.svelte | 15 ----- .../caching/private/has-session/+page.js | 10 +++ .../caching/private/has-session/+page.svelte | 1 + .../caching/private/uses-cache-private.svelte | 13 ---- .../private/uses-cache-private/+page.js | 8 +++ .../private/uses-cache-private/+page.svelte | 1 + .../routes/caching/private/uses-fetch.json.js | 7 --- .../private/uses-fetch.json/+server.js | 8 +++ .../routes/caching/private/uses-fetch.svelte | 20 ------ .../caching/private/uses-fetch/+page.js | 15 +++++ .../caching/private/uses-fetch/+page.svelte | 1 + .../private/uses-session-in-init.svelte | 21 ------- .../private/uses-session-in-init/+page.js | 10 +++ .../private/uses-session-in-init/+page.svelte | 7 +++ .../private/uses-session-in-load.svelte | 24 -------- .../private/uses-session-in-load/+page.js | 15 +++++ .../private/uses-session-in-load/+page.svelte | 5 ++ .../{index.svelte => +page.svelte} | 0 .../routes/css/{index.svelte => +page.svelte} | 0 .../css/{other.svelte => other/+page.svelte} | 0 .../{index.svelte => +page.svelte} | 0 .../{index.svelte => +page.svelte} | 0 .../src/routes/delete-route/[id].json.js | 9 --- .../routes/delete-route/[id].json/+server.js | 9 +++ .../{index.svelte => +page.svelte} | 0 .../+page.svelte} | 0 .../encoded/{index.svelte => +page.svelte} | 0 .../basics/src/routes/encoded/[slug].svelte | 25 -------- .../basics/src/routes/encoded/[slug]/+page.js | 7 +++ .../src/routes/encoded/[slug]/+page.svelte | 10 +++ .../basics/src/routes/encoded/endpoint.js | 7 --- .../src/routes/encoded/endpoint/+server.js | 8 +++ .../basics/src/routes/encoded/redirect.svelte | 9 --- .../src/routes/encoded/redirect/+page.js | 6 ++ .../redirect/+page.svelte} | 0 .../src/routes/encoded/redirected.svelte | 17 ------ .../src/routes/encoded/redirected/+page.js | 7 +++ .../routes/encoded/redirected/+page.svelte | 6 ++ .../encoded/\345\217\215\345\272\224.svelte" | 8 --- .../\345\217\215\345\272\224/+page.js" | 5 ++ .../\345\217\215\345\272\224/+page.svelte" | 0 .../encoded/\350\213\227\346\235\241.svelte" | 21 ------- .../\350\213\227\346\235\241/+page.js" | 6 ++ .../\350\213\227\346\235\241/+page.svelte" | 10 +++ .../{sha256.js => sha256/+server.js} | 4 +- .../routes/endpoint-output/body/+server.js | 6 ++ .../empty/+server.js} | 4 +- .../{fetched.js => fetched/+server.js} | 7 +-- .../+server.js} | 4 +- .../{headers.js => headers/+server.js} | 4 +- .../{empty.js => null/+server.js} | 2 +- .../{proxy.js => proxy/+server.js} | 0 .../src/routes/endpoint-output/simple.js | 7 --- .../routes/endpoint-output/simple/+server.js | 8 +++ .../+server.js} | 16 ++--- .../+server.js} | 18 +++--- .../{stream.js => stream/+server.js} | 18 +++--- .../{xml-bytes.js => xml-bytes/+server.js} | 7 +-- .../{xml-text.js => xml-text/+server.js} | 2 +- .../routes/env/{index.js => +page.server.js} | 6 +- .../routes/env/{index.svelte => +page.svelte} | 11 ++-- .../+page.svelte} | 0 .../endpoint-not-ok.json/+server.js} | 2 +- .../src/routes/errors/endpoint-not-ok.svelte | 18 ------ .../routes/errors/endpoint-not-ok/+page.js | 11 ++++ .../+page.svelte} | 1 - .../routes/errors/endpoint-shadow-not-ok.js | 6 -- .../endpoint-shadow-not-ok/+page.server.js} | 4 +- .../+page.svelte} | 1 - .../+page.server.js} | 0 .../errors/endpoint-shadow/+page.svelte | 1 + .../+server.js} | 0 .../basics/src/routes/errors/endpoint.svelte | 18 ------ .../src/routes/errors/endpoint/+page.js | 11 ++++ .../src/routes/errors/endpoint/+page.svelte | 1 + .../+page.svelte} | 0 .../{index.svelte => +page.svelte} | 0 .../src/routes/errors/init-error-endpoint.js | 10 --- .../errors/init-error-endpoint/+server.js | 11 ++++ .../+server.js} | 0 .../src/routes/errors/load-client.svelte | 12 ---- .../src/routes/errors/load-client/+page.js | 10 +++ .../load-client/+page.svelte} | 0 .../routes/errors/load-error-client.svelte | 10 --- .../routes/errors/load-error-client/+page.js | 10 +++ .../errors/load-error-client/+page.svelte | 0 .../errors/load-error-malformed-client.svelte | 13 ---- .../load-error-malformed-client/+page.js | 12 ++++ .../load-error-malformed-client/+page.svelte | 0 .../errors/load-error-malformed-server.svelte | 7 --- .../load-error-malformed-server/+page.js | 7 +++ .../load-error-malformed-server/+page.svelte | 0 .../routes/errors/load-error-server.svelte | 6 -- .../routes/errors/load-error-server/+page.js | 6 ++ .../errors/load-error-server/+page.svelte | 0 .../errors/load-error-string-client.svelte | 9 --- .../errors/load-error-string-client/+page.js | 9 +++ .../load-error-string-client/+page.svelte | 0 .../errors/load-error-string-server.svelte | 6 -- .../errors/load-error-string-server/+page.js | 6 ++ .../load-error-string-server/+page.svelte | 0 .../src/routes/errors/load-server.svelte | 6 -- .../src/routes/errors/load-server/+page.js | 4 ++ .../routes/errors/load-server/+page.svelte | 0 .../load-status-without-error-client.svelte | 8 --- .../load-status-without-error-client/+page.js | 8 +++ .../+page.svelte | 0 .../load-status-without-error-server.svelte | 6 -- .../load-status-without-error-server/+page.js | 6 ++ .../+page.svelte | 0 .../+page.svelte} | 0 .../+page.svelte} | 0 .../errors/nested-error-page/+error.svelte | 16 +++++ .../errors/nested-error-page/+page.svelte | 1 + .../errors/nested-error-page/__error.svelte | 34 ----------- .../errors/nested-error-page/index.svelte | 1 - .../errors/nested-error-page/nope.svelte | 7 --- .../errors/nested-error-page/nope/+page.js | 3 + .../nested-error-page/nope/+page.svelte | 1 + .../{__error.svelte => +error.svelte} | 0 .../{index.svelte => +page.svelte} | 0 .../errors/page-endpoint/get-explicit.js | 6 -- .../get-explicit/+page.server.js | 6 ++ .../+page.svelte} | 0 .../+page.server.js} | 2 +- .../+page.svelte} | 0 .../errors/page-endpoint/post-explicit.js | 6 -- .../post-explicit/+page.server.js | 6 ++ .../+page.svelte} | 0 .../+page.server.js} | 2 +- .../+page.svelte} | 0 .../+page.svelte} | 0 .../{index.svelte => +page.svelte} | 0 .../etag/{binary.js => binary/+server.js} | 7 +-- .../apps/basics/src/routes/etag/custom.js | 10 --- .../basics/src/routes/etag/custom/+server.js | 11 ++++ .../routes/etag/{text.js => text/+server.js} | 5 +- .../apps/basics/src/routes/favicon.ico.js | 7 --- .../basics/src/routes/favicon.ico/+server.js | 8 +++ .../headers/{index.svelte => +page.svelte} | 0 .../basics/src/routes/headers/class.svelte | 23 ------- .../basics/src/routes/headers/class/+page.js | 11 ++++ .../src/routes/headers/class/+page.svelte | 6 ++ .../headers/{echo.js => echo/+server.js} | 6 +- .../iframes/{index.svelte => +page.svelte} | 0 .../{child.svelte => child/+page.svelte} | 0 .../{parent.svelte => parent/+page.svelte} | 0 .../basics/src/routes/imports/+page.svelte | 1 + .../basics/src/routes/imports/index.svelte | 1 - .../+page.svelte} | 0 .../test/apps/basics/src/routes/index.svelte | 20 ------ .../keepfocus/{index.svelte => +page.svelte} | 0 .../test/apps/basics/src/routes/load/+page.js | 9 +++ .../load/{index.svelte => +page.svelte} | 21 +------ .../basics/src/routes/load/[dynamic].json.js | 8 --- .../src/routes/load/[dynamic].json/+server.js | 9 +++ .../basics/src/routes/load/[dynamic].svelte | 16 ----- .../basics/src/routes/load/[dynamic]/+page.js | 5 ++ .../src/routes/load/[dynamic]/+page.svelte | 6 ++ .../routes/load/change-detection/+layout.js | 21 +++++++ .../load/change-detection/+layout.svelte | 9 +++ .../load/change-detection/__layout.svelte | 31 ---------- .../routes/load/change-detection/data.json.js | 7 --- .../change-detection/data.json/+server.js | 8 +++ .../load/change-detection/one/[x].svelte | 38 ------------ .../load/change-detection/one/[x]/+page.js | 19 ++++++ .../change-detection/one/[x]/+page.svelte | 15 +++++ .../change-detection/session/unused.svelte | 23 ------- .../change-detection/session/unused/+page.js | 7 +++ .../session/unused/+page.svelte | 12 ++++ .../load/change-detection/session/used.svelte | 24 -------- .../change-detection/session/used/+page.js | 8 +++ .../session/used/+page.svelte | 12 ++++ .../load/change-detection/two/[y].svelte | 26 -------- .../load/change-detection/two/[y]/+page.js | 14 +++++ .../change-detection/two/[y]/+page.svelte | 6 ++ .../load/dynamic-import-styles/+page.js | 5 ++ .../load/dynamic-import-styles/+page.svelte | 6 ++ .../load/dynamic-import-styles/index.svelte | 15 ----- .../routes/load/fetch-credentialed.json.js | 8 --- .../load/fetch-credentialed.json/+server.js | 9 +++ .../src/routes/load/fetch-credentialed.svelte | 22 ------- .../routes/load/fetch-credentialed/+page.js | 11 ++++ .../load/fetch-credentialed/+page.svelte | 6 ++ .../+server.js} | 6 +- .../src/routes/load/fetch-headers.svelte | 27 -------- .../src/routes/load/fetch-headers/+page.js | 8 +++ .../routes/load/fetch-headers/+page.svelte | 14 +++++ .../src/routes/load/fetch-relative.json.js | 16 ----- .../load/fetch-relative.json/+server.js | 18 ++++++ .../src/routes/load/fetch-relative.svelte | 19 ------ .../src/routes/load/fetch-relative/+page.js | 7 +++ .../routes/load/fetch-relative/+page.svelte | 6 ++ .../src/routes/load/fetch-request.json.js | 7 --- .../routes/load/fetch-request.json/+server.js | 8 +++ .../src/routes/load/fetch-request.svelte | 25 -------- .../src/routes/load/fetch-request/+page.js | 14 +++++ .../routes/load/fetch-request/+page.svelte | 6 ++ .../src/routes/load/large-response/+page.js | 9 +++ .../routes/load/large-response/+page.svelte | 6 ++ .../routes/load/large-response/index.svelte | 20 ------ .../{text.txt.js => text.txt/+server.js} | 6 +- .../src/routes/load/layout-props/+layout.js | 8 +++ .../routes/load/layout-props/+layout.svelte | 13 ++++ .../routes/load/layout-props/__layout.svelte | 26 -------- .../layout-props/{a.svelte => a/+page.svelte} | 0 .../layout-props/{b.svelte => b/+page.svelte} | 0 .../props/{__layout.svelte => +layout.svelte} | 0 .../basics/src/routes/load/props/+page.js | 4 ++ .../basics/src/routes/load/props/+page.svelte | 7 +++ .../{about.svelte => about/+page.svelte} | 0 .../basics/src/routes/load/props/index.svelte | 14 ----- .../+server.js} | 9 +-- .../basics/src/routes/load/raw-body.svelte | 27 -------- .../basics/src/routes/load/raw-body/+page.js | 12 ++++ .../src/routes/load/raw-body/+page.svelte | 7 +++ .../{relay.json.js => relay.json/+server.js} | 7 +-- .../apps/basics/src/routes/load/relay.svelte | 18 ------ .../basics/src/routes/load/relay/+page.js | 7 +++ .../basics/src/routes/load/relay/+page.svelte | 6 ++ .../+server.js} | 5 +- .../src/routes/load/serialization-post.svelte | 34 ----------- .../routes/load/serialization-post/+page.js | 19 ++++++ .../load/serialization-post/+page.svelte | 7 +++ .../src/routes/load/serialization.json.js | 7 --- .../routes/load/serialization.json/+server.js | 8 +++ .../src/routes/load/serialization.svelte | 16 ----- .../src/routes/load/serialization/+page.js | 5 ++ .../routes/load/serialization/+page.svelte | 6 ++ .../routes/load/server-fetch-request.svelte | 19 ------ .../routes/load/server-fetch-request/+page.js | 8 +++ .../load/server-fetch-request/+page.svelte | 6 ++ .../src/routes/load/set-cookie-fetch/+page.js | 7 +++ .../routes/load/set-cookie-fetch/+page.svelte | 6 ++ .../{a.json.js => a.json/+server.js} | 11 ++-- .../routes/load/set-cookie-fetch/b.json.js | 16 ----- .../load/set-cookie-fetch/b.json/+server.js | 19 ++++++ .../routes/load/set-cookie-fetch/index.svelte | 18 ------ .../basics/src/routes/load/stuff/+layout.js | 6 ++ .../src/routes/load/stuff/+layout.svelte | 1 + .../src/routes/load/stuff/[x]/+layout.js | 8 +++ .../src/routes/load/stuff/[x]/+layout.svelte | 1 + .../src/routes/load/stuff/[x]/[y]/+layout.js | 6 ++ .../routes/load/stuff/[x]/[y]/+layout.svelte | 1 + .../src/routes/load/stuff/[x]/[y]/[z].svelte | 28 --------- .../routes/load/stuff/[x]/[y]/[z]/+page.js | 6 ++ .../load/stuff/[x]/[y]/[z]/+page.svelte | 7 +++ .../routes/load/stuff/[x]/[y]/__layout.svelte | 12 ---- .../src/routes/load/stuff/[x]/__layout.svelte | 13 ---- .../src/routes/load/stuff/__layout.svelte | 12 ---- .../basics/src/routes/load/url-hash.svelte | 17 ------ .../basics/src/routes/load/url-hash/+page.js | 4 ++ .../src/routes/load/url-hash/+page.svelte | 7 +++ .../src/routes/load/url-to-string.svelte | 8 --- .../src/routes/load/url-to-string/+page.js | 4 ++ .../routes/load/url-to-string/+page.svelte | 1 + .../routes/load/window-fetch/correct.svelte | 18 ------ .../routes/load/window-fetch/correct/+page.js | 6 ++ .../load/window-fetch/correct/+page.svelte | 6 ++ .../src/routes/load/window-fetch/data.json.js | 8 --- .../load/window-fetch/data.json/+server.js | 9 +++ .../routes/load/window-fetch/incorrect.svelte | 18 ------ .../load/window-fetch/incorrect/+page.js | 6 ++ .../load/window-fetch/incorrect/+page.svelte | 6 ++ .../src/routes/method-override/+page.js | 6 ++ .../{index.svelte => +page.svelte} | 17 +----- .../{fetch.json.js => fetch.json/+server.js} | 13 ++-- .../{__layout.svelte => +layout.svelte} | 0 .../{index.svelte => +page.svelte} | 0 .../src/routes/nested-layout/error.svelte | 7 --- .../src/routes/nested-layout/error/+page.js | 5 ++ .../routes/nested-layout/error/+page.svelte | 1 + .../foo/{__layout.svelte => +layout.svelte} | 0 .../nested-layout/foo/bar/+error.svelte | 30 +++++++++ .../bar/{__layout.svelte => +layout.svelte} | 0 .../nested-layout/foo/bar/__error.svelte | 34 ----------- .../routes/nested-layout/foo/bar/nope.svelte | 7 --- .../nested-layout/foo/bar/nope/+page.js | 3 + .../nested-layout/foo/bar/nope/+page.svelte | 1 + .../foo/{baz.svelte => baz/+page.svelte} | 0 ...yout@blank.svelte => +layout@blank.svelte} | 0 .../reset/{index.svelte => +page.svelte} | 0 .../src/routes/no-hydrate.json/+server.js | 8 +++ .../basics/src/routes/no-hydrate/+page.js | 11 ++++ .../basics/src/routes/no-hydrate/+page.svelte | 12 ++++ .../src/routes/no-hydrate/index.json.js | 7 --- .../basics/src/routes/no-hydrate/index.svelte | 28 --------- .../basics/src/routes/no-hydrate/no-js.svelte | 6 -- .../src/routes/no-hydrate/no-js/+page.js | 2 + .../src/routes/no-hydrate/no-js/+page.svelte | 1 + .../basics/src/routes/no-hydrate/other.svelte | 1 - .../src/routes/no-hydrate/other/+page.svelte | 1 + .../{__layout.svelte => +layout.svelte} | 2 +- .../apps/basics/src/routes/no-router/a.svelte | 5 -- .../basics/src/routes/no-router/a/+page.js | 1 + .../src/routes/no-router/a/+page.svelte | 1 + .../src/routes/no-router/b/+page.svelte | 1 + .../no-ssr/{index.svelte => +page.svelte} | 0 .../{margin.svelte => margin/+page.svelte} | 0 .../{other.svelte => other/+page.svelte} | 0 .../origin/{index.svelte => +page.svelte} | 0 .../apps/basics/src/routes/package.json.js | 7 --- .../basics/src/routes/package.json/+server.js | 8 +++ .../paths/{index.svelte => +page.svelte} | 0 .../src/routes/prerendering/+error.svelte | 7 +++ .../basics/src/routes/prerendering/+page.js | 5 ++ .../src/routes/prerendering/+page.svelte | 1 + .../src/routes/prerendering/__error.svelte | 15 ----- .../src/routes/prerendering/index.svelte | 11 ---- .../prerendering/mutative-endpoint.svelte | 5 -- .../prerendering/mutative-endpoint/+page.js | 1 + .../+page.server.ts} | 0 .../mutative-endpoint/+page.svelte | 7 +++ .../apps/basics/src/routes/query/echo.svelte | 37 ----------- .../basics/src/routes/query/echo/+page.js | 21 +++++++ .../basics/src/routes/query/echo/+page.svelte | 11 ++++ .../src/routes/redirect-on-load/+page.js | 10 +++ .../src/routes/redirect-on-load/+page.svelte | 2 + .../src/routes/redirect-on-load/index.svelte | 17 ------ .../+page.svelte} | 0 .../redirect/{index.svelte => +page.svelte} | 2 +- .../apps/basics/src/routes/redirect/a.svelte | 10 --- .../basics/src/routes/redirect/a/+page.js | 5 ++ .../basics/src/routes/redirect/a/+page.svelte | 1 + .../apps/basics/src/routes/redirect/b.svelte | 10 --- .../basics/src/routes/redirect/b/+page.js | 5 ++ .../basics/src/routes/redirect/b/+page.svelte | 1 + .../redirect/{c.svelte => c/+page.svelte} | 0 .../basics/src/routes/redirect/loopy/a.svelte | 10 --- .../src/routes/redirect/loopy/a/+page.js | 5 ++ .../src/routes/redirect/loopy/a/+page.svelte | 1 + .../basics/src/routes/redirect/loopy/b.svelte | 10 --- .../src/routes/redirect/loopy/b/+page.js | 5 ++ .../src/routes/redirect/loopy/b/+page.svelte | 1 + .../routes/redirect/missing-status/a.svelte | 9 --- .../routes/redirect/missing-status/a/+page.js | 5 ++ .../redirect/missing-status/a/+page.svelte | 1 + .../routes/redirect/missing-status/b.svelte | 10 --- .../routes/redirect/missing-status/b/+page.js | 5 ++ .../redirect/missing-status/b/+page.svelte | 1 + .../routing/{index.svelte => +page.svelte} | 0 .../{[slug].svelte => [slug]/+page.svelte} | 0 .../routing/{a.svelte => a/+page.svelte} | 0 .../+server.js} | 2 +- .../routing/ambiguous/[slug]/+page.svelte | 0 .../src/routes/routing/b.json/+server.js | 6 ++ .../apps/basics/src/routes/routing/b/+page.js | 5 ++ .../basics/src/routes/routing/b/+page.svelte | 6 ++ .../basics/src/routes/routing/b/index.json.js | 3 - .../basics/src/routes/routing/b/index.svelte | 14 ----- .../{__layout.svelte => +layout.svelte} | 0 .../{index.svelte => +page.svelte} | 0 .../src/routes/routing/cancellation/a.svelte | 17 ------ .../routes/routing/cancellation/a/+page.js | 12 ++++ .../routing/cancellation/a/+page.svelte | 1 + .../cancellation/b/+page.svelte} | 0 .../client/bar/{index.svelte => +page.svelte} | 0 .../src/routes/routing/client/bar/b.svelte | 1 - .../b.svelte => client/bar/b/+page.svelte} | 0 .../client/{foo.svelte => foo/+page.svelte} | 0 .../{const.svelte => const/+page.svelte} | 0 .../dirs/bar/{index.svelte => +page.svelte} | 0 .../dirs/bar/{[a].svelte => [a]/+page.svelte} | 0 .../dirs/foo/{index.svelte => +page.svelte} | 0 .../dirs/foo/{[b].svelte => [b]/+page.svelte} | 0 .../hashes/{a.svelte => a/+page.svelte} | 0 .../hashes/{b.svelte => b/+page.svelte} | 0 .../+page.svelte} | 0 .../{target.svelte => target/+page.svelte} | 0 .../{__layout.svelte => +layout.svelte} | 0 .../matched/{index.svelte => +page.svelte} | 0 .../+page.svelte} | 0 .../+page.svelte} | 0 .../+page.svelte} | 0 .../+page.svelte} | 0 .../routes/routing/params-in-handle/[x].js | 9 --- .../routing/params-in-handle/[x]/+server.js | 10 +++ .../routes/routing/prefetched.json/+server.js | 3 + .../src/routes/routing/prefetched/+page.js | 5 ++ .../routes/routing/prefetched/+page.svelte | 6 ++ .../routing/prefetched/hash-route/+page.js | 6 ++ .../hash-route/+page.svelte} | 13 +--- .../routes/routing/prefetched/index.json.js | 3 - .../routes/routing/prefetched/index.svelte | 14 ----- .../routing/prefetching/hash-route/+page.js | 6 ++ .../hash-route/+page.svelte} | 13 +--- .../routing/prefetching/prefetched.json.js | 3 - .../prefetching/prefetched.json/+server.js | 3 + .../routing/prefetching/prefetched.svelte | 14 ----- .../routing/prefetching/prefetched/+page.js | 5 ++ .../prefetching/prefetched/+page.svelte | 6 ++ .../routes/routing/rest/[...rest]/+page.js | 5 ++ .../[...rest]/{index.svelte => +page.svelte} | 14 +---- .../{deep.json.js => deep.json/+server.js} | 2 +- .../routes/routing/rest/[...rest]/deep.svelte | 20 ------ .../routing/rest/[...rest]/deep/+page.js | 5 ++ .../routing/rest/[...rest]/deep/+page.svelte | 12 ++++ .../routing/rest/complex/[...parts].json.js | 8 --- .../rest/complex/[...parts].json/+server.js | 9 +++ .../rest/complex/prefix-[...parts].svelte | 18 ------ .../rest/complex/prefix-[...parts]/+page.js | 6 ++ .../complex/prefix-[...parts]/+page.svelte | 6 ++ .../{__layout.svelte => +layout.svelte} | 0 .../routing/rest/non-greedy/+page.svelte | 0 .../+page.svelte} | 0 .../+page.svelte} | 0 .../path/{__layout.svelte => +layout.svelte} | 0 .../routing/rest/path/[...ignored].svelte | 17 ------ .../routing/rest/path/[...ignored]/+page.js | 5 ++ .../rest/path/[...ignored]/+page.svelte | 6 ++ .../route-id/{index.svelte => +page.svelte} | 0 .../src/routes/routing/route-id/[x].svelte | 18 ------ .../src/routes/routing/route-id/[x]/+page.js | 4 ++ .../routes/routing/route-id/[x]/+page.svelte | 9 +++ .../shadow-dom/{index.svelte => +page.svelte} | 0 .../routes/routing/skipped/[one]/[two].svelte | 18 ------ .../routing/skipped/[one]/[two]/+page.js | 4 ++ .../routing/skipped/[one]/[two]/+page.svelte | 8 +++ .../slashes/{index.svelte => +page.svelte} | 0 .../{index.svelte => +page.svelte} | 0 .../{[a]-[b].svelte => [a]-[b]/+page.svelte} | 0 .../routes/scroll/cross-document/a/+page.js | 1 + .../{a.svelte => a/+page.svelte} | 4 -- .../src/routes/scroll/cross-document/b.svelte | 7 --- .../routes/scroll/cross-document/b/+page.js | 1 + .../scroll/cross-document/b/+page.svelte | 3 + .../src/routes/scroll/cross-document/c.svelte | 5 -- .../routes/scroll/cross-document/c/+page.js | 1 + .../scroll/cross-document/c/+page.svelte | 1 + .../{__layout.svelte => +layout.svelte} | 0 .../selection/{a.svelte => a/+page.svelte} | 0 .../selection/{b.svelte => b/+page.svelte} | 0 .../apps/basics/src/routes/session/+page.js | 6 ++ .../basics/src/routes/session/+page.svelte | 17 ++++++ .../basics/src/routes/session/index.svelte | 28 --------- .../basics/src/routes/set-cookie/+server.js | 8 +++ .../basics/src/routes/set-cookie/index.js | 7 --- .../shadowed/{index.svelte => +page.svelte} | 0 .../{[slug].js => [slug]/+page.server.js} | 4 +- .../{[slug].svelte => [slug]/+page.svelte} | 6 +- .../routes/shadowed/error-get/+page.server.js | 5 ++ .../+page.svelte} | 0 .../src/routes/shadowed/error-post.svelte | 12 ---- .../+page.server.js} | 6 +- .../routes/shadowed/error-post/+page.svelte | 9 +++ .../missing-get/{index.js => +page.server.js} | 0 .../{index.svelte => +page.svelte} | 0 .../{no-get.js => no-get/+page.server.js} | 0 .../{no-get.svelte => no-get/+page.svelte} | 0 .../shadowed/redirect-get-with-cookie.js | 9 --- .../redirect-get-with-cookie/+page.server.js | 6 ++ .../+page.svelte} | 0 .../src/routes/shadowed/redirect-get.js | 8 --- .../shadowed/redirect-get/+page.server.js | 5 ++ .../+page.svelte} | 0 .../shadowed/redirect-post-with-cookie.js | 9 --- .../redirect-post-with-cookie/+page.server.js | 6 ++ .../+page.svelte} | 0 .../src/routes/shadowed/redirect-post.js | 8 --- .../shadowed/redirect-post/+page.server.js | 5 ++ .../+page.svelte} | 0 .../redirect/{index.svelte => +page.svelte} | 0 .../src/routes/shadowed/redirect/[a].js | 8 --- .../shadowed/redirect/[a]/+page.server.js | 5 ++ .../redirect/{[a].svelte => [a]/+page.svelte} | 0 .../redirect/{[b].svelte => [b]/+page.svelte} | 0 .../redirect/{c.svelte => c/+page.svelte} | 0 .../basics/src/routes/shadowed/redirected.js | 7 --- .../src/routes/shadowed/redirected.svelte | 6 -- .../+page.server.js} | 2 +- .../routes/shadowed/redirected/+page.svelte | 6 ++ .../+page.svelte} | 0 .../src/routes/shadowed/same-render.svelte | 5 -- .../+page.server.js} | 2 +- .../routes/shadowed/same-render/+page.svelte | 5 ++ .../basics/src/routes/shadowed/simple.svelte | 6 -- .../{simple.js => simple/+page.server.js} | 4 +- .../src/routes/shadowed/simple/+page.svelte | 6 ++ .../basics/src/routes/src/[...anything].js | 6 -- .../src/routes/src/[...anything]/+server.js | 4 ++ .../{static.svelte => static/+page.svelte} | 0 .../store/{index.svelte => +page.svelte} | 0 .../{__layout.svelte => +layout.svelte} | 0 .../navigating/{a.svelte => a/+page.svelte} | 0 .../src/routes/store/navigating/b.svelte | 9 --- .../src/routes/store/navigating/b/+page.js | 5 ++ .../routes/store/navigating/b/+page.svelte | 1 + .../src/routes/store/navigating/c.svelte | 9 --- .../src/routes/store/navigating/c/+page.js | 5 ++ .../routes/store/navigating/c/+page.svelte | 1 + .../{result.svelte => result/+page.svelte} | 0 .../src/routes/store/stuff/+error.svelte | 20 ++++++ .../basics/src/routes/store/stuff/+layout.js | 6 ++ .../stuff/{__layout.svelte => +layout.svelte} | 11 ---- .../src/routes/store/stuff/[item].svelte | 16 ----- .../src/routes/store/stuff/[item]/+page.js | 24 ++++++++ .../routes/store/stuff/[item]/+page.svelte | 0 .../src/routes/store/stuff/__error.svelte | 18 ------ .../basics/src/routes/store/stuff/foo.svelte | 32 ---------- .../src/routes/store/stuff/foo/+page.js | 18 ++++++ .../src/routes/store/stuff/foo/+page.svelte | 7 +++ .../routes/transform-page-chunk/+page.svelte | 0 .../src/routes/unsafe-replacement/+page.js | 3 + .../routes/unsafe-replacement/+page.svelte | 6 ++ .../routes/unsafe-replacement/index.svelte | 12 ---- .../use-action/{index.svelte => +page.svelte} | 0 .../+page.svelte} | 0 .../basics/src/routes/xss.json/+server.js | 8 +++ .../test/apps/basics/src/routes/xss/+page.js | 6 ++ .../apps/basics/src/routes/xss/+page.svelte | 6 ++ .../{[path].svelte => [path]/+page.svelte} | 0 .../apps/basics/src/routes/xss/index.json.js | 9 --- .../apps/basics/src/routes/xss/index.svelte | 18 ------ .../apps/basics/src/routes/xss/query.svelte | 35 ----------- .../apps/basics/src/routes/xss/query/+page.js | 21 +++++++ .../basics/src/routes/xss/query/+page.svelte | 9 +++ .../apps/basics/src/routes/xss/shadow.svelte | 6 -- .../xss/{shadow.js => shadow/+page.server.js} | 4 +- .../basics/src/routes/xss/shadow/+page.svelte | 5 ++ 546 files changed, 1718 insertions(+), 2167 deletions(-) create mode 100644 packages/kit/test/apps/basics/src/routes/+error.svelte rename packages/kit/test/apps/basics/src/routes/{__layout-blank.svelte => +layout-blank.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/+layout.js create mode 100644 packages/kit/test/apps/basics/src/routes/+layout.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/__error.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/__layout.svelte rename packages/kit/test/apps/basics/src/routes/accessibility/{__layout.svelte => +layout.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/accessibility/{a.svelte => a/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/accessibility/{b.svelte => b/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/after-navigate/{a.svelte => a/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/after-navigate/{b.svelte => b/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/{anchor-afternavigate.svelte => anchor-afternavigate/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/{anchor-onmount.svelte => anchor-onmount/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/anchor/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/anchor/{anchor.svelte => anchor/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/answer.json.js create mode 100644 packages/kit/test/apps/basics/src/routes/answer.json/+server.js rename packages/kit/test/apps/basics/src/routes/asset-import/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/assets/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/before-navigate/{a.svelte => a/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/before-navigate/{prevent-navigation.svelte => prevent-navigation/+page.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/caching/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/caching/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/index.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/has-session.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.json.js create mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.svelte rename packages/kit/test/apps/basics/src/routes/content-type-header/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/css/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/css/{other.svelte => other/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/delete-route/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/delete-route/[id].json.js create mode 100644 packages/kit/test/apps/basics/src/routes/delete-route/[id].json/+server.js rename packages/kit/test/apps/basics/src/routes/encoded/%24[ticker]/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/encoded/{%40[username].svelte => %40[username]/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/encoded/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/encoded/[slug].svelte create mode 100644 packages/kit/test/apps/basics/src/routes/encoded/[slug]/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/encoded/[slug]/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/encoded/endpoint.js create mode 100644 packages/kit/test/apps/basics/src/routes/encoded/endpoint/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/encoded/redirect.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/encoded/redirect/+page.js rename packages/kit/test/apps/basics/src/routes/{routing/ambiguous/[slug].svelte => encoded/redirect/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/encoded/redirected.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/encoded/redirected/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/encoded/redirected/+page.svelte delete mode 100644 "packages/kit/test/apps/basics/src/routes/encoded/\345\217\215\345\272\224.svelte" create mode 100644 "packages/kit/test/apps/basics/src/routes/encoded/\345\217\215\345\272\224/+page.js" rename packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/index.svelte => "packages/kit/test/apps/basics/src/routes/encoded/\345\217\215\345\272\224/+page.svelte" (100%) delete mode 100644 "packages/kit/test/apps/basics/src/routes/encoded/\350\213\227\346\235\241.svelte" create mode 100644 "packages/kit/test/apps/basics/src/routes/encoded/\350\213\227\346\235\241/+page.js" create mode 100644 "packages/kit/test/apps/basics/src/routes/encoded/\350\213\227\346\235\241/+page.svelte" rename packages/kit/test/apps/basics/src/routes/endpoint-input/{sha256.js => sha256/+server.js} (88%) create mode 100644 packages/kit/test/apps/basics/src/routes/endpoint-output/body/+server.js rename packages/kit/test/apps/basics/src/routes/{errors/endpoint-not-ok.json.js => endpoint-output/empty/+server.js} (70%) rename packages/kit/test/apps/basics/src/routes/endpoint-output/{fetched.js => fetched/+server.js} (60%) rename packages/kit/test/apps/basics/src/routes/endpoint-output/{headers-object.js => headers-object/+server.js} (76%) rename packages/kit/test/apps/basics/src/routes/endpoint-output/{headers.js => headers/+server.js} (76%) rename packages/kit/test/apps/basics/src/routes/endpoint-output/{empty.js => null/+server.js} (74%) rename packages/kit/test/apps/basics/src/routes/endpoint-output/{proxy.js => proxy/+server.js} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/endpoint-output/simple.js create mode 100644 packages/kit/test/apps/basics/src/routes/endpoint-output/simple/+server.js rename packages/kit/test/apps/basics/src/routes/endpoint-output/{stream-throw-error.js => stream-throw-error/+server.js} (50%) rename packages/kit/test/apps/basics/src/routes/endpoint-output/{stream-typeerror.js => stream-typeerror/+server.js} (66%) rename packages/kit/test/apps/basics/src/routes/endpoint-output/{stream.js => stream/+server.js} (81%) rename packages/kit/test/apps/basics/src/routes/endpoint-output/{xml-bytes.js => xml-bytes/+server.js} (68%) rename packages/kit/test/apps/basics/src/routes/endpoint-output/{xml-text.js => xml-text/+server.js} (53%) rename packages/kit/test/apps/basics/src/routes/env/{index.js => +page.server.js} (65%) rename packages/kit/test/apps/basics/src/routes/env/{index.svelte => +page.svelte} (51%) rename packages/kit/test/apps/basics/src/routes/errors/{clientside.svelte => clientside/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/{endpoint-output/null.js => errors/endpoint-not-ok.json/+server.js} (61%) delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.js rename packages/kit/test/apps/basics/src/routes/errors/{endpoint-shadow-not-ok.svelte => endpoint-not-ok/+page.svelte} (97%) delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok.js rename packages/kit/test/apps/basics/src/routes/{endpoint-output/body.js => errors/endpoint-shadow-not-ok/+page.server.js} (51%) rename packages/kit/test/apps/basics/src/routes/errors/{endpoint-shadow.svelte => endpoint-shadow-not-ok/+page.svelte} (97%) rename packages/kit/test/apps/basics/src/routes/errors/{endpoint-shadow.js => endpoint-shadow/+page.server.js} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow/+page.svelte rename packages/kit/test/apps/basics/src/routes/errors/{endpoint.json.js => endpoint.json/+server.js} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/endpoint.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/endpoint/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/endpoint/+page.svelte rename packages/kit/test/apps/basics/src/routes/errors/{error-in-handle.svelte => error-in-handle/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/errors/error-in-layout/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/init-error-endpoint.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/init-error-endpoint/+server.js rename packages/kit/test/apps/basics/src/routes/errors/{invalid-route-response.js => invalid-route-response/+server.js} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-client.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-client/+page.js rename packages/kit/test/apps/basics/src/routes/{transform-page-chunk/index.svelte => errors/load-client/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-client.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-client/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-client/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-client.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-client/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-client/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-server.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-server/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-server/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-string-client.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-string-client/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-string-client/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-string-server.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-string-server/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-string-server/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-server.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-server/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-server/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-client.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-client/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-client/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.svelte rename packages/kit/test/apps/basics/src/routes/errors/{module-scope-client.svelte => module-scope-client/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/errors/{module-scope-server.svelte => module-scope-server/+page.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/errors/nested-error-page/+error.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/nested-error-page/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/nested-error-page/__error.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/nested-error-page/index.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/nested-error-page/nope.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/nested-error-page/nope/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/nested-error-page/nope/+page.svelte rename packages/kit/test/apps/basics/src/routes/errors/page-endpoint/{__error.svelte => +error.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/errors/page-endpoint/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit/+page.server.js rename packages/kit/test/apps/basics/src/routes/errors/page-endpoint/{get-explicit.svelte => get-explicit/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/errors/page-endpoint/{get-implicit.js => get-implicit/+page.server.js} (58%) rename packages/kit/test/apps/basics/src/routes/errors/page-endpoint/{get-implicit.svelte => get-implicit/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit/+page.server.js rename packages/kit/test/apps/basics/src/routes/errors/page-endpoint/{post-explicit.svelte => post-explicit/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/errors/page-endpoint/{post-implicit.js => post-implicit/+page.server.js} (58%) rename packages/kit/test/apps/basics/src/routes/errors/page-endpoint/{post-implicit.svelte => post-implicit/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/errors/{serverside.svelte => serverside/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/errors/stack-trace/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/etag/{binary.js => binary/+server.js} (68%) delete mode 100644 packages/kit/test/apps/basics/src/routes/etag/custom.js create mode 100644 packages/kit/test/apps/basics/src/routes/etag/custom/+server.js rename packages/kit/test/apps/basics/src/routes/etag/{text.js => text/+server.js} (74%) delete mode 100644 packages/kit/test/apps/basics/src/routes/favicon.ico.js create mode 100644 packages/kit/test/apps/basics/src/routes/favicon.ico/+server.js rename packages/kit/test/apps/basics/src/routes/headers/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/headers/class.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/headers/class/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/headers/class/+page.svelte rename packages/kit/test/apps/basics/src/routes/headers/{echo.js => echo/+server.js} (68%) rename packages/kit/test/apps/basics/src/routes/iframes/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/iframes/nested/{child.svelte => child/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/iframes/nested/{parent.svelte => parent/+page.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/imports/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/imports/index.svelte rename packages/kit/test/apps/basics/src/routes/imports/{markdown.svelte => markdown/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/index.svelte rename packages/kit/test/apps/basics/src/routes/keepfocus/{index.svelte => +page.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/load/+page.js rename packages/kit/test/apps/basics/src/routes/load/{index.svelte => +page.svelte} (53%) delete mode 100644 packages/kit/test/apps/basics/src/routes/load/[dynamic].json.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/[dynamic].json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/load/[dynamic].svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/[dynamic]/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/[dynamic]/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/__layout.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/data.json.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/data.json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x].svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x]/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x]/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/session/used.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y].svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y]/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y]/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/index.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-credentialed.json.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-credentialed.json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-credentialed.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-credentialed/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-credentialed/+page.svelte rename packages/kit/test/apps/basics/src/routes/load/{fetch-headers.json.js => fetch-headers.json/+server.js} (65%) delete mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-headers.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-headers/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-headers/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-relative.json.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-relative.json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-relative.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-relative/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-relative/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-request.json.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-request.json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-request.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-request/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-request/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/large-response/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/large-response/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/large-response/index.svelte rename packages/kit/test/apps/basics/src/routes/load/large-response/{text.txt.js => text.txt/+server.js} (86%) create mode 100644 packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/layout-props/__layout.svelte rename packages/kit/test/apps/basics/src/routes/load/layout-props/{a.svelte => a/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/load/layout-props/{b.svelte => b/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/load/props/{__layout.svelte => +layout.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/load/props/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/props/+page.svelte rename packages/kit/test/apps/basics/src/routes/load/props/{about.svelte => about/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/load/props/index.svelte rename packages/kit/test/apps/basics/src/routes/load/{raw-body.json.js => raw-body.json/+server.js} (62%) delete mode 100644 packages/kit/test/apps/basics/src/routes/load/raw-body.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/raw-body/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/raw-body/+page.svelte rename packages/kit/test/apps/basics/src/routes/load/{relay.json.js => relay.json/+server.js} (58%) delete mode 100644 packages/kit/test/apps/basics/src/routes/load/relay.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/relay/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/relay/+page.svelte rename packages/kit/test/apps/basics/src/routes/load/{serialization-post.json.js => serialization-post.json/+server.js} (76%) delete mode 100644 packages/kit/test/apps/basics/src/routes/load/serialization-post.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/serialization-post/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/serialization-post/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/serialization.json.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/serialization.json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/load/serialization.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/serialization/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/serialization/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/server-fetch-request.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/server-fetch-request/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/server-fetch-request/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/+page.svelte rename packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/{a.json.js => a.json/+server.js} (53%) delete mode 100644 packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/b.json.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/b.json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/index.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/+layout.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/+layout.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/[x]/+layout.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/[x]/+layout.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/+layout.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/+layout.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z].svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/__layout.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/[x]/__layout.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/__layout.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/url-hash.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/url-hash/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/url-hash/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/url-to-string.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/url-to-string/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/url-to-string/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/window-fetch/correct.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/window-fetch/correct/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/window-fetch/correct/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/window-fetch/data.json.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/window-fetch/data.json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/load/window-fetch/incorrect.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/window-fetch/incorrect/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/window-fetch/incorrect/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/method-override/+page.js rename packages/kit/test/apps/basics/src/routes/method-override/{index.svelte => +page.svelte} (73%) rename packages/kit/test/apps/basics/src/routes/method-override/{fetch.json.js => fetch.json/+server.js} (76%) rename packages/kit/test/apps/basics/src/routes/nested-layout/{__layout.svelte => +layout.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/nested-layout/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/nested-layout/error.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/nested-layout/error/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/nested-layout/error/+page.svelte rename packages/kit/test/apps/basics/src/routes/nested-layout/foo/{__layout.svelte => +layout.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/+error.svelte rename packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/{__layout.svelte => +layout.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/__error.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope/+page.svelte rename packages/kit/test/apps/basics/src/routes/nested-layout/foo/{baz.svelte => baz/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/nested-layout/reset/{__layout@blank.svelte => +layout@blank.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/nested-layout/reset/{index.svelte => +page.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/no-hydrate.json/+server.js create mode 100644 packages/kit/test/apps/basics/src/routes/no-hydrate/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/no-hydrate/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/no-hydrate/index.json.js delete mode 100644 packages/kit/test/apps/basics/src/routes/no-hydrate/index.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/no-hydrate/no-js.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/no-hydrate/no-js/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/no-hydrate/no-js/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/no-hydrate/other.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/no-hydrate/other/+page.svelte rename packages/kit/test/apps/basics/src/routes/no-router/{__layout.svelte => +layout.svelte} (91%) delete mode 100644 packages/kit/test/apps/basics/src/routes/no-router/a.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/no-router/a/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/no-router/a/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/no-router/b/+page.svelte rename packages/kit/test/apps/basics/src/routes/no-ssr/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/no-ssr/{margin.svelte => margin/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/no-ssr/{other.svelte => other/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/origin/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/package.json.js create mode 100644 packages/kit/test/apps/basics/src/routes/package.json/+server.js rename packages/kit/test/apps/basics/src/routes/paths/{index.svelte => +page.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/prerendering/+error.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/prerendering/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/prerendering/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/prerendering/__error.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/prerendering/index.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint/+page.js rename packages/kit/test/apps/basics/src/routes/prerendering/{mutative-endpoint.ts => mutative-endpoint/+page.server.ts} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/query/echo.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/query/echo/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/query/echo/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/redirect-on-load/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/redirect-on-load/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/redirect-on-load/index.svelte rename packages/kit/test/apps/basics/src/routes/redirect-on-load/{redirected.svelte => redirected/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/redirect/{index.svelte => +page.svelte} (78%) delete mode 100644 packages/kit/test/apps/basics/src/routes/redirect/a.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/redirect/a/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/redirect/a/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/redirect/b.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/redirect/b/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/redirect/b/+page.svelte rename packages/kit/test/apps/basics/src/routes/redirect/{c.svelte => c/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/redirect/loopy/a.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/redirect/loopy/a/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/redirect/loopy/a/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/redirect/loopy/b.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/redirect/loopy/b/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/redirect/loopy/b/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/redirect/missing-status/a.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/redirect/missing-status/a/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/redirect/missing-status/a/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/redirect/missing-status/b.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/redirect/missing-status/b/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/redirect/missing-status/b/+page.svelte rename packages/kit/test/apps/basics/src/routes/routing/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/{[slug].svelte => [slug]/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/{a.svelte => a/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/ambiguous/{[slug].json.js => [slug].json/+server.js} (68%) create mode 100644 packages/kit/test/apps/basics/src/routes/routing/ambiguous/[slug]/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/b.json/+server.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/b/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/b/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/b/index.json.js delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/b/index.svelte rename packages/kit/test/apps/basics/src/routes/routing/cancellation/{__layout.svelte => +layout.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/cancellation/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/cancellation/a.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/cancellation/a/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/cancellation/a/+page.svelte rename packages/kit/test/apps/basics/src/routes/{no-router/b.svelte => routing/cancellation/b/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/client/bar/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/client/bar/b.svelte rename packages/kit/test/apps/basics/src/routes/routing/{cancellation/b.svelte => client/bar/b/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/client/{foo.svelte => foo/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/{const.svelte => const/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/dirs/bar/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/dirs/bar/{[a].svelte => [a]/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/dirs/foo/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/dirs/foo/{[b].svelte => [b]/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/hashes/{a.svelte => a/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/hashes/{b.svelte => b/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/hashes/{pagestore.svelte => pagestore/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/hashes/{target.svelte => target/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/matched/{__layout.svelte => +layout.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/matched/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/matched/{[fallback].svelte => [fallback]/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/matched/{[letter=lowercase].svelte => [letter=lowercase]/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/matched/{[letter=uppercase].svelte => [letter=uppercase]/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/matched/{[number=numeric].svelte => [number=numeric]/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/params-in-handle/[x].js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/params-in-handle/[x]/+server.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/prefetched.json/+server.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/prefetched/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/prefetched/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/prefetched/hash-route/+page.js rename packages/kit/test/apps/basics/src/routes/routing/{prefetching/hash-route.svelte => prefetched/hash-route/+page.svelte} (69%) delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/prefetched/index.json.js delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/prefetched/index.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/prefetching/hash-route/+page.js rename packages/kit/test/apps/basics/src/routes/routing/{prefetched/hash-route.svelte => prefetching/hash-route/+page.svelte} (69%) delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/prefetching/prefetched.json.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/prefetching/prefetched.json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/prefetching/prefetched.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/prefetching/prefetched/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/prefetching/prefetched/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/+page.js rename packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/{index.svelte => +page.svelte} (56%) rename packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/{deep.json.js => deep.json/+server.js} (72%) delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/complex/[...parts].json.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/complex/[...parts].json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/complex/prefix-[...parts].svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/complex/prefix-[...parts]/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/complex/prefix-[...parts]/+page.svelte rename packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/{__layout.svelte => +layout.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/+page.svelte rename packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/[dynamic]-bar/{[...rest].svelte => [...rest]/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/foo/{[...rest].svelte => [...rest]/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/rest/path/{__layout.svelte => +layout.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/path/[...ignored].svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/path/[...ignored]/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/rest/path/[...ignored]/+page.svelte rename packages/kit/test/apps/basics/src/routes/routing/route-id/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/route-id/[x].svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/route-id/[x]/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/route-id/[x]/+page.svelte rename packages/kit/test/apps/basics/src/routes/routing/shadow-dom/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/routing/skipped/[one]/[two].svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/skipped/[one]/[two]/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/routing/skipped/[one]/[two]/+page.svelte rename packages/kit/test/apps/basics/src/routes/routing/slashes/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/split-params/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/routing/split-params/{[a]-[b].svelte => [a]-[b]/+page.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/scroll/cross-document/a/+page.js rename packages/kit/test/apps/basics/src/routes/scroll/cross-document/{a.svelte => a/+page.svelte} (60%) delete mode 100644 packages/kit/test/apps/basics/src/routes/scroll/cross-document/b.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/scroll/cross-document/b/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/scroll/cross-document/b/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/scroll/cross-document/c.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/scroll/cross-document/c/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/scroll/cross-document/c/+page.svelte rename packages/kit/test/apps/basics/src/routes/selection/{__layout.svelte => +layout.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/selection/{a.svelte => a/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/selection/{b.svelte => b/+page.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/session/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/session/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/session/index.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/set-cookie/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/set-cookie/index.js rename packages/kit/test/apps/basics/src/routes/shadowed/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/shadowed/dynamic/{[slug].js => [slug]/+page.server.js} (75%) rename packages/kit/test/apps/basics/src/routes/shadowed/dynamic/{[slug].svelte => [slug]/+page.svelte} (54%) create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/error-get/+page.server.js rename packages/kit/test/apps/basics/src/routes/shadowed/{error-get.svelte => error-get/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/error-post.svelte rename packages/kit/test/apps/basics/src/routes/shadowed/{error-post.js => error-post/+page.server.js} (78%) create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/error-post/+page.svelte rename packages/kit/test/apps/basics/src/routes/shadowed/missing-get/{index.js => +page.server.js} (100%) rename packages/kit/test/apps/basics/src/routes/shadowed/missing-get/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/shadowed/{no-get.js => no-get/+page.server.js} (100%) rename packages/kit/test/apps/basics/src/routes/shadowed/{no-get.svelte => no-get/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.js create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie/+page.server.js rename packages/kit/test/apps/basics/src/routes/shadowed/{redirect-get-with-cookie.svelte => redirect-get-with-cookie/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect-get.js create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect-get/+page.server.js rename packages/kit/test/apps/basics/src/routes/shadowed/{redirect-get.svelte => redirect-get/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.js create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie/+page.server.js rename packages/kit/test/apps/basics/src/routes/shadowed/{redirect-post-with-cookie.svelte => redirect-post-with-cookie/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect-post.js create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect-post/+page.server.js rename packages/kit/test/apps/basics/src/routes/shadowed/{redirect-post.svelte => redirect-post/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/shadowed/redirect/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect/[a].js create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirect/[a]/+page.server.js rename packages/kit/test/apps/basics/src/routes/shadowed/redirect/{[a].svelte => [a]/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/shadowed/redirect/{[b].svelte => [b]/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/shadowed/redirect/{c.svelte => c/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirected.js delete mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirected.svelte rename packages/kit/test/apps/basics/src/routes/shadowed/{error-get.js => redirected/+page.server.js} (63%) create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/redirected/+page.svelte rename packages/kit/test/apps/basics/src/routes/shadowed/{same-render-entry.svelte => same-render-entry/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/same-render.svelte rename packages/kit/test/apps/basics/src/routes/shadowed/{same-render.js => same-render/+page.server.js} (66%) create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/same-render/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/simple.svelte rename packages/kit/test/apps/basics/src/routes/shadowed/{simple.js => simple/+page.server.js} (72%) create mode 100644 packages/kit/test/apps/basics/src/routes/shadowed/simple/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/src/[...anything].js create mode 100644 packages/kit/test/apps/basics/src/routes/src/[...anything]/+server.js rename packages/kit/test/apps/basics/src/routes/{static.svelte => static/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/store/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/store/navigating/{__layout.svelte => +layout.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/store/navigating/{a.svelte => a/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/store/navigating/b.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/store/navigating/b/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/store/navigating/b/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/store/navigating/c.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/store/navigating/c/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/store/navigating/c/+page.svelte rename packages/kit/test/apps/basics/src/routes/store/{result.svelte => result/+page.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/store/stuff/+error.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/store/stuff/+layout.js rename packages/kit/test/apps/basics/src/routes/store/stuff/{__layout.svelte => +layout.svelte} (66%) delete mode 100644 packages/kit/test/apps/basics/src/routes/store/stuff/[item].svelte create mode 100644 packages/kit/test/apps/basics/src/routes/store/stuff/[item]/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/store/stuff/[item]/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/store/stuff/__error.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/store/stuff/foo.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/store/stuff/foo/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/store/stuff/foo/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/transform-page-chunk/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/unsafe-replacement/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/unsafe-replacement/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/unsafe-replacement/index.svelte rename packages/kit/test/apps/basics/src/routes/use-action/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/use-action/{focus-and-scroll.svelte => focus-and-scroll/+page.svelte} (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/xss.json/+server.js create mode 100644 packages/kit/test/apps/basics/src/routes/xss/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/xss/+page.svelte rename packages/kit/test/apps/basics/src/routes/xss/{[path].svelte => [path]/+page.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/xss/index.json.js delete mode 100644 packages/kit/test/apps/basics/src/routes/xss/index.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/xss/query.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/xss/query/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/xss/query/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/xss/shadow.svelte rename packages/kit/test/apps/basics/src/routes/xss/{shadow.js => shadow/+page.server.js} (83%) create mode 100644 packages/kit/test/apps/basics/src/routes/xss/shadow/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/+error.svelte b/packages/kit/test/apps/basics/src/routes/+error.svelte new file mode 100644 index 000000000000..0b401988da18 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/+error.svelte @@ -0,0 +1,37 @@ + + + + Custom error page: {$page.error.message} + + +

{status}

+ +

This is your custom error page saying: "{$page.error.message}"

+ +
{$page.error.stack}
+ + diff --git a/packages/kit/test/apps/basics/src/routes/__layout-blank.svelte b/packages/kit/test/apps/basics/src/routes/+layout-blank.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/__layout-blank.svelte rename to packages/kit/test/apps/basics/src/routes/+layout-blank.svelte diff --git a/packages/kit/test/apps/basics/src/routes/+layout.js b/packages/kit/test/apps/basics/src/routes/+layout.js new file mode 100644 index 000000000000..fa32195cdb57 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/+layout.js @@ -0,0 +1,15 @@ +import { error } from '@sveltejs/kit/data'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch, url }) { + if (url.pathname.startsWith('/errors/error-in-layout')) { + const res = await fetch('/errors/error-in-layout/non-existent'); + throw error(res.status, undefined); + } + + return { + foo: { + bar: 'Custom layout' + } + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/+layout.svelte b/packages/kit/test/apps/basics/src/routes/+layout.svelte new file mode 100644 index 000000000000..4faac0bf00cb --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/+layout.svelte @@ -0,0 +1,34 @@ + + + + +
{data.foo.bar}
+ + diff --git a/packages/kit/test/apps/basics/src/routes/+page.js b/packages/kit/test/apps/basics/src/routes/+page.js new file mode 100644 index 000000000000..b3c5e181aac7 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/+page.js @@ -0,0 +1,6 @@ +/** @type {import('@sveltejs/kit').Load}*/ +export async function load({ fetch }) { + const res = await fetch('/answer.json'); + const { answer } = await res.json(); + return { answer }; +} diff --git a/packages/kit/test/apps/basics/src/routes/+page.svelte b/packages/kit/test/apps/basics/src/routes/+page.svelte new file mode 100644 index 000000000000..ffdd47c9c402 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/+page.svelte @@ -0,0 +1,8 @@ + + +

the answer is {data.answer}

diff --git a/packages/kit/test/apps/basics/src/routes/__error.svelte b/packages/kit/test/apps/basics/src/routes/__error.svelte deleted file mode 100644 index 14726878692f..000000000000 --- a/packages/kit/test/apps/basics/src/routes/__error.svelte +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - Custom error page: {error.message} - - -

{status}

- -

This is your custom error page saying: "{error.message}"

- -
{error.stack}
- - diff --git a/packages/kit/test/apps/basics/src/routes/__layout.svelte b/packages/kit/test/apps/basics/src/routes/__layout.svelte deleted file mode 100644 index 1cb9805e3ec6..000000000000 --- a/packages/kit/test/apps/basics/src/routes/__layout.svelte +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - -
{foo.bar}
- - diff --git a/packages/kit/test/apps/basics/src/routes/accessibility/__layout.svelte b/packages/kit/test/apps/basics/src/routes/accessibility/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/accessibility/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/accessibility/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/accessibility/a.svelte b/packages/kit/test/apps/basics/src/routes/accessibility/a/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/accessibility/a.svelte rename to packages/kit/test/apps/basics/src/routes/accessibility/a/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/accessibility/b.svelte b/packages/kit/test/apps/basics/src/routes/accessibility/b/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/accessibility/b.svelte rename to packages/kit/test/apps/basics/src/routes/accessibility/b/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/after-navigate/a.svelte b/packages/kit/test/apps/basics/src/routes/after-navigate/a/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/after-navigate/a.svelte rename to packages/kit/test/apps/basics/src/routes/after-navigate/a/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/after-navigate/b.svelte b/packages/kit/test/apps/basics/src/routes/after-navigate/b/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/after-navigate/b.svelte rename to packages/kit/test/apps/basics/src/routes/after-navigate/b/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/index.svelte b/packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/index.svelte rename to packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/anchor-afternavigate.svelte b/packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/anchor-afternavigate/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/anchor-afternavigate.svelte rename to packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/anchor-afternavigate/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/anchor-onmount.svelte b/packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/anchor-onmount/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/anchor-onmount.svelte rename to packages/kit/test/apps/basics/src/routes/anchor-with-manual-scroll/anchor-onmount/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/anchor/index.svelte b/packages/kit/test/apps/basics/src/routes/anchor/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/anchor/index.svelte rename to packages/kit/test/apps/basics/src/routes/anchor/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/anchor/anchor.svelte b/packages/kit/test/apps/basics/src/routes/anchor/anchor/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/anchor/anchor.svelte rename to packages/kit/test/apps/basics/src/routes/anchor/anchor/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/answer.json.js b/packages/kit/test/apps/basics/src/routes/answer.json.js deleted file mode 100644 index 863b891d5c88..000000000000 --- a/packages/kit/test/apps/basics/src/routes/answer.json.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - answer: 42 - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/answer.json/+server.js b/packages/kit/test/apps/basics/src/routes/answer.json/+server.js new file mode 100644 index 000000000000..67ed4c3a73cf --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/answer.json/+server.js @@ -0,0 +1,8 @@ +export function GET() { + return new Response( + JSON.stringify({ + answer: 42 + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/asset-import/index.svelte b/packages/kit/test/apps/basics/src/routes/asset-import/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/asset-import/index.svelte rename to packages/kit/test/apps/basics/src/routes/asset-import/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/assets/index.svelte b/packages/kit/test/apps/basics/src/routes/assets/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/assets/index.svelte rename to packages/kit/test/apps/basics/src/routes/assets/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/before-navigate/a.svelte b/packages/kit/test/apps/basics/src/routes/before-navigate/a/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/before-navigate/a.svelte rename to packages/kit/test/apps/basics/src/routes/before-navigate/a/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/before-navigate/prevent-navigation.svelte b/packages/kit/test/apps/basics/src/routes/before-navigate/prevent-navigation/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/before-navigate/prevent-navigation.svelte rename to packages/kit/test/apps/basics/src/routes/before-navigate/prevent-navigation/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/caching/+page.js b/packages/kit/test/apps/basics/src/routes/caching/+page.js new file mode 100644 index 000000000000..6890cce7d211 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/+page.js @@ -0,0 +1,4 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ setHeaders }) { + setHeaders('cache-control: max-age=30'); +} diff --git a/packages/kit/test/apps/basics/src/routes/caching/+page.svelte b/packages/kit/test/apps/basics/src/routes/caching/+page.svelte new file mode 100644 index 000000000000..dab86c8207ab --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/+page.svelte @@ -0,0 +1 @@ +

this page will be cached for 30 seconds

diff --git a/packages/kit/test/apps/basics/src/routes/caching/index.svelte b/packages/kit/test/apps/basics/src/routes/caching/index.svelte deleted file mode 100644 index 2f181b24c6c1..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/index.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -

this page will be cached for 30 seconds

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/has-session.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/has-session.svelte deleted file mode 100644 index aec680b6c17d..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/has-session.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - -

this page will be private even if $session is not used, but a session is return from hooks.js#getSession

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.js b/packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.js new file mode 100644 index 000000000000..8075bbfe6925 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.js @@ -0,0 +1,10 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ url, setHeaders }) { + setHeaders( + `cache-control: ${ + url.searchParams.has('private') && url.searchParams.get('private') === 'true' + ? 'private' + : 'public' + }, max-age=30` + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.svelte new file mode 100644 index 000000000000..61a10746a647 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.svelte @@ -0,0 +1 @@ +

this page will be private even if $session is not used, but a session is return from hooks.js#getSession

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private.svelte deleted file mode 100644 index bd760e391395..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private.svelte +++ /dev/null @@ -1,13 +0,0 @@ - - -

this page will be cached for 30 seconds

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.js b/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.js new file mode 100644 index 000000000000..a21953aa985b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.js @@ -0,0 +1,8 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ url, setHeaders }) { + setHeaders( + `cache-control: ${ + url.searchParams.get('private') === 'true' ? 'private' : 'public' + }, max-age=30` + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.svelte new file mode 100644 index 000000000000..dab86c8207ab --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.svelte @@ -0,0 +1 @@ +

this page will be cached for 30 seconds

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.json.js b/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.json.js deleted file mode 100644 index 863b891d5c88..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.json.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - answer: 42 - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.json/+server.js b/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.json/+server.js new file mode 100644 index 000000000000..67ed4c3a73cf --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.json/+server.js @@ -0,0 +1,8 @@ +export function GET() { + return new Response( + JSON.stringify({ + answer: 42 + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.svelte deleted file mode 100644 index b3d6e4995043..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - -

this page will be cached for 30 seconds

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.js b/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.js new file mode 100644 index 000000000000..36321aa7b161 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.js @@ -0,0 +1,15 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ url, setHeaders }) { + setHeaders( + `cache-control: ${ + url.searchParams.has('private') && url.searchParams.get('private') === 'true' + ? 'private' + : 'public' + }, max-age=30` + ); + const res = await fetch('/caching/private/uses-fetch.json', { + credentials: /** @type {RequestCredentials} */ (url.searchParams.get('credentials')) + }); + + return await res.json(); +} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.svelte new file mode 100644 index 000000000000..dab86c8207ab --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.svelte @@ -0,0 +1 @@ +

this page will be cached for 30 seconds

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init.svelte deleted file mode 100644 index 75d93d95612c..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init.svelte +++ /dev/null @@ -1,21 +0,0 @@ - - - - -

this page will be cached for 30 seconds ({session_exists})

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.js b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.js new file mode 100644 index 000000000000..8075bbfe6925 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.js @@ -0,0 +1,10 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ url, setHeaders }) { + setHeaders( + `cache-control: ${ + url.searchParams.has('private') && url.searchParams.get('private') === 'true' + ? 'private' + : 'public' + }, max-age=30` + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.svelte new file mode 100644 index 000000000000..5087b27622ec --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.svelte @@ -0,0 +1,7 @@ + + +

this page will be cached for 30 seconds ({session_exists})

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load.svelte deleted file mode 100644 index 319fab65f41b..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load.svelte +++ /dev/null @@ -1,24 +0,0 @@ - - - - -

this page will be cached for 30 seconds ({session_exists})

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.js b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.js new file mode 100644 index 000000000000..746181ed5494 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.js @@ -0,0 +1,15 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ url, session, setHeaders }) { + setHeaders( + `cache-control: ${ + url.searchParams.has('private') && url.searchParams.get('private') === 'true' + ? 'private' + : 'public' + }, max-age=30` + ); + const session_exists = !!session; + + return { + session_exists + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.svelte new file mode 100644 index 000000000000..f3e5ce7b46d5 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.svelte @@ -0,0 +1,5 @@ + + +

this page will be cached for 30 seconds ({data.session_exists})

diff --git a/packages/kit/test/apps/basics/src/routes/content-type-header/index.svelte b/packages/kit/test/apps/basics/src/routes/content-type-header/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/content-type-header/index.svelte rename to packages/kit/test/apps/basics/src/routes/content-type-header/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/css/index.svelte b/packages/kit/test/apps/basics/src/routes/css/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/css/index.svelte rename to packages/kit/test/apps/basics/src/routes/css/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/css/other.svelte b/packages/kit/test/apps/basics/src/routes/css/other/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/css/other.svelte rename to packages/kit/test/apps/basics/src/routes/css/other/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/index.svelte b/packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/index.svelte rename to packages/kit/test/apps/basics/src/routes/cyclical-dynamic-import/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/delete-route/index.svelte b/packages/kit/test/apps/basics/src/routes/delete-route/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/delete-route/index.svelte rename to packages/kit/test/apps/basics/src/routes/delete-route/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/delete-route/[id].json.js b/packages/kit/test/apps/basics/src/routes/delete-route/[id].json.js deleted file mode 100644 index 3a268554116f..000000000000 --- a/packages/kit/test/apps/basics/src/routes/delete-route/[id].json.js +++ /dev/null @@ -1,9 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function DELETE(req) { - return { - status: 200, - body: { - id: req.params.id - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/delete-route/[id].json/+server.js b/packages/kit/test/apps/basics/src/routes/delete-route/[id].json/+server.js new file mode 100644 index 000000000000..87a7f5a517dd --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/delete-route/[id].json/+server.js @@ -0,0 +1,9 @@ +/** @type {import('@sveltejs/kit').RequestHandler} */ +export function DELETE(req) { + return new Response( + JSON.stringify({ + id: req.params.id + }), + { headers: { 'content-type': 'application/json; charset=utf-8' }, status: 200 } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/encoded/%24[ticker]/index.svelte b/packages/kit/test/apps/basics/src/routes/encoded/%24[ticker]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/encoded/%24[ticker]/index.svelte rename to packages/kit/test/apps/basics/src/routes/encoded/%24[ticker]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/encoded/%40[username].svelte b/packages/kit/test/apps/basics/src/routes/encoded/%40[username]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/encoded/%40[username].svelte rename to packages/kit/test/apps/basics/src/routes/encoded/%40[username]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/encoded/index.svelte b/packages/kit/test/apps/basics/src/routes/encoded/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/encoded/index.svelte rename to packages/kit/test/apps/basics/src/routes/encoded/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/encoded/[slug].svelte b/packages/kit/test/apps/basics/src/routes/encoded/[slug].svelte deleted file mode 100644 index 03089c2e7a21..000000000000 --- a/packages/kit/test/apps/basics/src/routes/encoded/[slug].svelte +++ /dev/null @@ -1,25 +0,0 @@ - - - - -

dynamic

-

{path}: {slug}

-

{$page.url.pathname}: {$page.params.slug}

diff --git a/packages/kit/test/apps/basics/src/routes/encoded/[slug]/+page.js b/packages/kit/test/apps/basics/src/routes/encoded/[slug]/+page.js new file mode 100644 index 000000000000..08d6f949a9b0 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/encoded/[slug]/+page.js @@ -0,0 +1,7 @@ +/** @type {import('./$types').Load} */ +export function load({ url, params }) { + return { + path: url.pathname, + slug: params.slug + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/encoded/[slug]/+page.svelte b/packages/kit/test/apps/basics/src/routes/encoded/[slug]/+page.svelte new file mode 100644 index 000000000000..1c75a4032fe1 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/encoded/[slug]/+page.svelte @@ -0,0 +1,10 @@ + + +

dynamic

+

{data.path}: {data.slug}

+

{$page.url.pathname}: {$page.params.slug}

diff --git a/packages/kit/test/apps/basics/src/routes/encoded/endpoint.js b/packages/kit/test/apps/basics/src/routes/encoded/endpoint.js deleted file mode 100644 index 4112bf5d8304..000000000000 --- a/packages/kit/test/apps/basics/src/routes/encoded/endpoint.js +++ /dev/null @@ -1,7 +0,0 @@ -export async function GET() { - return { - body: { - fruit: '🍎🍇🍌' - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/encoded/endpoint/+server.js b/packages/kit/test/apps/basics/src/routes/encoded/endpoint/+server.js new file mode 100644 index 000000000000..2454ccf387b6 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/encoded/endpoint/+server.js @@ -0,0 +1,8 @@ +export async function GET() { + return new Response( + JSON.stringify({ + fruit: '🍎🍇🍌' + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/encoded/redirect.svelte b/packages/kit/test/apps/basics/src/routes/encoded/redirect.svelte deleted file mode 100644 index 1acc12eba077..000000000000 --- a/packages/kit/test/apps/basics/src/routes/encoded/redirect.svelte +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/packages/kit/test/apps/basics/src/routes/encoded/redirect/+page.js b/packages/kit/test/apps/basics/src/routes/encoded/redirect/+page.js new file mode 100644 index 000000000000..8d65fa6353a7 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/encoded/redirect/+page.js @@ -0,0 +1,6 @@ +import { redirect } from '@sveltejs/kit/data'; + +/** @type {import('@sveltejs/kit').Load} */ +export function load() { + throw redirect(307, 'redirected?embedded=' + encodeURIComponent('/苗条?foo=bar&fizz=buzz')); +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/ambiguous/[slug].svelte b/packages/kit/test/apps/basics/src/routes/encoded/redirect/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/ambiguous/[slug].svelte rename to packages/kit/test/apps/basics/src/routes/encoded/redirect/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/encoded/redirected.svelte b/packages/kit/test/apps/basics/src/routes/encoded/redirected.svelte deleted file mode 100644 index 7e8bc13d67c7..000000000000 --- a/packages/kit/test/apps/basics/src/routes/encoded/redirected.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - - -
{embedded}
diff --git a/packages/kit/test/apps/basics/src/routes/encoded/redirected/+page.js b/packages/kit/test/apps/basics/src/routes/encoded/redirected/+page.js new file mode 100644 index 000000000000..8a941077f93b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/encoded/redirected/+page.js @@ -0,0 +1,7 @@ +/** @type {import('@sveltejs/kit').Load} */ +export function load({ url }) { + return { + // nb: .get() on URLSearchParams does a decoding pass, so we should see the raw values. + embedded: url.searchParams.get('embedded') + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/encoded/redirected/+page.svelte b/packages/kit/test/apps/basics/src/routes/encoded/redirected/+page.svelte new file mode 100644 index 000000000000..ac072bdc65cf --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/encoded/redirected/+page.svelte @@ -0,0 +1,6 @@ + + +
{data.embedded}
diff --git "a/packages/kit/test/apps/basics/src/routes/encoded/\345\217\215\345\272\224.svelte" "b/packages/kit/test/apps/basics/src/routes/encoded/\345\217\215\345\272\224.svelte" deleted file mode 100644 index a31f8818f6f9..000000000000 --- "a/packages/kit/test/apps/basics/src/routes/encoded/\345\217\215\345\272\224.svelte" +++ /dev/null @@ -1,8 +0,0 @@ - diff --git "a/packages/kit/test/apps/basics/src/routes/encoded/\345\217\215\345\272\224/+page.js" "b/packages/kit/test/apps/basics/src/routes/encoded/\345\217\215\345\272\224/+page.js" new file mode 100644 index 000000000000..228fc79ebf1d --- /dev/null +++ "b/packages/kit/test/apps/basics/src/routes/encoded/\345\217\215\345\272\224/+page.js" @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit/data'; + +export function load() { + throw redirect(307, encodeURI('苗条')); +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/index.svelte "b/packages/kit/test/apps/basics/src/routes/encoded/\345\217\215\345\272\224/+page.svelte" similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/index.svelte rename to "packages/kit/test/apps/basics/src/routes/encoded/\345\217\215\345\272\224/+page.svelte" diff --git "a/packages/kit/test/apps/basics/src/routes/encoded/\350\213\227\346\235\241.svelte" "b/packages/kit/test/apps/basics/src/routes/encoded/\350\213\227\346\235\241.svelte" deleted file mode 100644 index 6ec7813eadcf..000000000000 --- "a/packages/kit/test/apps/basics/src/routes/encoded/\350\213\227\346\235\241.svelte" +++ /dev/null @@ -1,21 +0,0 @@ - - - - -

static

-

{path}

-

{$page.url.pathname}

diff --git "a/packages/kit/test/apps/basics/src/routes/encoded/\350\213\227\346\235\241/+page.js" "b/packages/kit/test/apps/basics/src/routes/encoded/\350\213\227\346\235\241/+page.js" new file mode 100644 index 000000000000..e061d65fd1ab --- /dev/null +++ "b/packages/kit/test/apps/basics/src/routes/encoded/\350\213\227\346\235\241/+page.js" @@ -0,0 +1,6 @@ +/** @type {import('@sveltejs/kit').Load} */ +export function load({ url }) { + return { + path: url.pathname + }; +} diff --git "a/packages/kit/test/apps/basics/src/routes/encoded/\350\213\227\346\235\241/+page.svelte" "b/packages/kit/test/apps/basics/src/routes/encoded/\350\213\227\346\235\241/+page.svelte" new file mode 100644 index 000000000000..3367a5736b86 --- /dev/null +++ "b/packages/kit/test/apps/basics/src/routes/encoded/\350\213\227\346\235\241/+page.svelte" @@ -0,0 +1,10 @@ + + +

static

+

{data.path}

+

{$page.url.pathname}

diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-input/sha256.js b/packages/kit/test/apps/basics/src/routes/endpoint-input/sha256/+server.js similarity index 88% rename from packages/kit/test/apps/basics/src/routes/endpoint-input/sha256.js rename to packages/kit/test/apps/basics/src/routes/endpoint-input/sha256/+server.js index 5f8f7080a83e..c80499aab343 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-input/sha256.js +++ b/packages/kit/test/apps/basics/src/routes/endpoint-input/sha256/+server.js @@ -12,7 +12,5 @@ export async function PUT({ request }) { await new Promise((r) => setTimeout(r, 10)); } - return { - body: hash.digest('base64url') - }; + return new Response(hash.digest('base64url')); } diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/body/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/body/+server.js new file mode 100644 index 000000000000..fca0f0544016 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/body/+server.js @@ -0,0 +1,6 @@ +/** @type {import('@sveltejs/kit').RequestHandler} */ +export function GET() { + return new Response(JSON.stringify({}), { + headers: { 'content-type': 'application/json; charset=utf-8' } + }); +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.json.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/empty/+server.js similarity index 70% rename from packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.json.js rename to packages/kit/test/apps/basics/src/routes/endpoint-output/empty/+server.js index 6b68f98797af..1903715676a7 100644 --- a/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.json.js +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/empty/+server.js @@ -1,6 +1,4 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET() { - return { - status: 555 - }; + return new Response(undefined); } diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/fetched.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/fetched/+server.js similarity index 60% rename from packages/kit/test/apps/basics/src/routes/endpoint-output/fetched.js rename to packages/kit/test/apps/basics/src/routes/endpoint-output/fetched/+server.js index 4ad2c1f8f8e1..b7420f5d170d 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/fetched.js +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/fetched/+server.js @@ -1,8 +1,7 @@ export function GET() { - return { + return new Response('ok', { headers: { 'x-foo': 'bar' - }, - body: 'ok' - }; + } + }); } diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/headers-object.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/headers-object/+server.js similarity index 76% rename from packages/kit/test/apps/basics/src/routes/endpoint-output/headers-object.js rename to packages/kit/test/apps/basics/src/routes/endpoint-output/headers-object/+server.js index ea65d4ae596b..2ec1fdd9e837 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/headers-object.js +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/headers-object/+server.js @@ -1,8 +1,8 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET() { - return { + return new Response(undefined, { headers: new Headers({ 'X-Foo': 'bar' }) - }; + }); } diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/headers.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/headers/+server.js similarity index 76% rename from packages/kit/test/apps/basics/src/routes/endpoint-output/headers.js rename to packages/kit/test/apps/basics/src/routes/endpoint-output/headers/+server.js index 720f4a4a49e3..7a2094895349 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/headers.js +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/headers/+server.js @@ -1,8 +1,8 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET() { - return { + return new Response(undefined, { headers: { 'Set-Cookie': 'foo=bar' } - }; + }); } diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/empty.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/null/+server.js similarity index 74% rename from packages/kit/test/apps/basics/src/routes/endpoint-output/empty.js rename to packages/kit/test/apps/basics/src/routes/endpoint-output/null/+server.js index b177850718ad..0aeea43270aa 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/empty.js +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/null/+server.js @@ -1,4 +1,4 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET() { - return {}; + return new Response(null); } diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/proxy.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/proxy/+server.js similarity index 100% rename from packages/kit/test/apps/basics/src/routes/endpoint-output/proxy.js rename to packages/kit/test/apps/basics/src/routes/endpoint-output/proxy/+server.js diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/simple.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/simple.js deleted file mode 100644 index 863b891d5c88..000000000000 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/simple.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - answer: 42 - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/simple/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/simple/+server.js new file mode 100644 index 000000000000..67ed4c3a73cf --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/simple/+server.js @@ -0,0 +1,8 @@ +export function GET() { + return new Response( + JSON.stringify({ + answer: 42 + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/stream-throw-error.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/stream-throw-error/+server.js similarity index 50% rename from packages/kit/test/apps/basics/src/routes/endpoint-output/stream-throw-error.js rename to packages/kit/test/apps/basics/src/routes/endpoint-output/stream-throw-error/+server.js index 72b52747a235..02c0024e61da 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/stream-throw-error.js +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/stream-throw-error/+server.js @@ -1,13 +1,15 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET() { - return { - headers: { - 'content-type': 'application/octet-stream' - }, - body: new ReadableStream({ + return new Response( + new ReadableStream({ pull() { throw Error('simulate error'); } - }) - }; + }), + { + headers: { + 'content-type': 'application/octet-stream' + } + } + ); } diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/stream-typeerror.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/stream-typeerror/+server.js similarity index 66% rename from packages/kit/test/apps/basics/src/routes/endpoint-output/stream-typeerror.js rename to packages/kit/test/apps/basics/src/routes/endpoint-output/stream-typeerror/+server.js index 0c87638fc796..8b6c7e5f32ad 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/stream-typeerror.js +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/stream-typeerror/+server.js @@ -5,14 +5,11 @@ export function GET({ url }) { if (url.searchParams.has('what')) { const body = errorName; errorName = null; - return { body }; + return new Response(body); } - return { - headers: { - 'content-type': 'application/octet-stream' - }, - body: new ReadableStream({ + return new Response( + new ReadableStream({ pull(controller) { controller.enqueue(42); }, @@ -20,6 +17,11 @@ export function GET({ url }) { cancel(reason) { errorName = reason?.name; } - }) - }; + }), + { + headers: { + 'content-type': 'application/octet-stream' + } + } + ); } diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/stream.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/stream/+server.js similarity index 81% rename from packages/kit/test/apps/basics/src/routes/endpoint-output/stream.js rename to packages/kit/test/apps/basics/src/routes/endpoint-output/stream/+server.js index 42d4fe0ac415..593d1b9a1253 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/stream.js +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/stream/+server.js @@ -7,12 +7,8 @@ export function GET() { let length = 0; - return { - headers: { - 'content-type': 'application/octet-stream', - digest: `sha-256=${digest}` - }, - body: new ReadableStream( + return new Response( + new ReadableStream( { pull(controller) { const offset = data.byteOffset + length; @@ -31,6 +27,12 @@ export function GET() { } }, { highWaterMark: 1024 * 16 } - ) - }; + ), + { + headers: { + 'content-type': 'application/octet-stream', + digest: `sha-256=${digest}` + } + } + ); } diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-bytes.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-bytes/+server.js similarity index 68% rename from packages/kit/test/apps/basics/src/routes/endpoint-output/xml-bytes.js rename to packages/kit/test/apps/basics/src/routes/endpoint-output/xml-bytes/+server.js index 8ccad28bf55a..8f2a80aa46ce 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-bytes.js +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-bytes/+server.js @@ -1,9 +1,8 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export const GET = () => { const body = ''; - return { - status: 200, + return new Response(new TextEncoder().encode(body), { headers: { 'content-type': 'application/xml' }, - body: new TextEncoder().encode(body) - }; + status: 200 + }); }; diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-text.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-text/+server.js similarity index 53% rename from packages/kit/test/apps/basics/src/routes/endpoint-output/xml-text.js rename to packages/kit/test/apps/basics/src/routes/endpoint-output/xml-text/+server.js index 6da5b073d57f..5123674d66cf 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-text.js +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-text/+server.js @@ -1,5 +1,5 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export const GET = () => { const body = ''; - return { status: 200, headers: { 'content-type': 'application/xml' }, body }; + return new Response(body, { headers: { 'content-type': 'application/xml' }, status: 200 }); }; diff --git a/packages/kit/test/apps/basics/src/routes/env/index.js b/packages/kit/test/apps/basics/src/routes/env/+page.server.js similarity index 65% rename from packages/kit/test/apps/basics/src/routes/env/index.js rename to packages/kit/test/apps/basics/src/routes/env/+page.server.js index 968b678a922d..91d83db35bc1 100644 --- a/packages/kit/test/apps/basics/src/routes/env/index.js +++ b/packages/kit/test/apps/basics/src/routes/env/+page.server.js @@ -3,9 +3,7 @@ import { env } from '$env/dynamic/private'; export function GET() { return { - body: { - PRIVATE_STATIC, - PRIVATE_DYNAMIC: env.PRIVATE_DYNAMIC - } + PRIVATE_STATIC, + PRIVATE_DYNAMIC: env.PRIVATE_DYNAMIC }; } diff --git a/packages/kit/test/apps/basics/src/routes/env/index.svelte b/packages/kit/test/apps/basics/src/routes/env/+page.svelte similarity index 51% rename from packages/kit/test/apps/basics/src/routes/env/index.svelte rename to packages/kit/test/apps/basics/src/routes/env/+page.svelte index 4788b13e363f..e4e3a1259b3c 100644 --- a/packages/kit/test/apps/basics/src/routes/env/index.svelte +++ b/packages/kit/test/apps/basics/src/routes/env/+page.svelte @@ -2,15 +2,12 @@ import { PUBLIC_STATIC } from '$env/static/public'; import { env } from '$env/dynamic/public'; - /** @type {string} */ - export let PRIVATE_STATIC; - - /** @type {string} */ - export let PRIVATE_DYNAMIC; + /** @type {import('./$types').Data} */ + export let data; -

PRIVATE_STATIC: {PRIVATE_STATIC}

-

PRIVATE_DYNAMIC: {PRIVATE_DYNAMIC}

+

PRIVATE_STATIC: {data.PRIVATE_STATIC}

+

PRIVATE_DYNAMIC: {data.PRIVATE_DYNAMIC}

PUBLIC_STATIC: {PUBLIC_STATIC}

PUBLIC_DYNAMIC: {env.PUBLIC_DYNAMIC}

diff --git a/packages/kit/test/apps/basics/src/routes/errors/clientside.svelte b/packages/kit/test/apps/basics/src/routes/errors/clientside/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/clientside.svelte rename to packages/kit/test/apps/basics/src/routes/errors/clientside/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/null.js b/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.json/+server.js similarity index 61% rename from packages/kit/test/apps/basics/src/routes/endpoint-output/null.js rename to packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.json/+server.js index 946c2a7b0918..e0c497e7fbfb 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/null.js +++ b/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.json/+server.js @@ -1,4 +1,4 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET() { - return { body: null }; + return new Response(undefined, { status: 555 }); } diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.svelte b/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.svelte deleted file mode 100644 index e3fad4dc5847..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - -

this text should not appear

diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.js b/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.js new file mode 100644 index 000000000000..611689855dcd --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.js @@ -0,0 +1,11 @@ +import { error } from '@sveltejs/kit/data'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/errors/endpoint-not-ok.json'); + if (res.ok) { + return await res.json(); + } else { + throw error(res.status, new Error(res.statusText)); + } +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok.svelte b/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.svelte similarity index 97% rename from packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok.svelte rename to packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.svelte index 3a5a8ea8369a..5480d57ef12c 100644 --- a/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok.svelte +++ b/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.svelte @@ -1,2 +1 @@ -

this text should not appear

diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok.js b/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok.js deleted file mode 100644 index 6b68f98797af..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok.js +++ /dev/null @@ -1,6 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET() { - return { - status: 555 - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/body.js b/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok/+page.server.js similarity index 51% rename from packages/kit/test/apps/basics/src/routes/endpoint-output/body.js rename to packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok/+page.server.js index 86762eec3899..221d5acaf782 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/body.js +++ b/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok/+page.server.js @@ -1,4 +1,6 @@ +import { error } from '@sveltejs/kit/data'; + /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET() { - return { body: {} }; + throw error(555, undefined); } diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow.svelte b/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok/+page.svelte similarity index 97% rename from packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow.svelte rename to packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok/+page.svelte index 3a5a8ea8369a..5480d57ef12c 100644 --- a/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow.svelte +++ b/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow-not-ok/+page.svelte @@ -1,2 +1 @@ -

this text should not appear

diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow.js b/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow/+page.server.js similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow.js rename to packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow/+page.server.js diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow/+page.svelte new file mode 100644 index 000000000000..5480d57ef12c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/endpoint-shadow/+page.svelte @@ -0,0 +1 @@ +

this text should not appear

diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint.json.js b/packages/kit/test/apps/basics/src/routes/errors/endpoint.json/+server.js similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/endpoint.json.js rename to packages/kit/test/apps/basics/src/routes/errors/endpoint.json/+server.js diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint.svelte b/packages/kit/test/apps/basics/src/routes/errors/endpoint.svelte deleted file mode 100644 index 948899a682a3..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/endpoint.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - -

this text should not appear

diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint/+page.js b/packages/kit/test/apps/basics/src/routes/errors/endpoint/+page.js new file mode 100644 index 000000000000..93c0349e864e --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/endpoint/+page.js @@ -0,0 +1,11 @@ +import { error } from '@sveltejs/kit/data'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/errors/endpoint.json'); + if (res.ok) { + return await res.json(); + } else { + throw error(res.status, new Error(res.statusText)); + } +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/endpoint/+page.svelte new file mode 100644 index 000000000000..5480d57ef12c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/endpoint/+page.svelte @@ -0,0 +1 @@ +

this text should not appear

diff --git a/packages/kit/test/apps/basics/src/routes/errors/error-in-handle.svelte b/packages/kit/test/apps/basics/src/routes/errors/error-in-handle/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/error-in-handle.svelte rename to packages/kit/test/apps/basics/src/routes/errors/error-in-handle/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/errors/error-in-layout/index.svelte b/packages/kit/test/apps/basics/src/routes/errors/error-in-layout/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/error-in-layout/index.svelte rename to packages/kit/test/apps/basics/src/routes/errors/error-in-layout/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/errors/init-error-endpoint.js b/packages/kit/test/apps/basics/src/routes/errors/init-error-endpoint.js deleted file mode 100644 index 04226d63f39c..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/init-error-endpoint.js +++ /dev/null @@ -1,10 +0,0 @@ -// @ts-expect-error -thisvariableisnotdefined; - -export function GET() { - return { - body: { - answer: 42 - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/errors/init-error-endpoint/+server.js b/packages/kit/test/apps/basics/src/routes/errors/init-error-endpoint/+server.js new file mode 100644 index 000000000000..c50e5183c248 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/init-error-endpoint/+server.js @@ -0,0 +1,11 @@ +// @ts-expect-error +thisvariableisnotdefined; + +export function GET() { + return new Response( + JSON.stringify({ + answer: 42 + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/invalid-route-response.js b/packages/kit/test/apps/basics/src/routes/errors/invalid-route-response/+server.js similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/invalid-route-response.js rename to packages/kit/test/apps/basics/src/routes/errors/invalid-route-response/+server.js diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-client.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-client.svelte deleted file mode 100644 index c56e0bb9b622..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/load-client.svelte +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-client/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-client/+page.js new file mode 100644 index 000000000000..30db34ceae24 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-client/+page.js @@ -0,0 +1,10 @@ +import { browser } from '$app/env'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + if (browser) { + throw new Error('Crashing now'); + } + + return {}; +} diff --git a/packages/kit/test/apps/basics/src/routes/transform-page-chunk/index.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-client/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/transform-page-chunk/index.svelte rename to packages/kit/test/apps/basics/src/routes/errors/load-client/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-client.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-client.svelte deleted file mode 100644 index 32ea0866cdb5..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/load-error-client.svelte +++ /dev/null @@ -1,10 +0,0 @@ - diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-client/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-error-client/+page.js new file mode 100644 index 000000000000..76189c6f195b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-error-client/+page.js @@ -0,0 +1,10 @@ +import { error } from '@sveltejs/kit/data'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + if (typeof window !== 'undefined') { + throw error(555, new Error('Not found')); + } + + return {}; +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-client/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-client/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-client.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-client.svelte deleted file mode 100644 index 5c030098054b..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-client.svelte +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-client/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-client/+page.js new file mode 100644 index 000000000000..fa7e53ddf119 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-client/+page.js @@ -0,0 +1,12 @@ +import { error } from '@sveltejs/kit/data'; +import { browser } from '$app/env'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + if (browser) { + // @ts-expect-error - given value expected to throw + throw error(555, {}); + } + + return {}; +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-client/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-client/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server.svelte deleted file mode 100644 index e5e75921dd04..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server.svelte +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.js new file mode 100644 index 000000000000..4d4b2193df5c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.js @@ -0,0 +1,7 @@ +import { error } from '@sveltejs/kit/data'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + // @ts-expect-error - given value expected to throw + throw error(555, {}); +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-server.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-server.svelte deleted file mode 100644 index 9e0a86b05c58..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/load-error-server.svelte +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-server/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-error-server/+page.js new file mode 100644 index 000000000000..37ba2e2289ac --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-error-server/+page.js @@ -0,0 +1,6 @@ +import { error } from '@sveltejs/kit/data'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + throw error(555, new Error('Not found')); +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-server/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-server/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-string-client.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-string-client.svelte deleted file mode 100644 index 9626ed6433ce..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/load-error-string-client.svelte +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-string-client/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-error-string-client/+page.js new file mode 100644 index 000000000000..e7d95c4518ff --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-error-string-client/+page.js @@ -0,0 +1,9 @@ +import { error } from '@sveltejs/kit/data'; + +export async function load() { + if (typeof window !== 'undefined') { + throw error(555, 'Not found'); + } + + return {}; +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-string-client/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-string-client/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-string-server.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-string-server.svelte deleted file mode 100644 index 7529e27b3efe..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/load-error-string-server.svelte +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-string-server/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-error-string-server/+page.js new file mode 100644 index 000000000000..dfd3c257edec --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-error-string-server/+page.js @@ -0,0 +1,6 @@ +import { error } from '@sveltejs/kit/data'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + throw error(555, 'Not found'); +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-string-server/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-string-server/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-server.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-server.svelte deleted file mode 100644 index de29844f579b..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/load-server.svelte +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-server/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-server/+page.js new file mode 100644 index 000000000000..0b7042387d7f --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-server/+page.js @@ -0,0 +1,4 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + throw new Error('Crashing now'); +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-server/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-server/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-client.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-client.svelte deleted file mode 100644 index d4d04ba66b08..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-client.svelte +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-client/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-client/+page.js new file mode 100644 index 000000000000..04d0af4694e5 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-client/+page.js @@ -0,0 +1,8 @@ +import { error } from '@sveltejs/kit/data'; + +export async function load() { + if (typeof window !== 'undefined') { + throw error(401, undefined); + } + return {}; +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-client/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-client/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server.svelte deleted file mode 100644 index 6411f62eae8c..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server.svelte +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.js new file mode 100644 index 000000000000..5fbb4814ed7a --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.js @@ -0,0 +1,6 @@ +import { error } from '@sveltejs/kit/data'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + throw error(401, undefined); +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/errors/module-scope-client.svelte b/packages/kit/test/apps/basics/src/routes/errors/module-scope-client/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/module-scope-client.svelte rename to packages/kit/test/apps/basics/src/routes/errors/module-scope-client/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/errors/module-scope-server.svelte b/packages/kit/test/apps/basics/src/routes/errors/module-scope-server/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/module-scope-server.svelte rename to packages/kit/test/apps/basics/src/routes/errors/module-scope-server/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/+error.svelte b/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/+error.svelte new file mode 100644 index 000000000000..88c8431073f9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/+error.svelte @@ -0,0 +1,16 @@ + + +

Nested error page

+

status: {$page.status}

+

error.message: {$page.error && $page.error.message}

+

answer: {answer}

+ + diff --git a/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/+page.svelte new file mode 100644 index 000000000000..1a5328b38a78 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/+page.svelte @@ -0,0 +1 @@ +nope diff --git a/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/__error.svelte b/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/__error.svelte deleted file mode 100644 index cf9f99bd10c2..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/__error.svelte +++ /dev/null @@ -1,34 +0,0 @@ - - - - -

Nested error page

-

status: {status}

-

error.message: {error && error.message}

-

answer: {answer}

- - diff --git a/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/index.svelte b/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/index.svelte deleted file mode 100644 index cab115c70cae..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/index.svelte +++ /dev/null @@ -1 +0,0 @@ -nope \ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/nope.svelte b/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/nope.svelte deleted file mode 100644 index 5b579b81f460..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/nope.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - -

should not see this

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/nope/+page.js b/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/nope/+page.js new file mode 100644 index 000000000000..ba6bb3928f9f --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/nope/+page.js @@ -0,0 +1,3 @@ +export async function load() { + throw new Error('nope'); +} diff --git a/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/nope/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/nope/+page.svelte new file mode 100644 index 000000000000..c9ce7c1c8743 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/nested-error-page/nope/+page.svelte @@ -0,0 +1 @@ +

should not see this

diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/__error.svelte b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/+error.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/page-endpoint/__error.svelte rename to packages/kit/test/apps/basics/src/routes/errors/page-endpoint/+error.svelte diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/index.svelte b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/page-endpoint/index.svelte rename to packages/kit/test/apps/basics/src/routes/errors/page-endpoint/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit.js b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit.js deleted file mode 100644 index 00d7e8f697c0..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit.js +++ /dev/null @@ -1,6 +0,0 @@ -import { FancyError } from './_shared.js'; - -export const GET = () => ({ - status: 400, - body: new FancyError('oops') -}); diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit/+page.server.js b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit/+page.server.js new file mode 100644 index 000000000000..89c608c892d0 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit/+page.server.js @@ -0,0 +1,6 @@ +import { error } from '@sveltejs/kit/data'; +import { FancyError } from '../_shared.js'; + +export const GET = () => { + throw error(400, new FancyError('oops')); +}; diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit.svelte b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit.svelte rename to packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-implicit.js b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-implicit/+page.server.js similarity index 58% rename from packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-implicit.js rename to packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-implicit/+page.server.js index 48a286fccd5f..9f5973ec55e1 100644 --- a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-implicit.js +++ b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-implicit/+page.server.js @@ -1,4 +1,4 @@ -import { FancyError } from './_shared.js'; +import { FancyError } from '../_shared.js'; export const GET = () => { throw new FancyError('oops'); diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-implicit.svelte b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-implicit/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-implicit.svelte rename to packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-implicit/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit.js b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit.js deleted file mode 100644 index ce909280a54a..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit.js +++ /dev/null @@ -1,6 +0,0 @@ -import { FancyError } from './_shared.js'; - -export const POST = () => ({ - status: 400, - body: new FancyError('oops') -}); diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit/+page.server.js b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit/+page.server.js new file mode 100644 index 000000000000..757e04de165b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit/+page.server.js @@ -0,0 +1,6 @@ +import { error } from '@sveltejs/kit/data'; +import { FancyError } from '../_shared.js'; + +export const POST = () => { + throw error(400, new FancyError('oops')); +}; diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit.svelte b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit.svelte rename to packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-implicit.js b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-implicit/+page.server.js similarity index 58% rename from packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-implicit.js rename to packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-implicit/+page.server.js index 6b312fa5bc00..11d6342a446f 100644 --- a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-implicit.js +++ b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-implicit/+page.server.js @@ -1,4 +1,4 @@ -import { FancyError } from './_shared.js'; +import { FancyError } from '../_shared.js'; export const POST = () => { throw new FancyError('oops'); diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-implicit.svelte b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-implicit/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-implicit.svelte rename to packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-implicit/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/errors/serverside.svelte b/packages/kit/test/apps/basics/src/routes/errors/serverside/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/serverside.svelte rename to packages/kit/test/apps/basics/src/routes/errors/serverside/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/errors/stack-trace/index.svelte b/packages/kit/test/apps/basics/src/routes/errors/stack-trace/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/stack-trace/index.svelte rename to packages/kit/test/apps/basics/src/routes/errors/stack-trace/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/etag/binary.js b/packages/kit/test/apps/basics/src/routes/etag/binary/+server.js similarity index 68% rename from packages/kit/test/apps/basics/src/routes/etag/binary.js rename to packages/kit/test/apps/basics/src/routes/etag/binary/+server.js index 0372de2cf649..923f32aab310 100644 --- a/packages/kit/test/apps/basics/src/routes/etag/binary.js +++ b/packages/kit/test/apps/basics/src/routes/etag/binary/+server.js @@ -1,9 +1,8 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET() { - return { + return new Response(new Uint8Array([1, 2, 3, 4, 5]), { headers: { 'content-type': 'application/octet-stream' - }, - body: new Uint8Array([1, 2, 3, 4, 5]) - }; + } + }); } diff --git a/packages/kit/test/apps/basics/src/routes/etag/custom.js b/packages/kit/test/apps/basics/src/routes/etag/custom.js deleted file mode 100644 index 64165ce521b1..000000000000 --- a/packages/kit/test/apps/basics/src/routes/etag/custom.js +++ /dev/null @@ -1,10 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET({ request }) { - if (request.headers.get('if-none-match') === '@1234@') return { status: 304 }; - return { - body: `${Math.random()}`, - headers: { - etag: '@1234@' - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/etag/custom/+server.js b/packages/kit/test/apps/basics/src/routes/etag/custom/+server.js new file mode 100644 index 000000000000..fd76685d0af0 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/etag/custom/+server.js @@ -0,0 +1,11 @@ +/** @type {import('@sveltejs/kit').RequestHandler} */ +export function GET({ request }) { + if (request.headers.get('if-none-match') === '@1234@') + return new Response(undefined, { status: 304 }); + + return new Response(`${Math.random()}`, { + headers: { + etag: '@1234@' + } + }); +} diff --git a/packages/kit/test/apps/basics/src/routes/etag/text.js b/packages/kit/test/apps/basics/src/routes/etag/text/+server.js similarity index 74% rename from packages/kit/test/apps/basics/src/routes/etag/text.js rename to packages/kit/test/apps/basics/src/routes/etag/text/+server.js index b29c8b5e6150..e95e55e0919d 100644 --- a/packages/kit/test/apps/basics/src/routes/etag/text.js +++ b/packages/kit/test/apps/basics/src/routes/etag/text/+server.js @@ -1,9 +1,8 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET() { - return { - body: 'some text', + return new Response('some text', { headers: { expires: 'yesterday' } - }; + }); } diff --git a/packages/kit/test/apps/basics/src/routes/favicon.ico.js b/packages/kit/test/apps/basics/src/routes/favicon.ico.js deleted file mode 100644 index c2db1c27cb53..000000000000 --- a/packages/kit/test/apps/basics/src/routes/favicon.ico.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - surprise: 'lol' - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/favicon.ico/+server.js b/packages/kit/test/apps/basics/src/routes/favicon.ico/+server.js new file mode 100644 index 000000000000..daba57322d98 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/favicon.ico/+server.js @@ -0,0 +1,8 @@ +export function GET() { + return new Response( + JSON.stringify({ + surprise: 'lol' + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/headers/index.svelte b/packages/kit/test/apps/basics/src/routes/headers/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/headers/index.svelte rename to packages/kit/test/apps/basics/src/routes/headers/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/headers/class.svelte b/packages/kit/test/apps/basics/src/routes/headers/class.svelte deleted file mode 100644 index 24db0bb48ea5..000000000000 --- a/packages/kit/test/apps/basics/src/routes/headers/class.svelte +++ /dev/null @@ -1,23 +0,0 @@ - - - - -

{foo}

diff --git a/packages/kit/test/apps/basics/src/routes/headers/class/+page.js b/packages/kit/test/apps/basics/src/routes/headers/class/+page.js new file mode 100644 index 000000000000..259243c2484c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/headers/class/+page.js @@ -0,0 +1,11 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/headers/echo', { + headers: new Headers({ foo: 'bar' }) + }); + + const { foo } = await res.json(); + return { + foo + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/headers/class/+page.svelte b/packages/kit/test/apps/basics/src/routes/headers/class/+page.svelte new file mode 100644 index 000000000000..c4cfc5a00b38 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/headers/class/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.foo}

diff --git a/packages/kit/test/apps/basics/src/routes/headers/echo.js b/packages/kit/test/apps/basics/src/routes/headers/echo/+server.js similarity index 68% rename from packages/kit/test/apps/basics/src/routes/headers/echo.js rename to packages/kit/test/apps/basics/src/routes/headers/echo/+server.js index e29e67125739..e5edbbf66771 100644 --- a/packages/kit/test/apps/basics/src/routes/headers/echo.js +++ b/packages/kit/test/apps/basics/src/routes/headers/echo/+server.js @@ -8,7 +8,7 @@ export function GET({ request }) { } }); - return { - body: headers - }; + return new Response(JSON.stringify(headers), { + headers: { 'content-type': 'application/json; charset=utf-8' } + }); } diff --git a/packages/kit/test/apps/basics/src/routes/iframes/index.svelte b/packages/kit/test/apps/basics/src/routes/iframes/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/iframes/index.svelte rename to packages/kit/test/apps/basics/src/routes/iframes/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/iframes/nested/child.svelte b/packages/kit/test/apps/basics/src/routes/iframes/nested/child/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/iframes/nested/child.svelte rename to packages/kit/test/apps/basics/src/routes/iframes/nested/child/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/iframes/nested/parent.svelte b/packages/kit/test/apps/basics/src/routes/iframes/nested/parent/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/iframes/nested/parent.svelte rename to packages/kit/test/apps/basics/src/routes/iframes/nested/parent/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/imports/+page.svelte b/packages/kit/test/apps/basics/src/routes/imports/+page.svelte new file mode 100644 index 000000000000..f09d461a28b8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/imports/+page.svelte @@ -0,0 +1 @@ +markdown diff --git a/packages/kit/test/apps/basics/src/routes/imports/index.svelte b/packages/kit/test/apps/basics/src/routes/imports/index.svelte deleted file mode 100644 index 86041a8afd43..000000000000 --- a/packages/kit/test/apps/basics/src/routes/imports/index.svelte +++ /dev/null @@ -1 +0,0 @@ -markdown \ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/imports/markdown.svelte b/packages/kit/test/apps/basics/src/routes/imports/markdown/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/imports/markdown.svelte rename to packages/kit/test/apps/basics/src/routes/imports/markdown/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/index.svelte b/packages/kit/test/apps/basics/src/routes/index.svelte deleted file mode 100644 index c0d95fa284ae..000000000000 --- a/packages/kit/test/apps/basics/src/routes/index.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - - - -

the answer is {answer}

diff --git a/packages/kit/test/apps/basics/src/routes/keepfocus/index.svelte b/packages/kit/test/apps/basics/src/routes/keepfocus/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/keepfocus/index.svelte rename to packages/kit/test/apps/basics/src/routes/keepfocus/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/load/+page.js b/packages/kit/test/apps/basics/src/routes/load/+page.js new file mode 100644 index 000000000000..069608981910 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/+page.js @@ -0,0 +1,9 @@ +import { browser } from '$app/env'; + +/** @type {import('@sveltejs/kit').Load} */ +export function load(pageContext) { + if (browser) { + window.pageContext = pageContext; + } + return { foo: 'bar' }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/index.svelte b/packages/kit/test/apps/basics/src/routes/load/+page.svelte similarity index 53% rename from packages/kit/test/apps/basics/src/routes/load/index.svelte rename to packages/kit/test/apps/basics/src/routes/load/+page.svelte index 181c11684ed2..b6bba199577f 100644 --- a/packages/kit/test/apps/basics/src/routes/load/index.svelte +++ b/packages/kit/test/apps/basics/src/routes/load/+page.svelte @@ -1,24 +1,9 @@ - - -

bar == {foo}?

+

bar == {data.foo}?

fetch request fetch relative diff --git a/packages/kit/test/apps/basics/src/routes/load/[dynamic].json.js b/packages/kit/test/apps/basics/src/routes/load/[dynamic].json.js deleted file mode 100644 index 7a2cf9a482d8..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/[dynamic].json.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET({ params }) { - return { - body: { - name: params.dynamic - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/load/[dynamic].json/+server.js b/packages/kit/test/apps/basics/src/routes/load/[dynamic].json/+server.js new file mode 100644 index 000000000000..e13138cf3e43 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/[dynamic].json/+server.js @@ -0,0 +1,9 @@ +/** @type {import('@sveltejs/kit').RequestHandler} */ +export function GET({ params }) { + return new Response( + JSON.stringify({ + name: params.dynamic + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/load/[dynamic].svelte b/packages/kit/test/apps/basics/src/routes/load/[dynamic].svelte deleted file mode 100644 index fb4e204f5e70..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/[dynamic].svelte +++ /dev/null @@ -1,16 +0,0 @@ - - - - -

{name}

diff --git a/packages/kit/test/apps/basics/src/routes/load/[dynamic]/+page.js b/packages/kit/test/apps/basics/src/routes/load/[dynamic]/+page.js new file mode 100644 index 000000000000..315414aeaaa9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/[dynamic]/+page.js @@ -0,0 +1,5 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ params, fetch }) { + const res = await fetch(`/load/${params.dynamic}.json`); + return await res.json(); +} diff --git a/packages/kit/test/apps/basics/src/routes/load/[dynamic]/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/[dynamic]/+page.svelte new file mode 100644 index 000000000000..22703a669c85 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/[dynamic]/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.name}

diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.js b/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.js new file mode 100644 index 000000000000..aca9a4e51748 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.js @@ -0,0 +1,21 @@ +throw new Error("@migration task: Update load function (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292693)"); + + +let count = 0; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/load/change-detection/data.json'); + const { type } = await res.json(); + + count += 1; + + return { + cache: { maxage: 5 }, + props: { + type, + loads: count + }, + dependencies: ['custom:change-detection-layout'] + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.svelte new file mode 100644 index 000000000000..bba96cab4c5c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.svelte @@ -0,0 +1,9 @@ + + +

{data.type} loads: {data.loads}

+ diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/__layout.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/__layout.svelte deleted file mode 100644 index 4ff23edb4de9..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/change-detection/__layout.svelte +++ /dev/null @@ -1,31 +0,0 @@ - - - - -

{type} loads: {loads}

- diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/data.json.js b/packages/kit/test/apps/basics/src/routes/load/change-detection/data.json.js deleted file mode 100644 index cf49417693de..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/change-detection/data.json.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - type: 'layout' - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/data.json/+server.js b/packages/kit/test/apps/basics/src/routes/load/change-detection/data.json/+server.js new file mode 100644 index 000000000000..d0ad3aac6be1 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/data.json/+server.js @@ -0,0 +1,8 @@ +export function GET() { + return new Response( + JSON.stringify({ + type: 'layout' + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x].svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x].svelte deleted file mode 100644 index 83f281b3615d..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x].svelte +++ /dev/null @@ -1,38 +0,0 @@ - - - - -

x: {x}: {loads}

- - diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x]/+page.js b/packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x]/+page.js new file mode 100644 index 000000000000..7d29149e32cd --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x]/+page.js @@ -0,0 +1,19 @@ +import { browser } from '$app/env'; +import { invalidate } from '$app/navigation'; + +let count = 0; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ params, setHeaders }) { + if (browser) { + count += 1; + } + + setHeaders({ + 'cache-control': 'max-age=5' + }); + return { + x: params.x, + loads: count + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x]/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x]/+page.svelte new file mode 100644 index 000000000000..de148460dd42 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/one/[x]/+page.svelte @@ -0,0 +1,15 @@ + + +

x: {data.x}: {data.loads}

+ + diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused.svelte deleted file mode 100644 index 1189bedaff07..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused.svelte +++ /dev/null @@ -1,23 +0,0 @@ - - - - -

{count}

- diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.js b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.js new file mode 100644 index 000000000000..565755ef01e6 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.js @@ -0,0 +1,7 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + return { + // Needs to be an object, else Svelte will do by-value-comparison and skip rerender + obj: {} + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.svelte new file mode 100644 index 000000000000..c51a11d7d498 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.svelte @@ -0,0 +1,12 @@ + + +

{count}

+ diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used.svelte deleted file mode 100644 index a473de611056..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used.svelte +++ /dev/null @@ -1,24 +0,0 @@ - - - - -

{count}

- diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.js b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.js new file mode 100644 index 000000000000..181c710e1efa --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.js @@ -0,0 +1,8 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ session }) { + session; + return { + // Needs to be an object, else Svelte will do by-value-comparison and skip rerender + obj: {} + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.svelte new file mode 100644 index 000000000000..c51a11d7d498 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.svelte @@ -0,0 +1,12 @@ + + +

{count}

+ diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y].svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y].svelte deleted file mode 100644 index 7e451ced0bd4..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y].svelte +++ /dev/null @@ -1,26 +0,0 @@ - - - - -

y: {y}: {loads}

diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y]/+page.js b/packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y]/+page.js new file mode 100644 index 000000000000..044f6650e74c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y]/+page.js @@ -0,0 +1,14 @@ +let count = 0; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ params, setHeaders }) { + count += 1; + + setHeaders({ + 'cache-control': 'max-age=5' + }); + return { + y: params.y, + loads: count + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y]/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y]/+page.svelte new file mode 100644 index 000000000000..1262a8d94b3c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/two/[y]/+page.svelte @@ -0,0 +1,6 @@ + + +

y: {data.y}: {data.loads}

diff --git a/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/+page.js b/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/+page.js new file mode 100644 index 000000000000..f05fdec6a15c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/+page.js @@ -0,0 +1,5 @@ +export async function load() { + return { + Thing: (await import('./_/Thing.svelte')).default + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/+page.svelte new file mode 100644 index 000000000000..5aa56be5ef0e --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/+page.svelte @@ -0,0 +1,6 @@ + + + diff --git a/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/index.svelte b/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/index.svelte deleted file mode 100644 index 90167d792806..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/index.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed.json.js b/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed.json.js deleted file mode 100644 index cf73c2500f44..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed.json.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET(request) { - return { - body: { - name: request.locals.name - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed.json/+server.js b/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed.json/+server.js new file mode 100644 index 000000000000..a9f4b624dc79 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed.json/+server.js @@ -0,0 +1,9 @@ +/** @type {import('@sveltejs/kit').RequestHandler} */ +export function GET(request) { + return new Response( + JSON.stringify({ + name: request.locals.name + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed.svelte b/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed.svelte deleted file mode 100644 index 11350ea7200c..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - - - -

Hello {name}!

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed/+page.js b/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed/+page.js new file mode 100644 index 000000000000..b806f33bc33a --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed/+page.js @@ -0,0 +1,11 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/load/fetch-credentialed.json'); + + /** @type {any} */ + const { name } = await res.json(); + + return { + name + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed/+page.svelte new file mode 100644 index 000000000000..b153330aa744 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-credentialed/+page.svelte @@ -0,0 +1,6 @@ + + +

Hello {data.name}!

diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-headers.json.js b/packages/kit/test/apps/basics/src/routes/load/fetch-headers.json/+server.js similarity index 65% rename from packages/kit/test/apps/basics/src/routes/load/fetch-headers.json.js rename to packages/kit/test/apps/basics/src/routes/load/fetch-headers.json/+server.js index 135aa32b2677..462aa0b9bcd2 100644 --- a/packages/kit/test/apps/basics/src/routes/load/fetch-headers.json.js +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-headers.json/+server.js @@ -7,7 +7,7 @@ export function GET({ request }) { body[key] = value; }); - return { - body - }; + return new Response(JSON.stringify(body), { + headers: { 'content-type': 'application/json; charset=utf-8' } + }); } diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-headers.svelte b/packages/kit/test/apps/basics/src/routes/load/fetch-headers.svelte deleted file mode 100644 index 9cc8544c6215..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/fetch-headers.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - - - -
{json}
diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-headers/+page.js b/packages/kit/test/apps/basics/src/routes/load/fetch-headers/+page.js new file mode 100644 index 000000000000..65f31059ef45 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-headers/+page.js @@ -0,0 +1,8 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/load/fetch-headers.json'); + + return { + headers: await res.json() + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-headers/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/fetch-headers/+page.svelte new file mode 100644 index 000000000000..3d6cbfe282b1 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-headers/+page.svelte @@ -0,0 +1,14 @@ + + +
{json}
diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-relative.json.js b/packages/kit/test/apps/basics/src/routes/load/fetch-relative.json.js deleted file mode 100644 index f5d43f9b9df5..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/fetch-relative.json.js +++ /dev/null @@ -1,16 +0,0 @@ -export function GET() { - return { - body: { - answer: 42 - } - }; -} - -/** @type {import('@sveltejs/kit').RequestHandler} */ -export async function POST({ request }) { - return { - body: { - question: await request.text() - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-relative.json/+server.js b/packages/kit/test/apps/basics/src/routes/load/fetch-relative.json/+server.js new file mode 100644 index 000000000000..9a0ca0a47c66 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-relative.json/+server.js @@ -0,0 +1,18 @@ +export function GET() { + return new Response( + JSON.stringify({ + answer: 42 + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} + +/** @type {import('@sveltejs/kit').RequestHandler} */ +export async function POST({ request }) { + return new Response( + JSON.stringify({ + question: await request.text() + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-relative.svelte b/packages/kit/test/apps/basics/src/routes/load/fetch-relative.svelte deleted file mode 100644 index 4418226688cc..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/fetch-relative.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - - - -

the answer is {answer}

-

the question was {question}

diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-relative/+page.js b/packages/kit/test/apps/basics/src/routes/load/fetch-relative/+page.js new file mode 100644 index 000000000000..b010fe96432c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-relative/+page.js @@ -0,0 +1,7 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const get = await fetch('fetch-relative.json'); + const post = await fetch('fetch-relative.json', { method: 'post', body: '?' }); + + return { ...(await get.json()), ...(await post.json()) }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-relative/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/fetch-relative/+page.svelte new file mode 100644 index 000000000000..0dc51f657e36 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-relative/+page.svelte @@ -0,0 +1,6 @@ + + +

the answer is {data.answer}

+

the question was {data.question}

diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-request.json.js b/packages/kit/test/apps/basics/src/routes/load/fetch-request.json.js deleted file mode 100644 index 863b891d5c88..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/fetch-request.json.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - answer: 42 - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-request.json/+server.js b/packages/kit/test/apps/basics/src/routes/load/fetch-request.json/+server.js new file mode 100644 index 000000000000..67ed4c3a73cf --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-request.json/+server.js @@ -0,0 +1,8 @@ +export function GET() { + return new Response( + JSON.stringify({ + answer: 42 + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-request.svelte b/packages/kit/test/apps/basics/src/routes/load/fetch-request.svelte deleted file mode 100644 index 6f012d3afded..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/fetch-request.svelte +++ /dev/null @@ -1,25 +0,0 @@ - - - - -

the answer is {answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-request/+page.js b/packages/kit/test/apps/basics/src/routes/load/fetch-request/+page.js new file mode 100644 index 000000000000..5c13157f083e --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-request/+page.js @@ -0,0 +1,14 @@ +import { browser } from '$app/env'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const url = '/load/fetch-request.json'; + + // this is contrived, but saves us faffing about with node-fetch here + const resource = browser ? new Request(url) : url; + + const res = await fetch(resource); + const { answer } = await res.json(); + + return { answer }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-request/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/fetch-request/+page.svelte new file mode 100644 index 000000000000..7cbd09df0bf2 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-request/+page.svelte @@ -0,0 +1,6 @@ + + +

the answer is {data.answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/large-response/+page.js b/packages/kit/test/apps/basics/src/routes/load/large-response/+page.js new file mode 100644 index 000000000000..e20728bec89e --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/large-response/+page.js @@ -0,0 +1,9 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/load/large-response/text.txt'); + const text = await res.text(); + + return { + text + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/large-response/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/large-response/+page.svelte new file mode 100644 index 000000000000..69ee831ba1c6 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/large-response/+page.svelte @@ -0,0 +1,6 @@ + + +

text.length is {data.text.length}

diff --git a/packages/kit/test/apps/basics/src/routes/load/large-response/index.svelte b/packages/kit/test/apps/basics/src/routes/load/large-response/index.svelte deleted file mode 100644 index 20f6fff18c83..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/large-response/index.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - - - -

text.length is {text.length}

diff --git a/packages/kit/test/apps/basics/src/routes/load/large-response/text.txt.js b/packages/kit/test/apps/basics/src/routes/load/large-response/text.txt/+server.js similarity index 86% rename from packages/kit/test/apps/basics/src/routes/load/large-response/text.txt.js rename to packages/kit/test/apps/basics/src/routes/load/large-response/text.txt/+server.js index 5d195eebdcf4..73a92e6d039e 100644 --- a/packages/kit/test/apps/basics/src/routes/load/large-response/text.txt.js +++ b/packages/kit/test/apps/basics/src/routes/load/large-response/text.txt/+server.js @@ -9,8 +9,8 @@ for (let i = 0; i < chunk_size; i += 1) { export function GET() { let i = 0; - return { - body: new ReadableStream({ + return new Response( + new ReadableStream({ pull: (controller) => { if (i++ < chunk_count) { controller.enqueue(chunk); @@ -19,5 +19,5 @@ export function GET() { } } }) - }; + ); } diff --git a/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.js b/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.js new file mode 100644 index 000000000000..33cd8304ce77 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.js @@ -0,0 +1,8 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ session }) { + session; // not necessary, but prevents the argument from being marked as unused + return { + // Needs to be an object, else Svelte will do by-value-comparison and skip rerender + obj: {} + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.svelte b/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.svelte new file mode 100644 index 000000000000..105711a34c54 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.svelte @@ -0,0 +1,13 @@ + + +

{count}

+ + diff --git a/packages/kit/test/apps/basics/src/routes/load/layout-props/__layout.svelte b/packages/kit/test/apps/basics/src/routes/load/layout-props/__layout.svelte deleted file mode 100644 index 555061eead4b..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/layout-props/__layout.svelte +++ /dev/null @@ -1,26 +0,0 @@ - - - - -

{count}

- - diff --git a/packages/kit/test/apps/basics/src/routes/load/layout-props/a.svelte b/packages/kit/test/apps/basics/src/routes/load/layout-props/a/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/load/layout-props/a.svelte rename to packages/kit/test/apps/basics/src/routes/load/layout-props/a/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/load/layout-props/b.svelte b/packages/kit/test/apps/basics/src/routes/load/layout-props/b/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/load/layout-props/b.svelte rename to packages/kit/test/apps/basics/src/routes/load/layout-props/b/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/load/props/__layout.svelte b/packages/kit/test/apps/basics/src/routes/load/props/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/load/props/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/load/props/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/load/props/+page.js b/packages/kit/test/apps/basics/src/routes/load/props/+page.js new file mode 100644 index 000000000000..783428141e3b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/props/+page.js @@ -0,0 +1,4 @@ +export async function load() { + const data = 'Hello from Index!'; + return { data }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/props/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/props/+page.svelte new file mode 100644 index 000000000000..321c784766c8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/props/+page.svelte @@ -0,0 +1,7 @@ + + +

Index

+ +

Data: {data.data}

diff --git a/packages/kit/test/apps/basics/src/routes/load/props/about.svelte b/packages/kit/test/apps/basics/src/routes/load/props/about/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/load/props/about.svelte rename to packages/kit/test/apps/basics/src/routes/load/props/about/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/load/props/index.svelte b/packages/kit/test/apps/basics/src/routes/load/props/index.svelte deleted file mode 100644 index d45892aa3872..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/props/index.svelte +++ /dev/null @@ -1,14 +0,0 @@ - - - - -

Index

- -

Data: {data}

diff --git a/packages/kit/test/apps/basics/src/routes/load/raw-body.json.js b/packages/kit/test/apps/basics/src/routes/load/raw-body.json/+server.js similarity index 62% rename from packages/kit/test/apps/basics/src/routes/load/raw-body.json.js rename to packages/kit/test/apps/basics/src/routes/load/raw-body.json/+server.js index 4498099d6a66..44c69a985aa4 100644 --- a/packages/kit/test/apps/basics/src/routes/load/raw-body.json.js +++ b/packages/kit/test/apps/basics/src/routes/load/raw-body.json/+server.js @@ -3,10 +3,11 @@ export async function POST({ request }) { const text = await request.text(); const json = JSON.parse(text); - return { - body: { + return new Response( + JSON.stringify({ body: json, rawBody: text - } - }; + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); } diff --git a/packages/kit/test/apps/basics/src/routes/load/raw-body.svelte b/packages/kit/test/apps/basics/src/routes/load/raw-body.svelte deleted file mode 100644 index 07bc6279ee67..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/raw-body.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - - - -
{JSON.stringify(body)}
-
{rawBody}
\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/load/raw-body/+page.js b/packages/kit/test/apps/basics/src/routes/load/raw-body/+page.js new file mode 100644 index 000000000000..f6d3d5c7428c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/raw-body/+page.js @@ -0,0 +1,12 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/load/raw-body.json', { + method: 'POST', + headers: { + 'content-type': 'application/json' + }, + body: '{ "oddly" : { "formatted" : "json" } }' + }); + + return await res.json(); +} diff --git a/packages/kit/test/apps/basics/src/routes/load/raw-body/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/raw-body/+page.svelte new file mode 100644 index 000000000000..6340877bfb5d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/raw-body/+page.svelte @@ -0,0 +1,7 @@ + + +
{JSON.stringify(data.body)}
+
{data.rawBody}
diff --git a/packages/kit/test/apps/basics/src/routes/load/relay.json.js b/packages/kit/test/apps/basics/src/routes/load/relay.json/+server.js similarity index 58% rename from packages/kit/test/apps/basics/src/routes/load/relay.json.js rename to packages/kit/test/apps/basics/src/routes/load/relay.json/+server.js index 8eb052d61f5c..59f3170a162f 100644 --- a/packages/kit/test/apps/basics/src/routes/load/relay.json.js +++ b/packages/kit/test/apps/basics/src/routes/load/relay.json/+server.js @@ -1,8 +1,7 @@ export function GET() { - return { + return new Response(JSON.stringify('42'), { headers: { 'content-type': 'application/json' - }, - body: '42' - }; + } + }); } diff --git a/packages/kit/test/apps/basics/src/routes/load/relay.svelte b/packages/kit/test/apps/basics/src/routes/load/relay.svelte deleted file mode 100644 index 67979d6db666..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/relay.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - - -

{answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/relay/+page.js b/packages/kit/test/apps/basics/src/routes/load/relay/+page.js new file mode 100644 index 000000000000..f4b167830d9f --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/relay/+page.js @@ -0,0 +1,7 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/load/relay.json'); + return { + answer: await res.json() + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/relay/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/relay/+page.svelte new file mode 100644 index 000000000000..b198a09653c3 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/relay/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/serialization-post.json.js b/packages/kit/test/apps/basics/src/routes/load/serialization-post.json/+server.js similarity index 76% rename from packages/kit/test/apps/basics/src/routes/load/serialization-post.json.js rename to packages/kit/test/apps/basics/src/routes/load/serialization-post.json/+server.js index 413111fc5594..5b71d6927309 100644 --- a/packages/kit/test/apps/basics/src/routes/load/serialization-post.json.js +++ b/packages/kit/test/apps/basics/src/routes/load/serialization-post.json/+server.js @@ -1,8 +1,5 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export async function POST({ request }) { const body = await request.text(); - - return { - body: body.toUpperCase() - }; + return new Response(body.toUpperCase()); } diff --git a/packages/kit/test/apps/basics/src/routes/load/serialization-post.svelte b/packages/kit/test/apps/basics/src/routes/load/serialization-post.svelte deleted file mode 100644 index e4162fffafd7..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/serialization-post.svelte +++ /dev/null @@ -1,34 +0,0 @@ - - - - -

a: {a}

-

b: {b}

diff --git a/packages/kit/test/apps/basics/src/routes/load/serialization-post/+page.js b/packages/kit/test/apps/basics/src/routes/load/serialization-post/+page.js new file mode 100644 index 000000000000..d5d5704b7d0c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/serialization-post/+page.js @@ -0,0 +1,19 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + /** @param {string} body */ + async function post(body) { + const res = await fetch('/load/serialization-post.json', { + method: 'POST', + headers: { + 'content-type': 'text/plain' + }, + body + }); + + return await res.text(); + } + const a = await post('x'); + const b = await post('y'); + + return { a, b }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/serialization-post/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/serialization-post/+page.svelte new file mode 100644 index 000000000000..6f22dda23877 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/serialization-post/+page.svelte @@ -0,0 +1,7 @@ + + +

a: {data.a}

+

b: {data.b}

diff --git a/packages/kit/test/apps/basics/src/routes/load/serialization.json.js b/packages/kit/test/apps/basics/src/routes/load/serialization.json.js deleted file mode 100644 index 863b891d5c88..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/serialization.json.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - answer: 42 - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/load/serialization.json/+server.js b/packages/kit/test/apps/basics/src/routes/load/serialization.json/+server.js new file mode 100644 index 000000000000..67ed4c3a73cf --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/serialization.json/+server.js @@ -0,0 +1,8 @@ +export function GET() { + return new Response( + JSON.stringify({ + answer: 42 + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/load/serialization.svelte b/packages/kit/test/apps/basics/src/routes/load/serialization.svelte deleted file mode 100644 index 70c4284f5db6..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/serialization.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - - - -

{answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/serialization/+page.js b/packages/kit/test/apps/basics/src/routes/load/serialization/+page.js new file mode 100644 index 000000000000..6f10d05a7a2c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/serialization/+page.js @@ -0,0 +1,5 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/load/serialization.json'); + return await res.json(); +} diff --git a/packages/kit/test/apps/basics/src/routes/load/serialization/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/serialization/+page.svelte new file mode 100644 index 000000000000..b198a09653c3 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/serialization/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/server-fetch-request.svelte b/packages/kit/test/apps/basics/src/routes/load/server-fetch-request.svelte deleted file mode 100644 index c1f3661c5a56..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/server-fetch-request.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - - - -

the answer is {answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/server-fetch-request/+page.js b/packages/kit/test/apps/basics/src/routes/load/server-fetch-request/+page.js new file mode 100644 index 000000000000..8ea14e87c91d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/server-fetch-request/+page.js @@ -0,0 +1,8 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ url, fetch }) { + const href = `http://localhost:${url.searchParams.get('port')}/server-fetch-request.json`; + + const res = await fetch(href); + const { answer } = await res.json(); + return { answer }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/server-fetch-request/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/server-fetch-request/+page.svelte new file mode 100644 index 000000000000..7cbd09df0bf2 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/server-fetch-request/+page.svelte @@ -0,0 +1,6 @@ + + +

the answer is {data.answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/+page.js b/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/+page.js new file mode 100644 index 000000000000..5807c2f5fb55 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/+page.js @@ -0,0 +1,7 @@ +export async function load({ fetch, url }) { + await fetch(`/load/set-cookie-fetch/a.json${url.search}`); + const res = await fetch('/load/set-cookie-fetch/b.json'); + const { answer } = await res.json(); // need to read the response so it gets serialized + + return { answer }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/+page.svelte new file mode 100644 index 000000000000..7cbd09df0bf2 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/+page.svelte @@ -0,0 +1,6 @@ + + +

the answer is {data.answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/a.json.js b/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/a.json/+server.js similarity index 53% rename from packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/a.json.js rename to packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/a.json/+server.js index 8e6c7ffe5a14..88c07edae0db 100644 --- a/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/a.json.js +++ b/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/a.json/+server.js @@ -1,11 +1,10 @@ -/** @type {import('./__types/a.json').RequestHandler} */ +/** @type {import('./$types').RequestHandler} */ export function GET({ url }) { const answer = url.searchParams.get('answer') || '42'; - - return { + return new Response(JSON.stringify({}), { headers: { + 'content-type': 'application/json; charset=utf-8', 'set-cookie': `answer=${answer}; HttpOnly; Path=/load/set-cookie-fetch` - }, - body: {} - }; + } + }); } diff --git a/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/b.json.js b/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/b.json.js deleted file mode 100644 index 6c6bfb42417e..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/b.json.js +++ /dev/null @@ -1,16 +0,0 @@ -/** @type {import('./__types/b.json').RequestHandler} */ -export function GET({ request }) { - const cookie = request.headers.get('cookie'); - - const match = /answer=([^;]+)/.exec(cookie); - const answer = +match?.[1]; - - return { - body: { - answer - }, - headers: { - 'set-cookie': `doubled=${answer * 2}; HttpOnly; Path=/load/set-cookie-fetch` - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/b.json/+server.js b/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/b.json/+server.js new file mode 100644 index 000000000000..ed1c97b4f4b9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/b.json/+server.js @@ -0,0 +1,19 @@ +/** @type {import('./$types').RequestHandler} */ +export function GET({ request }) { + const cookie = request.headers.get('cookie'); + + const match = /answer=([^;]+)/.exec(cookie); + const answer = +match?.[1]; + + return new Response( + JSON.stringify({ + answer + }), + { + headers: { + 'content-type': 'application/json; charset=utf-8', + 'set-cookie': `doubled=${answer * 2}; HttpOnly; Path=/load/set-cookie-fetch` + } + } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/index.svelte b/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/index.svelte deleted file mode 100644 index 78d7b82b9395..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/set-cookie-fetch/index.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - - -

the answer is {answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/+layout.js b/packages/kit/test/apps/basics/src/routes/load/stuff/+layout.js new file mode 100644 index 000000000000..c40d1db32936 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/stuff/+layout.js @@ -0,0 +1,6 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + return { + message: 'original' + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/+layout.svelte b/packages/kit/test/apps/basics/src/routes/load/stuff/+layout.svelte new file mode 100644 index 000000000000..13e0e91ed627 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/stuff/+layout.svelte @@ -0,0 +1 @@ + diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/+layout.js b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/+layout.js new file mode 100644 index 000000000000..2f065463d856 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/+layout.js @@ -0,0 +1,8 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ params, parent }) { + const data = await parent(); + return { + message: `${data.message} + new`, + x: params.x + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/+layout.svelte b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/+layout.svelte new file mode 100644 index 000000000000..4fa864ce7aa9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/+layout.svelte @@ -0,0 +1 @@ + diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/+layout.js b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/+layout.js new file mode 100644 index 000000000000..d96610b162ac --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/+layout.js @@ -0,0 +1,6 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ params }) { + return { + y: params.y + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/+layout.svelte b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/+layout.svelte new file mode 100644 index 000000000000..4fa864ce7aa9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/+layout.svelte @@ -0,0 +1 @@ + diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z].svelte b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z].svelte deleted file mode 100644 index f5795357b64f..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z].svelte +++ /dev/null @@ -1,28 +0,0 @@ - - - - -

message: {message}

-
{JSON.stringify({ x, y, z })}
diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.js b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.js new file mode 100644 index 000000000000..748a7acbfcc1 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.js @@ -0,0 +1,6 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ params }) { + return { + z: params.z + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.svelte new file mode 100644 index 000000000000..adb4129b19aa --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.svelte @@ -0,0 +1,7 @@ + + +

message: {data.message}

+
{JSON.stringify({ data.x, data.y, data.z })}
diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/__layout.svelte b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/__layout.svelte deleted file mode 100644 index dfc6f03d8e2d..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/__layout.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/__layout.svelte b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/__layout.svelte deleted file mode 100644 index 87cda94c6eb5..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/__layout.svelte +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/__layout.svelte b/packages/kit/test/apps/basics/src/routes/load/stuff/__layout.svelte deleted file mode 100644 index 106a0f7479c4..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/stuff/__layout.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/packages/kit/test/apps/basics/src/routes/load/url-hash.svelte b/packages/kit/test/apps/basics/src/routes/load/url-hash.svelte deleted file mode 100644 index 86e1063af418..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/url-hash.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - - - -

- {hash} -

diff --git a/packages/kit/test/apps/basics/src/routes/load/url-hash/+page.js b/packages/kit/test/apps/basics/src/routes/load/url-hash/+page.js new file mode 100644 index 000000000000..1837c72c8826 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/url-hash/+page.js @@ -0,0 +1,4 @@ +export const load = ({ url }) => { + const hash = url.hash; + return { hash }; +}; diff --git a/packages/kit/test/apps/basics/src/routes/load/url-hash/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/url-hash/+page.svelte new file mode 100644 index 000000000000..46dae9e929d0 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/url-hash/+page.svelte @@ -0,0 +1,7 @@ + + +

+ {data.hash} +

diff --git a/packages/kit/test/apps/basics/src/routes/load/url-to-string.svelte b/packages/kit/test/apps/basics/src/routes/load/url-to-string.svelte deleted file mode 100644 index 122dad20b1a3..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/url-to-string.svelte +++ /dev/null @@ -1,8 +0,0 @@ - - -

I didn't break!

diff --git a/packages/kit/test/apps/basics/src/routes/load/url-to-string/+page.js b/packages/kit/test/apps/basics/src/routes/load/url-to-string/+page.js new file mode 100644 index 000000000000..dce00d994d4e --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/url-to-string/+page.js @@ -0,0 +1,4 @@ +export const load = ({ url }) => { + url.toString(); + return {}; +}; diff --git a/packages/kit/test/apps/basics/src/routes/load/url-to-string/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/url-to-string/+page.svelte new file mode 100644 index 000000000000..24b0c12ddf1a --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/url-to-string/+page.svelte @@ -0,0 +1 @@ +

I didn't break!

diff --git a/packages/kit/test/apps/basics/src/routes/load/window-fetch/correct.svelte b/packages/kit/test/apps/basics/src/routes/load/window-fetch/correct.svelte deleted file mode 100644 index dcb7afbc89dd..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/window-fetch/correct.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - - -

{answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/window-fetch/correct/+page.js b/packages/kit/test/apps/basics/src/routes/load/window-fetch/correct/+page.js new file mode 100644 index 000000000000..252c35ad0321 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/window-fetch/correct/+page.js @@ -0,0 +1,6 @@ +/** @type {import('./$types').Load} */ +export async function load({ url, fetch }) { + const res = await fetch(`${url.origin}/load/window-fetch/data.json`); + const { answer } = await res.json(); + return { answer }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/window-fetch/correct/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/window-fetch/correct/+page.svelte new file mode 100644 index 000000000000..b198a09653c3 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/window-fetch/correct/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/window-fetch/data.json.js b/packages/kit/test/apps/basics/src/routes/load/window-fetch/data.json.js deleted file mode 100644 index 5af3eaf447d0..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/window-fetch/data.json.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('./__types/data.json').RequestHandler} */ -export function GET() { - return { - body: { - answer: 42 - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/load/window-fetch/data.json/+server.js b/packages/kit/test/apps/basics/src/routes/load/window-fetch/data.json/+server.js new file mode 100644 index 000000000000..90db4c7e640b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/window-fetch/data.json/+server.js @@ -0,0 +1,9 @@ +/** @type {import('./$types').RequestHandler} */ +export function GET() { + return new Response( + JSON.stringify({ + answer: 42 + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/load/window-fetch/incorrect.svelte b/packages/kit/test/apps/basics/src/routes/load/window-fetch/incorrect.svelte deleted file mode 100644 index f669c7c33470..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/window-fetch/incorrect.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - - -

{answer}

diff --git a/packages/kit/test/apps/basics/src/routes/load/window-fetch/incorrect/+page.js b/packages/kit/test/apps/basics/src/routes/load/window-fetch/incorrect/+page.js new file mode 100644 index 000000000000..8425c225236b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/window-fetch/incorrect/+page.js @@ -0,0 +1,6 @@ +/** @type {import('./$types').Load} */ +export async function load({ url }) { + const res = await fetch(`${url.origin}/load/window-fetch/data.json`); + const { answer } = await res.json(); + return { answer }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/window-fetch/incorrect/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/window-fetch/incorrect/+page.svelte new file mode 100644 index 000000000000..b198a09653c3 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/window-fetch/incorrect/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.answer}

diff --git a/packages/kit/test/apps/basics/src/routes/method-override/+page.js b/packages/kit/test/apps/basics/src/routes/method-override/+page.js new file mode 100644 index 000000000000..cdf44934798d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/method-override/+page.js @@ -0,0 +1,6 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ url }) { + return { + method: url.searchParams.get('method') || '' + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/method-override/index.svelte b/packages/kit/test/apps/basics/src/routes/method-override/+page.svelte similarity index 73% rename from packages/kit/test/apps/basics/src/routes/method-override/index.svelte rename to packages/kit/test/apps/basics/src/routes/method-override/+page.svelte index f88ae1417ef9..4f556f7b1ce7 100644 --- a/packages/kit/test/apps/basics/src/routes/method-override/index.svelte +++ b/packages/kit/test/apps/basics/src/routes/method-override/+page.svelte @@ -1,20 +1,9 @@ - - -

{method}

+

{data.method}

diff --git a/packages/kit/test/apps/basics/src/routes/method-override/fetch.json.js b/packages/kit/test/apps/basics/src/routes/method-override/fetch.json/+server.js similarity index 76% rename from packages/kit/test/apps/basics/src/routes/method-override/fetch.json.js rename to packages/kit/test/apps/basics/src/routes/method-override/fetch.json/+server.js index 58616bf772a1..7f4b4c8c37b5 100644 --- a/packages/kit/test/apps/basics/src/routes/method-override/fetch.json.js +++ b/packages/kit/test/apps/basics/src/routes/method-override/fetch.json/+server.js @@ -1,9 +1,10 @@ -const buildResponse = (/** @type {string} */ method) => ({ - status: 303, - headers: { - location: `/method-override?method=${method}` - } -}); +const buildResponse = (/** @type {string} */ method) => + new Response(undefined, { + status: 303, + headers: { + location: `/method-override?method=${method}` + } + }); /** @type {import('@sveltejs/kit').RequestHandler} */ export const GET = ({ request }) => { diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/__layout.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/nested-layout/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/nested-layout/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/index.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/nested-layout/index.svelte rename to packages/kit/test/apps/basics/src/routes/nested-layout/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/error.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/error.svelte deleted file mode 100644 index 42624b81fe8c..000000000000 --- a/packages/kit/test/apps/basics/src/routes/nested-layout/error.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - -

Not shown

diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/error/+page.js b/packages/kit/test/apps/basics/src/routes/nested-layout/error/+page.js new file mode 100644 index 000000000000..94e1bb8269b5 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/nested-layout/error/+page.js @@ -0,0 +1,5 @@ +import { error } from '@sveltejs/kit/data'; + +export function load() { + throw error(500, 'Error'); +} diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/error/+page.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/error/+page.svelte new file mode 100644 index 000000000000..ec39d8d206b0 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/nested-layout/error/+page.svelte @@ -0,0 +1 @@ +

Not shown

diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/__layout.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/nested-layout/foo/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/nested-layout/foo/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/+error.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/+error.svelte new file mode 100644 index 000000000000..e745736ec46f --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/+error.svelte @@ -0,0 +1,30 @@ + + + + +

Nested error page

+

status: {data.status}

+

error.message: {data.error && data.error.message}

+

answer: {data.answer}

+ + diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/__layout.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/__error.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/__error.svelte deleted file mode 100644 index cf9f99bd10c2..000000000000 --- a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/__error.svelte +++ /dev/null @@ -1,34 +0,0 @@ - - - - -

Nested error page

-

status: {status}

-

error.message: {error && error.message}

-

answer: {answer}

- - diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope.svelte deleted file mode 100644 index 8c852515d266..000000000000 --- a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - -

should not see this

diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope/+page.js b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope/+page.js new file mode 100644 index 000000000000..ba6bb3928f9f --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope/+page.js @@ -0,0 +1,3 @@ +export async function load() { + throw new Error('nope'); +} diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope/+page.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope/+page.svelte new file mode 100644 index 000000000000..c9ce7c1c8743 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope/+page.svelte @@ -0,0 +1 @@ +

should not see this

diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/baz.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/baz/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/nested-layout/foo/baz.svelte rename to packages/kit/test/apps/basics/src/routes/nested-layout/foo/baz/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/reset/__layout@blank.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/reset/+layout@blank.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/nested-layout/reset/__layout@blank.svelte rename to packages/kit/test/apps/basics/src/routes/nested-layout/reset/+layout@blank.svelte diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/reset/index.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/reset/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/nested-layout/reset/index.svelte rename to packages/kit/test/apps/basics/src/routes/nested-layout/reset/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/no-hydrate.json/+server.js b/packages/kit/test/apps/basics/src/routes/no-hydrate.json/+server.js new file mode 100644 index 000000000000..68c59f247b05 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/no-hydrate.json/+server.js @@ -0,0 +1,8 @@ +export function GET() { + return new Response( + JSON.stringify({ + type: 'no-hydrate' + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/no-hydrate/+page.js b/packages/kit/test/apps/basics/src/routes/no-hydrate/+page.js new file mode 100644 index 000000000000..eddde8cf1a50 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/no-hydrate/+page.js @@ -0,0 +1,11 @@ +export const hydrate = false; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/no-hydrate.json'); + + /** @type {any} */ + const { type } = await res.json(); + + return { type }; +} diff --git a/packages/kit/test/apps/basics/src/routes/no-hydrate/+page.svelte b/packages/kit/test/apps/basics/src/routes/no-hydrate/+page.svelte new file mode 100644 index 000000000000..d8693a2c111b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/no-hydrate/+page.svelte @@ -0,0 +1,12 @@ + + + + +other diff --git a/packages/kit/test/apps/basics/src/routes/no-hydrate/index.json.js b/packages/kit/test/apps/basics/src/routes/no-hydrate/index.json.js deleted file mode 100644 index 6a1e3ec4422a..000000000000 --- a/packages/kit/test/apps/basics/src/routes/no-hydrate/index.json.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - type: 'no-hydrate' - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/no-hydrate/index.svelte b/packages/kit/test/apps/basics/src/routes/no-hydrate/index.svelte deleted file mode 100644 index 966b9c417a35..000000000000 --- a/packages/kit/test/apps/basics/src/routes/no-hydrate/index.svelte +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - -other diff --git a/packages/kit/test/apps/basics/src/routes/no-hydrate/no-js.svelte b/packages/kit/test/apps/basics/src/routes/no-hydrate/no-js.svelte deleted file mode 100644 index 00395f4a0d65..000000000000 --- a/packages/kit/test/apps/basics/src/routes/no-hydrate/no-js.svelte +++ /dev/null @@ -1,6 +0,0 @@ - - -

look ma no javascript

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/no-hydrate/no-js/+page.js b/packages/kit/test/apps/basics/src/routes/no-hydrate/no-js/+page.js new file mode 100644 index 000000000000..f043bbaa8e4a --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/no-hydrate/no-js/+page.js @@ -0,0 +1,2 @@ +export const router = false; +export const hydrate = false; diff --git a/packages/kit/test/apps/basics/src/routes/no-hydrate/no-js/+page.svelte b/packages/kit/test/apps/basics/src/routes/no-hydrate/no-js/+page.svelte new file mode 100644 index 000000000000..a840a265dd12 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/no-hydrate/no-js/+page.svelte @@ -0,0 +1 @@ +

look ma no javascript

diff --git a/packages/kit/test/apps/basics/src/routes/no-hydrate/other.svelte b/packages/kit/test/apps/basics/src/routes/no-hydrate/other.svelte deleted file mode 100644 index 7650a6aa7cab..000000000000 --- a/packages/kit/test/apps/basics/src/routes/no-hydrate/other.svelte +++ /dev/null @@ -1 +0,0 @@ -hydrate \ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/no-hydrate/other/+page.svelte b/packages/kit/test/apps/basics/src/routes/no-hydrate/other/+page.svelte new file mode 100644 index 000000000000..2ac0e4037772 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/no-hydrate/other/+page.svelte @@ -0,0 +1 @@ +hydrate diff --git a/packages/kit/test/apps/basics/src/routes/no-router/__layout.svelte b/packages/kit/test/apps/basics/src/routes/no-router/+layout.svelte similarity index 91% rename from packages/kit/test/apps/basics/src/routes/no-router/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/no-router/+layout.svelte index 918af78c5965..ef4b0dbfea12 100644 --- a/packages/kit/test/apps/basics/src/routes/no-router/__layout.svelte +++ b/packages/kit/test/apps/basics/src/routes/no-router/+layout.svelte @@ -9,4 +9,4 @@ a b - \ No newline at end of file + diff --git a/packages/kit/test/apps/basics/src/routes/no-router/a.svelte b/packages/kit/test/apps/basics/src/routes/no-router/a.svelte deleted file mode 100644 index 32bd0fc793a0..000000000000 --- a/packages/kit/test/apps/basics/src/routes/no-router/a.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - -

a

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/no-router/a/+page.js b/packages/kit/test/apps/basics/src/routes/no-router/a/+page.js new file mode 100644 index 000000000000..90f739775e8b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/no-router/a/+page.js @@ -0,0 +1 @@ +export const router = false; diff --git a/packages/kit/test/apps/basics/src/routes/no-router/a/+page.svelte b/packages/kit/test/apps/basics/src/routes/no-router/a/+page.svelte new file mode 100644 index 000000000000..57f9d40797b8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/no-router/a/+page.svelte @@ -0,0 +1 @@ +

a

diff --git a/packages/kit/test/apps/basics/src/routes/no-router/b/+page.svelte b/packages/kit/test/apps/basics/src/routes/no-router/b/+page.svelte new file mode 100644 index 000000000000..e96ed3db8987 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/no-router/b/+page.svelte @@ -0,0 +1 @@ +

b

diff --git a/packages/kit/test/apps/basics/src/routes/no-ssr/index.svelte b/packages/kit/test/apps/basics/src/routes/no-ssr/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/no-ssr/index.svelte rename to packages/kit/test/apps/basics/src/routes/no-ssr/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/no-ssr/margin.svelte b/packages/kit/test/apps/basics/src/routes/no-ssr/margin/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/no-ssr/margin.svelte rename to packages/kit/test/apps/basics/src/routes/no-ssr/margin/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/no-ssr/other.svelte b/packages/kit/test/apps/basics/src/routes/no-ssr/other/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/no-ssr/other.svelte rename to packages/kit/test/apps/basics/src/routes/no-ssr/other/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/origin/index.svelte b/packages/kit/test/apps/basics/src/routes/origin/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/origin/index.svelte rename to packages/kit/test/apps/basics/src/routes/origin/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/package.json.js b/packages/kit/test/apps/basics/src/routes/package.json.js deleted file mode 100644 index 9f90e4e60bfa..000000000000 --- a/packages/kit/test/apps/basics/src/routes/package.json.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - works: true - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/package.json/+server.js b/packages/kit/test/apps/basics/src/routes/package.json/+server.js new file mode 100644 index 000000000000..5aa536b46424 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/package.json/+server.js @@ -0,0 +1,8 @@ +export function GET() { + return new Response( + JSON.stringify({ + works: true + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/paths/index.svelte b/packages/kit/test/apps/basics/src/routes/paths/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/paths/index.svelte rename to packages/kit/test/apps/basics/src/routes/paths/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/+error.svelte b/packages/kit/test/apps/basics/src/routes/prerendering/+error.svelte new file mode 100644 index 000000000000..147fd7255b3b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/prerendering/+error.svelte @@ -0,0 +1,7 @@ + + +

{title}

diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/+page.js b/packages/kit/test/apps/basics/src/routes/prerendering/+page.js new file mode 100644 index 000000000000..5816f68fb244 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/prerendering/+page.js @@ -0,0 +1,5 @@ +export const prerender = true; + +export const load = ({ session }) => { + return session; +}; diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/+page.svelte b/packages/kit/test/apps/basics/src/routes/prerendering/+page.svelte new file mode 100644 index 000000000000..ce23336eadef --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/prerendering/+page.svelte @@ -0,0 +1 @@ +

You should never see me.

diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/__error.svelte b/packages/kit/test/apps/basics/src/routes/prerendering/__error.svelte deleted file mode 100644 index 50113b8d0cd4..000000000000 --- a/packages/kit/test/apps/basics/src/routes/prerendering/__error.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - - - -

{title}

diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/index.svelte b/packages/kit/test/apps/basics/src/routes/prerendering/index.svelte deleted file mode 100644 index 2746e9670173..000000000000 --- a/packages/kit/test/apps/basics/src/routes/prerendering/index.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - -

You should never see me.

diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint.svelte b/packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint.svelte deleted file mode 100644 index 17e79b8eb97b..000000000000 --- a/packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - -

I have a mutative endpoint!

diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint/+page.js b/packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint/+page.js new file mode 100644 index 000000000000..189f71e2e1b3 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint/+page.js @@ -0,0 +1 @@ +export const prerender = true; diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint.ts b/packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint/+page.server.ts similarity index 100% rename from packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint.ts rename to packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint/+page.server.ts diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint/+page.svelte b/packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint/+page.svelte new file mode 100644 index 000000000000..fe91947d4005 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/prerendering/mutative-endpoint/+page.svelte @@ -0,0 +1,7 @@ + + +

I have a mutative endpoint!

diff --git a/packages/kit/test/apps/basics/src/routes/query/echo.svelte b/packages/kit/test/apps/basics/src/routes/query/echo.svelte deleted file mode 100644 index fa96a56a43c3..000000000000 --- a/packages/kit/test/apps/basics/src/routes/query/echo.svelte +++ /dev/null @@ -1,37 +0,0 @@ - - - - -
{JSON.stringify(values)}
-
{JSON.stringify(to_pojo($page.url.searchParams))}
- -?bar=2 diff --git a/packages/kit/test/apps/basics/src/routes/query/echo/+page.js b/packages/kit/test/apps/basics/src/routes/query/echo/+page.js new file mode 100644 index 000000000000..bd73fc6f3ac8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/query/echo/+page.js @@ -0,0 +1,21 @@ +/** @typedef {Record} Query */ + +/** @param {URLSearchParams} query */ +function to_pojo(query) { + /** @type {Query}*/ + const values = {}; + + query.forEach((value, key) => { + if (!(key in values)) values[key] = []; + values[key].push(value); + }); + + return values; +} + +/** @type {import('@sveltejs/kit').Load} */ +export function load({ url }) { + return { + values: to_pojo(url.searchParams) + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/query/echo/+page.svelte b/packages/kit/test/apps/basics/src/routes/query/echo/+page.svelte new file mode 100644 index 000000000000..bbd45b406662 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/query/echo/+page.svelte @@ -0,0 +1,11 @@ + + +
{JSON.stringify(data.values)}
+
{JSON.stringify(to_pojo($page.url.searchParams))}
+ +?bar=2 diff --git a/packages/kit/test/apps/basics/src/routes/redirect-on-load/+page.js b/packages/kit/test/apps/basics/src/routes/redirect-on-load/+page.js new file mode 100644 index 000000000000..5511686cf8e8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect-on-load/+page.js @@ -0,0 +1,10 @@ +import { redirect } from '@sveltejs/kit/data'; +import { browser } from '$app/env'; + +export async function load() { + if (browser) { + throw redirect(303, '/redirect-on-load/redirected'); + } + + return {}; +} diff --git a/packages/kit/test/apps/basics/src/routes/redirect-on-load/+page.svelte b/packages/kit/test/apps/basics/src/routes/redirect-on-load/+page.svelte new file mode 100644 index 000000000000..9b01e2e1fd28 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect-on-load/+page.svelte @@ -0,0 +1,2 @@ +

Woops!

+

You shouldn't be here. You should have been directed to /redirect!

diff --git a/packages/kit/test/apps/basics/src/routes/redirect-on-load/index.svelte b/packages/kit/test/apps/basics/src/routes/redirect-on-load/index.svelte deleted file mode 100644 index 7a25daffdf11..000000000000 --- a/packages/kit/test/apps/basics/src/routes/redirect-on-load/index.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - -

Woops!

-

You shouldn't be here. You should have been directed to /redirect!

diff --git a/packages/kit/test/apps/basics/src/routes/redirect-on-load/redirected.svelte b/packages/kit/test/apps/basics/src/routes/redirect-on-load/redirected/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/redirect-on-load/redirected.svelte rename to packages/kit/test/apps/basics/src/routes/redirect-on-load/redirected/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/redirect/index.svelte b/packages/kit/test/apps/basics/src/routes/redirect/+page.svelte similarity index 78% rename from packages/kit/test/apps/basics/src/routes/redirect/index.svelte rename to packages/kit/test/apps/basics/src/routes/redirect/+page.svelte index 856e73216a4b..70f0a624f0ff 100644 --- a/packages/kit/test/apps/basics/src/routes/redirect/index.svelte +++ b/packages/kit/test/apps/basics/src/routes/redirect/+page.svelte @@ -6,4 +6,4 @@ b (loopy) a (missing-status) -b (missing-status) \ No newline at end of file +b (missing-status) diff --git a/packages/kit/test/apps/basics/src/routes/redirect/a.svelte b/packages/kit/test/apps/basics/src/routes/redirect/a.svelte deleted file mode 100644 index 40af92be8e54..000000000000 --- a/packages/kit/test/apps/basics/src/routes/redirect/a.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -

a

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/redirect/a/+page.js b/packages/kit/test/apps/basics/src/routes/redirect/a/+page.js new file mode 100644 index 000000000000..3a42e98bae36 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect/a/+page.js @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit/data'; + +export function load() { + throw redirect(307, './b'); +} diff --git a/packages/kit/test/apps/basics/src/routes/redirect/a/+page.svelte b/packages/kit/test/apps/basics/src/routes/redirect/a/+page.svelte new file mode 100644 index 000000000000..57f9d40797b8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect/a/+page.svelte @@ -0,0 +1 @@ +

a

diff --git a/packages/kit/test/apps/basics/src/routes/redirect/b.svelte b/packages/kit/test/apps/basics/src/routes/redirect/b.svelte deleted file mode 100644 index 09f9f7f76961..000000000000 --- a/packages/kit/test/apps/basics/src/routes/redirect/b.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -

a

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/redirect/b/+page.js b/packages/kit/test/apps/basics/src/routes/redirect/b/+page.js new file mode 100644 index 000000000000..c4c41df80d1d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect/b/+page.js @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit/data'; + +export function load() { + throw redirect(307, './c'); +} diff --git a/packages/kit/test/apps/basics/src/routes/redirect/b/+page.svelte b/packages/kit/test/apps/basics/src/routes/redirect/b/+page.svelte new file mode 100644 index 000000000000..57f9d40797b8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect/b/+page.svelte @@ -0,0 +1 @@ +

a

diff --git a/packages/kit/test/apps/basics/src/routes/redirect/c.svelte b/packages/kit/test/apps/basics/src/routes/redirect/c/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/redirect/c.svelte rename to packages/kit/test/apps/basics/src/routes/redirect/c/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/redirect/loopy/a.svelte b/packages/kit/test/apps/basics/src/routes/redirect/loopy/a.svelte deleted file mode 100644 index 40af92be8e54..000000000000 --- a/packages/kit/test/apps/basics/src/routes/redirect/loopy/a.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -

a

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/redirect/loopy/a/+page.js b/packages/kit/test/apps/basics/src/routes/redirect/loopy/a/+page.js new file mode 100644 index 000000000000..3a42e98bae36 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect/loopy/a/+page.js @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit/data'; + +export function load() { + throw redirect(307, './b'); +} diff --git a/packages/kit/test/apps/basics/src/routes/redirect/loopy/a/+page.svelte b/packages/kit/test/apps/basics/src/routes/redirect/loopy/a/+page.svelte new file mode 100644 index 000000000000..57f9d40797b8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect/loopy/a/+page.svelte @@ -0,0 +1 @@ +

a

diff --git a/packages/kit/test/apps/basics/src/routes/redirect/loopy/b.svelte b/packages/kit/test/apps/basics/src/routes/redirect/loopy/b.svelte deleted file mode 100644 index 97fd91c1b9b3..000000000000 --- a/packages/kit/test/apps/basics/src/routes/redirect/loopy/b.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -

b

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/redirect/loopy/b/+page.js b/packages/kit/test/apps/basics/src/routes/redirect/loopy/b/+page.js new file mode 100644 index 000000000000..bdd636f6e9b6 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect/loopy/b/+page.js @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit/data'; + +export function load() { + throw redirect(307, './a'); +} diff --git a/packages/kit/test/apps/basics/src/routes/redirect/loopy/b/+page.svelte b/packages/kit/test/apps/basics/src/routes/redirect/loopy/b/+page.svelte new file mode 100644 index 000000000000..e96ed3db8987 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect/loopy/b/+page.svelte @@ -0,0 +1 @@ +

b

diff --git a/packages/kit/test/apps/basics/src/routes/redirect/missing-status/a.svelte b/packages/kit/test/apps/basics/src/routes/redirect/missing-status/a.svelte deleted file mode 100644 index d4706643643b..000000000000 --- a/packages/kit/test/apps/basics/src/routes/redirect/missing-status/a.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - -

a

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/redirect/missing-status/a/+page.js b/packages/kit/test/apps/basics/src/routes/redirect/missing-status/a/+page.js new file mode 100644 index 000000000000..f42ed681a6e1 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect/missing-status/a/+page.js @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit/data'; + +export function load() { + throw redirect(undefined, './b'); +} diff --git a/packages/kit/test/apps/basics/src/routes/redirect/missing-status/a/+page.svelte b/packages/kit/test/apps/basics/src/routes/redirect/missing-status/a/+page.svelte new file mode 100644 index 000000000000..57f9d40797b8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect/missing-status/a/+page.svelte @@ -0,0 +1 @@ +

a

diff --git a/packages/kit/test/apps/basics/src/routes/redirect/missing-status/b.svelte b/packages/kit/test/apps/basics/src/routes/redirect/missing-status/b.svelte deleted file mode 100644 index cd420e238cd6..000000000000 --- a/packages/kit/test/apps/basics/src/routes/redirect/missing-status/b.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -

b

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/redirect/missing-status/b/+page.js b/packages/kit/test/apps/basics/src/routes/redirect/missing-status/b/+page.js new file mode 100644 index 000000000000..a7afda683891 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect/missing-status/b/+page.js @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit/data'; + +export function load() { + throw redirect(555, './a'); +} diff --git a/packages/kit/test/apps/basics/src/routes/redirect/missing-status/b/+page.svelte b/packages/kit/test/apps/basics/src/routes/redirect/missing-status/b/+page.svelte new file mode 100644 index 000000000000..e96ed3db8987 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/redirect/missing-status/b/+page.svelte @@ -0,0 +1 @@ +

b

diff --git a/packages/kit/test/apps/basics/src/routes/routing/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/index.svelte rename to packages/kit/test/apps/basics/src/routes/routing/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/[slug].svelte b/packages/kit/test/apps/basics/src/routes/routing/[slug]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/[slug].svelte rename to packages/kit/test/apps/basics/src/routes/routing/[slug]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/a.svelte b/packages/kit/test/apps/basics/src/routes/routing/a/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/a.svelte rename to packages/kit/test/apps/basics/src/routes/routing/a/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/ambiguous/[slug].json.js b/packages/kit/test/apps/basics/src/routes/routing/ambiguous/[slug].json/+server.js similarity index 68% rename from packages/kit/test/apps/basics/src/routes/routing/ambiguous/[slug].json.js rename to packages/kit/test/apps/basics/src/routes/routing/ambiguous/[slug].json/+server.js index 640ba0ed3bc9..5dbfc114125c 100644 --- a/packages/kit/test/apps/basics/src/routes/routing/ambiguous/[slug].json.js +++ b/packages/kit/test/apps/basics/src/routes/routing/ambiguous/[slug].json/+server.js @@ -1,4 +1,4 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET(req) { - return { body: req.params.slug }; + return new Response(req.params.slug); } diff --git a/packages/kit/test/apps/basics/src/routes/routing/ambiguous/[slug]/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/ambiguous/[slug]/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/routing/b.json/+server.js b/packages/kit/test/apps/basics/src/routes/routing/b.json/+server.js new file mode 100644 index 000000000000..7019bd5c1f1d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/b.json/+server.js @@ -0,0 +1,6 @@ +export function GET() { + // TODO check if migrated correctly. old code: + // return { body: JSON.stringify('b') }; + + return new Response(JSON.stringify('b')); +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/b/+page.js b/packages/kit/test/apps/basics/src/routes/routing/b/+page.js new file mode 100644 index 000000000000..695fb251b466 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/b/+page.js @@ -0,0 +1,5 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const letter = await fetch('/routing/b.json').then((r) => r.json()); + return { letter }; +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/b/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/b/+page.svelte new file mode 100644 index 000000000000..d0dd0586e1d6 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/b/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.letter}

diff --git a/packages/kit/test/apps/basics/src/routes/routing/b/index.json.js b/packages/kit/test/apps/basics/src/routes/routing/b/index.json.js deleted file mode 100644 index efb20b1b448a..000000000000 --- a/packages/kit/test/apps/basics/src/routes/routing/b/index.json.js +++ /dev/null @@ -1,3 +0,0 @@ -export function GET() { - return { body: JSON.stringify('b') }; -} diff --git a/packages/kit/test/apps/basics/src/routes/routing/b/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/b/index.svelte deleted file mode 100644 index ff012dd1c220..000000000000 --- a/packages/kit/test/apps/basics/src/routes/routing/b/index.svelte +++ /dev/null @@ -1,14 +0,0 @@ - - - - -

{letter}

diff --git a/packages/kit/test/apps/basics/src/routes/routing/cancellation/__layout.svelte b/packages/kit/test/apps/basics/src/routes/routing/cancellation/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/cancellation/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/routing/cancellation/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/cancellation/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/cancellation/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/cancellation/index.svelte rename to packages/kit/test/apps/basics/src/routes/routing/cancellation/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/cancellation/a.svelte b/packages/kit/test/apps/basics/src/routes/routing/cancellation/a.svelte deleted file mode 100644 index ec4ec8478ebb..000000000000 --- a/packages/kit/test/apps/basics/src/routes/routing/cancellation/a.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - -

this should not appear

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/routing/cancellation/a/+page.js b/packages/kit/test/apps/basics/src/routes/routing/cancellation/a/+page.js new file mode 100644 index 000000000000..a5091c42333e --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/cancellation/a/+page.js @@ -0,0 +1,12 @@ +import { browser } from '$app/env'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + if (browser) { + await new Promise((f) => { + window.fulfil_navigation = f; + }); + } + + return {}; +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/cancellation/a/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/cancellation/a/+page.svelte new file mode 100644 index 000000000000..66eeb86ad49c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/cancellation/a/+page.svelte @@ -0,0 +1 @@ +

this should not appear

diff --git a/packages/kit/test/apps/basics/src/routes/no-router/b.svelte b/packages/kit/test/apps/basics/src/routes/routing/cancellation/b/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/no-router/b.svelte rename to packages/kit/test/apps/basics/src/routes/routing/cancellation/b/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/client/bar/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/client/bar/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/client/bar/index.svelte rename to packages/kit/test/apps/basics/src/routes/routing/client/bar/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/client/bar/b.svelte b/packages/kit/test/apps/basics/src/routes/routing/client/bar/b.svelte deleted file mode 100644 index 51902b4da7a6..000000000000 --- a/packages/kit/test/apps/basics/src/routes/routing/client/bar/b.svelte +++ /dev/null @@ -1 +0,0 @@ -

b

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/routing/cancellation/b.svelte b/packages/kit/test/apps/basics/src/routes/routing/client/bar/b/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/cancellation/b.svelte rename to packages/kit/test/apps/basics/src/routes/routing/client/bar/b/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/client/foo.svelte b/packages/kit/test/apps/basics/src/routes/routing/client/foo/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/client/foo.svelte rename to packages/kit/test/apps/basics/src/routes/routing/client/foo/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/const.svelte b/packages/kit/test/apps/basics/src/routes/routing/const/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/const.svelte rename to packages/kit/test/apps/basics/src/routes/routing/const/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/dirs/bar/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/dirs/bar/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/dirs/bar/index.svelte rename to packages/kit/test/apps/basics/src/routes/routing/dirs/bar/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/dirs/bar/[a].svelte b/packages/kit/test/apps/basics/src/routes/routing/dirs/bar/[a]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/dirs/bar/[a].svelte rename to packages/kit/test/apps/basics/src/routes/routing/dirs/bar/[a]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/dirs/foo/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/dirs/foo/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/dirs/foo/index.svelte rename to packages/kit/test/apps/basics/src/routes/routing/dirs/foo/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/dirs/foo/[b].svelte b/packages/kit/test/apps/basics/src/routes/routing/dirs/foo/[b]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/dirs/foo/[b].svelte rename to packages/kit/test/apps/basics/src/routes/routing/dirs/foo/[b]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/hashes/a.svelte b/packages/kit/test/apps/basics/src/routes/routing/hashes/a/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/hashes/a.svelte rename to packages/kit/test/apps/basics/src/routes/routing/hashes/a/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/hashes/b.svelte b/packages/kit/test/apps/basics/src/routes/routing/hashes/b/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/hashes/b.svelte rename to packages/kit/test/apps/basics/src/routes/routing/hashes/b/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/hashes/pagestore.svelte b/packages/kit/test/apps/basics/src/routes/routing/hashes/pagestore/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/hashes/pagestore.svelte rename to packages/kit/test/apps/basics/src/routes/routing/hashes/pagestore/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/hashes/target.svelte b/packages/kit/test/apps/basics/src/routes/routing/hashes/target/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/hashes/target.svelte rename to packages/kit/test/apps/basics/src/routes/routing/hashes/target/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/matched/__layout.svelte b/packages/kit/test/apps/basics/src/routes/routing/matched/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/matched/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/routing/matched/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/matched/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/matched/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/matched/index.svelte rename to packages/kit/test/apps/basics/src/routes/routing/matched/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/matched/[fallback].svelte b/packages/kit/test/apps/basics/src/routes/routing/matched/[fallback]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/matched/[fallback].svelte rename to packages/kit/test/apps/basics/src/routes/routing/matched/[fallback]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/matched/[letter=lowercase].svelte b/packages/kit/test/apps/basics/src/routes/routing/matched/[letter=lowercase]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/matched/[letter=lowercase].svelte rename to packages/kit/test/apps/basics/src/routes/routing/matched/[letter=lowercase]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/matched/[letter=uppercase].svelte b/packages/kit/test/apps/basics/src/routes/routing/matched/[letter=uppercase]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/matched/[letter=uppercase].svelte rename to packages/kit/test/apps/basics/src/routes/routing/matched/[letter=uppercase]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/matched/[number=numeric].svelte b/packages/kit/test/apps/basics/src/routes/routing/matched/[number=numeric]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/matched/[number=numeric].svelte rename to packages/kit/test/apps/basics/src/routes/routing/matched/[number=numeric]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/params-in-handle/[x].js b/packages/kit/test/apps/basics/src/routes/routing/params-in-handle/[x].js deleted file mode 100644 index 44e3c4ede219..000000000000 --- a/packages/kit/test/apps/basics/src/routes/routing/params-in-handle/[x].js +++ /dev/null @@ -1,9 +0,0 @@ -/** @type {import('./__types/[x]').RequestHandler} */ -export function GET({ locals }) { - return { - body: { - key: locals.key, - params: locals.params - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/routing/params-in-handle/[x]/+server.js b/packages/kit/test/apps/basics/src/routes/routing/params-in-handle/[x]/+server.js new file mode 100644 index 000000000000..afed3ff52bc9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/params-in-handle/[x]/+server.js @@ -0,0 +1,10 @@ +/** @type {import('./$types').RequestHandler} */ +export function GET({ locals }) { + return new Response( + JSON.stringify({ + key: locals.key, + params: locals.params + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/prefetched.json/+server.js b/packages/kit/test/apps/basics/src/routes/routing/prefetched.json/+server.js new file mode 100644 index 000000000000..1be02fa5d289 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/prefetched.json/+server.js @@ -0,0 +1,3 @@ +export function GET() { + return new Response(JSON.stringify('prefetched')); +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/prefetched/+page.js b/packages/kit/test/apps/basics/src/routes/routing/prefetched/+page.js new file mode 100644 index 000000000000..76a9f0c1cada --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/prefetched/+page.js @@ -0,0 +1,5 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const message = await fetch('/routing/prefetched.json').then((r) => r.json()); + return { message }; +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/prefetched/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/prefetched/+page.svelte new file mode 100644 index 000000000000..1c0c8c20ec65 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/prefetched/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.message}

diff --git a/packages/kit/test/apps/basics/src/routes/routing/prefetched/hash-route/+page.js b/packages/kit/test/apps/basics/src/routes/routing/prefetched/hash-route/+page.js new file mode 100644 index 000000000000..81da9fc7ae01 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/prefetched/hash-route/+page.js @@ -0,0 +1,6 @@ +let load_calls = 0; + +export const load = () => { + load_calls += 1; + return { calls: load_calls }; +}; diff --git a/packages/kit/test/apps/basics/src/routes/routing/prefetching/hash-route.svelte b/packages/kit/test/apps/basics/src/routes/routing/prefetched/hash-route/+page.svelte similarity index 69% rename from packages/kit/test/apps/basics/src/routes/routing/prefetching/hash-route.svelte rename to packages/kit/test/apps/basics/src/routes/routing/prefetched/hash-route/+page.svelte index 39fa611fe77e..dd0428be8d53 100644 --- a/packages/kit/test/apps/basics/src/routes/routing/prefetching/hash-route.svelte +++ b/packages/kit/test/apps/basics/src/routes/routing/prefetched/hash-route/+page.svelte @@ -1,17 +1,8 @@ - - - - - -

{message}

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/routing/prefetching/hash-route/+page.js b/packages/kit/test/apps/basics/src/routes/routing/prefetching/hash-route/+page.js new file mode 100644 index 000000000000..81da9fc7ae01 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/prefetching/hash-route/+page.js @@ -0,0 +1,6 @@ +let load_calls = 0; + +export const load = () => { + load_calls += 1; + return { calls: load_calls }; +}; diff --git a/packages/kit/test/apps/basics/src/routes/routing/prefetched/hash-route.svelte b/packages/kit/test/apps/basics/src/routes/routing/prefetching/hash-route/+page.svelte similarity index 69% rename from packages/kit/test/apps/basics/src/routes/routing/prefetched/hash-route.svelte rename to packages/kit/test/apps/basics/src/routes/routing/prefetching/hash-route/+page.svelte index 39fa611fe77e..dd0428be8d53 100644 --- a/packages/kit/test/apps/basics/src/routes/routing/prefetched/hash-route.svelte +++ b/packages/kit/test/apps/basics/src/routes/routing/prefetching/hash-route/+page.svelte @@ -1,17 +1,8 @@ - - - - - -

{message}

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/routing/prefetching/prefetched/+page.js b/packages/kit/test/apps/basics/src/routes/routing/prefetching/prefetched/+page.js new file mode 100644 index 000000000000..76a9f0c1cada --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/prefetching/prefetched/+page.js @@ -0,0 +1,5 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const message = await fetch('/routing/prefetched.json').then((r) => r.json()); + return { message }; +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/prefetching/prefetched/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/prefetching/prefetched/+page.svelte new file mode 100644 index 000000000000..1c0c8c20ec65 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/prefetching/prefetched/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.message}

diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/+page.js b/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/+page.js new file mode 100644 index 000000000000..fa3fb83763d2 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/+page.js @@ -0,0 +1,5 @@ +/** @type {import('@sveltejs/kit').Load} */ +export function load({ params }) { + const { rest } = params; + return { rest }; +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/+page.svelte similarity index 56% rename from packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/index.svelte rename to packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/+page.svelte index 9bbca8792006..e59d7ad28cd0 100644 --- a/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/index.svelte +++ b/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/+page.svelte @@ -1,20 +1,12 @@ - -

{$page.params.rest}

-

{rest}

+

{data.rest}

deep abc diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep.json.js b/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep.json/+server.js similarity index 72% rename from packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep.json.js rename to packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep.json/+server.js index 482b5d02a05b..e95ee43a2029 100644 --- a/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep.json.js +++ b/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep.json/+server.js @@ -1,4 +1,4 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET({ params }) { - return { body: params.rest }; + return new Response(params.rest); } diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep.svelte b/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep.svelte deleted file mode 100644 index 46292ff04b93..000000000000 --- a/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - - - -

{$page.params.rest}

-

{rest}

- -deep -back diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep/+page.js b/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep/+page.js new file mode 100644 index 000000000000..fa3fb83763d2 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep/+page.js @@ -0,0 +1,5 @@ +/** @type {import('@sveltejs/kit').Load} */ +export function load({ params }) { + const { rest } = params; + return { rest }; +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep/+page.svelte new file mode 100644 index 000000000000..1bbe162054b9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/rest/[...rest]/deep/+page.svelte @@ -0,0 +1,12 @@ + + +

{$page.params.rest}

+

{data.rest}

+ +deep +back diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/complex/[...parts].json.js b/packages/kit/test/apps/basics/src/routes/routing/rest/complex/[...parts].json.js deleted file mode 100644 index e873880aff69..000000000000 --- a/packages/kit/test/apps/basics/src/routes/routing/rest/complex/[...parts].json.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET({ params }) { - return { - body: { - parts: params.parts - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/complex/[...parts].json/+server.js b/packages/kit/test/apps/basics/src/routes/routing/rest/complex/[...parts].json/+server.js new file mode 100644 index 000000000000..fbe44d5f8326 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/rest/complex/[...parts].json/+server.js @@ -0,0 +1,9 @@ +/** @type {import('@sveltejs/kit').RequestHandler} */ +export function GET({ params }) { + return new Response( + JSON.stringify({ + parts: params.parts + }), + { headers: { 'content-type': 'application/json; charset=utf-8' } } + ); +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/complex/prefix-[...parts].svelte b/packages/kit/test/apps/basics/src/routes/routing/rest/complex/prefix-[...parts].svelte deleted file mode 100644 index 0ebdc7f62dbe..000000000000 --- a/packages/kit/test/apps/basics/src/routes/routing/rest/complex/prefix-[...parts].svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - - -

parts: {parts}

diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/complex/prefix-[...parts]/+page.js b/packages/kit/test/apps/basics/src/routes/routing/rest/complex/prefix-[...parts]/+page.js new file mode 100644 index 000000000000..1c3e434414c7 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/rest/complex/prefix-[...parts]/+page.js @@ -0,0 +1,6 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch, params }) { + const res = await fetch(`/routing/rest/complex/${params.parts}.json`); + const { parts } = await res.json(); + return { parts }; +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/complex/prefix-[...parts]/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/rest/complex/prefix-[...parts]/+page.svelte new file mode 100644 index 000000000000..4f8eee19519e --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/rest/complex/prefix-[...parts]/+page.svelte @@ -0,0 +1,6 @@ + + +

parts: {data.parts}

diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/__layout.svelte b/packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/[dynamic]-bar/[...rest].svelte b/packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/[dynamic]-bar/[...rest]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/[dynamic]-bar/[...rest].svelte rename to packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/[dynamic]-bar/[...rest]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/foo/[...rest].svelte b/packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/foo/[...rest]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/foo/[...rest].svelte rename to packages/kit/test/apps/basics/src/routes/routing/rest/non-greedy/foo/[...rest]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/path/__layout.svelte b/packages/kit/test/apps/basics/src/routes/routing/rest/path/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/rest/path/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/routing/rest/path/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/path/[...ignored].svelte b/packages/kit/test/apps/basics/src/routes/routing/rest/path/[...ignored].svelte deleted file mode 100644 index 9ec935d3b738..000000000000 --- a/packages/kit/test/apps/basics/src/routes/routing/rest/path/[...ignored].svelte +++ /dev/null @@ -1,17 +0,0 @@ - - - - -

path: {path}

diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/path/[...ignored]/+page.js b/packages/kit/test/apps/basics/src/routes/routing/rest/path/[...ignored]/+page.js new file mode 100644 index 000000000000..6f91b280d8b9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/rest/path/[...ignored]/+page.js @@ -0,0 +1,5 @@ +/** @type {import('@sveltejs/kit').Load} */ +export function load({ url }) { + const { pathname: path } = url; + return { path }; +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/rest/path/[...ignored]/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/rest/path/[...ignored]/+page.svelte new file mode 100644 index 000000000000..6b2c38415af5 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/rest/path/[...ignored]/+page.svelte @@ -0,0 +1,6 @@ + + +

path: {data.path}

diff --git a/packages/kit/test/apps/basics/src/routes/routing/route-id/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/route-id/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/route-id/index.svelte rename to packages/kit/test/apps/basics/src/routes/routing/route-id/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/route-id/[x].svelte b/packages/kit/test/apps/basics/src/routes/routing/route-id/[x].svelte deleted file mode 100644 index 972fff95db14..000000000000 --- a/packages/kit/test/apps/basics/src/routes/routing/route-id/[x].svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - - -

routeId in load: {routeId}

-

routeId in store: {$page.routeId}

diff --git a/packages/kit/test/apps/basics/src/routes/routing/route-id/[x]/+page.js b/packages/kit/test/apps/basics/src/routes/routing/route-id/[x]/+page.js new file mode 100644 index 000000000000..bc88ef904216 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/route-id/[x]/+page.js @@ -0,0 +1,4 @@ +/** @type {import('./$types').Load} */ +export function load({ routeId }) { + return { routeId }; +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/route-id/[x]/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/route-id/[x]/+page.svelte new file mode 100644 index 000000000000..3155e837914d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/route-id/[x]/+page.svelte @@ -0,0 +1,9 @@ + + +

routeId in load: {data.routeId}

+

routeId in store: {$page.routeId}

diff --git a/packages/kit/test/apps/basics/src/routes/routing/shadow-dom/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/shadow-dom/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/shadow-dom/index.svelte rename to packages/kit/test/apps/basics/src/routes/routing/shadow-dom/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/skipped/[one]/[two].svelte b/packages/kit/test/apps/basics/src/routes/routing/skipped/[one]/[two].svelte deleted file mode 100644 index 8ba2d8ac7cef..000000000000 --- a/packages/kit/test/apps/basics/src/routes/routing/skipped/[one]/[two].svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - - -

{one}/{two}

- -next diff --git a/packages/kit/test/apps/basics/src/routes/routing/skipped/[one]/[two]/+page.js b/packages/kit/test/apps/basics/src/routes/routing/skipped/[one]/[two]/+page.js new file mode 100644 index 000000000000..c919ae378c59 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/skipped/[one]/[two]/+page.js @@ -0,0 +1,4 @@ +/** @type {import('@sveltejs/kit').Load} */ +export function load({ params }) { + return params; +} diff --git a/packages/kit/test/apps/basics/src/routes/routing/skipped/[one]/[two]/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/skipped/[one]/[two]/+page.svelte new file mode 100644 index 000000000000..c77a73461203 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/skipped/[one]/[two]/+page.svelte @@ -0,0 +1,8 @@ + + +

{data.one}/{data.two}

+ +next diff --git a/packages/kit/test/apps/basics/src/routes/routing/slashes/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/slashes/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/slashes/index.svelte rename to packages/kit/test/apps/basics/src/routes/routing/slashes/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/split-params/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/split-params/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/split-params/index.svelte rename to packages/kit/test/apps/basics/src/routes/routing/split-params/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/routing/split-params/[a]-[b].svelte b/packages/kit/test/apps/basics/src/routes/routing/split-params/[a]-[b]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/routing/split-params/[a]-[b].svelte rename to packages/kit/test/apps/basics/src/routes/routing/split-params/[a]-[b]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/scroll/cross-document/a/+page.js b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/a/+page.js new file mode 100644 index 000000000000..90f739775e8b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/a/+page.js @@ -0,0 +1 @@ +export const router = false; diff --git a/packages/kit/test/apps/basics/src/routes/scroll/cross-document/a.svelte b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/a/+page.svelte similarity index 60% rename from packages/kit/test/apps/basics/src/routes/scroll/cross-document/a.svelte rename to packages/kit/test/apps/basics/src/routes/scroll/cross-document/a/+page.svelte index 485fc284e3ea..902e783cdb8b 100644 --- a/packages/kit/test/apps/basics/src/routes/scroll/cross-document/a.svelte +++ b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/a/+page.svelte @@ -1,7 +1,3 @@ - -

a

diff --git a/packages/kit/test/apps/basics/src/routes/scroll/cross-document/b.svelte b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/b.svelte deleted file mode 100644 index 02808b2e9ea5..000000000000 --- a/packages/kit/test/apps/basics/src/routes/scroll/cross-document/b.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - -

b

- -c diff --git a/packages/kit/test/apps/basics/src/routes/scroll/cross-document/b/+page.js b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/b/+page.js new file mode 100644 index 000000000000..b33c2aee87a1 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/b/+page.js @@ -0,0 +1 @@ +export const router = true; diff --git a/packages/kit/test/apps/basics/src/routes/scroll/cross-document/b/+page.svelte b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/b/+page.svelte new file mode 100644 index 000000000000..c065e2362f6a --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/b/+page.svelte @@ -0,0 +1,3 @@ +

b

+ +c diff --git a/packages/kit/test/apps/basics/src/routes/scroll/cross-document/c.svelte b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/c.svelte deleted file mode 100644 index 55191947cd2e..000000000000 --- a/packages/kit/test/apps/basics/src/routes/scroll/cross-document/c.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - -

c

diff --git a/packages/kit/test/apps/basics/src/routes/scroll/cross-document/c/+page.js b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/c/+page.js new file mode 100644 index 000000000000..b33c2aee87a1 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/c/+page.js @@ -0,0 +1 @@ +export const router = true; diff --git a/packages/kit/test/apps/basics/src/routes/scroll/cross-document/c/+page.svelte b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/c/+page.svelte new file mode 100644 index 000000000000..232c276f86cb --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/scroll/cross-document/c/+page.svelte @@ -0,0 +1 @@ +

c

diff --git a/packages/kit/test/apps/basics/src/routes/selection/__layout.svelte b/packages/kit/test/apps/basics/src/routes/selection/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/selection/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/selection/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/selection/a.svelte b/packages/kit/test/apps/basics/src/routes/selection/a/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/selection/a.svelte rename to packages/kit/test/apps/basics/src/routes/selection/a/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/selection/b.svelte b/packages/kit/test/apps/basics/src/routes/selection/b/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/selection/b.svelte rename to packages/kit/test/apps/basics/src/routes/selection/b/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/session/+page.js b/packages/kit/test/apps/basics/src/routes/session/+page.js new file mode 100644 index 000000000000..ac75fa4c072c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/session/+page.js @@ -0,0 +1,6 @@ +/** @type {import('@sveltejs/kit').Load} */ +export function load({ session }) { + return { + answer: session.answer + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/session/+page.svelte b/packages/kit/test/apps/basics/src/routes/session/+page.svelte new file mode 100644 index 000000000000..b6122f33aba2 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/session/+page.svelte @@ -0,0 +1,17 @@ + + +

answer via props: {data.answer}

+

answer via store: {$session.answer}

+{#if data.answer === 43} +

answer via props is 43

+{/if} +{#if $session.answer === 43} +

answer via store is 43

+{/if} + + diff --git a/packages/kit/test/apps/basics/src/routes/session/index.svelte b/packages/kit/test/apps/basics/src/routes/session/index.svelte deleted file mode 100644 index 52d57698028e..000000000000 --- a/packages/kit/test/apps/basics/src/routes/session/index.svelte +++ /dev/null @@ -1,28 +0,0 @@ - - - - -

answer via props: {answer}

-

answer via store: {$session.answer}

-{#if answer === 43} -

answer via props is 43

-{/if} -{#if $session.answer === 43} -

answer via store is 43

-{/if} - - diff --git a/packages/kit/test/apps/basics/src/routes/set-cookie/+server.js b/packages/kit/test/apps/basics/src/routes/set-cookie/+server.js new file mode 100644 index 000000000000..4e63c7ad877d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/set-cookie/+server.js @@ -0,0 +1,8 @@ +export function GET() { + const headers = new Headers(); + headers.append('set-cookie', 'answer=42; HttpOnly'); + headers.append('set-cookie', 'problem=comma, separated, values; HttpOnly'); + return new Response(undefined, { + headers + }); +} diff --git a/packages/kit/test/apps/basics/src/routes/set-cookie/index.js b/packages/kit/test/apps/basics/src/routes/set-cookie/index.js deleted file mode 100644 index cf84dd71a943..000000000000 --- a/packages/kit/test/apps/basics/src/routes/set-cookie/index.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - headers: { - 'set-cookie': ['answer=42; HttpOnly', 'problem=comma, separated, values; HttpOnly'] - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/index.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/index.svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/dynamic/[slug].js b/packages/kit/test/apps/basics/src/routes/shadowed/dynamic/[slug]/+page.server.js similarity index 75% rename from packages/kit/test/apps/basics/src/routes/shadowed/dynamic/[slug].js rename to packages/kit/test/apps/basics/src/routes/shadowed/dynamic/[slug]/+page.server.js index c87687948469..63f0d701be9c 100644 --- a/packages/kit/test/apps/basics/src/routes/shadowed/dynamic/[slug].js +++ b/packages/kit/test/apps/basics/src/routes/shadowed/dynamic/[slug]/+page.server.js @@ -1,6 +1,4 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET({ params }) { - return { - body: params - }; + return params; } diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/dynamic/[slug].svelte b/packages/kit/test/apps/basics/src/routes/shadowed/dynamic/[slug]/+page.svelte similarity index 54% rename from packages/kit/test/apps/basics/src/routes/shadowed/dynamic/[slug].svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/dynamic/[slug]/+page.svelte index 5101e9c07f18..5f219f39cda2 100644 --- a/packages/kit/test/apps/basics/src/routes/shadowed/dynamic/[slug].svelte +++ b/packages/kit/test/apps/basics/src/routes/shadowed/dynamic/[slug]/+page.svelte @@ -1,9 +1,9 @@ -

slug: {slug}

+

slug: {data.slug}

foo bar diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/error-get/+page.server.js b/packages/kit/test/apps/basics/src/routes/shadowed/error-get/+page.server.js new file mode 100644 index 000000000000..4fc26b4ce11d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/error-get/+page.server.js @@ -0,0 +1,5 @@ +import { error } from '@sveltejs/kit/data'; + +export function GET() { + throw error(404, undefined); +} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/error-get.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/error-get/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/error-get.svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/error-get/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/error-post.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/error-post.svelte deleted file mode 100644 index 2886e86d0808..000000000000 --- a/packages/kit/test/apps/basics/src/routes/shadowed/error-post.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - -

{get_message} / {post_message}

-

status: {$page.status}

diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/error-post.js b/packages/kit/test/apps/basics/src/routes/shadowed/error-post/+page.server.js similarity index 78% rename from packages/kit/test/apps/basics/src/routes/shadowed/error-post.js rename to packages/kit/test/apps/basics/src/routes/shadowed/error-post/+page.server.js index 51b826ed36a6..6972a2f1c6c1 100644 --- a/packages/kit/test/apps/basics/src/routes/shadowed/error-post.js +++ b/packages/kit/test/apps/basics/src/routes/shadowed/error-post/+page.server.js @@ -1,8 +1,6 @@ export function GET() { return { - body: { - get_message: 'hello from get' - } + get_message: 'hello from get' }; } @@ -11,7 +9,7 @@ export async function POST({ request }) { return { status: 400, - body: { + errors: { post_message: `echo: ${data.get('message')}` } }; diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/error-post/+page.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/error-post/+page.svelte new file mode 100644 index 000000000000..040611ed374d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/error-post/+page.svelte @@ -0,0 +1,9 @@ + + +

{data.get_message} / {errors.post_message}

+

status: {$page.status}

diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/missing-get/index.js b/packages/kit/test/apps/basics/src/routes/shadowed/missing-get/+page.server.js similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/missing-get/index.js rename to packages/kit/test/apps/basics/src/routes/shadowed/missing-get/+page.server.js diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/missing-get/index.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/missing-get/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/missing-get/index.svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/missing-get/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/no-get.js b/packages/kit/test/apps/basics/src/routes/shadowed/no-get/+page.server.js similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/no-get.js rename to packages/kit/test/apps/basics/src/routes/shadowed/no-get/+page.server.js diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/no-get.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/no-get/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/no-get.svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/no-get/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.js deleted file mode 100644 index 0032fd788dd1..000000000000 --- a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.js +++ /dev/null @@ -1,9 +0,0 @@ -export function GET() { - return { - status: 302, - headers: { - location: '/shadowed/redirected', - 'set-cookie': 'shadow-redirect=happy' - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie/+page.server.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie/+page.server.js new file mode 100644 index 000000000000..c206b829646c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie/+page.server.js @@ -0,0 +1,6 @@ +import { redirect } from '@sveltejs/kit/data'; + +export function GET({ setHeaders }) { + setHeaders({ 'set-cookie': 'shadow-redirect=happy' }); + throw redirect(302, '/shadowed/redirected'); +} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get.js deleted file mode 100644 index ff759e497edc..000000000000 --- a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get.js +++ /dev/null @@ -1,8 +0,0 @@ -export function GET() { - return { - status: 302, - headers: { - location: '/shadowed/redirected' - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get/+page.server.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get/+page.server.js new file mode 100644 index 000000000000..8997c0e1776a --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get/+page.server.js @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit/data'; + +export function GET() { + throw redirect(302, '/shadowed/redirected'); +} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/redirect-get.svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/redirect-get/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.js deleted file mode 100644 index c8a25b0d6a2f..000000000000 --- a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.js +++ /dev/null @@ -1,9 +0,0 @@ -export function POST() { - return { - status: 302, - headers: { - location: '/shadowed/redirected', - 'set-cookie': 'shadow-redirect=happy' - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie/+page.server.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie/+page.server.js new file mode 100644 index 000000000000..5d75803c4e65 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie/+page.server.js @@ -0,0 +1,6 @@ +import { redirect } from '@sveltejs/kit/data'; + +export function POST({ setHeaders }) { + setHeaders({ 'set-cookie': 'shadow-redirect=happy' }); + throw redirect(302, '/shadowed/redirected'); +} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post.js deleted file mode 100644 index 937f66a0afcd..000000000000 --- a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post.js +++ /dev/null @@ -1,8 +0,0 @@ -export function POST() { - return { - status: 302, - headers: { - location: '/shadowed/redirected' - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post/+page.server.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post/+page.server.js new file mode 100644 index 000000000000..dbf002e6171c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post/+page.server.js @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit/data'; + +export function POST() { + throw redirect(302, '/shadowed/redirected'); +} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/redirect-post.svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/redirect-post/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect/index.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirect/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/redirect/index.svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/redirect/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect/[a].js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect/[a].js deleted file mode 100644 index fa153fd1f8a7..000000000000 --- a/packages/kit/test/apps/basics/src/routes/shadowed/redirect/[a].js +++ /dev/null @@ -1,8 +0,0 @@ -export function GET() { - return { - status: 302, - headers: { - location: '/shadowed/redirect/c' - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect/[a]/+page.server.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect/[a]/+page.server.js new file mode 100644 index 000000000000..8a75f89f59de --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect/[a]/+page.server.js @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit/data'; + +export function GET() { + throw redirect(302, '/shadowed/redirect/c'); +} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect/[a].svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirect/[a]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/redirect/[a].svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/redirect/[a]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect/[b].svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirect/[b]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/redirect/[b].svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/redirect/[b]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect/c.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirect/c/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/redirect/c.svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/redirect/c/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirected.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirected.js deleted file mode 100644 index ace2acc46c30..000000000000 --- a/packages/kit/test/apps/basics/src/routes/shadowed/redirected.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - status: 'successful' - } - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirected.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirected.svelte deleted file mode 100644 index 97ba078a78db..000000000000 --- a/packages/kit/test/apps/basics/src/routes/shadowed/redirected.svelte +++ /dev/null @@ -1,6 +0,0 @@ - - -

Redirection was {status}

diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/error-get.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirected/+page.server.js similarity index 63% rename from packages/kit/test/apps/basics/src/routes/shadowed/error-get.js rename to packages/kit/test/apps/basics/src/routes/shadowed/redirected/+page.server.js index ef4a8ef17cf6..f18aa4f685f4 100644 --- a/packages/kit/test/apps/basics/src/routes/shadowed/error-get.js +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirected/+page.server.js @@ -1,5 +1,5 @@ export function GET() { return { - status: 404 + status: 'successful' }; } diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirected/+page.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirected/+page.svelte new file mode 100644 index 000000000000..a81e7cb0e040 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirected/+page.svelte @@ -0,0 +1,6 @@ + + +

Redirection was {data.status}

diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/same-render-entry.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/same-render-entry/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/shadowed/same-render-entry.svelte rename to packages/kit/test/apps/basics/src/routes/shadowed/same-render-entry/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/same-render.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/same-render.svelte deleted file mode 100644 index d3cc398cd527..000000000000 --- a/packages/kit/test/apps/basics/src/routes/shadowed/same-render.svelte +++ /dev/null @@ -1,5 +0,0 @@ - -

URL: {url}

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/same-render.js b/packages/kit/test/apps/basics/src/routes/shadowed/same-render/+page.server.js similarity index 66% rename from packages/kit/test/apps/basics/src/routes/shadowed/same-render.js rename to packages/kit/test/apps/basics/src/routes/shadowed/same-render/+page.server.js index 92af1201206c..5913a34eb8e1 100644 --- a/packages/kit/test/apps/basics/src/routes/shadowed/same-render.js +++ b/packages/kit/test/apps/basics/src/routes/shadowed/same-render/+page.server.js @@ -1,4 +1,4 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET({ url }) { - return { body: { url: url.toString() } }; + return { url: url.toString() }; } diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/same-render/+page.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/same-render/+page.svelte new file mode 100644 index 000000000000..7d1333ba1413 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/same-render/+page.svelte @@ -0,0 +1,5 @@ + +

URL: {data.url}

diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/simple.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/simple.svelte deleted file mode 100644 index f5f46beb9dcf..000000000000 --- a/packages/kit/test/apps/basics/src/routes/shadowed/simple.svelte +++ /dev/null @@ -1,6 +0,0 @@ - - -

The answer is {answer}

diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/simple.js b/packages/kit/test/apps/basics/src/routes/shadowed/simple/+page.server.js similarity index 72% rename from packages/kit/test/apps/basics/src/routes/shadowed/simple.js rename to packages/kit/test/apps/basics/src/routes/shadowed/simple/+page.server.js index 7492c9d60550..c4cdd89104e4 100644 --- a/packages/kit/test/apps/basics/src/routes/shadowed/simple.js +++ b/packages/kit/test/apps/basics/src/routes/shadowed/simple/+page.server.js @@ -1,8 +1,6 @@ /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET({ locals }) { return { - body: { - answer: locals.answer - } + answer: locals.answer }; } diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/simple/+page.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/simple/+page.svelte new file mode 100644 index 000000000000..847b2497ea27 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/simple/+page.svelte @@ -0,0 +1,6 @@ + + +

The answer is {data.answer}

diff --git a/packages/kit/test/apps/basics/src/routes/src/[...anything].js b/packages/kit/test/apps/basics/src/routes/src/[...anything].js deleted file mode 100644 index 2186b0cf4c94..000000000000 --- a/packages/kit/test/apps/basics/src/routes/src/[...anything].js +++ /dev/null @@ -1,6 +0,0 @@ -/** @type {import('./__types/[...anything]').RequestHandler} */ -export function GET() { - return { - body: 'dynamically rendered file' - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/src/[...anything]/+server.js b/packages/kit/test/apps/basics/src/routes/src/[...anything]/+server.js new file mode 100644 index 000000000000..8235726aacf7 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/src/[...anything]/+server.js @@ -0,0 +1,4 @@ +/** @type {import('./$types').RequestHandler} */ +export function GET() { + return new Response('dynamically rendered file'); +} diff --git a/packages/kit/test/apps/basics/src/routes/static.svelte b/packages/kit/test/apps/basics/src/routes/static/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/static.svelte rename to packages/kit/test/apps/basics/src/routes/static/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/store/index.svelte b/packages/kit/test/apps/basics/src/routes/store/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/store/index.svelte rename to packages/kit/test/apps/basics/src/routes/store/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/store/navigating/__layout.svelte b/packages/kit/test/apps/basics/src/routes/store/navigating/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/store/navigating/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/store/navigating/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/store/navigating/a.svelte b/packages/kit/test/apps/basics/src/routes/store/navigating/a/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/store/navigating/a.svelte rename to packages/kit/test/apps/basics/src/routes/store/navigating/a/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/store/navigating/b.svelte b/packages/kit/test/apps/basics/src/routes/store/navigating/b.svelte deleted file mode 100644 index 23aaf604c196..000000000000 --- a/packages/kit/test/apps/basics/src/routes/store/navigating/b.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - -

b

diff --git a/packages/kit/test/apps/basics/src/routes/store/navigating/b/+page.js b/packages/kit/test/apps/basics/src/routes/store/navigating/b/+page.js new file mode 100644 index 000000000000..7b1c80573a3f --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/store/navigating/b/+page.js @@ -0,0 +1,5 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + await new Promise((f) => setTimeout(f, 50)); + return {}; +} diff --git a/packages/kit/test/apps/basics/src/routes/store/navigating/b/+page.svelte b/packages/kit/test/apps/basics/src/routes/store/navigating/b/+page.svelte new file mode 100644 index 000000000000..db2e4f2757c0 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/store/navigating/b/+page.svelte @@ -0,0 +1 @@ +

b

diff --git a/packages/kit/test/apps/basics/src/routes/store/navigating/c.svelte b/packages/kit/test/apps/basics/src/routes/store/navigating/c.svelte deleted file mode 100644 index 1f77e0d41c38..000000000000 --- a/packages/kit/test/apps/basics/src/routes/store/navigating/c.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - -

c

diff --git a/packages/kit/test/apps/basics/src/routes/store/navigating/c/+page.js b/packages/kit/test/apps/basics/src/routes/store/navigating/c/+page.js new file mode 100644 index 000000000000..dbc433ad4c42 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/store/navigating/c/+page.js @@ -0,0 +1,5 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load() { + await new Promise((f) => setTimeout(f, 1000)); + return {}; +} diff --git a/packages/kit/test/apps/basics/src/routes/store/navigating/c/+page.svelte b/packages/kit/test/apps/basics/src/routes/store/navigating/c/+page.svelte new file mode 100644 index 000000000000..2b98ed2e7228 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/store/navigating/c/+page.svelte @@ -0,0 +1 @@ +

c

diff --git a/packages/kit/test/apps/basics/src/routes/store/result.svelte b/packages/kit/test/apps/basics/src/routes/store/result/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/store/result.svelte rename to packages/kit/test/apps/basics/src/routes/store/result/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/store/stuff/+error.svelte b/packages/kit/test/apps/basics/src/routes/store/stuff/+error.svelte new file mode 100644 index 000000000000..8266d8b126e7 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/store/stuff/+error.svelte @@ -0,0 +1,20 @@ + + + + + diff --git a/packages/kit/test/apps/basics/src/routes/store/stuff/+layout.js b/packages/kit/test/apps/basics/src/routes/store/stuff/+layout.js new file mode 100644 index 000000000000..5d007f4b6557 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/store/stuff/+layout.js @@ -0,0 +1,6 @@ +export function load() { + return { + name: 'SvelteKit', + value: 123 + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/store/stuff/__layout.svelte b/packages/kit/test/apps/basics/src/routes/store/stuff/+layout.svelte similarity index 66% rename from packages/kit/test/apps/basics/src/routes/store/stuff/__layout.svelte rename to packages/kit/test/apps/basics/src/routes/store/stuff/+layout.svelte index 8d1245976f1d..27ac806ded8a 100644 --- a/packages/kit/test/apps/basics/src/routes/store/stuff/__layout.svelte +++ b/packages/kit/test/apps/basics/src/routes/store/stuff/+layout.svelte @@ -1,14 +1,3 @@ - - diff --git a/packages/kit/test/apps/basics/src/routes/store/stuff/[item].svelte b/packages/kit/test/apps/basics/src/routes/store/stuff/[item].svelte deleted file mode 100644 index fa9f0b950739..000000000000 --- a/packages/kit/test/apps/basics/src/routes/store/stuff/[item].svelte +++ /dev/null @@ -1,16 +0,0 @@ - diff --git a/packages/kit/test/apps/basics/src/routes/store/stuff/[item]/+page.js b/packages/kit/test/apps/basics/src/routes/store/stuff/[item]/+page.js new file mode 100644 index 000000000000..253a93d6da42 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/store/stuff/[item]/+page.js @@ -0,0 +1,24 @@ +import { error } from '@sveltejs/kit/data'; + +/** @type {import('@sveltejs/kit').Load} */ +export function load({ params }) { + if (params.item === 'xxx') { + throw new Error('Params = xxx'); + } else if (param.item === 'yyy') { + throw error(500, 'Params = yyy'); + } else { + return { + page: params.item, + value: 456 + }; + } + + // TODO check test; old code + // return { + // stuff: { + // page: params.item, + // value: 456 + // }, + // error: params.item === 'yyy' ? 'Params = yyy' : undefined + // }; +} diff --git a/packages/kit/test/apps/basics/src/routes/store/stuff/[item]/+page.svelte b/packages/kit/test/apps/basics/src/routes/store/stuff/[item]/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/store/stuff/__error.svelte b/packages/kit/test/apps/basics/src/routes/store/stuff/__error.svelte deleted file mode 100644 index 30e4eac8f3e1..000000000000 --- a/packages/kit/test/apps/basics/src/routes/store/stuff/__error.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/packages/kit/test/apps/basics/src/routes/store/stuff/foo.svelte b/packages/kit/test/apps/basics/src/routes/store/stuff/foo.svelte deleted file mode 100644 index 50db1f7d25a3..000000000000 --- a/packages/kit/test/apps/basics/src/routes/store/stuff/foo.svelte +++ /dev/null @@ -1,32 +0,0 @@ - - - - -

stuff - foo

-

Number prop: {number}

-store diff --git a/packages/kit/test/apps/basics/src/routes/store/stuff/foo/+page.js b/packages/kit/test/apps/basics/src/routes/store/stuff/foo/+page.js new file mode 100644 index 000000000000..5e2986302cfc --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/store/stuff/foo/+page.js @@ -0,0 +1,18 @@ +let is_first = true; + +export function load({ url }) { + if (url.searchParams.get('reset')) { + is_first = true; + return {}; + } + + if (is_first) { + is_first = false; + throw new Error('uh oh'); + } + + return { + foo: true + number: 2 + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/store/stuff/foo/+page.svelte b/packages/kit/test/apps/basics/src/routes/store/stuff/foo/+page.svelte new file mode 100644 index 000000000000..5d4378ac043d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/store/stuff/foo/+page.svelte @@ -0,0 +1,7 @@ + + +

stuff - foo

+

Number prop: {data.number}

+store diff --git a/packages/kit/test/apps/basics/src/routes/transform-page-chunk/+page.svelte b/packages/kit/test/apps/basics/src/routes/transform-page-chunk/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/unsafe-replacement/+page.js b/packages/kit/test/apps/basics/src/routes/unsafe-replacement/+page.js new file mode 100644 index 000000000000..a690410af77b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/unsafe-replacement/+page.js @@ -0,0 +1,3 @@ +export function load() { + return { escape: '$&' }; +} diff --git a/packages/kit/test/apps/basics/src/routes/unsafe-replacement/+page.svelte b/packages/kit/test/apps/basics/src/routes/unsafe-replacement/+page.svelte new file mode 100644 index 000000000000..5c1daac8592e --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/unsafe-replacement/+page.svelte @@ -0,0 +1,6 @@ + + +$& {data.escape} diff --git a/packages/kit/test/apps/basics/src/routes/unsafe-replacement/index.svelte b/packages/kit/test/apps/basics/src/routes/unsafe-replacement/index.svelte deleted file mode 100644 index 30072a1093a8..000000000000 --- a/packages/kit/test/apps/basics/src/routes/unsafe-replacement/index.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - - - -$& {escape} diff --git a/packages/kit/test/apps/basics/src/routes/use-action/index.svelte b/packages/kit/test/apps/basics/src/routes/use-action/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/use-action/index.svelte rename to packages/kit/test/apps/basics/src/routes/use-action/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/use-action/focus-and-scroll.svelte b/packages/kit/test/apps/basics/src/routes/use-action/focus-and-scroll/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/use-action/focus-and-scroll.svelte rename to packages/kit/test/apps/basics/src/routes/use-action/focus-and-scroll/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/xss.json/+server.js b/packages/kit/test/apps/basics/src/routes/xss.json/+server.js new file mode 100644 index 000000000000..a0f4517b7805 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/xss.json/+server.js @@ -0,0 +1,8 @@ +export function GET() { + const user = { + name: '' + }; + return new Response(JSON.stringify(user), { + headers: { 'content-type': 'application/json; charset=utf-8' } + }); +} diff --git a/packages/kit/test/apps/basics/src/routes/xss/+page.js b/packages/kit/test/apps/basics/src/routes/xss/+page.js new file mode 100644 index 000000000000..bebc49e0026f --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/xss/+page.js @@ -0,0 +1,6 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const res = await fetch('/xss.json'); + const user = await res.json(); + return { user }; +} diff --git a/packages/kit/test/apps/basics/src/routes/xss/+page.svelte b/packages/kit/test/apps/basics/src/routes/xss/+page.svelte new file mode 100644 index 000000000000..5b214e997106 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/xss/+page.svelte @@ -0,0 +1,6 @@ + + +

user.name is {data.user.name}

diff --git a/packages/kit/test/apps/basics/src/routes/xss/[path].svelte b/packages/kit/test/apps/basics/src/routes/xss/[path]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/xss/[path].svelte rename to packages/kit/test/apps/basics/src/routes/xss/[path]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/xss/index.json.js b/packages/kit/test/apps/basics/src/routes/xss/index.json.js deleted file mode 100644 index 565fbb70b9c6..000000000000 --- a/packages/kit/test/apps/basics/src/routes/xss/index.json.js +++ /dev/null @@ -1,9 +0,0 @@ -export function GET() { - const user = { - name: '' - }; - - return { - body: user - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/xss/index.svelte b/packages/kit/test/apps/basics/src/routes/xss/index.svelte deleted file mode 100644 index 3ddbb25c8c2c..000000000000 --- a/packages/kit/test/apps/basics/src/routes/xss/index.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - - -

user.name is {user.name}

diff --git a/packages/kit/test/apps/basics/src/routes/xss/query.svelte b/packages/kit/test/apps/basics/src/routes/xss/query.svelte deleted file mode 100644 index aecb5a2e5180..000000000000 --- a/packages/kit/test/apps/basics/src/routes/xss/query.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - - - -
{JSON.stringify(values)}
-
{JSON.stringify(to_pojo($page.url.searchParams))}
diff --git a/packages/kit/test/apps/basics/src/routes/xss/query/+page.js b/packages/kit/test/apps/basics/src/routes/xss/query/+page.js new file mode 100644 index 000000000000..bd73fc6f3ac8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/xss/query/+page.js @@ -0,0 +1,21 @@ +/** @typedef {Record} Query */ + +/** @param {URLSearchParams} query */ +function to_pojo(query) { + /** @type {Query}*/ + const values = {}; + + query.forEach((value, key) => { + if (!(key in values)) values[key] = []; + values[key].push(value); + }); + + return values; +} + +/** @type {import('@sveltejs/kit').Load} */ +export function load({ url }) { + return { + values: to_pojo(url.searchParams) + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/xss/query/+page.svelte b/packages/kit/test/apps/basics/src/routes/xss/query/+page.svelte new file mode 100644 index 000000000000..9338a442fcaf --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/xss/query/+page.svelte @@ -0,0 +1,9 @@ + + +
{JSON.stringify(data.values)}
+
{JSON.stringify(to_pojo($page.url.searchParams))}
diff --git a/packages/kit/test/apps/basics/src/routes/xss/shadow.svelte b/packages/kit/test/apps/basics/src/routes/xss/shadow.svelte deleted file mode 100644 index 8ad2b30f8e4f..000000000000 --- a/packages/kit/test/apps/basics/src/routes/xss/shadow.svelte +++ /dev/null @@ -1,6 +0,0 @@ - -

user.name is {user.name}

- diff --git a/packages/kit/test/apps/basics/src/routes/xss/shadow.js b/packages/kit/test/apps/basics/src/routes/xss/shadow/+page.server.js similarity index 83% rename from packages/kit/test/apps/basics/src/routes/xss/shadow.js rename to packages/kit/test/apps/basics/src/routes/xss/shadow/+page.server.js index 91caaf8795c3..84ca34d49f6b 100644 --- a/packages/kit/test/apps/basics/src/routes/xss/shadow.js +++ b/packages/kit/test/apps/basics/src/routes/xss/shadow/+page.server.js @@ -3,7 +3,5 @@ export function GET() { const user = { name: '' }; - return { - body: { user } - }; + return { user }; } diff --git a/packages/kit/test/apps/basics/src/routes/xss/shadow/+page.svelte b/packages/kit/test/apps/basics/src/routes/xss/shadow/+page.svelte new file mode 100644 index 000000000000..d6061b1c57ca --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/xss/shadow/+page.svelte @@ -0,0 +1,5 @@ + +

user.name is {data.user.name}

From 6c9489d625625f906fddca16593eb35da72c5ffa Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 2 Aug 2022 14:39:42 +0200 Subject: [PATCH 027/172] fix regex, dont show props message on error page, more sophisticated error/redirect checks, set-cookie suggestion --- packages/migrate/migrations/routes/index.js | 75 ++++++++++++++------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js index 40c5debf3b12..4e52d7343001 100644 --- a/packages/migrate/migrations/routes/index.js +++ b/packages/migrate/migrations/routes/index.js @@ -107,6 +107,7 @@ export async function migrate() { // file is a component const bare = basename.slice(0, -svelte_ext.length); const [name, layout] = bare.split('@'); + const is_error_page = bare === '__error'; /** * Whether file should be moved to a subdirectory — e.g. `src/routes/about.svelte` @@ -128,7 +129,7 @@ export async function migrate() { if (bare.startsWith('__layout')) { sibling = renamed + '+layout'; renamed += '+' + bare.slice(2); // account for __layout-foo etc - } else if (bare === '__error') { + } else if (is_error_page) { renamed += '+error'; // no sibling, because error files can no longer have load } else if (name === 'index') { @@ -143,16 +144,16 @@ export async function migrate() { renamed += svelte_ext; - const { module, main } = extract_load(content, bare === '__error', move_to_directory); + const { module, main } = extract_load(content, is_error_page, move_to_directory); - const edited = main.replace(/([^]+)<\/script>/, (match, attrs, content) => { + const edited = main.replace(/([^]+?)<\/script>/, (match, attrs, content) => { const indent = guess_indent(content) ?? ''; if (move_to_directory) { content = adjust_imports(content); } - if (/export/.test(content)) { + if (!is_error_page && /export/.test(content)) { content = `\n${indent}${error('Add data prop', '3292707')}\n${content}`; } @@ -169,7 +170,7 @@ export async function migrate() { // if component has a `; @@ -172,7 +178,7 @@ export async function migrate() { if (module) { const ext = /]+?lang=['"](ts|typescript)['"][^]*?>/.test(module) ? '.ts' : '.js'; const injected = /load/.test(module) - ? `${error('Update load function', '3292693')}\n\n` + ? `${error('Update load function', TASK_PAGE_LOAD)}\n\n` : ''; const content = migrate_load(dedent(move_to_directory ? adjust_imports(module) : module)); @@ -211,7 +217,10 @@ export async function migrate() { renamed = `${file.slice(0, -basename.length)}${type}${module_ext}`; } - const injected = error(`Update ${type}.js`, is_page_endpoint ? '3292699' : '3292701'); + const injected = error( + `Update ${type}.js`, + is_page_endpoint ? TASK_PAGE_ENDPOINT : TASK_STANDALONE_ENDPOINT + ); // Standalone index endpoints are edge case enough that we don't spend time on trying to update all the imports correctly const edited = injected + @@ -250,7 +259,7 @@ function extract_load(content, is_error, moved) { // special case — load is no longer supported in load const indent = guess_indent(contents) ?? ''; - contents = contents.replace(/^(.+)/gm, '// $1'); + contents = comment(contents); const body = `\n${indent}${error('Replace error load function', '3293209')}\n${contents}`; return `${body}`; @@ -258,8 +267,8 @@ function extract_load(content, is_error, moved) { module = contents.replace(/^\n/, ''); return ``; } ); @@ -267,6 +276,13 @@ function extract_load(content, is_error, moved) { return { module, main }; } +/** + * @param {string} contents + */ +function comment(contents) { + return contents.replace(/^(.+)/gm, '// $1'); +} + /** @param {string} content */ function adjust_imports(content) { try { @@ -422,6 +438,23 @@ function guess_indent(content) { return new Array(min + 1).join(' '); } +/** + * @param {string} content + * @param {string} indent + */ +function indent_with(content, indent) { + return indent + content.split('\n').join('\n' + indent); +} + +/** + * @param {string} content + * @param {number} offset + */ +function indent_at_line(content, offset) { + const substr = content.substring(content.lastIndexOf('\n', offset) + 1, offset); + return /\s*/.exec(substr)[0]; +} + /** * @param {string} content * */ @@ -439,53 +472,48 @@ function migrate_load(content) { /** @param {ts.Node} node */ function walk(node) { - if ( - ts.isReturnStatement(node) && - is_directly_in_exported_fn(node, ['load']) && - node.expression && - ts.isObjectLiteralExpression(node.expression) - ) { - if (contains_only(node.expression, ['props'])) { - str.overwrite( - node.getStart(), - node.getEnd(), - automigration_comment(node) + - 'return ' + - get_prop_initializer_text(node.expression.properties, 'props') - ); - } else if ( - contains_only(node.expression, ['redirect', 'status']) && - ((Number(get_prop_initializer_text(node.expression.properties, 'status')) > 300 && - Number(get_prop_initializer_text(node.expression.properties, 'status')) < 310) || - contains_only(node.expression, ['redirect'])) - ) { - str.overwrite( - node.getStart(), - node.getEnd(), - automigration_comment(node) + + if (ts.isReturnStatement(node) && is_directly_in_exported_fn(node, ['load'])) { + if (node.expression && ts.isObjectLiteralExpression(node.expression)) { + if (contains_only(node.expression, ['props'])) { + automigration( + node, + str, + 'return ' + dedent(get_prop_initializer_text(node.expression.properties, 'props')) + ); + } else if ( + contains_only(node.expression, ['redirect', 'status']) && + ((Number(get_prop_initializer_text(node.expression.properties, 'status')) > 300 && + Number(get_prop_initializer_text(node.expression.properties, 'status')) < 310) || + contains_only(node.expression, ['redirect'])) + ) { + automigration( + node, + str, 'throw redirect(' + - get_prop_initializer_text(node.expression.properties, 'status') + - ', ' + - get_prop_initializer_text(node.expression.properties, 'redirect') + - ');' - ); - imports.add('redirect'); - } else if ( - contains_only(node.expression, ['error', 'status']) && - (Number(get_prop_initializer_text(node.expression.properties, 'status')) > 399 || - contains_only(node.expression, ['error'])) - ) { - str.overwrite( - node.getStart(), - node.getEnd(), - automigration_comment(node) + + get_prop_initializer_text(node.expression.properties, 'status') + + ', ' + + get_prop_initializer_text(node.expression.properties, 'redirect') + + ');' + ); + imports.add('redirect'); + } else if ( + contains_only(node.expression, ['error', 'status']) && + (Number(get_prop_initializer_text(node.expression.properties, 'status')) > 399 || + contains_only(node.expression, ['error'])) + ) { + automigration( + node, + str, 'throw error(' + - get_prop_initializer_text(node.expression.properties, 'status') + - ', ' + - get_prop_initializer_text(node.expression.properties, 'error') + - ');' - ); - imports.add('error'); + get_prop_initializer_text(node.expression.properties, 'status') + + ', ' + + get_prop_initializer_text(node.expression.properties, 'error') + + ');' + ); + imports.add('error'); + } + } else { + manual_return_migration(node, str, TASK_PAGE_LOAD); } } @@ -519,20 +547,25 @@ function migrate_page_endpoint(content) { /** @param {ts.Node} node */ function walk(node) { - if ( + if (ts.isReturnStatement(node) && is_directly_in_exported_fn(node, ['GET'])) { + if ( + node.expression && + ts.isObjectLiteralExpression(node.expression) && + contains_only(node.expression, ['body']) + ) { + automigration( + node, + str, + 'return ' + dedent(get_prop_initializer_text(node.expression.properties, 'body')) + ); + } else { + manual_return_migration(node, str, TASK_PAGE_ENDPOINT); + } + } else if ( ts.isReturnStatement(node) && - is_directly_in_exported_fn(node, ['GET']) && - node.expression && - ts.isObjectLiteralExpression(node.expression) && - contains_only(node.expression, ['body']) + is_directly_in_exported_fn(node, ['PUT', 'POST', 'PATCH', 'DELETE']) ) { - str.overwrite( - node.getStart(), - node.getEnd(), - automigration_comment(node) + - 'return ' + - get_prop_initializer_text(node.expression.properties, 'body') - ); + manual_return_migration(node, str, TASK_PAGE_ENDPOINT); } node.forEachChild(walk); @@ -564,59 +597,81 @@ function migrate_standalone(content) { function walk(node) { if ( ts.isReturnStatement(node) && - is_directly_in_exported_fn(node, ['GET', 'PUT', 'POST', 'DELETE']) && - node.expression && - ts.isObjectLiteralExpression(node.expression) && - contains_only(node.expression, ['body', 'status', 'headers'], true) + is_directly_in_exported_fn(node, ['GET', 'PUT', 'POST', 'PATH', 'DELETE']) ) { - const body = get_prop(node.expression.properties, 'body'); - const headers = get_prop(node.expression.properties, 'headers'); - const status = get_prop(node.expression.properties, 'status'); - const headers_str = - body && - (!ts.isPropertyAssignment(body) || !is_string_like(body.initializer)) && - (!headers || !headers.getText().includes('content-type')) - ? `headers: { 'content-type': 'application/json; charset=utf-8'${ - headers - ? ', ' + - (ts.isPropertyAssignment(headers) - ? remove_outer_braces( - get_prop_initializer_text(node.expression.properties, 'headers') - ) - : '...headers') - : '' - } }` - : headers - ? headers.getText() - : undefined; - - const body_str = get_prop_initializer_text(node.expression.properties, 'body'); - const response_body = body - ? (!ts.isPropertyAssignment(body) || - !is_string_like(body.initializer) || - (headers && headers.getText().includes('application/json'))) && - (!headers || - !headers.getText().includes('content-type') || - headers.getText().includes('application/json')) && - !body_str.startsWith('JSON.stringify') - ? // prettier-ignore - `/* double-check if value is a POJO, else remove outer JSON.stringify and the content-type header */ JSON.stringify(${body_str})` - : body_str - : 'undefined'; - - const response_init = - headers_str || status - ? // prettier-ignore - ', ' + - (/['"]set-cookie['"]:\s*\[/.test(headers_str) ? '\n// set-cookie with multiple values needs a different conversion, see the link at the top for more info\n' : '') + - `{ ${headers_str ? `${headers_str}${status ? ', ' : ''}` : ''}${status ? status.getText() : ''} }` - : ''; + if ( + node.expression && + ts.isObjectLiteralExpression(node.expression) && + contains_only(node.expression, ['body', 'status', 'headers'], true) + ) { + const body = get_prop(node.expression.properties, 'body'); + const headers = get_prop(node.expression.properties, 'headers'); + const status = get_prop(node.expression.properties, 'status'); - str.overwrite( - node.getStart(), - node.getEnd(), - automigration_comment(node) + `\nreturn new Response(${response_body}${response_init});` - ); + const headers_has_multiple_cookies = /['"]set-cookie['"]:\s*\[/.test( + headers?.getText()?.toLowerCase() + ); + const is_safe_transformation = + (!body || + (!ts.isShorthandPropertyAssignment(body) && + ts.isObjectLiteralExpression(body.initializer))) && + (!headers || + ((!headers.getText().toLowerCase().includes('content-type') || + headers.getText().includes('application/json')) && + !headers_has_multiple_cookies)); + + const headers_str = + body && + (!ts.isPropertyAssignment(body) || !is_string_like(body.initializer)) && + (!headers || !headers.getText().toLowerCase().includes('content-type')) + ? `headers: { 'content-type': 'application/json; charset=utf-8'${ + headers + ? ', ' + + (ts.isPropertyAssignment(headers) + ? remove_outer_braces( + get_prop_initializer_text(node.expression.properties, 'headers') + ) + : '...headers') + : '' + } }` + : headers + ? headers.getText() + : undefined; + + const body_str = get_prop_initializer_text(node.expression.properties, 'body'); + const response_body = body + ? (!ts.isPropertyAssignment(body) || + !is_string_like(body.initializer) || + (headers && headers.getText().includes('application/json'))) && + (!headers || + !headers.getText().toLowerCase().includes('content-type') || + headers.getText().includes('application/json')) && + !body_str.startsWith('JSON.stringify') + ? `JSON.stringify(${body_str})` + : body_str + : 'undefined'; + + const response_init = + headers_str || status + ? // prettier-ignore + ', ' + + (headers_has_multiple_cookies ? '\n// set-cookie with multiple values needs a different conversion, see the link at the top for more info\n' : '') + + `{ ${headers_str ? `${headers_str}${status ? ', ' : ''}` : ''}${status ? status.getText() : ''} }` + : ''; + + if (is_safe_transformation) { + automigration(node, str, `return new Response(${response_body}${response_init});`); + } else { + manual_return_migration( + node, + str, + TASK_STANDALONE_ENDPOINT, + `return new Response(${response_body}${response_init});` + ); + } + } else { + manual_return_migration(node, str, TASK_STANDALONE_ENDPOINT); + } } node.forEachChild(walk); @@ -649,13 +704,37 @@ function contains_only(node, valid_keys, allow_empty = false) { } /** + * * @param {ts.Node} node + * @param {MagicString} str + * @param {string} comment_nr + * @param {string} [suggestion] */ -function automigration_comment(node) { - return ( - '// @migration automigrated, check for correctness. Original:\n//' + - node.getText().split('\n').join('\n//') + - '\n' +function manual_return_migration(node, str, comment_nr, suggestion) { + str.prependLeft( + node.getStart(), + error('Migrate this return statement', comment_nr) + + '\n' + + (suggestion + ? indent_with( + comment(`Suggestion (check for correctness before using):\n${suggestion}`) + '\n', + indent_at_line(str.original, node.getStart()) + ) + : indent_at_line(str.original, node.getStart())) + ); +} + +/** + * + * @param {ts.Node} node + * @param {MagicString} str + * @param {string} migration + */ +function automigration(node, str, migration) { + str.overwrite( + node.getStart(), + node.getEnd(), + '// @migration automigrated\n' + indent_at_line(str.original, node.getStart()) + migration ); } @@ -721,7 +800,8 @@ function is_directly_in_exported_fn(node, fn_name) { } else if ( ts.isFunctionDeclaration(node) || ts.isVariableStatement(node) || - (ts.isArrowFunction(node) && !is_exported_fn(node.parent.parent.parent, fn_name)) + ((ts.isArrowFunction(node) || ts.isFunctionExpression(node)) && + !is_exported_fn(node.parent.parent.parent, fn_name)) ) { return false; } @@ -745,6 +825,22 @@ function is_exported_fn(node, fn_name) { node.modifiers?.[0]?.kind === ts.SyntaxKind.ExportKeyword && node.declarationList.declarations.length === 1 && ts.isIdentifier(node.declarationList.declarations[0].name) && - fn_name.includes(node.declarationList.declarations[0].name.text)) + fn_name.includes(node.declarationList.declarations[0].name.text)) || + // export { X } + ((ts.isVariableStatement(node) || ts.isFunctionDeclaration(node)) && + ts.isSourceFile(node.parent) && + node.parent.statements.some( + (statement) => + ts.isExportDeclaration(statement) && + // prettier-ignore + // @ts-ignore + statement.exportClause?.elements + ?.some( + // @ts-ignore + (child) => + ts.isExportSpecifier(child) && + ((!child.propertyName && fn_name.includes(child.name.text)) || fn_name.includes(child.propertyName.text)) + ) + )) ); } From 5e374281ab6cb515ace6ec71108388f75b35db1e Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 2 Aug 2022 18:06:05 +0200 Subject: [PATCH 032/172] shorten redirect/error if no second argument given --- packages/migrate/migrations/routes/index.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js index c9219df516cf..d7ba79f473e4 100644 --- a/packages/migrate/migrations/routes/index.js +++ b/packages/migrate/migrations/routes/index.js @@ -491,8 +491,9 @@ function migrate_load(content) { str, 'throw redirect(' + get_prop_initializer_text(node.expression.properties, 'status') + - ', ' + - get_prop_initializer_text(node.expression.properties, 'redirect') + + (get_prop_initializer_text(node.expression.properties, 'redirect') === 'undefined' + ? '' + : ', ' + get_prop_initializer_text(node.expression.properties, 'redirect')) + ');' ); imports.add('redirect'); @@ -506,8 +507,9 @@ function migrate_load(content) { str, 'throw error(' + get_prop_initializer_text(node.expression.properties, 'status') + - ', ' + - get_prop_initializer_text(node.expression.properties, 'error') + + (get_prop_initializer_text(node.expression.properties, 'error') === 'undefined' + ? '' + : ', ' + get_prop_initializer_text(node.expression.properties, 'error')) + ');' ); imports.add('error'); From de773ccd980c8c2b12f6814672d5d9e98c5dad65 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 2 Aug 2022 21:02:53 +0200 Subject: [PATCH 033/172] use git mv if available --- packages/migrate/migrations/routes/index.js | 39 ++++++++++++++++++--- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js index d7ba79f473e4..dae9a8b9707d 100644 --- a/packages/migrate/migrations/routes/index.js +++ b/packages/migrate/migrations/routes/index.js @@ -6,6 +6,7 @@ import prompts from 'prompts'; import ts from 'typescript'; import MagicString from 'magic-string'; import { pathToFileURL } from 'url'; +import { execSync } from 'child_process'; const TASK_STANDALONE_ENDPOINT = '3292701'; const TASK_PAGE_ENDPOINT = '3292699'; @@ -171,8 +172,7 @@ export async function migrate() { if (!fs.existsSync(dir)) fs.mkdirSync(dir); } - fs.unlinkSync(file); - fs.writeFileSync(renamed, edited); + move_file(file, renamed, edited); // if component has a + + + +

{data.paths.base}

+

{data.paths.assets}

+ + + +{#if n === 1} +

button has been clicked 1 time

+{/if} + + diff --git a/packages/kit/test/apps/options/source/pages/base/[slug].svelte b/packages/kit/test/apps/options/source/pages/base/[slug]/+page.svelte similarity index 100% rename from packages/kit/test/apps/options/source/pages/base/[slug].svelte rename to packages/kit/test/apps/options/source/pages/base/[slug]/+page.svelte diff --git a/packages/kit/test/apps/options/source/pages/base/index.svelte b/packages/kit/test/apps/options/source/pages/base/index.svelte deleted file mode 100644 index 08afa55450a7..000000000000 --- a/packages/kit/test/apps/options/source/pages/base/index.svelte +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - -

{data.base}

-

{data.assets}

- - - -{#if n === 1} -

button has been clicked 1 time

-{/if} - - diff --git a/packages/kit/test/apps/options/source/pages/csp/index.svelte b/packages/kit/test/apps/options/source/pages/csp/+page.svelte similarity index 100% rename from packages/kit/test/apps/options/source/pages/csp/index.svelte rename to packages/kit/test/apps/options/source/pages/csp/+page.svelte diff --git a/packages/kit/test/apps/options/source/pages/custom-extensions/__layout.svelte b/packages/kit/test/apps/options/source/pages/custom-extensions/+layout.svelte similarity index 100% rename from packages/kit/test/apps/options/source/pages/custom-extensions/__layout.svelte rename to packages/kit/test/apps/options/source/pages/custom-extensions/+layout.svelte diff --git a/packages/kit/test/apps/options/source/pages/custom-extensions/index.jesuslivesineveryone b/packages/kit/test/apps/options/source/pages/custom-extensions/+page.jesuslivesineveryone similarity index 100% rename from packages/kit/test/apps/options/source/pages/custom-extensions/index.jesuslivesineveryone rename to packages/kit/test/apps/options/source/pages/custom-extensions/+page.jesuslivesineveryone diff --git a/packages/kit/test/apps/options/source/pages/custom-extensions/[slug].svelte.md b/packages/kit/test/apps/options/source/pages/custom-extensions/[slug]/+page.svelte.md similarity index 100% rename from packages/kit/test/apps/options/source/pages/custom-extensions/[slug].svelte.md rename to packages/kit/test/apps/options/source/pages/custom-extensions/[slug]/+page.svelte.md diff --git a/packages/kit/test/apps/options/source/pages/custom-extensions/a.svelte b/packages/kit/test/apps/options/source/pages/custom-extensions/a/+page.svelte similarity index 100% rename from packages/kit/test/apps/options/source/pages/custom-extensions/a.svelte rename to packages/kit/test/apps/options/source/pages/custom-extensions/a/+page.svelte diff --git a/packages/kit/test/apps/options/source/pages/custom-extensions/const.whokilledthemuffinman b/packages/kit/test/apps/options/source/pages/custom-extensions/const/+page.whokilledthemuffinman similarity index 100% rename from packages/kit/test/apps/options/source/pages/custom-extensions/const.whokilledthemuffinman rename to packages/kit/test/apps/options/source/pages/custom-extensions/const/+page.whokilledthemuffinman diff --git a/packages/kit/test/apps/options/source/pages/custom-extensions/unsafe-replacement.svelte b/packages/kit/test/apps/options/source/pages/custom-extensions/unsafe-replacement/+page.svelte similarity index 100% rename from packages/kit/test/apps/options/source/pages/custom-extensions/unsafe-replacement.svelte rename to packages/kit/test/apps/options/source/pages/custom-extensions/unsafe-replacement/+page.svelte diff --git a/packages/kit/test/apps/options/source/pages/endpoint/+server.js b/packages/kit/test/apps/options/source/pages/endpoint/+server.js new file mode 100644 index 000000000000..c92d38fed506 --- /dev/null +++ b/packages/kit/test/apps/options/source/pages/endpoint/+server.js @@ -0,0 +1,3 @@ +export function GET() { + return new Response('hi'); +} diff --git a/packages/kit/test/apps/options/source/pages/error.svelte b/packages/kit/test/apps/options/source/pages/error/+page.svelte similarity index 100% rename from packages/kit/test/apps/options/source/pages/error.svelte rename to packages/kit/test/apps/options/source/pages/error/+page.svelte diff --git a/packages/kit/test/apps/options/source/pages/mode/+page.server.js b/packages/kit/test/apps/options/source/pages/mode/+page.server.js new file mode 100644 index 000000000000..b65593f1f6a3 --- /dev/null +++ b/packages/kit/test/apps/options/source/pages/mode/+page.server.js @@ -0,0 +1,5 @@ +export function GET() { + return { + mode_from_endpoint: import.meta.env.MODE + }; +} diff --git a/packages/kit/test/apps/options/source/pages/mode/+page.svelte b/packages/kit/test/apps/options/source/pages/mode/+page.svelte new file mode 100644 index 000000000000..5d1511410db3 --- /dev/null +++ b/packages/kit/test/apps/options/source/pages/mode/+page.svelte @@ -0,0 +1,10 @@ + + +

+ {data.mode_from_endpoint} === {import.meta.env.MODE} === {dev ? 'development' : 'custom'} +

diff --git a/packages/kit/test/apps/options/source/pages/mode/index.js b/packages/kit/test/apps/options/source/pages/mode/index.js deleted file mode 100644 index 8ef254f8e6ff..000000000000 --- a/packages/kit/test/apps/options/source/pages/mode/index.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - mode_from_endpoint: import.meta.env.MODE - } - }; -} diff --git a/packages/kit/test/apps/options/source/pages/mode/index.svelte b/packages/kit/test/apps/options/source/pages/mode/index.svelte deleted file mode 100644 index 5b7950bd097b..000000000000 --- a/packages/kit/test/apps/options/source/pages/mode/index.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -

- {mode_from_endpoint} === {import.meta.env.MODE} === {dev ? 'development' : 'custom'} -

diff --git a/packages/kit/test/apps/options/source/pages/endpoint.js b/packages/kit/test/apps/options/source/pages/page-endpoint/+page.server.js similarity index 71% rename from packages/kit/test/apps/options/source/pages/endpoint.js rename to packages/kit/test/apps/options/source/pages/page-endpoint/+page.server.js index 390c0832f5a6..4ad062acdda5 100644 --- a/packages/kit/test/apps/options/source/pages/endpoint.js +++ b/packages/kit/test/apps/options/source/pages/page-endpoint/+page.server.js @@ -1,5 +1,5 @@ export function GET() { return { - body: 'hi' + message: 'hi' }; } diff --git a/packages/kit/test/apps/options/source/pages/page-endpoint/+page.svelte b/packages/kit/test/apps/options/source/pages/page-endpoint/+page.svelte new file mode 100644 index 000000000000..ef1d7cd5f755 --- /dev/null +++ b/packages/kit/test/apps/options/source/pages/page-endpoint/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.message}

diff --git a/packages/kit/test/apps/options/source/pages/page-endpoint/index.svelte b/packages/kit/test/apps/options/source/pages/page-endpoint/index.svelte deleted file mode 100644 index 173c865c665d..000000000000 --- a/packages/kit/test/apps/options/source/pages/page-endpoint/index.svelte +++ /dev/null @@ -1,6 +0,0 @@ - - -

{data}

diff --git a/packages/kit/test/apps/options/source/pages/prefetching/index.svelte b/packages/kit/test/apps/options/source/pages/prefetching/+page.svelte similarity index 100% rename from packages/kit/test/apps/options/source/pages/prefetching/index.svelte rename to packages/kit/test/apps/options/source/pages/prefetching/+page.svelte diff --git a/packages/kit/test/apps/options/source/pages/prefetching/prefetched.js b/packages/kit/test/apps/options/source/pages/prefetching/prefetched.js deleted file mode 100644 index d51f5fd3c271..000000000000 --- a/packages/kit/test/apps/options/source/pages/prefetching/prefetched.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - message: 'prefetched' - } - }; -} diff --git a/packages/kit/test/apps/options/source/pages/prefetching/prefetched.svelte b/packages/kit/test/apps/options/source/pages/prefetching/prefetched.svelte deleted file mode 100644 index 7c991db4005a..000000000000 --- a/packages/kit/test/apps/options/source/pages/prefetching/prefetched.svelte +++ /dev/null @@ -1,6 +0,0 @@ - - -

{message}

diff --git a/packages/kit/test/apps/options/source/pages/page-endpoint/index.js b/packages/kit/test/apps/options/source/pages/prefetching/prefetched/+page.server.js similarity index 58% rename from packages/kit/test/apps/options/source/pages/page-endpoint/index.js rename to packages/kit/test/apps/options/source/pages/prefetching/prefetched/+page.server.js index bab1f222079c..d18bc407c032 100644 --- a/packages/kit/test/apps/options/source/pages/page-endpoint/index.js +++ b/packages/kit/test/apps/options/source/pages/prefetching/prefetched/+page.server.js @@ -1,7 +1,5 @@ export function GET() { return { - body: { - data: 'hi' - } + message: 'prefetched' }; } diff --git a/packages/kit/test/apps/options/source/pages/prefetching/prefetched/+page.svelte b/packages/kit/test/apps/options/source/pages/prefetching/prefetched/+page.svelte new file mode 100644 index 000000000000..1c0c8c20ec65 --- /dev/null +++ b/packages/kit/test/apps/options/source/pages/prefetching/prefetched/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.message}

diff --git a/packages/kit/test/apps/options/source/pages/slash/index.svelte b/packages/kit/test/apps/options/source/pages/slash/+page.svelte similarity index 100% rename from packages/kit/test/apps/options/source/pages/slash/index.svelte rename to packages/kit/test/apps/options/source/pages/slash/+page.svelte diff --git a/packages/kit/test/apps/options/source/pages/slash/child.svelte b/packages/kit/test/apps/options/source/pages/slash/child/+page.svelte similarity index 100% rename from packages/kit/test/apps/options/source/pages/slash/child.svelte rename to packages/kit/test/apps/options/source/pages/slash/child/+page.svelte From b90be49160a0ece51b3d2303d940d47057553ed8 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 4 Aug 2022 14:34:59 -0400 Subject: [PATCH 035/172] update options-2 tests --- .../test/apps/options-2/src/routes/{index.svelte => +page.svelte} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/kit/test/apps/options-2/src/routes/{index.svelte => +page.svelte} (100%) diff --git a/packages/kit/test/apps/options-2/src/routes/index.svelte b/packages/kit/test/apps/options-2/src/routes/+page.svelte similarity index 100% rename from packages/kit/test/apps/options-2/src/routes/index.svelte rename to packages/kit/test/apps/options-2/src/routes/+page.svelte From d406f130f268580d6c1a5ea7ebaca115a692b367 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 4 Aug 2022 14:37:57 -0400 Subject: [PATCH 036/172] update writes tests --- .../writes/src/routes/double-mount/{index.svelte => +page.svelte} | 0 .../writes/src/routes/new-route/{index.svelte => +page.svelte} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename packages/kit/test/apps/writes/src/routes/double-mount/{index.svelte => +page.svelte} (100%) rename packages/kit/test/apps/writes/src/routes/new-route/{index.svelte => +page.svelte} (100%) diff --git a/packages/kit/test/apps/writes/src/routes/double-mount/index.svelte b/packages/kit/test/apps/writes/src/routes/double-mount/+page.svelte similarity index 100% rename from packages/kit/test/apps/writes/src/routes/double-mount/index.svelte rename to packages/kit/test/apps/writes/src/routes/double-mount/+page.svelte diff --git a/packages/kit/test/apps/writes/src/routes/new-route/index.svelte b/packages/kit/test/apps/writes/src/routes/new-route/+page.svelte similarity index 100% rename from packages/kit/test/apps/writes/src/routes/new-route/index.svelte rename to packages/kit/test/apps/writes/src/routes/new-route/+page.svelte From 62300fa9613cd455c4424d222f4ab2a8260b5650 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 4 Aug 2022 14:57:50 -0400 Subject: [PATCH 037/172] migrate (most) prerendering/basics tests --- .../{shadowed-get.js => +page.server.js} | 4 +-- .../basics/src/routes/+page.svelte | 6 ++++ .../basics/src/routes/accesses-session.svelte | 9 ------ .../src/routes/accesses-session/+page.js | 3 ++ .../src/routes/accesses-session/+page.svelte | 1 + .../basics/src/routes/encoding/[path].json.js | 8 ------ .../routes/encoding/[path].json/+server.js | 6 ++++ .../{[path].svelte => [path]/+page.svelte} | 0 .../routes/encoding/path with spaces.svelte | 28 ------------------- .../routes/encoding/path with spaces/+page.js | 10 +++++++ .../encoding/path with spaces/+page.svelte | 10 +++++++ .../src/routes/encoding/redirect.svelte | 9 ------ .../src/routes/encoding/redirect/+page.js | 6 ++++ .../src/routes/encoding/redirect/+page.svelte | 0 .../basics/src/routes/fetch-404.svelte | 17 ----------- .../basics/src/routes/fetch-404/+page.js | 6 ++++ .../basics/src/routes/fetch-404/+page.svelte | 6 ++++ .../routes/fetch-endpoint/buffered.json.js | 5 ---- .../fetch-endpoint/buffered.json/+server.js | 3 ++ .../src/routes/fetch-endpoint/buffered.svelte | 18 ------------ .../routes/fetch-endpoint/buffered/+page.js | 7 +++++ .../fetch-endpoint/buffered/+page.svelte | 6 ++++ .../fetch-endpoint/not-buffered.json.js | 5 ---- .../not-buffered.json/+server.js | 3 ++ .../routes/fetch-endpoint/not-buffered.svelte | 20 ------------- .../fetch-endpoint/not-buffered/+page.js | 9 ++++++ .../fetch-endpoint/not-buffered/+page.svelte | 6 ++++ .../+page.svelte} | 0 .../routes/fetch-image/[...slug]/+server.js | 24 ++++++++++++++++ .../src/routes/fetch-image/[...slug]/index.js | 16 ----------- .../basics/src/routes/index.svelte | 6 ---- .../src/routes/load-file-with-spaces.svelte | 25 ----------------- .../src/routes/load-file-with-spaces/+page.js | 14 ++++++++++ .../routes/load-file-with-spaces/+page.svelte | 6 ++++ .../basics/src/routes/max-age.svelte | 10 ------- .../basics/src/routes/max-age/+page.js | 7 +++++ .../basics/src/routes/max-age/+page.svelte | 1 + .../origin/{index.js => +page.server.js} | 4 +-- .../origin/{index.svelte => +page.svelte} | 6 ++-- .../src/routes/origin/message.json/+server.js | 5 ++++ .../+page.svelte} | 0 .../basics/src/routes/redirect-encoded.svelte | 9 ------ .../src/routes/redirect-encoded/+page.js | 6 ++++ .../src/routes/redirect-encoded/+page.svelte | 0 .../src/routes/redirect-malicious.svelte | 9 ------ .../src/routes/redirect-malicious/+page.js | 6 ++++ .../routes/redirect-malicious/+page.svelte | 0 .../basics/src/routes/redirect.svelte | 9 ------ .../basics/src/routes/redirect/+page.js | 6 ++++ .../basics/src/routes/redirect/+page.svelte | 0 .../basics/src/routes/shadowed-get.svelte | 6 ---- .../+page.server.js} | 4 +-- .../src/routes/shadowed-get/+page.svelte | 6 ++++ .../basics/src/routes/shadowed-post.js | 13 --------- .../+page.server.js} | 6 ++-- .../+page.svelte} | 0 56 files changed, 178 insertions(+), 237 deletions(-) rename packages/kit/test/prerendering/basics/src/routes/{shadowed-get.js => +page.server.js} (58%) create mode 100644 packages/kit/test/prerendering/basics/src/routes/+page.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/accesses-session.svelte create mode 100644 packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/encoding/[path].json.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/encoding/[path].json/+server.js rename packages/kit/test/prerendering/basics/src/routes/encoding/{[path].svelte => [path]/+page.svelte} (100%) delete mode 100644 packages/kit/test/prerendering/basics/src/routes/encoding/path with spaces.svelte create mode 100644 packages/kit/test/prerendering/basics/src/routes/encoding/path with spaces/+page.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/encoding/path with spaces/+page.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/encoding/redirect.svelte create mode 100644 packages/kit/test/prerendering/basics/src/routes/encoding/redirect/+page.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/encoding/redirect/+page.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-404.svelte create mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-404/+page.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-404/+page.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered.json.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered.json/+server.js delete mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered.svelte create mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered/+page.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered/+page.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.json.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.json/+server.js delete mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.svelte create mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered/+page.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered/+page.svelte rename packages/kit/test/prerendering/basics/src/routes/{fetch-image.svelte => fetch-image/+page.svelte} (100%) create mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-image/[...slug]/+server.js delete mode 100644 packages/kit/test/prerendering/basics/src/routes/fetch-image/[...slug]/index.js delete mode 100644 packages/kit/test/prerendering/basics/src/routes/index.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/load-file-with-spaces.svelte create mode 100644 packages/kit/test/prerendering/basics/src/routes/load-file-with-spaces/+page.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/load-file-with-spaces/+page.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/max-age.svelte create mode 100644 packages/kit/test/prerendering/basics/src/routes/max-age/+page.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/max-age/+page.svelte rename packages/kit/test/prerendering/basics/src/routes/origin/{index.js => +page.server.js} (87%) rename packages/kit/test/prerendering/basics/src/routes/origin/{index.svelte => +page.svelte} (51%) create mode 100644 packages/kit/test/prerendering/basics/src/routes/origin/message.json/+server.js rename packages/kit/test/prerendering/basics/src/routes/{prerendering-true.svelte => prerendering-true/+page.svelte} (100%) delete mode 100644 packages/kit/test/prerendering/basics/src/routes/redirect-encoded.svelte create mode 100644 packages/kit/test/prerendering/basics/src/routes/redirect-encoded/+page.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/redirect-encoded/+page.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/redirect-malicious.svelte create mode 100644 packages/kit/test/prerendering/basics/src/routes/redirect-malicious/+page.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/redirect-malicious/+page.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/redirect.svelte create mode 100644 packages/kit/test/prerendering/basics/src/routes/redirect/+page.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/redirect/+page.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/shadowed-get.svelte rename packages/kit/test/prerendering/basics/src/routes/{index.js => shadowed-get/+page.server.js} (54%) create mode 100644 packages/kit/test/prerendering/basics/src/routes/shadowed-get/+page.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/shadowed-post.js rename packages/kit/test/prerendering/basics/src/routes/{origin/message.json.js => shadowed-post/+page.server.js} (50%) rename packages/kit/test/prerendering/basics/src/routes/{shadowed-post.svelte => shadowed-post/+page.svelte} (100%) diff --git a/packages/kit/test/prerendering/basics/src/routes/shadowed-get.js b/packages/kit/test/prerendering/basics/src/routes/+page.server.js similarity index 58% rename from packages/kit/test/prerendering/basics/src/routes/shadowed-get.js rename to packages/kit/test/prerendering/basics/src/routes/+page.server.js index 863b891d5c88..788fc8a5c256 100644 --- a/packages/kit/test/prerendering/basics/src/routes/shadowed-get.js +++ b/packages/kit/test/prerendering/basics/src/routes/+page.server.js @@ -1,7 +1,5 @@ export function GET() { return { - body: { - answer: 42 - } + message: 'hello' }; } diff --git a/packages/kit/test/prerendering/basics/src/routes/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/+page.svelte new file mode 100644 index 000000000000..1c0c8c20ec65 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.message}

diff --git a/packages/kit/test/prerendering/basics/src/routes/accesses-session.svelte b/packages/kit/test/prerendering/basics/src/routes/accesses-session.svelte deleted file mode 100644 index 7ffe59f13564..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/accesses-session.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - -

I should never be prerendered.

diff --git a/packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.js b/packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.js new file mode 100644 index 000000000000..bf5652d89fae --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.js @@ -0,0 +1,3 @@ +export const load = ({ session }) => { + return session; +}; diff --git a/packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.svelte new file mode 100644 index 000000000000..bf15aa47df08 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.svelte @@ -0,0 +1 @@ +

I should never be prerendered.

diff --git a/packages/kit/test/prerendering/basics/src/routes/encoding/[path].json.js b/packages/kit/test/prerendering/basics/src/routes/encoding/[path].json.js deleted file mode 100644 index ead90ccd629f..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/encoding/[path].json.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET({ params }) { - return { - body: { - path: params.path - } - }; -} diff --git a/packages/kit/test/prerendering/basics/src/routes/encoding/[path].json/+server.js b/packages/kit/test/prerendering/basics/src/routes/encoding/[path].json/+server.js new file mode 100644 index 000000000000..651dadd310d7 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/encoding/[path].json/+server.js @@ -0,0 +1,6 @@ +/** @type {import('@sveltejs/kit').RequestHandler} */ +export function GET({ params }) { + return new Response(JSON.stringify({ + path: params.path + }), { headers: { 'content-type': 'application/json; charset=utf-8' } }); +} diff --git a/packages/kit/test/prerendering/basics/src/routes/encoding/[path].svelte b/packages/kit/test/prerendering/basics/src/routes/encoding/[path]/+page.svelte similarity index 100% rename from packages/kit/test/prerendering/basics/src/routes/encoding/[path].svelte rename to packages/kit/test/prerendering/basics/src/routes/encoding/[path]/+page.svelte diff --git a/packages/kit/test/prerendering/basics/src/routes/encoding/path with spaces.svelte b/packages/kit/test/prerendering/basics/src/routes/encoding/path with spaces.svelte deleted file mode 100644 index 7e692c11f4c6..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/encoding/path with spaces.svelte +++ /dev/null @@ -1,28 +0,0 @@ - - - - -

{a.path}

-

{b.path}

- -dynamic path with spaces -dynamic path with encoded spaces diff --git a/packages/kit/test/prerendering/basics/src/routes/encoding/path with spaces/+page.js b/packages/kit/test/prerendering/basics/src/routes/encoding/path with spaces/+page.js new file mode 100644 index 000000000000..d0248b03c167 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/encoding/path with spaces/+page.js @@ -0,0 +1,10 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const a = await fetch('/encoding/path with spaces.json'); + const b = await fetch('/encoding/path%20with%20encoded%20spaces.json'); + + return { + a: await a.json(), + b: await b.json() + }; +} diff --git a/packages/kit/test/prerendering/basics/src/routes/encoding/path with spaces/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/encoding/path with spaces/+page.svelte new file mode 100644 index 000000000000..7d52187af6c6 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/encoding/path with spaces/+page.svelte @@ -0,0 +1,10 @@ + + +

{data.a.path}

+

{data.b.path}

+ +dynamic path with spaces +dynamic path with encoded spaces diff --git a/packages/kit/test/prerendering/basics/src/routes/encoding/redirect.svelte b/packages/kit/test/prerendering/basics/src/routes/encoding/redirect.svelte deleted file mode 100644 index 159549b5da22..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/encoding/redirect.svelte +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/packages/kit/test/prerendering/basics/src/routes/encoding/redirect/+page.js b/packages/kit/test/prerendering/basics/src/routes/encoding/redirect/+page.js new file mode 100644 index 000000000000..d40db8a08882 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/encoding/redirect/+page.js @@ -0,0 +1,6 @@ +import { redirect } from '@sveltejs/kit'; + +/** @type {import('@sveltejs/kit').Load} */ +export function load() { + throw redirect(307, '/encoding/redirected%20path%20with%20encoded%20spaces'); +} diff --git a/packages/kit/test/prerendering/basics/src/routes/encoding/redirect/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/encoding/redirect/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-404.svelte b/packages/kit/test/prerendering/basics/src/routes/fetch-404.svelte deleted file mode 100644 index 023d8f90291e..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/fetch-404.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - - - -

status: {status}

diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-404/+page.js b/packages/kit/test/prerendering/basics/src/routes/fetch-404/+page.js new file mode 100644 index 000000000000..e12f11f4a8d0 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-404/+page.js @@ -0,0 +1,6 @@ +/** @type {import('./$types').Load} */ +export async function load({ fetch }) { + const { status } = await fetch('/missing.json'); + + return { status }; +} diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-404/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/fetch-404/+page.svelte new file mode 100644 index 000000000000..ffbb0ed4a1d5 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-404/+page.svelte @@ -0,0 +1,6 @@ + + +

status: {data.status}

diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered.json.js b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered.json.js deleted file mode 100644 index 3b6abbc781f5..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered.json.js +++ /dev/null @@ -1,5 +0,0 @@ -export async function GET() { - return { - body: { answer: 42 } - }; -} diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered.json/+server.js b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered.json/+server.js new file mode 100644 index 000000000000..85ddb58a61ab --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered.json/+server.js @@ -0,0 +1,3 @@ +export async function GET() { + return new Response(JSON.stringify({ answer: 42 }), { headers: { 'content-type': 'application/json; charset=utf-8' } }); +} diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered.svelte b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered.svelte deleted file mode 100644 index ea6c07029907..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - - -

the answer is {answer}

diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered/+page.js b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered/+page.js new file mode 100644 index 000000000000..b884d47611dd --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered/+page.js @@ -0,0 +1,7 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const url = '/fetch-endpoint/buffered.json'; + const res = await fetch(url); + + return await res.json(); +} diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered/+page.svelte new file mode 100644 index 000000000000..7cbd09df0bf2 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/buffered/+page.svelte @@ -0,0 +1,6 @@ + + +

the answer is {data.answer}

diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.json.js b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.json.js deleted file mode 100644 index 3b6abbc781f5..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.json.js +++ /dev/null @@ -1,5 +0,0 @@ -export async function GET() { - return { - body: { answer: 42 } - }; -} diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.json/+server.js b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.json/+server.js new file mode 100644 index 000000000000..85ddb58a61ab --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.json/+server.js @@ -0,0 +1,3 @@ +export async function GET() { + return new Response(JSON.stringify({ answer: 42 }), { headers: { 'content-type': 'application/json; charset=utf-8' } }); +} diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.svelte b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.svelte deleted file mode 100644 index 949a0b4e4b23..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - - - -

content-type: {headers.get('content-type')}

diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered/+page.js b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered/+page.js new file mode 100644 index 000000000000..de4123c2aafe --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered/+page.js @@ -0,0 +1,9 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const url = '/fetch-endpoint/not-buffered.json'; + const res = await fetch(url); + + return { + headers: res.headers + }; +} diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered/+page.svelte new file mode 100644 index 000000000000..2f37521ecc6d --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-endpoint/not-buffered/+page.svelte @@ -0,0 +1,6 @@ + + +

content-type: {data.headers.get('content-type')}

diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-image.svelte b/packages/kit/test/prerendering/basics/src/routes/fetch-image/+page.svelte similarity index 100% rename from packages/kit/test/prerendering/basics/src/routes/fetch-image.svelte rename to packages/kit/test/prerendering/basics/src/routes/fetch-image/+page.svelte diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-image/[...slug]/+server.js b/packages/kit/test/prerendering/basics/src/routes/fetch-image/[...slug]/+server.js new file mode 100644 index 000000000000..f2f808836ef5 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/fetch-image/[...slug]/+server.js @@ -0,0 +1,24 @@ +import * as fs from 'fs'; + +export async function GET({ params }) { + const slug = params.slug.split('/'); + const extension = slug[0].split('.').pop(); + + const file = fs.readFileSync(`./static/image.${extension}`); + + throw new Error("@migration task: Migrate this return statement (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); + // Suggestion (check for correctness before using): + // return new Response(JSON.stringify(file), { + // headers: 'content-type': 'application/json; charset=utf-8', + // + // 'Content-Type': 'image/' + extension + // } + // }); + return { + status: 200, + headers: { + 'Content-Type': 'image/' + extension + }, + body: file + }; +} diff --git a/packages/kit/test/prerendering/basics/src/routes/fetch-image/[...slug]/index.js b/packages/kit/test/prerendering/basics/src/routes/fetch-image/[...slug]/index.js deleted file mode 100644 index 83f52a7bc27e..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/fetch-image/[...slug]/index.js +++ /dev/null @@ -1,16 +0,0 @@ -import * as fs from 'fs'; - -export async function GET({ params }) { - const slug = params.slug.split('/'); - const extension = slug[0].split('.').pop(); - - const file = fs.readFileSync(`./static/image.${extension}`); - - return { - status: 200, - headers: { - 'Content-Type': 'image/' + extension - }, - body: file - }; -} diff --git a/packages/kit/test/prerendering/basics/src/routes/index.svelte b/packages/kit/test/prerendering/basics/src/routes/index.svelte deleted file mode 100644 index 7c991db4005a..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/index.svelte +++ /dev/null @@ -1,6 +0,0 @@ - - -

{message}

diff --git a/packages/kit/test/prerendering/basics/src/routes/load-file-with-spaces.svelte b/packages/kit/test/prerendering/basics/src/routes/load-file-with-spaces.svelte deleted file mode 100644 index b0a3d165fac2..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/load-file-with-spaces.svelte +++ /dev/null @@ -1,25 +0,0 @@ - - - - -

answer: {answer}

diff --git a/packages/kit/test/prerendering/basics/src/routes/load-file-with-spaces/+page.js b/packages/kit/test/prerendering/basics/src/routes/load-file-with-spaces/+page.js new file mode 100644 index 000000000000..8198a825b03b --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/load-file-with-spaces/+page.js @@ -0,0 +1,14 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ fetch }) { + const r1 = await fetch('/file%20with%20spaces.json'); + const p1 = await r1.json(); + + const r2 = await fetch('/file with spaces.json'); + const p2 = await r2.json(); + + if (p1.answer !== p2.answer) { + throw new Error('oops'); + } + + return p1; +} diff --git a/packages/kit/test/prerendering/basics/src/routes/load-file-with-spaces/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/load-file-with-spaces/+page.svelte new file mode 100644 index 000000000000..310f6793ffd7 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/load-file-with-spaces/+page.svelte @@ -0,0 +1,6 @@ + + +

answer: {data.answer}

diff --git a/packages/kit/test/prerendering/basics/src/routes/max-age.svelte b/packages/kit/test/prerendering/basics/src/routes/max-age.svelte deleted file mode 100644 index d6053f889af5..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/max-age.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -

This page will be cached for 5 minutes

diff --git a/packages/kit/test/prerendering/basics/src/routes/max-age/+page.js b/packages/kit/test/prerendering/basics/src/routes/max-age/+page.js new file mode 100644 index 000000000000..1d256a020821 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/max-age/+page.js @@ -0,0 +1,7 @@ +/** @type {import('@sveltejs/kit').Load} */ +export function load() { + throw new Error("@migration task: Migrate this return statement (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292693)"); + return { + cache: { maxage: 300 } + }; +} diff --git a/packages/kit/test/prerendering/basics/src/routes/max-age/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/max-age/+page.svelte new file mode 100644 index 000000000000..df56b13d96fe --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/max-age/+page.svelte @@ -0,0 +1 @@ +

This page will be cached for 5 minutes

diff --git a/packages/kit/test/prerendering/basics/src/routes/origin/index.js b/packages/kit/test/prerendering/basics/src/routes/origin/+page.server.js similarity index 87% rename from packages/kit/test/prerendering/basics/src/routes/origin/index.js rename to packages/kit/test/prerendering/basics/src/routes/origin/+page.server.js index dfe4afa7cb96..340c001d6768 100644 --- a/packages/kit/test/prerendering/basics/src/routes/origin/index.js +++ b/packages/kit/test/prerendering/basics/src/routes/origin/+page.server.js @@ -3,8 +3,6 @@ export async function GET({ url }) { const { message } = await res.json(); return { - body: { - message - } + message }; } diff --git a/packages/kit/test/prerendering/basics/src/routes/origin/index.svelte b/packages/kit/test/prerendering/basics/src/routes/origin/+page.svelte similarity index 51% rename from packages/kit/test/prerendering/basics/src/routes/origin/index.svelte rename to packages/kit/test/prerendering/basics/src/routes/origin/+page.svelte index 5de1b110c2ee..9885616ac7f6 100644 --- a/packages/kit/test/prerendering/basics/src/routes/origin/index.svelte +++ b/packages/kit/test/prerendering/basics/src/routes/origin/+page.svelte @@ -1,9 +1,9 @@ -

{message}

+

{data.message}

{$page.url.origin}

diff --git a/packages/kit/test/prerendering/basics/src/routes/origin/message.json/+server.js b/packages/kit/test/prerendering/basics/src/routes/origin/message.json/+server.js new file mode 100644 index 000000000000..a49411d15dc2 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/origin/message.json/+server.js @@ -0,0 +1,5 @@ +export function GET() { + return new Response(JSON.stringify({ + message: 'hello' + }), { headers: { 'content-type': 'application/json; charset=utf-8' } }); +} diff --git a/packages/kit/test/prerendering/basics/src/routes/prerendering-true.svelte b/packages/kit/test/prerendering/basics/src/routes/prerendering-true/+page.svelte similarity index 100% rename from packages/kit/test/prerendering/basics/src/routes/prerendering-true.svelte rename to packages/kit/test/prerendering/basics/src/routes/prerendering-true/+page.svelte diff --git a/packages/kit/test/prerendering/basics/src/routes/redirect-encoded.svelte b/packages/kit/test/prerendering/basics/src/routes/redirect-encoded.svelte deleted file mode 100644 index fe69f129afce..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/redirect-encoded.svelte +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/packages/kit/test/prerendering/basics/src/routes/redirect-encoded/+page.js b/packages/kit/test/prerendering/basics/src/routes/redirect-encoded/+page.js new file mode 100644 index 000000000000..1b7b45d6315d --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/redirect-encoded/+page.js @@ -0,0 +1,6 @@ +import { redirect } from '@sveltejs/kit'; + +/** @type {import('@sveltejs/kit').Load} */ +export function load() { + throw redirect(301, `https://example.com/redirected?returnTo=${encodeURIComponent('/foo?bar=baz')}`); +} diff --git a/packages/kit/test/prerendering/basics/src/routes/redirect-encoded/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/redirect-encoded/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/prerendering/basics/src/routes/redirect-malicious.svelte b/packages/kit/test/prerendering/basics/src/routes/redirect-malicious.svelte deleted file mode 100644 index a62c94eadc9b..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/redirect-malicious.svelte +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/packages/kit/test/prerendering/basics/src/routes/redirect-malicious/+page.js b/packages/kit/test/prerendering/basics/src/routes/redirect-malicious/+page.js new file mode 100644 index 000000000000..6fd54b56dfda --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/redirect-malicious/+page.js @@ -0,0 +1,6 @@ +import { redirect } from '@sveltejs/kit'; + +/** @type {import('@sveltejs/kit').Load} */ +export function load() { + throw redirect(301, 'https://example.com/alert("pwned")'); +} diff --git a/packages/kit/test/prerendering/basics/src/routes/redirect-malicious/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/redirect-malicious/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/prerendering/basics/src/routes/redirect.svelte b/packages/kit/test/prerendering/basics/src/routes/redirect.svelte deleted file mode 100644 index 85e2614d807b..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/redirect.svelte +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/packages/kit/test/prerendering/basics/src/routes/redirect/+page.js b/packages/kit/test/prerendering/basics/src/routes/redirect/+page.js new file mode 100644 index 000000000000..0ed002001e08 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/redirect/+page.js @@ -0,0 +1,6 @@ +import { redirect } from '@sveltejs/kit'; + +/** @type {import('@sveltejs/kit').Load} */ +export function load() { + throw redirect(301, 'https://example.com/redirected'); +} diff --git a/packages/kit/test/prerendering/basics/src/routes/redirect/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/redirect/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/prerendering/basics/src/routes/shadowed-get.svelte b/packages/kit/test/prerendering/basics/src/routes/shadowed-get.svelte deleted file mode 100644 index f5f46beb9dcf..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/shadowed-get.svelte +++ /dev/null @@ -1,6 +0,0 @@ - - -

The answer is {answer}

diff --git a/packages/kit/test/prerendering/basics/src/routes/index.js b/packages/kit/test/prerendering/basics/src/routes/shadowed-get/+page.server.js similarity index 54% rename from packages/kit/test/prerendering/basics/src/routes/index.js rename to packages/kit/test/prerendering/basics/src/routes/shadowed-get/+page.server.js index 6fe9d378bc26..e68f1c2f62ed 100644 --- a/packages/kit/test/prerendering/basics/src/routes/index.js +++ b/packages/kit/test/prerendering/basics/src/routes/shadowed-get/+page.server.js @@ -1,7 +1,5 @@ export function GET() { return { - body: { - message: 'hello' - } + answer: 42 }; } diff --git a/packages/kit/test/prerendering/basics/src/routes/shadowed-get/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/shadowed-get/+page.svelte new file mode 100644 index 000000000000..847b2497ea27 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/shadowed-get/+page.svelte @@ -0,0 +1,6 @@ + + +

The answer is {data.answer}

diff --git a/packages/kit/test/prerendering/basics/src/routes/shadowed-post.js b/packages/kit/test/prerendering/basics/src/routes/shadowed-post.js deleted file mode 100644 index ad7b3956ae0b..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/shadowed-post.js +++ /dev/null @@ -1,13 +0,0 @@ -export function GET() { - return { - body: { - answer: 42 - } - }; -} - -export function POST() { - return { - status: 201 - }; -} diff --git a/packages/kit/test/prerendering/basics/src/routes/origin/message.json.js b/packages/kit/test/prerendering/basics/src/routes/shadowed-post/+page.server.js similarity index 50% rename from packages/kit/test/prerendering/basics/src/routes/origin/message.json.js rename to packages/kit/test/prerendering/basics/src/routes/shadowed-post/+page.server.js index 6fe9d378bc26..39127e7c97b5 100644 --- a/packages/kit/test/prerendering/basics/src/routes/origin/message.json.js +++ b/packages/kit/test/prerendering/basics/src/routes/shadowed-post/+page.server.js @@ -1,7 +1,7 @@ export function GET() { return { - body: { - message: 'hello' - } + answer: 42 }; } + +export function POST() {} diff --git a/packages/kit/test/prerendering/basics/src/routes/shadowed-post.svelte b/packages/kit/test/prerendering/basics/src/routes/shadowed-post/+page.svelte similarity index 100% rename from packages/kit/test/prerendering/basics/src/routes/shadowed-post.svelte rename to packages/kit/test/prerendering/basics/src/routes/shadowed-post/+page.svelte From 9b09310cc7291a1cdc12172870b1e458f20bbb4c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 4 Aug 2022 15:04:39 -0400 Subject: [PATCH 038/172] migrate more tests --- .../fallback/src/routes/{index.svelte => +page.svelte} | 0 .../options/src/routes/{index.svelte => +page.svelte} | 0 .../src/routes/nested/{index.svelte => +page.svelte} | 0 .../test/prerendering/paths-base/src/routes/+page.js | 6 ++++++ .../dynamic/{[slug].svelte => [slug]/+page.svelte} | 0 .../prerendering/paths-base/src/routes/index.svelte | 10 ---------- .../src/routes/nested/{index.svelte => +page.svelte} | 0 .../src/routes/{index.svelte => +page.svelte} | 0 .../prerendering/trailing-slash/src/routes/page.js | 7 ------- .../prerendering/trailing-slash/src/routes/page.svelte | 6 ------ .../+page.server.js} | 4 +--- .../trailing-slash/src/routes/page/+page.svelte | 6 ++++++ .../src/routes/standalone-endpoint.json/+server.js | 7 +++++++ 13 files changed, 20 insertions(+), 26 deletions(-) rename packages/kit/test/prerendering/fallback/src/routes/{index.svelte => +page.svelte} (100%) rename packages/kit/test/prerendering/options/src/routes/{index.svelte => +page.svelte} (100%) rename packages/kit/test/prerendering/options/src/routes/nested/{index.svelte => +page.svelte} (100%) create mode 100644 packages/kit/test/prerendering/paths-base/src/routes/+page.js rename packages/kit/test/prerendering/paths-base/src/routes/dynamic/{[slug].svelte => [slug]/+page.svelte} (100%) delete mode 100644 packages/kit/test/prerendering/paths-base/src/routes/index.svelte rename packages/kit/test/prerendering/paths-base/src/routes/nested/{index.svelte => +page.svelte} (100%) rename packages/kit/test/prerendering/trailing-slash/src/routes/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/kit/test/prerendering/trailing-slash/src/routes/page.js delete mode 100644 packages/kit/test/prerendering/trailing-slash/src/routes/page.svelte rename packages/kit/test/prerendering/trailing-slash/src/routes/{standalone-endpoint.json.js => page/+page.server.js} (58%) create mode 100644 packages/kit/test/prerendering/trailing-slash/src/routes/page/+page.svelte create mode 100644 packages/kit/test/prerendering/trailing-slash/src/routes/standalone-endpoint.json/+server.js diff --git a/packages/kit/test/prerendering/fallback/src/routes/index.svelte b/packages/kit/test/prerendering/fallback/src/routes/+page.svelte similarity index 100% rename from packages/kit/test/prerendering/fallback/src/routes/index.svelte rename to packages/kit/test/prerendering/fallback/src/routes/+page.svelte diff --git a/packages/kit/test/prerendering/options/src/routes/index.svelte b/packages/kit/test/prerendering/options/src/routes/+page.svelte similarity index 100% rename from packages/kit/test/prerendering/options/src/routes/index.svelte rename to packages/kit/test/prerendering/options/src/routes/+page.svelte diff --git a/packages/kit/test/prerendering/options/src/routes/nested/index.svelte b/packages/kit/test/prerendering/options/src/routes/nested/+page.svelte similarity index 100% rename from packages/kit/test/prerendering/options/src/routes/nested/index.svelte rename to packages/kit/test/prerendering/options/src/routes/nested/+page.svelte diff --git a/packages/kit/test/prerendering/paths-base/src/routes/+page.js b/packages/kit/test/prerendering/paths-base/src/routes/+page.js new file mode 100644 index 000000000000..84d4247b57a2 --- /dev/null +++ b/packages/kit/test/prerendering/paths-base/src/routes/+page.js @@ -0,0 +1,6 @@ +import { redirect } from '@sveltejs/kit'; +import { base } from '$app/paths'; + +export function load() { + throw redirect(301, `${base}/dynamic/foo`); +} diff --git a/packages/kit/test/prerendering/paths-base/src/routes/dynamic/[slug].svelte b/packages/kit/test/prerendering/paths-base/src/routes/dynamic/[slug]/+page.svelte similarity index 100% rename from packages/kit/test/prerendering/paths-base/src/routes/dynamic/[slug].svelte rename to packages/kit/test/prerendering/paths-base/src/routes/dynamic/[slug]/+page.svelte diff --git a/packages/kit/test/prerendering/paths-base/src/routes/index.svelte b/packages/kit/test/prerendering/paths-base/src/routes/index.svelte deleted file mode 100644 index ba61d6448419..000000000000 --- a/packages/kit/test/prerendering/paths-base/src/routes/index.svelte +++ /dev/null @@ -1,10 +0,0 @@ - \ No newline at end of file diff --git a/packages/kit/test/prerendering/paths-base/src/routes/nested/index.svelte b/packages/kit/test/prerendering/paths-base/src/routes/nested/+page.svelte similarity index 100% rename from packages/kit/test/prerendering/paths-base/src/routes/nested/index.svelte rename to packages/kit/test/prerendering/paths-base/src/routes/nested/+page.svelte diff --git a/packages/kit/test/prerendering/trailing-slash/src/routes/index.svelte b/packages/kit/test/prerendering/trailing-slash/src/routes/+page.svelte similarity index 100% rename from packages/kit/test/prerendering/trailing-slash/src/routes/index.svelte rename to packages/kit/test/prerendering/trailing-slash/src/routes/+page.svelte diff --git a/packages/kit/test/prerendering/trailing-slash/src/routes/page.js b/packages/kit/test/prerendering/trailing-slash/src/routes/page.js deleted file mode 100644 index 6fe9d378bc26..000000000000 --- a/packages/kit/test/prerendering/trailing-slash/src/routes/page.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return { - body: { - message: 'hello' - } - }; -} diff --git a/packages/kit/test/prerendering/trailing-slash/src/routes/page.svelte b/packages/kit/test/prerendering/trailing-slash/src/routes/page.svelte deleted file mode 100644 index 7c991db4005a..000000000000 --- a/packages/kit/test/prerendering/trailing-slash/src/routes/page.svelte +++ /dev/null @@ -1,6 +0,0 @@ - - -

{message}

diff --git a/packages/kit/test/prerendering/trailing-slash/src/routes/standalone-endpoint.json.js b/packages/kit/test/prerendering/trailing-slash/src/routes/page/+page.server.js similarity index 58% rename from packages/kit/test/prerendering/trailing-slash/src/routes/standalone-endpoint.json.js rename to packages/kit/test/prerendering/trailing-slash/src/routes/page/+page.server.js index 863b891d5c88..788fc8a5c256 100644 --- a/packages/kit/test/prerendering/trailing-slash/src/routes/standalone-endpoint.json.js +++ b/packages/kit/test/prerendering/trailing-slash/src/routes/page/+page.server.js @@ -1,7 +1,5 @@ export function GET() { return { - body: { - answer: 42 - } + message: 'hello' }; } diff --git a/packages/kit/test/prerendering/trailing-slash/src/routes/page/+page.svelte b/packages/kit/test/prerendering/trailing-slash/src/routes/page/+page.svelte new file mode 100644 index 000000000000..1c0c8c20ec65 --- /dev/null +++ b/packages/kit/test/prerendering/trailing-slash/src/routes/page/+page.svelte @@ -0,0 +1,6 @@ + + +

{data.message}

diff --git a/packages/kit/test/prerendering/trailing-slash/src/routes/standalone-endpoint.json/+server.js b/packages/kit/test/prerendering/trailing-slash/src/routes/standalone-endpoint.json/+server.js new file mode 100644 index 000000000000..ad6cbfec799b --- /dev/null +++ b/packages/kit/test/prerendering/trailing-slash/src/routes/standalone-endpoint.json/+server.js @@ -0,0 +1,7 @@ +export function GET() { + return new Response(JSON.stringify({ answer: 42 }), { + headers: { + 'content-type': 'application/json; charset=utf-8' + } + }); +} From 2a3195ceeb45256c1217bb36ee627a24d59da017 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 4 Aug 2022 15:06:33 -0400 Subject: [PATCH 039/172] update adapter-static tests --- .../src/routes/{index.svelte => +page.svelte} | 0 .../src/routes/{__error.svelte => +error.svelte} | 14 ++++++++------ .../src/routes/{__layout.svelte => +layout.svelte} | 0 .../spa/src/routes/{index.svelte => +page.svelte} | 0 .../test/apps/spa/src/routes/about.svelte | 5 ----- .../test/apps/spa/src/routes/about/+page.js | 1 + .../test/apps/spa/src/routes/about/+page.svelte | 1 + 7 files changed, 10 insertions(+), 11 deletions(-) rename packages/adapter-static/test/apps/prerendered/src/routes/{index.svelte => +page.svelte} (100%) rename packages/adapter-static/test/apps/spa/src/routes/{__error.svelte => +error.svelte} (54%) rename packages/adapter-static/test/apps/spa/src/routes/{__layout.svelte => +layout.svelte} (100%) rename packages/adapter-static/test/apps/spa/src/routes/{index.svelte => +page.svelte} (100%) delete mode 100644 packages/adapter-static/test/apps/spa/src/routes/about.svelte create mode 100644 packages/adapter-static/test/apps/spa/src/routes/about/+page.js create mode 100644 packages/adapter-static/test/apps/spa/src/routes/about/+page.svelte diff --git a/packages/adapter-static/test/apps/prerendered/src/routes/index.svelte b/packages/adapter-static/test/apps/prerendered/src/routes/+page.svelte similarity index 100% rename from packages/adapter-static/test/apps/prerendered/src/routes/index.svelte rename to packages/adapter-static/test/apps/prerendered/src/routes/+page.svelte diff --git a/packages/adapter-static/test/apps/spa/src/routes/__error.svelte b/packages/adapter-static/test/apps/spa/src/routes/+error.svelte similarity index 54% rename from packages/adapter-static/test/apps/spa/src/routes/__error.svelte rename to packages/adapter-static/test/apps/spa/src/routes/+error.svelte index 75e733c98d77..17dd1aaeb339 100644 --- a/packages/adapter-static/test/apps/spa/src/routes/__error.svelte +++ b/packages/adapter-static/test/apps/spa/src/routes/+error.svelte @@ -1,10 +1,12 @@ - -

This page was prerendered

\ No newline at end of file diff --git a/packages/adapter-static/test/apps/spa/src/routes/about/+page.js b/packages/adapter-static/test/apps/spa/src/routes/about/+page.js new file mode 100644 index 000000000000..189f71e2e1b3 --- /dev/null +++ b/packages/adapter-static/test/apps/spa/src/routes/about/+page.js @@ -0,0 +1 @@ +export const prerender = true; diff --git a/packages/adapter-static/test/apps/spa/src/routes/about/+page.svelte b/packages/adapter-static/test/apps/spa/src/routes/about/+page.svelte new file mode 100644 index 000000000000..404fd77511d2 --- /dev/null +++ b/packages/adapter-static/test/apps/spa/src/routes/about/+page.svelte @@ -0,0 +1 @@ +

This page was prerendered

\ No newline at end of file From 31b686ccadf7a969fef075f2cdd4c70a3d481e28 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 8 Aug 2022 14:19:03 -0400 Subject: [PATCH 040/172] it begins (#5782) * it begins * update some more test fixtures * update more tests * more * more * more * more * last one * need to add dot: true to catch routes inside .well-known * fixes, update tests * fix more tests * fix various things * all create_manifest_data unit tests passing * update write_manifest * fix * remove config.kit.routes * update RequestHandler type * simplify endpoint code * simplify some more stuff * move respond code into render_page, where it belongs * purge all references to stuff * simplify * vite build completes, albeit with a broken build * vite dev now starts * now rendering a blank page * rendering an error page * it renders html! * tidy up * get error page rendering correctly * add placeholder setHeaders function * replace CSRComponent with CSRPageNode * fix build * amp tests passing! now for the client * fix create_manifest_data unit tests * add error/redirect helpers * rename @sveltejs/kit/data -> @sveltejs/kit * add error/redirect to @sveltejs/kit types * fixes * fix a slew of typescript errors * data loading belongs in load_node * holy shit the tests are starting to pass * update some tests * start working on write_types * science experiment * typo * i think it basically works * expose ServerData as Data when no load is specified * replace magic number * handle missing GET separately from failure * oops i think i did a bad git * remove typings tests, these are no longer useful * tidy * use server data if no load is provided * temporarily disable non-SSR tests * apply headers * update test * allow load to return void * remove some tests that no longer make sense * remove some more unused tests * this is fun. delete delete delete * fix test * handle accept:json requests * fix test * small tidy up * tidy * simplify * simplify, improve efficiency * simplify * rename to disambiguate with client * tweaks * tidy up * load data in parallel * throw error pointing to migration if router folder exists but no routes are found * load nodes on client in parallel * handle redirect * fix parent usage bug, avoid waterfall when awaiting parents, remove try-catch which would make subsequent catch never getting called * error handling * construct redirect URL properly * fix redirects * handle POST requests etc * oof this took an embarrassingly long time to find * add types * update/remove some tests as appropriate * implement $page.data on the server * fix test * handle invalid redirect statuses * update test, fix off-by-one error * fix a bunch more tests * tweak tests * include dynamically imported styles from +page.js in dev * same but for build * track cookies * apply tracked cookies * down to three failing SSR tests * render errors * all SSR tests in test/apps/basics passing * fix write tests * all SSR tests passing * remove a couple of unused deps * tidy up * dont use instanceof checks * fix off-by-one error in client * client-side fetching, start of redirect/error handling * re-add missing dist file * for now, duplicate route.path logic where needed. in future, rethink manifest for this purpose * fix parent data retrieval, add $page.data to client * fix most prerendering tests * add cache http-equiv * test * get prerender tests passing Co-authored-by: Simon Holthausen --- .../test/apps/spa/src/routes/+error.svelte | 16 +- .../templates/default/src/app.d.ts | 2 - .../templates/skeleton/src/app.d.ts | 1 - packages/kit/package.json | 7 +- packages/kit/rollup.config.js | 132 ++-- packages/kit/src/core/adapt/builder.js | 5 +- packages/kit/src/core/config/index.spec.js | 1 + packages/kit/src/core/config/options.js | 6 +- .../kit/src/core/generate_manifest/index.js | 40 +- packages/kit/src/core/prerender/prerender.js | 2 +- .../core/sync/create_manifest_data/index.js | 429 +++++++------ .../sync/create_manifest_data/index.spec.js | 450 ++++++-------- .../{__layout.svelte => +layout.svelte} | 0 .../{foo/__layout.svelte => +page.svelte} | 0 .../foo/{index.svelte => +layout.svelte} | 0 .../{index.svelte => foo/+page.svelte} | 0 .../basic/{about.svelte => +page.svelte} | 0 .../[slug].json.ts => about/+page.svelte} | 0 .../[slug].svelte => blog.json/+server.js} | 0 .../test/samples/basic/blog}/+page.svelte | 0 .../+server.ts} | 0 .../samples/basic/blog/[slug]}/+page.svelte | 0 .../blog/{index.json.js => default.svelte} | 0 .../+page.funk} | 0 .../about/+page.jazz} | 0 .../custom-extension/blog.json/+server.js | 3 + .../custom-extension/blog}/+page.svelte | 0 .../blog/[slug].json/+server.js | 2 + .../{about.jazz => blog/[slug]/+page.beebop} | 0 .../+layout-a.svelte} | 0 .../+layout-a@x.svelte} | 0 .../%23/+page.svelte} | 0 .../.well-known/dnt-policy.txt/+server.js | 2 + .../+page.svelte} | 0 .../hidden-underscore/e/f/g/h/+server.js | 2 + .../invalid-params/[foo][bar]/+server.js | 2 + .../test/samples/lockfiles/foo/+server.js | 2 + .../foo/+server.js_tmp} | 0 .../multiple-slugs/[file].[ext]/+server.js | 2 + .../+layout-default.svelte} | 0 .../+page@missing.svelte} | 0 .../+layout-a@b.svelte} | 0 .../+layout-b@a.svelte} | 0 .../+page@a.svelte} | 0 .../+layout-a@a.svelte} | 0 .../+page@a.svelte} | 0 .../+layout-a@default.svelte} | 0 .../+layout@a.svelte} | 0 .../+page.svelte} | 0 .../+layout-home@default.svelte} | 0 .../+layout-special.svelte} | 0 .../{__layout.svelte => +layout.svelte} | 0 .../a/+layout.svelte} | 0 .../a/a1/+page.svelte} | 0 .../a/a2/+page@special.svelte} | 0 .../b/+layout-alsospecial@special.svelte} | 0 .../a.js => named-layouts/b/c/+layout.svelte} | 0 .../samples/named-layouts/b/c/__layout.svelte | 0 .../b/c/c1/+page@alsospecial.svelte} | 0 .../named-layouts/b/c/c1@alsospecial.svelte | 0 .../b/c/c2/+page@home.svelte} | 0 .../samples/named-layouts/b/c/c2@home.svelte | 0 .../b/d/+layout-extraspecial@special.svelte} | 0 .../b/d/+layout-special.svelte} | 0 .../b/d/+page@special.svelte} | 0 .../b/d/__layout-extraspecial@special.svelte | 0 .../named-layouts/b/d/__layout-special.svelte | 0 .../test/samples/named-layouts/b/d/d1.svelte | 0 .../b/d/d1/+page.svelte} | 0 .../b/d/d2/+page@extraspecial.svelte} | 0 .../named-layouts/b/d/d2@extraspecial.svelte | 0 .../named-layouts/b/d/index@special.svelte | 0 .../foo/+layout.svelte} | 0 .../samples/nested-errors/foo/__layout.svelte | 0 .../foo/bar/+error.svelte} | 0 .../nested-errors/foo/bar/__error.svelte | 0 .../foo/bar/baz/+error.svelte} | 0 .../foo/bar/baz/+layout.svelte} | 0 .../foo/bar/baz/+page.svelte} | 0 .../nested-errors/foo/bar/baz/__error.svelte | 0 .../nested-errors/foo/bar/baz/__layout.svelte | 0 .../nested-errors/foo/bar/baz/index.svelte | 0 .../rest-prefix-suffix/[...rest].json.js | 0 .../[...rest].json/+server.js | 2 + .../prefix-[...rest].svelte | 0 .../prefix-[...rest]/+page.svelte} | 0 .../test/samples/rest/a/[...rest].js | 0 .../test/samples/rest/a/[...rest].svelte | 0 .../samples/rest/a/[...rest]/+page.server.js | 2 + .../a/[...rest]/+page.svelte} | 0 .../test/samples/rest/b/[...rest].svelte | 0 .../test/samples/rest/b/[...rest].ts | 0 .../samples/rest/b/[...rest]/+page.server.ts | 2 + .../b/[...rest]/+page.svelte} | 0 .../+page.svelte} | 0 .../[...anotherrest]/+page.svelte} | 0 .../sorting/[...anotherrest]/index.svelte | 0 .../[...rest]/+page.svelte} | 0 .../test/samples/sorting/[...rest]/abc.svelte | 0 .../[...rest]/abc/+page.svelte} | 0 .../[...rest]/deep/+page.svelte} | 0 .../deep/[...deep_rest]/+page.svelte} | 0 .../deep/[...deep_rest]/index.svelte | 0 .../[...rest]/deep/[...deep_rest]/xyz.svelte | 0 .../deep/[...deep_rest]/xyz/+page.svelte} | 0 .../sorting/[...rest]/deep/index.svelte | 0 .../samples/sorting/[...rest]/index.svelte | 0 .../test/samples/sorting/[endpoint].js | 0 .../samples/sorting/[endpoint]/+server.js | 2 + .../test/samples/sorting/[wildcard].svelte | 0 .../[wildcard]/+page.svelte} | 0 .../test/samples/sorting/about.svelte | 0 .../about/+page.svelte} | 0 .../test/samples/sorting/index.svelte | 0 .../post/+page.svelte} | 0 .../test/samples/sorting/post/[id].svelte | 0 .../post/[id]/+page.svelte} | 0 .../test/samples/sorting/post/bar.svelte | 0 .../post/bar/+page.svelte} | 0 .../test/samples/sorting/post/f[xx].svelte | 0 .../post/f[xx]/+page.svelte} | 0 .../test/samples/sorting/post/f[yy].json.js | 0 .../sorting/post/f[yy].json/+server.js | 2 + .../test/samples/sorting/post/f[yy].svelte | 0 .../post/f[yy]/+page.svelte} | 0 .../test/samples/sorting/post/f[zz].ts | 0 .../samples/sorting/post/f[zz]/+server.ts | 2 + .../test/samples/sorting/post/foo.svelte | 0 .../post/foo/+page.svelte} | 0 .../test/samples/sorting/post/index.svelte | 0 .../a/a1.svelte => symlinks/bar/+page.svelte} | 0 .../test/samples/symlinks/bar/index.svelte | 0 .../routes/+page.svelte} | 0 .../test/samples/symlinks/routes/index.svelte | 0 .../core/sync/create_manifest_data/types.d.ts | 34 ++ packages/kit/src/core/sync/sync.js | 5 +- .../src/core/sync/write_client_manifest.js | 79 +++ packages/kit/src/core/sync/write_manifest.js | 57 -- packages/kit/src/core/sync/write_root.js | 11 +- packages/kit/src/core/sync/write_types.js | 252 ++++++-- packages/kit/src/index/index.js | 21 + packages/kit/src/index/private.js | 33 + packages/kit/src/runtime/client/ambient.d.ts | 6 +- packages/kit/src/runtime/client/client.js | 576 ++++++++---------- packages/kit/src/runtime/client/parse.js | 16 +- packages/kit/src/runtime/client/start.js | 2 +- packages/kit/src/runtime/client/types.d.ts | 21 +- .../kit/src/runtime/components/error.svelte | 27 +- packages/kit/src/runtime/load.js | 84 --- packages/kit/src/runtime/server/endpoint.js | 131 +--- .../kit/src/runtime/server/endpoint.spec.js | 24 - packages/kit/src/runtime/server/index.js | 63 +- packages/kit/src/runtime/server/page/fetch.js | 265 ++++++++ packages/kit/src/runtime/server/page/index.js | 434 ++++++++++++- .../kit/src/runtime/server/page/load_data.js | 49 ++ .../kit/src/runtime/server/page/load_node.js | 560 ----------------- .../kit/src/runtime/server/page/render.js | 69 +-- .../kit/src/runtime/server/page/respond.js | 275 --------- .../runtime/server/page/respond_with_error.js | 58 +- .../kit/src/runtime/server/page/types.d.ts | 20 +- packages/kit/src/runtime/server/utils.js | 42 +- packages/kit/src/runtime/server/utils.spec.js | 9 +- packages/kit/src/utils/http.js | 22 - packages/kit/src/utils/http.spec.js | 26 +- packages/kit/src/vite/build/build_server.js | 82 ++- packages/kit/src/vite/build/utils.js | 4 +- packages/kit/src/vite/dev/index.js | 148 +++-- packages/kit/src/vite/index.js | 50 +- .../apps/amp/src/routes/origin/+page.svelte | 2 +- .../{Unused/+page.svelte => Unused.svelte} | 0 .../apps/amp/src/routes/valid.json/+server.js | 6 +- .../apps/amp/src/routes/valid/+page.svelte | 4 +- packages/kit/test/apps/basics/src/app.d.ts | 9 - .../test/apps/basics/src/routes/+error.svelte | 2 +- .../test/apps/basics/src/routes/+layout.js | 2 +- .../apps/basics/src/routes/caching/+page.js | 6 +- .../caching/private/has-session/+page.js | 10 - .../caching/private/has-session/+page.svelte | 1 - .../private/uses-cache-private/+page.js | 8 - .../private/uses-cache-private/+page.svelte | 1 - .../private/uses-fetch.json/+server.js | 8 - .../caching/private/uses-fetch/+page.js | 15 - .../caching/private/uses-fetch/+page.svelte | 1 - .../private/uses-session-in-init/+page.js | 10 - .../private/uses-session-in-init/+page.svelte | 7 - .../private/uses-session-in-load/+page.js | 15 - .../private/uses-session-in-load/+page.svelte | 5 - .../routes/encoded/redirected/+page.svelte | 2 +- .../routes/endpoint-output/empty/+server.js | 4 - .../routes/endpoint-output/fetched/+server.js | 7 - .../endpoint-output/headers-object/+server.js | 8 - .../routes/endpoint-output/headers/+server.js | 8 - .../routes/endpoint-output/null/+server.js | 4 - .../routes/endpoint-output/proxy/+server.js | 2 - .../routes/endpoint-output/simple/+server.js | 8 - .../stream-typeerror/+server.js | 4 +- .../endpoint-output/xml-bytes/+server.js | 8 - .../endpoint-output/xml-text/+server.js | 5 - .../errors/endpoint-not-ok.json/+server.js | 4 - .../routes/errors/endpoint-not-ok/+page.js | 11 - .../errors/endpoint-not-ok/+page.svelte | 1 - .../src/routes/errors/endpoint/+page.js | 4 +- .../load-error-malformed-server/+page.js | 7 - .../routes/errors/load-error-server/+page.js | 2 +- .../load-status-without-error-server/+page.js | 6 - .../get-explicit/+page.server.js | 3 +- .../post-explicit/+page.server.js | 3 +- .../basics/src/routes/etag/binary/+server.js | 8 - .../basics/src/routes/etag/custom/+server.js | 11 - .../basics/src/routes/etag/text/+server.js | 8 - .../routes/load/change-detection/+layout.js | 19 +- .../load/change-detection/+layout.svelte | 2 - .../load/dynamic-import-styles/+page.svelte | 3 +- .../routes/load/{stuff => parent}/+layout.js | 0 .../load/{stuff => parent}/+layout.svelte | 0 .../load/{stuff => parent}/[x]/+layout.js | 0 .../load/{stuff => parent}/[x]/+layout.svelte | 0 .../load/{stuff => parent}/[x]/[y]/+layout.js | 0 .../{stuff => parent}/[x]/[y]/+layout.svelte | 0 .../{stuff => parent}/[x]/[y]/[z]/+page.js | 0 .../load/parent/[x]/[y]/[z]/+page.svelte | 6 + .../basics/src/routes/load/props/+page.js | 4 +- .../basics/src/routes/load/props/+page.svelte | 2 +- .../src/routes/load/props/about/+page.svelte | 2 +- .../load/stuff/[x]/[y]/[z]/+page.svelte | 7 - .../nested-layout/foo/bar/+error.svelte | 23 +- .../mutative-endpoint/+page.svelte | 6 - .../basics/src/routes/query/echo/+page.js | 15 +- .../basics/src/routes/query/echo/+page.svelte | 1 + .../basics/src/routes/query/echo/utils.js | 14 + .../routes/shadowed/error-post/+page.svelte | 3 + .../routes/shadowed/simple/+page.server.js | 2 +- .../src/routes/store/data/+error.svelte | 6 + .../routes/store/{stuff => data}/+layout.js | 0 .../src/routes/store/data/+layout.svelte | 13 + .../src/routes/store/data/[item]/+page.js | 17 + .../routes/store/data/[item]/+page.svelte} | 0 .../routes/store/{stuff => data}/foo/+page.js | 4 +- .../store/{stuff => data}/foo/+page.svelte | 0 .../src/routes/store/stuff/+error.svelte | 20 - .../src/routes/store/stuff/+layout.svelte | 9 - .../src/routes/store/stuff/[item]/+page.js | 24 - .../apps/basics/src/routes/xss/+page.svelte | 2 +- .../apps/basics/src/routes/xss/query/+page.js | 15 +- .../basics/src/routes/xss/query/+page.svelte | 1 + .../apps/basics/src/routes/xss/query/utils.js | 14 + .../src/routes/xss/shadow/+page.server.js | 2 +- .../kit/test/apps/basics/test/server.test.js | 250 +------- packages/kit/test/apps/basics/test/test.js | 163 ++--- .../kit/test/apps/options/source/app.d.ts | 2 - packages/kit/test/apps/options/test/test.js | 2 +- packages/kit/test/apps/writes/src/app.d.ts | 2 - packages/kit/test/apps/writes/test/test.js | 10 +- .../routes/fetch-image/[...slug]/+server.js | 16 +- .../basics/src/routes/max-age/+page.js | 9 +- packages/kit/test/typings/endpoint.test.ts | 195 ------ packages/kit/test/typings/tsconfig.json | 7 - packages/kit/test/utils.js | 12 +- packages/kit/types/ambient.d.ts | 7 - packages/kit/types/index.d.ts | 83 +-- packages/kit/types/internal.d.ts | 86 +-- packages/kit/types/private.d.ts | 1 + packages/migrate/migrations/routes/index.js | 4 +- pnpm-lock.yaml | 22 +- 264 files changed, 2571 insertions(+), 3449 deletions(-) rename packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/{__layout.svelte => +layout.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/{foo/__layout.svelte => +page.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/foo/{index.svelte => +layout.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/{index.svelte => foo/+page.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/basic/{about.svelte => +page.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/basic/{blog/[slug].json.ts => about/+page.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/basic/{blog/[slug].svelte => blog.json/+server.js} (100%) rename packages/kit/{test/apps/basics/src/routes/errors/load-error-malformed-server => src/core/sync/create_manifest_data/test/samples/basic/blog}/+page.svelte (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/{_default.svelte => [slug].json/+server.ts} (100%) rename packages/kit/{test/apps/basics/src/routes/errors/load-status-without-error-server => src/core/sync/create_manifest_data/test/samples/basic/blog/[slug]}/+page.svelte (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/{index.json.js => default.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{basic/blog/index.svelte => custom-extension/+page.funk} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{basic/index.svelte => custom-extension/about/+page.jazz} (100%) create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog.json/+server.js rename packages/kit/{test/apps/basics/src/routes/store/stuff/[item] => src/core/sync/create_manifest_data/test/samples/custom-extension/blog}/+page.svelte (100%) create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/[slug].json/+server.js rename packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/{about.jazz => blog/[slug]/+page.beebop} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{custom-extension/blog/[slug].beebop => duplicate-layout/+layout-a.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{custom-extension/blog/[slug].json.js => duplicate-layout/+layout-a@x.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{custom-extension/blog/index.json.js => encoding/%23/+page.svelte} (100%) create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-dot/.well-known/dnt-policy.txt/+server.js rename packages/kit/src/core/sync/create_manifest_data/test/samples/{custom-extension/blog/index.svelte => hidden-underscore/+page.svelte} (100%) create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-underscore/e/f/g/h/+server.js create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/invalid-params/[foo][bar]/+server.js create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/lockfiles/foo/+server.js rename packages/kit/src/core/sync/create_manifest_data/test/samples/{custom-extension/index.funk => lockfiles/foo/+server.js_tmp} (100%) create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/multiple-slugs/[file].[ext]/+server.js rename packages/kit/src/core/sync/create_manifest_data/test/samples/{duplicate-layout/__layout-a.svelte => named-layout-default/+layout-default.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{duplicate-layout/__layout-a@x.svelte => named-layout-missing/+page@missing.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{encoding/%23.svelte => named-layout-recursive-1/+layout-a@b.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/.a.js => named-layout-recursive-1/+layout-b@a.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/.well-known/dnt-policy.txt.js => named-layout-recursive-1/+page@a.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/__error.svelte => named-layout-recursive-2/+layout-a@a.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/__layout.svelte => named-layout-recursive-2/+page@a.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/_a.js => named-layout-recursive-3/+layout-a@default.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/a.js => named-layout-recursive-3/+layout@a.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/a.md => named-layout-recursive-3/+page.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/a.spec.js => named-layouts/+layout-home@default.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/subdir/.a.js => named-layouts/+layout-special.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/{__layout.svelte => +layout.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/subdir/.well-known/dnt-policy.txt.js => named-layouts/a/+layout.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/subdir/__error.svelte => named-layouts/a/a1/+page.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/subdir/__layout.svelte => named-layouts/a/a2/+page@special.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/subdir/_a.js => named-layouts/b/+layout-alsospecial@special.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/subdir/a.js => named-layouts/b/c/+layout.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/__layout.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/subdir/a.md => named-layouts/b/c/c1/+page@alsospecial.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/c1@alsospecial.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-by-excludes-config/subdir/a.spec.js => named-layouts/b/c/c2/+page@home.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/c2@home.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-dot/.well-known/dnt-policy.txt.js => named-layouts/b/d/+layout-extraspecial@special.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-underscore/e/f/g/h.js => named-layouts/b/d/+layout-special.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{hidden-underscore/index.svelte => named-layouts/b/d/+page@special.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/__layout-extraspecial@special.svelte delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/__layout-special.svelte delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/d1.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{illegal-dunder/__foo.svelte => named-layouts/b/d/d1/+page.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{invalid-params/[foo][bar].js => named-layouts/b/d/d2/+page@extraspecial.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/d2@extraspecial.svelte delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/index@special.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{invalid-qualifier/[foo([a-z]([0-9]))].js => nested-errors/foo/+layout.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/__layout.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{legal-dunder/__test__/legal.test.svelte => nested-errors/foo/bar/+error.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/__error.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{legal-dunder/__tests__/legal.test.svelte => nested-errors/foo/bar/baz/+error.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{lockfiles/foo.js => nested-errors/foo/bar/baz/+layout.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{lockfiles/foo.js_tmp => nested-errors/foo/bar/baz/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/__error.svelte delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/__layout.svelte delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/index.svelte delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/rest-prefix-suffix/[...rest].json.js create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/rest-prefix-suffix/[...rest].json/+server.js delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/rest-prefix-suffix/prefix-[...rest].svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{multiple-slugs/[file].[ext].js => rest-prefix-suffix/prefix-[...rest]/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/rest/a/[...rest].js delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/rest/a/[...rest].svelte create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/rest/a/[...rest]/+page.server.js rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-default/__layout-default.svelte => rest/a/[...rest]/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/rest/b/[...rest].svelte delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/rest/b/[...rest].ts create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/rest/b/[...rest]/+page.server.ts rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-missing/index@missing.svelte => rest/b/[...rest]/+page.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-on-directory-1/__layout-a.svelte => sorting/+page.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-on-directory-1/foo@a/index.svelte => sorting/[...anotherrest]/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...anotherrest]/index.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-on-directory-2/__layout-a.svelte => sorting/[...rest]/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/abc.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-on-directory-2/foo@a/bar.svelte => sorting/[...rest]/abc/+page.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-recursive-1/__layout-a@b.svelte => sorting/[...rest]/deep/+page.svelte} (100%) rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-recursive-1/__layout-b@a.svelte => sorting/[...rest]/deep/[...deep_rest]/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/[...deep_rest]/index.svelte delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/[...deep_rest]/xyz.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-recursive-1/index@a.svelte => sorting/[...rest]/deep/[...deep_rest]/xyz/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/index.svelte delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/index.svelte delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[endpoint].js create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[endpoint]/+server.js delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[wildcard].svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-recursive-2/__layout-a@a.svelte => sorting/[wildcard]/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/about.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-recursive-2/index@a.svelte => sorting/about/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/index.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-recursive-3/__layout-a@default.svelte => sorting/post/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/[id].svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-recursive-3/__layout@a.svelte => sorting/post/[id]/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/bar.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layout-recursive-3/index.svelte => sorting/post/bar/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[xx].svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layouts/__layout-home@default.svelte => sorting/post/f[xx]/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[yy].json.js create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[yy].json/+server.js delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[yy].svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layouts/__layout-special.svelte => sorting/post/f[yy]/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[zz].ts create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[zz]/+server.ts delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/foo.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layouts/a/__layout.svelte => sorting/post/foo/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/index.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layouts/a/a1.svelte => symlinks/bar/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/symlinks/bar/index.svelte rename packages/kit/src/core/sync/create_manifest_data/test/samples/{named-layouts/a/a2@special.svelte => symlinks/routes/+page.svelte} (100%) delete mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/symlinks/routes/index.svelte create mode 100644 packages/kit/src/core/sync/create_manifest_data/types.d.ts create mode 100644 packages/kit/src/core/sync/write_client_manifest.js delete mode 100644 packages/kit/src/core/sync/write_manifest.js create mode 100644 packages/kit/src/index/index.js create mode 100644 packages/kit/src/index/private.js delete mode 100644 packages/kit/src/runtime/load.js delete mode 100644 packages/kit/src/runtime/server/endpoint.spec.js create mode 100644 packages/kit/src/runtime/server/page/fetch.js create mode 100644 packages/kit/src/runtime/server/page/load_data.js delete mode 100644 packages/kit/src/runtime/server/page/load_node.js delete mode 100644 packages/kit/src/runtime/server/page/respond.js rename packages/kit/test/apps/amp/src/routes/styles/{Unused/+page.svelte => Unused.svelte} (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/endpoint-output/empty/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/endpoint-output/fetched/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/endpoint-output/headers-object/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/endpoint-output/headers/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/endpoint-output/null/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/endpoint-output/proxy/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/endpoint-output/simple/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/endpoint-output/xml-bytes/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/endpoint-output/xml-text/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.json/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/etag/binary/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/etag/custom/+server.js delete mode 100644 packages/kit/test/apps/basics/src/routes/etag/text/+server.js rename packages/kit/test/apps/basics/src/routes/load/{stuff => parent}/+layout.js (100%) rename packages/kit/test/apps/basics/src/routes/load/{stuff => parent}/+layout.svelte (100%) rename packages/kit/test/apps/basics/src/routes/load/{stuff => parent}/[x]/+layout.js (100%) rename packages/kit/test/apps/basics/src/routes/load/{stuff => parent}/[x]/+layout.svelte (100%) rename packages/kit/test/apps/basics/src/routes/load/{stuff => parent}/[x]/[y]/+layout.js (100%) rename packages/kit/test/apps/basics/src/routes/load/{stuff => parent}/[x]/[y]/+layout.svelte (100%) rename packages/kit/test/apps/basics/src/routes/load/{stuff => parent}/[x]/[y]/[z]/+page.js (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/load/parent/[x]/[y]/[z]/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/query/echo/utils.js create mode 100644 packages/kit/test/apps/basics/src/routes/store/data/+error.svelte rename packages/kit/test/apps/basics/src/routes/store/{stuff => data}/+layout.js (100%) create mode 100644 packages/kit/test/apps/basics/src/routes/store/data/+layout.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/store/data/[item]/+page.js rename packages/kit/{src/core/sync/create_manifest_data/test/samples/named-layouts/b/__layout-alsospecial@special.svelte => test/apps/basics/src/routes/store/data/[item]/+page.svelte} (100%) rename packages/kit/test/apps/basics/src/routes/store/{stuff => data}/foo/+page.js (89%) rename packages/kit/test/apps/basics/src/routes/store/{stuff => data}/foo/+page.svelte (100%) delete mode 100644 packages/kit/test/apps/basics/src/routes/store/stuff/+error.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/store/stuff/+layout.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/store/stuff/[item]/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/xss/query/utils.js delete mode 100644 packages/kit/test/typings/endpoint.test.ts delete mode 100644 packages/kit/test/typings/tsconfig.json diff --git a/packages/adapter-static/test/apps/spa/src/routes/+error.svelte b/packages/adapter-static/test/apps/spa/src/routes/+error.svelte index 17dd1aaeb339..915006a71fbd 100644 --- a/packages/adapter-static/test/apps/spa/src/routes/+error.svelte +++ b/packages/adapter-static/test/apps/spa/src/routes/+error.svelte @@ -1,27 +1,13 @@ - -

{$page.status}

-

count: {count}

+

count: {$session.count}

diff --git a/packages/create-svelte/templates/default/src/app.d.ts b/packages/create-svelte/templates/default/src/app.d.ts index 76372f545e22..f7e052adaabc 100644 --- a/packages/create-svelte/templates/default/src/app.d.ts +++ b/packages/create-svelte/templates/default/src/app.d.ts @@ -13,6 +13,4 @@ declare namespace App { // interface PublicEnv {} // interface Session {} - - // interface Stuff {} } diff --git a/packages/create-svelte/templates/skeleton/src/app.d.ts b/packages/create-svelte/templates/skeleton/src/app.d.ts index f69cbcbf5910..f2845e42d8fb 100644 --- a/packages/create-svelte/templates/skeleton/src/app.d.ts +++ b/packages/create-svelte/templates/skeleton/src/app.d.ts @@ -7,5 +7,4 @@ declare namespace App { // interface PrivateEnv {} // interface PublicEnv {} // interface Session {} - // interface Stuff {} } diff --git a/packages/kit/package.json b/packages/kit/package.json index 8a13e25b9473..19c7abe94c0d 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -28,12 +28,11 @@ "cross-env": "^7.0.3", "devalue": "^2.0.1", "kleur": "^4.1.4", - "locate-character": "^2.0.5", + "magic-string": "^0.26.2", "marked": "^4.0.16", "mime": "^3.0.0", "node-fetch": "^3.2.4", "rollup": "^2.75.7", - "selfsigned": "^2.0.1", "set-cookie-parser": "^2.4.8", "sirv": "^2.0.2", "svelte": "^3.48.0", @@ -67,10 +66,9 @@ "check:all": "tsc && pnpm -r --filter=\"./**\" check", "format": "npm run lint -- --write", "prepublishOnly": "npm run build", - "test": "npm run test:unit && npm run test:typings && npm run test:packaging && npm run test:integration", + "test": "npm run test:unit && npm run test:packaging && npm run test:integration", "test:integration": "pnpm run -r --workspace-concurrency 1 --filter=\"./test/**\" test", "test:unit": "uvu src \"(spec\\.js|test[\\\\/]index\\.js)\" -i packaging", - "test:typings": "tsc --project test/typings", "test:packaging": "uvu src/packaging \"(spec\\.js|test[\\\\/]index\\.js)\"", "types": "node scripts/extract-types.js", "postinstall": "node svelte-kit.js sync" @@ -78,6 +76,7 @@ "exports": { "./package.json": "./package.json", ".": { + "import": "./dist/index.js", "types": "./types/index.d.ts" }, "./node": { diff --git a/packages/kit/rollup.config.js b/packages/kit/rollup.config.js index 884eba331230..0783a9711dd5 100644 --- a/packages/kit/rollup.config.js +++ b/packages/kit/rollup.config.js @@ -11,87 +11,59 @@ const external = [].concat( Object.keys(pkg.peerDependencies || {}), Object.keys(process.binding('natives')), 'typescript', - 'svelte2tsx' + 'svelte2tsx', + 'svelte', + 'svelte/store', + '__GENERATED__/root.svelte', + '__GENERATED__/client-manifest.js' ); -export default [ - { - input: { - 'client/start': 'src/runtime/client/start.js', - 'client/singletons': 'src/runtime/client/singletons.js', - 'app/navigation': 'src/runtime/app/navigation.js', - 'app/stores': 'src/runtime/app/stores.js', - 'app/paths': 'src/runtime/app/paths.js', - 'app/env': 'src/runtime/app/env.js', - 'env/dynamic/private': 'src/runtime/env/dynamic/private.js', - 'env/dynamic/public': 'src/runtime/env/dynamic/public.js', - 'env-private': 'src/runtime/env-private.js', - 'env-public': 'src/runtime/env-public.js', - paths: 'src/runtime/paths.js', - env: 'src/runtime/env.js' - }, - output: { - dir: 'assets', - format: 'esm', - chunkFileNames: 'chunks/[name].js' - }, - external: [ - 'svelte', - 'svelte/store', - '__GENERATED__/root.svelte', - '__GENERATED__/client-manifest.js' - ], - plugins: [ - resolve({ - extensions: ['.mjs', '.js', '.ts'] - }) - ] - }, +export default { + input: { + // TODO move assets to dist/assets + 'assets/client/start': 'src/runtime/client/start.js', + 'assets/client/singletons': 'src/runtime/client/singletons.js', + 'assets/app/navigation': 'src/runtime/app/navigation.js', + 'assets/app/stores': 'src/runtime/app/stores.js', + 'assets/app/paths': 'src/runtime/app/paths.js', + 'assets/app/env': 'src/runtime/app/env.js', + 'assets/env/dynamic/private': 'src/runtime/env/dynamic/private.js', + 'assets/env/dynamic/public': 'src/runtime/env/dynamic/public.js', + 'assets/env-private': 'src/runtime/env-private.js', + 'assets/env-public': 'src/runtime/env-public.js', + 'assets/paths': 'src/runtime/paths.js', + 'assets/env': 'src/runtime/env.js', + 'assets/server/index': 'src/runtime/server/index.js', - { - input: 'src/runtime/server/index.js', - output: { - format: 'esm', - file: 'assets/server/index.js' - }, - plugins: [ - resolve({ - extensions: ['.mjs', '.js', '.ts'] - }), - commonjs() - ] + // TODO move dist to dist/exports + 'dist/cli': 'src/cli.js', + 'dist/index': 'src/index/index.js', + 'dist/hooks': 'src/hooks.js', + 'dist/node': 'src/node/index.js', + 'dist/node/polyfills': 'src/node/polyfills.js', + 'dist/prerender': 'src/core/prerender/prerender.js', + 'dist/vite': 'src/vite/index.js' }, - - { - input: { - cli: 'src/cli.js', - hooks: 'src/hooks.js', - node: 'src/node/index.js', - 'node/polyfills': 'src/node/polyfills.js', - prerender: 'src/core/prerender/prerender.js', - vite: 'src/vite/index.js' - }, - output: { - dir: 'dist', - format: 'esm', - chunkFileNames: 'chunks/[name].js' - }, - external: (id) => { - return id.startsWith('node:') || external.includes(id); - }, - plugins: [ - replace({ - preventAssignment: true, - values: { - __VERSION__: pkg.version, - 'process.env.BUNDLED': 'true' - } - }), - resolve({ - extensions: ['.mjs', '.js', '.ts'] - }), - commonjs() - ], - preserveEntrySignatures: true - } -]; + output: { + dir: '.', + format: 'esm', + chunkFileNames: 'dist/chunks/[name].js' + }, + external: (id) => { + return id.startsWith('node:') || external.includes(id); + }, + plugins: [ + replace({ + preventAssignment: true, + values: { + __VERSION__: pkg.version, + 'process.env.BUNDLED': 'true' + } + }), + resolve({ + extensions: ['.mjs', '.js', '.ts'] + }), + commonjs() + ], + preserveEntrySignatures: true +}; diff --git a/packages/kit/src/core/adapt/builder.js b/packages/kit/src/core/adapt/builder.js index d54628378bf6..b2ea2d26811b 100644 --- a/packages/kit/src/core/adapt/builder.js +++ b/packages/kit/src/core/adapt/builder.js @@ -18,8 +18,9 @@ export function create_builder({ config, build_data, prerendered, log }) { /** @param {import('types').RouteData} route */ // TODO routes should come pre-filtered function not_prerendered(route) { - if (route.type === 'page' && route.path) { - return !prerendered_paths.has(route.path) && !prerendered_paths.has(route.path + '/'); + const path = route.type === 'page' && !route.id.includes('[') && `/${route.id}`; + if (path) { + return !prerendered_paths.has(path) && !prerendered_paths.has(path + '/'); } return true; diff --git a/packages/kit/src/core/config/index.spec.js b/packages/kit/src/core/config/index.spec.js index 1467c74bb779..4d31adcf9a18 100644 --- a/packages/kit/src/core/config/index.spec.js +++ b/packages/kit/src/core/config/index.spec.js @@ -120,6 +120,7 @@ const get_defaults = (prefix = '') => ({ }, protocol: undefined, router: undefined, + routes: undefined, ssr: undefined, target: undefined, trailingSlash: 'never', diff --git a/packages/kit/src/core/config/options.js b/packages/kit/src/core/config/options.js index c83d3e9b009c..7abba322254a 100644 --- a/packages/kit/src/core/config/options.js +++ b/packages/kit/src/core/config/options.js @@ -291,7 +291,11 @@ const options = object( // TODO remove for 1.0 router: error((keypath) => `${keypath} has been moved to config.kit.browser.router`), - routes: fun((filepath) => !/(?:(?:^_|\/_)|(?:^\.|\/\.)(?!well-known))/.test(filepath)), + // TODO remove for 1.0 + routes: error( + (keypath) => + `${keypath} has been removed. See https://github.com/sveltejs/kit/discussions/5774 for details` + ), serviceWorker: object({ register: boolean(true), diff --git a/packages/kit/src/core/generate_manifest/index.js b/packages/kit/src/core/generate_manifest/index.js index 983c8501e99c..e2038e513041 100644 --- a/packages/kit/src/core/generate_manifest/index.js +++ b/packages/kit/src/core/generate_manifest/index.js @@ -14,33 +14,14 @@ import { get_mime_lookup } from '../utils.js'; */ export function generate_manifest({ build_data, relative_path, routes, format = 'esm' }) { /** @typedef {{ index: number, path: string }} LookupEntry */ - /** @type {Map} */ + /** @type {Map} */ const bundled_nodes = new Map(); - // 0 and 1 are special, they correspond to the root layout and root error nodes - bundled_nodes.set(build_data.manifest_data.components[0], { - path: `${relative_path}/nodes/0.js`, - index: 0 - }); - - bundled_nodes.set(build_data.manifest_data.components[1], { - path: `${relative_path}/nodes/1.js`, - index: 1 - }); - - routes.forEach((route) => { - if (route.type === 'page') { - [...route.a, ...route.b].forEach((component) => { - if (component && !bundled_nodes.has(component)) { - const i = build_data.manifest_data.components.indexOf(component); - - bundled_nodes.set(component, { - path: `${relative_path}/nodes/${i}.js`, - index: bundled_nodes.size - }); - } - }); - } + build_data.manifest_data.nodes.forEach((node, i) => { + bundled_nodes.set(node, { + path: `${relative_path}/nodes/${i}.js`, + index: i + }); }); /** @type {(path: string) => string} */ @@ -57,7 +38,7 @@ export function generate_manifest({ build_data, relative_path, routes, format = assets.push(build_data.service_worker); } - /** @param {string | undefined} id */ + /** @param {import('types').PageNode | undefined} id */ const get_index = (id) => id && /** @type {LookupEntry} */ (bundled_nodes.get(id)).index; const matchers = new Set(); @@ -87,10 +68,9 @@ export function generate_manifest({ build_data, relative_path, routes, format = pattern: ${pattern}, names: ${s(names)}, types: ${s(types)}, - path: ${route.path ? s(route.path) : null}, - shadow: ${route.shadow ? loader(`${relative_path}/${build_data.server.vite_manifest[route.shadow].file}`) : null}, - a: ${s(route.a.map(get_index))}, - b: ${s(route.b.map(get_index))} + errors: ${s(route.errors.map(get_index))}, + layouts: ${s(route.layouts.map(get_index))}, + page: ${s(get_index(route.page))} }`.replace(/^\t\t/gm, ''); } else { if (!build_data.server.vite_manifest[route.file]) { diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index 80471728d105..93d535efdd6c 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -343,7 +343,7 @@ export async function prerender() { /** @type {import('types').ManifestData} */ const { routes } = (await import(pathToFileURL(manifest_path).href)).manifest._; const entries = routes - .map((route) => (route.type === 'page' ? route.path : '')) + .map((route) => (route.type === 'page' && !route.id.includes('[') ? `/${route.id}` : '')) .filter(Boolean); for (const entry of entries) { diff --git a/packages/kit/src/core/sync/create_manifest_data/index.js b/packages/kit/src/core/sync/create_manifest_data/index.js index 004b3a1f39de..05d41d9a08d9 100644 --- a/packages/kit/src/core/sync/create_manifest_data/index.js +++ b/packages/kit/src/core/sync/create_manifest_data/index.js @@ -5,47 +5,6 @@ import { get_runtime_directory } from '../../utils.js'; import { posixify } from '../../../utils/filesystem.js'; import { parse_route_id } from '../../../utils/routing.js'; -/** - * A portion of a file or directory name where the name has been split into - * static and dynamic parts - * @typedef {{ - * content: string; - * dynamic: boolean; - * rest: boolean; - * type: string | null; - * }} Part - */ - -/** - * A route, consisting of an endpoint module and/or an array of components - * (n layouts and one leaf) for successful navigations and an array of - * n error components to render if navigation fails - * @typedef {{ - * id: string; - * pattern: RegExp; - * segments: Part[][]; - * page?: { - * a: Array; - * b: Array; - * }; - * endpoint?: string; - * }} Unit - */ - -/** - * @typedef {{ - * error: string | undefined; - * layouts: Record - * }} Node - */ - -/** - * @typedef {Map} Tree - */ - -const layout_pattern = /^__layout(?:-([a-zA-Z0-9_-]+))?(?:@([a-zA-Z0-9_-]+))?$/; -const dunder_pattern = /(^|\/)__(?!tests?__)/; // forbid __-prefixed files/directories except __error, __layout[-...], __test__, __tests__ - const DEFAULT = 'default'; /** @@ -61,195 +20,215 @@ export default function create_manifest_data({ fallback = `${get_runtime_directory(config.kit)}/components`, cwd = process.cwd() }) { - /** @type {import('types').RouteData[]} */ - const routes = []; + /** @type {Map} */ + const route_map = new Map(); - /** @type {Map} */ - const units = new Map(); + /** @type {Map} */ + const segment_map = new Map(); - /** @type {Tree} */ + /** @type {import('./types').RouteTree} */ const tree = new Map(); const default_layout = { - file: posixify(path.relative(cwd, `${fallback}/layout.svelte`)), - name: DEFAULT + component: posixify(path.relative(cwd, `${fallback}/layout.svelte`)) }; // set default root layout/error tree.set('', { - error: posixify(path.relative(cwd, `${fallback}/error.svelte`)), + error: { + component: posixify(path.relative(cwd, `${fallback}/error.svelte`)) + }, layouts: { [DEFAULT]: default_layout } }); + /** @param {string} id */ + function tree_node(id) { + if (!tree.has(id)) { + tree.set(id, { + error: undefined, + layouts: {} + }); + } + + return /** @type {import('./types').RouteTreeNode} */ (tree.get(id)); + } + const routes_base = posixify(path.relative(cwd, config.kit.files.routes)); const valid_extensions = [...config.extensions, ...config.kit.moduleExtensions]; if (fs.existsSync(config.kit.files.routes)) { - list_files(config.kit.files.routes).forEach((file) => { - const extension = valid_extensions.find((ext) => file.endsWith(ext)); + list_files(config.kit.files.routes).forEach((filepath) => { + const extension = valid_extensions.find((ext) => filepath.endsWith(ext)); if (!extension) return; - const id = file - .slice(0, -extension.length) - .replace(/(?:^|\/)index((?:@[a-zA-Z0-9_-]+)?(?:\.[a-z]+)?)?$/, '$1'); - const project_relative = `${routes_base}/${file}`; + const project_relative = `${routes_base}/${filepath}`; + const segments = filepath.split('/'); + const file = /** @type {string} */ (segments.pop()); + + if (file[0] !== '+') return; // not a route file - const segments = id.split('/'); - const name = /** @type {string} */ (segments.pop()); + const item = analyze(file, config.extensions, config.kit.moduleExtensions); - if (name === '__layout.reset') { + if (!item) { throw new Error( - '__layout.reset has been removed in favour of named layouts: https://kit.svelte.dev/docs/layouts#named-layouts' + `Files and directories prefixed with + are reserved (saw ${project_relative})` ); } - if (name === '__error' || layout_pattern.test(name)) { - const dir = segments.join('/'); + const id = segments.join('/'); - if (!tree.has(dir)) { - tree.set(dir, { - error: undefined, - layouts: {} - }); - } + if (/\]\[/.test(id)) { + throw new Error(`Invalid route ${project_relative} — parameters must be separated`); + } - const group = /** @type {Node} */ (tree.get(dir)); + if (count_occurrences('[', id) !== count_occurrences(']', id)) { + throw new Error(`Invalid route ${project_relative} — brackets are unbalanced`); + } - if (name === '__error') { - group.error = project_relative; - } else { - const match = /** @type {RegExpMatchArray} */ (layout_pattern.exec(name)); + // error/layout files should be added to the tree, but don't result + // in a route being created, so deal with them first. note: we are + // relying on the fact that the +error and +layout files precede + // +page files alphabetically, and will therefore be processes + // before we reach the page + if (item.kind === 'component' && item.is_error) { + tree_node(id).error = { + component: project_relative + }; - if (match[1] === DEFAULT) { - throw new Error(`${project_relative} cannot use reserved "${DEFAULT}" name`); - } + return; + } + + if (item.is_layout) { + if (item.declares_layout === DEFAULT) { + throw new Error(`${project_relative} cannot use reserved "${DEFAULT}" name`); + } - const layout_id = match[1] || DEFAULT; + const layout_id = item.declares_layout || DEFAULT; - const defined = group.layouts[layout_id]; - if (defined && defined !== default_layout) { - throw new Error( - `Duplicate layout ${project_relative} already defined at ${defined.file}` - ); - } + const group = tree_node(id); - group.layouts[layout_id] = { - file: project_relative, - name - }; + const defined = group.layouts[layout_id] || (group.layouts[layout_id] = {}); + + if (defined[item.kind] && layout_id !== DEFAULT) { + // edge case + throw new Error( + `Duplicate layout ${project_relative} already defined at ${defined[item.kind]}` + ); } + defined[item.kind] = project_relative; + return; - } else if (dunder_pattern.test(file)) { - throw new Error( - `Files and directories prefixed with __ are reserved (saw ${project_relative})` - ); } - if (!config.kit.routes(file)) return; + const type = item.kind === 'module' && !item.is_layout && !item.is_page ? 'endpoint' : 'page'; - if (/\]\[/.test(id)) { - throw new Error(`Invalid route ${project_relative} — parameters must be separated`); + if (type === 'endpoint' && route_map.has(id)) { + // note that we are relying on +server being lexically ordered after + // all other route files — if we added +view or something this is + // potentially brittle, since the server might be added before + // another route file. a problem for another day + throw new Error( + `${file} cannot share a directory with other route files (${project_relative})` + ); } - if (count_occurrences('[', id) !== count_occurrences(']', id)) { - throw new Error(`Invalid route ${project_relative} — brackets are unbalanced`); - } + if (!route_map.has(id)) { + const pattern = parse_route_id(id).pattern; - if (!units.has(id)) { - units.set(id, { + segment_map.set( id, - pattern: parse_route_id(id).pattern, - segments: id - .split('/') - .filter(Boolean) - .map((segment) => { - /** @type {Part[]} */ - const parts = []; - segment.split(/\[(.+?)\]/).map((content, i) => { - const dynamic = !!(i % 2); - - if (!content) return; - - parts.push({ - content, - dynamic, - rest: dynamic && content.startsWith('...'), - type: (dynamic && content.split('=')[1]) || null - }); + segments.filter(Boolean).map((segment) => { + /** @type {import('./types').Part[]} */ + const parts = []; + segment.split(/\[(.+?)\]/).map((content, i) => { + const dynamic = !!(i % 2); + + if (!content) return; + + parts.push({ + content, + dynamic, + rest: dynamic && content.startsWith('...'), + type: (dynamic && content.split('=')[1]) || null }); - return parts; - }), - page: undefined, - endpoint: undefined - }); + }); + return parts; + }) + ); + + if (type === 'endpoint') { + route_map.set(id, { + type, + id, + pattern, + file: project_relative + }); + } else { + route_map.set(id, { + type, + id, + pattern, + errors: [], + layouts: [], + page: {} + }); + } } - const unit = /** @type {Unit} */ (units.get(id)); + if (item.is_page) { + const route = /** @type {import('types').PageData} */ (route_map.get(id)); - if (config.extensions.find((ext) => file.endsWith(ext))) { - const { layouts, errors } = trace(project_relative, file, tree, config.extensions); - unit.page = { - a: layouts.concat(project_relative), - b: errors - }; - } else { - unit.endpoint = project_relative; + if (item.kind === 'component') { + route.page.component = project_relative; + + const { layouts, errors } = trace(tree, id, item.uses_layout, project_relative); + route.layouts = layouts; + route.errors = errors; + } else if (item.is_server) { + route.page.server = project_relative; + } else { + route.page.module = project_relative; + } } }); + + // TODO remove for 1.0 + if (route_map.size === 0) { + throw new Error( + 'The filesystem router API has changed, see https://github.com/sveltejs/kit/discussions/5774 for details' + ); + } } - /** @type {string[]} */ - const components = []; + /** @type {import('types').PageNode[]} */ + const nodes = []; tree.forEach(({ layouts, error }) => { // we do [default, error, ...other_layouts] so that components[0] and [1] // are the root layout/error. kinda janky, there's probably a nicer way if (layouts[DEFAULT]) { - components.push(layouts[DEFAULT].file); + nodes.push(layouts[DEFAULT]); } if (error) { - components.push(error); + nodes.push(error); } for (const id in layouts) { - if (id !== DEFAULT) components.push(layouts[id].file); + if (id !== DEFAULT) { + nodes.push(layouts[id]); + } } }); - units.forEach((unit) => { - if (unit.page) { - const leaf = /** @type {string} */ (unit.page.a[unit.page.a.length - 1]); - components.push(leaf); + route_map.forEach((route) => { + if (route.type === 'page') { + nodes.push(route.page); } }); - Array.from(units.values()) - .sort(compare) - .forEach((unit) => { - // TODO when we introduce layout endpoints and scoped middlewares, we - // will probably want to have a single unified route type here - // (created in the list_files(...).forEach(...) callback) - if (unit.page) { - routes.push({ - type: 'page', - id: unit.id, - pattern: unit.pattern, - path: unit.id.includes('[') ? '' : `/${unit.id.replace(/@(?:[a-zA-Z0-9_-]+)/g, '')}`, - shadow: unit.endpoint || null, - a: unit.page.a, - b: unit.page.b - }); - } else if (unit.endpoint) { - routes.push({ - type: 'endpoint', - id: unit.id, - pattern: unit.pattern, - file: unit.endpoint - }); - } - }); + const routes = Array.from(route_map.values()).sort((a, b) => compare(a, b, segment_map)); /** @type {import('types').Asset[]} */ const assets = fs.existsSync(config.kit.files.assets) @@ -289,7 +268,7 @@ export default function create_manifest_data({ return { assets, - components, + nodes, routes, matchers }; @@ -297,39 +276,79 @@ export default function create_manifest_data({ /** * @param {string} file - * @param {string} path - * @param {Tree} tree - * @param {string[]} extensions + * @param {string[]} component_extensions + * @param {string[]} module_extensions + * @returns {import('./types').RouteFile | null} */ -function trace(file, path, tree, extensions) { - /** @type {Array} */ - const layouts = []; +function analyze(file, component_extensions, module_extensions) { + const component_extension = component_extensions.find((ext) => file.endsWith(ext)); + if (component_extension) { + const name = file.slice(0, -component_extension.length); + const pattern = + /^\+(?:(page(?:@([a-zA-Z0-9_-]+))?)|(layout(?:-([a-zA-Z0-9_-]+))?(?:@([a-zA-Z0-9_-]+))?)|(error))$/; + const match = pattern.exec(name); + if (!match) return null; + + return { + kind: 'component', + is_page: !!match[1], + is_layout: !!match[3], + is_error: !!match[6], + uses_layout: match[2] || match[5], + declares_layout: match[4] + }; + } - /** @type {Array} */ - const errors = []; + const module_extension = module_extensions.find((ext) => file.endsWith(ext)); + if (module_extension) { + const name = file.slice(0, -module_extension.length); + const pattern = /^\+(?:(server)|(page(\.server)?)|(layout(-([a-zA-Z0-9_-]+))?(\.server)?))$/; + const match = pattern.exec(name); + if (!match) return null; + + return { + kind: 'module', + is_page: !!match[2], + is_layout: !!match[4], + is_server: !!(match[1] || match[3] || match[6]), + declares_layout: match[5] + }; + } - const parts = path.split('/'); - const filename = /** @type {string} */ (parts.pop()); - const extension = /** @type {string} */ (extensions.find((ext) => path.endsWith(ext))); - const base = filename.slice(0, -extension.length); + return null; +} - let layout_id = base.includes('@') ? base.split('@')[1] : DEFAULT; +/** + * @param {import('./types').RouteTree} tree + * @param {string} id + * @param {string} layout_id + * @param {string} project_relative + */ +function trace(tree, id, layout_id = DEFAULT, project_relative) { + /** @type {Array} */ + const layouts = []; - if (parts.findIndex((part) => part.indexOf('@') > -1) > -1) { - throw new Error(`Invalid route ${file} - named layouts are not allowed in directories`); - } + /** @type {Array} */ + const errors = []; + + const parts = id.split('/').filter(Boolean); - // walk up the tree, find which __layout and __error components + // walk up the tree, find which +layout and +error components // apply to this page while (true) { const node = tree.get(parts.join('/')); const layout = node?.layouts[layout_id]; - if (layout?.file && layouts.indexOf(layout.file) > -1) { - throw new Error(`Recursive layout detected: ${layout.file} -> ${layouts.join(' -> ')}`); + if (layout && layouts.indexOf(layout) > -1) { + // TODO this needs to be fixed for #5748 + throw new Error( + `Recursive layout detected: ${layout.component} -> ${layouts + .map((l) => l?.component) + .join(' -> ')}` + ); } - // any segment that has neither a __layout nor an __error can be discarded. + // any segment that has neither a +layout nor an +error can be discarded. // in other words these... // layouts: [a, , b, c] // errors: [d, , e, ] @@ -337,13 +356,15 @@ function trace(file, path, tree, extensions) { // ...can be compacted to these: // layouts: [a, b, c] // errors: [d, e, ] - if (node?.error || layout?.file) { + if (node?.error || layout) { errors.unshift(node?.error); - layouts.unshift(layout?.file); + layouts.unshift(layout); } - if (layout?.name.includes('@')) { - layout_id = layout.name.split('@')[1]; + const parent_layout_id = layout?.component?.split('@')[1]?.split('.')[0]; + + if (parent_layout_id) { + layout_id = parent_layout_id; } else { if (layout) layout_id = DEFAULT; if (parts.length === 0) break; @@ -352,7 +373,7 @@ function trace(file, path, tree, extensions) { } if (layout_id !== DEFAULT) { - throw new Error(`${file} references missing layout "${layout_id}"`); + throw new Error(`${project_relative} references missing layout "${layout_id}"`); } // trim empty space off the end of the errors array @@ -364,14 +385,18 @@ function trace(file, path, tree, extensions) { } /** - * @param {Unit} a - * @param {Unit} b + * @param {import('types').RouteData} a + * @param {import('types').RouteData} b + * @param {Map} segment_map */ -function compare(a, b) { - const max_segments = Math.max(a.segments.length, b.segments.length); +function compare(a, b, segment_map) { + const a_segments = /** @type {import('./types').Part[][]} */ (segment_map.get(a.id)); + const b_segments = /** @type {import('./types').Part[][]} */ (segment_map.get(b.id)); + + const max_segments = Math.max(a_segments.length, b_segments.length); for (let i = 0; i < max_segments; i += 1) { - const sa = a.segments[i]; - const sb = b.segments[i]; + const sa = a_segments[i]; + const sb = b_segments[i]; // /x < /x/y, but /[...x]/y < /[...x] if (!sa) return a.id.includes('[...') ? +1 : -1; @@ -405,8 +430,8 @@ function compare(a, b) { } } - const a_is_endpoint = !a.page && a.endpoint; - const b_is_endpoint = !b.page && b.endpoint; + const a_is_endpoint = a.type === 'endpoint'; + const b_is_endpoint = b.type === 'endpoint'; if (a_is_endpoint !== b_is_endpoint) { return a_is_endpoint ? -1 : +1; @@ -435,12 +460,12 @@ function count_occurrences(needle, haystack) { function list_files(dir, path = '', files = []) { fs.readdirSync(dir) .sort((a, b) => { - // sort each directory in (__layout, __error, everything else) order + // sort each directory in (+layout, +error, everything else) order // so that we can trace layouts/errors immediately - if (a.startsWith('__layout')) { - if (!b.startsWith('__layout')) return -1; - } else if (b.startsWith('__layout')) { + if (a.startsWith('+layout')) { + if (!b.startsWith('+layout')) return -1; + } else if (b.startsWith('+layout')) { return 1; } else if (a.startsWith('__')) { if (!b.startsWith('__')) return -1; diff --git a/packages/kit/src/core/sync/create_manifest_data/index.spec.js b/packages/kit/src/core/sync/create_manifest_data/index.spec.js index 03e9ed21b118..8dd12b23a367 100644 --- a/packages/kit/src/core/sync/create_manifest_data/index.spec.js +++ b/packages/kit/src/core/sync/create_manifest_data/index.spec.js @@ -26,72 +26,73 @@ const create = (dir, config = {}) => { }); }; -const default_layout = 'layout.svelte'; -const default_error = 'error.svelte'; +const default_layout = { + component: 'layout.svelte' +}; + +const default_error = { + component: 'error.svelte' +}; test('creates routes', () => { - const { components, routes } = create('samples/basic'); + const { nodes, routes } = create('samples/basic'); - const index = 'samples/basic/index.svelte'; - const about = 'samples/basic/about.svelte'; - const blog = 'samples/basic/blog/index.svelte'; - const blog_$slug = 'samples/basic/blog/[slug].svelte'; + const index = { component: 'samples/basic/+page.svelte' }; + const about = { component: 'samples/basic/about/+page.svelte' }; + const blog = { component: 'samples/basic/blog/+page.svelte' }; + const blog_$slug = { component: 'samples/basic/blog/[slug]/+page.svelte' }; - assert.equal(components, [default_layout, default_error, about, blog_$slug, blog, index]); + assert.equal(nodes, [default_layout, default_error, index, about, blog, blog_$slug]); assert.equal(routes, [ { type: 'page', id: '', pattern: /^\/$/, - path: '/', - shadow: null, - a: [default_layout, index], - b: [default_error] + errors: [default_error], + layouts: [default_layout], + page: index }, { type: 'endpoint', id: 'blog.json', pattern: /^\/blog\.json$/, - file: 'samples/basic/blog/index.json.js' + file: 'samples/basic/blog.json/+server.js' }, { type: 'page', id: 'about', pattern: /^\/about\/?$/, - path: '/about', - shadow: null, - a: [default_layout, about], - b: [default_error] + errors: [default_error], + layouts: [default_layout], + page: about }, { type: 'page', id: 'blog', pattern: /^\/blog\/?$/, - path: '/blog', - shadow: null, - a: [default_layout, blog], - b: [default_error] + errors: [default_error], + layouts: [default_layout], + page: blog }, { type: 'endpoint', id: 'blog/[slug].json', pattern: /^\/blog\/([^/]+?)\.json$/, - file: 'samples/basic/blog/[slug].json.ts' + file: 'samples/basic/blog/[slug].json/+server.ts' }, { type: 'page', id: 'blog/[slug]', pattern: /^\/blog\/([^/]+?)\/?$/, - path: '', - shadow: null, - a: [default_layout, blog_$slug], - b: [default_error] + errors: [default_error], + layouts: [default_layout], + page: blog_$slug } ]); }); @@ -103,86 +104,85 @@ const symlink_survived_git = fs const test_symlinks = symlink_survived_git ? test : test.skip; test_symlinks('creates symlinked routes', () => { - const { components, routes } = create('samples/symlinks/routes'); + const { nodes, routes } = create('samples/symlinks/routes'); - const index = 'samples/symlinks/routes/index.svelte'; - const symlinked_index = 'samples/symlinks/routes/foo/index.svelte'; + const index = { component: 'samples/symlinks/routes/index.svelte' }; + const symlinked_index = { component: 'samples/symlinks/routes/foo/index.svelte' }; - assert.equal(components, [default_layout, default_error, symlinked_index, index]); + assert.equal(nodes, [default_layout, default_error, symlinked_index, index]); assert.equal(routes, [ { type: 'page', id: '', pattern: /^\/$/, - path: '/', - shadow: null, - a: [default_layout, index], - b: [default_error] + errors: [default_error], + layouts: [default_layout], + page: index }, { type: 'page', id: 'foo', pattern: /^\/foo\/?$/, - path: '/foo', - shadow: null, - a: [default_layout, symlinked_index], - b: [default_error] + errors: [default_error], + layouts: [default_layout], + page: symlinked_index } ]); }); test('creates routes with layout', () => { - const { components, routes } = create('samples/basic-layout'); + const { nodes, routes } = create('samples/basic-layout'); - const layout = 'samples/basic-layout/__layout.svelte'; - const index = 'samples/basic-layout/index.svelte'; - const foo___layout = 'samples/basic-layout/foo/__layout.svelte'; - const foo = 'samples/basic-layout/foo/index.svelte'; + const layout = { component: 'samples/basic-layout/+layout.svelte' }; + const index = { component: 'samples/basic-layout/+page.svelte' }; + const foo___layout = { component: 'samples/basic-layout/foo/+layout.svelte' }; + const foo = { component: 'samples/basic-layout/foo/+page.svelte' }; - assert.equal(components, [layout, default_error, foo___layout, foo, index]); + assert.equal(nodes, [layout, default_error, foo___layout, index, foo]); - assert.equal(routes, [ - { - type: 'page', - id: '', - pattern: /^\/$/, - path: '/', - shadow: null, - a: [layout, index], - b: [default_error] - }, + assert.equal( + routes.slice(1, 2), + [ + { + type: 'page', + id: '', + pattern: /^\/$/, + errors: [default_error], + layouts: [layout], + page: index + }, - { - type: 'page', - id: 'foo', - pattern: /^\/foo\/?$/, - path: '/foo', - shadow: null, - a: [layout, foo___layout, foo], - b: [default_error] - } - ]); + { + type: 'page', + id: 'foo', + pattern: /^\/foo\/?$/, + errors: [default_error], + layouts: [layout, foo___layout], + page: foo + } + ].slice(1, 2) + ); }); test('succeeds when routes does not exist', () => { - const { components, routes } = create('samples/basic/routes'); - assert.equal(components, ['layout.svelte', 'error.svelte']); + const { nodes, routes } = create('samples/basic/routes'); + assert.equal(nodes, [default_layout, default_error]); assert.equal(routes, []); }); // TODO some characters will need to be URL-encoded in the filename test('encodes invalid characters', () => { - const { components, routes } = create('samples/encoding'); + const { nodes, routes } = create('samples/encoding'); // had to remove ? and " because windows // const quote = 'samples/encoding/".svelte'; - const hash = 'samples/encoding/%23.svelte'; + const hash = { component: 'samples/encoding/%23/+page.svelte' }; // const question_mark = 'samples/encoding/?.svelte'; - assert.equal(components, [ + assert.equal(nodes, [ default_layout, default_error, // quote, @@ -231,13 +231,30 @@ test('sorts routes correctly', () => { test('sorts routes with rest correctly', () => { const { routes } = create('samples/rest'); - assert.equal( - routes.map((p) => (p.type === 'page' ? p.a : p.file)), - [ - [default_layout, 'samples/rest/a/[...rest].svelte'], - [default_layout, 'samples/rest/b/[...rest].svelte'] - ] - ); + assert.equal(routes, [ + { + type: 'page', + id: 'a/[...rest]', + pattern: /^\/a(?:\/(.*))?\/?$/, + errors: [default_error], + layouts: [default_layout], + page: { + component: 'samples/rest/a/[...rest]/+page.svelte', + server: 'samples/rest/a/[...rest]/+page.server.js' + } + }, + { + type: 'page', + id: 'b/[...rest]', + pattern: /^\/b(?:\/(.*))?\/?$/, + errors: [default_error], + layouts: [default_layout], + page: { + component: 'samples/rest/b/[...rest]/+page.svelte', + server: 'samples/rest/b/[...rest]/+page.server.ts' + } + } + ]); }); test('allows rest parameters inside segments', () => { @@ -248,16 +265,17 @@ test('allows rest parameters inside segments', () => { type: 'page', id: 'prefix-[...rest]', pattern: /^\/prefix-(.*?)\/?$/, - path: '', - shadow: null, - a: [default_layout, 'samples/rest-prefix-suffix/prefix-[...rest].svelte'], - b: [default_error] + errors: [default_error], + layouts: [default_layout], + page: { + component: 'samples/rest-prefix-suffix/prefix-[...rest]/+page.svelte' + } }, { type: 'endpoint', id: '[...rest].json', pattern: /^\/(.*?)\.json$/, - file: 'samples/rest-prefix-suffix/[...rest].json.js' + file: 'samples/rest-prefix-suffix/[...rest].json/+server.js' } ]); }); @@ -266,7 +284,7 @@ test('ignores files and directories with leading underscores', () => { const { routes } = create('samples/hidden-underscore'); assert.equal(routes.map((r) => r.type === 'endpoint' && r.file).filter(Boolean), [ - 'samples/hidden-underscore/e/f/g/h.js' + 'samples/hidden-underscore/e/f/g/h/+server.js' ]); }); @@ -274,38 +292,10 @@ test('ignores files and directories with leading dots except .well-known', () => const { routes } = create('samples/hidden-dot'); assert.equal(routes.map((r) => r.type === 'endpoint' && r.file).filter(Boolean), [ - 'samples/hidden-dot/.well-known/dnt-policy.txt.js' + 'samples/hidden-dot/.well-known/dnt-policy.txt/+server.js' ]); }); -test('ignores files by `kit.excludes` config w/RegExp', () => { - const { routes } = create('samples/hidden-by-excludes-config', { - kit: { - routes: (filepath) => - !filepath.endsWith('.test.js') && - !filepath.endsWith('.spec.js') && - !filepath.endsWith('.md') - } - }); - - assert.equal( - routes - .map((r) => r.type === 'endpoint' && r.file) - .filter(Boolean) - .sort(), - [ - 'samples/hidden-by-excludes-config/.a.js', - 'samples/hidden-by-excludes-config/.well-known/dnt-policy.txt.js', - 'samples/hidden-by-excludes-config/_a.js', - 'samples/hidden-by-excludes-config/a.js', - 'samples/hidden-by-excludes-config/subdir/.a.js', - 'samples/hidden-by-excludes-config/subdir/_a.js', - 'samples/hidden-by-excludes-config/subdir/.well-known/dnt-policy.txt.js', - 'samples/hidden-by-excludes-config/subdir/a.js' - ].sort() - ); -}); - test('allows multiple slugs', () => { const { routes } = create('samples/multiple-slugs'); @@ -316,7 +306,7 @@ test('allows multiple slugs', () => { type: 'endpoint', id: '[file].[ext]', pattern: /^\/([^/]+?)\.([^/]+?)$/, - file: 'samples/multiple-slugs/[file].[ext].js' + file: 'samples/multiple-slugs/[file].[ext]/+server.js' } ] ); @@ -325,7 +315,7 @@ test('allows multiple slugs', () => { test('fails if dynamic params are not separated', () => { assert.throws(() => { create('samples/invalid-params'); - }, /Invalid route samples\/invalid-params\/\[foo\]\[bar\]\.js — parameters must be separated/); + }, /Invalid route samples\/invalid-params\/\[foo\]\[bar\]\/\+server\.js — parameters must be separated/); }); test('ignores things that look like lockfiles', () => { @@ -335,77 +325,73 @@ test('ignores things that look like lockfiles', () => { { type: 'endpoint', id: 'foo', - file: 'samples/lockfiles/foo.js', + file: 'samples/lockfiles/foo/+server.js', pattern: /^\/foo\/?$/ } ]); }); test('works with custom extensions', () => { - const { components, routes } = create('samples/custom-extension', { + const { nodes, routes } = create('samples/custom-extension', { extensions: ['.jazz', '.beebop', '.funk', '.svelte'] }); - const index = 'samples/custom-extension/index.funk'; - const about = 'samples/custom-extension/about.jazz'; - const blog = 'samples/custom-extension/blog/index.svelte'; - const blog_$slug = 'samples/custom-extension/blog/[slug].beebop'; + const index = { component: 'samples/custom-extension/+page.funk' }; + const about = { component: 'samples/custom-extension/about/+page.jazz' }; + const blog = { component: 'samples/custom-extension/blog/+page.svelte' }; + const blog_$slug = { component: 'samples/custom-extension/blog/[slug]/+page.beebop' }; - assert.equal(components, [default_layout, default_error, about, blog_$slug, blog, index]); + assert.equal(nodes, [default_layout, default_error, index, about, blog, blog_$slug]); assert.equal(routes, [ { type: 'page', id: '', pattern: /^\/$/, - path: '/', - shadow: null, - a: [default_layout, index], - b: [default_error] + errors: [default_error], + layouts: [default_layout], + page: index }, { type: 'endpoint', id: 'blog.json', pattern: /^\/blog\.json$/, - file: 'samples/custom-extension/blog/index.json.js' + file: 'samples/custom-extension/blog.json/+server.js' }, { type: 'page', id: 'about', pattern: /^\/about\/?$/, - path: '/about', - shadow: null, - a: [default_layout, about], - b: [default_error] + errors: [default_error], + layouts: [default_layout], + page: about }, { type: 'page', id: 'blog', pattern: /^\/blog\/?$/, - path: '/blog', - shadow: null, - a: [default_layout, blog], - b: [default_error] + errors: [default_error], + layouts: [default_layout], + page: blog }, { type: 'endpoint', id: 'blog/[slug].json', pattern: /^\/blog\/([^/]+?)\.json$/, - file: 'samples/custom-extension/blog/[slug].json.js' + file: 'samples/custom-extension/blog/[slug].json/+server.js' }, { type: 'page', id: 'blog/[slug]', pattern: /^\/blog\/([^/]+?)\/?$/, - path: '', - shadow: null, - a: [default_layout, blog_$slug], - b: [default_error] + errors: [default_error], + layouts: [default_layout], + page: blog_$slug } ]); }); @@ -435,52 +421,45 @@ test('includes nested error components', () => { type: 'page', id: 'foo/bar/baz', pattern: /^\/foo\/bar\/baz\/?$/, - path: '/foo/bar/baz', - shadow: null, - a: [ - default_layout, - 'samples/nested-errors/foo/__layout.svelte', + errors: [ + default_error, undefined, - 'samples/nested-errors/foo/bar/baz/__layout.svelte', - 'samples/nested-errors/foo/bar/baz/index.svelte' + { component: 'samples/nested-errors/foo/bar/+error.svelte' }, + { component: 'samples/nested-errors/foo/bar/baz/+error.svelte' } ], - b: [ - default_error, + layouts: [ + default_layout, + { component: 'samples/nested-errors/foo/+layout.svelte' }, undefined, - 'samples/nested-errors/foo/bar/__error.svelte', - 'samples/nested-errors/foo/bar/baz/__error.svelte' - ] + { component: 'samples/nested-errors/foo/bar/baz/+layout.svelte' } + ], + page: { + component: 'samples/nested-errors/foo/bar/baz/+page.svelte' + } } ]); }); -test('errors on encountering an illegal __file', () => { - assert.throws( - () => create('samples/illegal-dunder'), - /Files and directories prefixed with __ are reserved \(saw samples\/illegal-dunder\/__foo.svelte\)/ - ); -}); - test('creates routes with named layouts', () => { - const { components, routes } = create('samples/named-layouts'); + const { nodes, routes } = create('samples/named-layouts'); - assert.equal(components, [ - 'samples/named-layouts/__layout.svelte', + assert.equal(nodes, [ + { component: 'samples/named-layouts/+layout.svelte' }, default_error, - 'samples/named-layouts/__layout-home@default.svelte', - 'samples/named-layouts/__layout-special.svelte', - 'samples/named-layouts/a/__layout.svelte', - 'samples/named-layouts/b/__layout-alsospecial@special.svelte', - 'samples/named-layouts/b/c/__layout.svelte', - 'samples/named-layouts/b/d/__layout-extraspecial@special.svelte', - 'samples/named-layouts/b/d/__layout-special.svelte', - 'samples/named-layouts/a/a1.svelte', - 'samples/named-layouts/a/a2@special.svelte', - 'samples/named-layouts/b/c/c1@alsospecial.svelte', - 'samples/named-layouts/b/c/c2@home.svelte', - 'samples/named-layouts/b/d/d1.svelte', - 'samples/named-layouts/b/d/d2@extraspecial.svelte', - 'samples/named-layouts/b/d/index@special.svelte' + { component: 'samples/named-layouts/+layout-home@default.svelte' }, + { component: 'samples/named-layouts/+layout-special.svelte' }, + { component: 'samples/named-layouts/a/+layout.svelte' }, + { component: 'samples/named-layouts/b/+layout-alsospecial@special.svelte' }, + { component: 'samples/named-layouts/b/c/+layout.svelte' }, + { component: 'samples/named-layouts/b/d/+layout-extraspecial@special.svelte' }, + { component: 'samples/named-layouts/b/d/+layout-special.svelte' }, + { component: 'samples/named-layouts/a/a1/+page.svelte' }, + { component: 'samples/named-layouts/a/a2/+page@special.svelte' }, + { component: 'samples/named-layouts/b/c/c1/+page@alsospecial.svelte' }, + { component: 'samples/named-layouts/b/c/c2/+page@home.svelte' }, + { component: 'samples/named-layouts/b/d/+page@special.svelte' }, + { component: 'samples/named-layouts/b/d/d1/+page.svelte' }, + { component: 'samples/named-layouts/b/d/d2/+page@extraspecial.svelte' } ]); assert.equal(routes, [ @@ -488,88 +467,73 @@ test('creates routes with named layouts', () => { type: 'page', id: 'a/a1', pattern: /^\/a\/a1\/?$/, - path: '/a/a1', - shadow: null, - a: [ - 'samples/named-layouts/__layout.svelte', - 'samples/named-layouts/a/__layout.svelte', - 'samples/named-layouts/a/a1.svelte' + errors: [default_error], + layouts: [ + { component: 'samples/named-layouts/+layout.svelte' }, + { component: 'samples/named-layouts/a/+layout.svelte' } ], - b: [default_error] + page: { component: 'samples/named-layouts/a/a1/+page.svelte' } }, { type: 'page', - id: 'a/a2@special', + id: 'a/a2', pattern: /^\/a\/a2\/?$/, - path: '/a/a2', - shadow: null, - a: [ - 'samples/named-layouts/__layout-special.svelte', - 'samples/named-layouts/a/a2@special.svelte' - ], - b: [default_error] + errors: [default_error], + layouts: [{ component: 'samples/named-layouts/+layout-special.svelte' }], + page: { component: 'samples/named-layouts/a/a2/+page@special.svelte' } }, { type: 'page', - id: 'b/d@special', + id: 'b/d', pattern: /^\/b\/d\/?$/, - path: '/b/d', - shadow: null, - a: [ - 'samples/named-layouts/__layout.svelte', - 'samples/named-layouts/b/d/__layout-special.svelte', - 'samples/named-layouts/b/d/index@special.svelte' + errors: [default_error], + layouts: [ + { component: 'samples/named-layouts/+layout.svelte' }, + { component: 'samples/named-layouts/b/d/+layout-special.svelte' } ], - b: [default_error] + page: { component: 'samples/named-layouts/b/d/+page@special.svelte' } }, { type: 'page', - id: 'b/c/c1@alsospecial', + id: 'b/c/c1', pattern: /^\/b\/c\/c1\/?$/, - path: '/b/c/c1', - shadow: null, - a: [ - 'samples/named-layouts/__layout-special.svelte', - 'samples/named-layouts/b/__layout-alsospecial@special.svelte', - 'samples/named-layouts/b/c/c1@alsospecial.svelte' + errors: [default_error], + layouts: [ + { component: 'samples/named-layouts/+layout-special.svelte' }, + { component: 'samples/named-layouts/b/+layout-alsospecial@special.svelte' } ], - b: [default_error] + page: { component: 'samples/named-layouts/b/c/c1/+page@alsospecial.svelte' } }, { type: 'page', - id: 'b/c/c2@home', + id: 'b/c/c2', pattern: /^\/b\/c\/c2\/?$/, - path: '/b/c/c2', - shadow: null, - a: [ - 'samples/named-layouts/__layout.svelte', - 'samples/named-layouts/__layout-home@default.svelte', - 'samples/named-layouts/b/c/c2@home.svelte' + errors: [default_error, default_error], + layouts: [ + { component: 'samples/named-layouts/+layout.svelte' }, + { component: 'samples/named-layouts/+layout-home@default.svelte' } ], - b: [default_error, default_error] + page: { component: 'samples/named-layouts/b/c/c2/+page@home.svelte' } }, { type: 'page', id: 'b/d/d1', pattern: /^\/b\/d\/d1\/?$/, - path: '/b/d/d1', - shadow: null, - a: ['samples/named-layouts/__layout.svelte', 'samples/named-layouts/b/d/d1.svelte'], - b: [default_error] + errors: [default_error], + layouts: [{ component: 'samples/named-layouts/+layout.svelte' }], + page: { component: 'samples/named-layouts/b/d/d1/+page.svelte' } }, { type: 'page', - id: 'b/d/d2@extraspecial', + id: 'b/d/d2', pattern: /^\/b\/d\/d2\/?$/, - path: '/b/d/d2', - shadow: null, - a: [ - 'samples/named-layouts/__layout.svelte', - 'samples/named-layouts/b/d/__layout-special.svelte', - 'samples/named-layouts/b/d/__layout-extraspecial@special.svelte', - 'samples/named-layouts/b/d/d2@extraspecial.svelte' + errors: [default_error], + layouts: [ + { component: 'samples/named-layouts/+layout.svelte' }, + { component: 'samples/named-layouts/b/d/+layout-special.svelte' }, + { component: 'samples/named-layouts/b/d/+layout-extraspecial@special.svelte' } ], - b: [default_error] + page: { component: 'samples/named-layouts/b/d/d2/+page@extraspecial.svelte' } } ]); }); @@ -577,58 +541,40 @@ test('creates routes with named layouts', () => { test('errors on missing layout', () => { assert.throws( () => create('samples/named-layout-missing'), - /samples\/named-layout-missing\/index@missing.svelte references missing layout "missing"/ + /samples\/named-layout-missing\/\+page@missing.svelte references missing layout "missing"/ ); }); test('errors on layout named default', () => { assert.throws( () => create('samples/named-layout-default'), - /samples\/named-layout-default\/__layout-default.svelte cannot use reserved "default" name/ + /samples\/named-layout-default\/\+layout-default.svelte cannot use reserved "default" name/ ); }); test('errors on duplicate layout definition', () => { assert.throws( () => create('samples/duplicate-layout'), - /Duplicate layout samples\/duplicate-layout\/__layout-a@x.svelte already defined at samples\/duplicate-layout\/__layout-a.svelte/ + /Duplicate layout samples\/duplicate-layout\/\+layout-a@x.svelte already defined at samples\/duplicate-layout\/\+layout-a.svelte/ ); }); test('errors on recursive name layout', () => { assert.throws( () => create('samples/named-layout-recursive-1'), - /Recursive layout detected: samples\/named-layout-recursive-1\/__layout-a@b\.svelte -> samples\/named-layout-recursive-1\/__layout-b@a\.svelte -> samples\/named-layout-recursive-1\/__layout-a@b\.svelte/ + /Recursive layout detected: samples\/named-layout-recursive-1\/\+layout-a@b\.svelte -> samples\/named-layout-recursive-1\/\+layout-b@a\.svelte -> samples\/named-layout-recursive-1\/\+layout-a@b\.svelte/ ); assert.throws( () => create('samples/named-layout-recursive-2'), - /Recursive layout detected: samples\/named-layout-recursive-2\/__layout-a@a\.svelte -> samples\/named-layout-recursive-2\/__layout-a@a\.svelte/ + /Recursive layout detected: samples\/named-layout-recursive-2\/\+layout-a@a\.svelte -> samples\/named-layout-recursive-2\/\+layout-a@a\.svelte/ ); assert.throws( () => create('samples/named-layout-recursive-3'), - /Recursive layout detected: samples\/named-layout-recursive-3\/__layout@a\.svelte -> samples\/named-layout-recursive-3\/__layout-a@default\.svelte -> samples\/named-layout-recursive-3\/__layout@a\.svelte/ - ); -}); - -test('errors on layout in directory', () => { - assert.throws( - () => create('samples/named-layout-on-directory-1'), - /Invalid route samples\/named-layout-on-directory-1\/foo@a\/index.svelte - named layouts are not allowed in directories/ - ); - - assert.throws( - () => create('samples/named-layout-on-directory-2'), - /Invalid route samples\/named-layout-on-directory-2\/foo@a\/bar.svelte - named layouts are not allowed in directories/ + /Recursive layout detected: samples\/named-layout-recursive-3\/\+layout@a\.svelte -> samples\/named-layout-recursive-3\/\+layout-a@default\.svelte -> samples\/named-layout-recursive-3\/\+layout@a\.svelte/ ); }); -test('allows for __tests__ directories', () => { - const { routes } = create('samples/legal-dunder'); - - assert.equal(routes, []); -}); - test('creates param matchers', () => { const { matchers } = create('samples/basic'); // directory doesn't matter for the test @@ -654,7 +600,9 @@ test('errors on duplicate matchers', () => { try { assert.throws(() => { create('samples/basic', { - extensions: ['.js', '.ts'] + kit: { + moduleExtensions: ['.js', '.ts'] + } }); }, /Duplicate matchers/); } finally { diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/__layout.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/+layout.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/__layout.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/+layout.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/foo/__layout.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/foo/__layout.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/foo/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/foo/+layout.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/foo/index.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/foo/+layout.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/foo/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/index.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/basic-layout/foo/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/about.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/basic/about.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/basic/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/[slug].json.ts b/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/about/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/[slug].json.ts rename to packages/kit/src/core/sync/create_manifest_data/test/samples/basic/about/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/[slug].svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog.json/+server.js similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/[slug].svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog.json/+server.js diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/_default.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/[slug].json/+server.ts similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/_default.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/[slug].json/+server.ts diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/[slug]/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/[slug]/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/index.json.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/default.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/index.json.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/default.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/+page.funk similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/basic/blog/index.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/+page.funk diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/basic/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/about/+page.jazz similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/basic/index.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/about/+page.jazz diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog.json/+server.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog.json/+server.js new file mode 100644 index 000000000000..d2911480c512 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog.json/+server.js @@ -0,0 +1,3 @@ +throw new Error("@migration task: Update +server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); +// @migration task: Check imports + diff --git a/packages/kit/test/apps/basics/src/routes/store/stuff/[item]/+page.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/+page.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/store/stuff/[item]/+page.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/[slug].json/+server.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/[slug].json/+server.js new file mode 100644 index 000000000000..8ca7512b0a79 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/[slug].json/+server.js @@ -0,0 +1,2 @@ +throw new Error("@migration task: Update +server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); + diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/about.jazz b/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/[slug]/+page.beebop similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/about.jazz rename to packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/[slug]/+page.beebop diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/[slug].beebop b/packages/kit/src/core/sync/create_manifest_data/test/samples/duplicate-layout/+layout-a.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/[slug].beebop rename to packages/kit/src/core/sync/create_manifest_data/test/samples/duplicate-layout/+layout-a.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/[slug].json.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/duplicate-layout/+layout-a@x.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/[slug].json.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/duplicate-layout/+layout-a@x.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/index.json.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/encoding/%23/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/index.json.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/encoding/%23/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-dot/.well-known/dnt-policy.txt/+server.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-dot/.well-known/dnt-policy.txt/+server.js new file mode 100644 index 000000000000..8ca7512b0a79 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-dot/.well-known/dnt-policy.txt/+server.js @@ -0,0 +1,2 @@ +throw new Error("@migration task: Update +server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); + diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-underscore/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/blog/index.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-underscore/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-underscore/e/f/g/h/+server.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-underscore/e/f/g/h/+server.js new file mode 100644 index 000000000000..8ca7512b0a79 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-underscore/e/f/g/h/+server.js @@ -0,0 +1,2 @@ +throw new Error("@migration task: Update +server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); + diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/invalid-params/[foo][bar]/+server.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/invalid-params/[foo][bar]/+server.js new file mode 100644 index 000000000000..8ca7512b0a79 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/invalid-params/[foo][bar]/+server.js @@ -0,0 +1,2 @@ +throw new Error("@migration task: Update +server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); + diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/lockfiles/foo/+server.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/lockfiles/foo/+server.js new file mode 100644 index 000000000000..8ca7512b0a79 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/lockfiles/foo/+server.js @@ -0,0 +1,2 @@ +throw new Error("@migration task: Update +server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); + diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/index.funk b/packages/kit/src/core/sync/create_manifest_data/test/samples/lockfiles/foo/+server.js_tmp similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/custom-extension/index.funk rename to packages/kit/src/core/sync/create_manifest_data/test/samples/lockfiles/foo/+server.js_tmp diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/multiple-slugs/[file].[ext]/+server.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/multiple-slugs/[file].[ext]/+server.js new file mode 100644 index 000000000000..8ca7512b0a79 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/multiple-slugs/[file].[ext]/+server.js @@ -0,0 +1,2 @@ +throw new Error("@migration task: Update +server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); + diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/duplicate-layout/__layout-a.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-default/+layout-default.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/duplicate-layout/__layout-a.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-default/+layout-default.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/duplicate-layout/__layout-a@x.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-missing/+page@missing.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/duplicate-layout/__layout-a@x.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-missing/+page@missing.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/encoding/%23.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-1/+layout-a@b.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/encoding/%23.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-1/+layout-a@b.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/.a.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-1/+layout-b@a.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/.a.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-1/+layout-b@a.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/.well-known/dnt-policy.txt.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-1/+page@a.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/.well-known/dnt-policy.txt.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-1/+page@a.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/__error.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-2/+layout-a@a.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/__error.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-2/+layout-a@a.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/__layout.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-2/+page@a.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/__layout.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-2/+page@a.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/_a.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-3/+layout-a@default.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/_a.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-3/+layout-a@default.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/a.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-3/+layout@a.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/a.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-3/+layout@a.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/a.md b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-3/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/a.md rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-3/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/a.spec.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/+layout-home@default.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/a.spec.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/+layout-home@default.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/.a.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/+layout-special.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/.a.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/+layout-special.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/__layout.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/+layout.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/__layout.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/+layout.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/.well-known/dnt-policy.txt.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/a/+layout.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/.well-known/dnt-policy.txt.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/a/+layout.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/__error.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/a/a1/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/__error.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/a/a1/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/__layout.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/a/a2/+page@special.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/__layout.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/a/a2/+page@special.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/_a.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/+layout-alsospecial@special.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/_a.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/+layout-alsospecial@special.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/a.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/+layout.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/a.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/+layout.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/__layout.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/__layout.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/a.md b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/c1/+page@alsospecial.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/a.md rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/c1/+page@alsospecial.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/c1@alsospecial.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/c1@alsospecial.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/a.spec.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/c2/+page@home.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-by-excludes-config/subdir/a.spec.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/c2/+page@home.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/c2@home.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/c/c2@home.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-dot/.well-known/dnt-policy.txt.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/+layout-extraspecial@special.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-dot/.well-known/dnt-policy.txt.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/+layout-extraspecial@special.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-underscore/e/f/g/h.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/+layout-special.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-underscore/e/f/g/h.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/+layout-special.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-underscore/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/+page@special.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/hidden-underscore/index.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/+page@special.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/__layout-extraspecial@special.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/__layout-extraspecial@special.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/__layout-special.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/__layout-special.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/d1.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/d1.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/illegal-dunder/__foo.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/d1/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/illegal-dunder/__foo.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/d1/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/invalid-params/[foo][bar].js b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/d2/+page@extraspecial.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/invalid-params/[foo][bar].js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/d2/+page@extraspecial.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/d2@extraspecial.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/d2@extraspecial.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/index@special.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/b/d/index@special.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/invalid-qualifier/[foo([a-z]([0-9]))].js b/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/+layout.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/invalid-qualifier/[foo([a-z]([0-9]))].js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/+layout.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/__layout.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/__layout.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/legal-dunder/__test__/legal.test.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/+error.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/legal-dunder/__test__/legal.test.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/+error.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/__error.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/__error.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/legal-dunder/__tests__/legal.test.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/+error.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/legal-dunder/__tests__/legal.test.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/+error.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/lockfiles/foo.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/+layout.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/lockfiles/foo.js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/+layout.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/lockfiles/foo.js_tmp b/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/lockfiles/foo.js_tmp rename to packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/__error.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/__error.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/__layout.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/__layout.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-errors/foo/bar/baz/index.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/rest-prefix-suffix/[...rest].json.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest-prefix-suffix/[...rest].json.js deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/rest-prefix-suffix/[...rest].json/+server.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest-prefix-suffix/[...rest].json/+server.js new file mode 100644 index 000000000000..8ca7512b0a79 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest-prefix-suffix/[...rest].json/+server.js @@ -0,0 +1,2 @@ +throw new Error("@migration task: Update +server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); + diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/rest-prefix-suffix/prefix-[...rest].svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest-prefix-suffix/prefix-[...rest].svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/multiple-slugs/[file].[ext].js b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest-prefix-suffix/prefix-[...rest]/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/multiple-slugs/[file].[ext].js rename to packages/kit/src/core/sync/create_manifest_data/test/samples/rest-prefix-suffix/prefix-[...rest]/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/a/[...rest].js b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/a/[...rest].js deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/a/[...rest].svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/a/[...rest].svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/a/[...rest]/+page.server.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/a/[...rest]/+page.server.js new file mode 100644 index 000000000000..792678c3a8a6 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/a/[...rest]/+page.server.js @@ -0,0 +1,2 @@ +throw new Error("@migration task: Update +page.server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292699)"); + diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-default/__layout-default.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/a/[...rest]/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-default/__layout-default.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/rest/a/[...rest]/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/b/[...rest].svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/b/[...rest].svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/b/[...rest].ts b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/b/[...rest].ts deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/b/[...rest]/+page.server.ts b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/b/[...rest]/+page.server.ts new file mode 100644 index 000000000000..792678c3a8a6 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/b/[...rest]/+page.server.ts @@ -0,0 +1,2 @@ +throw new Error("@migration task: Update +page.server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292699)"); + diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-missing/index@missing.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/rest/b/[...rest]/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-missing/index@missing.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/rest/b/[...rest]/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-on-directory-1/__layout-a.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-on-directory-1/__layout-a.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-on-directory-1/foo@a/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...anotherrest]/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-on-directory-1/foo@a/index.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...anotherrest]/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...anotherrest]/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...anotherrest]/index.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-on-directory-2/__layout-a.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-on-directory-2/__layout-a.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/abc.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/abc.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-on-directory-2/foo@a/bar.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/abc/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-on-directory-2/foo@a/bar.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/abc/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-1/__layout-a@b.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-1/__layout-a@b.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-1/__layout-b@a.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/[...deep_rest]/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-1/__layout-b@a.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/[...deep_rest]/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/[...deep_rest]/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/[...deep_rest]/index.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/[...deep_rest]/xyz.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/[...deep_rest]/xyz.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-1/index@a.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/[...deep_rest]/xyz/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-1/index@a.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/[...deep_rest]/xyz/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/deep/index.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[...rest]/index.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[endpoint].js b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[endpoint].js deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[endpoint]/+server.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[endpoint]/+server.js new file mode 100644 index 000000000000..8ca7512b0a79 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[endpoint]/+server.js @@ -0,0 +1,2 @@ +throw new Error("@migration task: Update +server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); + diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[wildcard].svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[wildcard].svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-2/__layout-a@a.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[wildcard]/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-2/__layout-a@a.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/[wildcard]/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/about.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/about.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-2/index@a.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/about/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-2/index@a.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/about/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/index.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-3/__layout-a@default.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-3/__layout-a@default.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/[id].svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/[id].svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-3/__layout@a.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/[id]/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-3/__layout@a.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/[id]/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/bar.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/bar.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-3/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/bar/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layout-recursive-3/index.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/bar/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[xx].svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[xx].svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/__layout-home@default.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[xx]/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/__layout-home@default.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[xx]/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[yy].json.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[yy].json.js deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[yy].json/+server.js b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[yy].json/+server.js new file mode 100644 index 000000000000..8ca7512b0a79 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[yy].json/+server.js @@ -0,0 +1,2 @@ +throw new Error("@migration task: Update +server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); + diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[yy].svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[yy].svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/__layout-special.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[yy]/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/__layout-special.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[yy]/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[zz].ts b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[zz].ts deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[zz]/+server.ts b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[zz]/+server.ts new file mode 100644 index 000000000000..8ca7512b0a79 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/f[zz]/+server.ts @@ -0,0 +1,2 @@ +throw new Error("@migration task: Update +server.js (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); + diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/foo.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/foo.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/a/__layout.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/foo/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/a/__layout.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/foo/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/sorting/post/index.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/a/a1.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/symlinks/bar/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/a/a1.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/symlinks/bar/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/symlinks/bar/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/symlinks/bar/index.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/a/a2@special.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/symlinks/routes/+page.svelte similarity index 100% rename from packages/kit/src/core/sync/create_manifest_data/test/samples/named-layouts/a/a2@special.svelte rename to packages/kit/src/core/sync/create_manifest_data/test/samples/symlinks/routes/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/symlinks/routes/index.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/symlinks/routes/index.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/kit/src/core/sync/create_manifest_data/types.d.ts b/packages/kit/src/core/sync/create_manifest_data/types.d.ts new file mode 100644 index 000000000000..b9000aa328a2 --- /dev/null +++ b/packages/kit/src/core/sync/create_manifest_data/types.d.ts @@ -0,0 +1,34 @@ +import { PageNode } from 'types'; + +interface Part { + content: string; + dynamic: boolean; + rest: boolean; + type: string | null; +} + +interface RouteTreeNode { + error: PageNode | undefined; + layouts: Record; +} + +export type RouteTree = Map; + +interface RouteComponent { + kind: 'component'; + is_page: boolean; + is_layout: boolean; + is_error: boolean; + uses_layout: string | undefined; + declares_layout: string | undefined; +} + +interface RouteModule { + kind: 'module'; + is_page: boolean; + is_layout: boolean; + is_server: boolean; + declares_layout: string | undefined; +} + +export type RouteFile = RouteComponent | RouteModule; diff --git a/packages/kit/src/core/sync/sync.js b/packages/kit/src/core/sync/sync.js index a7517f5f5a86..b438a82315f3 100644 --- a/packages/kit/src/core/sync/sync.js +++ b/packages/kit/src/core/sync/sync.js @@ -1,7 +1,7 @@ import path from 'path'; import create_manifest_data from './create_manifest_data/index.js'; import { copy_assets } from './copy_assets.js'; -import { write_manifest } from './write_manifest.js'; +import { write_client_manifest } from './write_client_manifest.js'; import { write_matchers } from './write_matchers.js'; import { write_root } from './write_root.js'; import { write_tsconfig } from './write_tsconfig.js'; @@ -28,9 +28,8 @@ export function update(config) { const manifest_data = create_manifest_data({ config }); const output = path.join(config.kit.outDir, 'generated'); - const base = path.relative('.', output); - write_manifest(manifest_data, base, output); + write_client_manifest(manifest_data, output); write_root(manifest_data, output); write_matchers(manifest_data, output); write_types(config, manifest_data); diff --git a/packages/kit/src/core/sync/write_client_manifest.js b/packages/kit/src/core/sync/write_client_manifest.js new file mode 100644 index 000000000000..0854ae64f910 --- /dev/null +++ b/packages/kit/src/core/sync/write_client_manifest.js @@ -0,0 +1,79 @@ +import { relative } from 'path'; +import { s } from '../../utils/misc.js'; +import { trim, write_if_changed } from './utils.js'; + +/** + * Writes the client manifest to disk. The manifest is used to power the router. It contains the + * list of routes and corresponding Svelte components (i.e. pages and layouts). + * @param {import('types').ManifestData} manifest_data + * @param {string} output + */ +export function write_client_manifest(manifest_data, output) { + /** @type {Map} */ + const node_indexes = new Map(); + + /** + * Creates a module that exports a `CSRPageNode` + * @param {import('types').PageNode} node + */ + function generate_node(node) { + const declarations = []; + + if (node.module) { + declarations.push( + `import * as module from ${s(relative(`${output}/nodes`, node.module))};`, + `export { module };` + ); + } + + if (node.component) { + declarations.push( + `export { default as component } from ${s(relative(`${output}/nodes`, node.component))};` + ); + } + + if (node.server) { + declarations.push(`export const server = true;`); + } + + return declarations.join('\n'); + } + + const nodes = manifest_data.nodes + .map((node, i) => { + node_indexes.set(node, i); + write_if_changed(`${output}/nodes/${i}.js`, generate_node(node)); + return `() => import('./nodes/${i}')`; + }) + .join(',\n\t'); + + const dictionary = `{ + ${manifest_data.routes + .map((route) => { + if (route.type === 'page') { + const errors = route.errors.map((node) => (node ? node_indexes.get(node) : '')).join(','); + + const nodes = [...route.layouts, route.page] + .map((node) => (node ? node_indexes.get(node) : '')) + .join(','); + + return `${s(route.id)}: [[${errors}], [${nodes}]]`; + } + }) + .filter(Boolean) + .join(',\n\t\t')} + }`.replace(/^\t/gm, ''); + + write_if_changed( + `${output}/client-manifest.js`, + trim(` + export { matchers } from './client-matchers.js'; + + export const nodes = [ + ${nodes} + ]; + + export const dictionary = ${dictionary}; + `) + ); +} diff --git a/packages/kit/src/core/sync/write_manifest.js b/packages/kit/src/core/sync/write_manifest.js deleted file mode 100644 index f76eac2bbaff..000000000000 --- a/packages/kit/src/core/sync/write_manifest.js +++ /dev/null @@ -1,57 +0,0 @@ -import path from 'path'; -import { s } from '../../utils/misc.js'; -import { trim, write_if_changed } from './utils.js'; - -/** - * Writes the client manifest to disk. The manifest is used to power the router. It contains the - * list of routes and corresponding Svelte components (i.e. pages and layouts). - * @param {import('types').ManifestData} manifest_data - * @param {string} base - * @param {string} output - */ -export function write_manifest(manifest_data, base, output) { - /** @type {Record} */ - const component_indexes = {}; - - /** @param {string} c */ - const get_path = (c) => path.relative(base, c); - - const components = `[ - ${manifest_data.components - .map((component, i) => { - component_indexes[component] = i; - - return `() => import(${s(get_path(component))})`; - }) - .join(',\n\t\t\t\t\t')} - ]`.replace(/^\t/gm, ''); - - /** @param {Array} parts */ - const get_indices = (parts) => - `[${parts.map((part) => (part ? component_indexes[part] : '')).join(', ')}]`; - - const dictionary = `{ - ${manifest_data.routes - .map((route) => { - if (route.type === 'page') { - const tuple = [get_indices(route.a), get_indices(route.b)]; - if (route.shadow) tuple.push('1'); - - return `${s(route.id)}: [${tuple.join(', ')}]`; - } - }) - .filter(Boolean) - .join(',\n\t\t')} - }`.replace(/^\t/gm, ''); - - write_if_changed( - `${output}/client-manifest.js`, - trim(` - export { matchers } from './client-matchers.js'; - - export const components = ${components}; - - export const dictionary = ${dictionary}; - `) - ); -} diff --git a/packages/kit/src/core/sync/write_root.js b/packages/kit/src/core/sync/write_root.js index 9aa745236ffb..c71e30f5b9d4 100644 --- a/packages/kit/src/core/sync/write_root.js +++ b/packages/kit/src/core/sync/write_root.js @@ -9,7 +9,7 @@ export function write_root(manifest_data, output) { const max_depth = Math.max( ...manifest_data.routes.map((route) => - route.type === 'page' ? route.a.filter(Boolean).length : 0 + route.type === 'page' ? route.layouts.filter(Boolean).length + 1 : 0 ), 1 ); @@ -21,16 +21,16 @@ export function write_root(manifest_data, output) { let l = max_depth; - let pyramid = ``; + let pyramid = ``; while (l--) { pyramid = ` {#if components[${l + 1}]} - + ${pyramid.replace(/\n/g, '\n\t\t\t\t\t')} {:else} - + {/if} ` .replace(/^\t\t\t/gm, '') @@ -49,7 +49,8 @@ export function write_root(manifest_data, output) { export let page; export let components; - ${levels.map((l) => `export let props_${l} = null;`).join('\n\t\t\t\t')} + ${levels.map((l) => `export let data_${l} = null;`).join('\n\t\t\t\t')} + export let errors; setContext('__svelte__', stores); diff --git a/packages/kit/src/core/sync/write_types.js b/packages/kit/src/core/sync/write_types.js index a543cc2047d0..733e8325f877 100644 --- a/packages/kit/src/core/sync/write_types.js +++ b/packages/kit/src/core/sync/write_types.js @@ -1,22 +1,15 @@ +import fs from 'fs'; +import path from 'path'; +import ts from 'typescript'; // TODO only do this transformation if there's a jsconfig/tsconfig and typescript is installed in the app? +import MagicString from 'magic-string'; import { rimraf } from '../../utils/filesystem.js'; import { parse_route_id } from '../../utils/routing.js'; import { write } from './utils.js'; -/** @param {string} imports */ -const header = (imports) => ` -// this file is auto-generated -import type { ${imports} } from '@sveltejs/kit';`; +const methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']; -/** @param {string} arg */ -const endpoint = (arg) => ` -export type RequestHandler = GenericRequestHandler<${arg}, Output>;`; - -/** @param {string} arg */ -const page = (arg) => ` -export type Load< - InputProps extends Record = Record, - OutputProps extends Record = InputProps -> = GenericLoad<${arg}, InputProps, OutputProps>;`; +const module_names = new Set(['load']); +const server_names = new Set(methods); /** * @param {import('types').ValidatedConfig} config @@ -25,57 +18,204 @@ export type Load< export function write_types(config, manifest_data) { rimraf(`${config.kit.outDir}/types`); - /** @type {Map} */ - const shadow_types = new Map(); + const routes_dir = path.relative('.', config.kit.files.routes); manifest_data.routes.forEach((route) => { - const file = route.type === 'endpoint' ? route.file : route.shadow; + const outdir = `${config.kit.outDir}/types/${routes_dir}/${route.id}`; - if (file) { - const ext = /** @type {string} */ ( - config.kit.moduleExtensions.find((ext) => file.endsWith(ext)) + const imports = []; + const declarations = []; + const exports = []; + + const params = parse_route_id(route.id).names; + + declarations.push( + `interface Params extends Record ${ + params.length > 0 ? `{ ${params.map((param) => `${param}: string`).join('; ')} }` : '{}' + }` + ); + + if (route.type === 'page') { + imports.push( + `import type {\n\t${['Load', ...methods] + .map((name) => `${name} as Generic${name}`) + .join(',\n\t')}\n} from '@sveltejs/kit';` ); - const key = file.slice(0, -ext.length); - shadow_types.set(key, { - params: parse_route_id(key).names, - type: route.type === 'endpoint' ? 'endpoint' : 'both' - }); - } - }); - - manifest_data.components.forEach((component) => { - if (component.startsWith('.')) return; // exclude fallback components - const ext = /** @type {string} */ (config.extensions.find((ext) => component.endsWith(ext))); - const key = component.slice(0, -ext.length); - - if (!shadow_types.has(key)) { - shadow_types.set(key, { params: parse_route_id(key).names, type: 'page' }); + for (const node of route.layouts) { + // TODO handle edge case where a layout doesn't have a sibling +page + } + + if (route.page.module) { + const content = fs.readFileSync(route.page.module, 'utf8'); + const proxy = tweak_types(content, module_names); + + if (proxy) { + if (proxy.exports.includes('load')) { + const basename = path.basename(route.page.module); + write(`${outdir}/proxy${basename}`, proxy.code); + imports.push(`import { load } from './proxy${basename}';`); + exports.push(`export type Data = Awaited>;`); + } else { + exports.push(`export type Data = ServerData;`); + } + } else { + exports.push(`export type Data = unknown;`); + } + } + + if (route.page.server) { + const content = fs.readFileSync(route.page.server, 'utf8'); + const proxy = tweak_types(content, server_names); + + if (proxy) { + if (proxy.exports.includes('GET')) { + // TODO handle validation errors from POST/PUT/PATCH + const basename = path.basename(route.page.server); + write(`${outdir}/proxy${basename}`, proxy.code); + imports.push(`import { GET } from './proxy${basename}';`); + declarations.push(`type ServerData = Awaited>;`); + } else { + declarations.push(`type ServerData = null;`); + } + } else { + declarations.push(`type ServerData = unknown;`); + } + } else { + declarations.push(`type ServerData = null;`); + } + + if (route.page.server && !route.page.module) { + exports.push(`export type Data = ServerData;`); + } + + exports.push( + `export type Load = GenericLoad;`, + ...methods.map((name) => `export type ${name} = Generic${name};`) + ); + } else { + imports.push(`import type { RequestHandler as GenericRequestHandler } from '@sveltejs/kit';`); + exports.push(`export type RequestHandler = GenericRequestHandler;`); } - }); - - shadow_types.forEach(({ params, type }, key) => { - const arg = - params.length > 0 ? `{ ${params.map((param) => `${param}: string`).join('; ')} }` : '{}'; - const imports = []; - const content = []; + const output = `${imports.join('\n')}\n\n${declarations.join('\n')}\n\n${exports.join('\n')}`; - if (type !== 'page') { - imports.push('RequestHandler as GenericRequestHandler, ResponseBody'); - content.push(endpoint(arg)); - } + write(`${outdir}/$types.d.ts`, output); + }); +} - if (type !== 'endpoint') { - imports.push('Load as GenericLoad'); - content.push(page(arg)); +/** + * @param {string} content + * @param {Set} names + */ +function tweak_types(content, names) { + try { + const ast = ts.createSourceFile( + 'filename.ts', + content, + ts.ScriptTarget.Latest, + false, + ts.ScriptKind.TS + ); + + const code = new MagicString(content); + + const exports = new Map(); + + ast.forEachChild((node) => { + if (ts.isExportDeclaration(node) && ts.isNamedExports(node.exportClause)) { + node.exportClause.elements.forEach((element) => { + const exported = element.name; + if (names.has(element.name.text)) { + const local = element.propertyName || element.name; + exports.set(exported.text, local.text); + } + }); + } + + if (node.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)) { + if (ts.isFunctionDeclaration(node) && node.name?.text && names.has(node.name?.text)) { + exports.set(node.name.text, node.name.text); + } + + if (ts.isVariableStatement(node)) { + node.declarationList.declarations.forEach((declaration) => { + if (ts.isIdentifier(declaration.name) && names.has(declaration.name.text)) { + exports.set(declaration.name.text, declaration.name.text); + } + }); + } + } + }); + + /** @param {import('typescript').Node} node */ + function replace_jsdoc_type_tags(node) { + if (node.jsDoc) { + for (const comment of node.jsDoc) { + for (const tag of comment.tags) { + if (ts.isJSDocTypeTag(tag)) { + code.overwrite(tag.tagName.pos, tag.tagName.end, 'param'); + code.prependRight(tag.typeExpression.pos + 1, 'Parameters<'); + code.appendLeft(tag.typeExpression.end - 1, '>[0]'); + code.appendLeft(tag.typeExpression.end, ' event'); + } + } + } + } } - content.unshift(header(imports.join(', '))); - - const parts = (key || 'index').split('/'); - parts.push('__types', /** @type {string} */ (parts.pop())); - - write(`${config.kit.outDir}/types/${parts.join('/')}.d.ts`, content.join('\n').trim()); - }); + ast.forEachChild((node) => { + if (ts.isFunctionDeclaration(node) && node.name?.text && names.has(node.name?.text)) { + // remove JSDoc comment above `export function load ...` + replace_jsdoc_type_tags(node); + } + + if (ts.isVariableStatement(node)) { + // remove JSDoc comment above `export const load = ...` + if ( + ts.isIdentifier(node.declarationList.declarations[0].name) && + names.has(node.declarationList.declarations[0].name.text) + ) { + replace_jsdoc_type_tags(node); + } + + for (const declaration of node.declarationList.declarations) { + if (ts.isIdentifier(declaration.name) && names.has(declaration.name.text)) { + // edge case — remove JSDoc comment above individual export + replace_jsdoc_type_tags(declaration); + + // remove type from `export const load: Load ...` + if (declaration.type) { + const type = content.slice(declaration.type.pos, declaration.type.end); + code.remove(declaration.name.end, declaration.type.end); + + const rhs = declaration.initializer; + + if (rhs && (ts.isArrowFunction(rhs) || ts.isFunctionExpression(rhs))) { + const arg = rhs.parameters[0]; + + const add_parens = content[arg.pos - 1] !== '('; + + if (add_parens) code.prependRight(arg.pos, '('); + + if (arg && !arg.type) { + code.appendLeft( + arg.name.end, + `: Parameters<${type}>[0]` + (add_parens ? ')' : '') + ); + } + } + } + } + } + } + }); + + return { + code: code.toString(), + exports: Array.from(exports.keys()) + }; + } catch { + return null; + } } diff --git a/packages/kit/src/index/index.js b/packages/kit/src/index/index.js new file mode 100644 index 000000000000..eeaff257ee9a --- /dev/null +++ b/packages/kit/src/index/index.js @@ -0,0 +1,21 @@ +import { HttpError, Redirect } from './private.js'; + +/** + * @param {number} status + * @param {string} message + */ +export function error(status, message) { + return new HttpError(status, message); +} + +/** + * @param {number} status + * @param {string} location + */ +export function redirect(status, location) { + if (isNaN(status) || status < 300 || status > 399) { + throw new Error('Invalid status code'); + } + + return new Redirect(status, location); +} diff --git a/packages/kit/src/index/private.js b/packages/kit/src/index/private.js new file mode 100644 index 000000000000..039d45bf3d8d --- /dev/null +++ b/packages/kit/src/index/private.js @@ -0,0 +1,33 @@ +export class HttpError { + /** + * @param {number} status + * @param {string} message + */ + constructor(status, message) { + this.status = status; + this.message = message || `Error: ${status}`; + + // this is a hack to workaround failed instanceof checks + // TODO figure out a better way to do this + this.__is_http_error = true; + } + + toString() { + return this.message; + } +} + +export class Redirect { + /** + * @param {number} status + * @param {string} location + */ + constructor(status, location) { + this.status = status; + this.location = location; + + // this is a hack to workaround failed instanceof checks + // TODO figure out a better way to do this + this.__is_redirect = true; + } +} diff --git a/packages/kit/src/runtime/client/ambient.d.ts b/packages/kit/src/runtime/client/ambient.d.ts index 5f86e2fce7ef..e82b36733888 100644 --- a/packages/kit/src/runtime/client/ambient.d.ts +++ b/packages/kit/src/runtime/client/ambient.d.ts @@ -1,10 +1,10 @@ declare module '__GENERATED__/client-manifest.js' { - import { CSRComponentLoader, ParamMatcher } from 'types'; + import { CSRPageNodeLoader, ParamMatcher } from 'types'; /** - * A list of all the layout/pages components used in the app + * A list of all the error/layout/page nodes used in the app */ - export const components: CSRComponentLoader[]; + export const nodes: CSRPageNodeLoader[]; /** * A map of `[routeId: string]: [a, b, has_endpoint]` tuples, which diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 5f1db7986e7e..4fbaae9a46bd 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1,7 +1,6 @@ import { onMount, tick } from 'svelte'; import { writable } from 'svelte/store'; import { coalesce_to_error } from '../../utils/error.js'; -import { normalize } from '../load.js'; import { LoadURL, decode_params, normalize_path } from '../../utils/url.js'; import { create_updated_store, @@ -13,21 +12,20 @@ import { } from './utils.js'; import { lock_fetch, unlock_fetch, initial_fetch, native_fetch } from './fetcher.js'; import { parse } from './parse.js'; +import { error, redirect } from '../../index/index.js'; import Root from '__GENERATED__/root.svelte'; -import { components, dictionary, matchers } from '__GENERATED__/client-manifest.js'; +import { nodes, dictionary, matchers } from '__GENERATED__/client-manifest.js'; const SCROLL_KEY = 'sveltekit:scroll'; const INDEX_KEY = 'sveltekit:index'; -const routes = parse(components, dictionary, matchers); +const routes = parse(nodes, dictionary, matchers); -// we import the root layout/error components eagerly, so that +// we import the root layout/error nodes eagerly, so that // connectivity errors after initialisation don't nuke the app -const default_layout = components[0](); -const default_error = components[1](); - -const root_stuff = {}; +const default_layout = nodes[0](); +const default_error = nodes[1](); // We track the scroll position associated with each history entry in sessionStorage, // rather than on history.state itself, because when navigation is driven by @@ -91,7 +89,6 @@ export function create_client({ target, session, base, trailing_slash }) { branch: [], error: null, session_id: 0, - stuff: root_stuff, // @ts-ignore - we need the initial value to be null url: null }; @@ -260,12 +257,12 @@ export function create_client({ target, session, base, trailing_slash }) { }); } else { if (router_enabled) { - goto(new URL(navigation_result.redirect, url).href, {}, [ + goto(new URL(navigation_result.location, url).href, {}, [ ...redirect_chain, url.pathname ]); } else { - await native_navigation(new URL(navigation_result.redirect, location.href)); + await native_navigation(new URL(navigation_result.location, location.href)); } return false; @@ -355,15 +352,15 @@ export function create_client({ target, session, base, trailing_slash }) { page = navigation_result.props.page; } - const leaf_node = navigation_result.state.branch[navigation_result.state.branch.length - 1]; - router_enabled = leaf_node?.module.router !== false; + const leaf_node = navigation_result.state.branch.at(-1); + router_enabled = leaf_node?.node.module?.router !== false; if (callback) callback(); updating = false; } - /** @param {import('./types').NavigationResult} result */ + /** @param {import('./types').NavigationFinished} result */ function initialize(result) { current = result.state; @@ -391,7 +388,6 @@ export function create_client({ target, session, base, trailing_slash }) { * @param {{ * url: URL; * params: Record; - * stuff: Record; * branch: Array; * status: number; * error: Error | null; @@ -401,47 +397,40 @@ export function create_client({ target, session, base, trailing_slash }) { async function get_navigation_result_from_branch({ url, params, - stuff, branch, status, error, routeId }) { const filtered = /** @type {import('./types').BranchNode[] } */ (branch.filter(Boolean)); - const redirect = filtered.find((f) => f.loaded?.redirect); - /** @type {import('./types').NavigationResult} */ + /** @type {import('./types').NavigationFinished} */ const result = { - redirect: redirect?.loaded?.redirect, state: { url, params, branch, error, - stuff, session_id }, props: { - components: filtered.map((node) => node.module.default) + components: filtered.map((branch_node) => branch_node.node.component) } }; + let data = {}; for (let i = 0; i < filtered.length; i += 1) { + Object.assign(data, filtered[i].data); // Only set props if the node actually updated. This prevents needless rerenders. if (!current.branch.some((node) => node === filtered[i])) { - const loaded = filtered[i].loaded; - result.props[`props_${i}`] = loaded ? await loaded.props : null; + result.props[`data_${i}`] = filtered[i].data; } } - const page_changed = - !current.url || - url.href !== current.url.href || - current.error !== error || - current.stuff !== stuff; + const page_changed = !current.url || url.href !== current.url.href || current.error !== error; if (page_changed) { - result.props.page = { error, params, routeId, status, stuff, url }; + result.props.page = { error, params, routeId, status, url, data }; // TODO remove this for 1.0 /** @@ -461,72 +450,79 @@ export function create_client({ target, session, base, trailing_slash }) { print_error('query', 'searchParams'); } - const leaf = filtered[filtered.length - 1]; - const load_cache = leaf?.loaded?.cache; - - if (load_cache) { - const key = url.pathname + url.search; // omit hash - let ready = false; - - const clear = () => { - if (cache.get(key) === result) { - cache.delete(key); - } - - unsubscribe(); - clearTimeout(timeout); - }; - - const timeout = setTimeout(clear, load_cache.maxage * 1000); - - const unsubscribe = stores.session.subscribe(() => { - if (ready) clear(); - }); - - ready = true; - - cache.set(key, result); - } - return result; } /** * @param {{ - * status?: number; - * error?: Error; - * module: import('types').CSRComponent; + * node: import('types').CSRPageNode; + * parent: () => Promise>; * url: URL; * params: Record; - * stuff: Record; - * props?: Record; * routeId: string | null; * }} options + * @returns {Promise} */ - async function load_node({ status, error, module, url, params, stuff, props, routeId }) { - /** @type {import('./types').BranchNode} */ - const node = { - module, - uses: { - params: new Set(), - url: false, - session: false, - stuff: false, - dependencies: new Set() - }, - loaded: null, - stuff + async function load_node({ node, parent, url, params, routeId }) { + const uses = { + params: new Set(), + url: false, + session: false, + dependencies: new Set(), + parent: false }; - /** @param dep {string} */ - function add_dependency(dep) { - const { href } = new URL(dep, url); - node.uses.dependencies.add(href); + /** @param {string[]} deps */ + function depends(...deps) { + for (const dep of deps) { + const { href } = new URL(dep, url); + uses.dependencies.add(href); + } } - if (props) { - // shadow endpoint props means we need to mark this URL as a dependency of itself - node.uses.dependencies.add(url.href); + /** @type {Record | null} */ + let data = null; + + if (node.server) { + // +page.server.js data means we need to mark this URL as a dependency of itself, + // unless we want to get clever with usage detection on the server, which could + // be returned to the client either as payload or custom headers + uses.dependencies.add(url.href); + + const res = await native_fetch( + `${url.pathname}${url.pathname.endsWith('/') ? '' : '/'}__data.json${url.search}`, + { + headers: { + 'x-sveltekit-load': 'true' + } + } + ); + + if (res.ok) { + const redirect_location = res.headers.get('x-sveltekit-location'); + + if (redirect_location) { + // We are client-side, where the redirect status code doesn't matter + throw redirect(399, redirect_location); + } + + data = res.status === 204 ? {} : await res.json(); + } else { + // TODO does this sufficiently differentiate if this was a `throw error()` or an unexpected error? + let json; + let error_msg; + try { + json = await res.json(); + error_msg = json.message; + } catch (e) { + throw error(500, 'Failed to load data'); + } + if (error_msg) { + throw error(res.status, error_msg); + } else { + throw json; + } + } } /** @type {Record} */ @@ -534,7 +530,7 @@ export function create_client({ target, session, base, trailing_slash }) { for (const key in params) { Object.defineProperty(uses_params, key, { get() { - node.uses.params.add(key); + uses.params.add(key); return params[key]; }, enumerable: true @@ -544,23 +540,23 @@ export function create_client({ target, session, base, trailing_slash }) { const session = $session; const load_url = new LoadURL(url); - if (module.load) { + if (node.module?.load) { /** @type {import('types').LoadEvent} */ const load_input = { routeId, params: uses_params, - props: props || {}, + data, get url() { - node.uses.url = true; + uses.url = true; return load_url; }, get session() { - node.uses.session = true; + uses.session = true; return session; }, + // @ts-expect-error get stuff() { - node.uses.stuff = true; - return { ...stuff }; + throw new Error('@migration task: Remove stuff (TODO link)'); }, async fetch(resource, init) { let requested; @@ -596,13 +592,19 @@ export function create_client({ target, session, base, trailing_slash }) { // we must fixup relative urls so they are resolved from the target page const normalized = new URL(requested, url).href; - add_dependency(normalized); + depends(normalized); // prerendered pages may be served from any origin, so `initial_fetch` urls shouldn't be normalized return started ? native_fetch(normalized, init) : initial_fetch(requested, init); }, - status: status ?? null, - error: error ?? null + setHeaders: () => {}, // noop + depends, + get parent() { + // uses.parent assignment here, not on method inokation, else we wouldn't notice when someone + // does await parent() inside an if branch which wasn't executed yet. + uses.parent = true; + return parent; + } }; if (import.meta.env.DEV) { @@ -617,28 +619,26 @@ export function create_client({ target, session, base, trailing_slash }) { if (import.meta.env.DEV) { try { lock_fetch(); - node.loaded = normalize(await module.load.call(null, load_input)); + data = await node.module.load.call(null, load_input); } finally { unlock_fetch(); } } else { - node.loaded = normalize(await module.load.call(null, load_input)); + data = await node.module.load.call(null, load_input); } - - if (node.loaded.stuff) node.stuff = node.loaded.stuff; - if (node.loaded.dependencies) { - node.loaded.dependencies.forEach(add_dependency); - } - } else if (props) { - node.loaded = normalize({ props }); } - return node; + return { + node, + data: data || {}, + uses + }; } /** * @param {import('./types').NavigationIntent} intent * @param {boolean} no_cache + * @returns {Promise} */ async function load_route({ id, url, params, route }, no_cache) { if (load_cache.id === id && load_cache.promise) { @@ -650,7 +650,7 @@ export function create_client({ target, session, base, trailing_slash }) { if (cached) return cached; } - const { a, b, has_shadow } = route; + const { errors, layouts, page } = route; const changed = current.url && { url: id !== current.url.pathname + current.url.search, @@ -658,191 +658,139 @@ export function create_client({ target, session, base, trailing_slash }) { session: session_id !== current.session_id }; - /** @type {Array} */ - let branch = []; - - /** @type {Record} */ - let stuff = root_stuff; - let stuff_changed = false; - - /** @type {number} */ - let status = 200; - - /** @type {Error | null} */ - let error = null; - // preload modules to avoid waterfall, but handle rejections // so they don't get reported to Sentry et al (we don't need // to act on the failures at this point) - a.forEach((loader) => loader().catch(() => {})); + [...errors, ...layouts, page].forEach((loader) => loader?.().catch(() => {})); - load: for (let i = 0; i < a.length; i += 1) { - /** @type {import('./types').BranchNode | undefined} */ - let node; + const nodes = [...layouts, page]; - try { - if (!a[i]) continue; - - const module = await a[i](); + // To avoid waterfalls when someone awaits a parent, compute as much as possible here already + /** @type{boolean[]} */ + const nodes_changed_since_last_render = []; + for (let i = 0; i < nodes.length; i++) { + if (!nodes[i]) { + nodes_changed_since_last_render.push(false); + } else { const previous = current.branch[i]; - const changed_since_last_render = !previous || - module !== previous.module || (changed.url && previous.uses.url) || changed.params.some((param) => previous.uses.params.has(param)) || (changed.session && previous.uses.session) || Array.from(previous.uses.dependencies).some((dep) => invalidated.some((fn) => fn(dep))) || - (stuff_changed && previous.uses.stuff); - - if (changed_since_last_render) { - /** @type {Record} */ - let props = {}; + (previous.uses.parent && nodes_changed_since_last_render.includes(true)); + nodes_changed_since_last_render.push(changed_since_last_render); + } + } - const is_shadow_page = has_shadow && i === a.length - 1; + const branch_promises = nodes.map(async (loader, i) => { + return Promise.resolve().then(async () => { + if (!loader) return; + const node = await loader(); + /** @type {import('./types').BranchNode | undefined} */ + const previous = current.branch[i]; + const changed_since_last_render = + nodes_changed_since_last_render[i] || !previous || node !== previous.node; - if (is_shadow_page) { - const res = await native_fetch( - `${url.pathname}${url.pathname.endsWith('/') ? '' : '/'}__data.json${url.search}`, - { - headers: { - 'x-sveltekit-load': 'true' - } + if (changed_since_last_render) { + return await load_node({ + node, + url, + params, + routeId: route.id, + parent: async () => { + const data = {}; + for (let j = 0; j < i; j += 1) { + Object.assign(data, (await branch_promises[j])?.data); } - ); + return data; + } + }); + } else { + return previous; + } + }); + }); - if (res.ok) { - const redirect = res.headers.get('x-sveltekit-location'); + // if we don't do this, rejections will be unhandled + for (const p of branch_promises) p.catch(() => {}); - if (redirect) { - return { - redirect, - props: {}, - state: current - }; - } + /** @type {Array} */ + const branch = []; - props = res.status === 204 ? {} : await res.json(); - } else { - status = res.status; - try { - error = await res.json(); - } catch (e) { - error = new Error('Failed to load data'); - } - } + for (let i = 0; i < nodes.length; i += 1) { + if (nodes[i]) { + try { + branch.push(await branch_promises[i]); + } catch (e) { + if (/** @type {Redirect} */ (e)?.__is_redirect) { + return { + redirect: true, + location: /** @type {Redirect} */ (e).location + }; } - if (!error) { - node = await load_node({ - module, - url, - params, - props, - stuff, - routeId: route.id - }); - } + const status = /** @type {HttpError} */ (e).__is_http_error + ? /** @type {HttpError} */ (e).status + : 500; + const error = coalesce_to_error(e); - if (node) { - if (is_shadow_page) { - node.uses.url = true; - } + while (i--) { + if (errors[i]) { + /** @type {import('./types').BranchNode | undefined} */ + let error_loaded; - if (node.loaded) { - if (node.loaded.error) { - status = node.loaded.status ?? 500; - error = node.loaded.error; - } + let j = i; + while (!branch[j]) j -= 1; - if (node.loaded.redirect) { - return { - redirect: node.loaded.redirect, - props: {}, - state: current + try { + error_loaded = { + node: await errors[i](), + data: {}, + uses: { + params: new Set(), + url: false, + session: false, + dependencies: new Set(), + parent: false + } }; - } - - if (node.loaded.stuff) { - stuff_changed = true; - } - } - } - } else { - node = previous; - } - } catch (e) { - status = 500; - error = coalesce_to_error(e); - } - - if (error) { - while (i--) { - if (b[i]) { - let error_loaded; - - /** @type {import('./types').BranchNode | undefined} */ - let node_loaded; - let j = i; - while (!(node_loaded = branch[j])) { - j -= 1; - } - try { - error_loaded = await load_node({ - status, - error, - module: await b[i](), - url, - params, - stuff: node_loaded.stuff, - routeId: route.id - }); - - if (error_loaded?.loaded?.error) { + return await get_navigation_result_from_branch({ + url, + params, + branch: branch.slice(0, j + 1).concat(error_loaded), + status, + error, + routeId: route.id + }); + } catch (e) { continue; } - - if (error_loaded?.loaded?.stuff) { - stuff = { - ...stuff, - ...error_loaded.loaded.stuff - }; - } - - branch = branch.slice(0, j + 1).concat(error_loaded); - break load; - } catch (e) { - continue; } } - } - return await load_root_error_page({ - status, - error, - url, - routeId: route.id - }); - } else { - if (node?.loaded?.stuff) { - stuff = { - ...stuff, - ...node.loaded.stuff - }; + return await load_root_error_page({ + status, + error, + url, + routeId: route.id + }); } - - branch.push(node); + } else { + // push an empty slot so we can rewind past gaps to the + // layout that corresponds with an +error.svelte page + branch.push(undefined); } } return await get_navigation_result_from_branch({ url, params, - stuff, branch, - status, - error, + status: 200, + error: null, routeId: route.id }); } @@ -860,30 +808,24 @@ export function create_client({ target, session, base, trailing_slash }) { const params = {}; // error page does not have params const root_layout = await load_node({ - module: await default_layout, + node: await default_layout, url, params, - stuff: {}, - routeId + routeId, + parent: () => Promise.resolve({}) }); const root_error = await load_node({ - status, - error, - module: await default_error, + node: await default_error, url, params, - stuff: (root_layout && root_layout.loaded && root_layout.loaded.stuff) || {}, - routeId + routeId, + parent: () => Promise.resolve({}) }); return await get_navigation_result_from_branch({ url, params, - stuff: { - ...root_layout?.loaded?.stuff, - ...root_error?.loaded?.stuff - }, branch: [root_layout, root_error], status, error, @@ -1054,7 +996,9 @@ export function create_client({ target, session, base, trailing_slash }) { ? routes.filter((route) => pathnames.some((pathname) => route.exec(pathname))) : routes; - const promises = matching.map((r) => Promise.all(r.a.map((load) => load()))); + const promises = matching.map((r) => { + Promise.all([...r.errors, ...r.layouts, r.page].map((load) => load())); + }); await Promise.all(promises); }, @@ -1250,82 +1194,58 @@ export function create_client({ target, session, base, trailing_slash }) { }); }, - _hydrate: async ({ status, error, nodes, params, routeId }) => { + _hydrate: async ({ status, error, node_ids, params, routeId }) => { const url = new URL(location.href); - /** @type {Array} */ + /** @type {Array>} */ const branch = []; - /** @type {Record} */ - let stuff = {}; - - /** @type {import('./types').NavigationResult | undefined} */ + /** @type {import('./types').NavigationFinished | undefined} */ let result; - let error_args; - try { - for (let i = 0; i < nodes.length; i += 1) { - const is_leaf = i === nodes.length - 1; + for (let i = 0; i < node_ids.length; i += 1) { + const node_id = node_ids[i]; - let props; - - if (is_leaf) { - const serialized = document.querySelector('script[sveltekit\\:data-type="props"]'); - if (serialized) { - props = JSON.parse(/** @type {string} */ (serialized.textContent)); - } - } - - const node = await load_node({ - module: await components[nodes[i]](), - url, - params, - stuff, - status: is_leaf ? status : undefined, - error: is_leaf ? error : undefined, - props, - routeId + const branch_node = Promise.resolve().then(async () => { + return load_node({ + node: await nodes[node_id](), + url, + params, + routeId, + parent: async () => { + const data = {}; + for (let j = 0; j < i; j += 1) { + Object.assign(data, (await branch[j]).data); + } + return data; + } + // TODO pass deserialized server data + // TODO ..but in a way that each node only gets its own data? was that the case before? + }); }); - if (props) { - node.uses.dependencies.add(url.href); - node.uses.url = true; - } - - branch.push(node); - - if (node && node.loaded) { - if (node.loaded.error) { - if (error) throw node.loaded.error; - error_args = { - status: node.loaded.status ?? 500, - error: node.loaded.error, - url, - routeId - }; - } else if (node.loaded.stuff) { - stuff = { - ...stuff, - ...node.loaded.stuff - }; - } - } + branch.push(branch_node); } - result = error_args - ? await load_root_error_page(error_args) - : await get_navigation_result_from_branch({ - url, - params, - stuff, - branch, - status, - error, - routeId - }); + result = await get_navigation_result_from_branch({ + url, + params, + branch: await Promise.all(branch), + status, + error, + routeId + }); } catch (e) { - if (error) throw e; + // TODO handle HttpError cases + // TODO order of these ifs sensible? + if (/** @type {Redirect} */ (e).__is_redirect) { + // this is a real edge case — `load` would need to return + // a redirect but only in the browser + await native_navigation(new URL(/** @type {Redirect} */ (e).location, location.href)); + } else if (error) { + throw e; + } result = await load_root_error_page({ status: 500, @@ -1335,12 +1255,6 @@ export function create_client({ target, session, base, trailing_slash }) { }); } - if (result.redirect) { - // this is a real edge case — `load` would need to return - // a redirect but only in the browser - await native_navigation(new URL(result.redirect, location.href)); - } - initialize(result); } }; diff --git a/packages/kit/src/runtime/client/parse.js b/packages/kit/src/runtime/client/parse.js index 294021924293..dcb225b47ae3 100644 --- a/packages/kit/src/runtime/client/parse.js +++ b/packages/kit/src/runtime/client/parse.js @@ -1,13 +1,13 @@ import { exec, parse_route_id } from '../../utils/routing.js'; /** - * @param {import('types').CSRComponentLoader[]} components - * @param {Record} dictionary + * @param {import('types').CSRPageNodeLoader[]} nodes + * @param {Record} dictionary * @param {Record boolean>} matchers * @returns {import('types').CSRRoute[]} */ -export function parse(components, dictionary, matchers) { - const routes = Object.entries(dictionary).map(([id, [a, b, has_shadow]]) => { +export function parse(nodes, dictionary, matchers) { + return Object.entries(dictionary).map(([id, [errors, layouts, page]]) => { const { pattern, names, types } = parse_route_id(id); return { @@ -17,11 +17,9 @@ export function parse(components, dictionary, matchers) { const match = pattern.exec(path); if (match) return exec(match, names, types, matchers); }, - a: a.map((n) => components[n]), - b: b.map((n) => components[n]), - has_shadow: !!has_shadow + errors: errors.map((n) => nodes[n]), + layouts: layouts.map((n) => nodes[n]), + page: nodes[page] }; }); - - return routes; } diff --git a/packages/kit/src/runtime/client/start.js b/packages/kit/src/runtime/client/start.js index fcba7c748bd6..61c5645e02b1 100644 --- a/packages/kit/src/runtime/client/start.js +++ b/packages/kit/src/runtime/client/start.js @@ -18,7 +18,7 @@ export { set_public_env } from '../env-public.js'; * hydrate: { * status: number; * error: Error; - * nodes: number[]; + * node_ids: number[]; * params: Record; * routeId: string | null; * }; diff --git a/packages/kit/src/runtime/client/types.d.ts b/packages/kit/src/runtime/client/types.d.ts index ee5565061dac..18954e3ae486 100644 --- a/packages/kit/src/runtime/client/types.d.ts +++ b/packages/kit/src/runtime/client/types.d.ts @@ -6,7 +6,7 @@ import { prefetch, prefetchRoutes } from '$app/navigation'; -import { CSRComponent, CSRRoute, NormalizedLoadOutput } from 'types'; +import { CSRPageNode, CSRRoute } from 'types'; export interface Client { // public API, exposed via $app/navigation @@ -22,7 +22,7 @@ export interface Client { _hydrate: (opts: { status: number; error: Error; - nodes: number[]; + node_ids: number[]; params: Record; routeId: string | null; }) => Promise; @@ -48,23 +48,27 @@ export type NavigationIntent = { url: URL; }; -export type NavigationResult = { - redirect?: string; +export type NavigationResult = NavigationRedirect | NavigationFinished; +export type NavigationRedirect = { + redirect: true; + location: string; +}; +export type NavigationFinished = { + redirect?: false; state: NavigationState; props: Record; }; export type BranchNode = { - module: CSRComponent; - loaded: NormalizedLoadOutput | null; + node: CSRPageNode; + data: Record; uses: { params: Set; url: boolean; // TODO make more granular? session: boolean; - stuff: boolean; dependencies: Set; + parent: boolean; }; - stuff: Record; }; export type NavigationState = { @@ -72,6 +76,5 @@ export type NavigationState = { error: Error | null; params: Record; session_id: number; - stuff: Record; url: URL; }; diff --git a/packages/kit/src/runtime/components/error.svelte b/packages/kit/src/runtime/components/error.svelte index 4c3541911212..f1d30a89bb79 100644 --- a/packages/kit/src/runtime/components/error.svelte +++ b/packages/kit/src/runtime/components/error.svelte @@ -1,29 +1,16 @@ - - -

{status}

+

{$page.status}

-
{error.message}
+
{$page.error.message}
-{#if error.frame} -
{error.frame}
+{#if $page.error.frame} +
{$page.error.frame}
{/if} -{#if error.stack} -
{error.stack}
+{#if $page.error.stack} +
{$page.error.stack}
{/if} diff --git a/packages/kit/src/runtime/load.js b/packages/kit/src/runtime/load.js deleted file mode 100644 index 974ba0ff104a..000000000000 --- a/packages/kit/src/runtime/load.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @param {import('types').LoadOutput | void} loaded - * @returns {import('types').NormalizedLoadOutput} - */ -export function normalize(loaded) { - if (!loaded) { - return {}; - } - - // TODO remove for 1.0 - // @ts-expect-error - if (loaded.fallthrough) { - throw new Error( - 'fallthrough is no longer supported. Use matchers instead: https://kit.svelte.dev/docs/routing#advanced-routing-matching' - ); - } - - // TODO remove for 1.0 - if ('maxage' in loaded) { - throw new Error('maxage should be replaced with cache: { maxage }'); - } - - const has_error_status = - loaded.status && loaded.status >= 400 && loaded.status <= 599 && !loaded.redirect; - if (loaded.error || has_error_status) { - const status = loaded.status; - - if (!loaded.error && has_error_status) { - return { - status: status || 500, - error: new Error(`${status}`) - }; - } - - const error = typeof loaded.error === 'string' ? new Error(loaded.error) : loaded.error; - - if (!(error instanceof Error)) { - return { - status: 500, - error: new Error( - `"error" property returned from load() must be a string or instance of Error, received type "${typeof error}"` - ) - }; - } - - if (!status || status < 400 || status > 599) { - console.warn('"error" returned from load() without a valid status code — defaulting to 500'); - return { status: 500, error }; - } - - return { status, error }; - } - - if (loaded.redirect) { - if (!loaded.status || Math.floor(loaded.status / 100) !== 3) { - throw new Error( - '"redirect" property returned from load() must be accompanied by a 3xx status code' - ); - } - - if (typeof loaded.redirect !== 'string') { - throw new Error('"redirect" property returned from load() must be a string'); - } - } - - if (loaded.dependencies) { - if ( - !Array.isArray(loaded.dependencies) || - loaded.dependencies.some((dep) => typeof dep !== 'string') - ) { - throw new Error('"dependencies" property returned from load() must be of type string[]'); - } - } - - // TODO remove before 1.0 - if (/** @type {any} */ (loaded).context) { - throw new Error( - 'You are returning "context" from a load function. ' + - '"context" was renamed to "stuff", please adjust your code accordingly.' - ); - } - - return /** @type {import('types').NormalizedLoadOutput} */ (loaded); -} diff --git a/packages/kit/src/runtime/server/endpoint.js b/packages/kit/src/runtime/server/endpoint.js index 89ef59c297e6..22eda3a20599 100644 --- a/packages/kit/src/runtime/server/endpoint.js +++ b/packages/kit/src/runtime/server/endpoint.js @@ -1,50 +1,16 @@ -import { to_headers } from '../../utils/http.js'; -import { hash } from '../hash.js'; -import { check_method_names, is_pojo, serialize_error } from './utils.js'; - -/** @param {string} body */ -function error(body) { - return new Response(body, { - status: 500 - }); -} - -/** @param {unknown} s */ -function is_string(s) { - return typeof s === 'string' || s instanceof String; -} - -const text_types = new Set([ - 'application/xml', - 'application/json', - 'application/x-www-form-urlencoded', - 'multipart/form-data' -]); - -const bodyless_status_codes = new Set([101, 204, 205, 304]); - -/** - * Decides how the body should be parsed based on its mime type - * - * @param {string | undefined | null} content_type The `content-type` header of a request/response. - * @returns {boolean} - */ -export function is_text(content_type) { - if (!content_type) return true; // defaults to json - const type = content_type.split(';')[0].toLowerCase(); // get the mime type - - return type.startsWith('text/') || type.endsWith('+xml') || text_types.has(type); -} +import { check_method_names, method_not_allowed } from './utils.js'; /** * @param {import('types').RequestEvent} event - * @param {{ [method: string]: import('types').RequestHandler }} mod - * @param {import('types').SSROptions} options + * @param {import('types').SSREndpoint} route * @returns {Promise} */ -export async function render_endpoint(event, mod, options) { +export async function render_endpoint(event, route) { const { method } = event.request; + const mod = await route.load(); + + // TODO: Remove for 1.0 check_method_names(mod); /** @type {import('types').RequestHandler} */ @@ -55,88 +21,23 @@ export async function render_endpoint(event, mod, options) { } if (!handler) { - const allowed = []; - - for (const method in ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']) { - if (mod[method]) allowed.push(method); + if (event.request.headers.get('x-sveltekit-load')) { + // TODO would be nice to avoid these requests altogether, + // by noting whether or not page endpoints export `get` + return new Response(undefined, { status: 204 }); } - if (mod.GET || mod.HEAD) allowed.push('HEAD'); - - return event.request.headers.get('x-sveltekit-load') - ? // TODO would be nice to avoid these requests altogether, - // by noting whether or not page endpoints export `get` - new Response(undefined, { - status: 204 - }) - : new Response(`${method} method not allowed`, { - status: 405, - headers: { - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405 - // "The server must generate an Allow header field in a 405 status code response" - allow: allowed.join(', ') - } - }); + return method_not_allowed(mod, method); } const response = await handler(event); - const preface = `Invalid response from route ${event.url.pathname}`; - if (typeof response !== 'object') { - return error(`${preface}: expected an object, got ${typeof response}`); - } - - // TODO remove for 1.0 - // @ts-expect-error - if (response.fallthrough) { - throw new Error( - 'fallthrough is no longer supported. Use matchers instead: https://kit.svelte.dev/docs/routing#advanced-routing-matching' - ); - } - - const { status = 200, body = {} } = response; - const headers = - response.headers instanceof Headers - ? new Headers(response.headers) - : to_headers(response.headers); - - const type = headers.get('content-type'); - - if ( - !is_text(type) && - !(body instanceof Uint8Array || body instanceof ReadableStream || is_string(body)) - ) { - return error( - `${preface}: body must be an instance of string, Uint8Array or ReadableStream if content-type is not a supported textual content-type` + if (!(response instanceof Response)) { + return new Response( + `Invalid response from route ${event.url.pathname}: handler should return a Response object`, + { status: 500 } ); } - /** @type {import('types').StrictBody} */ - let normalized_body; - - if (is_pojo(body) && (!type || type.startsWith('application/json'))) { - headers.set('content-type', 'application/json; charset=utf-8'); - normalized_body = - body instanceof Error ? serialize_error(body, options.get_stack) : JSON.stringify(body); - } else { - normalized_body = /** @type {import('types').StrictBody} */ (body); - } - - if ( - (typeof normalized_body === 'string' || normalized_body instanceof Uint8Array) && - !headers.has('etag') - ) { - const cache_control = headers.get('cache-control'); - if (!cache_control || !/(no-store|immutable)/.test(cache_control)) { - headers.set('etag', `"${hash(normalized_body)}"`); - } - } - - return new Response( - method !== 'HEAD' && !bodyless_status_codes.has(status) ? normalized_body : undefined, - { - status, - headers - } - ); + return response; } diff --git a/packages/kit/src/runtime/server/endpoint.spec.js b/packages/kit/src/runtime/server/endpoint.spec.js deleted file mode 100644 index 52a9a7e491b9..000000000000 --- a/packages/kit/src/runtime/server/endpoint.spec.js +++ /dev/null @@ -1,24 +0,0 @@ -import { test } from 'uvu'; -import * as assert from 'uvu/assert'; -import { is_text } from './endpoint.js'; - -test('is_text', () => { - assert.equal(is_text(undefined), true); - assert.equal(is_text(null), true); - assert.equal(is_text(''), true); - assert.equal(is_text('TEXT/PLAIN'), true); - assert.equal(is_text('text/html'), true); - assert.equal(is_text('text/javascript'), true); - assert.equal(is_text('application/xml'), true); - assert.equal(is_text('image/svg+xml'), true); - assert.equal(is_text('application/json'), true); - assert.equal(is_text('text/plain; charset="us-ascii"'), true); - assert.equal(is_text('multipart/form-data; boundary=aBoundaryString'), true); - - assert.equal(is_text('multipart/byteranges; boundary=3d6b6a416f9b5'), false); - assert.equal(is_text('image/apng'), false); - assert.equal(is_text('IMAGE/webp'), false); - assert.equal(is_text('application/octet-stream'), false); -}); - -test.run(); diff --git a/packages/kit/src/runtime/server/index.js b/packages/kit/src/runtime/server/index.js index 04406081ea58..08a88cb46c7a 100644 --- a/packages/kit/src/runtime/server/index.js +++ b/packages/kit/src/runtime/server/index.js @@ -1,5 +1,5 @@ import { render_endpoint } from './endpoint.js'; -import { render_page } from './page/index.js'; +import { handle_json_request, render_page } from './page/index.js'; import { render_response } from './page/render.js'; import { respond_with_error } from './page/respond_with_error.js'; import { coalesce_to_error } from '../../utils/error.js'; @@ -112,6 +112,9 @@ export async function respond(request, options, state) { } } + /** @type {import('types').ResponseHeaders} */ + const headers = {}; + /** @type {import('types').RequestEvent} */ const event = { get clientAddress() { @@ -132,6 +135,22 @@ export async function respond(request, options, state) { platform: state.platform, request, routeId: route && route.id, + setHeaders: (new_headers) => { + for (const key in new_headers) { + const lower = key.toLowerCase(); + + if (lower in headers) { + throw new Error(`"${key}" header is already set`); + } + + // TODO apply these headers to the response + headers[lower] = new_headers[key]; + + if (state.prerendering && lower === 'cache-control') { + state.prerendering.cache = /** @type {string} */ (new_headers[key]); + } + } + }, url }; @@ -202,10 +221,12 @@ export async function respond(request, options, state) { state, $session: await options.hooks.getSession(event), page_config: { router: true, hydrate: true }, - stuff: {}, status: 200, error: null, branch: [], + fetched: [], + validation_errors: undefined, + cookies: [], resolve_opts: { ...resolve_opts, ssr: false @@ -217,34 +238,52 @@ export async function respond(request, options, state) { /** @type {Response} */ let response; - if (is_data_request && route.type === 'page' && route.shadow) { - response = await render_endpoint(event, await route.shadow(), options); - - // loading data for a client-side transition is a special case - if (request.headers.has('x-sveltekit-load')) { - // since redirects are opaque to the browser, we need to repackage - // 3xx responses as 200s with a custom header - if (response.status >= 300 && response.status < 400) { + if (is_data_request && route.type === 'page') { + const module = await options.manifest._.nodes[route.page](); + if (module.server) { + const response = await handle_json_request(event, options, module.server); + if ( + request.headers.has('x-sveltekit-load') && + response.status >= 300 && + response.status < 400 + ) { + // since redirects are opaque to the browser, we need to repackage + // 3xx responses as 200s with a custom header const location = response.headers.get('location'); if (location) { const headers = new Headers(response.headers); headers.set('x-sveltekit-location', location); - response = new Response(undefined, { + return new Response(undefined, { status: 204, headers }); } + } else { + return response; } + } else { + return new Response('not found', { status: 404 }); } } else { response = route.type === 'endpoint' - ? await render_endpoint(event, await route.load(), options) + ? await render_endpoint(event, route) : await render_page(event, route, options, state, resolve_opts); } if (response) { + for (const key in headers) { + const value = headers[key]; + if (key === 'set-cookie') { + for (const cookie of Array.isArray(value) ? value : [value]) { + response.headers.append(key, cookie); + } + } else { + response.headers.set(key, /** @type {string} */ (value)); + } + } + // respond with 304 if etag matches if (response.status === 200 && response.headers.has('etag')) { let if_none_match_value = request.headers.get('if-none-match'); diff --git a/packages/kit/src/runtime/server/page/fetch.js b/packages/kit/src/runtime/server/page/fetch.js new file mode 100644 index 000000000000..6790844b70af --- /dev/null +++ b/packages/kit/src/runtime/server/page/fetch.js @@ -0,0 +1,265 @@ +import * as cookie from 'cookie'; +import * as set_cookie_parser from 'set-cookie-parser'; +import { respond } from '../index.js'; +import { is_root_relative, resolve } from '../../../utils/url.js'; +import { domain_matches, path_matches } from './cookie.js'; + +/** + * @param {{ + * event: import('types').RequestEvent; + * options: import('types').SSROptions; + * state: import('types').SSRState; + * route: import('types').SSRPage | import('types').SSRErrorPage; + * }} opts + */ +export function create_fetch({ event, options, state, route }) { + /** @type {import('./types').Fetched[]} */ + const fetched = []; + + const initial_cookies = cookie.parse(event.request.headers.get('cookie') || ''); + + /** @type {import('set-cookie-parser').Cookie[]} */ + const cookies = []; + + /** @type {typeof fetch} */ + const fetcher = async (resource, opts = {}) => { + /** @type {string} */ + let requested; + + if (typeof resource === 'string' || resource instanceof URL) { + requested = resource.toString(); + } else { + requested = resource.url; + + opts = { + method: resource.method, + headers: resource.headers, + body: resource.body, + mode: resource.mode, + credentials: resource.credentials, + cache: resource.cache, + redirect: resource.redirect, + referrer: resource.referrer, + integrity: resource.integrity, + ...opts + }; + } + + opts.headers = new Headers(opts.headers); + + // merge headers from request + for (const [key, value] of event.request.headers) { + if ( + key !== 'authorization' && + key !== 'connection' && + key !== 'cookie' && + key !== 'host' && + key !== 'if-none-match' && + !opts.headers.has(key) + ) { + opts.headers.set(key, value); + } + } + + const resolved = resolve(event.url.pathname, requested.split('?')[0]); + + /** @type {Response} */ + let response; + + /** @type {import('types').PrerenderDependency} */ + let dependency; + + // handle fetch requests for static assets. e.g. prebaked data, etc. + // we need to support everything the browser's fetch supports + const prefix = options.paths.assets || options.paths.base; + const filename = decodeURIComponent( + resolved.startsWith(prefix) ? resolved.slice(prefix.length) : resolved + ).slice(1); + const filename_html = `${filename}/index.html`; // path may also match path/index.html + + const is_asset = options.manifest.assets.has(filename); + const is_asset_html = options.manifest.assets.has(filename_html); + + if (is_asset || is_asset_html) { + const file = is_asset ? filename : filename_html; + + if (options.read) { + const type = is_asset + ? options.manifest.mimeTypes[filename.slice(filename.lastIndexOf('.'))] + : 'text/html'; + + response = new Response(options.read(file), { + headers: type ? { 'content-type': type } : {} + }); + } else { + response = await fetch(`${event.url.origin}/${file}`, /** @type {RequestInit} */ (opts)); + } + } else if (is_root_relative(resolved)) { + if (opts.credentials !== 'omit') { + const authorization = event.request.headers.get('authorization'); + + // combine cookies from the initiating request with any that were + // added via set-cookie + const combined_cookies = { ...initial_cookies }; + + for (const cookie of cookies) { + if (!domain_matches(event.url.hostname, cookie.domain)) continue; + if (!path_matches(resolved, cookie.path)) continue; + + combined_cookies[cookie.name] = cookie.value; + } + + const cookie = Object.entries(combined_cookies) + .map(([name, value]) => `${name}=${value}`) + .join('; '); + + if (cookie) { + opts.headers.set('cookie', cookie); + } + + if (authorization && !opts.headers.has('authorization')) { + opts.headers.set('authorization', authorization); + } + } + + if (opts.body && typeof opts.body !== 'string') { + // per https://developer.mozilla.org/en-US/docs/Web/API/Request/Request, this can be a + // Blob, BufferSource, FormData, URLSearchParams, USVString, or ReadableStream object. + // non-string bodies are irksome to deal with, but luckily aren't particularly useful + // in this context anyway, so we take the easy route and ban them + throw new Error('Request body must be a string'); + } + + response = await respond( + new Request(new URL(requested, event.url).href, { ...opts }), + options, + { + ...state, + initiator: route + } + ); + + if (state.prerendering) { + dependency = { response, body: null }; + state.prerendering.dependencies.set(resolved, dependency); + } + } else { + // external + if (resolved.startsWith('//')) { + requested = event.url.protocol + requested; + } + + // external fetch + // allow cookie passthrough for "same-origin" + // if SvelteKit is serving my.domain.com: + // - domain.com WILL NOT receive cookies + // - my.domain.com WILL receive cookies + // - api.domain.dom WILL NOT receive cookies + // - sub.my.domain.com WILL receive cookies + // ports do not affect the resolution + // leading dot prevents mydomain.com matching domain.com + if ( + `.${new URL(requested).hostname}`.endsWith(`.${event.url.hostname}`) && + opts.credentials !== 'omit' + ) { + const cookie = event.request.headers.get('cookie'); + if (cookie) opts.headers.set('cookie', cookie); + } + + // we need to delete the connection header, as explained here: + // https://github.com/nodejs/undici/issues/1470#issuecomment-1140798467 + // TODO this may be a case for being selective about which headers we let through + opts.headers.delete('connection'); + + const external_request = new Request(requested, /** @type {RequestInit} */ (opts)); + response = await options.hooks.externalFetch.call(null, external_request); + } + + const set_cookie = response.headers.get('set-cookie'); + if (set_cookie) { + cookies.push( + ...set_cookie_parser + .splitCookiesString(set_cookie) + .map((str) => set_cookie_parser.parseString(str)) + ); + } + + const proxy = new Proxy(response, { + get(response, key, _receiver) { + async function text() { + const body = await response.text(); + + /** @type {import('types').ResponseHeaders} */ + const headers = {}; + for (const [key, value] of response.headers) { + // TODO skip others besides set-cookie and etag? + if (key !== 'set-cookie' && key !== 'etag') { + headers[key] = value; + } + } + + if (!opts.body || typeof opts.body === 'string') { + const status_number = Number(response.status); + if (isNaN(status_number)) { + throw new Error( + `response.status is not a number. value: "${ + response.status + }" type: ${typeof response.status}` + ); + } + + fetched.push({ + url: requested, + body: opts.body, + response: { + status: status_number, + statusText: response.statusText, + headers, + body + } + }); + } + + if (dependency) { + dependency.body = body; + } + + return body; + } + + if (key === 'arrayBuffer') { + return async () => { + const buffer = await response.arrayBuffer(); + + if (dependency) { + dependency.body = new Uint8Array(buffer); + } + + // TODO should buffer be inlined into the page (albeit base64'd)? + // any conditions in which it shouldn't be? + + return buffer; + }; + } + + if (key === 'text') { + return text; + } + + if (key === 'json') { + return async () => { + return JSON.parse(await text()); + }; + } + + // TODO arrayBuffer? + + return Reflect.get(response, key, response); + } + }); + + return proxy; + }; + + return { fetcher, fetched, cookies }; +} diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index c56e97b05270..83dc461388fe 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -1,6 +1,18 @@ import { negotiate } from '../../../utils/http.js'; -import { render_endpoint } from '../endpoint.js'; -import { respond } from './respond.js'; +import { render_response } from './render.js'; +import { respond_with_error } from './respond_with_error.js'; +import { method_not_allowed, clone_error, allowed_methods } from '../utils.js'; +import { create_fetch } from './fetch.js'; +import { LoadURL, PrerenderingURL } from '../../../utils/url.js'; +import { Redirect } from '../../../index/private.js'; +import { error } from '../../../index/index.js'; + +/** + * @typedef {import('./types.js').Loaded} Loaded + * @typedef {import('types').SSRNode} SSRNode + * @typedef {import('types').SSROptions} SSROptions + * @typedef {import('types').SSRState} SSRState + */ /** * @param {import('types').RequestEvent} event @@ -18,25 +30,415 @@ export async function render_page(event, route, options, state, resolve_opts) { }); } - if (route.shadow) { - const type = negotiate(event.request.headers.get('accept') || 'text/html', [ - 'text/html', - 'application/json' - ]); + const accept = negotiate(event.request.headers.get('accept') || 'text/html', [ + 'text/html', + 'application/json' + ]); - if (type === 'application/json') { - return render_endpoint(event, await route.shadow(), options); + if (accept === 'application/json') { + const node = await options.manifest._.nodes[route.page](); + if (node.server) { + return handle_json_request(event, options, node.server); } } const $session = await options.hooks.getSession(event); - return respond({ - event, - options, - state, - $session, - resolve_opts, - route + const { fetcher, fetched, cookies } = create_fetch({ event, options, state, route }); + + try { + const nodes = await Promise.all([ + // we use == here rather than === because [undefined] serializes as "[null]" + ...route.layouts.map((n) => (n == undefined ? n : options.manifest._.nodes[n]())), + options.manifest._.nodes[route.page]() + ]); + + const leaf_node = /** @type {import('types').SSRNode} */ (nodes.at(-1)); + + let status = 200; + + /** @type {HttpError | Error} */ + let mutation_error; + + /** @type {Record | undefined} */ + let validation_errors; + + if (leaf_node.server && event.request.method !== 'GET' && event.request.method !== 'HEAD') { + // for non-GET requests, first call handler in +page.server.js + // (this also determines status code) + try { + const handler = leaf_node.server[event.request.method]; + if (handler) { + const result = await handler.call(null, event); + + if (result?.errors) { + validation_errors = result.errors; + status = result.status ?? 400; + } + + if (event.request.method === 'POST' && result?.location) { + return redirect_response(status, result.location); + } + } else { + event.setHeaders({ + allow: allowed_methods(leaf_node.server).join(', ') + }); + + mutation_error = error(405, 'Method not allowed'); + } + } catch (e) { + if (e.__is_redirect) { + return redirect_response(e.status, e.location); + } + + mutation_error = e; + } + } + + if (!resolve_opts.ssr) { + return await render_response({ + branch: [], + validation_errors: undefined, + fetched, + cookies, + page_config: { + hydrate: true, + router: true + }, + status, + error: null, + event, + options, + state, + $session, + resolve_opts + }); + } + + const should_prerender = leaf_node.module?.prerender ?? options.prerender.default; + if (should_prerender) { + const mod = leaf_node.server; + if (mod && (mod.POST || mod.PUT || mod.DELETE || mod.PATCH)) { + throw new Error('Cannot prerender pages that have endpoints with mutative methods'); + } + } else if (state.prerendering) { + // if the page isn't marked as prerenderable (or is explicitly + // marked NOT prerenderable, if `prerender.default` is `true`), + // then bail out at this point + if (!should_prerender) { + return new Response(undefined, { + status: 204 + }); + } + } + + /** @type {Array} */ + let branch = []; + + /** @type {Error | null} */ + let load_error = null; + + /** @type {Array>} */ + const server_promises = nodes.map((node, i) => { + if (load_error) { + // if an error happens immediately, don't bother with the rest of the nodes + throw load_error; + } + + return Promise.resolve().then(async () => { + try { + if (node === leaf_node && mutation_error) { + // we wait until here to throw the error so that we can use + // any nested +error.svelte components that were defined + throw mutation_error; + } + + const server_data = await node?.server?.GET?.call(null, { + // can't use destructuring here because it will always + // invoke event.clientAddress, which breaks prerendering + get clientAddress() { + return event.clientAddress; + }, + locals: event.locals, + params: event.params, + parent: async () => { + const data = {}; + for (let j = 0; j < i; j += 1) { + Object.assign(data, await server_promises[j]); + } + return data; + }, + platform: event.platform, + request: event.request, + routeId: event.routeId, + setHeaders: event.setHeaders, + url: event.url + }); + + return server_data ? unwrap_promises(server_data) : null; + } catch (e) { + load_error = /** @type {Error} */ (e); + throw load_error; + } + }); + }); + + /** @type {Array | null>>} */ + const load_promises = nodes.map((node, i) => { + if (load_error) throw load_error; + return Promise.resolve().then(async () => { + try { + const server_data = await server_promises[i]; + + if (node?.module?.load) { + const data = await node?.module?.load?.call(null, { + url: state.prerendering ? new PrerenderingURL(event.url) : new LoadURL(event.url), + params: event.params, + data: server_data, + routeId: event.routeId, + get session() { + if (node.module.prerender ?? options.prerender.default) { + throw Error( + 'Attempted to access session from a prerendered page. Session would never be populated.' + ); + } + return $session; + }, + fetch: fetcher, + setHeaders: event.setHeaders, + depends: () => {}, + parent: async () => { + const data = {}; + for (let j = 0; j < i; j += 1) { + Object.assign(data, await load_promises[j]); + } + return data; + } + }); + + return data ? unwrap_promises(data) : null; + } + + return server_data; + } catch (e) { + load_error = /** @type {Error} */ (e); + throw load_error; + } + }); + }); + + // if we don't do this, rejections will be unhandled + for (const p of server_promises) p.catch(() => {}); + for (const p of load_promises) p.catch(() => {}); + + for (let i = 0; i < nodes.length; i += 1) { + const node = nodes[i]; + + if (node) { + try { + const server_data = await server_promises[i]; + const data = await load_promises[i]; + + branch.push({ node, server_data, data }); + + // generate __data.json files when prerendering + // TODO for this is just leaf nodes, so that stuff passes, but + // ultimately we need ./__data/0.json, ./__data/1.json, etc + if (node === leaf_node && server_data && state.prerendering) { + const pathname = `${event.url.pathname.replace(/\/$/, '')}/__data.json`; + + const dependency = { + response: new Response(undefined), + body: JSON.stringify(server_data) + }; + + state.prerendering.dependencies.set(pathname, dependency); + } + } catch (error) { + if (/** @type {Redirect} */ (error).__is_redirect) { + return redirect_response(error.status, error.location); + } + + if (!error.__is_http_error) { + options.handle_error(error, event); + } + + const status = error.__is_http_error ? error.status : 500; + + while (i--) { + if (route.errors[i]) { + const index = /** @type {number} */ (route.errors[i]); + const node = await options.manifest._.nodes[index](); + + let j = i; + while (!branch[j]) j -= 1; + + return await render_response({ + event, + options, + state, + $session, + resolve_opts, + page_config: { router: true, hydrate: true }, + status, + error, + branch: branch + .slice(0, j + 1) + .filter(Boolean) + .concat({ node, data: null, server_data: null }), + fetched, + cookies + }); + } + } + + // if we're still here, it means the error happened in the root layout, + // which means we have to fall back to a plain text response + // TODO since the requester is expecting HTML, maybe it makes sense to + // doll this up a bit + return new Response(options.get_stack(error) || error.message, { status }); + } + } else { + // push an empty slot so we can rewind past gaps to the + // layout that corresponds with an +error.svelte page + branch.push(null); + } + } + + // TODO use validation_errors + + return await render_response({ + event, + options, + state, + $session, + resolve_opts, + page_config: get_page_config(leaf_node, options), + status, + error: null, + branch: branch.filter(Boolean), + validation_errors, + fetched, + cookies + }); + } catch (error) { + // if we end up here, it means the data loaded successfull + // but the page failed to render + options.handle_error(error, event); + + return await respond_with_error({ + event, + options, + state, + $session, + status: 500, + error, + resolve_opts + }); + } +} + +/** + * @param {import('types').SSRNode} leaf + * @param {SSROptions} options + */ +function get_page_config(leaf, options) { + // TODO we can reinstate this now that it's in the module + if (leaf.module && 'ssr' in leaf.module) { + throw new Error( + '`export const ssr` has been removed — use the handle hook instead: https://kit.svelte.dev/docs/hooks#handle' + ); + } + + return { + router: leaf.module?.router ?? options.router, + hydrate: leaf.module?.hydrate ?? options.hydrate + }; +} + +/** + * @param {import('types').RequestEvent} event + * @param {import('types').SSROptions} options + * @param {import('types').SSRNode['server']} mod + */ +export async function handle_json_request(event, options, mod) { + const method = /** @type {import('types').HttpMethod} */ (event.request.method); + const handler = mod[method === 'HEAD' ? 'GET' : method]; + + if (!handler) { + return method_not_allowed(mod, method); + } + + try { + const result = await handler.call(null, event); + + if (method === 'HEAD') { + return new Response(); + } + + if (method === 'GET') { + return json_response(result, 200); + } + + if (method === 'POST') { + if (result.errors) { + return json_response({ errors: result.errors }, result.status || 400); + } + + return new Response(undefined, { + status: 201, + headers: result.location ? { location: result.location } : undefined + }); + } + + return new Response(undefined, { status: 204 }); + } catch (error) { + if (error?.__is_redirect) { + return redirect_response(error.status, error.location); + } + + if (error?.__is_http_error) { + return json_response({ message: error.message }, error.status); + } + + return json_response(clone_error(error, options.get_stack), 500); + } +} + +/** + * @param {any} data + * @param {number} status + */ +export function json_response(data, status) { + // TODO replace with Response.json one day. in the meantime this probably + // belongs in a different module + return new Response(JSON.stringify(data), { + status, + headers: { + 'content-type': 'application/json; charset=utf-8' + } + }); +} + +/** @param {Record} object */ +async function unwrap_promises(object) { + /** @type {import('types').JSONObject} */ + const unwrapped = {}; + + for (const key in object) { + unwrapped[key] = await object[key]; + } + + return unwrapped; +} + +/** + * @param {number} status + * @param {string} location + */ +function redirect_response(status, location) { + return new Response(undefined, { + status, + headers: { location } }); } diff --git a/packages/kit/src/runtime/server/page/load_data.js b/packages/kit/src/runtime/server/page/load_data.js new file mode 100644 index 000000000000..fccde0882340 --- /dev/null +++ b/packages/kit/src/runtime/server/page/load_data.js @@ -0,0 +1,49 @@ +import { LoadURL, PrerenderingURL } from '../../../utils/url.js'; + +/** + * Calls the user's `load` function. + * @param {{ + * event: import('types').RequestEvent; + * options: import('types').SSROptions; + * state: import('types').SSRState; + * node: import('types').SSRNode; + * fetcher: typeof fetch; + * $session: any; + * }} opts + * @returns {Promise} + */ +export async function load_data({ event, options, state, node, fetcher, $session }) { + /** @type {Record | null} */ + const server_data = node.server?.GET?.call(null, event) ?? null; // TODO unwrap top-level promises + + let data = server_data; + + if (node.module?.load) { + /** @type {import('types').LoadEvent} */ + const load_event = { + url: state.prerendering ? new PrerenderingURL(event.url) : new LoadURL(event.url), + params: event.params, + data: server_data, + routeId: event.routeId, + get session() { + if (node.module.prerender ?? options.prerender.default) { + throw Error( + 'Attempted to access session from a prerendered page. Session would never be populated.' + ); + } + return $session; + }, + fetch: fetcher, + setHeaders: event.setHeaders + }; + + // TODO unwrap top-level promises + data = (await node.module.load.call(null, load_event)) ?? null; + } + + return { + node, + data, + server_data // we return this separately so it can be serialized into the page + }; +} diff --git a/packages/kit/src/runtime/server/page/load_node.js b/packages/kit/src/runtime/server/page/load_node.js deleted file mode 100644 index fbf789222522..000000000000 --- a/packages/kit/src/runtime/server/page/load_node.js +++ /dev/null @@ -1,560 +0,0 @@ -import * as cookie from 'cookie'; -import * as set_cookie_parser from 'set-cookie-parser'; -import { normalize } from '../../load.js'; -import { respond } from '../index.js'; -import { LoadURL, PrerenderingURL, is_root_relative, resolve } from '../../../utils/url.js'; -import { check_method_names, is_pojo, lowercase_keys } from '../utils.js'; -import { coalesce_to_error } from '../../../utils/error.js'; -import { domain_matches, path_matches } from './cookie.js'; - -/** - * Calls the user's `load` function. - * @param {{ - * event: import('types').RequestEvent; - * options: import('types').SSROptions; - * state: import('types').SSRState; - * route: import('types').SSRPage | import('types').SSRErrorPage; - * node: import('types').SSRNode; - * $session: any; - * stuff: Record; - * is_error: boolean; - * is_leaf: boolean; - * status?: number; - * error?: Error; - * }} opts - * @returns {Promise} - */ -export async function load_node({ - event, - options, - state, - route, - node, - $session, - stuff, - is_error, - is_leaf, - status, - error -}) { - const { module } = node; - - let uses_credentials = false; - - /** @type {Array} */ - const fetched = []; - - const cookies = cookie.parse(event.request.headers.get('cookie') || ''); - - /** @type {import('set-cookie-parser').Cookie[]} */ - const new_cookies = []; - - /** @type {import('types').NormalizedLoadOutput} */ - let loaded; - - const should_prerender = node.module.prerender ?? options.prerender.default; - - /** @type {import('types').ShadowData} */ - const shadow = is_leaf - ? await load_shadow_data( - /** @type {import('types').SSRPage} */ (route), - event, - options, - should_prerender - ) - : {}; - - if (shadow.cookies) { - shadow.cookies.forEach((header) => { - new_cookies.push(set_cookie_parser.parseString(header)); - }); - } - - if (shadow.error) { - loaded = { - error: shadow.error - }; - } else if (shadow.redirect) { - loaded = { - redirect: shadow.redirect - }; - } else if (module.load) { - /** @type {import('types').LoadEvent} */ - const load_input = { - url: state.prerendering ? new PrerenderingURL(event.url) : new LoadURL(event.url), - params: event.params, - props: shadow.body || {}, - routeId: event.routeId, - get session() { - if (node.module.prerender ?? options.prerender.default) { - throw Error( - 'Attempted to access session from a prerendered page. Session would never be populated.' - ); - } - uses_credentials = true; - return $session; - }, - /** - * @param {RequestInfo} resource - * @param {RequestInit} opts - */ - fetch: async (resource, opts = {}) => { - /** @type {string} */ - let requested; - - if (typeof resource === 'string') { - requested = resource; - } else { - requested = resource.url; - - opts = { - method: resource.method, - headers: resource.headers, - body: resource.body, - mode: resource.mode, - credentials: resource.credentials, - cache: resource.cache, - redirect: resource.redirect, - referrer: resource.referrer, - integrity: resource.integrity, - ...opts - }; - } - - opts.headers = new Headers(opts.headers); - - // merge headers from request - for (const [key, value] of event.request.headers) { - if ( - key !== 'authorization' && - key !== 'connection' && - key !== 'cookie' && - key !== 'host' && - key !== 'if-none-match' && - !opts.headers.has(key) - ) { - opts.headers.set(key, value); - } - } - - const resolved = resolve(event.url.pathname, requested.split('?')[0]); - - /** @type {Response} */ - let response; - - /** @type {import('types').PrerenderDependency} */ - let dependency; - - // handle fetch requests for static assets. e.g. prebaked data, etc. - // we need to support everything the browser's fetch supports - const prefix = options.paths.assets || options.paths.base; - const filename = decodeURIComponent( - resolved.startsWith(prefix) ? resolved.slice(prefix.length) : resolved - ).slice(1); - const filename_html = `${filename}/index.html`; // path may also match path/index.html - - const is_asset = options.manifest.assets.has(filename); - const is_asset_html = options.manifest.assets.has(filename_html); - - if (is_asset || is_asset_html) { - const file = is_asset ? filename : filename_html; - - if (options.read) { - const type = is_asset - ? options.manifest.mimeTypes[filename.slice(filename.lastIndexOf('.'))] - : 'text/html'; - - response = new Response(options.read(file), { - headers: type ? { 'content-type': type } : {} - }); - } else { - response = await fetch( - `${event.url.origin}/${file}`, - /** @type {RequestInit} */ (opts) - ); - } - } else if (is_root_relative(resolved)) { - if (opts.credentials !== 'omit') { - uses_credentials = true; - - const authorization = event.request.headers.get('authorization'); - - // combine cookies from the initiating request with any that were - // added via set-cookie - const combined_cookies = { ...cookies }; - - for (const cookie of new_cookies) { - if (!domain_matches(event.url.hostname, cookie.domain)) continue; - if (!path_matches(resolved, cookie.path)) continue; - - combined_cookies[cookie.name] = cookie.value; - } - - const cookie = Object.entries(combined_cookies) - .map(([name, value]) => `${name}=${value}`) - .join('; '); - - if (cookie) { - opts.headers.set('cookie', cookie); - } - - if (authorization && !opts.headers.has('authorization')) { - opts.headers.set('authorization', authorization); - } - } - - if (opts.body && typeof opts.body !== 'string') { - // per https://developer.mozilla.org/en-US/docs/Web/API/Request/Request, this can be a - // Blob, BufferSource, FormData, URLSearchParams, USVString, or ReadableStream object. - // non-string bodies are irksome to deal with, but luckily aren't particularly useful - // in this context anyway, so we take the easy route and ban them - throw new Error('Request body must be a string'); - } - - response = await respond( - new Request(new URL(requested, event.url).href, { ...opts }), - options, - { - ...state, - initiator: route - } - ); - - if (state.prerendering) { - dependency = { response, body: null }; - state.prerendering.dependencies.set(resolved, dependency); - } - } else { - // external - if (resolved.startsWith('//')) { - requested = event.url.protocol + requested; - } - - // external fetch - // allow cookie passthrough for "same-origin" - // if SvelteKit is serving my.domain.com: - // - domain.com WILL NOT receive cookies - // - my.domain.com WILL receive cookies - // - api.domain.dom WILL NOT receive cookies - // - sub.my.domain.com WILL receive cookies - // ports do not affect the resolution - // leading dot prevents mydomain.com matching domain.com - if ( - `.${new URL(requested).hostname}`.endsWith(`.${event.url.hostname}`) && - opts.credentials !== 'omit' - ) { - uses_credentials = true; - - const cookie = event.request.headers.get('cookie'); - if (cookie) opts.headers.set('cookie', cookie); - } - - // we need to delete the connection header, as explained here: - // https://github.com/nodejs/undici/issues/1470#issuecomment-1140798467 - // TODO this may be a case for being selective about which headers we let through - opts.headers.delete('connection'); - - const external_request = new Request(requested, /** @type {RequestInit} */ (opts)); - response = await options.hooks.externalFetch.call(null, external_request); - } - - const set_cookie = response.headers.get('set-cookie'); - if (set_cookie) { - new_cookies.push( - ...set_cookie_parser - .splitCookiesString(set_cookie) - .map((str) => set_cookie_parser.parseString(str)) - ); - } - - const proxy = new Proxy(response, { - get(response, key, _receiver) { - async function text() { - const body = await response.text(); - - /** @type {import('types').ResponseHeaders} */ - const headers = {}; - for (const [key, value] of response.headers) { - // TODO skip others besides set-cookie and etag? - if (key !== 'set-cookie' && key !== 'etag') { - headers[key] = value; - } - } - - if (!opts.body || typeof opts.body === 'string') { - const status_number = Number(response.status); - if (isNaN(status_number)) { - throw new Error( - `response.status is not a number. value: "${ - response.status - }" type: ${typeof response.status}` - ); - } - - fetched.push({ - url: requested, - body: opts.body, - response: { - status: status_number, - statusText: response.statusText, - headers, - body - } - }); - } - - if (dependency) { - dependency.body = body; - } - - return body; - } - - if (key === 'arrayBuffer') { - return async () => { - const buffer = await response.arrayBuffer(); - - if (dependency) { - dependency.body = new Uint8Array(buffer); - } - - // TODO should buffer be inlined into the page (albeit base64'd)? - // any conditions in which it shouldn't be? - - return buffer; - }; - } - - if (key === 'text') { - return text; - } - - if (key === 'json') { - return async () => { - return JSON.parse(await text()); - }; - } - - // TODO arrayBuffer? - - return Reflect.get(response, key, response); - } - }); - - return proxy; - }, - stuff: { ...stuff }, - status: (is_error ? status : shadow.status) ?? null, - error: is_error ? error ?? null : null - }; - - if (options.dev) { - // TODO remove this for 1.0 - Object.defineProperty(load_input, 'page', { - get: () => { - throw new Error('`page` in `load` functions has been replaced by `url` and `params`'); - } - }); - } - - loaded = normalize(await module.load.call(null, load_input)); - } else if (shadow.body) { - loaded = { - props: shadow.body - }; - } else { - loaded = {}; - } - - loaded.status = loaded.status ?? shadow.status; - - // generate __data.json files when prerendering - if (shadow.body && state.prerendering) { - const pathname = `${event.url.pathname.replace(/\/$/, '')}/__data.json`; - - const dependency = { - response: new Response(undefined), - body: JSON.stringify(shadow.body) - }; - - state.prerendering.dependencies.set(pathname, dependency); - } - - return { - node, - props: shadow.body, - loaded, - stuff: loaded.stuff || stuff, - fetched, - set_cookie_headers: new_cookies.map((new_cookie) => { - const { name, value, ...options } = new_cookie; - // @ts-expect-error - return cookie.serialize(name, value, options); - }), - uses_credentials - }; -} - -/** - * - * @param {import('types').SSRPage} route - * @param {import('types').RequestEvent} event - * @param {import('types').SSROptions} options - * @param {boolean} prerender - * @returns {Promise} - */ -async function load_shadow_data(route, event, options, prerender) { - if (!route.shadow) return {}; - - try { - const mod = await route.shadow(); - - check_method_names(mod); - - if (prerender && (mod.POST || mod.PUT || mod.DELETE || mod.PATCH)) { - throw new Error('Cannot prerender pages that have endpoints with mutative methods'); - } - - const { method } = event.request; - const is_get = method === 'HEAD' || method === 'GET'; - const handler = method === 'HEAD' ? mod.HEAD || mod.GET : mod[method]; - - if (!handler && !is_get) { - return { - status: 405, - error: new Error(`${method} method not allowed`) - }; - } - - /** @type {import('types').ShadowData} */ - const data = { - status: undefined, - cookies: [], - body: {} - }; - - if (!is_get) { - const { status, headers, body } = validate_shadow_output(await handler(event)); - add_cookies(/** @type {string[]} */ (data.cookies), headers); - data.status = status; - - // explicit errors cause an error page... - if (body instanceof Error) { - if (status < 400) { - data.status = 500; - data.error = new Error('A non-error status code was returned with an error body'); - } else { - data.error = body; - } - - return data; - } - - // ...redirects are respected... - if (status >= 300 && status < 400) { - data.redirect = /** @type {string} */ ( - headers instanceof Headers ? headers.get('location') : headers.location - ); - return data; - } - - // ...but 4xx and 5xx status codes _don't_ result in the error page - // rendering for non-GET requests — instead, we allow the page - // to render with any validation errors etc that were returned - data.body = body; - } - - const get = (method === 'HEAD' && mod.HEAD) || mod.GET; - if (get) { - const { status, headers, body } = validate_shadow_output(await get(event)); - add_cookies(/** @type {string[]} */ (data.cookies), headers); - - if (body instanceof Error) { - if (status < 400) { - data.status = 500; - data.error = new Error('A non-error status code was returned with an error body'); - } else { - data.status = status; - data.error = body; - } - - return data; - } - - if (status >= 400) { - data.status = status; - data.error = new Error('Failed to load data'); - return data; - } - - if (status >= 300) { - data.status = status; - data.redirect = /** @type {string} */ ( - headers instanceof Headers ? headers.get('location') : headers.location - ); - return data; - } - - data.body = { ...body, ...data.body }; - } - - return data; - } catch (e) { - const error = coalesce_to_error(e); - options.handle_error(error, event); - - return { - status: 500, - error - }; - } -} - -/** - * @param {string[]} target - * @param {Partial} headers - */ -function add_cookies(target, headers) { - const cookies = headers['set-cookie']; - if (cookies) { - if (Array.isArray(cookies)) { - target.push(...cookies); - } else { - target.push(/** @type {string} */ (cookies)); - } - } -} - -/** - * @param {import('types').ShadowEndpointOutput} result - */ -function validate_shadow_output(result) { - // TODO remove for 1.0 - // @ts-expect-error - if (result.fallthrough) { - throw new Error( - 'fallthrough is no longer supported. Use matchers instead: https://kit.svelte.dev/docs/routing#advanced-routing-matching' - ); - } - - const { status = 200, body = {} } = result; - let headers = result.headers || {}; - - if (headers instanceof Headers) { - if (headers.has('set-cookie')) { - throw new Error( - 'Endpoint request handler cannot use Headers interface with Set-Cookie headers' - ); - } - } else { - headers = lowercase_keys(/** @type {Record} */ (headers)); - } - - if (!is_pojo(body)) { - throw new Error( - 'Body returned from endpoint request handler must be a plain object or an Error' - ); - } - - return { status, headers, body }; -} diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 2d1d2e42566d..7e1f1ca262d0 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -1,5 +1,6 @@ import devalue from 'devalue'; import { readable, writable } from 'svelte/store'; +import * as cookie from 'cookie'; import { coalesce_to_error } from '../../../utils/error.js'; import { hash } from '../../hash.js'; import { render_json_payload_script } from '../../../utils/escape.js'; @@ -19,6 +20,8 @@ const updated = { * Creates the HTML response. * @param {{ * branch: Array; + * fetched: Array; + * cookies: import('set-cookie-parser').Cookie[]; * options: import('types').SSROptions; * state: import('types').SSRState; * $session: any; @@ -27,11 +30,13 @@ const updated = { * error: Error | null; * event: import('types').RequestEvent; * resolve_opts: import('types').RequiredResolveOptions; - * stuff: Record; + * validation_errors: Record | undefined; * }} opts */ export async function render_response({ branch, + fetched, + cookies, options, state, $session, @@ -40,7 +45,7 @@ export async function render_response({ error = null, event, resolve_opts, - stuff + validation_errors }) { if (state.prerendering) { if (options.csp.mode === 'nonce') { @@ -64,14 +69,8 @@ export async function render_response({ /** @type {Array} */ const serialized_data = []; - let shadow_props; - let rendered; - let is_private = false; - /** @type {import('types').NormalizedLoadOutputCache | undefined} */ - let cache; - const stack = error?.stack; if (options.dev && error) { @@ -79,15 +78,7 @@ export async function render_response({ } if (resolve_opts.ssr) { - const leaf = /** @type {import('./types.js').Loaded} */ (branch.at(-1)); - - if (leaf.loaded.status) { - // explicit status returned from `load` or a page endpoint trumps - // initial status - status = leaf.loaded.status; - } - - for (const { node, props, loaded, fetched, uses_credentials } of branch) { + for (const { node } of branch) { if (node.imports) { node.imports.forEach((url) => modulepreloads.add(url)); } @@ -99,18 +90,11 @@ export async function render_response({ if (node.inline_styles) { Object.entries(await node.inline_styles()).forEach(([k, v]) => inline_styles.set(k, v)); } - - // TODO probably better if `fetched` wasn't populated unless `hydrate` - if (fetched && page_config.hydrate) serialized_data.push(...fetched); - if (props) shadow_props = props; - - cache = loaded?.cache; - is_private = cache?.private ?? uses_credentials; } + if (fetched && page_config.hydrate) serialized_data.push(...fetched); + const session = writable($session); - // Even if $session isn't accessed, it still ends up serialized in the rendered HTML - is_private = is_private || (cache?.private ?? (!!$session && Object.keys($session).length > 0)); /** @type {Record} */ const props = { @@ -126,10 +110,10 @@ export async function render_response({ params: event.params, routeId: event.routeId, status, - stuff, - url: state.prerendering ? new PrerenderingURL(event.url) : event.url + url: state.prerendering ? new PrerenderingURL(event.url) : event.url, + data: branch.reduce((acc, { data }) => (Object.assign(acc, data), acc), {}) }, - components: branch.map(({ node }) => node.module.default) + components: branch.map(({ node }) => node.component) }; // TODO remove this for 1.0 @@ -152,7 +136,11 @@ export async function render_response({ // props_n (instead of props[n]) makes it easy to avoid // unnecessary updates for layout components for (let i = 0; i < branch.length; i += 1) { - props[`props_${i}`] = await branch[i].loaded.props; + props[`data_${i}`] = branch[i].data; + } + + if (validation_errors) { + props.errors = validation_errors; } rendered = options.root.render(props); @@ -187,7 +175,7 @@ export async function render_response({ hydrate: ${resolve_opts.ssr && page_config.hydrate ? `{ status: ${status}, error: ${error && serialize_error(error, e => e.stack)}, - nodes: [${branch.map(({ node }) => node.index).join(', ')}], + node_ids: [${branch.map(({ node }) => node.index).join(', ')}], params: ${devalue(event.params)}, routeId: ${s(event.routeId)} }` : 'null'} @@ -261,10 +249,6 @@ export async function render_response({ ) ) .join('\n\t'); - - if (shadow_props) { - body += render_json_payload_script({ type: 'props' }, shadow_props); - } } if (options.service_worker) { @@ -276,6 +260,7 @@ export async function render_response({ } if (state.prerendering) { + // TODO read headers set with setHeaders and convert into http-equiv where possible const http_equiv = []; const csp_headers = csp.csp_provider.get_meta(); @@ -283,8 +268,8 @@ export async function render_response({ http_equiv.push(csp_headers); } - if (cache) { - http_equiv.push(``); + if (state.prerendering.cache) { + http_equiv.push(``); } if (http_equiv.length > 0) { @@ -308,10 +293,6 @@ export async function render_response({ etag: `"${hash(html)}"` }); - if (cache) { - headers.set('cache-control', `${is_private ? 'private' : 'public'}, max-age=${cache.maxage}`); - } - if (!state.prerendering) { const csp_header = csp.csp_provider.get_header(); if (csp_header) { @@ -321,6 +302,12 @@ export async function render_response({ if (report_only_header) { headers.set('content-security-policy-report-only', report_only_header); } + + for (const new_cookie of cookies) { + const { name, value, ...options } = new_cookie; + // @ts-expect-error + headers.append('set-cookie', cookie.serialize(name, value, options)); + } } if (options.dev && error) { diff --git a/packages/kit/src/runtime/server/page/respond.js b/packages/kit/src/runtime/server/page/respond.js deleted file mode 100644 index 961a6b1680be..000000000000 --- a/packages/kit/src/runtime/server/page/respond.js +++ /dev/null @@ -1,275 +0,0 @@ -import { render_response } from './render.js'; -import { load_node } from './load_node.js'; -import { respond_with_error } from './respond_with_error.js'; -import { coalesce_to_error } from '../../../utils/error.js'; - -/** - * @typedef {import('./types.js').Loaded} Loaded - * @typedef {import('types').SSRNode} SSRNode - * @typedef {import('types').SSROptions} SSROptions - * @typedef {import('types').SSRState} SSRState - */ - -/** - * Gets the nodes, calls `load` for each of them, and then calls render to build the HTML response. - * @param {{ - * event: import('types').RequestEvent; - * options: SSROptions; - * state: SSRState; - * $session: any; - * resolve_opts: import('types').RequiredResolveOptions; - * route: import('types').SSRPage; - * }} opts - * @returns {Promise} - */ -export async function respond(opts) { - const { event, options, state, $session, route, resolve_opts } = opts; - - /** @type {Array} */ - let nodes; - - if (!resolve_opts.ssr) { - return await render_response({ - ...opts, - branch: [], - page_config: { - hydrate: true, - router: true - }, - status: 200, - error: null, - event, - stuff: {} - }); - } - - try { - nodes = await Promise.all( - // we use == here rather than === because [undefined] serializes as "[null]" - route.a.map((n) => (n == undefined ? n : options.manifest._.nodes[n]())) - ); - } catch (err) { - const error = coalesce_to_error(err); - - options.handle_error(error, event); - - return await respond_with_error({ - event, - options, - state, - $session, - status: 500, - error, - resolve_opts - }); - } - - // the leaf node will be present. only layouts may be undefined - const leaf = /** @type {SSRNode} */ (nodes[nodes.length - 1]).module; - - let page_config = get_page_config(leaf, options); - - if (state.prerendering) { - // if the page isn't marked as prerenderable (or is explicitly - // marked NOT prerenderable, if `prerender.default` is `true`), - // then bail out at this point - const should_prerender = leaf.prerender ?? options.prerender.default; - if (!should_prerender) { - return new Response(undefined, { - status: 204 - }); - } - } - - /** @type {Array} */ - let branch = []; - - /** @type {number} */ - let status = 200; - - /** @type {Error | null} */ - let error = null; - - /** @type {string[]} */ - let set_cookie_headers = []; - - let stuff = {}; - - ssr: { - for (let i = 0; i < nodes.length; i += 1) { - const node = nodes[i]; - - /** @type {Loaded | undefined} */ - let loaded; - - if (node) { - try { - loaded = await load_node({ - ...opts, - node, - stuff, - is_error: false, - is_leaf: i === nodes.length - 1 - }); - - set_cookie_headers = set_cookie_headers.concat(loaded.set_cookie_headers); - - if (loaded.loaded.redirect) { - return with_cookies( - new Response(undefined, { - status: loaded.loaded.status, - headers: { - location: loaded.loaded.redirect - } - }), - set_cookie_headers - ); - } - - if (loaded.loaded.error) { - error = loaded.loaded.error; - status = loaded.loaded.status ?? 500; - } - } catch (err) { - const e = coalesce_to_error(err); - - options.handle_error(e, event); - - status = 500; - error = e; - } - - if (loaded && !error) { - branch.push(loaded); - } - - if (error) { - while (i--) { - if (route.b[i]) { - const index = /** @type {number} */ (route.b[i]); - const error_node = await options.manifest._.nodes[index](); - - /** @type {Loaded} */ - let node_loaded; - let j = i; - while (!(node_loaded = branch[j])) { - j -= 1; - } - - try { - const error_loaded = /** @type {import('./types').Loaded} */ ( - await load_node({ - ...opts, - node: error_node, - stuff: node_loaded.stuff, - is_error: true, - is_leaf: false, - status, - error - }) - ); - - if (error_loaded.loaded.error) { - continue; - } - - page_config = get_page_config(error_node.module, options); - branch = branch.slice(0, j + 1).concat(error_loaded); - stuff = { ...node_loaded.stuff, ...error_loaded.stuff }; - break ssr; - } catch (err) { - const e = coalesce_to_error(err); - - options.handle_error(e, event); - - continue; - } - } - } - - // TODO backtrack until we find an __error.svelte component - // that we can use as the leaf node - // for now just return regular error page - return with_cookies( - await respond_with_error({ - event, - options, - state, - $session, - status, - error, - resolve_opts - }), - set_cookie_headers - ); - } - } - - if (loaded && loaded.loaded.stuff) { - stuff = { - ...stuff, - ...loaded.loaded.stuff - }; - } - } - } - - try { - return with_cookies( - await render_response({ - ...opts, - stuff, - event, - page_config, - status, - error, - branch: branch.filter(Boolean) - }), - set_cookie_headers - ); - } catch (err) { - const error = coalesce_to_error(err); - - options.handle_error(error, event); - - return with_cookies( - await respond_with_error({ - ...opts, - status: 500, - error - }), - set_cookie_headers - ); - } -} - -/** - * @param {import('types').SSRComponent} leaf - * @param {SSROptions} options - */ -function get_page_config(leaf, options) { - // TODO remove for 1.0 - if ('ssr' in leaf) { - throw new Error( - '`export const ssr` has been removed — use the handle hook instead: https://kit.svelte.dev/docs/hooks#handle' - ); - } - - return { - router: 'router' in leaf ? !!leaf.router : options.router, - hydrate: 'hydrate' in leaf ? !!leaf.hydrate : options.hydrate - }; -} - -/** - * @param {Response} response - * @param {string[]} set_cookie_headers - */ -function with_cookies(response, set_cookie_headers) { - if (set_cookie_headers.length) { - set_cookie_headers.forEach((value) => { - response.headers.append('set-cookie', value); - }); - } - return response; -} diff --git a/packages/kit/src/runtime/server/page/respond_with_error.js b/packages/kit/src/runtime/server/page/respond_with_error.js index c3defa2d244e..c4547c835c69 100644 --- a/packages/kit/src/runtime/server/page/respond_with_error.js +++ b/packages/kit/src/runtime/server/page/respond_with_error.js @@ -1,7 +1,8 @@ import { render_response } from './render.js'; -import { load_node } from './load_node.js'; +import { load_data } from './load_data.js'; import { coalesce_to_error } from '../../../utils/error.js'; import { GENERIC_ERROR } from '../utils.js'; +import { create_fetch } from './fetch.js'; /** * @typedef {import('./types.js').Loaded} Loaded @@ -29,50 +30,32 @@ export async function respond_with_error({ error, resolve_opts }) { + const { fetcher, fetched, cookies } = create_fetch({ + event, + options, + state, + route: GENERIC_ERROR + }); + try { const branch = []; - let stuff = {}; if (resolve_opts.ssr) { - const default_layout = await options.manifest._.nodes[0](); // 0 is always the root layout - const default_error = await options.manifest._.nodes[1](); // 1 is always the root error - - const layout_loaded = /** @type {Loaded} */ ( - await load_node({ - event, - options, - state, - route: GENERIC_ERROR, - node: default_layout, - $session, - stuff: {}, - is_error: false, - is_leaf: false - }) - ); - - if (layout_loaded.loaded.error) { - throw layout_loaded.loaded.error; - } - - const error_loaded = /** @type {Loaded} */ ( - await load_node({ + branch.push( + await load_data({ event, options, state, - route: GENERIC_ERROR, - node: default_error, + node: await options.manifest._.nodes[0](), // 0 is always the root layout $session, - stuff: layout_loaded ? layout_loaded.stuff : {}, - is_error: true, - is_leaf: false, - status, - error - }) + fetcher + }), + { + node: await options.manifest._.nodes[1](), // 1 is always the root error + data: null, + server_data: null + } ); - - branch.push(layout_loaded, error_loaded); - stuff = error_loaded.stuff; } return await render_response({ @@ -83,10 +66,11 @@ export async function respond_with_error({ hydrate: options.hydrate, router: options.router }, - stuff, status, error, branch, + fetched, + cookies, event, resolve_opts }); diff --git a/packages/kit/src/runtime/server/page/types.d.ts b/packages/kit/src/runtime/server/page/types.d.ts index 6559f88d462f..211641c2d3a1 100644 --- a/packages/kit/src/runtime/server/page/types.d.ts +++ b/packages/kit/src/runtime/server/page/types.d.ts @@ -1,6 +1,6 @@ -import { JSONValue, NormalizedLoadOutput, ResponseHeaders, SSRNode, CspDirectives } from 'types'; +import { JSONValue, ResponseHeaders, SSRNode, CspDirectives } from 'types'; -export type Fetched = { +export interface Fetched { url: string; body?: string | null; response: { @@ -9,16 +9,18 @@ export type Fetched = { headers: ResponseHeaders; body: string; }; -}; +} + +export interface FetchState { + fetched: Fetched[]; + cookies: string[]; + new_cookies: string[]; +} export type Loaded = { node: SSRNode; - props: JSONValue | undefined; - loaded: NormalizedLoadOutput; - stuff: Record; - fetched: Fetched[]; - set_cookie_headers: string[]; - uses_credentials: boolean; + data: Record | null; + server_data: JSONValue; }; type CspMode = 'hash' | 'nonce' | 'auto'; diff --git a/packages/kit/src/runtime/server/utils.js b/packages/kit/src/runtime/server/utils.js index 406ad9edbcf8..5d2ef2a7550c 100644 --- a/packages/kit/src/runtime/server/utils.js +++ b/packages/kit/src/runtime/server/utils.js @@ -1,15 +1,3 @@ -/** @param {Record} obj */ -export function lowercase_keys(obj) { - /** @type {Record} */ - const clone = {}; - - for (const key in obj) { - clone[key.toLowerCase()] = obj[key]; - } - - return clone; -} - /** @param {any} body */ export function is_pojo(body) { if (typeof body !== 'object') return false; @@ -44,7 +32,7 @@ export function serialize_error(error, get_stack) { * @param {Error} error * @param {(error: Error) => string | undefined} get_stack */ -function clone_error(error, get_stack) { +export function clone_error(error, get_stack) { const { name, message, @@ -84,3 +72,31 @@ export function check_method_names(mod) { export const GENERIC_ERROR = { id: '__error' }; + +/** + * @param {Record} mod + * @param {import('types').HttpMethod} method + */ +export function method_not_allowed(mod, method) { + return new Response(`${method} method not allowed`, { + status: 405, + headers: { + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405 + // "The server must generate an Allow header field in a 405 status code response" + allow: allowed_methods(mod).join(', ') + } + }); +} + +/** @param {Record} mod */ +export function allowed_methods(mod) { + const allowed = []; + + for (const method in ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']) { + if (method in mod) allowed.push(method); + } + + if (mod.GET || mod.HEAD) allowed.push('HEAD'); + + return allowed; +} diff --git a/packages/kit/src/runtime/server/utils.spec.js b/packages/kit/src/runtime/server/utils.spec.js index 2748a8b24d6c..8ec55eefe025 100644 --- a/packages/kit/src/runtime/server/utils.spec.js +++ b/packages/kit/src/runtime/server/utils.spec.js @@ -1,13 +1,6 @@ import { test } from 'uvu'; import * as assert from 'uvu/assert'; -import { lowercase_keys, serialize_error } from './utils.js'; - -test('lowercase_keys', () => { - assert.equal(lowercase_keys({ KEY: 'value' }), { key: 'value' }); - assert.equal(lowercase_keys({ Key: 'value' }), { key: 'value' }); - assert.equal(lowercase_keys({ UNDERSCORE_KEY: 'value' }), { underscore_key: 'value' }); - assert.equal(lowercase_keys({ 1: 'Hello World' }), { 1: 'Hello World' }); -}); +import { serialize_error } from './utils.js'; test('serialize_error', () => { class FancyError extends Error { diff --git a/packages/kit/src/utils/http.js b/packages/kit/src/utils/http.js index 7eea6cd42054..434a0f1f869f 100644 --- a/packages/kit/src/utils/http.js +++ b/packages/kit/src/utils/http.js @@ -1,25 +1,3 @@ -/** @param {Partial | undefined} object */ -export function to_headers(object) { - const headers = new Headers(); - - if (object) { - for (const key in object) { - const value = object[key]; - if (!value) continue; - - if (Array.isArray(value)) { - value.forEach((value) => { - headers.append(key, /** @type {string} */ (value)); - }); - } else { - headers.set(key, /** @type {string} */ (value)); - } - } - } - - return headers; -} - /** * Given an Accept header and a list of possible content types, pick * the most suitable one to respond with diff --git a/packages/kit/src/utils/http.spec.js b/packages/kit/src/utils/http.spec.js index 7e1abb277249..38e968f82f6d 100644 --- a/packages/kit/src/utils/http.spec.js +++ b/packages/kit/src/utils/http.spec.js @@ -1,30 +1,6 @@ import { test } from 'uvu'; import * as assert from 'uvu/assert'; -import { negotiate, to_headers } from './http.js'; -import { Headers } from 'undici'; - -// @ts-ignore -globalThis.Headers = Headers; - -test('handle header string value', () => { - const headers = to_headers({ name: 'value' }); - assert.equal(headers.get('name'), 'value'); -}); - -test('handle header array values', () => { - const headers = to_headers({ name: ['value1', 'value2'] }); - assert.equal(headers.get('name'), 'value1, value2'); -}); - -test('handle header int value', () => { - const headers = to_headers({ name: 123 }); - assert.equal(headers.get('name'), '123'); -}); - -test('handle header decimal value', () => { - const headers = to_headers({ name: 123.456 }); - assert.equal(headers.get('name'), '123.456'); -}); +import { negotiate } from './http.js'; test('handle valid accept header value', () => { const accept = 'text/html'; diff --git a/packages/kit/src/vite/build/build_server.js b/packages/kit/src/vite/build/build_server.js index 8772002705ab..aba608194153 100644 --- a/packages/kit/src/vite/build/build_server.js +++ b/packages/kit/src/vite/build/build_server.js @@ -166,10 +166,8 @@ export async function build_server(options, client) { // add entry points for every endpoint... manifest_data.routes.forEach((route) => { - const file = route.type === 'endpoint' ? route.file : route.shadow; - - if (file) { - const resolved = path.resolve(cwd, file); + if (route.type === 'endpoint') { + const resolved = path.resolve(cwd, route.file); const relative = decodeURIComponent(path.relative(config.kit.files.routes, resolved)); const name = posixify(path.join('entries/endpoints', relative.replace(/\.js$/, ''))); input[name] = resolved; @@ -177,14 +175,18 @@ export async function build_server(options, client) { }); // ...and every component used by pages... - manifest_data.components.forEach((file) => { - const resolved = path.resolve(cwd, file); - const relative = decodeURIComponent(path.relative(config.kit.files.routes, resolved)); - - const name = relative.startsWith('..') - ? posixify(path.join('entries/fallbacks', path.basename(file))) - : posixify(path.join('entries/pages', relative)); - input[name] = resolved; + manifest_data.nodes.forEach((node) => { + for (const file of [node.component, node.module, node.server]) { + if (file) { + const resolved = path.resolve(cwd, file); + const relative = decodeURIComponent(path.relative(config.kit.files.routes, resolved)); + + const name = relative.startsWith('..') + ? posixify(path.join('entries/fallbacks', path.basename(file))) + : posixify(path.join('entries/pages', relative.replace(/\.js$/, ''))); + input[name] = resolved; + } + } }); // ...and every matcher @@ -239,23 +241,55 @@ export async function build_server(options, client) { } }); - manifest_data.components.forEach((component, i) => { - const entry = find_deps(client.vite_manifest, component, true); + manifest_data.nodes.forEach((node, i) => { + /** @type {string[]} */ + const imports = []; + + /** @type {string[]} */ + const exports = [`export const index = ${i};`]; + + /** @type {string[]} */ + const imported = []; + + /** @type {string[]} */ + const stylesheets = []; - const imports = [`import * as module from '../${vite_manifest[component].file}';`]; + if (node.component) { + const entry = find_deps(client.vite_manifest, node.component, true); + + imported.push(...entry.imports); + stylesheets.push(...entry.stylesheets); + + exports.push( + `export { default as component } from '../${vite_manifest[node.component].file}';`, + `export const file = '${entry.file}';` // TODO what is this? + ); + } + + if (node.module) { + const entry = find_deps(client.vite_manifest, node.module, true); + + imported.push(...entry.imports); + stylesheets.push(...entry.stylesheets); + + imports.push(`import * as module from '../${vite_manifest[node.module].file}';`); + exports.push(`export { module };`); + } + + if (node.server) { + imports.push(`import * as server from '../${vite_manifest[node.server].file}';`); + exports.push(`export { server };`); + } - const exports = [ - 'export { module };', - `export const index = ${i};`, - `export const file = '${entry.file}';`, - `export const imports = ${s(entry.imports)};`, - `export const stylesheets = ${s(entry.stylesheets)};` - ]; + exports.push( + `export const imports = ${s(imported)};`, + `export const stylesheets = ${s(stylesheets)};` + ); /** @type {string[]} */ const styles = []; - entry.stylesheets.forEach((file) => { + stylesheets.forEach((file) => { if (stylesheet_lookup.has(file)) { const index = stylesheet_lookup.get(file); const name = `stylesheet_${index}`; @@ -296,7 +330,7 @@ function get_methods(cwd, output, manifest_data) { /** @type {Record} */ const methods = {}; manifest_data.routes.forEach((route) => { - const file = route.type === 'endpoint' ? route.file : route.shadow; + const file = route.type === 'endpoint' ? route.file : route.page.server; if (file && lookup[file]) { methods[file] = lookup[file].filter(is_http_method); diff --git a/packages/kit/src/vite/build/utils.js b/packages/kit/src/vite/build/utils.js index 614a07b79a40..11e54a9cb620 100644 --- a/packages/kit/src/vite/build/utils.js +++ b/packages/kit/src/vite/build/utils.js @@ -102,7 +102,9 @@ export const get_default_config = function ({ config, input, ssr, outDir }) { output: { format: 'esm', entryFileNames: ssr ? '[name].js' : `${config.kit.appDir}/immutable/[name]-[hash].js`, - chunkFileNames: `${config.kit.appDir}/immutable/chunks/[name]-[hash].js`, + chunkFileNames: ssr + ? 'chunks/[name].js' + : `${config.kit.appDir}/immutable/chunks/[name]-[hash].js`, assetFileNames: `${config.kit.appDir}/immutable/assets/[name]-[hash][extname]` }, preserveEntrySignatures: 'strict' diff --git a/packages/kit/src/vite/dev/index.js b/packages/kit/src/vite/dev/index.js index 97abdebc10ba..69b11dd29786 100644 --- a/packages/kit/src/vite/dev/index.js +++ b/packages/kit/src/vite/dev/index.js @@ -40,6 +40,20 @@ export async function dev(vite, vite_config, svelte_config, illegal_imports) { /** @type {import('types').SSRManifest} */ let manifest; + const extensions = [...svelte_config.extensions, ...svelte_config.kit.moduleExtensions]; + + /** @param {string} id */ + async function resolve(id) { + const url = id.startsWith('..') ? `/@fs${path.posix.resolve(id)}` : `/${id}`; + + const module = await vite.ssrLoadModule(url); + + const module_node = await vite.moduleGraph.getModuleByUrl(url); + if (!module_node) throw new Error(`Could not find node for ${url}`); + + return { module, module_node, url }; + } + function update_manifest() { const { manifest_data } = sync.update(svelte_config); @@ -53,60 +67,91 @@ export async function dev(vite, vite_config, svelte_config, illegal_imports) { imports: [], stylesheets: [] }, - nodes: manifest_data.components.map((id, index) => { + nodes: manifest_data.nodes.map((node, index) => { return async () => { - const url = id.startsWith('..') ? `/@fs${path.posix.resolve(id)}` : `/${id}`; + /** @type {import('types').SSRNode} */ + const result = {}; - const module = /** @type {import('types').SSRComponent} */ ( - await vite.ssrLoadModule(url) - ); + /** @type {import('vite').ModuleNode[]} */ + const module_nodes = []; - const node = await vite.moduleGraph.getModuleByUrl(url); - if (!node) throw new Error(`Could not find node for ${url}`); + result.index = index; - prevent_illegal_vite_imports( - node, - illegal_imports, - [...svelte_config.extensions, ...svelte_config.kit.moduleExtensions], - svelte_config.kit.outDir - ); + // these are unused in dev, it's easier to include them + result.imports = []; + result.stylesheets = []; - return { - module, - index, - file: url.endsWith('.svelte') ? url : url + '?import', - imports: [], - stylesheets: [], - // in dev we inline all styles to avoid FOUC - inline_styles: async () => { - const deps = new Set(); - await find_deps(vite, node, deps); - - /** @type {Record} */ - const styles = {}; - - for (const dep of deps) { - const parsed = new URL(dep.url, 'http://localhost/'); - const query = parsed.searchParams; - - if ( - style_pattern.test(dep.file) || - (query.has('svelte') && query.get('type') === 'style') - ) { - try { - const mod = await vite.ssrLoadModule(dep.url); - styles[dep.url] = mod.default; - } catch { - // this can happen with dynamically imported modules, I think - // because the Vite module graph doesn't distinguish between - // static and dynamic imports? TODO investigate, submit fix - } + if (node.component) { + const { module, module_node, url } = await resolve(node.component); + + module_nodes.push(module_node); + + result.component = module.default; + result.file = url.endsWith('.svelte') ? url : url + '?import'; // TODO what is this for? + + prevent_illegal_vite_imports( + module_node, + illegal_imports, + extensions, + svelte_config.kit.outDir + ); + } + + if (node.module) { + const { module, module_node } = await resolve(node.module); + + module_nodes.push(module_node); + + result.module = module; + + prevent_illegal_vite_imports( + module_node, + illegal_imports, + extensions, + svelte_config.kit.outDir + ); + } + + if (node.server) { + const { module } = await resolve(node.server); + result.server = module; + } + + // in dev we inline all styles to avoid FOUC. this gets populated lazily so that + // components/stylesheets loaded via import() during `load` are included + result.inline_styles = async () => { + const deps = new Set(); + + for (const module_node of module_nodes) { + await find_deps(vite, module_node, deps); + } + + /** @type {Record} */ + const styles = {}; + + for (const dep of deps) { + const parsed = new URL(dep.url, 'http://localhost/'); + const query = parsed.searchParams; + + if ( + style_pattern.test(dep.file) || + (query.has('svelte') && query.get('type') === 'style') + ) { + try { + const mod = await vite.ssrLoadModule(dep.url); + styles[dep.url] = mod.default; + } catch { + // this can happen with dynamically imported modules, I think + // because the Vite module graph doesn't distinguish between + // static and dynamic imports? TODO investigate, submit fix } } - - return styles; } + + return styles; }; + + return result; }; }), routes: manifest_data.routes.map((route) => { @@ -119,14 +164,11 @@ export async function dev(vite, vite_config, svelte_config, illegal_imports) { pattern, names, types, - shadow: route.shadow - ? async () => { - const url = path.resolve(cwd, /** @type {string} */ (route.shadow)); - return await vite.ssrLoadModule(url); - } - : null, - a: route.a.map((id) => (id ? manifest_data.components.indexOf(id) : undefined)), - b: route.b.map((id) => (id ? manifest_data.components.indexOf(id) : undefined)) + errors: route.errors.map((id) => (id ? manifest_data.nodes.indexOf(id) : undefined)), + layouts: route.layouts.map((id) => + id ? manifest_data.nodes.indexOf(id) : undefined + ), + page: manifest_data.nodes.indexOf(route.page) }; } diff --git a/packages/kit/src/vite/index.js b/packages/kit/src/vite/index.js index e6d347d66b9b..4269861f1313 100644 --- a/packages/kit/src/vite/index.js +++ b/packages/kit/src/vite/index.js @@ -126,17 +126,30 @@ function kit() { start: `${get_runtime_directory(svelte_config.kit)}/client/start.js` }; - // This step is optional — Vite/Rollup will create the necessary chunks - // for everything regardless — but it means that entry chunks reflect - // their location in the source code, which is helpful for debugging - manifest_data.components.forEach((file) => { - const resolved = path.resolve(cwd, file); - const relative = decodeURIComponent(path.relative(svelte_config.kit.files.routes, resolved)); - - const name = relative.startsWith('..') - ? path.basename(file) - : posixify(path.join('pages', relative)); - input[name] = resolved; + manifest_data.nodes.forEach((node) => { + if (node.component) { + const resolved = path.resolve(cwd, node.component); + const relative = decodeURIComponent( + path.relative(svelte_config.kit.files.routes, resolved) + ); + + const name = relative.startsWith('..') + ? path.basename(node.component) + : posixify(path.join('pages', relative)); + input[`components/${name}`] = resolved; + } + + if (node.module) { + const resolved = path.resolve(cwd, node.module); + const relative = decodeURIComponent( + path.relative(svelte_config.kit.files.routes, resolved) + ); + + const name = relative.startsWith('..') + ? path.basename(node.module) + : posixify(path.join('pages', relative)); + input[`modules/${name}`] = resolved; + } }); return get_default_build_config({ @@ -282,19 +295,22 @@ function kit() { * then use this hook to kick off builds for the server and service worker. */ async writeBundle(_options, bundle) { - for (const file of manifest_data.components) { - const id = vite.normalizePath(path.resolve(file)); - const node = this.getModuleInfo(id); + manifest_data.nodes.forEach((_node, i) => { + const id = vite.normalizePath( + path.resolve(svelte_config.kit.outDir, `generated/nodes/${i}.js`) + ); + + const module_node = this.getModuleInfo(id); - if (node) { + if (module_node) { prevent_illegal_rollup_imports( this.getModuleInfo.bind(this), - node, + module_node, illegal_imports, svelte_config.kit.outDir ); } - } + }); const verbose = vite_config.logLevel === 'info'; log = logger({ diff --git a/packages/kit/test/apps/amp/src/routes/origin/+page.svelte b/packages/kit/test/apps/amp/src/routes/origin/+page.svelte index b8ac40fd3b0a..2b42804e87c6 100644 --- a/packages/kit/test/apps/amp/src/routes/origin/+page.svelte +++ b/packages/kit/test/apps/amp/src/routes/origin/+page.svelte @@ -3,7 +3,7 @@ diff --git a/packages/kit/test/apps/amp/src/routes/styles/Unused/+page.svelte b/packages/kit/test/apps/amp/src/routes/styles/Unused.svelte similarity index 100% rename from packages/kit/test/apps/amp/src/routes/styles/Unused/+page.svelte rename to packages/kit/test/apps/amp/src/routes/styles/Unused.svelte diff --git a/packages/kit/test/apps/amp/src/routes/valid.json/+server.js b/packages/kit/test/apps/amp/src/routes/valid.json/+server.js index 26b312b3a084..f81c04b42f9e 100644 --- a/packages/kit/test/apps/amp/src/routes/valid.json/+server.js +++ b/packages/kit/test/apps/amp/src/routes/valid.json/+server.js @@ -1,3 +1,7 @@ export function GET() { - return new Response(JSON.stringify({ answer: 42 })); + return new Response(JSON.stringify({ answer: 42 }), { + headers: { + 'content-type': 'application/json' + } + }); } diff --git a/packages/kit/test/apps/amp/src/routes/valid/+page.svelte b/packages/kit/test/apps/amp/src/routes/valid/+page.svelte index 91ce7efd6c7a..2b5708e98477 100644 --- a/packages/kit/test/apps/amp/src/routes/valid/+page.svelte +++ b/packages/kit/test/apps/amp/src/routes/valid/+page.svelte @@ -1,9 +1,7 @@ - - diff --git a/packages/kit/test/apps/basics/src/app.d.ts b/packages/kit/test/apps/basics/src/app.d.ts index 9b0513a74bdf..9ab8200fbbc4 100644 --- a/packages/kit/test/apps/basics/src/app.d.ts +++ b/packages/kit/test/apps/basics/src/app.d.ts @@ -12,13 +12,4 @@ declare namespace App { answer?: number; calls?: number; } - - interface Stuff { - message: string; - error: string; - page: string; - value: number; - x: string; - y: string; - } } diff --git a/packages/kit/test/apps/basics/src/routes/+error.svelte b/packages/kit/test/apps/basics/src/routes/+error.svelte index 0b401988da18..d1897f37b61c 100644 --- a/packages/kit/test/apps/basics/src/routes/+error.svelte +++ b/packages/kit/test/apps/basics/src/routes/+error.svelte @@ -6,7 +6,7 @@ Custom error page: {$page.error.message} -

{status}

+

{$page.status}

This is your custom error page saying: "{$page.error.message}"

diff --git a/packages/kit/test/apps/basics/src/routes/+layout.js b/packages/kit/test/apps/basics/src/routes/+layout.js index 441e5aeccfd4..0716988f42f4 100644 --- a/packages/kit/test/apps/basics/src/routes/+layout.js +++ b/packages/kit/test/apps/basics/src/routes/+layout.js @@ -4,7 +4,7 @@ import { error } from '@sveltejs/kit'; export async function load({ fetch, url }) { if (url.pathname.startsWith('/errors/error-in-layout')) { const res = await fetch('/errors/error-in-layout/non-existent'); - throw error(res.status, undefined); + throw error(res.status); } return { diff --git a/packages/kit/test/apps/basics/src/routes/caching/+page.js b/packages/kit/test/apps/basics/src/routes/caching/+page.js index 6890cce7d211..f826118b6117 100644 --- a/packages/kit/test/apps/basics/src/routes/caching/+page.js +++ b/packages/kit/test/apps/basics/src/routes/caching/+page.js @@ -1,4 +1,6 @@ -/** @type {import('@sveltejs/kit').Load} */ +/** @type {import('./$types').Load} */ export async function load({ setHeaders }) { - setHeaders('cache-control: max-age=30'); + setHeaders({ + 'cache-control': 'public, max-age=30' + }); } diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.js b/packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.js deleted file mode 100644 index 8075bbfe6925..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.js +++ /dev/null @@ -1,10 +0,0 @@ -/** @type {import('@sveltejs/kit').Load} */ -export async function load({ url, setHeaders }) { - setHeaders( - `cache-control: ${ - url.searchParams.has('private') && url.searchParams.get('private') === 'true' - ? 'private' - : 'public' - }, max-age=30` - ); -} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.svelte deleted file mode 100644 index 61a10746a647..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/has-session/+page.svelte +++ /dev/null @@ -1 +0,0 @@ -

this page will be private even if $session is not used, but a session is return from hooks.js#getSession

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.js b/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.js deleted file mode 100644 index a21953aa985b..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@sveltejs/kit').Load} */ -export async function load({ url, setHeaders }) { - setHeaders( - `cache-control: ${ - url.searchParams.get('private') === 'true' ? 'private' : 'public' - }, max-age=30` - ); -} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.svelte deleted file mode 100644 index dab86c8207ab..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-cache-private/+page.svelte +++ /dev/null @@ -1 +0,0 @@ -

this page will be cached for 30 seconds

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.json/+server.js b/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.json/+server.js deleted file mode 100644 index 67ed4c3a73cf..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch.json/+server.js +++ /dev/null @@ -1,8 +0,0 @@ -export function GET() { - return new Response( - JSON.stringify({ - answer: 42 - }), - { headers: { 'content-type': 'application/json; charset=utf-8' } } - ); -} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.js b/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.js deleted file mode 100644 index 36321aa7b161..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.js +++ /dev/null @@ -1,15 +0,0 @@ -/** @type {import('@sveltejs/kit').Load} */ -export async function load({ url, setHeaders }) { - setHeaders( - `cache-control: ${ - url.searchParams.has('private') && url.searchParams.get('private') === 'true' - ? 'private' - : 'public' - }, max-age=30` - ); - const res = await fetch('/caching/private/uses-fetch.json', { - credentials: /** @type {RequestCredentials} */ (url.searchParams.get('credentials')) - }); - - return await res.json(); -} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.svelte deleted file mode 100644 index dab86c8207ab..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-fetch/+page.svelte +++ /dev/null @@ -1 +0,0 @@ -

this page will be cached for 30 seconds

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.js b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.js deleted file mode 100644 index 8075bbfe6925..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.js +++ /dev/null @@ -1,10 +0,0 @@ -/** @type {import('@sveltejs/kit').Load} */ -export async function load({ url, setHeaders }) { - setHeaders( - `cache-control: ${ - url.searchParams.has('private') && url.searchParams.get('private') === 'true' - ? 'private' - : 'public' - }, max-age=30` - ); -} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.svelte deleted file mode 100644 index 5087b27622ec..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init/+page.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - -

this page will be cached for 30 seconds ({session_exists})

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.js b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.js deleted file mode 100644 index 746181ed5494..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.js +++ /dev/null @@ -1,15 +0,0 @@ -/** @type {import('@sveltejs/kit').Load} */ -export async function load({ url, session, setHeaders }) { - setHeaders( - `cache-control: ${ - url.searchParams.has('private') && url.searchParams.get('private') === 'true' - ? 'private' - : 'public' - }, max-age=30` - ); - const session_exists = !!session; - - return { - session_exists - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.svelte deleted file mode 100644 index f3e5ce7b46d5..000000000000 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load/+page.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - -

this page will be cached for 30 seconds ({data.session_exists})

diff --git a/packages/kit/test/apps/basics/src/routes/encoded/redirected/+page.svelte b/packages/kit/test/apps/basics/src/routes/encoded/redirected/+page.svelte index ac072bdc65cf..f084fc4b96b0 100644 --- a/packages/kit/test/apps/basics/src/routes/encoded/redirected/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/encoded/redirected/+page.svelte @@ -1,6 +1,6 @@
{data.embedded}
diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/empty/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/empty/+server.js deleted file mode 100644 index 1903715676a7..000000000000 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/empty/+server.js +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET() { - return new Response(undefined); -} diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/fetched/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/fetched/+server.js deleted file mode 100644 index b7420f5d170d..000000000000 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/fetched/+server.js +++ /dev/null @@ -1,7 +0,0 @@ -export function GET() { - return new Response('ok', { - headers: { - 'x-foo': 'bar' - } - }); -} diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/headers-object/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/headers-object/+server.js deleted file mode 100644 index 2ec1fdd9e837..000000000000 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/headers-object/+server.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET() { - return new Response(undefined, { - headers: new Headers({ - 'X-Foo': 'bar' - }) - }); -} diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/headers/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/headers/+server.js deleted file mode 100644 index 7a2094895349..000000000000 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/headers/+server.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET() { - return new Response(undefined, { - headers: { - 'Set-Cookie': 'foo=bar' - } - }); -} diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/null/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/null/+server.js deleted file mode 100644 index 0aeea43270aa..000000000000 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/null/+server.js +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET() { - return new Response(null); -} diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/proxy/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/proxy/+server.js deleted file mode 100644 index 02fd26bed3a6..000000000000 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/proxy/+server.js +++ /dev/null @@ -1,2 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export const GET = ({ url }) => fetch(`http://localhost:${url.searchParams.get('port')}`); diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/simple/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/simple/+server.js deleted file mode 100644 index 67ed4c3a73cf..000000000000 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/simple/+server.js +++ /dev/null @@ -1,8 +0,0 @@ -export function GET() { - return new Response( - JSON.stringify({ - answer: 42 - }), - { headers: { 'content-type': 'application/json; charset=utf-8' } } - ); -} diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/stream-typeerror/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/stream-typeerror/+server.js index 8b6c7e5f32ad..bf9a11a6fb95 100644 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/stream-typeerror/+server.js +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/stream-typeerror/+server.js @@ -1,10 +1,10 @@ -let errorName = null; +let errorName = 'null'; /** @type {import('@sveltejs/kit').RequestHandler} */ export function GET({ url }) { if (url.searchParams.has('what')) { const body = errorName; - errorName = null; + errorName = 'null'; return new Response(body); } diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-bytes/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-bytes/+server.js deleted file mode 100644 index 8f2a80aa46ce..000000000000 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-bytes/+server.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export const GET = () => { - const body = ''; - return new Response(new TextEncoder().encode(body), { - headers: { 'content-type': 'application/xml' }, - status: 200 - }); -}; diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-text/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-text/+server.js deleted file mode 100644 index 5123674d66cf..000000000000 --- a/packages/kit/test/apps/basics/src/routes/endpoint-output/xml-text/+server.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export const GET = () => { - const body = ''; - return new Response(body, { headers: { 'content-type': 'application/xml' }, status: 200 }); -}; diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.json/+server.js b/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.json/+server.js deleted file mode 100644 index e0c497e7fbfb..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok.json/+server.js +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET() { - return new Response(undefined, { status: 555 }); -} diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.js b/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.js deleted file mode 100644 index 1b676e6c1946..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.js +++ /dev/null @@ -1,11 +0,0 @@ -import { error } from '@sveltejs/kit'; - -/** @type {import('@sveltejs/kit').Load} */ -export async function load({ fetch }) { - const res = await fetch('/errors/endpoint-not-ok.json'); - if (res.ok) { - return await res.json(); - } else { - throw error(res.status, new Error(res.statusText)); - } -} diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.svelte b/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.svelte deleted file mode 100644 index 5480d57ef12c..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/endpoint-not-ok/+page.svelte +++ /dev/null @@ -1 +0,0 @@ -

this text should not appear

diff --git a/packages/kit/test/apps/basics/src/routes/errors/endpoint/+page.js b/packages/kit/test/apps/basics/src/routes/errors/endpoint/+page.js index 4f92bd4ea33d..1b9b8ea2ba2d 100644 --- a/packages/kit/test/apps/basics/src/routes/errors/endpoint/+page.js +++ b/packages/kit/test/apps/basics/src/routes/errors/endpoint/+page.js @@ -1,11 +1,9 @@ -import { error } from '@sveltejs/kit'; - /** @type {import('@sveltejs/kit').Load} */ export async function load({ fetch }) { const res = await fetch('/errors/endpoint.json'); if (res.ok) { return await res.json(); } else { - throw error(res.status, new Error(res.statusText)); + throw new Error(String(res.status)); } } diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.js deleted file mode 100644 index 75c4c4c3be17..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/load-error-malformed-server/+page.js +++ /dev/null @@ -1,7 +0,0 @@ -import { error } from '@sveltejs/kit'; - -/** @type {import('@sveltejs/kit').Load} */ -export async function load() { - // @ts-expect-error - given value expected to throw - throw error(555, {}); -} diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-server/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-error-server/+page.js index c6548d0f7d73..f27960c3bdec 100644 --- a/packages/kit/test/apps/basics/src/routes/errors/load-error-server/+page.js +++ b/packages/kit/test/apps/basics/src/routes/errors/load-error-server/+page.js @@ -2,5 +2,5 @@ import { error } from '@sveltejs/kit'; /** @type {import('@sveltejs/kit').Load} */ export async function load() { - throw error(555, new Error('Not found')); + throw error(555, 'Not found'); } diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.js deleted file mode 100644 index c149968ee4df..000000000000 --- a/packages/kit/test/apps/basics/src/routes/errors/load-status-without-error-server/+page.js +++ /dev/null @@ -1,6 +0,0 @@ -import { error } from '@sveltejs/kit'; - -/** @type {import('@sveltejs/kit').Load} */ -export async function load() { - throw error(401, undefined); -} diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit/+page.server.js b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit/+page.server.js index 954b12d84be8..169593448a7c 100644 --- a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit/+page.server.js +++ b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/get-explicit/+page.server.js @@ -1,6 +1,5 @@ import { error } from '@sveltejs/kit'; -import { FancyError } from '../_shared.js'; export const GET = () => { - throw error(400, new FancyError('oops')); + throw error(400, 'oops'); }; diff --git a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit/+page.server.js b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit/+page.server.js index be876789f8b3..749e56f85049 100644 --- a/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit/+page.server.js +++ b/packages/kit/test/apps/basics/src/routes/errors/page-endpoint/post-explicit/+page.server.js @@ -1,6 +1,5 @@ import { error } from '@sveltejs/kit'; -import { FancyError } from '../_shared.js'; export const POST = () => { - throw error(400, new FancyError('oops')); + throw error(400, 'oops'); }; diff --git a/packages/kit/test/apps/basics/src/routes/etag/binary/+server.js b/packages/kit/test/apps/basics/src/routes/etag/binary/+server.js deleted file mode 100644 index 923f32aab310..000000000000 --- a/packages/kit/test/apps/basics/src/routes/etag/binary/+server.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET() { - return new Response(new Uint8Array([1, 2, 3, 4, 5]), { - headers: { - 'content-type': 'application/octet-stream' - } - }); -} diff --git a/packages/kit/test/apps/basics/src/routes/etag/custom/+server.js b/packages/kit/test/apps/basics/src/routes/etag/custom/+server.js deleted file mode 100644 index fd76685d0af0..000000000000 --- a/packages/kit/test/apps/basics/src/routes/etag/custom/+server.js +++ /dev/null @@ -1,11 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET({ request }) { - if (request.headers.get('if-none-match') === '@1234@') - return new Response(undefined, { status: 304 }); - - return new Response(`${Math.random()}`, { - headers: { - etag: '@1234@' - } - }); -} diff --git a/packages/kit/test/apps/basics/src/routes/etag/text/+server.js b/packages/kit/test/apps/basics/src/routes/etag/text/+server.js deleted file mode 100644 index e95e55e0919d..000000000000 --- a/packages/kit/test/apps/basics/src/routes/etag/text/+server.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@sveltejs/kit').RequestHandler} */ -export function GET() { - return new Response('some text', { - headers: { - expires: 'yesterday' - } - }); -} diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.js b/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.js index aca9a4e51748..0c64a81c3c36 100644 --- a/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.js +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.js @@ -1,21 +1,20 @@ -throw new Error("@migration task: Update load function (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292693)"); - - let count = 0; /** @type {import('@sveltejs/kit').Load} */ -export async function load({ fetch }) { +export async function load({ fetch, depends, setHeaders }) { const res = await fetch('/load/change-detection/data.json'); const { type } = await res.json(); count += 1; + depends('custom:change-detection-layout'); + + setHeaders({ + 'cache-control': 'public, max-age=5' + }); + return { - cache: { maxage: 5 }, - props: { - type, - loads: count - }, - dependencies: ['custom:change-detection-layout'] + type, + loads: count }; } diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.svelte index bba96cab4c5c..1d4bdf5b3bcd 100644 --- a/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.svelte +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/+layout.svelte @@ -1,6 +1,4 @@ diff --git a/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/+page.svelte index 5aa56be5ef0e..d2a75179b0b2 100644 --- a/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/load/dynamic-import-styles/+page.svelte @@ -1,6 +1,5 @@ - + diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/+layout.js b/packages/kit/test/apps/basics/src/routes/load/parent/+layout.js similarity index 100% rename from packages/kit/test/apps/basics/src/routes/load/stuff/+layout.js rename to packages/kit/test/apps/basics/src/routes/load/parent/+layout.js diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/+layout.svelte b/packages/kit/test/apps/basics/src/routes/load/parent/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/load/stuff/+layout.svelte rename to packages/kit/test/apps/basics/src/routes/load/parent/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/+layout.js b/packages/kit/test/apps/basics/src/routes/load/parent/[x]/+layout.js similarity index 100% rename from packages/kit/test/apps/basics/src/routes/load/stuff/[x]/+layout.js rename to packages/kit/test/apps/basics/src/routes/load/parent/[x]/+layout.js diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/+layout.svelte b/packages/kit/test/apps/basics/src/routes/load/parent/[x]/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/load/stuff/[x]/+layout.svelte rename to packages/kit/test/apps/basics/src/routes/load/parent/[x]/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/+layout.js b/packages/kit/test/apps/basics/src/routes/load/parent/[x]/[y]/+layout.js similarity index 100% rename from packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/+layout.js rename to packages/kit/test/apps/basics/src/routes/load/parent/[x]/[y]/+layout.js diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/+layout.svelte b/packages/kit/test/apps/basics/src/routes/load/parent/[x]/[y]/+layout.svelte similarity index 100% rename from packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/+layout.svelte rename to packages/kit/test/apps/basics/src/routes/load/parent/[x]/[y]/+layout.svelte diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.js b/packages/kit/test/apps/basics/src/routes/load/parent/[x]/[y]/[z]/+page.js similarity index 100% rename from packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.js rename to packages/kit/test/apps/basics/src/routes/load/parent/[x]/[y]/[z]/+page.js diff --git a/packages/kit/test/apps/basics/src/routes/load/parent/[x]/[y]/[z]/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/parent/[x]/[y]/[z]/+page.svelte new file mode 100644 index 000000000000..0b85507c19d8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/parent/[x]/[y]/[z]/+page.svelte @@ -0,0 +1,6 @@ + + +

message: {$page.data.message}

+
{JSON.stringify($page.data)}
diff --git a/packages/kit/test/apps/basics/src/routes/load/props/+page.js b/packages/kit/test/apps/basics/src/routes/load/props/+page.js index 783428141e3b..b0217e445670 100644 --- a/packages/kit/test/apps/basics/src/routes/load/props/+page.js +++ b/packages/kit/test/apps/basics/src/routes/load/props/+page.js @@ -1,4 +1,4 @@ export async function load() { - const data = 'Hello from Index!'; - return { data }; + const message = 'Hello from Index!'; + return { message }; } diff --git a/packages/kit/test/apps/basics/src/routes/load/props/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/props/+page.svelte index 321c784766c8..b81ed61647bc 100644 --- a/packages/kit/test/apps/basics/src/routes/load/props/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/load/props/+page.svelte @@ -4,4 +4,4 @@

Index

-

Data: {data.data}

+

Data: {data.message}

diff --git a/packages/kit/test/apps/basics/src/routes/load/props/about/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/props/about/+page.svelte index 6b5b14c6a9bf..ee6be11dcbea 100644 --- a/packages/kit/test/apps/basics/src/routes/load/props/about/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/load/props/about/+page.svelte @@ -1,5 +1,5 @@

About

diff --git a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.svelte deleted file mode 100644 index adb4129b19aa..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/stuff/[x]/[y]/[z]/+page.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - -

message: {data.message}

-
{JSON.stringify({ data.x, data.y, data.z })}
diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/+error.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/+error.svelte index e745736ec46f..5301c04c4566 100644 --- a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/+error.svelte +++ b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/+error.svelte @@ -1,27 +1,10 @@ - -

Nested error page

-

status: {data.status}

-

error.message: {data.error && data.error.message}

-

answer: {data.answer}

+

status: {$page.status}

+

error.message: {$page.error.message}