diff --git a/cli.js b/cli.js
index b89ccba..40ec17b 100644
--- a/cli.js
+++ b/cli.js
@@ -1,13 +1,36 @@
#!/usr/bin/env node
'use strict';
+function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
+
var core_js = require('./core.js');
+var path = require('path');
+var mkdirp = _interopDefault(require('mkdirp'));
+var rimraf = _interopDefault(require('rimraf'));
+
+const dev = process.env.NODE_ENV !== 'production';
+
+const templates = path.resolve(process.env.SAPPER_TEMPLATES || 'templates');
+
+const src = path.resolve(process.env.SAPPER_ROUTES || 'routes');
+
+const dest = path.resolve(process.env.SAPPER_DEST || '.sapper');
+
+if (dev) {
+ mkdirp.sync(dest);
+ rimraf.sync(path.join(dest, '**/*'));
+}
+
+const entry = {
+ client: path.resolve(templates, '.main.rendered.js'),
+ server: path.resolve(dest, 'server-entry.js')
+};
const cmd = process.argv[2];
const start = Date.now();
if (cmd === 'build') {
- core_js.build()
+ core_js.build({ dest, dev, entry, src })
.then(() => {
const elapsed = Date.now() - start;
console.error(`built in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds'
@@ -18,8 +41,8 @@ if (cmd === 'build') {
} else if (cmd === 'export') {
const start = Date.now();
- core_js.build()
- .then(() => core_js.export())
+ core_js.build({ dest, dev, entry, src })
+ .then(() => core_js.export({ src, dest }))
.then(() => {
const elapsed = Date.now() - start;
console.error(`extracted in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds'
@@ -28,3 +51,4 @@ if (cmd === 'build') {
console.error(err ? err.details || err.stack || err.message || err : 'Unknown error');
});
}
+//# sourceMappingURL=cli.js.map
diff --git a/cli.js.map b/cli.js.map
new file mode 100644
index 0000000..6923c3b
--- /dev/null
+++ b/cli.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"cli.js","sources":["src/config.js","src/cli/index.js"],"sourcesContent":["import * as path from 'path';\nimport mkdirp from 'mkdirp';\nimport rimraf from 'rimraf';\n\nexport const dev = process.env.NODE_ENV !== 'production';\n\nexport const templates = path.resolve(process.env.SAPPER_TEMPLATES || 'templates');\n\nexport const src = path.resolve(process.env.SAPPER_ROUTES || 'routes');\n\nexport const dest = path.resolve(process.env.SAPPER_DEST || '.sapper');\n\nif (dev) {\n\tmkdirp.sync(dest);\n\trimraf.sync(path.join(dest, '**/*'));\n}\n\nexport const entry = {\n\tclient: path.resolve(templates, '.main.rendered.js'),\n\tserver: path.resolve(dest, 'server-entry.js')\n};","import { build, export as exporter } from 'sapper/core.js';\nimport { dest, dev, entry, src } from '../config.js';\n\nconst cmd = process.argv[2];\nconst start = Date.now();\n\nif (cmd === 'build') {\n\tbuild({ dest, dev, entry, src })\n\t\t.then(() => {\n\t\t\tconst elapsed = Date.now() - start;\n\t\t\tconsole.error(`built in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds'\n\t\t})\n\t\t.catch(err => {\n\t\t\tconsole.error(err ? err.details || err.stack || err.message || err : 'Unknown error');\n\t\t});\n} else if (cmd === 'export') {\n\tconst start = Date.now();\n\n\tbuild({ dest, dev, entry, src })\n\t\t.then(() => exporter({ src, dest }))\n\t\t.then(() => {\n\t\t\tconst elapsed = Date.now() - start;\n\t\t\tconsole.error(`extracted in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds'\n\t\t})\n\t\t.catch(err => {\n\t\t\tconsole.error(err ? err.details || err.stack || err.message || err : 'Unknown error');\n\t\t});\n}\n"],"names":["path.resolve","path.join","build","exporter"],"mappings":";;;;;;;;;;AAIO,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;;AAEzD,AAAO,MAAM,SAAS,GAAGA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,WAAW,CAAC,CAAC;;AAEnF,AAAO,MAAM,GAAG,GAAGA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,QAAQ,CAAC,CAAC;;AAEvE,AAAO,MAAM,IAAI,GAAGA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;;AAEvE,IAAI,GAAG,EAAE;CACR,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;CAClB,MAAM,CAAC,IAAI,CAACC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;CACrC;;AAED,AAAO,MAAM,KAAK,GAAG;CACpB,MAAM,EAAED,YAAY,CAAC,SAAS,EAAE,mBAAmB,CAAC;CACpD,MAAM,EAAEA,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC;CAC7C;;ACjBD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;;AAEzB,IAAI,GAAG,KAAK,OAAO,EAAE;CACpBE,aAAK,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;GAC9B,IAAI,CAAC,MAAM;GACX,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;GACnC,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;GACvC,CAAC;GACD,KAAK,CAAC,GAAG,IAAI;GACb,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,GAAG,eAAe,CAAC,CAAC;GACtF,CAAC,CAAC;CACJ,MAAM,IAAI,GAAG,KAAK,QAAQ,EAAE;CAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;;CAEzBA,aAAK,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;GAC9B,IAAI,CAAC,MAAMC,cAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;GACnC,IAAI,CAAC,MAAM;GACX,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;GACnC,OAAO,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;GAC3C,CAAC;GACD,KAAK,CAAC,GAAG,IAAI;GACb,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,GAAG,eAAe,CAAC,CAAC;GACtF,CAAC,CAAC;CACJ"}
\ No newline at end of file
diff --git a/core.js.map b/core.js.map
new file mode 100644
index 0000000..4a8d6ed
--- /dev/null
+++ b/core.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"core.js","sources":["src/core/utils/create_routes.js","src/core/route_manager.js","src/core/templates.js","src/core/utils/compilers.js","src/core/utils/create_app.js","src/core/generate_asset_cache.js","src/core/build.js","src/core/export.js"],"sourcesContent":["import * as path from 'path';\n\nexport default function create_routes(files) {\n\tconst routes = files\n\t\t.map(file => {\n\t\t\tif (/(^|\\/|\\\\)_/.test(file)) return;\n\n\t\t\tconst parts = file.replace(/\\.(html|js|mjs)$/, '').split('/'); // glob output is always posix-style\n\t\t\tif (parts[parts.length - 1] === 'index') parts.pop();\n\n\t\t\tconst id = (\n\t\t\t\tparts.join('_').replace(/[[\\]]/g, '$').replace(/^\\d/, '_$&').replace(/[^a-zA-Z0-9_$]/g, '_')\n\t\t\t ) || '_';\n\n\t\t\tconst dynamic = parts\n\t\t\t\t.filter(part => part[0] === '[')\n\t\t\t\t.map(part => part.slice(1, -1));\n\n\t\t\tlet pattern_string = '';\n\t\t\tlet i = parts.length;\n\t\t\tlet nested = true;\n\t\t\twhile (i--) {\n\t\t\t\tconst part = parts[i];\n\t\t\t\tconst dynamic = part[0] === '[';\n\n\t\t\t\tif (dynamic) {\n\t\t\t\t\tpattern_string = nested ? `(?:\\\\/([^/]+)${pattern_string})?` : `\\\\/([^/]+)${pattern_string}`;\n\t\t\t\t} else {\n\t\t\t\t\tnested = false;\n\t\t\t\t\tpattern_string = `\\\\/${part}${pattern_string}`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst pattern = new RegExp(`^${pattern_string}\\\\/?$`);\n\n\t\t\tconst test = url => pattern.test(url);\n\n\t\t\tconst exec = url => {\n\t\t\t\tconst match = pattern.exec(url);\n\t\t\t\tif (!match) return;\n\n\t\t\t\tconst params = {};\n\t\t\t\tdynamic.forEach((param, i) => {\n\t\t\t\t\tparams[param] = match[i + 1];\n\t\t\t\t});\n\n\t\t\t\treturn params;\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\ttype: path.extname(file) === '.html' ? 'page' : 'route',\n\t\t\t\tfile,\n\t\t\t\tpattern,\n\t\t\t\ttest,\n\t\t\t\texec,\n\t\t\t\tparts,\n\t\t\t\tdynamic\n\t\t\t};\n\t\t})\n\t\t.filter(Boolean)\n\t\t.sort((a, b) => {\n\t\t\tlet same = true;\n\n\t\t\tfor (let i = 0; true; i += 1) {\n\t\t\t\tconst a_part = a.parts[i];\n\t\t\t\tconst b_part = b.parts[i];\n\n\t\t\t\tif (!a_part && !b_part) {\n\t\t\t\t\tif (same) throw new Error(`The ${a.file} and ${b.file} routes clash`);\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\tif (!a_part) return -1;\n\t\t\t\tif (!b_part) return 1;\n\n\t\t\t\tconst a_is_dynamic = a_part[0] === '[';\n\t\t\t\tconst b_is_dynamic = b_part[0] === '[';\n\n\t\t\t\tif (a_is_dynamic === b_is_dynamic) {\n\t\t\t\t\tif (!a_is_dynamic && a_part !== b_part) same = false;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\treturn a_is_dynamic ? 1 : -1;\n\t\t\t}\n\t\t});\n\n\treturn routes;\n}","import glob from 'glob';\nimport create_routes from './utils/create_routes.js';\n\nexport let routes;\n\nexport function update({ src }) {\n\troutes = create_routes(\n\t\tglob.sync('**/*.+(html|js|mjs)', { cwd: src })\n\t);\n\n\treturn routes;\n}","import * as fs from 'fs';\nimport glob from 'glob';\nimport chalk from 'chalk';\nimport framer from 'code-frame';\nimport { locate } from 'locate-character';\n\nlet templates;\n\nfunction error(e) {\n\tif (e.title) console.error(chalk.bold.red(e.title));\n\tif (e.body) console.error(chalk.red(e.body));\n\tif (e.url) console.error(chalk.cyan(e.url));\n\tif (e.frame) console.error(chalk.grey(e.frame));\n\n\tprocess.exit(1);\n}\n\nexport function create_templates() {\n\ttemplates = glob.sync('*.html', { cwd: 'templates' })\n\t\t.map(file => {\n\t\t\tconst template = fs.readFileSync(`templates/${file}`, 'utf-8');\n\t\t\tconst status = file.replace('.html', '').toLowerCase();\n\n\t\t\tif (!/^[0-9x]{3}$/.test(status)) {\n\t\t\t\terror({\n\t\t\t\t\ttitle: `templates/${file}`,\n\t\t\t\t\tbody: `Bad template — should be a valid status code like 404.html, or a wildcard like 2xx.html`\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst index = template.indexOf('%sapper.main%');\n\t\t\tif (index !== -1) {\n\t\t\t\t// TODO remove this in a future version\n\t\t\t\tconst { line, column } = locate(template, index, { offsetLine: 1 });\n\t\t\t\tconst frame = framer(template, line, column);\n\n\t\t\t\terror({\n\t\t\t\t\ttitle: `templates/${file}`,\n\t\t\t\t\tbody: ``;\n\n\t\t\t\t\t\tif (serialized) {\n\t\t\t\t\t\t\treturn `${main}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn main;\n\t\t\t\t\t}),\n\t\t\t\t\thtml: promise.then(({ rendered }) => rendered.html),\n\t\t\t\t\thead: promise.then(({ rendered }) => `${rendered.head}`),\n\t\t\t\t\tstyles: promise.then(({ rendered }) => (rendered.css && rendered.css.code ? `` : ''))\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst { html, head, css } = mod.render(data);\n\n\t\t\t\tconst page = templates.render(200, {\n\t\t\t\t\tscripts: ``,\n\t\t\t\t\thtml,\n\t\t\t\t\thead: `${head}`,\n\t\t\t\t\tstyles: (css && css.code ? `` : '')\n\t\t\t\t});\n\n\t\t\t\tres.end(page);\n\t\t\t}\n\t\t}\n\n\t\telse {\n\t\t\tconst method = req.method.toLowerCase();\n\t\t\t// 'delete' cannot be exported from a module because it is a keyword,\n\t\t\t// so check for 'del' instead\n\t\t\tconst method_export = method === 'delete' ? 'del' : method;\n\t\t\tconst handler = mod[method_export];\n\t\t\tif (handler) {\n\t\t\t\thandler(req, res, next);\n\t\t\t} else {\n\t\t\t\t// no matching handler for method — 404\n\t\t\t\tnext();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn function find_route(req, res, next) {\n\t\tconst url = req.pathname;\n\n\t\t// whatever happens, we're going to serve some HTML\n\t\tres.setHeader('Content-Type', 'text/html');\n\n\t\tresolved\n\t\t\t.then(() => {\n\t\t\t\tfor (const route of route_manager.routes) {\n\t\t\t\t\tif (route.test(url)) return handle_route(route, req, res, next, fn());\n\t\t\t\t}\n\n\t\t\t\t// no matching route — 404\n\t\t\t\tnext();\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tres.statusCode = 500;\n\t\t\t\tres.end(templates.render(500, {\n\t\t\t\t\ttitle: (err && err.name) || 'Internal server error',\n\t\t\t\t\turl,\n\t\t\t\t\terror: escape_html(err && (err.details || err.message || err) || 'Unknown error'),\n\t\t\t\t\tstack: err && err.stack.split('\\n').slice(1).join('\\n')\n\t\t\t\t}));\n\t\t\t});\n\t};\n}\n\nfunction get_not_found_handler(fn) {\n\treturn function handle_not_found(req, res) {\n\t\tconst asset_cache = fn();\n\n\t\tres.statusCode = 404;\n\t\tres.end(templates.render(404, {\n\t\t\ttitle: 'Not found',\n\t\t\tstatus: 404,\n\t\t\tmethod: req.method,\n\t\t\tscripts: ``,\n\t\t\turl: req.url\n\t\t}));\n\t};\n}\n\nfunction compose_handlers(handlers) {\n\treturn (req, res, next) => {\n\t\tlet i = 0;\n\t\tfunction go() {\n\t\t\tconst handler = handlers[i];\n\n\t\t\tif (handler) {\n\t\t\t\thandler(req, res, () => {\n\t\t\t\t\ti += 1;\n\t\t\t\t\tgo();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tnext();\n\t\t\t}\n\t\t}\n\n\t\tgo();\n\t};\n}\n\nfunction read_json(file) {\n\treturn JSON.parse(fs.readFileSync(file, 'utf-8'));\n}\n\nfunction try_serialize(data) {\n\ttry {\n\t\treturn serialize(data);\n\t} catch (err) {\n\t\treturn null;\n\t}\n}"],"names":["templates","path.resolve","path.join","fs.writeFileSync","generate_asset_cache","compilers","create_app","route_manager","fs.readFileSync"],"mappings":"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"}
\ No newline at end of file
diff --git a/mocha.opts b/mocha.opts
index a1babb5..3b7d05f 100644
--- a/mocha.opts
+++ b/mocha.opts
@@ -1,4 +1,4 @@
---require ts-node/register
+--require source-map-support/register
--recursive
test/unit/**/*.js
test/common/test.js
\ No newline at end of file
diff --git a/package.json b/package.json
index 360d881..f6ddf51 100644
--- a/package.json
+++ b/package.json
@@ -48,6 +48,7 @@
"npm-run-all": "^4.1.2",
"rollup": "^0.53.0",
"rollup-plugin-typescript": "^0.8.1",
+ "source-map-support": "^0.5.2",
"style-loader": "^0.19.1",
"svelte": "^1.49.1",
"svelte-loader": "^2.3.2",
diff --git a/rollup.config.js b/rollup.config.js
index c8fae3b..f088d8a 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -4,7 +4,7 @@ import pkg from './package.json';
const external = [].concat(
Object.keys(pkg.dependencies),
Object.keys(process.binding('natives')),
- 'sapper'
+ 'sapper/core.js'
);
const paths = {
@@ -18,10 +18,11 @@ export default [
output: {
file: 'cli.js',
format: 'cjs',
- banner: '#!/usr/bin/env node'
+ banner: '#!/usr/bin/env node',
+ paths,
+ sourcemap: true
},
external,
- paths,
plugins: [
typescript({
typescript: require('typescript')
@@ -35,10 +36,11 @@ export default [
output: {
file: 'core.js',
format: 'cjs',
- banner: '#!/usr/bin/env node'
+ banner: '#!/usr/bin/env node',
+ paths,
+ sourcemap: true
},
external,
- paths,
plugins: [
typescript({
typescript: require('typescript')
@@ -51,10 +53,11 @@ export default [
input: 'src/middleware/index.js',
output: {
file: 'middleware.js',
- format: 'cjs'
+ format: 'cjs',
+ paths,
+ sourcemap: true
},
external,
- paths,
plugins: [
typescript({
typescript: require('typescript')
@@ -67,10 +70,11 @@ export default [
input: 'src/runtime/index.ts',
output: {
file: 'runtime.js',
- format: 'es'
+ format: 'es',
+ paths,
+ sourcemap: true
},
external,
- paths,
plugins: [
typescript({
typescript: require('typescript')
@@ -83,10 +87,11 @@ export default [
input: 'src/webpack/index.js',
output: {
file: 'webpack/config.js',
- format: 'cjs'
+ format: 'cjs',
+ paths,
+ sourcemap: true
},
external,
- paths,
plugins: [
typescript({
typescript: require('typescript')
diff --git a/runtime.js.map b/runtime.js.map
new file mode 100644
index 0000000..50e4ce5
--- /dev/null
+++ b/runtime.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"runtime.js","sources":["src/runtime/utils.ts","src/runtime/index.ts"],"sourcesContent":["export function detach(node: Node) {\n\tnode.parentNode.removeChild(node);\n}\n\nexport function findAnchor(node: Node) {\n\twhile (node && node.nodeName.toUpperCase() !== 'A') node = node.parentNode; // SVG elements have a lowercase name\n\treturn node;\n}\n\nexport function which(event: MouseEvent) {\n\treturn event.which === null ? event.button : event.which;\n}\n\nexport function scroll_state() {\n\treturn {\n\t\tx: window.scrollX,\n\t\ty: window.scrollY\n\t};\n}","import { detach, findAnchor, scroll_state, which } from './utils';\nimport { Component, ComponentConstructor, Params, Query, Route, RouteData, ScrollPosition } from './interfaces';\n\nexport let component: Component;\nlet target: Node;\nlet routes: Route[];\n\nconst history = typeof window !== 'undefined' ? window.history : {\n\tpushState: (state: any, title: string, href: string) => {},\n\treplaceState: (state: any, title: string, href: string) => {},\n\tscrollRestoration: ''\n};\n\nconst scroll_history: Record = {};\nlet uid = 1;\nlet cid: number;\n\nif ('scrollRestoration' in history) {\n\thistory.scrollRestoration = 'manual';\n}\n\nfunction select_route(url: URL): { route: Route, data: RouteData } {\n\tif (url.origin !== window.location.origin) return null;\n\n\tfor (const route of routes) {\n\t\tconst match = route.pattern.exec(url.pathname);\n\t\tif (match) {\n\t\t\tconst params = route.params(match);\n\n\t\t\tconst query: Record = {};\n\t\t\tfor (const [key, value] of url.searchParams) query[key] = value || true;\n\n\t\t\treturn { route, data: { params, query } };\n\t\t}\n\t}\n}\n\nlet current_token: {};\n\nfunction render(Component: ComponentConstructor, data: any, scroll: ScrollPosition, token: {}) {\n\tif (current_token !== token) return;\n\n\tif (component) {\n\t\tcomponent.destroy();\n\t} else {\n\t\t// first load — remove SSR'd contents\n\t\tconst start = document.querySelector('#sapper-head-start');\n\t\tconst end = document.querySelector('#sapper-head-end');\n\n\t\tif (start && end) {\n\t\t\twhile (start.nextSibling !== end) detach(start.nextSibling);\n\t\t\tdetach(start);\n\t\t\tdetach(end);\n\t\t}\n\n\t\t// preload additional routes\n\t\troutes.reduce((promise: Promise, route) => promise.then(route.load), Promise.resolve());\n\t}\n\n\tcomponent = new Component({\n\t\ttarget,\n\t\tdata,\n\t\thydrate: !component\n\t});\n\n\tif (scroll) {\n\t\twindow.scrollTo(scroll.x, scroll.y);\n\t}\n}\n\nfunction prepare_route(Component: ComponentConstructor, data: RouteData) {\n\tif (!Component.preload) {\n\t\treturn { Component, data };\n\t}\n\n\tif (!component && window.__SAPPER__ && window.__SAPPER__.preloaded) {\n\t\treturn { Component, data: Object.assign(data, window.__SAPPER__.preloaded) };\n\t}\n\n\treturn Promise.resolve(Component.preload(data)).then(preloaded => {\n\t\tObject.assign(data, preloaded)\n\t\treturn { Component, data };\n\t});\n}\n\nfunction navigate(url: URL, id: number) {\n\tconst selected = select_route(url);\n\tif (selected) {\n\t\tif (id) {\n\t\t\t// popstate or initial navigation\n\t\t\tcid = id;\n\t\t} else {\n\t\t\t// clicked on a link. preserve scroll state\n\t\t\tscroll_history[cid] = scroll_state();\n\n\t\t\tid = cid = ++uid;\n\t\t\tscroll_history[cid] = { x: 0, y: 0 };\n\t\t}\n\n\t\tconst loaded = prefetching && prefetching.href === url.href ?\n\t\t\tprefetching.promise :\n\t\t\tselected.route.load().then(mod => prepare_route(mod.default, selected.data));\n\n\t\tprefetching = null;\n\n\t\tconst token = current_token = {};\n\n\t\tloaded.then(({ Component, data }) => {\n\t\t\trender(Component, data, scroll_history[id], token);\n\t\t});\n\n\t\tcid = id;\n\t\treturn true;\n\t}\n}\n\nfunction handle_click(event: MouseEvent) {\n\t// Adapted from https://github.com/visionmedia/page.js\n\t// MIT license https://github.com/visionmedia/page.js#license\n\tif (which(event) !== 1) return;\n\tif (event.metaKey || event.ctrlKey || event.shiftKey) return;\n\tif (event.defaultPrevented) return;\n\n\tconst a: HTMLAnchorElement | SVGAElement = findAnchor(event.target);\n\tif (!a) return;\n\n\t// check if link is inside an svg\n\t// in this case, both href and target are always inside an object\n\tconst svg = typeof a.href === 'object' && a.href.constructor.name === 'SVGAnimatedString';\n\tconst href = String(svg ? (a).href.baseVal : a.href);\n\n\tif (href === window.location.href) {\n\t\tevent.preventDefault();\n\t\treturn;\n\t}\n\n\t// Ignore if tag has\n\t// 1. 'download' attribute\n\t// 2. rel='external' attribute\n\tif (a.hasAttribute('download') || a.getAttribute('rel') === 'external') return;\n\n\t// Ignore if has a target\n\tif (svg ? (a).target.baseVal : a.target) return;\n\n\tconst url = new URL(href);\n\n\t// Don't handle hash changes\n\tif (url.pathname === window.location.pathname && url.search === window.location.search) return;\n\n\tif (navigate(url, null)) {\n\t\tevent.preventDefault();\n\t\thistory.pushState({ id: cid }, '', url.href);\n\t}\n}\n\nfunction handle_popstate(event: PopStateEvent) {\n\tscroll_history[cid] = scroll_state();\n\n\tif (event.state) {\n\t\tnavigate(new URL(window.location.href), event.state.id);\n\t} else {\n\t\t// hashchange\n\t\tcid = ++uid;\n\t\thistory.replaceState({ id: cid }, '', window.location.href);\n\t}\n}\n\nlet prefetching: {\n\thref: string;\n\tpromise: Promise<{ Component: ComponentConstructor, data: any }>;\n} = null;\n\nexport function prefetch(href: string) {\n\tconst selected = select_route(new URL(href));\n\n\tif (selected) {\n\t\tprefetching = {\n\t\t\thref,\n\t\t\tpromise: selected.route.load().then(mod => prepare_route(mod.default, selected.data))\n\t\t};\n\t}\n}\n\nfunction handle_touchstart_mouseover(event: MouseEvent | TouchEvent) {\n\tconst a: HTMLAnchorElement = findAnchor(event.target);\n\tif (!a || a.rel !== 'prefetch') return;\n\n\tprefetch(a.href);\n}\n\nlet inited: boolean;\n\nexport function init(_target: Node, _routes: Route[]) {\n\ttarget = _target;\n\troutes = _routes;\n\n\tif (!inited) { // this check makes HMR possible\n\t\twindow.addEventListener('click', handle_click);\n\t\twindow.addEventListener('popstate', handle_popstate);\n\n\t\t// prefetch\n\t\twindow.addEventListener('touchstart', handle_touchstart_mouseover);\n\t\twindow.addEventListener('mouseover', handle_touchstart_mouseover);\n\n\t\tinited = true;\n\t}\n\n\tsetTimeout(() => {\n\t\tconst { hash, href } = window.location;\n\n\t\tconst deep_linked = hash && document.querySelector(hash);\n\t\tscroll_history[uid] = deep_linked ?\n\t\t\t{ x: 0, y: deep_linked.getBoundingClientRect().top } :\n\t\t\tscroll_state();\n\n\t\thistory.replaceState({ id: uid }, '', href);\n\t\tnavigate(new URL(window.location.href), uid);\n\t});\n}\n\nexport function goto(href: string, opts = { replaceState: false }) {\n\tif (navigate(new URL(href, window.location.href), null)) {\n\t\tif (history) history[opts.replaceState ? 'replaceState' : 'pushState']({ id: cid }, '', href);\n\t} else {\n\t\twindow.location.href = href;\n\t}\n}\n"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/src/cli/index.js b/src/cli/index.js
index 64478c4..2ce467b 100755
--- a/src/cli/index.js
+++ b/src/cli/index.js
@@ -1,10 +1,11 @@
import { build, export as exporter } from 'sapper/core.js';
+import { dest, dev, entry, src } from '../config.js';
const cmd = process.argv[2];
const start = Date.now();
if (cmd === 'build') {
- build()
+ build({ dest, dev, entry, src })
.then(() => {
const elapsed = Date.now() - start;
console.error(`built in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds'
@@ -15,8 +16,8 @@ if (cmd === 'build') {
} else if (cmd === 'export') {
const start = Date.now();
- build()
- .then(() => exporter())
+ build({ dest, dev, entry, src })
+ .then(() => exporter({ src, dest }))
.then(() => {
const elapsed = Date.now() - start;
console.error(`extracted in ${elapsed}ms`); // TODO beautify this, e.g. 'built in 4.7 seconds'
diff --git a/src/core/build.js b/src/core/build.js
index 3f18d0a..aaf6999 100644
--- a/src/core/build.js
+++ b/src/core/build.js
@@ -4,17 +4,16 @@ import * as fs from 'fs';
import * as path from 'path';
import mkdirp from 'mkdirp';
import rimraf from 'rimraf';
-import { client, server } from './utils/compilers.js';
+import * as compilers from './utils/compilers.js';
import create_app from './utils/create_app.js';
import generate_asset_cache from './generate_asset_cache.js';
-import { dest } from '../config.js';
-export default () => {
+export default function build({ dest, dev, entry, src }) {
mkdirp.sync(dest);
rimraf.sync(path.join(dest, '**/*'));
// create main.js and server-routes.js
- create_app();
+ create_app({ dev, entry, src });
return new Promise((fulfil, reject) => {
function handleErrors(err, stats) {
@@ -29,19 +28,21 @@ export default () => {
}
}
- client.run((err, clientStats) => {
- handleErrors(err, clientStats);
- const clientInfo = clientStats.toJson();
- fs.writeFileSync(path.join(dest, 'stats.client.json'), JSON.stringify(clientInfo, null, ' '));
+ const { client, server } = compilers.get_compilers(); // TODO refactor
- server.run((err, serverStats) => {
- handleErrors(err, serverStats);
- const serverInfo = serverStats.toJson();
- fs.writeFileSync(path.join(dest, 'stats.server.json'), JSON.stringify(serverInfo, null, ' '));
+ client.run((err, client_stats) => {
+ handleErrors(err, client_stats);
+ const client_info = client_stats.toJson();
+ fs.writeFileSync(path.join(dest, 'stats.client.json'), JSON.stringify(client_info, null, ' '));
- generate_asset_cache(clientInfo, serverInfo);
+ server.run((err, server_stats) => {
+ handleErrors(err, server_stats);
+ const server_info = server_stats.toJson();
+ fs.writeFileSync(path.join(dest, 'stats.server.json'), JSON.stringify(server_info, null, ' '));
+
+ generate_asset_cache({ src, dest, dev, client_info, server_info });
fulfil();
});
});
});
-};
+}
diff --git a/src/core/export.js b/src/core/export.js
index b13ea45..7416c36 100644
--- a/src/core/export.js
+++ b/src/core/export.js
@@ -5,8 +5,7 @@ import cheerio from 'cheerio';
import fetch from 'node-fetch';
import URL from 'url-parse';
import generate_asset_cache from './generate_asset_cache.js';
-import { dest } from '../config.js';
-import middleware from '../middleware/index.js';
+// import middleware from '../middleware/index.js';
const { PORT = 3000, OUTPUT_DIR = 'dist' } = process.env;
@@ -18,14 +17,16 @@ function read_json(file) {
return JSON.parse(sander.readFileSync(file, { encoding: 'utf-8' }));
}
-export default function() {
+export default function exporter({ src, dest }) { // TODO dest is a terrible name in this context
// Prep output directory
sander.rimrafSync(OUTPUT_DIR);
- const { service_worker } = generate_asset_cache(
- read_json(path.join(dest, 'stats.client.json')),
- read_json(path.join(dest, 'stats.server.json'))
- );
+ const { service_worker } = generate_asset_cache({
+ src, dest,
+ dev: false,
+ client_info: read_json(path.join(dest, 'stats.client.json')),
+ server_info: read_json(path.join(dest, 'stats.server.json'))
+ });
sander.copydirSync('assets').to(OUTPUT_DIR);
sander.copydirSync(dest, 'client').to(OUTPUT_DIR, 'client');
@@ -62,7 +63,7 @@ export default function() {
return fetch(url, opts);
};
- app.use(middleware());
+ app.use(require('./middleware')()); // TODO this is filthy
const server = app.listen(PORT);
const seen = new Set();
diff --git a/src/core/generate_asset_cache.js b/src/core/generate_asset_cache.js
index 91ae425..05546e1 100644
--- a/src/core/generate_asset_cache.js
+++ b/src/core/generate_asset_cache.js
@@ -3,18 +3,19 @@ import * as path from 'path';
import glob from 'glob';
import * as templates from './templates.js';
import * as route_manager from './route_manager.js';
-import { dest, dev } from '../config.js';
function ensure_array(thing) {
return Array.isArray(thing) ? thing : [thing]; // omg webpack what the HELL are you doing
}
-export default function generate_asset_cache(clientInfo, serverInfo) {
- const main_file = `/client/${ensure_array(clientInfo.assetsByChunkName.main)[0]}`;
+export default function generate_asset_cache({ src, dest, dev, client_info, server_info }) {
+ templates.create_templates(); // TODO refactor this...
- const chunk_files = clientInfo.assets.map(chunk => `/client/${chunk.name}`);
+ const main_file = `/client/${ensure_array(client_info.assetsByChunkName.main)[0]}`;
- const service_worker = generate_service_worker(chunk_files);
+ const chunk_files = client_info.assets.map(chunk => `/client/${chunk.name}`);
+
+ const service_worker = generate_service_worker({ chunk_files, src });
const index = generate_index(main_file);
if (dev) {
@@ -34,7 +35,7 @@ export default function generate_asset_cache(clientInfo, serverInfo) {
}, {}),
routes: route_manager.routes.reduce((lookup, route) => {
- lookup[route.id] = `/client/${ensure_array(clientInfo.assetsByChunkName[route.id])[0]}`;
+ lookup[route.id] = `/client/${ensure_array(client_info.assetsByChunkName[route.id])[0]}`;
return lookup;
}, {}),
@@ -43,16 +44,18 @@ export default function generate_asset_cache(clientInfo, serverInfo) {
},
server: {
- entry: path.resolve(dest, 'server', serverInfo.assetsByChunkName.main)
+ entry: path.resolve(dest, 'server', server_info.assetsByChunkName.main)
},
service_worker
};
}
-function generate_service_worker(chunk_files) {
+function generate_service_worker({ chunk_files, src }) {
const assets = glob.sync('**', { cwd: 'assets', nodir: true });
+ route_manager.update({ src }); // TODO refactor
+
const route_code = `[${
route_manager.routes
.filter(route => route.type === 'page')
diff --git a/src/core/index.js b/src/core/index.js
index ced82f2..ee0513c 100644
--- a/src/core/index.js
+++ b/src/core/index.js
@@ -6,5 +6,6 @@ export { default as build } from './build.js';
export { default as export } from './export.js';
export { default as generate_asset_cache } from './generate_asset_cache.js';
export { default as create_app } from './utils/create_app.js';
+export { default as create_routes } from './utils/create_routes.js';
export { compilers, route_manager, templates };
\ No newline at end of file
diff --git a/src/core/route_manager.js b/src/core/route_manager.js
index 9efe5b9..3d559b4 100644
--- a/src/core/route_manager.js
+++ b/src/core/route_manager.js
@@ -1,32 +1,12 @@
import glob from 'glob';
import create_routes from './utils/create_routes.js';
-import { src, dev } from '../config.js';
-
-const callbacks = [];
-
-export function onchange(fn) {
- callbacks.push(fn);
-}
export let routes;
-function update() {
+export function update({ src }) {
routes = create_routes(
glob.sync('**/*.+(html|js|mjs)', { cwd: src })
);
- callbacks.forEach(fn => fn());
-}
-
-update();
-
-if (dev) {
- const watcher = require('chokidar').watch(`${src}/**/*.+(html|js|mjs)`, {
- ignoreInitial: true,
- persistent: false
- });
-
- watcher.on('add', update);
- watcher.on('change', update);
- watcher.on('unlink', update);
-}
+ return routes;
+}
\ No newline at end of file
diff --git a/src/core/templates.js b/src/core/templates.js
index 216783c..c95a07e 100644
--- a/src/core/templates.js
+++ b/src/core/templates.js
@@ -3,7 +3,6 @@ import glob from 'glob';
import chalk from 'chalk';
import framer from 'code-frame';
import { locate } from 'locate-character';
-import { dev } from '../config.js';
let templates;
@@ -16,7 +15,7 @@ function error(e) {
process.exit(1);
}
-function create_templates() {
+export function create_templates() {
templates = glob.sync('*.html', { cwd: 'templates' })
.map(file => {
const template = fs.readFileSync(`templates/${file}`, 'utf-8');
@@ -99,19 +98,6 @@ function create_templates() {
.sort((a, b) => b.specificity - a.specificity);
}
-create_templates();
-
-if (dev) {
- const watcher = require('chokidar').watch('templates/**.html', {
- ignoreInitial: true,
- persistent: false
- });
-
- watcher.on('add', create_templates);
- watcher.on('change', create_templates);
- watcher.on('unlink', create_templates);
-}
-
export function render(status, data) {
const template = templates.find(template => template.test(status));
if (template) return template.render(data);
diff --git a/src/core/utils/compilers.js b/src/core/utils/compilers.js
index 3def12e..4424d45 100644
--- a/src/core/utils/compilers.js
+++ b/src/core/utils/compilers.js
@@ -3,10 +3,25 @@ import relative from 'require-relative';
const webpack = relative('webpack', process.cwd());
-export const client = webpack(
- require(path.resolve('webpack.client.config.js'))
-);
+export let client;
+export let server;
-export const server = webpack(
- require(path.resolve('webpack.server.config.js'))
-);
\ No newline at end of file
+export function get_compilers() {
+ return {
+ client: webpack(
+ require(path.resolve('webpack.client.config.js'))
+ ),
+
+ server: webpack(
+ require(path.resolve('webpack.server.config.js'))
+ )
+ };
+}
+
+// export const client = webpack(
+// require(path.resolve('webpack.client.config.js'))
+// );
+
+// export const server = webpack(
+// require(path.resolve('webpack.server.config.js'))
+// );
\ No newline at end of file
diff --git a/src/core/utils/create_app.js b/src/core/utils/create_app.js
index 6fcb64e..4046482 100644
--- a/src/core/utils/create_app.js
+++ b/src/core/utils/create_app.js
@@ -1,13 +1,15 @@
import * as fs from 'fs';
import * as path from 'path';
import * as route_manager from '../route_manager.js';
-import { src, entry, dev } from '../../config.js';
+import * as templates from '../templates.js';
function posixify(file) {
return file.replace(/[/\\]/g, '/');
}
-function create_app() {
+function create_app({ src, dev, entry }) {
+ // const { routes } = route_manager;
+ route_manager.update({ src });
const { routes } = route_manager;
function create_client_main() {
@@ -66,17 +68,31 @@ function create_app() {
create_server_routes();
}
-if (dev) {
- route_manager.onchange(create_app);
+export function start_watching({ src }) {
+ const chokidar = require('chokidar');
- const watcher = require('chokidar').watch(`templates/main.js`, {
- ignoreInitial: true,
- persistent: false
+ const watch = (glob, callback) => {
+ const watcher = chokidar.watch(glob, {
+ ignoreInitial: true,
+ persistent: false
+ });
+
+ watcher.on('add', callback);
+ watcher.on('change', callback);
+ watcher.on('unlink', callback);
+ };
+
+ watch('templates/main.js', create_app);
+
+ watch('routes/**/*.+(html|js|mjs)', () => {
+ route_manager.update({ src });
+ create_app();
});
- watcher.on('add', create_app);
- watcher.on('change', create_app);
- watcher.on('unlink', create_app);
+ watch('templates/**.html', () => {
+ templates.create_templates();
+ // TODO reload current page?
+ });
}
export default create_app;
diff --git a/src/core/utils/create_routes.js b/src/core/utils/create_routes.js
index 97b6d09..bf8d351 100644
--- a/src/core/utils/create_routes.js
+++ b/src/core/utils/create_routes.js
@@ -1,6 +1,6 @@
import * as path from 'path';
-export default function create_matchers(files) {
+export default function create_routes(files) {
const routes = files
.map(file => {
if (/(^|\/|\\)_/.test(file)) return;
diff --git a/src/middleware/index.js b/src/middleware/index.js
index 89bb113..525f483 100644
--- a/src/middleware/index.js
+++ b/src/middleware/index.js
@@ -4,10 +4,10 @@ import serialize from 'serialize-javascript';
import escape_html from 'escape-html';
import { route_manager, templates, create_app, compilers, generate_asset_cache } from 'sapper/core.js';
import create_watcher from './create_watcher.js';
-import { dest, dev } from '../config.js';
+import { dest, dev, entry, src } from '../config.js';
function connect_dev() {
- create_app();
+ create_app({ dev, entry, src });
const watcher = create_watcher();
@@ -64,10 +64,12 @@ function connect_dev() {
}
function connect_prod() {
- const asset_cache = generate_asset_cache(
- read_json(path.join(dest, 'stats.client.json')),
- read_json(path.join(dest, 'stats.server.json'))
- );
+ const asset_cache = generate_asset_cache({
+ src, dest,
+ dev: false,
+ client_info: read_json(path.join(dest, 'stats.client.json')),
+ server_info: read_json(path.join(dest, 'stats.server.json'))
+ });
const middleware = compose_handlers([
set_req_pathname,
diff --git a/test/common/test.js b/test/common/test.js
index efe7216..db90ff8 100644
--- a/test/common/test.js
+++ b/test/common/test.js
@@ -1,13 +1,5 @@
-import * as path from 'path';
-import * as assert from 'assert';
-
-// import express from 'express';
-// import Nightmare from 'nightmare';
-// import serve from 'serve-static';
-// import walkSync from 'walk-sync';
-// import fetch from 'node-fetch';
-
-// TODO reintegrate these as imports
+const path = require('path');
+const assert = require('assert');
const Nightmare = require('nightmare');
const express = require('express');
const serve = require('serve-static');
@@ -94,8 +86,10 @@ function run(env) {
}
return exec_promise.then(() => {
- const resolved = require.resolve('../..');
+ const resolved = require.resolve('../../middleware.js');
delete require.cache[resolved];
+ delete require.cache[require.resolve('../../core.js')]; // TODO remove this
+
sapper = require(resolved);
return require('get-port')();
diff --git a/test/unit/create_routes.test.js b/test/unit/create_routes.test.js
index 8c2b291..2ece078 100644
--- a/test/unit/create_routes.test.js
+++ b/test/unit/create_routes.test.js
@@ -1,6 +1,5 @@
-import * as assert from 'assert';
-
-import create_routes from '../../src/core/utils/create_routes.js';
+const assert = require('assert');
+const { create_routes } = require('../../core.js');
describe('create_routes', () => {
it('sorts routes correctly', () => {
diff --git a/webpack/config.js b/webpack/config.js
index 0b51e8e..be6bfba 100644
--- a/webpack/config.js
+++ b/webpack/config.js
@@ -68,3 +68,4 @@ var index = {
};
module.exports = index;
+//# sourceMappingURL=config.js.map
diff --git a/webpack/config.js.map b/webpack/config.js.map
new file mode 100644
index 0000000..1be5aa7
--- /dev/null
+++ b/webpack/config.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"config.js","sources":["../src/config.js","../src/webpack/index.js"],"sourcesContent":["import * as path from 'path';\nimport mkdirp from 'mkdirp';\nimport rimraf from 'rimraf';\n\nexport const dev = process.env.NODE_ENV !== 'production';\n\nexport const templates = path.resolve(process.env.SAPPER_TEMPLATES || 'templates');\n\nexport const src = path.resolve(process.env.SAPPER_ROUTES || 'routes');\n\nexport const dest = path.resolve(process.env.SAPPER_DEST || '.sapper');\n\nif (dev) {\n\tmkdirp.sync(dest);\n\trimraf.sync(path.join(dest, '**/*'));\n}\n\nexport const entry = {\n\tclient: path.resolve(templates, '.main.rendered.js'),\n\tserver: path.resolve(dest, 'server-entry.js')\n};","import { dest, dev, entry } from '../config.js';\n\nexport default {\n\tdev,\n\n\tclient: {\n\t\tentry: () => {\n\t\t\treturn {\n\t\t\t\tmain: [\n\t\t\t\t\tentry.client,\n\t\t\t\t\t// workaround for https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/456\n\t\t\t\t\t'style-loader/lib/addStyles',\n\t\t\t\t\t'css-loader/lib/css-base'\n\t\t\t\t]\n\t\t\t};\n\t\t},\n\n\t\toutput: () => {\n\t\t\treturn {\n\t\t\t\tpath: `${dest}/client`,\n\t\t\t\tfilename: '[name].[hash].js',\n\t\t\t\tchunkFilename: '[name].[id].[hash].js',\n\t\t\t\tpublicPath: '/client/'\n\t\t\t};\n\t\t}\n\t},\n\n\tserver: {\n\t\tentry: () => {\n\t\t\treturn {\n\t\t\t\tmain: entry.server\n\t\t\t};\n\t\t},\n\n\t\toutput: () => {\n\t\t\treturn {\n\t\t\t\tpath: `${dest}/server`,\n\t\t\t\tfilename: '[name].[hash].js',\n\t\t\t\tchunkFilename: '[name].[id].[hash].js',\n\t\t\t\tlibraryTarget: 'commonjs2'\n\t\t\t};\n\t\t}\n\t}\n};\n"],"names":["path.resolve","path.join"],"mappings":";;;;;;;;AAIO,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;;AAEzD,AAAO,MAAM,SAAS,GAAGA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,WAAW,CAAC,CAAC;;AAEnF,AAAO,MAAM,GAAG,GAAGA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,QAAQ,CAAC,CAAC;;AAEvE,AAAO,MAAM,IAAI,GAAGA,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;;AAEvE,IAAI,GAAG,EAAE;CACR,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;CAClB,MAAM,CAAC,IAAI,CAACC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;CACrC;;AAED,AAAO,MAAM,KAAK,GAAG;CACpB,MAAM,EAAED,YAAY,CAAC,SAAS,EAAE,mBAAmB,CAAC;CACpD,MAAM,EAAEA,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC;CAC7C;;AClBD,YAAe;CACd,GAAG;;CAEH,MAAM,EAAE;EACP,KAAK,EAAE,MAAM;GACZ,OAAO;IACN,IAAI,EAAE;KACL,KAAK,CAAC,MAAM;;KAEZ,4BAA4B;KAC5B,yBAAyB;KACzB;IACD,CAAC;GACF;;EAED,MAAM,EAAE,MAAM;GACb,OAAO;IACN,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;IACtB,QAAQ,EAAE,kBAAkB;IAC5B,aAAa,EAAE,uBAAuB;IACtC,UAAU,EAAE,UAAU;IACtB,CAAC;GACF;EACD;;CAED,MAAM,EAAE;EACP,KAAK,EAAE,MAAM;GACZ,OAAO;IACN,IAAI,EAAE,KAAK,CAAC,MAAM;IAClB,CAAC;GACF;;EAED,MAAM,EAAE,MAAM;GACb,OAAO;IACN,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;IACtB,QAAQ,EAAE,kBAAkB;IAC5B,aAAa,EAAE,uBAAuB;IACtC,aAAa,EAAE,WAAW;IAC1B,CAAC;GACF;EACD;CACD,CAAC;;;;"}
\ No newline at end of file