diff --git a/packages/adapter-begin/files/index.js b/packages/adapter-begin/files/index.js new file mode 100644 index 0000000000000..795cc9700cd16 --- /dev/null +++ b/packages/adapter-begin/files/index.js @@ -0,0 +1,46 @@ +'use strict'; + +const url = require('url'); +const app = require('@architect/shared/app.js'); + +exports.handler = async (event) => { + + const { + rawPath: path, + httpMethod, + headers, + queryStringParameters + // body, // TODO pass this to renderer + // isBase64Encoded // TODO is this useful? + } = event; + + const query = new url.URLSearchParams(); + for (const k in queryStringParameters) { + const value = queryStringParameters[k]; + value.split(', ').forEach((v) => { + query.append(k, v); + }); + } + + const rendered = await app.render({ + host: null, // TODO + method: httpMethod, + headers, + path, + query + }); + + if (rendered) { + return { + isBase64Encoded: false, + statusCode: rendered.status, + headers: rendered.headers, + body: rendered.body + }; + } + + return { + statusCode: 404, + body: 'Not found' + }; +}; diff --git a/packages/adapter-begin/src/package.json b/packages/adapter-begin/files/package.json similarity index 100% rename from packages/adapter-begin/src/package.json rename to packages/adapter-begin/files/package.json diff --git a/packages/adapter-begin/index.js b/packages/adapter-begin/index.js index 4fd8d9daf7d4a..bd7ae6faee17f 100644 --- a/packages/adapter-begin/index.js +++ b/packages/adapter-begin/index.js @@ -1,11 +1,9 @@ 'use strict'; -const { writeFileSync, readFileSync, existsSync } = require('fs'); -const { resolve, join, relative } = require('path'); +const { readFileSync, existsSync, copyFileSync } = require('fs'); +const { resolve, join } = require('path'); const parse = require('@architect/parser'); const child_process = require('child_process'); -const { prerender, generate_manifest_module } = require('@sveltejs/app-utils/renderer'); -const { copy } = require('@sveltejs/app-utils/files'); function parse_arc(arcPath) { if (!existsSync(arcPath)) { @@ -26,54 +24,36 @@ function parse_arc(arcPath) { } } -module.exports = async function builder({ dir, manifest, log }) { - log.minor('Parsing app.arc file'); +module.exports = async function adatper(builder) { + builder.log.minor('Parsing app.arc file'); const { static: static_mount_point } = parse_arc('app.arc'); const lambda_directory = resolve(join('src', 'http', 'get-index')); const static_directory = resolve(static_mount_point); const server_directory = resolve(join('src', 'shared')); - log.minor('Writing client application...' + static_directory); - const static_assets = copy('static', static_directory); - const client_assets = copy(resolve(dir, 'client'), join(static_directory)); + builder.log.minor('Writing client application...' + static_directory); + builder.copy_static_files(static_directory); + builder.copy_client_files(static_directory); - log.minor('Prerendering static pages...'); - await prerender({ - dir, - out: static_directory, - manifest, - log - }); + builder.log.minor('Building lambda...' + lambda_directory); + const local_lambda_dir = resolve(__dirname, 'files'); + const lambda_files = [ 'index.js', 'package.json' ] + lambda_files.forEach(f => { + copyFileSync(join(local_lambda_dir, f), join(lambda_directory, f)); + }); - log.minor('Building lambda...' + lambda_directory); - copy(resolve(__dirname, 'src'), lambda_directory); + builder.log.minor('Installing lambda dependencies...' + lambda_directory); child_process.execSync('npm install', { stdio: [0, 1, 2], cwd: lambda_directory + }); + + builder.log.minor('Writing server application...'); + builder.copy_server_files(server_directory); + + builder.log.minor('Prerendering static pages...'); + await builder.prerender({ + dest: static_directory }); - - log.minor('Writing manifest...' + server_directory); - copy(join(resolve(dir), 'client.json'), join(server_directory, 'client.json')); - const written_manifest = generate_manifest_module(manifest); - const htmlPath = resolve('src', 'app.html'); - const appHtml = readFileSync(htmlPath, 'utf-8'); - writeFileSync(join(server_directory, 'manifest.js'), written_manifest); - writeFileSync( - join(server_directory, 'template.js'), - `module.exports = ${JSON.stringify(appHtml)};` - ); - - log.minor('Preparing static assets...' + static_directory); - const relative_static_assets = [...static_assets, ...client_assets].map( - (filename) => `/${relative(static_directory, filename)}` - ); - const all_static_assets = JSON.stringify(relative_static_assets); - writeFileSync( - join(server_directory, 'static_assets.js'), - `module.exports = ${all_static_assets}` - ); - - log.minor('Writing server application...'); - copy(resolve(dir, 'server'), server_directory); }; diff --git a/packages/adapter-begin/src/index.js b/packages/adapter-begin/src/index.js deleted file mode 100644 index f9be1f3244b98..0000000000000 --- a/packages/adapter-begin/src/index.js +++ /dev/null @@ -1,58 +0,0 @@ -'use strict'; - -const { render } = require('@sveltejs/app-utils/renderer'); -const client = require('@architect/shared/client.json'); -const manifest = require('@architect/shared/manifest.js'); -const App = require('@architect/shared/root.js'); -const template = require('@architect/shared/template.js'); -const static_assets = require('@architect/shared/static_assets.js'); -const setup = require('@architect/shared/setup.js'); - -exports.handler = async function http(req) { - const { rawPath: path, requestContext, headers, queryStringParameters: query } = req; - - const { method, domainName } = requestContext.http; - - // TODO: We should handle static assets better than this - if (static_assets.includes(path)) { - return { - statusCode: 308, - headers: { location: `/_static${path}` } - }; - } - - const rendered = await render( - { - host: domainName, - method, - headers, - path, - // body, TODO: convert this file to typescript and utilize the body once we know what type it is and whether it first needs some conversion - query - }, - { - static_dir: '_static', - template, - manifest, - client, - root: App, - setup, - load: (route) => require(`@architect/shared/routes/${route.name}.js`), - dev: false - } - ); - - if (rendered) { - return { - isBase64Encoded: false, - statusCode: rendered.status, - headers: rendered.headers, - body: rendered.body - }; - } - - return { - statusCode: 404, - body: 'Not Found' - }; -}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index abb0daae0800e..d04db70c0808c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -258,7 +258,7 @@ importers: '@sveltejs/kit': 'workspace:*' '@sveltejs/snowpack-config': 'workspace:*' svelte: ^3.29.0 -lockfileVersion: 5.2 +lockfileVersion: 5.1 packages: /@architect/parser/2.3.0: dev: false @@ -4395,5 +4395,6 @@ packages: eslint-plugin-svelte3: '>= 2' typescript: '>= 3' resolution: + registry: 'https://registry.npmjs.org/' tarball: 'https://codeload.github.com/sveltejs/eslint-config/tar.gz/7224f2bba6ac40407c332b41fa2bede946f4868f' version: 5.6.0