import * as fs from 'fs'; import * as path from 'path'; import mkdirp from 'mkdirp'; import create_routes from './create_routes'; import { fudge_mtime, posixify, write } from './utils'; import { dev } from '../config'; import { Route } from '../interfaces'; // in dev mode, we avoid touching the fs unnecessarily let last_client_manifest: string = null; let last_server_manifest: string = null; export default function create_app({ routes, dev_port }: { routes: Route[]; dev_port: number; }) { mkdirp.sync('app/manifest'); const client_manifest = generate_client(routes, dev_port); const server_manifest = generate_server(routes); if (client_manifest !== last_client_manifest) { write(`app/manifest/client.js`, client_manifest); last_client_manifest = client_manifest; } if (server_manifest !== last_server_manifest) { write(`app/manifest/server.js`, server_manifest); last_server_manifest = server_manifest; } } function generate_client(routes: Route[], dev_port?: number) { let code = ` // This file is generated by Sapper — do not edit it! export const routes = [ ${routes .map(route => { if (route.type !== 'page') { return `{ pattern: ${route.pattern}, ignore: true }`; } const file = posixify(`../../routes/${route.file}`); if (route.id === '_4xx' || route.id === '_5xx') { return `{ error: '${route.id.slice(1)}', load: () => import(/* webpackChunkName: "${route.id}" */ '${file}') }`; } const params = route.params.length === 0 ? '{}' : `{ ${route.params.map((part, i) => `${part}: match[${i + 1}]`).join(', ')} }`; return `{ pattern: ${route.pattern}, params: ${route.params.length > 0 ? `match` : `()`} => (${params}), load: () => import(/* webpackChunkName: "${route.id}" */ '${file}') }`; }) .join(',\n\t')} ];`.replace(/^\t\t/gm, '').trim(); if (dev()) { const sapper_dev_client = posixify( path.resolve(__dirname, 'sapper-dev-client.js') ); code += ` if (module.hot) { import('${sapper_dev_client}').then(client => { client.connect(${dev_port}); }); }`.replace(/^\t{3}/gm, ''); } return code; } function generate_server(routes: Route[]) { let code = ` // This file is generated by Sapper — do not edit it! ${routes .map(route => { const file = posixify(`../../routes/${route.file}`); return route.type === 'page' ? `import ${route.id} from '${file}';` : `import * as ${route.id} from '${file}';`; }) .join('\n')} export const routes = [ ${routes .map(route => { const file = posixify(`../../${route.file}`); if (route.id === '_4xx' || route.id === '_5xx') { return `{ error: '${route.id.slice(1)}', module: ${route.id} }`; } const params = route.params.length === 0 ? '{}' : `{ ${route.params.map((part, i) => `${part}: match[${i + 1}]`).join(', ')} }`; return `{ id: '${route.id}', type: '${route.type}', pattern: ${route.pattern}, params: ${route.params.length > 0 ? `match` : `()`} => (${params}), module: ${route.id} }`; }) .join(',\n\t') } ];`.replace(/^\t\t/gm, '').trim(); return code; }