mirror of
https://github.com/kevin-DL/sapper.git
synced 2026-01-15 20:34:44 +00:00
work in progress
This commit is contained in:
@@ -1,86 +1,73 @@
|
||||
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 { Route } from '../interfaces';
|
||||
|
||||
function posixify(file: string) {
|
||||
return file.replace(/[/\\]/g, '/');
|
||||
}
|
||||
|
||||
function fudge_mtime(file: string) {
|
||||
// need to fudge the mtime so that webpack doesn't go doolally
|
||||
const { atime, mtime } = fs.statSync(file);
|
||||
fs.utimesSync(
|
||||
file,
|
||||
new Date(atime.getTime() - 999999),
|
||||
new Date(mtime.getTime() - 999999)
|
||||
);
|
||||
}
|
||||
|
||||
function create_app({ src, dev, entry }: {
|
||||
export default function create_app({ routes, src, dev }: {
|
||||
routes: Route[];
|
||||
src: string;
|
||||
dev: boolean;
|
||||
entry: { client: string; server: string };
|
||||
}) {
|
||||
const routes = create_routes({ src });
|
||||
mkdirp.sync('app/manifest');
|
||||
|
||||
function create_client_main() {
|
||||
const code = `[${routes
|
||||
.filter(route => route.type === 'page')
|
||||
.map(route => {
|
||||
const params =
|
||||
route.dynamic.length === 0
|
||||
write('app/manifest/client.js', generate_client(routes, src, dev));
|
||||
write('app/manifest/server.js', generate_server(routes, src));
|
||||
}
|
||||
|
||||
function generate_client(routes: Route[], src: string, dev: boolean) {
|
||||
let code = `
|
||||
// This file is generated by Sapper — do not edit it!\nexport const routes = [
|
||||
${routes
|
||||
.filter(route => route.type === 'page')
|
||||
.map(route => {
|
||||
const params = route.dynamic.length === 0
|
||||
? '{}'
|
||||
: `{ ${route.dynamic
|
||||
.map((part, i) => `${part}: match[${i + 1}]`)
|
||||
.join(', ')} }`;
|
||||
: `{ ${route.dynamic.map((part, i) => `${part}: match[${i + 1}]`).join(', ')} }`;
|
||||
|
||||
const file = posixify(`${src}/${route.file}`);
|
||||
return `{ pattern: ${
|
||||
route.pattern
|
||||
}, params: match => (${params}), load: () => import(/* webpackChunkName: "${
|
||||
route.id
|
||||
}" */ '${file}') }`;
|
||||
})
|
||||
.join(', ')}]`;
|
||||
const file = posixify(`../../routes/${route.file}`);
|
||||
return `{ pattern: ${route.pattern}, params: ${route.dynamic.length > 0 ? `match` : `()`} => (${params}), load: () => import(/* webpackChunkName: "${route.id}" */ '${file}') }`;
|
||||
})
|
||||
.join(',\n\t')}
|
||||
];`.replace(/^\t\t/gm, '').trim();
|
||||
|
||||
let main = fs
|
||||
.readFileSync('templates/main.js', 'utf-8')
|
||||
.replace(
|
||||
/__app__/g,
|
||||
posixify(path.resolve(__dirname, '../../runtime/app.js'))
|
||||
)
|
||||
.replace(/__routes__/g, code)
|
||||
.replace(/__dev__/g, String(dev));
|
||||
if (dev) {
|
||||
const hmr_client = posixify(
|
||||
require.resolve(`webpack-hot-middleware/client`)
|
||||
);
|
||||
|
||||
if (dev) {
|
||||
const hmr_client = posixify(
|
||||
require.resolve(`webpack-hot-middleware/client`)
|
||||
);
|
||||
main += `\n\nimport('${hmr_client}?path=/__webpack_hmr&timeout=20000'); if (module.hot) module.hot.accept();`;
|
||||
}
|
||||
|
||||
fs.writeFileSync(entry.client, main);
|
||||
fudge_mtime(entry.client);
|
||||
code += `\n\nimport('${hmr_client}?path=/__webpack_hmr&timeout=20000'); if (module.hot) module.hot.accept();`;
|
||||
}
|
||||
|
||||
function create_server_routes() {
|
||||
const imports = routes
|
||||
return code;
|
||||
}
|
||||
|
||||
function generate_server(routes: Route[], src: string) {
|
||||
let code = `
|
||||
// This file is generated by Sapper — do not edit it!
|
||||
${routes
|
||||
.map(route => {
|
||||
const file = posixify(`${src}/${route.file}`);
|
||||
const file = posixify(`../../routes/${route.file}`);
|
||||
return route.type === 'page'
|
||||
? `import ${route.id} from '${file}';`
|
||||
: `import * as ${route.id} from '${file}';`;
|
||||
})
|
||||
.join('\n');
|
||||
.join('\n')}
|
||||
|
||||
const exports = `export { ${routes.map(route => route.id)} };`;
|
||||
export const routes = [
|
||||
${routes
|
||||
.map(route => {
|
||||
const params = route.dynamic.length === 0
|
||||
? '{}'
|
||||
: `{ ${route.dynamic.map((part, i) => `${part}: match[${i + 1}]`).join(', ')} }`;
|
||||
|
||||
fs.writeFileSync(entry.server, `${imports}\n\n${exports}`);
|
||||
fudge_mtime(entry.server);
|
||||
}
|
||||
const file = posixify(`${src}/${route.file}`);
|
||||
return `{ id: '${route.id}', type: '${route.type}', pattern: ${route.pattern}, params: ${route.dynamic.length > 0 ? `match` : `()`} => (${params}), module: ${route.id} }`;
|
||||
})
|
||||
.join(',\n\t')
|
||||
}
|
||||
];`.replace(/^\t\t/gm, '').trim();
|
||||
|
||||
create_client_main();
|
||||
create_server_routes();
|
||||
}
|
||||
|
||||
export default create_app;
|
||||
return code;
|
||||
}
|
||||
Reference in New Issue
Block a user