diff --git a/packages/adapter-netlify/src/index.ts b/packages/adapter-netlify/src/index.ts index 825f6a3fad3b..4b4bec869ca3 100644 --- a/packages/adapter-netlify/src/index.ts +++ b/packages/adapter-netlify/src/index.ts @@ -1,7 +1,7 @@ import { APIGatewayProxyHandler } from 'aws-lambda'; import { URLSearchParams } from 'url'; import { render } from '@sveltejs/app-utils/renderer'; -import type { PageComponentManifest, EndpointManifest } from '@sveltejs/app-utils'; +import type { PageComponentManifest, EndpointManifest, Method } from '@sveltejs/app-utils'; const manifest = require('./manifest.js'); const client = require('./client.json'); @@ -32,7 +32,7 @@ export const handler: APIGatewayProxyHandler = async (event) => { const rendered = await render({ host: null, // TODO - method: httpMethod, + method: httpMethod as Method, headers, path, query @@ -44,7 +44,8 @@ export const handler: APIGatewayProxyHandler = async (event) => { root, setup, load: (route: PageComponentManifest | EndpointManifest) => require(`./routes/${route.name}.js`), - dev: false + dev: false, + only_prerender: false }); if (rendered) { diff --git a/packages/adapter-node/src/index.ts b/packages/adapter-node/src/index.ts index eb2ff083bff2..ce412b5c3653 100644 --- a/packages/adapter-node/src/index.ts +++ b/packages/adapter-node/src/index.ts @@ -4,7 +4,7 @@ import { parse, URLSearchParams } from 'url'; import sirv from 'sirv'; import { render } from '@sveltejs/app-utils/renderer'; import { get_body } from '@sveltejs/app-utils/http'; -import type { PageComponentManifest, EndpointManifest } from '@sveltejs/app-utils'; +import type { PageComponentManifest, EndpointManifest, Method } from '@sveltejs/app-utils'; const manifest = require('./manifest.js'); const client = require('./client.json'); @@ -38,9 +38,9 @@ const server = http.createServer((req, res) => { const rendered = await render({ host: null, // TODO - method: req.method, - headers: req.headers, - path: parsed.pathname, + method: req.method as Method, + headers: req.headers as Record, // TODO: what about repeated headers, i.e. string[] + path: parsed.pathname as string, body: await get_body(req), query: new URLSearchParams(parsed.query || '') }, { @@ -51,7 +51,8 @@ const server = http.createServer((req, res) => { root, setup, load: (route: PageComponentManifest | EndpointManifest) => require(`./routes/${route.name}.js`), - dev: false + dev: false, + only_prerender: false }); if (rendered) { diff --git a/packages/app-utils/.gitignore b/packages/app-utils/.gitignore index 49f484d216de..cf0fd52baa08 100644 --- a/packages/app-utils/.gitignore +++ b/packages/app-utils/.gitignore @@ -6,3 +6,4 @@ node_modules /http /renderer /types +/build diff --git a/packages/app-utils/index.d.ts b/packages/app-utils/index.d.ts index d87d2c1e3c1d..e42412c98224 100644 --- a/packages/app-utils/index.d.ts +++ b/packages/app-utils/index.d.ts @@ -6,5 +6,6 @@ export { SSRComponentModule, Page, PageContext, - Query + Query, + Method } from './src/types'; diff --git a/packages/app-utils/package.json b/packages/app-utils/package.json index 3c9d8e7142ab..96259ee52bb7 100644 --- a/packages/app-utils/package.json +++ b/packages/app-utils/package.json @@ -2,7 +2,7 @@ "name": "@sveltejs/app-utils", "version": "0.0.17", "scripts": { - "clean": "node rimraf.js common files http renderer", + "clean": "node rimraf.js common files http renderer types build", "dev": "npm run clean && rollup -cw", "build": "npm run clean && rollup -c", "lint": "eslint --ignore-pattern node_modules/ --ignore-pattern dist/ --ignore-pattern files/ --ignore-pattern http/ --ignore-pattern renderer/ \"**/*.{ts,js,svelte}\" && npm run check-format", diff --git a/packages/app-utils/rollup.config.js b/packages/app-utils/rollup.config.js index d168036f4342..3259f0b711b7 100644 --- a/packages/app-utils/rollup.config.js +++ b/packages/app-utils/rollup.config.js @@ -1,6 +1,8 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import typescript from 'rollup-plugin-typescript2'; import pkg from './package.json'; +const fs = require('fs'); +const path = require('path'); const input = {}; Object.keys(pkg.exports).forEach(key => { @@ -27,10 +29,27 @@ export default { ], plugins: [ nodeResolve(), - typescript() + typescript({ useTsconfigDeclarationDir: true }), + { + name: 'copy-types', + resolveId: () => null, + load: () => null, + writeBundle: () => { + copyRecursiveSync('build/types', '.'); + copyRecursiveSync('src/types', 'types'); + } + } ], - external: [ - ...require('module').builtinModules, - ...Object.keys(pkg.dependencies) - ] + external: [...require('module').builtinModules, ...Object.keys(pkg.dependencies)] }; + +function copyRecursiveSync(src, dest) { + if (fs.existsSync(src) && fs.statSync(src).isDirectory()) { + fs.mkdirSync(dest, { recursive: true }); + fs.readdirSync(src).forEach(file => + copyRecursiveSync(path.join(src, file), path.join(dest, file)) + ); + } else { + fs.copyFileSync(src, dest); + } +} diff --git a/packages/app-utils/src/types.d.ts b/packages/app-utils/src/types/index.d.ts similarity index 94% rename from packages/app-utils/src/types.d.ts rename to packages/app-utils/src/types/index.d.ts index 37111ca126f3..0c22834dbc60 100644 --- a/packages/app-utils/src/types.d.ts +++ b/packages/app-utils/src/types/index.d.ts @@ -1,5 +1,8 @@ import { URLSearchParams } from 'url'; +// do not import this file from outside app-utils +// these types are re-exported in /index.d.ts and should be imported from "@sveltejs/app-utils" + export type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'OPTIONS'; export type Headers = Record; @@ -8,7 +11,7 @@ export interface IncomingRequest { host: string | null; // TODO is this actually necessary? method: Method; headers: Headers; - body: any; // TODO + body?: any; // TODO path: string; query: URLSearchParams; } diff --git a/packages/app-utils/tsconfig.json b/packages/app-utils/tsconfig.json index 038e74d8c623..566bd416e5d0 100644 --- a/packages/app-utils/tsconfig.json +++ b/packages/app-utils/tsconfig.json @@ -1,3 +1,8 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "lib": ["es2020", "DOM"], + "declaration": true, + "declarationDir": "build/types", + } } diff --git a/packages/kit/src/api/build/index.ts b/packages/kit/src/api/build/index.ts index 1c5ae64b9b2e..02f9486cce7b 100644 --- a/packages/kit/src/api/build/index.ts +++ b/packages/kit/src/api/build/index.ts @@ -13,7 +13,6 @@ import { copy_assets } from '../utils'; import { create_app } from '../../core/create_app'; import { SvelteAppConfig } from '../../interfaces'; import { css_injection } from './css_injection'; -import { EndpointManifest } from '@sveltejs/app-utils'; const exec = promisify(child_process.exec); diff --git a/packages/kit/src/api/dev/index.ts b/packages/kit/src/api/dev/index.ts index ab8ed685f16f..0e7765e2b3cf 100644 --- a/packages/kit/src/api/dev/index.ts +++ b/packages/kit/src/api/dev/index.ts @@ -14,7 +14,7 @@ import { ManifestData, ReadyEvent } from '../../interfaces'; import { mkdirp } from '@sveltejs/app-utils/files'; import { render } from '@sveltejs/app-utils/renderer'; import { get_body } from '@sveltejs/app-utils/http'; -import { SSRComponentModule, SetupModule } from '@sveltejs/app-utils'; +import { SSRComponentModule, SetupModule, Method } from '@sveltejs/app-utils'; import { DevConfig, Loader } from './types'; import { copy_assets } from '../utils'; import { readFileSync } from 'fs'; @@ -157,8 +157,8 @@ class Watcher extends EventEmitter { const rendered = await render({ host: req.headers.host, - headers: req.headers, - method: req.method, + headers: req.headers as Record, + method: req.method as Method, path: parsed.pathname, query: new URLSearchParams(parsed.query), body @@ -170,11 +170,11 @@ class Watcher extends EventEmitter { entry: 'main/runtime/navigation.js', deps: {} }, - files: 'build', dev: true, root, setup, - load: route => load(route.url.replace(/\.\w+$/, '.js')) // TODO is the replace still necessary? + load: route => load(route.url.replace(/\.\w+$/, '.js')), // TODO is the replace still necessary? + only_prerender: false }); if (rendered) {