diff --git a/.gitignore b/.gitignore index 58cad3257..910b5f3d2 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,5 @@ sapper runtime.js dist !rollup.config.js -templates/*.js \ No newline at end of file +/runtime/app.mjs +/runtime/server.mjs \ No newline at end of file diff --git a/mocha.opts b/mocha.opts index c769c5c5e..8985f6600 100644 --- a/mocha.opts +++ b/mocha.opts @@ -1,5 +1,4 @@ --require source-map-support/register ---require ts-node/register +--require sucrase/register --recursive -test/unit/*/*.ts test/apps/*/test.ts \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 571cef037..5f5fd5b5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sapper", - "version": "0.24.3", + "version": "0.26.0-alpha.4", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -81,15 +81,15 @@ "dev": true }, "@types/node": { - "version": "10.12.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.0.tgz", - "integrity": "sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ==", + "version": "10.12.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.21.tgz", + "integrity": "sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ==", "dev": true }, "@types/puppeteer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-1.9.0.tgz", - "integrity": "sha512-ZP3wL4Lqpgu4xZbz/0vQhbIZnllNEawVW3oTpEXyJg+uhf/YQgL8oeTrfoUwj9JXE9UUe53eqmgLl29/d2gjqQ==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-1.11.3.tgz", + "integrity": "sha512-i/kNectDkLqU4y8FfeMAdMv4KGVVCPUVqp+bfa5+teq0JdoAwplu7k6t38+rpAAbEmPSywf6aqWbg9JbUDJqiQ==", "dev": true, "requires": { "@types/node": "*" @@ -106,174 +106,174 @@ } }, "@webassemblyjs/ast": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.8.tgz", - "integrity": "sha512-dOrtdtEyB8sInpl75yLPNksY4sRl0j/+t6aHyB/YA+ab9hV3Fo7FmG12FHzP+2MvWVAJtDb+6eXR5EZbZJ+uVg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/wast-parser": "1.7.8" + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.8.tgz", - "integrity": "sha512-kn2zNKGsbql5i56VAgRYkpG+VazqHhQQZQycT2uXAazrAEDs23gy+Odkh5VblybjnwX2/BITkDtNmSO76hdIvQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.8.tgz", - "integrity": "sha512-xUwxDXsd1dUKArJEP5wWM5zxgCSwZApSOJyP1XO7M8rNUChUDblcLQ4FpzTpWG2YeylMwMl1MlP5Ztryiz1x4g==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.8.tgz", - "integrity": "sha512-WXiIMnuvuwlhWvVOm8xEXU9DnHaa3AgAU0ZPfvY8vO1cSsmYb2WbGbHnMLgs43vXnA7XAob9b56zuZaMkxpCBg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.8.tgz", - "integrity": "sha512-TLQxyD9qGOIdX5LPQOPo0Ernd88U5rHkFb8WAjeMIeA0sPjCHeVPaGqUGGIXjUcblUkjuDAc07bruCcNHUrHDA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.7.8" + "@webassemblyjs/wast-printer": "1.7.11" } }, "@webassemblyjs/helper-fsm": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.8.tgz", - "integrity": "sha512-TjK0CnD8hAPkV5mbSp5aWl6SO1+H3WFcjWtixWoy8EMA99YnNzYhpc/WSYWhf7yrhpzkq5tZB0tvLK3Svr3IXA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.8.tgz", - "integrity": "sha512-uCutAKR7Nm0VsFixcvnB4HhAyHouNbj0Dx1p7eRjFjXGGZ+N7ftTaG1ZbWCasAEbtwGj54LP8+lkBZdTCPmLGg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", "dev": true }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.8.tgz", - "integrity": "sha512-AdCCE3BMW6V34WYaKUmPgVHa88t2Z14P4/0LjLwuGkI0X6pf7nzp0CehzVVk51cKm2ymVXjl9dCG+gR1yhITIQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.8.tgz", - "integrity": "sha512-BkBhYQuzyl4hgTGOKo87Vdw6f9nj8HhI7WYpI0MCC5qFa5ahrAPOGgyETVdnRbv+Rjukl9MxxfDmVcVC435lDg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" } }, "@webassemblyjs/ieee754": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.8.tgz", - "integrity": "sha512-tOarWChdG1a3y1yqCX0JMDKzrat5tQe4pV6K/TX19BcXsBLYxFQOL1DEDa5KG9syeyvCrvZ+i1+Mv1ExngvktQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.8.tgz", - "integrity": "sha512-GCYeGPgUFWJiZuP4NICbcyUQNxNLJIf476Ei+K+jVuuebtLpfvwkvYT6iTUE7oZYehhkor4Zz2g7SJ/iZaPudQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", "dev": true, "requires": { "@xtuc/long": "4.2.1" } }, "@webassemblyjs/utf8": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.8.tgz", - "integrity": "sha512-9X+f0VV+xNXW2ujfIRSXBJENGE6Qh7bNVKqu3yDjTFB3ar3nsThsGBBKdTG58aXOm2iUH6v28VIf88ymPXODHA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.8.tgz", - "integrity": "sha512-6D3Hm2gFixrfyx9XjSON4ml1FZTugqpkIz5Awvrou8fnpyprVzcm4X8pyGRtA2Piixjl3DqmX/HB1xdWyE097A==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/helper-wasm-section": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8", - "@webassemblyjs/wasm-opt": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8", - "@webassemblyjs/wast-printer": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" } }, "@webassemblyjs/wasm-gen": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.8.tgz", - "integrity": "sha512-a7O/wE6eBeVKKUYgpMK7NOHmMADD85rSXLe3CqrWRDwWff5y3cSVbzpN6Qv3z6C4hdkpq9qyij1Ga1kemOZGvQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/ieee754": "1.7.8", - "@webassemblyjs/leb128": "1.7.8", - "@webassemblyjs/utf8": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" } }, "@webassemblyjs/wasm-opt": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.8.tgz", - "integrity": "sha512-3lbQ0PT81NHCdi1sR/7+SNpZadM4qYcTSr62nFFAA7e5lFwJr14M1Gi+A/Y3PgcDWOHYjsaNGPpPU0H03N6Blg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" } }, "@webassemblyjs/wasm-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.8.tgz", - "integrity": "sha512-rZ/zlhp9DHR/05zh1MbAjT2t624sjrPP/OkJCjXqzm7ynH+nIdNcn9Ixc+qzPMFXhIrk0rBoQ3to6sEIvHh9jQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-api-error": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/ieee754": "1.7.8", - "@webassemblyjs/leb128": "1.7.8", - "@webassemblyjs/utf8": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" } }, "@webassemblyjs/wast-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.8.tgz", - "integrity": "sha512-Q/zrvtUvzWuSiJMcSp90fi6gp2nraiHXjTV2VgAluVdVapM4gy1MQn7akja2p6eSBDQpKJPJ6P4TxRkghRS5dg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/floating-point-hex-parser": "1.7.8", - "@webassemblyjs/helper-api-error": "1.7.8", - "@webassemblyjs/helper-code-frame": "1.7.8", - "@webassemblyjs/helper-fsm": "1.7.8", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", "@xtuc/long": "4.2.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.8.tgz", - "integrity": "sha512-GllIthRtwTxRDAURRNXscu7Napzmdf1jt1gpiZiK/QN4fH0lSGs3OTmvdfsMNP7tqI4B3ZtfaaWRlNIQug6Xyg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/wast-parser": "1.7.8", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", "@xtuc/long": "4.2.1" } }, @@ -290,28 +290,22 @@ "dev": true }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz", + "integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA==", "dev": true }, "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true }, "acorn-jsx": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", - "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", - "dev": true, - "requires": { - "acorn": "^5.0.3" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true }, "agadoo": { "version": "1.0.1", @@ -345,9 +339,9 @@ } }, "ajv": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", - "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -356,16 +350,22 @@ "uri-js": "^4.2.2" } }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz", + "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==", "dev": true }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { @@ -383,6 +383,12 @@ "color-convert": "^1.9.0" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -738,33 +744,12 @@ "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -808,6 +793,12 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", @@ -918,9 +909,9 @@ "dev": true }, "bluebird": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", - "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", "dev": true }, "bn.js": { @@ -1068,24 +1059,33 @@ "dev": true }, "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", "y18n": "^4.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + } } }, "cache-base": { @@ -1113,19 +1113,10 @@ } } }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", + "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", "dev": true }, "camel-case": { @@ -1155,9 +1146,9 @@ "dev": true }, "cheap-watch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cheap-watch/-/cheap-watch-1.0.0.tgz", - "integrity": "sha512-ZeqXFSLfd/NzLXyFDKfa48/14nytP43gBD2Go1L1WUYLXAkEqIo4TTmp89AEbnXVOk47//sB2/16UbVs3vfijA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cheap-watch/-/cheap-watch-1.0.2.tgz", + "integrity": "sha512-jp82t+kZAW+ZVnuYuHZEGZqDaUg28uAyOhC915BcKBSYL55fpTyuJ56cYYXZG0JkCPQT80MjRD6q2KqebaPwCw==", "dev": true }, "chokidar": { @@ -1557,9 +1548,9 @@ "dev": true }, "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -1639,21 +1630,6 @@ } } }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -1665,9 +1641,9 @@ } }, "devalue": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-1.0.4.tgz", - "integrity": "sha512-R3Jef4Cw075TqqvliJ6sAiN9Ygd2onyklpgOv2qdytRKcEN8X2lsW9y6JlD2cDgbEIBWP3wVWXKfAQ1a9vD9UA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-1.1.0.tgz", + "integrity": "sha512-mKj+DaZuxevfmjI78VdlkBr+NDmwaDAKQz0t5RDSmhwBn6m5z82KDnVRKVFeUvlMOmI1fzkAUx4USdqGGhas6g==", "dev": true }, "diff": { @@ -1819,9 +1795,9 @@ "dev": true }, "eslint": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.7.0.tgz", - "integrity": "sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.12.1.tgz", + "integrity": "sha512-54NV+JkTpTu0d8+UYSA8mMKAG4XAsaOrozA9rCW7tgneg1mevcL7wIotPC+fZ0SkWwdhNqoXoxnQCTBp7UvTsg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1833,7 +1809,7 @@ "eslint-scope": "^4.0.0", "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", + "espree": "^5.0.0", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^2.0.0", @@ -1841,9 +1817,9 @@ "glob": "^7.1.2", "globals": "^11.7.0", "ignore": "^4.0.6", + "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "inquirer": "^6.1.0", - "is-resolvable": "^1.1.0", "js-yaml": "^3.12.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", @@ -1856,7 +1832,6 @@ "pluralize": "^7.0.0", "progress": "^2.0.0", "regexpp": "^2.0.1", - "require-uncached": "^1.0.3", "semver": "^5.5.1", "strip-ansi": "^4.0.0", "strip-json-comments": "^2.0.1", @@ -1892,13 +1867,13 @@ } }, "eslint-module-utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", - "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", + "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", "dev": true, "requires": { "debug": "^2.6.8", - "pkg-dir": "^1.0.0" + "pkg-dir": "^2.0.0" }, "dependencies": { "debug": { @@ -1919,21 +1894,21 @@ } }, "eslint-plugin-import": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", - "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", + "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", "dev": true, "requires": { "contains-path": "^0.1.0", - "debug": "^2.6.8", + "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.3.0", + "has": "^1.0.3", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" + "resolve": "^1.9.0" }, "dependencies": { "debug": { @@ -1960,6 +1935,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } } } }, @@ -1986,13 +1970,14 @@ "dev": true }, "espree": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", - "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", + "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", "dev": true, "requires": { - "acorn": "^5.6.0", - "acorn-jsx": "^4.1.1" + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } }, "esprima": { @@ -2038,9 +2023,9 @@ "dev": true }, "events": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, "evp_bytestokey": { @@ -2168,6 +2153,12 @@ "pend": "~1.2.0" } }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -2207,55 +2198,88 @@ } }, "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" + "pkg-dir": "^3.0.0" }, "dependencies": { "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "p-try": "^2.0.0" } }, - "pkg-dir": { + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "^2.1.0" + "find-up": "^3.0.0" } } } }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "locate-path": "^2.0.0" } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { "circular-json": "^0.3.1", - "del": "^2.0.2", "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", "write": "^0.2.1" } }, @@ -2322,9 +2346,9 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", "dev": true, "optional": true, "requires": { @@ -2334,28 +2358,24 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "bundled": true, "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "bundled": true, "dev": true }, "aproba": { "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "bundled": true, "dev": true, "optional": true }, "are-we-there-yet": { - "version": "1.1.4", - "resolved": false, - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "version": "1.1.5", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2365,14 +2385,12 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "bundled": true, "dev": true }, "brace-expansion": { "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "bundled": true, "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -2380,41 +2398,35 @@ } }, "chownr": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "version": "1.1.1", + "bundled": true, "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "bundled": true, "dev": true }, "concat-map": { "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "bundled": true, "dev": true }, "console-control-strings": { "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "bundled": true, "dev": true }, "core-util-is": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "bundled": true, "dev": true, "optional": true }, "debug": { "version": "2.6.9", - "resolved": false, - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2422,30 +2434,26 @@ } }, "deep-extend": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "version": "0.6.0", + "bundled": true, "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "bundled": true, "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bundled": true, "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", - "resolved": false, - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2454,15 +2462,13 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "bundled": true, "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2477,9 +2483,8 @@ } }, "glob": { - "version": "7.1.2", - "resolved": false, - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2493,25 +2498,22 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "bundled": true, "dev": true, "optional": true }, "iconv-lite": { - "version": "0.4.21", - "resolved": false, - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "version": "0.4.24", + "bundled": true, "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { "version": "3.0.1", - "resolved": false, - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2520,8 +2522,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2531,21 +2532,18 @@ }, "inherits": { "version": "2.0.3", - "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "bundled": true, "dev": true }, "ini": { "version": "1.3.5", - "resolved": false, - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "bundled": true, "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "bundled": true, "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -2553,15 +2551,13 @@ }, "isarray": { "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "bundled": true, "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "bundled": true, "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -2569,24 +2565,21 @@ }, "minimist": { "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "bundled": true, "dev": true }, "minipass": { - "version": "2.2.4", - "resolved": false, - "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", + "version": "2.3.5", + "bundled": true, "dev": true, "requires": { - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "version": "1.2.1", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2595,8 +2588,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "bundled": true, "dev": true, "requires": { "minimist": "0.0.8" @@ -2604,15 +2596,13 @@ }, "ms": { "version": "2.0.0", - "resolved": false, - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.2.0", - "resolved": false, - "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", + "version": "2.2.4", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2622,19 +2612,18 @@ } }, "node-pre-gyp": { - "version": "0.10.0", - "resolved": false, - "integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==", + "version": "0.10.3", + "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", - "needle": "^2.2.0", + "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", - "rc": "^1.1.7", + "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" @@ -2642,8 +2631,7 @@ }, "nopt": { "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2652,16 +2640,14 @@ } }, "npm-bundled": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", + "version": "1.0.5", + "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", - "resolved": false, - "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", + "version": "1.2.0", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2671,8 +2657,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2684,21 +2669,18 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "bundled": true, "dev": true }, "object-assign": { "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "bundled": true, "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "bundled": true, "dev": true, "requires": { "wrappy": "1" @@ -2706,22 +2688,19 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "bundled": true, "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "bundled": true, "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2731,26 +2710,23 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "bundled": true, "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", - "resolved": false, - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "bundled": true, "dev": true, "optional": true }, "rc": { - "version": "1.2.7", - "resolved": false, - "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", + "version": "1.2.8", + "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -2758,8 +2734,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "bundled": true, "dev": true, "optional": true } @@ -2767,8 +2742,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2782,60 +2756,52 @@ } }, "rimraf": { - "version": "2.6.2", - "resolved": false, - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": false, - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "version": "5.1.2", + "bundled": true, "dev": true }, "safer-buffer": { "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "bundled": true, "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "bundled": true, "dev": true, "optional": true }, "semver": { - "version": "5.5.0", - "resolved": false, - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "version": "5.6.0", + "bundled": true, "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "bundled": true, "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "bundled": true, "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "bundled": true, "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -2845,8 +2811,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -2855,8 +2820,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "bundled": true, "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -2864,54 +2828,48 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "bundled": true, "dev": true, "optional": true }, "tar": { - "version": "4.4.1", - "resolved": false, - "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", + "version": "4.4.8", + "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, "util-deprecate": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "bundled": true, "dev": true, "optional": true }, "wide-align": { - "version": "1.1.2", - "resolved": false, - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "version": "1.1.3", + "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "bundled": true, "dev": true }, "yallist": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "version": "3.0.3", + "bundled": true, "dev": true } } @@ -2968,9 +2926,9 @@ } }, "globals": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", "dev": true }, "globalyzer": { @@ -2979,20 +2937,6 @@ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", "dev": true }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "globrex": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.1.tgz", @@ -3103,9 +3047,9 @@ } }, "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -3115,7 +3059,8 @@ "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true }, "hmac-drbg": { "version": "1.0.1", @@ -3135,17 +3080,24 @@ "dev": true }, "html-minifier": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.20.tgz", - "integrity": "sha512-ZmgNLaTp54+HFKkONyLFEfs5dd/ZOtlquKaTnqIWFmx3Av5zG6ZPcV2d0o9XM2fXOTxxIf6eDcwzFFotke/5zA==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", "requires": { "camel-case": "3.0.x", "clean-css": "4.2.x", "commander": "2.17.x", - "he": "1.1.x", + "he": "1.2.x", "param-case": "2.1.x", "relateurl": "0.2.x", "uglify-js": "3.4.x" + }, + "dependencies": { + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + } } }, "https-browserify": { @@ -3202,6 +3154,16 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3231,24 +3193,52 @@ "dev": true }, "inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", + "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^3.0.0", + "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rxjs": "^6.1.0", + "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" + } + } } }, "is-accessor-descriptor": { @@ -3387,30 +3377,6 @@ "kind-of": "^3.0.2" } }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3455,12 +3421,6 @@ "has": "^1.0.1" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", @@ -3504,9 +3464,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3553,9 +3513,9 @@ } }, "kleur": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", - "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.1.tgz", + "integrity": "sha512-P3kRv+B+Ra070ng2VKQqW4qW7gd/v3iD8sy/zOdcYRsfiD+QBokQNOps/AfP6Hr48cBhIIBFWckB9aO+IZhrWg==", "dev": true }, "levn": { @@ -3568,6 +3528,12 @@ "type-check": "~0.3.2" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "load-json-file": { "version": "2.0.0", "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -3581,9 +3547,9 @@ } }, "loader-runner": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", - "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, "loader-utils": { @@ -3605,14 +3571,6 @@ "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } } }, "lodash": { @@ -3633,13 +3591,12 @@ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "yallist": "^3.0.2" } }, "magic-string": { @@ -3668,12 +3625,6 @@ } } }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3802,9 +3753,9 @@ "dev": true }, "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { "concat-stream": "^1.5.0", @@ -3813,7 +3764,7 @@ "flush-write-stream": "^1.0.0", "from2": "^2.1.0", "parallel-transform": "^1.1.0", - "pump": "^2.0.1", + "pump": "^3.0.0", "pumpify": "^1.3.3", "stream-each": "^1.1.0", "through2": "^2.0.0" @@ -3929,9 +3880,9 @@ } }, "mri": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.1.tgz", - "integrity": "sha1-haom09ru7t+A3FmEr5XMXKXK2fE=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", "dev": true }, "ms": { @@ -3946,10 +3897,21 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", "dev": true, "optional": true }, @@ -4019,15 +3981,15 @@ } }, "node-fetch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.2.0.tgz", - "integrity": "sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", "dev": true }, "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", "dev": true, "requires": { "assert": "^1.1.1", @@ -4037,7 +3999,7 @@ "constants-browserify": "^1.0.0", "crypto-browserify": "^3.11.0", "domain-browser": "^1.1.1", - "events": "^1.0.0", + "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "0.0.0", @@ -4051,7 +4013,7 @@ "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", "url": "^0.11.0", - "util": "^0.10.3", + "util": "^0.11.0", "vm-browserify": "0.0.4" }, "dependencies": { @@ -4063,6 +4025,12 @@ } } }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -4297,19 +4265,10 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "pad-right": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", - "integrity": "sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q=", - "dev": true, - "requires": { - "repeat-string": "^1.5.2" - } - }, "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", + "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", "dev": true }, "parallel-transform": { @@ -4331,17 +4290,27 @@ "no-case": "^2.2.0" } }, + "parent-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", + "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", + "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", "dev": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-glob": { @@ -4384,13 +4353,10 @@ "dev": true }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -4456,28 +4422,22 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "pirates": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.0.tgz", + "integrity": "sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA==", "dev": true, "requires": { - "pinkie": "^2.0.0" + "node-modules-regexp": "^1.0.0" } }, "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "^1.0.0" + "find-up": "^2.1.0" } }, "pluralize": { @@ -4539,9 +4499,9 @@ "dev": true }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "promise-inflight": { @@ -4562,12 +4522,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -4583,9 +4537,9 @@ } }, "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -4601,6 +4555,18 @@ "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, "punycode": { @@ -4610,30 +4576,19 @@ "dev": true }, "puppeteer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.9.0.tgz", - "integrity": "sha512-GH4PmhJf9wBRAPvtJkEJLAvdNNOofZortmBZSj8cGWYni98GUFqsf66blOEfJbo5B8l0KG5HR2d/W2MejnUrzg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.12.0.tgz", + "integrity": "sha512-+riSxJFPQpwGZvNHFeB7vEefwfdHNSstQmjdzUKZxPp/Qt1Dw9iKRAewl8X0ntdXZz4UR4jODLiM03Iw9HDnyw==", "dev": true, "requires": { - "debug": "^3.1.0", + "debug": "^4.1.0", "extract-zip": "^1.6.6", "https-proxy-agent": "^2.2.1", "mime": "^2.0.3", - "progress": "^2.0.0", + "progress": "^2.0.1", "proxy-from-env": "^1.0.0", "rimraf": "^2.6.1", - "ws": "^5.1.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "ws": "^6.1.0" } }, "querystring": { @@ -4711,17 +4666,6 @@ "requires": { "find-up": "^2.0.0", "read-pkg": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - } } }, "readable-stream": { @@ -5095,16 +5039,6 @@ "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", "dev": true }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, "resolve": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", @@ -5115,9 +5049,9 @@ } }, "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "resolve-url": { @@ -5143,12 +5077,12 @@ "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "ripemd160": { @@ -5162,13 +5096,22 @@ } }, "rollup": { - "version": "0.66.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.66.6.tgz", - "integrity": "sha512-J7/SWanrcb83vfIHqa8+aVVGzy457GcjA6GVZEnD0x2u4OnOd0Q1pCrEoNe8yLwM6z6LZP02zBT2uW0yh5TqOw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.1.2.tgz", + "integrity": "sha512-OkdMxqMl8pWoQc5D8y1cIinYQPPLV8ZkfLgCzL6SytXeNA2P7UHynEQXI9tYxuAjAMsSyvRaWnyJDLHMxq0XAg==", "dev": true, "requires": { "@types/estree": "0.0.39", - "@types/node": "*" + "@types/node": "*", + "acorn": "^6.0.5" + }, + "dependencies": { + "acorn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.6.tgz", + "integrity": "sha512-5M3G/A4uBSMIlfJ+h9W125vJvPFH/zirISsW5qfxF5YzEvXJCtolLoQvM5yZft0DvMcUrPGKPOlgEu55I6iUtA==", + "dev": true + } } }, "rollup-plugin-commonjs": { @@ -5193,20 +5136,20 @@ } }, "rollup-plugin-node-resolve": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", - "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.0.0.tgz", + "integrity": "sha512-7Ni+/M5RPSUBfUaP9alwYQiIKnKeXCOHiqBpKUl9kwp3jX5ZJtgXAait1cne6pGEVUUztPD6skIKH9Kq9sNtfw==", "dev": true, "requires": { - "builtin-modules": "^2.0.0", + "builtin-modules": "^3.0.0", "is-module": "^1.0.0", - "resolve": "^1.1.6" + "resolve": "^1.8.1" }, "dependencies": { "builtin-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", - "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.0.0.tgz", + "integrity": "sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg==", "dev": true } } @@ -5249,25 +5192,33 @@ } } }, - "rollup-plugin-svelte": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-4.3.2.tgz", - "integrity": "sha512-aGFuB+hc9c5pmPCgnXiJCbRwrDw7sdPia+WBRKTMEwVv3ygiSOi5gIlGHIPRMvMisioOk0ns5Bu5Gz57JxEZTg==", + "rollup-plugin-sucrase": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-sucrase/-/rollup-plugin-sucrase-2.1.0.tgz", + "integrity": "sha512-chdA3OruR1FH/IIKrzZCpGKLXAx3DOHoK24RIPtlVccK0wbTpHE0HpGEQYCxte1XaB17NgRe/frFyKR7g45qxQ==", "dev": true, "requires": { - "require-relative": "^0.8.7", "rollup-pluginutils": "^2.3.0", - "sourcemap-codec": "^1.4.1" + "sucrase": "3.x" } }, - "rollup-plugin-typescript": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript/-/rollup-plugin-typescript-1.0.0.tgz", - "integrity": "sha512-d2KDNMJXgaaB//dDGd/YmyMiopt1Pz965Iu3zmEoL08YqNcKRBz26uHqqc47rFGfrJV5kFqifC9IYlh6dpSCLg==", + "rollup-plugin-svelte": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.0.1.tgz", + "integrity": "sha512-iwm4ANbdoEQqoCL8m70R3F2Oe/auSr0zIOBVVJWx7IMSkzFZjhd0PeqzKe3BWCllLAnBXIbqTSOHmU2mnvy0SA==", "dev": true, "requires": { - "resolve": "^1.8.1", - "rollup-pluginutils": "^2.3.1" + "require-relative": "^0.8.7", + "rollup-pluginutils": "^2.3.3", + "sourcemap-codec": "^1.4.4" + }, + "dependencies": { + "sourcemap-codec": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", + "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", + "dev": true + } } }, "rollup-plugin-virtual": { @@ -5305,22 +5256,21 @@ } }, "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "sade": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.4.1.tgz", - "integrity": "sha512-r2S6GwNeYFYx02w2SYUfhYI9PzxdfNWxsX1QpI3Z4rK9bu9K3FtNVg2awp54Y9iivcYqR2iWqI3nT5jEihNyBg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.4.2.tgz", + "integrity": "sha512-MTrQm+Nhl4m1mbssYDgAculC/HbShjj08QtHnA2GTpzivfU5aUp8EoHlECmrIHEaa8hZRZSp2Gygv8VMlpXEBw==", "dev": true, "requires": { - "mri": "^1.1.0", - "pad-right": "^0.2.2" + "mri": "^1.1.0" } }, "safe-buffer": { @@ -5372,9 +5322,9 @@ "dev": true }, "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", + "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", "dev": true }, "set-value": { @@ -5444,9 +5394,9 @@ } }, "shimport": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/shimport/-/shimport-0.0.11.tgz", - "integrity": "sha512-wRlG/wMuV/czrzJEWBUPjydU/Ve0kTrTH8wHLRjuY6S2BDB+qDDXkTY/WrNc/7t5jnd0LPVO1sRIE7Ga6uXTpw==" + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/shimport/-/shimport-0.0.14.tgz", + "integrity": "sha512-JfzpHhyZ6CYuPYUSitFNw2/IxWEABLN1chs9xDHnn4tPXXCmfIn1METCmIl8Vwvm2FZGW7b8WB4zMCKaJEhY6A==" }, "signal-exit": { "version": "3.0.2", @@ -5466,11 +5416,13 @@ } }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" } }, @@ -5628,9 +5580,9 @@ } }, "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -5643,9 +5595,9 @@ "dev": true }, "sourcemap-codec": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.3.tgz", - "integrity": "sha512-vFrY/x/NdsD7Yc8mpTJXuao9S8lq08Z/kOITHz6b7YbfI9xL8Spe5EvSQUHOI7SbpY8bRPr0U3kKSsPuqEGSfA==" + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", + "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==" }, "spdx-correct": { "version": "3.0.2", @@ -5695,12 +5647,12 @@ "dev": true }, "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "safe-buffer": "^5.1.1" + "figgy-pudding": "^3.5.1" } }, "static-extend": { @@ -5725,9 +5677,9 @@ } }, "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { "inherits": "~2.0.1", @@ -5819,6 +5771,26 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "sucrase": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.9.5.tgz", + "integrity": "sha512-gvNjd3PJ0WAXxWUAQzCw/nlG4J5a2j7q8jN+sX8Fwe3ryIsl9UrEcWPxWoEzBPrj3Fias4U05iN84m4/IFQLdw==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.0" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5829,9 +5801,9 @@ } }, "svelte": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-2.13.5.tgz", - "integrity": "sha512-Mg4+vRwAT1IMR4FAH3cOmMaVVrJ35xUI1qsTW+WoJvRpeBDx7aLZUbgBXnctxdfEJQ4BuP2MCuhYKy8917Au1A==", + "version": "3.0.0-alpha27", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.0.0-alpha27.tgz", + "integrity": "sha512-ykVDgZWpFcCZo3QkciGkQuwLhPM0XmgcJzzz5/srOEf8hfgk+XSaZS9UB9JrQiT7horAU/kA06aYSLaScCxxKw==", "dev": true }, "svelte-dev-helper": { @@ -5841,9 +5813,9 @@ "dev": true }, "svelte-loader": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/svelte-loader/-/svelte-loader-2.11.0.tgz", - "integrity": "sha512-+Q24lBhQ8KGB9flHNXjKqq9TJEIcT3VJlzsxhijqrJ9feK9bUG3TLDlosceoAXvOsjxuaHKN1ZveUbbX7J7zUQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/svelte-loader/-/svelte-loader-2.12.0.tgz", + "integrity": "sha512-mxkjxHecbWl3KzhlwWm4C/Mid4Anhk611sEG31aa0BwdELIgLSaAxSJkxJrrFxxNgEKGKyTSeUI3blKNM+3s8Q==", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -5852,29 +5824,87 @@ } }, "table": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", - "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/table/-/table-5.2.2.tgz", + "integrity": "sha512-f8mJmuu9beQEDkKHLzOv4VxVYlU68NpdzjbGPl69i4Hx0sTopJuNxuzJd17iV2h24dAfa93u794OnDA5jqXvfQ==", "dev": true, "requires": { - "ajv": "^6.5.3", - "lodash": "^4.17.10", - "slice-ansi": "1.0.0", + "ajv": "^6.6.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.0.0", "string-width": "^2.1.1" } }, "tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", - "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", "dev": true }, + "terser": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.14.1.tgz", + "integrity": "sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.6" + } + }, + "terser-webpack-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz", + "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.8.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "through": { "version": "2.3.8", "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -5882,12 +5912,12 @@ "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, @@ -5976,30 +6006,6 @@ "matchit": "^1.0.0" } }, - "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, - "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", @@ -6026,12 +6032,6 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "typescript": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.3.tgz", - "integrity": "sha512-+81MUSyX+BaSo+u2RbozuQk/UWx6hfG0a5gHu4ANEM4sU96XbuIyAB+rWBW1u70c6a5QuZfuYICn3s2UjuHUpA==", - "dev": true - }, "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", @@ -6041,40 +6041,6 @@ "source-map": "~0.6.1" } }, - "uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "schema-utils": "^0.4.5", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-es": "^3.3.4", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - } - } - } - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -6225,9 +6191,9 @@ "dev": true }, "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { "inherits": "2.0.3" @@ -6270,17 +6236,17 @@ } }, "webpack": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.20.2.tgz", - "integrity": "sha512-75WFUMblcWYcocjSLlXCb71QuGyH7egdBZu50FtBGl2Nso8CK3Ej+J7bTZz2FPFq5l6fzCisD9modB7t30ikuA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.0.tgz", + "integrity": "sha512-pxdGG0keDBtamE1mNvT5zyBdx+7wkh6mh7uzMOo/uRQ/fhsdj5FXkh/j5mapzs060forql1oXqXN9HJGju+y7w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-module-context": "1.7.8", - "@webassemblyjs/wasm-edit": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", "ajv": "^6.1.0", "ajv-keywords": "^3.1.0", "chrome-trace-event": "^1.0.0", @@ -6296,7 +6262,7 @@ "node-libs-browser": "^2.0.0", "schema-utils": "^0.4.4", "tapable": "^1.1.0", - "uglifyjs-webpack-plugin": "^1.2.4", + "terser-webpack-plugin": "^1.1.0", "watchpack": "^1.5.0", "webpack-sources": "^1.3.0" }, @@ -6593,12 +6559,12 @@ } }, "webpack-format-messages": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/webpack-format-messages/-/webpack-format-messages-2.0.3.tgz", - "integrity": "sha512-NjIB6eC3PBz6q7FTxMZ15339LWjyvLHeuJ17HTSV/syLZq71O7p6NS4qDaazUr0Qf8ZnzyVapg49Nxssi/dxcg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/webpack-format-messages/-/webpack-format-messages-2.0.5.tgz", + "integrity": "sha512-URo5MWlxsYNFjyKmK5RUjrmr45JBMs/juWPIxOkDU2bcTwCblyn0zTUw+ZWASBJCnJBgWZ4SOeGWFfCBYLarpA==", "dev": true, "requires": { - "kleur": "^2.0.1" + "kleur": "^3.0.0" } }, "webpack-sources": { @@ -6651,9 +6617,9 @@ } }, "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.3.tgz", + "integrity": "sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==", "dev": true, "requires": { "async-limiter": "~1.0.0" @@ -6672,9 +6638,9 @@ "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true }, "yauzl": { @@ -6686,12 +6652,6 @@ "fd-slicer": "~1.0.1" } }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true - }, "yootils": { "version": "0.0.14", "resolved": "https://registry.npmjs.org/yootils/-/yootils-0.0.14.tgz", diff --git a/package.json b/package.json index 16a5509e1..9e4ab9d27 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sapper", - "version": "0.25.0", + "version": "0.26.0-alpha.4", "description": "Military-grade apps, engineered by Svelte", "bin": { "sapper": "./sapper" @@ -11,61 +11,64 @@ "config", "sapper", "dist/*.js", - "templates/*.js" + "runtime/*.mjs", + "runtime/internal" ], "directories": { "test": "test" }, "dependencies": { - "html-minifier": "^3.5.20", - "shimport": "0.0.11", - "source-map-support": "^0.5.9", - "sourcemap-codec": "^1.4.3", + "html-minifier": "^3.5.21", + "shimport": "0.0.14", + "source-map-support": "^0.5.10", + "sourcemap-codec": "^1.4.4", "string-hash": "^1.1.3", "tslib": "^1.9.3" }, "devDependencies": { "@types/mkdirp": "^0.5.2", "@types/mocha": "^5.2.5", - "@types/node": "^10.12.0", - "@types/puppeteer": "^1.9.0", + "@types/node": "^10.12.21", + "@types/puppeteer": "^1.11.3", "@types/rimraf": "^2.0.2", "agadoo": "^1.0.1", - "cheap-watch": "^1.0.0", + "cheap-watch": "^1.0.2", "cookie": "^0.3.1", - "devalue": "^1.0.4", - "eslint": "^5.7.0", - "eslint-plugin-import": "^2.14.0", - "kleur": "^2.0.2", + "devalue": "^1.1.0", + "eslint": "^5.12.1", + "eslint-plugin-import": "^2.16.0", + "kleur": "^3.0.1", "mkdirp": "^0.5.1", "mocha": "^5.2.0", - "node-fetch": "^2.2.0", + "node-fetch": "^2.3.0", "npm-run-all": "^4.1.5", "polka": "^0.5.1", "port-authority": "^1.0.5", "pretty-bytes": "^5.1.0", - "puppeteer": "^1.9.0", + "puppeteer": "^1.12.0", "require-relative": "^0.8.7", - "rimraf": "^2.6.2", - "rollup": "^0.66.6", + "rimraf": "^2.6.3", + "rollup": "^1.1.2", "rollup-plugin-commonjs": "^9.2.0", "rollup-plugin-json": "^3.1.0", - "rollup-plugin-node-resolve": "^3.4.0", + "rollup-plugin-node-resolve": "^4.0.0", "rollup-plugin-replace": "^2.1.0", "rollup-plugin-string": "^2.0.2", - "rollup-plugin-svelte": "^4.3.2", - "rollup-plugin-typescript": "^1.0.0", - "sade": "^1.4.1", + "rollup-plugin-sucrase": "^2.1.0", + "rollup-plugin-svelte": "^5.0.1", + "sade": "^1.4.2", "sander": "^0.6.0", "sirv": "^0.2.2", - "svelte": "^2.13.5", - "svelte-loader": "^2.11.0", - "ts-node": "^7.0.1", - "typescript": "^3.1.3", - "webpack": "^4.20.2", - "webpack-format-messages": "^2.0.3", + "sucrase": "^3.9.5", + "svelte": "^3.0.0-alpha27", + "svelte-loader": "^2.12.0", + "webpack": "^4.29.0", + "webpack-format-messages": "^2.0.5", "yootils": "0.0.14" }, + "peerDependencies": { + "svelte": "^3.0.0" + }, "scripts": { "test": "mocha --opts mocha.opts", "pretest": "npm run build", @@ -73,7 +76,7 @@ "prepare": "npm run build", "dev": "rollup -cw", "prepublishOnly": "npm test", - "update_mime_types": "curl http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types | grep -e \"^[^#]\" > templates/src/server/middleware/mime-types.md" + "update_mime_types": "curl http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types | grep -e \"^[^#]\" > runtime/src/server/middleware/mime-types.md" }, "repository": "https://github.com/sveltejs/sapper", "keywords": [ diff --git a/rollup.config.js b/rollup.config.js index 7e13cd6f0..333082f2e 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,4 +1,4 @@ -import typescript from 'rollup-plugin-typescript'; +import sucrase from 'rollup-plugin-sucrase'; import string from 'rollup-plugin-string'; import json from 'rollup-plugin-json'; import resolve from 'rollup-plugin-node-resolve'; @@ -12,31 +12,33 @@ const external = [].concat( 'sapper/core.js' ); -function template(kind, external, target) { +function template(kind, external) { return { - input: `templates/src/${kind}/index.ts`, + input: `runtime/src/${kind}/index.ts`, output: { - file: `templates/${kind}.js`, - format: 'es' + file: `runtime/${kind}.mjs`, + format: 'es', + paths: id => id.replace('@sapper', '.') }, external, plugins: [ - resolve(), + resolve({ + extensions: ['.mjs', '.js', '.ts'] + }), commonjs(), string({ include: '**/*.md' }), - typescript({ - typescript: require('typescript'), - target + sucrase({ + transforms: ['typescript'] }) ] }; } export default [ - template('client', ['__ROOT__', '__ERROR__'], 'ES2017'), - template('server', builtinModules, 'ES2015'), + template('app', id => /^(svelte\/?|@sapper\/)/.test(id)), + template('server', id => builtinModules.includes(id)), { input: [ @@ -54,12 +56,13 @@ export default [ external, plugins: [ json(), - resolve(), + resolve({ + extensions: ['.mjs', '.js', '.ts'] + }), commonjs(), - typescript({ - typescript: require('typescript') + sucrase({ + transforms: ['typescript'] }) - ], - experimentalCodeSplitting: true + ] } ]; \ No newline at end of file diff --git a/runtime/internal/Sapper.html b/runtime/internal/Sapper.html new file mode 100644 index 000000000..2203d7656 --- /dev/null +++ b/runtime/internal/Sapper.html @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/runtime/internal/layout.html b/runtime/internal/layout.html new file mode 100644 index 000000000..8c0dcbb0a --- /dev/null +++ b/runtime/internal/layout.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/runtime/internal/shared.mjs b/runtime/internal/shared.mjs new file mode 100644 index 000000000..534a6bf02 --- /dev/null +++ b/runtime/internal/shared.mjs @@ -0,0 +1,10 @@ +import { writable } from 'svelte/store'; + +export const stores = { + preloading: writable(false), + page: writable(null) +}; + +export const CONTEXT_KEY = {}; + +export const preload = () => ({}); \ No newline at end of file diff --git a/runtime/src/app/app.ts b/runtime/src/app/app.ts new file mode 100644 index 000000000..21c0451c0 --- /dev/null +++ b/runtime/src/app/app.ts @@ -0,0 +1,341 @@ +import { writable } from 'svelte/store.mjs'; +import Sapper from '@sapper/internal/Sapper.html'; +import { stores } from '@sapper/internal/shared'; +import { Root, root_preload, ErrorComponent, ignore, components, routes } from '@sapper/internal/manifest-client'; +import { + Target, + ScrollPosition, + Component, + Redirect, + ComponentLoader, + ComponentConstructor, + Route, + Page +} from './types'; +import goto from './goto'; + +declare const __SAPPER__; +export const initial_data = typeof __SAPPER__ !== 'undefined' && __SAPPER__; + +let ready = false; +let root_component: Component; +let current_token: {}; +let root_preloaded: Promise; +let current_branch = []; + +const session = writable(initial_data && initial_data.session); + +let $session; +let session_dirty: boolean; + +session.subscribe(async value => { + $session = value; + + if (!ready) return; + session_dirty = true; + + const target = select_target(new URL(location.href)); + + const token = current_token = {}; + const { redirect, props, branch } = await hydrate_target(target); + if (token !== current_token) return; // a secondary navigation happened while we were loading + + await render(redirect, branch, props, target.page); +}); + +export let prefetching: { + href: string; + promise: Promise<{ redirect?: Redirect, data?: any }>; +} = null; +export function set_prefetching(href, promise) { + prefetching = { href, promise }; +} + +export let store; +export function set_store(fn) { + store = fn(initial_data.store); +} + +export let target: Node; +export function set_target(element) { + target = element; +} + +export let uid = 1; +export function set_uid(n) { + uid = n; +} + +export let cid: number; +export function set_cid(n) { + cid = n; +} + +const _history = typeof history !== 'undefined' ? history : { + pushState: (state: any, title: string, href: string) => {}, + replaceState: (state: any, title: string, href: string) => {}, + scrollRestoration: '' +}; +export { _history as history }; + +export const scroll_history: Record = {}; + +export function select_target(url: URL): Target { + if (url.origin !== location.origin) return null; + if (!url.pathname.startsWith(initial_data.baseUrl)) return null; + + const path = url.pathname.slice(initial_data.baseUrl.length); + + // avoid accidental clashes between server routes and page routes + if (ignore.some(pattern => pattern.test(path))) return; + + for (let i = 0; i < routes.length; i += 1) { + const route = routes[i]; + + const match = route.pattern.exec(path); + if (match) { + const query: Record = Object.create(null); + if (url.search.length > 0) { + url.search.slice(1).split('&').forEach(searchParam => { + let [, key, value] = /([^=]*)(?:=(.*))?/.exec(decodeURIComponent(searchParam)); + value = (value || '').replace(/\+/g, ' '); + if (typeof query[key] === 'string') query[key] = [query[key]]; + if (typeof query[key] === 'object') (query[key] as string[]).push(value); + else query[key] = value; + }); + } + + const part = route.parts[route.parts.length - 1]; + const params = part.params ? part.params(match) : {}; + + const page = { path, query, params }; + + return { href: url.href, route, match, page }; + } + } +} + +export function scroll_state() { + return { + x: pageXOffset, + y: pageYOffset + }; +} + +export async function navigate(target: Target, id: number, noscroll?: boolean, hash?: string): Promise { + if (id) { + // popstate or initial navigation + cid = id; + } else { + const current_scroll = scroll_state(); + + // clicked on a link. preserve scroll state + scroll_history[cid] = current_scroll; + + id = cid = ++uid; + scroll_history[cid] = noscroll ? current_scroll : { x: 0, y: 0 }; + } + + cid = id; + + if (root_component) stores.preloading.set(true); + + const loaded = prefetching && prefetching.href === target.href ? + prefetching.promise : + hydrate_target(target); + + prefetching = null; + + const token = current_token = {}; + const { redirect, props, branch } = await loaded; + if (token !== current_token) return; // a secondary navigation happened while we were loading + + await render(redirect, branch, props, target.page); + if (document.activeElement) document.activeElement.blur(); + + if (!noscroll) { + let scroll = scroll_history[id]; + + if (hash) { + // scroll is an element id (from a hash), we need to compute y. + const deep_linked = document.querySelector(hash); + + if (deep_linked) { + scroll = { + x: 0, + y: deep_linked.getBoundingClientRect().top + }; + } + } + + scroll_history[cid] = scroll; + if (scroll) scrollTo(scroll.x, scroll.y); + } +} + +async function render(redirect: Redirect, branch: any[], props: any, page: Page) { + if (redirect) return goto(redirect.location, { replaceState: true }); + + stores.page.set(page); + stores.preloading.set(false); + + if (root_component) { + root_component.props = props; + } else { + // first load — remove SSR'd contents + const start = document.querySelector('#sapper-head-start'); + const end = document.querySelector('#sapper-head-end'); + + if (start && end) { + while (start.nextSibling !== end) detach(start.nextSibling); + detach(start); + detach(end); + } + + root_component = new Sapper({ + target, + props: { + Root, + props, + session + }, + hydrate: true + }); + } + + current_branch = branch; + ready = true; + session_dirty = false; +} + +export async function hydrate_target(target: Target): Promise<{ + redirect?: Redirect; + props?: any; + branch?: Array<{ Component: ComponentConstructor, preload: (page) => Promise, segment: string }> +}> { + const { route, page } = target; + const segments = page.path.split('/').filter(Boolean); + + let redirect: Redirect = null; + let error: { statusCode: number, message: Error | string } = null; + + const preload_context = { + fetch: (url: string, opts?: any) => fetch(url, opts), + redirect: (statusCode: number, location: string) => { + if (redirect && (redirect.statusCode !== statusCode || redirect.location !== location)) { + throw new Error(`Conflicting redirects`); + } + redirect = { statusCode, location }; + }, + error: (statusCode: number, message: Error | string) => { + error = { statusCode, message }; + } + }; + + if (!root_preloaded) { + root_preloaded = initial_data.preloaded[0] || root_preload.call(preload_context, { + path: page.path, + query: page.query, + params: {} + }, $session); + } + + let branch; + + try { + branch = await Promise.all(route.parts.map(async (part, i) => { + if (!part) return null; + + const segment = segments[i]; + if (!session_dirty && current_branch[i] && current_branch[i].segment === segment) return current_branch[i]; + + const { default: Component, preload } = await load_component(components[part.i]); + + let preloaded; + if (ready || !initial_data.preloaded[i + 1]) { + preloaded = preload + ? await preload.call(preload_context, { + path: page.path, + query: page.query, + params: part.params ? part.params(target.match) : {} + }, $session) + : {}; + } else { + preloaded = initial_data.preloaded[i + 1]; + } + + return { Component, preloaded, segment }; + })); + } catch (e) { + error = { statusCode: 500, message: e }; + branch = []; + } + + if (redirect) return { redirect }; + + if (error) { + // TODO be nice if this was less of a special case + return { + props: { + child: { + component: ErrorComponent, + props: { + error: typeof error.message === 'string' ? new Error(error.message) : error.message, + status: error.statusCode + } + } + }, + branch + }; + } + + const props = Object.assign({}, await root_preloaded, { + child: { segment: segments[0] } + }); + + let level = props.child; + + branch.forEach((node, i) => { + if (!node) return; + + level.component = node.Component; + level.props = Object.assign({}, node.preloaded, { + child: { segment: segments[i + 1] } + }); + + level = level.props.child; + }); + + return { props, branch }; +} + +function load_css(chunk: string) { + const href = `client/${chunk}`; + if (document.querySelector(`link[href="${href}"]`)) return; + + return new Promise((fulfil, reject) => { + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.href = href; + + link.onload = () => fulfil(); + link.onerror = reject; + + document.head.appendChild(link); + }); +} + +export function load_component(component: ComponentLoader): Promise<{ + default: ComponentConstructor, + preload?: (input: any) => any +}> { + // TODO this is temporary — once placeholders are + // always rewritten, scratch the ternary + const promises: Array> = (typeof component.css === 'string' ? [] : component.css.map(load_css)); + promises.unshift(component.js()); + return Promise.all(promises).then(values => values[0]); +} + +function detach(node: Node) { + node.parentNode.removeChild(node); +} \ No newline at end of file diff --git a/templates/src/client/goto/index.ts b/runtime/src/app/goto/index.ts similarity index 70% rename from templates/src/client/goto/index.ts rename to runtime/src/app/goto/index.ts index 29757edad..0241b2c65 100644 --- a/templates/src/client/goto/index.ts +++ b/runtime/src/app/goto/index.ts @@ -1,7 +1,7 @@ -import { history, select_route, navigate, cid } from '../app'; +import { history, select_target, navigate, cid } from '../app'; export default function goto(href: string, opts = { replaceState: false }) { - const target = select_route(new URL(href, document.baseURI)); + const target = select_target(new URL(href, document.baseURI)); if (target) { history[opts.replaceState ? 'replaceState' : 'pushState']({ id: cid }, '', href); diff --git a/runtime/src/app/index.ts b/runtime/src/app/index.ts new file mode 100644 index 000000000..5d0900e66 --- /dev/null +++ b/runtime/src/app/index.ts @@ -0,0 +1,12 @@ +import { getContext } from 'svelte'; +import { CONTEXT_KEY, stores } from '@sapper/internal/shared'; + +export const preloading = { subscribe: stores.preloading.subscribe }; +export const page = { subscribe: stores.page.subscribe }; + +export const getSession = () => getContext(CONTEXT_KEY); + +export { default as start } from './start/index'; +export { default as goto } from './goto/index'; +export { default as prefetch } from './prefetch/index'; +export { default as prefetchRoutes } from './prefetchRoutes/index'; \ No newline at end of file diff --git a/runtime/src/app/prefetch/index.ts b/runtime/src/app/prefetch/index.ts new file mode 100644 index 000000000..d959ef3ed --- /dev/null +++ b/runtime/src/app/prefetch/index.ts @@ -0,0 +1,14 @@ +import { select_target, prefetching, set_prefetching, hydrate_target } from '../app'; +import { Target } from '../types'; + +export default function prefetch(href: string) { + const target: Target = select_target(new URL(href, document.baseURI)); + + if (target) { + if (!prefetching || href !== prefetching.href) { + set_prefetching(href, hydrate_target(target)); + } + + return prefetching.promise; + } +} \ No newline at end of file diff --git a/templates/src/client/prefetchRoutes/index.ts b/runtime/src/app/prefetchRoutes/index.ts similarity index 50% rename from templates/src/client/prefetchRoutes/index.ts rename to runtime/src/app/prefetchRoutes/index.ts index b3c2f3cb2..f1e4596b0 100644 --- a/templates/src/client/prefetchRoutes/index.ts +++ b/runtime/src/app/prefetchRoutes/index.ts @@ -1,11 +1,12 @@ -import { components, pages, load_component } from "../app"; +import { components, routes } from '@sapper/internal/manifest-client'; +import { load_component } from '../app'; export default function prefetchRoutes(pathnames: string[]) { - return pages - .filter(route => { - if (!pathnames) return true; - return pathnames.some(pathname => route.pattern.test(pathname)); - }) + return routes + .filter(pathnames + ? route => pathnames.some(pathname => route.pattern.test(pathname)) + : () => true + ) .reduce((promise: Promise, route) => promise.then(() => { return Promise.all(route.parts.map(part => part && load_component(components[part.i]))); }), Promise.resolve()); diff --git a/templates/src/client/start/index.ts b/runtime/src/app/start/index.ts similarity index 91% rename from templates/src/client/start/index.ts rename to runtime/src/app/start/index.ts index 99c01e9fc..e371d83b2 100644 --- a/templates/src/client/start/index.ts +++ b/runtime/src/app/start/index.ts @@ -5,26 +5,22 @@ import { navigate, scroll_history, scroll_state, - select_route, - set_store, + select_target, set_target, uid, set_uid, set_cid } from '../app'; import prefetch from '../prefetch/index'; -import { Store, ScrollPosition } from '../types'; export default function start(opts: { - target: Node, - store?: (data: any) => Store + target: Node }) { if ('scrollRestoration' in history) { history.scrollRestoration = 'manual'; } set_target(opts.target); - if (opts.store) set_store(opts.store); addEventListener('click', handle_click); addEventListener('popstate', handle_popstate); @@ -39,7 +35,7 @@ export default function start(opts: { history.replaceState({ id: uid }, '', href); if (!initial_data.error) { - const target = select_route(new URL(location.href)); + const target = select_target(new URL(location.href)); if (target) return navigate(target, uid, false, hash); } }); @@ -96,7 +92,7 @@ function handle_click(event: MouseEvent) { // Don't handle hash changes if (url.pathname === location.pathname && url.search === location.search) return; - const target = select_route(url); + const target = select_target(url); if (target) { const noscroll = a.hasAttribute('sapper-noscroll'); navigate(target, null, noscroll, url.hash); @@ -119,7 +115,7 @@ function handle_popstate(event: PopStateEvent) { if (event.state) { const url = new URL(location.href); - const target = select_route(url); + const target = select_target(url); if (target) { navigate(target, event.state.id); } else { diff --git a/templates/src/client/types.ts b/runtime/src/app/types.ts similarity index 78% rename from templates/src/client/types.ts rename to runtime/src/app/types.ts index 2a2858240..9a78e1869 100644 --- a/templates/src/client/types.ts +++ b/runtime/src/app/types.ts @@ -8,21 +8,14 @@ type Child = { component?: Component; }; -export type RootProps = { - path: string; - params: Record; - query: Record; - child: Child; -}; - export interface ComponentConstructor { - new (options: { target: Node, data: any, store: Store, hydrate: boolean }): Component; + new (options: { target: Node, props: any, hydrate: boolean }): Component; preload: (props: { params: Params, query: Query }) => Promise; }; export interface Component { - set: (data: any) => void; - destroy: () => void; + $set: (data: any) => void; + $destroy: () => void; } export type ComponentLoader = { @@ -30,7 +23,7 @@ export type ComponentLoader = { css: string[] }; -export type Page = { +export type Route = { pattern: RegExp; parts: Array<{ i: number; @@ -42,7 +35,7 @@ export type Manifest = { ignore: RegExp[]; root: ComponentConstructor; error: () => Promise<{ default: ComponentConstructor }>; - pages: Page[] + pages: Route[] }; export type ScrollPosition = { @@ -51,11 +44,10 @@ export type ScrollPosition = { }; export type Target = { - url: URL; - path: string; - page: Page; + href: string; + route: Route; match: RegExpExecArray; - query: Record; + page: Page; }; export type Redirect = { @@ -63,6 +55,8 @@ export type Redirect = { location: string; }; -export type Store = { - get: () => any; -} \ No newline at end of file +export type Page = { + path: string; + params: Record; + query: Record; +}; \ No newline at end of file diff --git a/runtime/src/server/constants.js b/runtime/src/server/constants.js new file mode 100644 index 000000000..468742b44 --- /dev/null +++ b/runtime/src/server/constants.js @@ -0,0 +1 @@ +export const IGNORE = '__SAPPER__IGNORE__'; \ No newline at end of file diff --git a/templates/src/server/index.ts b/runtime/src/server/index.ts similarity index 100% rename from templates/src/server/index.ts rename to runtime/src/server/index.ts diff --git a/templates/src/server/middleware/get_page_handler.ts b/runtime/src/server/middleware/get_page_handler.ts similarity index 83% rename from templates/src/server/middleware/get_page_handler.ts rename to runtime/src/server/middleware/get_page_handler.ts index 0cb3eae59..4b57ded91 100644 --- a/templates/src/server/middleware/get_page_handler.ts +++ b/runtime/src/server/middleware/get_page_handler.ts @@ -1,15 +1,19 @@ -import * as fs from 'fs'; -import * as path from 'path'; +import { writable } from 'svelte/store.mjs'; +import fs from 'fs'; +import path from 'path'; import cookie from 'cookie'; import devalue from 'devalue'; import fetch from 'node-fetch'; -import { URL, resolve } from 'url'; -import { build_dir, dev, src_dir, IGNORE } from '../placeholders'; -import { Manifest, Page, Props, Req, Res, Store } from './types'; +import URL from 'url'; +import { IGNORE } from '../constants'; +import { Manifest, Page, Props, Req, Res } from './types'; +import { build_dir, dev, src_dir } from '@sapper/internal/manifest-server'; +import { stores } from '@sapper/internal/shared'; +import Sapper from '@sapper/internal/Sapper.html'; export function get_page_handler( manifest: Manifest, - store_getter: (req: Req, res: Res) => Store + session_getter: (req: Req, res: Res) => any ) { const get_build_info = dev ? () => JSON.parse(fs.readFileSync(path.join(build_dir, 'build.json'), 'utf-8')) @@ -77,7 +81,7 @@ export function get_page_handler( res.setHeader('Link', link); } - const store = store_getter ? store_getter(req, res) : null; + const session = session_getter(req, res); let redirect: { statusCode: number, location: string }; let preload_error: { statusCode: number, message: Error | string }; @@ -94,7 +98,7 @@ export function get_page_handler( preload_error = { statusCode, message }; }, fetch: (url: string, opts?: any) => { - const parsed = new URL(url, `http://127.0.0.1:${process.env.PORT}${req.baseUrl ? req.baseUrl + '/' :''}`); + const parsed = new URL.URL(url, `http://127.0.0.1:${process.env.PORT}${req.baseUrl ? req.baseUrl + '/' :''}`); if (opts) { opts = Object.assign({}, opts); @@ -128,16 +132,16 @@ export function get_page_handler( } return fetch(parsed.href, opts); - }, - store + } }; let preloaded; let match; + let params; try { - const root_preloaded = manifest.root.preload - ? manifest.root.preload.call(preload_context, { + const root_preloaded = manifest.root_preload + ? manifest.root_preload.call(preload_context, { path: req.path, query: req.query, params: {} @@ -146,17 +150,21 @@ export function get_page_handler( match = error ? null : page.pattern.exec(req.path); + let toPreload = [root_preloaded]; if (!isSWIndexHtml) { toPreload = toPreload.concat(page.parts.map(part => { if (!part) return null; - return part.component.preload - ? part.component.preload.call(preload_context, { + // the deepest level is used below, to initialise the store + params = part.params ? part.params(match) : {}; + + return part.preload + ? part.preload.call(preload_context, { path: req.path, query: req.query, - params: part.params ? part.params(match) : {} - }) + params + }, session) : {}; })) } @@ -169,7 +177,7 @@ export function get_page_handler( try { if (redirect) { - const location = resolve(req.baseUrl || '/', redirect.location); + const location = URL.resolve(req.baseUrl || '/', redirect.location); res.statusCode = redirect.statusCode; res.setHeader('Location', location); @@ -183,67 +191,63 @@ export function get_page_handler( return; } - const serialized = { - preloaded: `[${preloaded.map(data => try_serialize(data)).join(',')}]`, - store: store && try_serialize(store.get()) - }; - const segments = req.path.split('/').filter(Boolean); - const props: Props = { - path: req.path, - query: req.query, - params: {}, - child: null - }; - - if (error) { - props.error = error instanceof Error ? error : { message: error }; - props.status = status; - } - - const data = Object.assign({}, props, preloaded[0], { - params: {}, + const props = Object.assign({}, preloaded[0], { child: { - segment: segments[0] + segment: segments[0], + props: {} } }); - let level = data.child; - if (isSWIndexHtml) { - level.props = Object.assign({}, props, { - params: {} - }) - } else { + let level = props.child; + if (!isSWIndexHtml) { for (let i = 0; i < page.parts.length; i += 1) { const part = page.parts[i]; if (!part) continue; - const get_params = part.params || (() => ({})); - Object.assign(level, { component: part.component, - props: Object.assign({}, props, { - params: get_params(match) - }, preloaded[i + 1]) + props: Object.assign({}, preloaded[i + 1]) }); level.props.child = { - segment: segments[i + 1] + segment: segments[i + 1], + props: {} }; level = level.props.child; } } - const { html, head, css } = manifest.root.render(data, { - store + if (error) { + props.child.props.error = error instanceof Error ? error : { message: error }; + props.child.props.status = status; + } + + stores.page.set({ + path: req.path, + query: req.query, + params: params + }); + + const { html, head, css } = Sapper.render({ + Root: manifest.root, + props: props, + session: writable(session) }); + const serialized = { + preloaded: `[${preloaded.map(data => try_serialize(data)).join(',')}]`, + session: session && try_serialize(session, err => { + throw new Error(`Failed to serialize session data: ${err.message}`); + }) + }; + let script = `__SAPPER__={${[ error && `error:1`, `baseUrl:"${req.baseUrl}"`, serialized.preloaded && `preloaded:${serialized.preloaded}`, - serialized.store && `store:${serialized.store}` + serialized.session && `session:${serialized.session}` ].filter(Boolean).join(',')}};`; if (has_service_worker) { @@ -302,6 +306,7 @@ export function get_page_handler( res.statusCode = status; res.end(body); } catch(err) { + console.log(err); if (error) { // we encountered an error while rendering the error page — oops res.statusCode = 500; @@ -338,10 +343,11 @@ function read_template(dir = build_dir) { return fs.readFileSync(`${dir}/template.html`, 'utf-8'); } -function try_serialize(data: any) { +function try_serialize(data: any, fail?: (err) => void) { try { return devalue(data); } catch (err) { + if (fail) fail(err); return null; } } diff --git a/templates/src/server/middleware/get_server_route_handler.ts b/runtime/src/server/middleware/get_server_route_handler.ts similarity index 97% rename from templates/src/server/middleware/get_server_route_handler.ts rename to runtime/src/server/middleware/get_server_route_handler.ts index 1e2f3db67..80bf94347 100644 --- a/templates/src/server/middleware/get_server_route_handler.ts +++ b/runtime/src/server/middleware/get_server_route_handler.ts @@ -1,4 +1,4 @@ -import { IGNORE } from '../placeholders'; +import { IGNORE } from '../constants'; import { Req, Res, ServerRoute } from './types'; export function get_server_route_handler(routes: ServerRoute[]) { diff --git a/templates/src/server/middleware/index.ts b/runtime/src/server/middleware/index.ts similarity index 90% rename from templates/src/server/middleware/index.ts rename to runtime/src/server/middleware/index.ts index f06942c3f..ba07c6c20 100644 --- a/templates/src/server/middleware/index.ts +++ b/runtime/src/server/middleware/index.ts @@ -1,16 +1,17 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import { build_dir, dev, manifest, IGNORE } from '../placeholders'; -import { Handler, Req, Res, Store } from './types'; +import fs from 'fs'; +import path from 'path'; +import { build_dir, dev, manifest } from '@sapper/internal/manifest-server'; +import { Handler, Req, Res } from './types'; import { get_server_route_handler } from './get_server_route_handler'; import { get_page_handler } from './get_page_handler'; import { lookup } from './mime'; +import { IGNORE } from '../constants'; export default function middleware(opts: { - store?: (req: Req, res: Res) => Store, + session?: (req: Req, res: Res) => any, ignore?: any } = {}) { - const { store, ignore } = opts; + const { session, ignore } = opts; let emitted_basepath = false; @@ -73,7 +74,7 @@ export default function middleware(opts: { get_server_route_handler(manifest.server_routes), - get_page_handler(manifest, store) + get_page_handler(manifest, session || noop) ].filter(Boolean)); } @@ -140,4 +141,6 @@ export function serve({ prefix, pathname, cache_control }: { next(); } }; -} \ No newline at end of file +} + +function noop(){} \ No newline at end of file diff --git a/templates/src/server/middleware/mime-types.md b/runtime/src/server/middleware/mime-types.md similarity index 100% rename from templates/src/server/middleware/mime-types.md rename to runtime/src/server/middleware/mime-types.md diff --git a/templates/src/server/middleware/mime.ts b/runtime/src/server/middleware/mime.ts similarity index 100% rename from templates/src/server/middleware/mime.ts rename to runtime/src/server/middleware/mime.ts diff --git a/templates/src/server/middleware/types.ts b/runtime/src/server/middleware/types.ts similarity index 83% rename from templates/src/server/middleware/types.ts rename to runtime/src/server/middleware/types.ts index 6d7597f2a..bcc088918 100644 --- a/templates/src/server/middleware/types.ts +++ b/runtime/src/server/middleware/types.ts @@ -12,6 +12,7 @@ export type Page = { name: string; component: Component; params?: (match: RegExpMatchArray) => Record; + preload?: (data: any) => any | Promise; }> }; @@ -19,19 +20,13 @@ export type Manifest = { server_routes: ServerRoute[]; pages: Page[]; root: Component; + root_preload?: (data: any) => any | Promise; error: Component; } export type Handler = (req: Req, res: Res, next: () => void) => void; -export type Store = { - get: () => any -}; - export type Props = { - path: string; - query: Record; - params: Record; error?: { message: string }; status?: number; child: { @@ -60,10 +55,9 @@ export interface Res extends ServerResponse { export { ServerResponse }; interface Component { - render: (data: any, opts: { store: Store }) => { + render: (data: any) => { head: string; css: { code: string, map: any }; html: string - }, - preload: (data: any) => any | Promise + } } \ No newline at end of file diff --git a/src/api/build.ts b/src/api/build.ts index c8287d6f1..b8567ee68 100644 --- a/src/api/build.ts +++ b/src/api/build.ts @@ -9,6 +9,7 @@ import read_template from '../core/read_template'; import { CompileResult } from '../core/create_compilers/interfaces'; import { noop } from './utils/noop'; import validate_bundler from './utils/validate_bundler'; +import { copy_runtime } from './utils/copy_runtime'; type Opts = { cwd?: string; @@ -26,7 +27,7 @@ export async function build({ cwd, src = 'src', routes = 'src/routes', - output = '__sapper__', + output = 'src/node_modules/@sapper', static: static_files = 'static', dest = '__sapper__/build', @@ -47,6 +48,10 @@ export async function build({ throw new Error(`Legacy builds are not supported for projects using webpack`); } + rimraf.sync(path.join(output, '**/*')); + mkdirp.sync(output); + copy_runtime(output); + rimraf.sync(path.join(dest, '**/*')); mkdirp.sync(`${dest}/client`); copy_shimport(dest); @@ -66,7 +71,7 @@ export async function build({ const manifest_data = create_manifest_data(routes); - // create src/manifest/client.js and src/manifest/server.js + // create src/node_modules/@sapper/app.mjs and server.mjs create_main_manifests({ bundler, manifest_data, diff --git a/src/api/dev.ts b/src/api/dev.ts index 54fddc92e..810d99cf9 100644 --- a/src/api/dev.ts +++ b/src/api/dev.ts @@ -15,6 +15,7 @@ import { copy_shimport } from './utils/copy_shimport'; import { ManifestData, FatalEvent, ErrorEvent, ReadyEvent, InvalidEvent } from '../interfaces'; import read_template from '../core/read_template'; import { noop } from './utils/noop'; +import { copy_runtime } from './utils/copy_runtime'; type Opts = { cwd?: string, @@ -72,7 +73,7 @@ class Watcher extends EventEmitter { cwd = '.', src = 'src', routes = 'src/routes', - output = '__sapper__', + output = 'src/node_modules/@sapper', static: static_files = 'static', dest = '__sapper__/dev', 'dev-port': dev_port, @@ -144,6 +145,11 @@ class Watcher extends EventEmitter { } const { cwd, src, dest, routes, output, static: static_files } = this.dirs; + + rimraf.sync(path.join(output, '**/*')); + mkdirp.sync(output); + copy_runtime(output); + rimraf.sync(dest); mkdirp.sync(`${dest}/client`); if (this.bundler === 'rollup') copy_shimport(dest); @@ -484,7 +490,7 @@ function watch_dir( let watch: any; let closed = false; - import('cheap-watch').then(CheapWatch => { + import('cheap-watch').then(({ default: CheapWatch }) => { if (closed) return; watch = new CheapWatch({ dir, filter, debounce: 50 }); diff --git a/src/api/utils/copy_runtime.ts b/src/api/utils/copy_runtime.ts new file mode 100644 index 000000000..ac5da2c13 --- /dev/null +++ b/src/api/utils/copy_runtime.ts @@ -0,0 +1,21 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import mkdirp from 'mkdirp'; + +const runtime = [ + 'app.mjs', + 'server.mjs', + 'internal/shared.mjs', + 'internal/Sapper.html', + 'internal/layout.html' +].map(file => ({ + file, + source: fs.readFileSync(path.join(__dirname, `../runtime/${file}`), 'utf-8') +})); + +export function copy_runtime(output: string) { + runtime.forEach(({ file, source }) => { + mkdirp.sync(path.dirname(`${output}/${file}`)); + fs.writeFileSync(`${output}/${file}`, source); + }); +} \ No newline at end of file diff --git a/src/cli.ts b/src/cli.ts index d3e86671e..aa5b9e6e4 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -10,7 +10,7 @@ const prog = sade('sapper').version(pkg.version); if (process.argv[2] === 'start') { // remove this in a future version - console.error(colors.bold.red(`'sapper start' has been removed`)); + console.error(colors.bold().red(`'sapper start' has been removed`)); console.error(`Use 'node [build_dir]' instead`); process.exit(1); } @@ -29,7 +29,7 @@ prog.command('dev') .option('--src', 'Source directory', 'src') .option('--routes', 'Routes directory', 'src/routes') .option('--static', 'Static files directory', 'static') - .option('--output', 'Sapper output directory', '__sapper__') + .option('--output', 'Sapper output directory', 'src/node_modules/@sapper') .option('--build-dir', 'Development build directory', '__sapper__/dev') .action(async (opts: { port: number, @@ -74,7 +74,7 @@ prog.command('dev') watcher.on('ready', async (event: ReadyEvent) => { if (first) { - console.log(colors.bold.cyan(`> Listening on http://localhost:${event.port}`)); + console.log(colors.bold().cyan(`> Listening on http://localhost:${event.port}`)); if (opts.open) { const { exec } = await import('child_process'); exec(`open http://localhost:${event.port}`); @@ -85,7 +85,7 @@ prog.command('dev') watcher.on('invalid', (event: InvalidEvent) => { const changed = event.changed.map(filename => path.relative(process.cwd(), filename)).join(', '); - console.log(`\n${colors.bold.cyan(changed)} changed. rebuilding...`); + console.log(`\n${colors.bold().cyan(changed)} changed. rebuilding...`); }); watcher.on('error', (event: ErrorEvent) => { @@ -94,13 +94,13 @@ prog.command('dev') }); watcher.on('fatal', (event: FatalEvent) => { - console.log(colors.bold.red(`> ${event.message}`)); + console.log(colors.bold().red(`> ${event.message}`)); if (event.log) console.log(event.log); }); watcher.on('build', (event: BuildEvent) => { if (event.errors.length) { - console.log(colors.bold.red(`✗ ${event.type}`)); + console.log(colors.bold().red(`✗ ${event.type}`)); event.errors.filter(e => !e.duplicate).forEach(error => { if (error.file) console.log(colors.bold(error.file)); @@ -112,7 +112,7 @@ prog.command('dev') console.log(`${hidden} duplicate ${hidden === 1 ? 'error' : 'errors'} hidden\n`); } } else if (event.warnings.length) { - console.log(colors.bold.yellow(`• ${event.type}`)); + console.log(colors.bold().yellow(`• ${event.type}`)); event.warnings.filter(e => !e.duplicate).forEach(warning => { if (warning.file) console.log(colors.bold(warning.file)); @@ -124,11 +124,12 @@ prog.command('dev') console.log(`${hidden} duplicate ${hidden === 1 ? 'warning' : 'warnings'} hidden\n`); } } else { - console.log(`${colors.bold.green(`✔ ${event.type}`)} ${colors.gray(`(${format_milliseconds(event.duration)})`)}`); + console.log(`${colors.bold().green(`✔ ${event.type}`)} ${colors.gray(`(${format_milliseconds(event.duration)})`)}`); } }); } catch (err) { - console.log(colors.bold.red(`> ${err.message}`)); + console.log(colors.bold().red(`> ${err.message}`)); + console.log(colors.gray(err.stack)); process.exit(1); } }); @@ -141,7 +142,7 @@ prog.command('build [dest]') .option('--cwd', 'Current working directory', '.') .option('--src', 'Source directory', 'src') .option('--routes', 'Routes directory', 'src/routes') - .option('--output', 'Sapper output directory', '__sapper__') + .option('--output', 'Sapper output directory', 'src/node_modules/@sapper') .example(`build custom-dir -p 4567`) .action(async (dest = '__sapper__/build', opts: { port: string, @@ -168,9 +169,10 @@ prog.command('build [dest]') require('./server/server.js'); `.replace(/^\t+/gm, '').trim()); - console.error(`\n> Finished in ${elapsed(start)}. Type ${colors.bold.cyan(`node ${dest}`)} to run the app.`); + console.error(`\n> Finished in ${elapsed(start)}. Type ${colors.bold().cyan(`node ${dest}`)} to run the app.`); } catch (err) { - console.log(`${colors.bold.red(`> ${err.message}`)}`); + console.log(`${colors.bold().red(`> ${err.message}`)}`); + console.log(colors.gray(err.stack)); process.exit(1); } }); @@ -186,7 +188,7 @@ prog.command('export [dest]') .option('--src', 'Source directory', 'src') .option('--routes', 'Routes directory', 'src/routes') .option('--static', 'Static files directory', 'static') - .option('--output', 'Sapper output directory', '__sapper__') + .option('--output', 'Sapper output directory', 'src/node_modules/@sapper') .option('--build-dir', 'Intermediate build directory', '__sapper__/build') .action(async (dest = '__sapper__/export', opts: { build: boolean, @@ -220,24 +222,24 @@ prog.command('export [dest]') timeout: opts.timeout, oninfo: event => { - console.log(colors.bold.cyan(`> ${event.message}`)); + console.log(colors.bold().cyan(`> ${event.message}`)); }, onfile: event => { - const size_color = event.size > 150000 ? colors.bold.red : event.size > 50000 ? colors.bold.yellow : colors.bold.gray; + const size_color = event.size > 150000 ? colors.bold().red : event.size > 50000 ? colors.bold().yellow : colors.bold().gray; const size_label = size_color(left_pad(pb(event.size), 10)); const file_label = event.status === 200 ? event.file - : colors.bold[event.status >= 400 ? 'red' : 'yellow'](`(${event.status}) ${event.file}`); + : colors.bold()[event.status >= 400 ? 'red' : 'yellow'](`(${event.status}) ${event.file}`); console.log(`${size_label} ${file_label}`); } }); - console.error(`\n> Finished in ${elapsed(start)}. Type ${colors.bold.cyan(`npx serve ${dest}`)} to run the app.`); + console.error(`\n> Finished in ${elapsed(start)}. Type ${colors.bold().cyan(`npx serve ${dest}`)} to run the app.`); } catch (err) { - console.error(colors.bold.red(`> ${err.message}`)); + console.error(colors.bold().red(`> ${err.message}`)); process.exit(1); } }); diff --git a/src/core/create_compilers/RollupResult.ts b/src/core/create_compilers/RollupResult.ts index 1c44c2ce1..e75864e77 100644 --- a/src/core/create_compilers/RollupResult.ts +++ b/src/core/create_compilers/RollupResult.ts @@ -47,12 +47,13 @@ export default class RollupResult implements CompileResult { } else { for (const name in compiler.input) { const file = compiler.input[name]; - this.assets[name] = compiler.chunks.find(chunk => file in chunk.modules).fileName; + const chunk = compiler.chunks.find(chunk => file in chunk.modules); + if (chunk) this.assets[name] = chunk.fileName; } } this.summary = compiler.chunks.map(chunk => { - const size_color = chunk.code.length > 150000 ? colors.bold.red : chunk.code.length > 50000 ? colors.bold.yellow : colors.bold.white; + const size_color = chunk.code.length > 150000 ? colors.bold().red : chunk.code.length > 50000 ? colors.bold().yellow : colors.bold().white; const size_label = left_pad(pb(chunk.code.length), 10); const lines = [size_color(`${size_label} ${chunk.fileName}`)]; diff --git a/src/core/create_compilers/extract_css.ts b/src/core/create_compilers/extract_css.ts index a60d848dd..c35dcf223 100644 --- a/src/core/create_compilers/extract_css.ts +++ b/src/core/create_compilers/extract_css.ts @@ -153,7 +153,7 @@ export default function extract_css(client_result: CompileResult, components: Pa chunks_with_css.add(chunk); }); - const entry = path.resolve(dirs.src, 'client.js'); + const entry = path.resolve(dirs.src, 'app.mjs'); const entry_chunk = client_result.chunks.find(chunk => chunk.modules.indexOf(entry) !== -1); const entry_chunk_dependencies: Set = new Set([entry_chunk]); @@ -161,6 +161,8 @@ export default function extract_css(client_result: CompileResult, components: Pa // recursively find the chunks this component depends on entry_chunk_dependencies.forEach(chunk => { + if (!chunk) return; // TODO why does this happen? + chunk.imports.forEach(file => { entry_chunk_dependencies.add(lookup.get(file)); }); @@ -182,7 +184,8 @@ export default function extract_css(client_result: CompileResult, components: Pa if (!chunk) { // this should never happen! - throw new Error(`Could not find chunk that owns ${component.file}`); + return; + // throw new Error(`Could not find chunk that owns ${component.file}`); } const chunk_dependencies: Set = new Set([chunk]); @@ -190,6 +193,8 @@ export default function extract_css(client_result: CompileResult, components: Pa // recursively find the chunks this component depends on chunk_dependencies.forEach(chunk => { + if (!chunk) return; // TODO why does this happen? + chunk.imports.forEach(file => { chunk_dependencies.add(lookup.get(file)); }); diff --git a/src/core/create_manifest_data.ts b/src/core/create_manifest_data.ts index 9f470935c..41336c421 100644 --- a/src/core/create_manifest_data.ts +++ b/src/core/create_manifest_data.ts @@ -1,5 +1,6 @@ import * as fs from 'fs'; import * as path from 'path'; +import svelte from 'svelte/compiler'; import { Page, PageComponent, ServerRoute, ManifestData } from '../interfaces'; import { posixify, reserved_words } from '../utils'; @@ -9,6 +10,22 @@ export default function create_manifest_data(cwd: string): ManifestData { throw new Error(`As of Sapper 0.21, the routes/ directory should become src/routes/`); } + function has_preload(file: string) { + const source = fs.readFileSync(path.join(cwd, file), 'utf-8'); + + if (/preload/.test(source)) { + try { + const { stats } = svelte.compile(source, { + generate: false, + onwarn: () => {} + }); + return !!stats.vars.find((variable: any) => variable.module && variable.export_name === 'preload'); + } catch (err) {} + } + + return false; + } + const components: PageComponent[] = []; const pages: Page[] = []; const server_routes: ServerRoute[] = []; @@ -16,7 +33,8 @@ export default function create_manifest_data(cwd: string): ManifestData { const default_layout: PageComponent = { default: true, name: '_default_layout', - file: null + file: null, + has_preload: false }; function walk( @@ -107,7 +125,8 @@ export default function create_manifest_data(cwd: string): ManifestData { const component = fs.existsSync(index) && { name: `${get_slug(item.file)}__layout`, - file: `${item.file}/_layout.html` + file: `${item.file}/_layout.html`, + has_preload: has_preload(`${item.file}/_layout.html`) }; if (component) components.push(component); @@ -125,7 +144,8 @@ export default function create_manifest_data(cwd: string): ManifestData { else if (item.is_page) { const component = { name: get_slug(item.file), - file: item.file + file: item.file, + has_preload: has_preload(item.file) }; const parts = stack.concat({ @@ -162,7 +182,8 @@ export default function create_manifest_data(cwd: string): ManifestData { const root = fs.existsSync(root_file) ? { name: 'main', - file: '_layout.html' + file: '_layout.html', + has_preload: has_preload('_layout.html') } : default_layout; diff --git a/src/core/create_manifests.ts b/src/core/create_manifests.ts index ebe4cf4f1..a409b742e 100644 --- a/src/core/create_manifests.ts +++ b/src/core/create_manifests.ts @@ -26,17 +26,13 @@ export function create_main_manifests({ }) { if (!fs.existsSync(output)) fs.mkdirSync(output); - const path_to_routes = path.relative(output, routes); + const path_to_routes = path.relative(`${output}/internal`, routes); - const client_manifest = generate_client(manifest_data, path_to_routes, bundler, dev, dev_port); - const server_manifest = generate_server(manifest_data, path_to_routes, cwd, src, dest, dev); + const client_manifest = generate_client_manifest(manifest_data, path_to_routes, bundler, dev, dev_port); + const server_manifest = generate_server_manifest(manifest_data, path_to_routes, cwd, src, dest, dev); - write_if_changed( - `${output}/_layout.html`, - `` - ); - write_if_changed(`${output}/client.js`, client_manifest); - write_if_changed(`${output}/server.js`, server_manifest); + write_if_changed(`${output}/internal/manifest-client.mjs`, client_manifest); + write_if_changed(`${output}/internal/manifest-server.mjs`, server_manifest); } export function create_serviceworker_manifest({ manifest_data, output, client_files, static_files }: { @@ -71,16 +67,13 @@ export function create_serviceworker_manifest({ manifest_data, output, client_fi write_if_changed(`${output}/service-worker.js`, code); } -function generate_client( +function generate_client_manifest( manifest_data: ManifestData, path_to_routes: string, bundler: string, dev: boolean, dev_port?: number ) { - const template_file = path.resolve(__dirname, '../templates/client.js'); - const template = fs.readFileSync(template_file, 'utf-8'); - const page_ids = new Set(manifest_data.pages.map(page => page.pattern.toString())); @@ -100,64 +93,59 @@ function generate_client( component_indexes[component.name] = i; return `{ - js: () => import(${annotation}${stringify(source)}), - css: "__SAPPER_CSS_PLACEHOLDER:${stringify(component.file, false)}__" - }`; - }).join(',\n\t\t')} - ]`.replace(/^\t/gm, '').trim(); + js: () => import(${annotation}${stringify(source)}), + css: "__SAPPER_CSS_PLACEHOLDER:${stringify(component.file, false)}__" + }`; + }).join(',\n\t\t\t\t')} + ]`.replace(/^\t/gm, ''); let needs_decode = false; - let pages = `[ - ${manifest_data.pages.map(page => `{ - // ${page.parts[page.parts.length - 1].component.file} - pattern: ${page.pattern}, - parts: [ - ${page.parts.map(part => { - if (part === null) return 'null'; - - if (part.params.length > 0) { - needs_decode = true; - const props = part.params.map((param, i) => `${param}: d(match[${i + 1}])`); - return `{ i: ${component_indexes[part.component.name]}, params: match => ({ ${props.join(', ')} }) }`; - } - - return `{ i: ${component_indexes[part.component.name]} }`; - }).join(',\n\t\t\t\t')} - ] - }`).join(',\n\n\t\t')} - ]`.replace(/^\t/gm, '').trim(); + let routes = `[ + ${manifest_data.pages.map(page => `{ + // ${page.parts[page.parts.length - 1].component.file} + pattern: ${page.pattern}, + parts: [ + ${page.parts.map(part => { + if (part === null) return 'null'; + + if (part.params.length > 0) { + needs_decode = true; + const props = part.params.map((param, i) => `${param}: d(match[${i + 1}])`); + return `{ i: ${component_indexes[part.component.name]}, params: match => ({ ${props.join(', ')} }) }`; + } + + return `{ i: ${component_indexes[part.component.name]} }`; + }).join(',\n\t\t\t\t\t\t')} + ] + }`).join(',\n\n\t\t\t\t')} + ]`.replace(/^\t/gm, ''); if (needs_decode) { - pages = `(d => ${pages})(decodeURIComponent)` + routes = `(d => ${routes})(decodeURIComponent)` } - let footer = ''; + return ` + // This file is generated by Sapper — do not edit it! + export { default as Root } from '${stringify(get_file(path_to_routes, manifest_data.root), false)}'; + export { preload as root_preload } from '${manifest_data.root.has_preload ? stringify(get_file(path_to_routes, manifest_data.root), false) : './shared'}'; + export { default as ErrorComponent } from '${stringify(posixify(`${path_to_routes}/_error.html`), false)}'; - if (dev) { - const sapper_dev_client = posixify( - path.resolve(__dirname, '../sapper-dev-client.js') - ); + export const ignore = [${server_routes_to_ignore.map(route => route.pattern).join(', ')}]; - footer = ` + export const components = ${components}; - if (typeof window !== 'undefined') { - import(${stringify(sapper_dev_client)}).then(client => { - client.connect(${dev_port}); - }); - }`.replace(/^\t{3}/gm, ''); - } + export const routes = ${routes}; - return `// This file is generated by Sapper — do not edit it!\n` + template - .replace('__ROOT__', stringify(get_file(path_to_routes, manifest_data.root), false)) - .replace('__ERROR__', stringify(posixify(`${path_to_routes}/_error.html`), false)) - .replace('__IGNORE__', `[${server_routes_to_ignore.map(route => route.pattern).join(', ')}]`) - .replace('__COMPONENTS__', components) - .replace('__PAGES__', pages) + - footer; + ${dev ? `if (typeof window !== 'undefined') { + import(${stringify(posixify(path.resolve(__dirname, '../sapper-dev-client.js')))}).then(client => { + client.connect(${dev_port}); + }); + }` : ''} + `.replace(/^\t{2}/gm, '').trim(); } -function generate_server( +function generate_server_manifest( manifest_data: ManifestData, path_to_routes: string, cwd: string, @@ -165,29 +153,38 @@ function generate_server( dest: string, dev: boolean ) { - const template_file = path.resolve(__dirname, '../templates/server.js'); - const template = fs.readFileSync(template_file, 'utf-8'); - const imports = [].concat( - manifest_data.server_routes.map(route => - `import * as __${route.name} from ${stringify(posixify(`${path_to_routes}/${route.file}`))};`), - manifest_data.components.map(component => - `import __${component.name} from ${stringify(get_file(path_to_routes, component))};`), - `import root from ${stringify(get_file(path_to_routes, manifest_data.root))};`, + manifest_data.server_routes.map((route, i) => + `import * as route_${i} from ${stringify(posixify(`${path_to_routes}/${route.file}`))};`), + manifest_data.components.map((component, i) => + `import component_${i}${component.has_preload ? `, { preload as preload_${i} }` : ''} from ${stringify(get_file(path_to_routes, component))};`), + `import root${manifest_data.root.has_preload ? `, { preload as root_preload }` : ''} from ${stringify(get_file(path_to_routes, manifest_data.root))};`, `import error from ${stringify(posixify(`${path_to_routes}/_error.html`))};` ); + const component_lookup: Record = {}; + manifest_data.components.forEach((component, i) => { + component_lookup[component.name] = i; + }); + let code = ` + `.replace(/^\t\t/gm, '').trim(); + + const build_dir = posixify(path.relative(cwd, dest)); + const src_dir = posixify(path.relative(cwd, src)); + + return ` + // This file is generated by Sapper — do not edit it! ${imports.join('\n')} const d = decodeURIComponent; export const manifest = { server_routes: [ - ${manifest_data.server_routes.map(route => `{ + ${manifest_data.server_routes.map((route, i) => `{ // ${route.file} pattern: ${route.pattern}, - handlers: __${route.name}, + handlers: route_${i}, params: ${route.params.length > 0 ? `match => ({ ${route.params.map((param, i) => `${param}: d(match[${i + 1}])`).join(', ')} })` : `() => ({})`} @@ -205,8 +202,9 @@ function generate_server( const props = [ `name: "${part.component.name}"`, `file: ${stringify(part.component.file)}`, - `component: __${part.component.name}` - ]; + `component: component_${component_lookup[part.component.name]}`, + part.component.has_preload && `preload: preload_${component_lookup[part.component.name]}` + ].filter(Boolean); if (part.params.length > 0) { const params = part.params.map((param, i) => `${param}: d(match[${i + 1}])`); @@ -220,12 +218,16 @@ function generate_server( ], root, - + root_preload${manifest_data.root.has_preload ? '' : `: () => {}`}, error - };`.replace(/^\t\t/gm, '').trim(); + }; - const build_dir = posixify(path.relative(cwd, dest)); - const src_dir = posixify(path.relative(cwd, src)); + export const build_dir = ${JSON.stringify(build_dir)}; + + export const src_dir = ${JSON.stringify(src_dir)}; + + export const dev = ${dev ? 'true' : 'false'}; + `.replace(/^\t{2}/gm, '').trim(); return `// This file is generated by Sapper — do not edit it!\n` + template .replace('__BUILD__DIR__', JSON.stringify(build_dir)) @@ -235,9 +237,6 @@ function generate_server( } function get_file(path_to_routes: string, component: PageComponent) { - if (component.default) { - return `./_layout.html`; - } - + if (component.default) return `./layout.html`; return posixify(`${path_to_routes}/${component.file}`); } diff --git a/src/interfaces.ts b/src/interfaces.ts index 77bc68193..50dc6ab2c 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -19,14 +19,17 @@ export type Template = { stream: (req, res, data: Record>) => void; }; -export type Store = { - get: () => any; +export type WritableStore = { + set: (value: T) => void; + update: (fn: (value: T) => T) => void; + subscribe: (fn: (T: any) => void) => () => void; }; export type PageComponent = { default?: boolean; name: string; file: string; + has_preload: boolean; }; export type Page = { diff --git a/src/types.d.ts b/src/types.d.ts new file mode 100644 index 000000000..89c441840 --- /dev/null +++ b/src/types.d.ts @@ -0,0 +1 @@ +declare module 'svelte/compiler'; \ No newline at end of file diff --git a/templates/src/client/app.ts b/templates/src/client/app.ts deleted file mode 100644 index 30ba25e1d..000000000 --- a/templates/src/client/app.ts +++ /dev/null @@ -1,395 +0,0 @@ -import RootComponent from '__ROOT__'; -import ErrorComponent from '__ERROR__'; -import { - Target, - ScrollPosition, - Component, - Redirect, - ComponentLoader, - ComponentConstructor, - RootProps, - Page -} from './types'; -import goto from './goto'; - -const ignore = __IGNORE__; -export const components: ComponentLoader[] = __COMPONENTS__; -export const pages: Page[] = __PAGES__; - -let ready = false; -let root_component: Component; -let segments: string[] = []; -let current_token: {}; -let root_preload: Promise; -let root_data: any; - -const root_props: RootProps = { - path: null, - params: null, - query: null, - child: { - segment: null, - component: null, - props: {} - } -}; - -export let prefetching: { - href: string; - promise: Promise<{ redirect?: Redirect, data?: any, nullable_depth?: number, new_segments?: any }>; -} = null; -export function set_prefetching(href, promise) { - prefetching = { href, promise }; -} - -export let store; -export function set_store(fn) { - store = fn(initial_data.store); -} - -export let target: Node; -export function set_target(element) { - target = element; -} - -export let uid = 1; -export function set_uid(n) { - uid = n; -} - -export let cid: number; -export function set_cid(n) { - cid = n; -} - -export const initial_data = typeof __SAPPER__ !== 'undefined' && __SAPPER__; - -const _history = typeof history !== 'undefined' ? history : { - pushState: (state: any, title: string, href: string) => {}, - replaceState: (state: any, title: string, href: string) => {}, - scrollRestoration: '' -}; -export { _history as history }; - -export const scroll_history: Record = {}; - -export function select_route(url: URL): Target { - if (url.origin !== location.origin) return null; - if (!url.pathname.startsWith(initial_data.baseUrl)) return null; - - const path = url.pathname.slice(initial_data.baseUrl.length); - - // avoid accidental clashes between server routes and pages - if (ignore.some(pattern => pattern.test(path))) return; - - for (let i = 0; i < pages.length; i += 1) { - const page = pages[i]; - - const match = page.pattern.exec(path); - if (match) { - const query: Record = Object.create(null); - if (url.search.length > 0) { - url.search.slice(1).split('&').forEach(searchParam => { - let [, key, value] = /([^=]*)(?:=(.*))?/.exec(decodeURIComponent(searchParam)); - value = (value || '').replace(/\+/g, ' '); - if (typeof query[key] === 'string') query[key] = [query[key]]; - if (typeof query[key] === 'object') query[key].push(value); - else query[key] = value; - }); - } - return { url, path, page, match, query }; - } - } -} - -export function scroll_state() { - return { - x: pageXOffset, - y: pageYOffset - }; -} - -export function navigate(target: Target, id: number, noscroll?: boolean, hash?: string): Promise { - let scroll: ScrollPosition; - if (id) { - // popstate or initial navigation - cid = id; - } else { - const current_scroll = scroll_state(); - - // clicked on a link. preserve scroll state - scroll_history[cid] = current_scroll; - - id = cid = ++uid; - scroll_history[cid] = noscroll ? current_scroll : { x: 0, y: 0 }; - } - - cid = id; - - if (root_component) { - root_component.set({ preloading: true }); - } - const loaded = prefetching && prefetching.href === target.url.href ? - prefetching.promise : - prepare_page(target); - - prefetching = null; - - const token = current_token = {}; - - return loaded.then(({ redirect, data, nullable_depth, new_segments }) => { - if (redirect) { - return goto(redirect.location, { replaceState: true }); - } - if (new_segments) { - segments = new_segments; - } - render(data, nullable_depth, scroll_history[id], noscroll, hash, token); - if (document.activeElement) document.activeElement.blur(); - }); -} - -function render(data: any, nullable_depth: number, scroll: ScrollPosition, noscroll: boolean, hash: string, token: {}) { - if (current_token !== token) return; - - if (root_component) { - // first, clear out highest-level root component - let level = data.child; - for (let i = 0; i < nullable_depth; i += 1) { - if (i === nullable_depth) break; - level = level.props.child; - } - - const { component } = level; - level.component = null; - root_component.set({ child: data.child }); - - // then render new stuff - level.component = component; - root_component.set(data); - } else { - // first load — remove SSR'd contents - const start = document.querySelector('#sapper-head-start'); - const end = document.querySelector('#sapper-head-end'); - - if (start && end) { - while (start.nextSibling !== end) detach(start.nextSibling); - detach(start); - detach(end); - } - - Object.assign(data, root_data); - - root_component = new RootComponent({ - target, - data, - store, - hydrate: true - }); - } - - if (!noscroll) { - if (hash) { - // scroll is an element id (from a hash), we need to compute y. - const deep_linked = document.querySelector(hash); - if (deep_linked) { - scroll = { - x: 0, - y: deep_linked.getBoundingClientRect().top - }; - } - } - - scroll_history[cid] = scroll; - if (scroll) scrollTo(scroll.x, scroll.y); - } - - Object.assign(root_props, data); - ready = true; -} - -export function prepare_page(target: Target): Promise<{ - redirect?: Redirect; - data?: any; - nullable_depth?: number; -}> { - const { page, path, query } = target; - const new_segments = path.split('/').filter(Boolean); - let changed_from = 0; - - while ( - segments[changed_from] && - new_segments[changed_from] && - segments[changed_from] === new_segments[changed_from] - ) changed_from += 1; - - if (changed_from === new_segments.length) { - changed_from -= 1; - } - - let redirect: Redirect = null; - let error: { statusCode: number, message: Error | string } = null; - - const preload_context = { - store, - fetch: (url: string, opts?: any) => fetch(url, opts), - redirect: (statusCode: number, location: string) => { - if (redirect && (redirect.statusCode !== statusCode || redirect.location !== location)) { - throw new Error(`Conflicting redirects`); - } - redirect = { statusCode, location }; - }, - error: (statusCode: number, message: Error | string) => { - error = { statusCode, message }; - } - }; - - if (!root_preload) { - root_preload = RootComponent.preload - ? initial_data.preloaded[0] || RootComponent.preload.call(preload_context, { - path, - query, - params: {} - }) - : {}; - } - - return Promise.all(page.parts.map((part, i) => { - if (i < changed_from) return null; - if (!part) return null; - - return load_component(components[part.i]).then(Component => { - const req = { - path, - query, - params: part.params ? part.params(target.match) : {} - }; - - let preloaded; - if (ready || !initial_data.preloaded[i + 1]) { - preloaded = Component.preload - ? Component.preload.call(preload_context, req) - : {}; - } else { - preloaded = initial_data.preloaded[i + 1]; - } - - return Promise.resolve(preloaded).then(preloaded => { - return { Component, preloaded }; - }); - }); - })).catch(err => { - error = { statusCode: 500, message: err }; - return []; - }).then(results => { - if (root_data) { - return results; - } else { - return Promise.resolve(root_preload).then(value => { - root_data = value; - return results; - }); - } - }).then(results => { - if (redirect) { - return { redirect, new_segments }; - } - - const get_params = page.parts[page.parts.length - 1].params || (() => ({})); - const params = get_params(target.match); - - if (error) { - const props = { - path, - query, - params, - error: typeof error.message === 'string' ? new Error(error.message) : error.message, - status: error.statusCode - }; - - return { - new_segments, - data: Object.assign({}, props, { - preloading: false, - child: { - component: ErrorComponent, - props - } - }) - }; - } - - const props = { path, query, error: null, status: null }; - const data = { - path, - preloading: false, - child: Object.assign({}, root_props.child, { - segment: new_segments[0] - }) - }; - if (changed(query, root_props.query)) data.query = query; - if (changed(params, root_props.params)) data.params = params; - - let level = data.child; - let nullable_depth = 0; - - for (let i = 0; i < page.parts.length; i += 1) { - const part = page.parts[i]; - if (!part) continue; - - const get_params = part.params || (() => ({})); - - if (i < changed_from) { - level.props.path = path; - level.props.query = query; - level.props.child = Object.assign({}, level.props.child); - - nullable_depth += 1; - } else { - level.component = results[i].Component; - level.props = Object.assign({}, level.props, props, { - params: get_params(target.match), - }, results[i].preloaded); - - level.props.child = {}; - } - - level = level.props.child; - level.segment = new_segments[i + 1]; - } - - return { data, nullable_depth, new_segments }; - }); -} - -function load_css(chunk: string) { - const href = `client/${chunk}`; - if (document.querySelector(`link[href="${href}"]`)) return; - - return new Promise((fulfil, reject) => { - const link = document.createElement('link'); - link.rel = 'stylesheet'; - link.href = href; - - link.onload = () => fulfil(); - link.onerror = reject; - - document.head.appendChild(link); - }); -} - -export function load_component(component: ComponentLoader): Promise { - // TODO this is temporary — once placeholders are - // always rewritten, scratch the ternary - const promises: Array> = (typeof component.css === 'string' ? [] : component.css.map(load_css)); - promises.unshift(component.js()); - return Promise.all(promises).then(values => values[0].default); -} - -function detach(node: Node) { - node.parentNode.removeChild(node); -} - -function changed(a: Record, b: Record) { - return JSON.stringify(a) !== JSON.stringify(b); -} diff --git a/templates/src/client/index.ts b/templates/src/client/index.ts deleted file mode 100644 index f171109b1..000000000 --- a/templates/src/client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { default as start } from './start/index'; -export { default as goto } from './goto/index'; -export { default as prefetch } from './prefetch/index'; -export { default as prefetchRoutes } from './prefetchRoutes/index'; \ No newline at end of file diff --git a/templates/src/client/prefetch/index.ts b/templates/src/client/prefetch/index.ts deleted file mode 100644 index cd22c63fd..000000000 --- a/templates/src/client/prefetch/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { select_route, prefetching, set_prefetching, prepare_page } from '../app'; -import { Target } from '../types'; - -export default function prefetch(href: string) { - const target: Target = select_route(new URL(href, document.baseURI)); - - if (target) { - if (!prefetching || href !== prefetching.href) { - set_prefetching(href, prepare_page(target)); - } - - return prefetching.promise; - } -} \ No newline at end of file diff --git a/templates/src/server/placeholders.ts b/templates/src/server/placeholders.ts deleted file mode 100644 index b95b5ead7..000000000 --- a/templates/src/server/placeholders.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Manifest } from './types'; - -export const manifest: Manifest = __MANIFEST__; - -export const build_dir = __BUILD__DIR__; - -export const src_dir = __SRC__DIR__; - -export const dev = __DEV__; - -export const IGNORE = '__SAPPER__IGNORE__'; \ No newline at end of file diff --git a/test/apps/AppRunner.ts b/test/apps/AppRunner.ts index 84dd6b627..0a3d51b30 100644 --- a/test/apps/AppRunner.ts +++ b/test/apps/AppRunner.ts @@ -1,5 +1,5 @@ import * as path from 'path'; -import * as puppeteer from 'puppeteer'; +import puppeteer from 'puppeteer'; import * as ports from 'port-authority'; import { fork, ChildProcess } from 'child_process'; @@ -64,11 +64,11 @@ export class AppRunner { base: `http://localhost:${this.port}`, // helpers - start: () => this.page.evaluate(() => start()), - prefetchRoutes: () => this.page.evaluate(() => prefetchRoutes()), - prefetch: (href: string) => this.page.evaluate((href: string) => prefetch(href), href), - goto: (href: string) => this.page.evaluate((href: string) => goto(href), href), - title: () => this.page.$eval('h1', node => node.textContent) + start: () => this.page.evaluate(() => start()).then(() => void 0), + prefetchRoutes: () => this.page.evaluate(() => prefetchRoutes()).then(() => void 0), + prefetch: (href: string) => this.page.evaluate((href: string) => prefetch(href), href).then(() => void 0), + goto: (href: string) => this.page.evaluate((href: string) => goto(href), href).then(() => void 0), + title: () => this.page.$eval('h1', node => node.textContent).then(serializable => String(serializable)) }; } diff --git a/test/apps/basics/rollup.config.js b/test/apps/basics/rollup.config.js index 943b6765d..66d3e5913 100644 --- a/test/apps/basics/rollup.config.js +++ b/test/apps/basics/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/basics/src/client.js b/test/apps/basics/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/basics/src/client.js +++ b/test/apps/basics/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/basics/src/routes/[slug].html b/test/apps/basics/src/routes/[slug].html index ade66ded2..e31f6d9fd 100644 --- a/test/apps/basics/src/routes/[slug].html +++ b/test/apps/basics/src/routes/[slug].html @@ -1 +1,5 @@ -

{params.slug.toUpperCase()}

\ No newline at end of file + + +

{$page.params.slug.toUpperCase()}

\ No newline at end of file diff --git a/test/apps/basics/src/routes/b/index.html b/test/apps/basics/src/routes/b/index.html index d93079da8..8b1cfa683 100644 --- a/test/apps/basics/src/routes/b/index.html +++ b/test/apps/basics/src/routes/b/index.html @@ -1,11 +1,13 @@ -

{letter}

+ \ No newline at end of file + export let letter; + + +

{letter}

\ No newline at end of file diff --git a/test/apps/basics/src/routes/delete-test/index.html b/test/apps/basics/src/routes/delete-test/index.html index a5280cb7c..e8a2b6e97 100644 --- a/test/apps/basics/src/routes/delete-test/index.html +++ b/test/apps/basics/src/routes/delete-test/index.html @@ -1,19 +1,17 @@ - - - methods: { - del() { - fetch(`delete-test/42.json`, { method: 'DELETE' }) - .then(r => r.json()) - .then(data => { - window.deleted = data; - }); - } - } - }; - \ No newline at end of file + \ No newline at end of file diff --git a/test/apps/basics/src/routes/echo-query/index.html b/test/apps/basics/src/routes/echo-query/index.html index aa09b3549..614bb4d31 100644 --- a/test/apps/basics/src/routes/echo-query/index.html +++ b/test/apps/basics/src/routes/echo-query/index.html @@ -1 +1,5 @@ -

{JSON.stringify(query)}

\ No newline at end of file + + +

{JSON.stringify($page.query)}

\ No newline at end of file diff --git a/test/apps/basics/src/routes/unsafe-replacement.html b/test/apps/basics/src/routes/unsafe-replacement.html index 98c654fec..49fb001c0 100644 --- a/test/apps/basics/src/routes/unsafe-replacement.html +++ b/test/apps/basics/src/routes/unsafe-replacement.html @@ -1,9 +1,7 @@ -$& + - \ No newline at end of file +$& \ No newline at end of file diff --git a/test/apps/basics/src/server.js b/test/apps/basics/src/server.js index 0e7741ca1..7f090b869 100644 --- a/test/apps/basics/src/server.js +++ b/test/apps/basics/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/basics/src/service-worker.js b/test/apps/basics/src/service-worker.js index 9d2ac9db8..c80a8f4a4 100644 --- a/test/apps/basics/src/service-worker.js +++ b/test/apps/basics/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; -// `shell` is an array of all the files generated by webpack, -// `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +// `app.shell` is an array of all the files generated by webpack, +// `app.files` is an array of everything in the `static` directory +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -52,7 +52,6 @@ self.addEventListener('fetch', event => { // which Sapper has generated for you. It's not right for every // app, but if it's right for yours then uncomment this section /* - if (url.origin === self.origin && routes.find(route => route.pattern.test(url.pathname))) { event.respondWith(caches.match('/index.html')); return; } @@ -65,7 +64,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/basics/test.ts b/test/apps/basics/test.ts index f7e1ac97c..c2d28d3bd 100644 --- a/test/apps/basics/test.ts +++ b/test/apps/basics/test.ts @@ -20,19 +20,18 @@ describe('basics', function() { let prefetchRoutes: () => Promise; let prefetch: (href: string) => Promise; let goto: (href: string) => Promise; + let title: () => Promise; // hooks before(async () => { await build({ cwd: __dirname }); runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes, prefetch, goto } = await runner.start()); + ({ base, page, start, prefetchRoutes, prefetch, goto, title } = await runner.start()); }); after(() => runner.end()); - const title = () => page.$eval('h1', node => node.textContent); - it('serves /', async () => { await page.goto(base); @@ -262,7 +261,7 @@ describe('basics', function() { await page.goto(`${base}/unsafe-replacement`); await start(); - const html = await page.evaluate(() => document.body.innerHTML); + const html = String(await page.evaluate(() => document.body.innerHTML)); assert.equal(html.indexOf('%sapper'), -1); }); }); \ No newline at end of file diff --git a/test/apps/credentials/rollup.config.js b/test/apps/credentials/rollup.config.js index 045746e5e..2047c21af 100644 --- a/test/apps/credentials/rollup.config.js +++ b/test/apps/credentials/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka', 'cookie'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka', 'cookie'] }, serviceworker: { diff --git a/test/apps/credentials/src/client.js b/test/apps/credentials/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/credentials/src/client.js +++ b/test/apps/credentials/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/credentials/src/routes/credentials/index.html b/test/apps/credentials/src/routes/credentials/index.html index 688ece68e..04a19eea6 100644 --- a/test/apps/credentials/src/routes/credentials/index.html +++ b/test/apps/credentials/src/routes/credentials/index.html @@ -1,11 +1,13 @@ -

{message}

+ \ No newline at end of file + export let message; + + +

{message}

\ No newline at end of file diff --git a/test/apps/credentials/src/server.js b/test/apps/credentials/src/server.js index 2761f50b4..951243ea8 100644 --- a/test/apps/credentials/src/server.js +++ b/test/apps/credentials/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/credentials/src/service-worker.js b/test/apps/credentials/src/service-worker.js index 9d2ac9db8..8adb97a43 100644 --- a/test/apps/credentials/src/service-worker.js +++ b/test/apps/credentials/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/css/rollup.config.js b/test/apps/css/rollup.config.js index 943b6765d..66d3e5913 100644 --- a/test/apps/css/rollup.config.js +++ b/test/apps/css/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/css/src/client.js b/test/apps/css/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/css/src/client.js +++ b/test/apps/css/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/css/src/routes/bar.html b/test/apps/css/src/routes/bar.html index 876ee63df..d63d06937 100644 --- a/test/apps/css/src/routes/bar.html +++ b/test/apps/css/src/routes/bar.html @@ -1,11 +1,13 @@ - - \ No newline at end of file + import { onMount } from 'svelte'; + + export let Title; + + onMount(() => { + import('./_components/Title.html').then(mod => { + Title = mod.default; + }); + }); + + + \ No newline at end of file diff --git a/test/apps/css/src/server.js b/test/apps/css/src/server.js index 0e7741ca1..7f090b869 100644 --- a/test/apps/css/src/server.js +++ b/test/apps/css/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/css/src/service-worker.js b/test/apps/css/src/service-worker.js index 9d2ac9db8..8adb97a43 100644 --- a/test/apps/css/src/service-worker.js +++ b/test/apps/css/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/encoding/rollup.config.js b/test/apps/encoding/rollup.config.js index 943b6765d..66d3e5913 100644 --- a/test/apps/encoding/rollup.config.js +++ b/test/apps/encoding/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/encoding/src/client.js b/test/apps/encoding/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/encoding/src/client.js +++ b/test/apps/encoding/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/encoding/src/routes/echo/page/[slug].html b/test/apps/encoding/src/routes/echo/page/[slug].html index 2cdc03d9f..e2c9491b2 100644 --- a/test/apps/encoding/src/routes/echo/page/[slug].html +++ b/test/apps/encoding/src/routes/echo/page/[slug].html @@ -1,11 +1,14 @@ -

{slug} {JSON.stringify(query)}

+ \ No newline at end of file + import { page } from '@sapper/app'; + export let slug; + + +

{slug} {JSON.stringify($page.query)}

\ No newline at end of file diff --git "a/test/apps/encoding/src/routes/f\303\274nke.html" "b/test/apps/encoding/src/routes/f\303\274nke.html" index e1fba6c51..dbff62e16 100644 --- "a/test/apps/encoding/src/routes/f\303\274nke.html" +++ "b/test/apps/encoding/src/routes/f\303\274nke.html" @@ -1,11 +1,13 @@ -

{phrase}

+ \ No newline at end of file + export let phrase; + + +

{phrase}

\ No newline at end of file diff --git a/test/apps/encoding/src/server.js b/test/apps/encoding/src/server.js index 0e7741ca1..7f090b869 100644 --- a/test/apps/encoding/src/server.js +++ b/test/apps/encoding/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/encoding/src/service-worker.js b/test/apps/encoding/src/service-worker.js index 9d2ac9db8..8adb97a43 100644 --- a/test/apps/encoding/src/service-worker.js +++ b/test/apps/encoding/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/errors/rollup.config.js b/test/apps/errors/rollup.config.js index 943b6765d..66d3e5913 100644 --- a/test/apps/errors/rollup.config.js +++ b/test/apps/errors/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/errors/src/client.js b/test/apps/errors/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/errors/src/client.js +++ b/test/apps/errors/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/errors/src/routes/blog/[slug].html b/test/apps/errors/src/routes/blog/[slug].html index 8a304d0d8..1fe2daab2 100644 --- a/test/apps/errors/src/routes/blog/[slug].html +++ b/test/apps/errors/src/routes/blog/[slug].html @@ -1,19 +1,21 @@ -

{post.title}

+ \ No newline at end of file + }); + } + + + + +

{post.title}

\ No newline at end of file diff --git a/test/apps/errors/src/routes/enhance-your-calm.html b/test/apps/errors/src/routes/enhance-your-calm.html index 398584ed8..799755bfb 100644 --- a/test/apps/errors/src/routes/enhance-your-calm.html +++ b/test/apps/errors/src/routes/enhance-your-calm.html @@ -1,7 +1,5 @@ - \ No newline at end of file diff --git a/test/apps/errors/src/routes/throw.html b/test/apps/errors/src/routes/throw.html index 16b413190..4e4cc9a00 100644 --- a/test/apps/errors/src/routes/throw.html +++ b/test/apps/errors/src/routes/throw.html @@ -1,7 +1,5 @@ - \ No newline at end of file diff --git a/test/apps/errors/src/server.js b/test/apps/errors/src/server.js index 0e7741ca1..7f090b869 100644 --- a/test/apps/errors/src/server.js +++ b/test/apps/errors/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/errors/src/service-worker.js b/test/apps/errors/src/service-worker.js index 9d2ac9db8..8adb97a43 100644 --- a/test/apps/errors/src/service-worker.js +++ b/test/apps/errors/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/export/rollup.config.js b/test/apps/export/rollup.config.js index 943b6765d..66d3e5913 100644 --- a/test/apps/export/rollup.config.js +++ b/test/apps/export/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/export/src/client.js b/test/apps/export/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/export/src/client.js +++ b/test/apps/export/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/export/src/routes/blog/[slug].html b/test/apps/export/src/routes/blog/[slug].html index f44adaaaf..2febdf20d 100644 --- a/test/apps/export/src/routes/blog/[slug].html +++ b/test/apps/export/src/routes/blog/[slug].html @@ -1,11 +1,13 @@ -

{post.title}

+ \ No newline at end of file + export let post; + + +

{post.title}

\ No newline at end of file diff --git a/test/apps/export/src/routes/blog/index.html b/test/apps/export/src/routes/blog/index.html index 2eea68136..d12e4321d 100644 --- a/test/apps/export/src/routes/blog/index.html +++ b/test/apps/export/src/routes/blog/index.html @@ -1,15 +1,17 @@ + + + +

blog

{#each posts as post}

{post.title}

-{/each} - - \ No newline at end of file +{/each} \ No newline at end of file diff --git a/test/apps/export/src/server.js b/test/apps/export/src/server.js index d5a668b68..2c6932da6 100644 --- a/test/apps/export/src/server.js +++ b/test/apps/export/src/server.js @@ -1,6 +1,6 @@ import sirv from 'sirv'; import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT, NODE_ENV } = process.env; const dev = NODE_ENV === 'development'; diff --git a/test/apps/export/src/service-worker.js b/test/apps/export/src/service-worker.js index 9d2ac9db8..8adb97a43 100644 --- a/test/apps/export/src/service-worker.js +++ b/test/apps/export/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/ignore/rollup.config.js b/test/apps/ignore/rollup.config.js index 943b6765d..66d3e5913 100644 --- a/test/apps/ignore/rollup.config.js +++ b/test/apps/ignore/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/ignore/src/client.js b/test/apps/ignore/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/ignore/src/client.js +++ b/test/apps/ignore/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/ignore/src/routes/b/index.html b/test/apps/ignore/src/routes/b/index.html index d93079da8..8b1cfa683 100644 --- a/test/apps/ignore/src/routes/b/index.html +++ b/test/apps/ignore/src/routes/b/index.html @@ -1,11 +1,13 @@ -

{letter}

+ \ No newline at end of file + export let letter; + + +

{letter}

\ No newline at end of file diff --git a/test/apps/ignore/src/server.js b/test/apps/ignore/src/server.js index f987e4a2e..4a66815f6 100644 --- a/test/apps/ignore/src/server.js +++ b/test/apps/ignore/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/ignore/src/service-worker.js b/test/apps/ignore/src/service-worker.js index 9d2ac9db8..8adb97a43 100644 --- a/test/apps/ignore/src/service-worker.js +++ b/test/apps/ignore/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/layout/rollup.config.js b/test/apps/layout/rollup.config.js index 943b6765d..66d3e5913 100644 --- a/test/apps/layout/rollup.config.js +++ b/test/apps/layout/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/layout/src/client.js b/test/apps/layout/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/layout/src/client.js +++ b/test/apps/layout/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/layout/src/routes/[x]/[y]/[z].html b/test/apps/layout/src/routes/[x]/[y]/[z].html index 018f0011c..38c557539 100644 --- a/test/apps/layout/src/routes/[x]/[y]/[z].html +++ b/test/apps/layout/src/routes/[x]/[y]/[z].html @@ -1,20 +1,18 @@ -z: {segment} {count} -click me + - oncreate() { - this.set({ - segment: this.get().params.z - }); - } - }; - \ No newline at end of file +z: {$page.params.z} {count} +click me \ No newline at end of file diff --git a/test/apps/layout/src/routes/[x]/[y]/_layout.html b/test/apps/layout/src/routes/[x]/[y]/_layout.html index 7e632a3d6..401f654a7 100644 --- a/test/apps/layout/src/routes/[x]/[y]/_layout.html +++ b/test/apps/layout/src/routes/[x]/[y]/_layout.html @@ -1,22 +1,21 @@ -y: {segment} {count} - + + +y: {$page.params.y} {count} + - oncreate() { - this.set({ - segment: this.get().params.y - }); - } - }; - \ No newline at end of file +child segment: {child.segment} \ No newline at end of file diff --git a/test/apps/layout/src/server.js b/test/apps/layout/src/server.js index 0e7741ca1..7f090b869 100644 --- a/test/apps/layout/src/server.js +++ b/test/apps/layout/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/layout/src/service-worker.js b/test/apps/layout/src/service-worker.js index 9d2ac9db8..8adb97a43 100644 --- a/test/apps/layout/src/service-worker.js +++ b/test/apps/layout/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/layout/test.ts b/test/apps/layout/test.ts index 1cadbe17a..c08843285 100644 --- a/test/apps/layout/test.ts +++ b/test/apps/layout/test.ts @@ -26,10 +26,18 @@ describe('layout', function() { it('only recreates components when necessary', async () => { await page.goto(`${base}/foo/bar/baz`); - await start(); - const text1 = await page.evaluate(() => document.querySelector('#sapper').textContent); - assert.deepEqual(text1.split('\n').filter(Boolean), [ + const text1 = String(await page.evaluate(() => document.querySelector('#sapper').textContent)); + assert.deepEqual(text1.split('\n').filter(Boolean).map(str => str.trim()), [ + 'y: bar 1', + 'z: baz 1', + 'click me', + 'child segment: baz' + ]); + + await start(); + const text2 = String(await page.evaluate(() => document.querySelector('#sapper').textContent)); + assert.deepEqual(text2.split('\n').filter(Boolean).map(str => str.trim()), [ 'y: bar 1', 'z: baz 1', 'click me', @@ -39,8 +47,8 @@ describe('layout', function() { await page.click('[href="foo/bar/qux"]'); await wait(50); - const text2 = await page.evaluate(() => document.querySelector('#sapper').textContent); - assert.deepEqual(text2.split('\n').filter(Boolean), [ + const text3 = String(await page.evaluate(() => document.querySelector('#sapper').textContent)); + assert.deepEqual(text3.split('\n').filter(Boolean).map(str => str.trim()), [ 'y: bar 1', 'z: qux 2', 'click me', diff --git a/test/apps/preloading/rollup.config.js b/test/apps/preloading/rollup.config.js index 943b6765d..66d3e5913 100644 --- a/test/apps/preloading/rollup.config.js +++ b/test/apps/preloading/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/preloading/src/client.js b/test/apps/preloading/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/preloading/src/client.js +++ b/test/apps/preloading/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/preloading/src/routes/_layout.html b/test/apps/preloading/src/routes/_layout.html index 4e390979a..09606e205 100644 --- a/test/apps/preloading/src/routes/_layout.html +++ b/test/apps/preloading/src/routes/_layout.html @@ -1,15 +1,20 @@ -{#if preloading} + + + + +{#if $preloading} {/if} - - - \ No newline at end of file + \ No newline at end of file diff --git a/test/apps/preloading/src/routes/prefetch/[slug]/index.html b/test/apps/preloading/src/routes/prefetch/[slug]/index.html index d13188c74..6eebc4c80 100644 --- a/test/apps/preloading/src/routes/prefetch/[slug]/index.html +++ b/test/apps/preloading/src/routes/prefetch/[slug]/index.html @@ -1 +1,5 @@ -

{params.slug}

+ + +

{$page.params.slug}

diff --git a/test/apps/preloading/src/routes/preload-values/custom-class.html b/test/apps/preloading/src/routes/preload-values/custom-class.html index 44e94cb22..a4f04992f 100644 --- a/test/apps/preloading/src/routes/preload-values/custom-class.html +++ b/test/apps/preloading/src/routes/preload-values/custom-class.html @@ -1,17 +1,19 @@ -

{foo.bar()}

+ - return { - foo: new Foo() - }; - } - }; - \ No newline at end of file +

{foo.bar()}

\ No newline at end of file diff --git a/test/apps/preloading/src/routes/preload-values/set.html b/test/apps/preloading/src/routes/preload-values/set.html index 43066c958..03a5b01a6 100644 --- a/test/apps/preloading/src/routes/preload-values/set.html +++ b/test/apps/preloading/src/routes/preload-values/set.html @@ -1,11 +1,13 @@ -

{set.has('x')}

+ \ No newline at end of file + export let set; + + +

{set.has('x')}

\ No newline at end of file diff --git a/test/apps/preloading/src/routes/slow-preload.html b/test/apps/preloading/src/routes/slow-preload.html index 0dc35ca03..8312e4e0c 100644 --- a/test/apps/preloading/src/routes/slow-preload.html +++ b/test/apps/preloading/src/routes/slow-preload.html @@ -1,15 +1,13 @@ -

This page should never render

+ - \ No newline at end of file +

This page should never render

\ No newline at end of file diff --git a/test/apps/preloading/src/server.js b/test/apps/preloading/src/server.js index 0e7741ca1..7f090b869 100644 --- a/test/apps/preloading/src/server.js +++ b/test/apps/preloading/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/preloading/src/service-worker.js b/test/apps/preloading/src/service-worker.js index 9d2ac9db8..8adb97a43 100644 --- a/test/apps/preloading/src/service-worker.js +++ b/test/apps/preloading/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/preloading/test.ts b/test/apps/preloading/test.ts index a38592d0f..d30a8d196 100644 --- a/test/apps/preloading/test.ts +++ b/test/apps/preloading/test.ts @@ -1,4 +1,3 @@ -import * as path from 'path'; import * as assert from 'assert'; import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; @@ -17,19 +16,18 @@ describe('preloading', function() { // helpers let start: () => Promise; let prefetchRoutes: () => Promise; + let title: () => Promise; // hooks before(async () => { await build({ cwd: __dirname }); runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes } = await runner.start()); + ({ base, page, start, prefetchRoutes, title } = await runner.start()); }); after(() => runner.end()); - const title = () => page.$eval('h1', node => node.textContent); - it('serializes Set objects returned from preload', async () => { await page.goto(`${base}/preload-values/set`); diff --git a/test/apps/redirects/rollup.config.js b/test/apps/redirects/rollup.config.js index 943b6765d..66d3e5913 100644 --- a/test/apps/redirects/rollup.config.js +++ b/test/apps/redirects/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/redirects/src/client.js b/test/apps/redirects/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/redirects/src/client.js +++ b/test/apps/redirects/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/redirects/src/routes/redirect-from.html b/test/apps/redirects/src/routes/redirect-from.html index 8c419c526..2c0782855 100644 --- a/test/apps/redirects/src/routes/redirect-from.html +++ b/test/apps/redirects/src/routes/redirect-from.html @@ -1,9 +1,7 @@ -

unredirected

+ - \ No newline at end of file +

unredirected

\ No newline at end of file diff --git a/test/apps/redirects/src/routes/redirect-to-external.html b/test/apps/redirects/src/routes/redirect-to-external.html index fec2fee1c..bc713c127 100644 --- a/test/apps/redirects/src/routes/redirect-to-external.html +++ b/test/apps/redirects/src/routes/redirect-to-external.html @@ -1,9 +1,7 @@ -

unredirected

+ - \ No newline at end of file +

unredirected

\ No newline at end of file diff --git a/test/apps/redirects/src/routes/redirect-to-root.html b/test/apps/redirects/src/routes/redirect-to-root.html index 0fa438b2a..63460f157 100644 --- a/test/apps/redirects/src/routes/redirect-to-root.html +++ b/test/apps/redirects/src/routes/redirect-to-root.html @@ -1,9 +1,7 @@ -

unredirected

+ - \ No newline at end of file +

unredirected

\ No newline at end of file diff --git a/test/apps/redirects/src/server.js b/test/apps/redirects/src/server.js index 0e7741ca1..7f090b869 100644 --- a/test/apps/redirects/src/server.js +++ b/test/apps/redirects/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/redirects/src/service-worker.js b/test/apps/redirects/src/service-worker.js index 9d2ac9db8..8adb97a43 100644 --- a/test/apps/redirects/src/service-worker.js +++ b/test/apps/redirects/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/scroll/rollup.config.js b/test/apps/scroll/rollup.config.js index 943b6765d..66d3e5913 100644 --- a/test/apps/scroll/rollup.config.js +++ b/test/apps/scroll/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/scroll/src/client.js b/test/apps/scroll/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/scroll/src/client.js +++ b/test/apps/scroll/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/scroll/src/routes/another-tall-page.html b/test/apps/scroll/src/routes/another-tall-page.html index d66879b36..a67395a3c 100644 --- a/test/apps/scroll/src/routes/another-tall-page.html +++ b/test/apps/scroll/src/routes/another-tall-page.html @@ -1,2 +1,4 @@ +

Another tall page

+

element

\ No newline at end of file diff --git a/test/apps/scroll/src/routes/tall-page.html b/test/apps/scroll/src/routes/tall-page.html index 67db96769..2fdbd9dc8 100644 --- a/test/apps/scroll/src/routes/tall-page.html +++ b/test/apps/scroll/src/routes/tall-page.html @@ -1,3 +1,15 @@ + + +

A tall page

+ scroll to foo
@@ -7,18 +19,4 @@ {#if barLink} link {/if} - - - \ No newline at end of file + \ No newline at end of file diff --git a/test/apps/scroll/src/server.js b/test/apps/scroll/src/server.js index 0e7741ca1..7f090b869 100644 --- a/test/apps/scroll/src/server.js +++ b/test/apps/scroll/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/scroll/src/service-worker.js b/test/apps/scroll/src/service-worker.js index 9d2ac9db8..8adb97a43 100644 --- a/test/apps/scroll/src/service-worker.js +++ b/test/apps/scroll/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/scroll/test.ts b/test/apps/scroll/test.ts index cd9209ed5..11130ffd5 100644 --- a/test/apps/scroll/test.ts +++ b/test/apps/scroll/test.ts @@ -14,13 +14,14 @@ describe('scroll', function() { // helpers let start: () => Promise; let prefetchRoutes: () => Promise; + let title: () => Promise; // hooks before(async () => { await build({ cwd: __dirname }); runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes } = await runner.start()); + ({ base, page, start, prefetchRoutes, title } = await runner.start()); }); after(() => runner.end()); @@ -30,7 +31,7 @@ describe('scroll', function() { await start(); const scrollY = await page.evaluate(() => window.scrollY); - assert.ok(scrollY > 0, scrollY); + assert.ok(scrollY > 0, String(scrollY)); }); it('scrolls to any deeplink if it was already active', async () => { @@ -38,17 +39,17 @@ describe('scroll', function() { await start(); let scrollY = await page.evaluate(() => window.scrollY); - assert.ok(scrollY > 0, scrollY); + assert.ok(scrollY > 0, String(scrollY)); scrollY = await page.evaluate(() => { window.scrollTo(0, 0) return window.scrollY }); - assert.ok(scrollY === 0, scrollY); + assert.ok(scrollY === 0, String(scrollY)); await page.click('[href="tall-page#foo"]'); scrollY = await page.evaluate(() => window.scrollY); - assert.ok(scrollY > 0, scrollY); + assert.ok(scrollY > 0, String(scrollY)); }); it('resets scroll when a link is clicked', async () => { @@ -85,6 +86,7 @@ describe('scroll', function() { await page.click('[href="another-tall-page#bar"]'); await wait(50); + assert.equal(await title(), 'Another tall page'); const scrollY = await page.evaluate(() => window.scrollY); assert.ok(scrollY > 0); }); diff --git a/test/apps/store/rollup.config.js b/test/apps/session/rollup.config.js similarity index 85% rename from test/apps/store/rollup.config.js rename to test/apps/session/rollup.config.js index 943b6765d..66d3e5913 100644 --- a/test/apps/store/rollup.config.js +++ b/test/apps/session/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/session/src/client.js b/test/apps/session/src/client.js new file mode 100644 index 000000000..6cce7e658 --- /dev/null +++ b/test/apps/session/src/client.js @@ -0,0 +1,9 @@ +import * as sapper from '@sapper/app'; + +window.start = () => sapper.start({ + target: document.querySelector('#sapper') +}); + +window.prefetchRoutes = () => sapper.prefetchRoutes(); +window.prefetch = href => sapper.prefetch(href); +window.goto = href => sapper.goto(href); \ No newline at end of file diff --git a/test/apps/store/src/routes/_error.html b/test/apps/session/src/routes/_error.html similarity index 100% rename from test/apps/store/src/routes/_error.html rename to test/apps/session/src/routes/_error.html diff --git a/test/apps/session/src/routes/index.html b/test/apps/session/src/routes/index.html new file mode 100644 index 000000000..0cc4b7267 --- /dev/null +++ b/test/apps/session/src/routes/index.html @@ -0,0 +1 @@ +

Great success!

\ No newline at end of file diff --git a/test/apps/session/src/routes/preloaded.html b/test/apps/session/src/routes/preloaded.html new file mode 100644 index 000000000..6964d9819 --- /dev/null +++ b/test/apps/session/src/routes/preloaded.html @@ -0,0 +1,18 @@ + + + + +

{title}

+ + \ No newline at end of file diff --git a/test/apps/session/src/routes/session.html b/test/apps/session/src/routes/session.html new file mode 100644 index 000000000..6501114de --- /dev/null +++ b/test/apps/session/src/routes/session.html @@ -0,0 +1,10 @@ + + +

{$session.title}

+ + \ No newline at end of file diff --git a/test/apps/store/src/server.js b/test/apps/session/src/server.js similarity index 52% rename from test/apps/store/src/server.js rename to test/apps/session/src/server.js index c40e6900f..16d904e6d 100644 --- a/test/apps/store/src/server.js +++ b/test/apps/session/src/server.js @@ -1,6 +1,5 @@ import polka from 'polka'; -import { Store } from 'svelte/store.js'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; @@ -12,11 +11,9 @@ polka() }) .use( sapper.middleware({ - store: (req, res) => { - return new Store({ - title: `${req.hello} ${res.locals.name}` - }); - } + session: (req, res) => ({ + title: `${req.hello} ${res.locals.name}` + }) }) ) .listen(PORT); diff --git a/test/apps/store/src/service-worker.js b/test/apps/session/src/service-worker.js similarity index 91% rename from test/apps/store/src/service-worker.js rename to test/apps/session/src/service-worker.js index 9d2ac9db8..8adb97a43 100644 --- a/test/apps/store/src/service-worker.js +++ b/test/apps/session/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/store/src/template.html b/test/apps/session/src/template.html similarity index 100% rename from test/apps/store/src/template.html rename to test/apps/session/src/template.html diff --git a/test/apps/store/test.ts b/test/apps/session/test.ts similarity index 51% rename from test/apps/store/test.ts rename to test/apps/session/test.ts index a8eab1c10..3fd910f12 100644 --- a/test/apps/store/test.ts +++ b/test/apps/session/test.ts @@ -3,7 +3,7 @@ import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import { AppRunner } from '../AppRunner'; -describe('store', function() { +describe('session', function() { this.timeout(10000); let runner: AppRunner; @@ -12,25 +12,39 @@ describe('store', function() { // helpers let start: () => Promise; + let title: () => Promise; // hooks before(async () => { await build({ cwd: __dirname }); runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start } = await runner.start()); + ({ base, page, start, title } = await runner.start()); }); after(() => runner.end()); - const title = () => page.$eval('h1', node => node.textContent); + it('renders session props', async () => { + await page.goto(`${base}/session`); - it('renders store props', async () => { - await page.goto(`${base}/store`); + assert.equal(await title(), 'hello world'); + + await start(); + assert.equal(await title(), 'hello world'); + + await page.click('button'); + assert.equal(await title(), 'changed'); + }); + + it('preloads session props', async () => { + await page.goto(`${base}/preloaded`); assert.equal(await title(), 'hello world'); await start(); assert.equal(await title(), 'hello world'); + + await page.click('button'); + assert.equal(await title(), 'changed'); }); }); \ No newline at end of file diff --git a/test/apps/store/src/client.js b/test/apps/store/src/client.js deleted file mode 100644 index df664710d..000000000 --- a/test/apps/store/src/client.js +++ /dev/null @@ -1,11 +0,0 @@ -import { Store } from 'svelte/store.js'; -import * as sapper from '../__sapper__/client.js'; - -window.start = () => sapper.start({ - target: document.querySelector('#sapper'), - store: data => new Store(data) -}); - -window.prefetchRoutes = () => sapper.prefetchRoutes(); -window.prefetch = href => sapper.prefetch(href); -window.goto = href => sapper.goto(href); \ No newline at end of file diff --git a/test/apps/store/src/routes/index.html b/test/apps/store/src/routes/index.html deleted file mode 100644 index 221c0f52a..000000000 --- a/test/apps/store/src/routes/index.html +++ /dev/null @@ -1,7 +0,0 @@ -

Great success!

- -a -ok -ok - -
\ No newline at end of file diff --git a/test/apps/store/src/routes/store.html b/test/apps/store/src/routes/store.html deleted file mode 100644 index 148147a1e..000000000 --- a/test/apps/store/src/routes/store.html +++ /dev/null @@ -1 +0,0 @@ -

{$title}

\ No newline at end of file diff --git a/test/apps/with-basepath/rollup.config.js b/test/apps/with-basepath/rollup.config.js index 943b6765d..66d3e5913 100644 --- a/test/apps/with-basepath/rollup.config.js +++ b/test/apps/with-basepath/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/with-basepath/src/client.js b/test/apps/with-basepath/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/with-basepath/src/client.js +++ b/test/apps/with-basepath/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/with-basepath/src/server.js b/test/apps/with-basepath/src/server.js index b187dad91..22da3e975 100644 --- a/test/apps/with-basepath/src/server.js +++ b/test/apps/with-basepath/src/server.js @@ -1,6 +1,6 @@ import sirv from 'sirv'; import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT, NODE_ENV } = process.env; const dev = NODE_ENV === 'development'; diff --git a/test/apps/with-basepath/src/service-worker.js b/test/apps/with-basepath/src/service-worker.js index 9d2ac9db8..8adb97a43 100644 --- a/test/apps/with-basepath/src/service-worker.js +++ b/test/apps/with-basepath/src/service-worker.js @@ -1,10 +1,10 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import * as sapper from '@sapper/service-worker'; -const ASSETS = `cache${timestamp}`; +const ASSETS = `cache${sapper.timestamp}`; // `shell` is an array of all the files generated by webpack, // `files` is an array of everything in the `static` directory -const to_cache = shell.concat(ASSETS); +const to_cache = sapper.shell.concat(sapper.files); const cached = new Set(to_cache); self.addEventListener('install', event => { @@ -65,7 +65,7 @@ self.addEventListener('fetch', event => { // might prefer a cache-first approach to a network-first one.) event.respondWith( caches - .open(`offline${timestamp}`) + .open(`offline${sapper.timestamp}`) .then(async cache => { try { const response = await fetch(event.request); diff --git a/test/apps/with-sourcemaps-webpack/src/client.js b/test/apps/with-sourcemaps-webpack/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/with-sourcemaps-webpack/src/client.js +++ b/test/apps/with-sourcemaps-webpack/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/with-sourcemaps-webpack/src/server.js b/test/apps/with-sourcemaps-webpack/src/server.js index 0e7741ca1..7f090b869 100644 --- a/test/apps/with-sourcemaps-webpack/src/server.js +++ b/test/apps/with-sourcemaps-webpack/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/with-sourcemaps-webpack/src/service-worker.js b/test/apps/with-sourcemaps-webpack/src/service-worker.js index 9d2ac9db8..67da6f025 100644 --- a/test/apps/with-sourcemaps-webpack/src/service-worker.js +++ b/test/apps/with-sourcemaps-webpack/src/service-worker.js @@ -1,4 +1,4 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import { timestamp, files, shell, routes } from '@sapper/service-worker'; const ASSETS = `cache${timestamp}`; diff --git a/test/apps/with-sourcemaps-webpack/test.ts b/test/apps/with-sourcemaps-webpack/test.ts index cb0a3ca38..802fa0509 100644 --- a/test/apps/with-sourcemaps-webpack/test.ts +++ b/test/apps/with-sourcemaps-webpack/test.ts @@ -1,34 +1,20 @@ -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import * as assert from "assert"; -import { AppRunner } from '../AppRunner'; -import * as fs from "fs"; +import * as fs from 'fs'; import * as path from "path"; -describe('with-sourcemaps-webpack', function() { +describe('with-sourcemaps', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; - let prefetch: (href: string) => Promise; - let goto: (href: string) => Promise; - // hooks before(async () => { await build({ cwd: __dirname, bundler: 'webpack' }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes, prefetch, goto } = await runner.start()); }); it('does not put sourcemap files in service worker shell', async () => { - const serviceWorker = await import(`${__dirname}/__sapper__/service-worker.js`); - const shell: string[] = serviceWorker.shell; + const service_worker_source = fs.readFileSync(`${__dirname}/src/node_modules/@sapper/service-worker.js`, 'utf-8'); + const shell_source = /shell = (\[[\s\S]+?\])/.exec(service_worker_source)[1]; + const shell = JSON.parse(shell_source); assert.equal(shell.filter(_ => _.endsWith('.map')).length, 0, 'sourcemap files are not cached in SW'); @@ -37,7 +23,4 @@ describe('with-sourcemaps-webpack', function() { const sourcemapFiles = fs.readdirSync(clientShellDir).filter(_ => _.endsWith('.map')); assert.ok(sourcemapFiles.length > 0, 'sourcemap files exist'); }); - - after(() => runner.end()); - }); \ No newline at end of file diff --git a/test/apps/with-sourcemaps-webpack/webpack.config.js b/test/apps/with-sourcemaps-webpack/webpack.config.js index 40b612de7..eca656bab 100644 --- a/test/apps/with-sourcemaps-webpack/webpack.config.js +++ b/test/apps/with-sourcemaps-webpack/webpack.config.js @@ -9,7 +9,7 @@ module.exports = { entry: config.client.entry(), output: config.client.output(), resolve: { - extensions: ['.js', '.json', '.html'], + extensions: ['.mjs', '.js', '.json', '.html'], mainFields: ['svelte', 'module', 'browser', 'main'] }, module: { @@ -43,7 +43,7 @@ module.exports = { output: config.server.output(), target: 'node', resolve: { - extensions: ['.js', '.json', '.html'], + extensions: ['.mjs', '.js', '.json', '.html'], mainFields: ['svelte', 'module', 'browser', 'main'] }, module: { diff --git a/test/apps/with-sourcemaps/rollup.config.js b/test/apps/with-sourcemaps/rollup.config.js index c057e2ead..c11f9a6c3 100644 --- a/test/apps/with-sourcemaps/rollup.config.js +++ b/test/apps/with-sourcemaps/rollup.config.js @@ -22,10 +22,7 @@ export default { emitCss: true }), resolve() - ], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + ] }, server: { @@ -44,10 +41,7 @@ export default { preferBuiltins: true }) ], - external: ['sirv', 'polka'], - - // temporary, pending Rollup 1.0 - experimentalCodeSplitting: true + external: ['sirv', 'polka'] }, serviceworker: { diff --git a/test/apps/with-sourcemaps/src/client.js b/test/apps/with-sourcemaps/src/client.js index 0865a4a18..6cce7e658 100644 --- a/test/apps/with-sourcemaps/src/client.js +++ b/test/apps/with-sourcemaps/src/client.js @@ -1,4 +1,4 @@ -import * as sapper from '../__sapper__/client.js'; +import * as sapper from '@sapper/app'; window.start = () => sapper.start({ target: document.querySelector('#sapper') diff --git a/test/apps/with-sourcemaps/src/server.js b/test/apps/with-sourcemaps/src/server.js index 0e7741ca1..7f090b869 100644 --- a/test/apps/with-sourcemaps/src/server.js +++ b/test/apps/with-sourcemaps/src/server.js @@ -1,5 +1,5 @@ import polka from 'polka'; -import * as sapper from '../__sapper__/server.js'; +import * as sapper from '@sapper/server'; const { PORT } = process.env; diff --git a/test/apps/with-sourcemaps/src/service-worker.js b/test/apps/with-sourcemaps/src/service-worker.js index 9d2ac9db8..67da6f025 100644 --- a/test/apps/with-sourcemaps/src/service-worker.js +++ b/test/apps/with-sourcemaps/src/service-worker.js @@ -1,4 +1,4 @@ -import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; +import { timestamp, files, shell, routes } from '@sapper/service-worker'; const ASSETS = `cache${timestamp}`; diff --git a/test/apps/with-sourcemaps/test.ts b/test/apps/with-sourcemaps/test.ts index 1b61c2827..2d0595811 100644 --- a/test/apps/with-sourcemaps/test.ts +++ b/test/apps/with-sourcemaps/test.ts @@ -1,34 +1,20 @@ -import * as puppeteer from 'puppeteer'; import { build } from '../../../api'; import * as assert from "assert"; -import { AppRunner } from '../AppRunner'; import * as fs from 'fs'; import * as path from "path"; describe('with-sourcemaps', function() { this.timeout(10000); - let runner: AppRunner; - let page: puppeteer.Page; - let base: string; - - // helpers - let start: () => Promise; - let prefetchRoutes: () => Promise; - let prefetch: (href: string) => Promise; - let goto: (href: string) => Promise; - // hooks before(async () => { await build({ cwd: __dirname }); - - runner = new AppRunner(__dirname, '__sapper__/build/server/server.js'); - ({ base, page, start, prefetchRoutes, prefetch, goto } = await runner.start()); }); it('does not put sourcemap files in service worker shell', async () => { - const serviceWorker = await import(`${__dirname}/__sapper__/service-worker.js`); - const shell: string[] = serviceWorker.shell; + const service_worker_source = fs.readFileSync(`${__dirname}/src/node_modules/@sapper/service-worker.js`, 'utf-8'); + const shell_source = /shell = (\[[\s\S]+?\])/.exec(service_worker_source)[1]; + const shell = JSON.parse(shell_source); assert.equal(shell.filter(_ => _.endsWith('.map')).length, 0, 'sourcemap files are not cached in SW'); @@ -37,7 +23,4 @@ describe('with-sourcemaps', function() { const sourcemapFiles = fs.readdirSync(clientShellDir).filter(_ => _.endsWith('.map')); assert.ok(sourcemapFiles.length > 0, 'sourcemap files exist'); }); - - after(() => runner.end()); - }); \ No newline at end of file