Skip to content
This repository was archived by the owner on Jan 11, 2023. It is now read-only.

Commit 7625302

Browse files
authored
Merge pull request #150 from sveltejs/gh-133
sapper build defaults to `build` dir, sapper export defaults to `export` dir
2 parents a96fb93 + 09422e3 commit 7625302

File tree

12 files changed

+71
-74
lines changed

12 files changed

+71
-74
lines changed

.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ node_modules
44
cypress/screenshots
55
test/app/.sapper
66
test/app/app/manifest
7+
test/app/export
78
runtime.js
89
runtime.js.map
910
cli.js
@@ -13,4 +14,5 @@ middleware.js.map
1314
core.js
1415
core.js.map
1516
webpack/config.js
16-
webpack/config.js.map
17+
webpack/config.js.map
18+
yarn-error.log

src/cli/build.ts

+9-11
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,24 @@ import * as fs from 'fs';
22
import * as path from 'path';
33
import mkdirp from 'mkdirp';
44
import rimraf from 'rimraf';
5-
import { create_compilers, create_app, create_routes, create_serviceworker } from 'sapper/core.js';
5+
import { create_compilers, create_app, create_routes, create_serviceworker } from 'sapper/core.js'
6+
import { src, dest, dev } from '../config';
67

7-
export default async function build({ src, dest, dev, entry }: {
8-
src: string;
9-
dest: string;
10-
dev: boolean;
11-
entry: { client: string, server: string }
12-
}) {
13-
mkdirp.sync(dest);
14-
rimraf.sync(path.join(dest, '**/*'));
8+
export default async function build() {
9+
const output = dest();
1510

16-
const routes = create_routes({ src });
11+
mkdirp.sync(output);
12+
rimraf.sync(path.join(output, '**/*'));
13+
14+
const routes = create_routes();
1715

1816
// create app/manifest/client.js and app/manifest/server.js
1917
create_app({ routes, src, dev });
2018

2119
const { client, server, serviceworker } = create_compilers();
2220

2321
const client_stats = await compile(client);
24-
fs.writeFileSync(path.join(dest, 'client_info.json'), JSON.stringify(client_stats.toJson()));
22+
fs.writeFileSync(path.join(output, 'client_info.json'), JSON.stringify(client_stats.toJson()));
2523

2624
await compile(server);
2725

src/cli/dev.ts

+10-8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as http from 'http';
77
import mkdirp from 'mkdirp';
88
import rimraf from 'rimraf';
99
import { wait_for_port } from './utils';
10+
import { dest } from '../config';
1011
import { create_compilers, create_app, create_routes, create_serviceworker, create_template } from 'sapper/core.js';
1112

1213
type Deferred = {
@@ -66,7 +67,9 @@ function create_hot_update_server(port: number, interval = 10000) {
6667
return { send };
6768
}
6869

69-
export default async function dev(src: string, dir: string) {
70+
export default async function dev() {
71+
const dir = dest();
72+
7073
rimraf.sync(dir);
7174
mkdirp.sync(dir);
7275

@@ -75,8 +78,8 @@ export default async function dev(src: string, dir: string) {
7578
// initial build
7679
const dev_port = await require('get-port')(10000);
7780

78-
const routes = create_routes({ src });
79-
create_app({ routes, src, dev: true, dev_port });
81+
const routes = create_routes();
82+
create_app({ routes, dev_port });
8083

8184
const hot_update_server = create_hot_update_server(dev_port);
8285

@@ -94,8 +97,8 @@ export default async function dev(src: string, dir: string) {
9497
}
9598

9699
watch_files('routes/**/*.+(html|js|mjs)', () => {
97-
const routes = create_routes({ src });
98-
create_app({ routes, src, dev: true, dev_port });
100+
const routes = create_routes();
101+
create_app({ routes, dev_port });
99102
});
100103

101104
watch_files('app/template.html', () => {
@@ -190,9 +193,8 @@ export default async function dev(src: string, dir: string) {
190193
});
191194

192195
create_serviceworker({
193-
routes: create_routes({ src }),
194-
client_files,
195-
src
196+
routes: create_routes(),
197+
client_files
196198
});
197199

198200
watch_serviceworker();

src/cli/export.ts

+16-12
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,32 @@ import cheerio from 'cheerio';
66
import URL from 'url-parse';
77
import fetch from 'node-fetch';
88
import { wait_for_port } from './utils';
9-
10-
const { OUTPUT_DIR = 'dist' } = process.env;
9+
import { dest } from '../config';
1110

1211
const app = express();
1312

1413
function read_json(file: string) {
1514
return JSON.parse(sander.readFileSync(file, { encoding: 'utf-8' }));
1615
}
1716

18-
export default async function exporter(dir: string) { // dir === '.sapper'
17+
export default async function exporter(export_dir: string) {
18+
const build_dir = dest();
19+
1920
// Prep output directory
20-
sander.rimrafSync(OUTPUT_DIR);
21+
sander.rimrafSync(export_dir);
2122

22-
sander.copydirSync('assets').to(OUTPUT_DIR);
23-
sander.copydirSync(dir, 'client').to(OUTPUT_DIR, 'client');
24-
sander.copyFileSync(dir, 'service-worker.js').to(OUTPUT_DIR, 'service-worker.js');
23+
sander.copydirSync('assets').to(export_dir);
24+
sander.copydirSync(build_dir, 'client').to(export_dir, 'client');
25+
26+
if (sander.existsSync(build_dir, 'service-worker.js')) {
27+
sander.copyFileSync(build_dir, 'service-worker.js').to(export_dir, 'service-worker.js');
28+
}
2529

2630
const port = await require('get-port')(3000);
2731

2832
const origin = `http://localhost:${port}`;
2933

30-
const proc = child_process.fork(path.resolve(`${dir}/server.js`), [], {
34+
const proc = child_process.fork(path.resolve(`${build_dir}/server.js`), [], {
3135
cwd: process.cwd(),
3236
env: {
3337
PORT: port,
@@ -48,11 +52,11 @@ export default async function exporter(dir: string) { // dir === '.sapper'
4852
saved.add(url.pathname);
4953

5054
if (message.type === 'text/html') {
51-
const dest = `${OUTPUT_DIR}/${url.pathname}/index.html`;
52-
sander.writeFileSync(dest, message.body);
55+
const file = `${export_dir}/${url.pathname}/index.html`;
56+
sander.writeFileSync(file, message.body);
5357
} else {
54-
const dest = `${OUTPUT_DIR}/${url.pathname}`;
55-
sander.writeFileSync(dest, message.body);
58+
const file = `${export_dir}/${url.pathname}`;
59+
sander.writeFileSync(file, message.body);
5660
}
5761
});
5862

src/cli/index.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import build from './build';
55
import exporter from './export';
66
import dev from './dev';
77
import upgrade from './upgrade';
8-
import { dest, entry, src } from '../config';
98
import * as pkg from '../../package.json';
109

1110
const opts = mri(process.argv.slice(2), {
@@ -31,8 +30,9 @@ const start = Date.now();
3130

3231
if (cmd === 'build') {
3332
process.env.NODE_ENV = 'production';
33+
process.env.SAPPER_DEST = opts._[1] || 'build';
3434

35-
build({ dest, dev: false, entry, src })
35+
build()
3636
.then(() => {
3737
const elapsed = Date.now() - start;
3838
console.error(`built in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds'
@@ -43,8 +43,10 @@ if (cmd === 'build') {
4343
} else if (cmd === 'export') {
4444
process.env.NODE_ENV = 'production';
4545

46-
build({ dest, dev: false, entry, src })
47-
.then(() => exporter(dest))
46+
const export_dir = opts._[1] || 'export';
47+
48+
build()
49+
.then(() => exporter(export_dir))
4850
.then(() => {
4951
const elapsed = Date.now() - start;
5052
console.error(`extracted in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds'
@@ -53,7 +55,7 @@ if (cmd === 'build') {
5355
console.error(err ? err.details || err.stack || err.message || err : 'Unknown error');
5456
});
5557
} else if (cmd === 'dev') {
56-
dev(src, dest);
58+
dev();
5759
} else if (cmd === 'upgrade') {
5860
upgrade();
5961
} else {

src/config.ts

+3-10
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
import * as path from 'path';
22

3-
export const isDev = () => process.env.NODE_ENV !== 'production';
4-
5-
export const templates = path.resolve(process.env.SAPPER_TEMPLATES || 'templates');
6-
export const src = path.resolve(process.env.SAPPER_ROUTES || 'routes');
7-
export const dest = path.resolve(process.env.SAPPER_DEST || '.sapper');
8-
9-
export const entry = {
10-
client: path.resolve(templates, '.main.rendered.js'),
11-
server: path.resolve(dest, 'server-entry.js')
12-
};
3+
export const dev = () => process.env.NODE_ENV !== 'production';
4+
export const src = () => path.resolve(process.env.SAPPER_ROUTES || 'routes');
5+
export const dest = () => path.resolve(process.env.SAPPER_DEST || '.sapper');

src/core/create_app.ts

+8-9
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,20 @@ import * as path from 'path';
33
import mkdirp from 'mkdirp';
44
import create_routes from './create_routes';
55
import { fudge_mtime, posixify, write } from './utils';
6+
import { dev } from '../config';
67
import { Route } from '../interfaces';
78

8-
export default function create_app({ routes, src, dev, dev_port }: {
9+
export default function create_app({ routes, dev_port }: {
910
routes: Route[];
10-
src: string;
11-
dev: boolean;
1211
dev_port: number;
1312
}) {
1413
mkdirp.sync('app/manifest');
1514

16-
write('app/manifest/client.js', generate_client(routes, src, dev, dev_port));
17-
write('app/manifest/server.js', generate_server(routes, src));
15+
write('app/manifest/client.js', generate_client(routes, dev_port));
16+
write('app/manifest/server.js', generate_server(routes));
1817
}
1918

20-
function generate_client(routes: Route[], src: string, dev: boolean, dev_port?: number) {
19+
function generate_client(routes: Route[], dev_port?: number) {
2120
let code = `
2221
// This file is generated by Sapper — do not edit it!
2322
export const routes = [
@@ -42,7 +41,7 @@ function generate_client(routes: Route[], src: string, dev: boolean, dev_port?:
4241
.join(',\n\t')}
4342
];`.replace(/^\t\t/gm, '').trim();
4443

45-
if (dev) {
44+
if (dev()) {
4645
const hmr_client = posixify(
4746
path.resolve(__dirname, 'hmr-client.js')
4847
);
@@ -59,7 +58,7 @@ function generate_client(routes: Route[], src: string, dev: boolean, dev_port?:
5958
return code;
6059
}
6160

62-
function generate_server(routes: Route[], src: string) {
61+
function generate_server(routes: Route[]) {
6362
let code = `
6463
// This file is generated by Sapper — do not edit it!
6564
${routes
@@ -74,7 +73,7 @@ function generate_server(routes: Route[], src: string) {
7473
export const routes = [
7574
${routes
7675
.map(route => {
77-
const file = posixify(`${src}/${route.file}`);
76+
const file = posixify(`../../${route.file}`);
7877
7978
if (route.id === '_4xx' || route.id === '_5xx') {
8079
return `{ error: '${route.id.slice(1)}', module: ${route.id} }`;

src/core/create_routes.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import * as path from 'path';
22
import glob from 'glob';
3+
import { src } from '../config';
34
import { Route } from '../interfaces';
45

5-
export default function create_routes({ src, files = glob.sync('**/*.+(html|js|mjs)', { cwd: src }) }: {
6-
src: string;
7-
files?: string[];
8-
}) {
6+
export default function create_routes({ files } = { files: glob.sync('**/*.+(html|js|mjs)', { cwd: src() }) }) {
97
const routes: Route[] = files
108
.map((file: string) => {
119
if (/(^|\/|\\)_/.test(file)) return;

src/core/create_serviceworker.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ import create_routes from './create_routes';
55
import { fudge_mtime, posixify, write } from './utils';
66
import { Route } from '../interfaces';
77

8-
export default function create_serviceworker({ routes, client_files, src }: {
8+
export default function create_serviceworker({ routes, client_files }: {
99
routes: Route[];
1010
client_files: string[];
11-
src: string;
1211
}) {
1312
const assets = glob.sync('**', { cwd: 'assets', nodir: true });
1413

src/middleware/index.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@ import rimraf from 'rimraf';
77
import serialize from 'serialize-javascript';
88
import escape_html from 'escape-html';
99
import { create_routes, templates, create_compilers, create_template } from 'sapper/core.js';
10-
import { dest, entry, isDev, src } from '../config';
10+
import { dest } from '../config';
1111
import { Route, Template } from '../interfaces';
1212
import sourceMapSupport from 'source-map-support';
1313

1414
sourceMapSupport.install();
1515

16-
const dev = isDev();
17-
1816
type RouteObject = {
1917
id: string;
2018
type: 'page' | 'route';
@@ -43,12 +41,14 @@ interface Req extends ClientRequest {
4341
export default function middleware({ routes }: {
4442
routes: RouteObject[]
4543
}) {
46-
const client_info = JSON.parse(fs.readFileSync(path.join(dest, 'client_info.json'), 'utf-8'));
44+
const output = dest();
45+
46+
const client_info = JSON.parse(fs.readFileSync(path.join(output, 'client_info.json'), 'utf-8'));
4747

4848
const template = create_template();
4949

50-
const shell = try_read(path.join(dest, 'index.html'));
51-
const serviceworker = try_read(path.join(dest, 'service-worker.js'));
50+
const shell = try_read(path.join(output, 'index.html'));
51+
const serviceworker = try_read(path.join(output, 'service-worker.js'));
5252

5353
const middleware = compose_handlers([
5454
(req: Req, res: ServerResponse, next: () => void) => {
@@ -76,7 +76,7 @@ export default function middleware({ routes }: {
7676
const type = 'application/javascript'; // TODO might not be, if using e.g. CSS plugin
7777

7878
// TODO cache?
79-
const rs = fs.createReadStream(path.join(dest, req.pathname.slice(1)));
79+
const rs = fs.createReadStream(path.join(output, req.pathname.slice(1)));
8080

8181
rs.on('error', error => {
8282
res.statusCode = 404;

src/webpack/index.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { dest, isDev, entry } from '../config';
1+
import { dest, dev } from '../config';
22

33
export default {
4-
dev: isDev(),
4+
dev: dev(),
55

66
client: {
77
entry: () => {
@@ -17,7 +17,7 @@ export default {
1717

1818
output: () => {
1919
return {
20-
path: `${dest}/client`,
20+
path: `${dest()}/client`,
2121
filename: '[hash]/[name].js',
2222
chunkFilename: '[hash]/[name].[id].js',
2323
publicPath: '/client/'
@@ -34,7 +34,7 @@ export default {
3434

3535
output: () => {
3636
return {
37-
path: `${dest}`,
37+
path: `${dest()}`,
3838
filename: '[name].js',
3939
chunkFilename: '[hash]/[name].[id].js',
4040
libraryTarget: 'commonjs2'

test/common/test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ function run(env) {
423423
if (env === 'production') {
424424
describe('export', () => {
425425
it('export all pages', () => {
426-
const dest = path.resolve(__dirname, '../app/dist');
426+
const dest = path.resolve(__dirname, '../app/export');
427427

428428
// Pages that should show up in the extraction directory.
429429
const expectedPages = [

0 commit comments

Comments
 (0)