├── test ├── node_modules │ ├── .gitkeep │ ├── widgets │ │ ├── index.js │ │ ├── src │ │ │ └── Foo.html │ │ └── package.json │ ├── esm-component │ │ ├── index.js │ │ ├── src │ │ │ └── Component.svelte │ │ └── package.json │ ├── esm-no-pkg-export │ │ ├── index.js │ │ └── package.json │ └── widget │ │ ├── src │ │ └── Widget.html │ │ ├── package.json │ │ └── index.js ├── sourcemap-test │ ├── src │ │ ├── main.js │ │ ├── Bar.svelte │ │ └── Foo.svelte │ └── index.html ├── filename-test │ └── src │ │ └── foo.svelte.dev │ │ ├── main.js │ │ └── index.svelte └── index.js ├── .github ├── FUNDING.yml └── workflows │ └── ci.yml.bak ├── .gitignore ├── CHANGELOG.hot.md ├── .eslintrc ├── README.md ├── LICENSE ├── package.json ├── index.d.ts ├── CHANGELOG.md ├── index.js └── pnpm-lock.yaml /test/node_modules/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/node_modules/widgets/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/node_modules/esm-component/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | open_collective: svelte 2 | -------------------------------------------------------------------------------- /test/node_modules/esm-no-pkg-export/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/node_modules/widgets/src/Foo.html: -------------------------------------------------------------------------------- 1 |

i am a widget

-------------------------------------------------------------------------------- /test/node_modules/widget/src/Widget.html: -------------------------------------------------------------------------------- 1 |

i am a widget

-------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | !test/node_modules 4 | dist 5 | -------------------------------------------------------------------------------- /test/node_modules/esm-component/src/Component.svelte: -------------------------------------------------------------------------------- 1 |

Hello, I am a component

2 | -------------------------------------------------------------------------------- /test/node_modules/widgets/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": "./index.js", 3 | "svelte.root": "src" 4 | } -------------------------------------------------------------------------------- /test/node_modules/widget/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": "./index.js", 3 | "svelte": "src/Widget.svelte" 4 | } 5 | -------------------------------------------------------------------------------- /test/sourcemap-test/src/main.js: -------------------------------------------------------------------------------- 1 | import Foo from './Foo.svelte'; 2 | 3 | new Foo({ 4 | target: document.body 5 | }); 6 | -------------------------------------------------------------------------------- /test/filename-test/src/foo.svelte.dev/main.js: -------------------------------------------------------------------------------- 1 | import App from './index.svelte'; 2 | 3 | new App({ 4 | target: document.body 5 | }); -------------------------------------------------------------------------------- /test/node_modules/esm-no-pkg-export/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": "./index.js", 3 | "exports": { 4 | ".": "./index.js" 5 | } 6 | } -------------------------------------------------------------------------------- /test/sourcemap-test/index.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /test/sourcemap-test/src/Bar.svelte: -------------------------------------------------------------------------------- 1 |

blue

2 | 3 | 8 | -------------------------------------------------------------------------------- /test/filename-test/src/foo.svelte.dev/index.svelte: -------------------------------------------------------------------------------- 1 |

Hello world!

2 | 3 | -------------------------------------------------------------------------------- /test/node_modules/widget/index.js: -------------------------------------------------------------------------------- 1 | import Widget from './src/Widget.html'; 2 | 3 | new Widget({ 4 | target: document.body 5 | }); 6 | -------------------------------------------------------------------------------- /test/node_modules/esm-component/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": "./index.js", 3 | "svelte": "src/Component.svelte", 4 | "exports": { 5 | ".": "./index.js", 6 | "./package.json": "./package.json" 7 | } 8 | } -------------------------------------------------------------------------------- /test/sourcemap-test/src/Foo.svelte: -------------------------------------------------------------------------------- 1 |

red

2 | 3 | 4 | 9 | 10 | 13 | -------------------------------------------------------------------------------- /CHANGELOG.hot.md: -------------------------------------------------------------------------------- 1 | # rollup-plugin-svelte-hot changelog 2 | 3 | :warning: **NOTE** The [other Changelog](./CHANGELOG.md) is the one of the plugin this one is mimicking. :warning: 4 | 5 | ## 1.0.0 6 | 7 | * Rebase of rollup-plugin-svelte@7 8 | * Basic Vite support 9 | 10 | ## TODO 11 | 12 | Bring back previous changelog from rollup-plugin-svelte-hot... 13 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "rules": { 4 | "indent": [ 2, "tab", { "SwitchCase": 1 } ], 5 | "quotes": [ 2, "single" ], 6 | "linebreak-style": [ 2, "unix" ], 7 | "semi": [ 2, "always" ], 8 | "keyword-spacing": [ 2, { "before": true, "after": true } ], 9 | "space-before-blocks": [ 2, "always" ], 10 | "no-mixed-spaces-and-tabs": [ 2, "smart-tabs" ], 11 | "no-cond-assign": [ 0 ] 12 | }, 13 | "env": { 14 | "es6": true, 15 | "browser": true, 16 | "mocha": true, 17 | "node": true 18 | }, 19 | "extends": "eslint:recommended", 20 | "parserOptions": { 21 | "ecmaVersion": 10, 22 | "sourceType": "module" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # rollup-plugin-svelte-hot 2 | 3 | This is a fork of official [rollup-plugin-svelte](https://github.com/rollup/rollup-plugin-svelte) with added HMR support. 4 | 5 | It supports HMR both with [Nollup](https://github.com/PepsRyuu/nollup), or [Rollup](https://github.com/rollup/rollup) with (experimental) [rollup-plugin-hot](https://github.com/rixo/rollup-plugin-hot). 6 | 7 | ## TODO 8 | 9 | A new version of this plugin has been published to close the gap in API with rollup-plugin-svelte@7+. 10 | 11 | README needs to be reviewed and updated, with new API from [last versions of rollup-plugin-svelte](https://github.com/sveltejs/rollup-plugin-svelte/blob/master/README.md). 12 | 13 | Please refer to the [legacy README](https://github.com/rixo/rollup-plugin-svelte-hot/blob/v0/README.md) for information about the previous versions of this plugin (that supports rollup-plugin-svelte v4-5 API). 14 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml.bak: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | paths-ignore: 6 | - '*.md' 7 | - 'LICENSE' 8 | - 'index.d.ts' 9 | branches: 10 | - master 11 | pull_request: 12 | paths-ignore: 13 | - '*.md' 14 | - 'LICENSE' 15 | - 'index.d.ts' 16 | branches: 17 | - master 18 | 19 | jobs: 20 | test: 21 | name: Node.js v${{ matrix.nodejs }} (${{ matrix.os }}) 22 | runs-on: ${{ matrix.os }} 23 | timeout-minutes: 3 24 | strategy: 25 | matrix: 26 | nodejs: [10, 12, 14] 27 | os: [ubuntu-latest, windows-latest, macOS-latest] 28 | steps: 29 | - uses: actions/checkout@v2 30 | - uses: actions/setup-node@v1 31 | with: 32 | node-version: ${{ matrix.nodejs }} 33 | 34 | - name: Install 35 | run: npm ci 36 | 37 | - name: Linter 38 | if: matrix.os != 'windows-latest' 39 | run: npm run lint 40 | 41 | - name: Test 42 | run: npm test 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 Rich Harris 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rollup-plugin-svelte-hot", 3 | "version": "1.0.0-8", 4 | "description": "Compile Svelte components with HMR support for Rollup or Nollup", 5 | "license": "MIT", 6 | "keywords": [ 7 | "svelte", 8 | "hot", 9 | "hmr", 10 | "nollup", 11 | "rollup" 12 | ], 13 | "bugs": { 14 | "url": "https://github.com/rixo/rollup-plugin-svelte-hot/issues" 15 | }, 16 | "homepage": "https://github.com/rixo/rollup-plugin-svelte", 17 | "main": "index.js", 18 | "types": "index.d.ts", 19 | "files": [ 20 | "index.js", 21 | "index.d.ts", 22 | "README.md", 23 | "LICENSE" 24 | ], 25 | "author": "Rich Harris", 26 | "scripts": { 27 | "lint": "eslint index.js", 28 | "test": "node test/index.js", 29 | "prepublishOnly": "npm run lint && npm test" 30 | }, 31 | "engines": { 32 | "node": ">=10" 33 | }, 34 | "peerDependencies": { 35 | "rollup": ">=2.0.0", 36 | "svelte": ">=3.5.0" 37 | }, 38 | "dependencies": { 39 | "@rollup/pluginutils": "^4.1.0", 40 | "require-relative": "^0.8.7", 41 | "svelte-hmr": "^0.14.3" 42 | }, 43 | "devDependencies": { 44 | "eslint": "^7.14.0", 45 | "rollup": "^2.33.3", 46 | "sander": "^0.6.0", 47 | "source-map": "^0.7.3", 48 | "svelte": "^3.30.0", 49 | "uvu": "^0.4.1" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | import { Plugin, RollupWarning } from 'rollup'; 2 | import { PreprocessorGroup } from 'svelte/types/compiler/preprocess'; 3 | import { CompileOptions } from 'svelte/types/compiler/interfaces'; 4 | 5 | type Arrayable = T | T[]; 6 | 7 | type WarningHandler = (warning: RollupWarning | string) => void; 8 | 9 | interface Options { 10 | /** One or more minimatch patterns */ 11 | include: Arrayable; 12 | 13 | /** One or more minimatch patterns */ 14 | exclude: Arrayable; 15 | 16 | /** 17 | * By default, all ".svelte" files are compiled 18 | * @default ['.svelte'] 19 | */ 20 | extensions: string[]; 21 | 22 | /** 23 | * Optionally, preprocess components with svelte.preprocess: 24 | * @see https://svelte.dev/docs#svelte_preprocess 25 | */ 26 | preprocess: Arrayable; 27 | // { 28 | // style: ({ content }) => { 29 | // return transformStyles(content); 30 | // } 31 | // }, 32 | 33 | /** Emit Svelte styles as virtual CSS files for other plugins to process. */ 34 | emitCss: boolean; 35 | 36 | /** Options passed to `svelte.compile` method. */ 37 | compilerOptions: CompileOptions; 38 | 39 | /** Custom warnings handler; defers to Rollup as default. */ 40 | onwarn(warning: RollupWarning, handler: WarningHandler): void; 41 | 42 | /** Enable/configure HMR */ 43 | hot?: { 44 | /** 45 | * Enable state preservation when a component is updated by HMR for every 46 | * components. 47 | * @default false 48 | */ 49 | preserveState: boolean; 50 | 51 | /** 52 | * If this string appears anywhere in your component's code, then local 53 | * state won't be preserved, even when noPreserveState is false. 54 | * @default '@hmr:reset' 55 | */ 56 | noPreserveStateKey: string; 57 | 58 | /** 59 | * If this string appears next to a `let` variable, the value of this 60 | * variable will be preserved accross HMR updates. 61 | * @default '@hmr:keep' 62 | */ 63 | preserveStateKey: string; 64 | 65 | /** 66 | * Prevent doing a full reload on next HMR update after fatal error. 67 | * @default false 68 | */ 69 | noReload: boolean; 70 | 71 | /** 72 | * Try to recover after runtime errors in component init. 73 | * @default true 74 | */ 75 | optimistic: boolean; 76 | 77 | noDisableCss: boolean; 78 | injectCss: boolean; 79 | cssEjectDelay: number; 80 | } 81 | } 82 | 83 | export default function svelte(options?: Partial): Plugin; 84 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # rollup-plugin-svelte changelog 2 | 3 | :warning: **NOTE** This is the changelog of the upstream plugin. Changelog of the hot fork is [this one](./CHANGELOG.hot.md) (kept this way for mergeability reasons). :warning: 4 | 5 | ## 7.1.0 6 | 7 | * Preprocessor sourcemap support ([#157](https://github.com/sveltejs/rollup-plugin-svelte/pull/157)) 8 | 9 | ## 7.0.0 10 | 11 | * New minimum version requirements ([#138](https://github.com/sveltejs/rollup-plugin-svelte/pull/138), [#142](https://github.com/sveltejs/rollup-plugin-svelte/pull/142)): 12 | * Rollup 2+ 13 | * Svelte 3.5+ (Svelte 2 is no longer supported) 14 | * Node 10+ 15 | * Breaking: Offload CSS handling to Rollup — you will now need an external plugin like `rollup-plugin-css-only` to extract your styles to `.css` files [as demonstrated in the template](https://github.com/sveltejs/template/blob/5b1135c286f7a649daa99825a077586655051649/rollup.config.js#L48) ([#147](https://github.com/sveltejs/rollup-plugin-svelte/pull/147)) 16 | * Breaking: Options to be passed directly to the Svelte compiler must now go under a `compilerOptions` key in the plugin configuration object ([#145](https://github.com/sveltejs/rollup-plugin-svelte/pull/145)) 17 | * Extend `CompileOptions` interface directly ([#126](https://github.com/sveltejs/rollup-plugin-svelte/pull/126)) 18 | * Pass relative `filename` to svelte compiler ([#131](https://github.com/sveltejs/rollup-plugin-svelte/pull/131)) 19 | * Link `sourcemap` with source correctly ([#140](https://github.com/sveltejs/rollup-plugin-svelte/pull/140)) 20 | * Respect `sourcemapExcludeSources` Rollup config ([#93](https://github.com/sveltejs/rollup-plugin-svelte/pull/93)) 21 | * Keep all sourcemaps from chunk ([#44](https://github.com/sveltejs/rollup-plugin-svelte/pull/44)) 22 | 23 | ## 6.1.1 24 | 25 | * Use `require('svelte/compiler')` rather than `require('svelte/compiler.js')` to work with new Svelte exports map 26 | 27 | ## 6.1.0 28 | 29 | * feat: allow custom Svelte compilers via new `svelte` option: ([#124](https://github.com/sveltejs/rollup-plugin-svelte/pull/124)) 30 | * fix: use native `fs.existsSync` method: ([`50e03e5`](https://github.com/sveltejs/rollup-plugin-svelte/commit/50e03e5)) 31 | * chore: Power CI via GitHub Action ([`61ead9a..23e83a4`](https://github.com/sveltejs/rollup-plugin-svelte/compare/61ead9a..23e83a4)) 32 | 33 | ## 6.0.2 34 | 35 | * Added default value to CssWriter.write map option ([#135](https://github.com/sveltejs/rollup-plugin-svelte/pull/135)) 36 | * Do not warn about missing unused css selectors if both css and emitCss are false ([#127](https://github.com/sveltejs/rollup-plugin-svelte/pull/127)) 37 | 38 | ## 6.0.1 39 | 40 | * Fix types to allow `css: false` ([#125](https://github.com/sveltejs/rollup-plugin-svelte/pull/125)) 41 | 42 | ## 6.0.0 43 | 44 | * Breaking changes: 45 | * Rollup 1.19.2+ is now required 46 | * The path passed to `css.write()` is now relative to the destination directory. 47 | * Other changes: 48 | * Add types for `generate`, `customElement`, and `preprocess` options ([#111](https://github.com/sveltejs/rollup-plugin-svelte/pull/111), [#114](https://github.com/sveltejs/rollup-plugin-svelte/pull/114), and [#118](https://github.com/sveltejs/rollup-plugin-svelte/pull/118)) 49 | * Use Rollup's `emitFile` API ([#72](https://github.com/sveltejs/rollup-plugin-svelte/pull/72)) 50 | * Warn when `package.json` does not expose itself via `exports` ([#119](https://github.com/sveltejs/rollup-plugin-svelte/pull/119)) 51 | 52 | ## 5.2.3 53 | 54 | * Actually publish typings ([#110](https://github.com/sveltejs/rollup-plugin-svelte/issues/110)) 55 | 56 | ## 5.2.2 57 | 58 | * Handle files with `.svelte` in the middle of their filename ([#107](https://github.com/sveltejs/rollup-plugin-svelte/pull/107)) 59 | 60 | ## 5.2.1 61 | 62 | * Revert accidental change to Rollup peer dependency 63 | 64 | ## 5.2.0 65 | 66 | * Deterministic CSS bundle order ([#84](https://github.com/sveltejs/rollup-plugin-svelte/issues/84)) 67 | * Add typings ([#90](https://github.com/sveltejs/rollup-plugin-svelte/pull/90)) 68 | 69 | ## 5.1.1 70 | 71 | * Use Svelte 3's built-in logic for automatically determining the component name from its file path ([#74](https://github.com/rollup/rollup-plugin-svelte/issues/74)) 72 | 73 | ## 5.1.0 74 | 75 | * Support array of preprocessors in Svelte 3 76 | 77 | ## 5.0.3 78 | 79 | * Handle `onwarn` correctly in new Svelte 3 beta 80 | 81 | ## 5.0.2 82 | 83 | * Support latest Svelte 3 beta 84 | 85 | ## 5.0.1 86 | 87 | * Use `this.addWatchFile` if present ([#46](https://github.com/rollup/rollup-plugin-svelte/pull/46)) 88 | 89 | ## 5.0.0 90 | *2018-12-16* 91 | * Replace deprecated `ongenerate` hook, use Rollup's internal warning mechanism; requires rollup@0.60+ ([#45](https://github.com/rollup/rollup-plugin-svelte/issues/45)) 92 | 93 | ## 4.5.0 94 | 95 | * Pass `dependencies` through from preprocessors ([#40](https://github.com/rollup/rollup-plugin-svelte/issues/40)) 96 | 97 | ## 4.4.0 98 | 99 | * Support Svelte 3 alpha 100 | * Internal reorganisation 101 | 102 | ## 4.3.2 103 | 104 | * Remove deprecated `onerror` handler 105 | 106 | ## 4.3.1 107 | 108 | * Handle arbitrary file extensions ([#38](https://github.com/rollup/rollup-plugin-svelte/pull/38)) 109 | * Generate Windows-friendly import paths ([#38](https://github.com/rollup/rollup-plugin-svelte/pull/38)) 110 | 111 | ## 4.3.0 112 | 113 | * Append inline sourcemaps to virtual CSS files generated with `emitCss: true` ([#36](https://github.com/rollup/rollup-plugin-svelte/pull/36)) 114 | 115 | ## 4.2.1 116 | 117 | * Fix `emitCss` with style-less components ([#34](https://github.com/rollup/rollup-plugin-svelte/pull/34)) 118 | 119 | ## 4.2.0 120 | 121 | * Add `emitCss` option ([#32](https://github.com/rollup/rollup-plugin-svelte/pull/32)) 122 | 123 | ## 4.1.0 124 | 125 | * Support Svelte 1.60 and above ([#29](https://github.com/rollup/rollup-plugin-svelte/pull/29)) 126 | 127 | ## 4.0.0 128 | 129 | * Move `svelte` to `peerDependencies` ([#25](https://github.com/rollup/rollup-plugin-svelte/issues/25)) 130 | 131 | ## 3.3.0 132 | 133 | * Pass ID as `filename` to `preprocess` ([#24](https://github.com/rollup/rollup-plugin-svelte/pull/24)) 134 | 135 | ## 3.2.0 136 | 137 | * Support `preprocess` option ([#21](https://github.com/rollup/rollup-plugin-svelte/issues/21)) 138 | * Ignore unused CSS selector warnings if `css: false` ([#17](https://github.com/rollup/rollup-plugin-svelte/issues/17)) 139 | 140 | ## 3.1.0 141 | 142 | * Allow `shared` option to override default ([#16](https://github.com/rollup/rollup-plugin-svelte/pull/16)) 143 | * Use `this.warn` and `this.error`, so Rollup can handle failures 144 | 145 | ## 3.0.1 146 | 147 | * `svelte` should be a dependency, not a devDependency... 148 | 149 | ## 3.0.0 150 | 151 | * CSS sourcemaps ([#14](https://github.com/rollup/rollup-plugin-svelte/issues/14)) 152 | 153 | ## 2.0.3 154 | 155 | * Ignore virtual modules ([#13](https://github.com/rollup/rollup-plugin-svelte/issues/13)) 156 | 157 | ## 2.0.2 158 | 159 | * Only include `code` and `map` in object passed to Rollup 160 | 161 | ## 2.0.1 162 | 163 | * Prevent import of built-in modules from blowing up the resolver 164 | 165 | ## 2.0.0 166 | 167 | * Add support for `pkg.svelte` and `pkg['svelte.root']` 168 | 169 | ## 1.8.1 170 | 171 | * Handle components without ` 109 | `, 'test.svelte'); 110 | }); 111 | 112 | test('preprocesses components', async () => { 113 | const p = plugin({ 114 | preprocess: { 115 | markup: ({ content, filename }) => { 116 | return { 117 | code: content 118 | .replace('__REPLACEME__', 'replaced') 119 | .replace('__FILENAME__', filename), 120 | dependencies: ['foo'], 121 | }; 122 | }, 123 | style: () => null, 124 | } 125 | }); 126 | 127 | const { code, dependencies } = await p.transform(` 128 |

Hello __REPLACEME__!

129 |

file: __FILENAME__

130 | 131 | `, 'test.svelte'); 132 | 133 | assert.is(code.indexOf('__REPLACEME__'), -1, 'content not modified'); 134 | assert.is.not(code.indexOf('file: test.svelte'), -1, 'filename not replaced'); 135 | assert.equal(dependencies, ['foo']); 136 | }); 137 | 138 | test('emits a CSS file', async () => { 139 | const p = plugin(); 140 | 141 | const transformed = await p.transform(`

Hello!

142 | 143 | `, 'path/to/Input.svelte'); 148 | 149 | assert.ok(transformed.code.indexOf('import "path/to/Input.css";') !== -1); 150 | 151 | const css = p.load('path/to/Input.css'); 152 | 153 | const smc = await new SourceMapConsumer(css.map); 154 | 155 | const loc = smc.originalPositionFor({ 156 | line: 1, 157 | column: 0 158 | }); 159 | 160 | assert.is(loc.source, 'Input.svelte'); 161 | assert.is(loc.line, 4); 162 | assert.is(loc.column, 2); 163 | }); 164 | 165 | test('properly escapes CSS paths', async () => { 166 | const p = plugin(); 167 | 168 | const transformed = await p.transform(`

Hello!

169 | 170 | `, 'path\\t\'o\\Input.svelte'); 175 | 176 | assert.ok(transformed.code.indexOf('import "path\\\\t\'o\\\\Input.css";') !== -1); 177 | 178 | const css = p.load('path\\t\'o\\Input.css'); 179 | 180 | const smc = await new SourceMapConsumer(css.map); 181 | 182 | const loc = smc.originalPositionFor({ 183 | line: 1, 184 | column: 0 185 | }); 186 | 187 | assert.is(loc.source, 'Input.svelte'); 188 | assert.is(loc.line, 4); 189 | assert.is(loc.column, 2); 190 | }); 191 | 192 | test('intercepts warnings', async () => { 193 | const warnings = []; 194 | const handled = []; 195 | 196 | const p = plugin({ 197 | onwarn(warning, handler) { 198 | warnings.push(warning); 199 | 200 | if (warning.code === 'a11y-hidden') { 201 | handler(warning); 202 | } 203 | } 204 | }); 205 | 206 | await p.transform.call({ 207 | warn: warning => { 208 | handled.push(warning); 209 | } 210 | }, ` 211 |

Hello world!

212 | wheee!!! 213 | `, 'test.svelte'); 214 | 215 | assert.equal(warnings.map(w => w.code), ['a11y-hidden', 'a11y-distracting-elements']); 216 | assert.equal(handled.map(w => w.code), ['a11y-hidden']); 217 | }); 218 | 219 | test('handles filenames that happen to contain ".svelte"', async () => { 220 | sander.rimrafSync('test/filename-test/dist'); 221 | sander.mkdirSync('test/filename-test/dist'); 222 | 223 | try { 224 | const bundle = await rollup({ 225 | input: 'test/filename-test/src/foo.svelte.dev/main.js', 226 | plugins: [ 227 | { 228 | async resolveId(id) { 229 | if (/A\.svelte/.test(id)) { 230 | await new Promise(f => setTimeout(f, 50)); 231 | } 232 | } 233 | }, 234 | plugin({ 235 | emitCss: true 236 | }), 237 | { 238 | transform(code, id) { 239 | if (/\.css$/.test(id)) { 240 | this.emitFile({ 241 | type: 'asset', 242 | name: 'bundle.css', 243 | source: code, 244 | }); 245 | return ''; 246 | } 247 | } 248 | } 249 | ], 250 | external: ['svelte/internal'] 251 | }); 252 | 253 | await bundle.write({ 254 | format: 'iife', 255 | file: 'test/filename-test/dist/bundle.js', 256 | globals: { 'svelte/internal': 'svelte' }, 257 | assetFileNames: '[name].[ext]', 258 | sourcemap: true, 259 | }); 260 | } catch (err) { 261 | console.log(err); 262 | throw err; 263 | } 264 | 265 | assert.is( 266 | fs.readFileSync('test/filename-test/dist/bundle.css', 'utf8'), 267 | 'h1.svelte-bt9zrl{color:red}' 268 | ); 269 | }); 270 | 271 | test('ignores ".html" extension by default', async () => { 272 | sander.rimrafSync('test/node_modules/widget/dist'); 273 | sander.mkdirSync('test/node_modules/widget/dist'); 274 | 275 | try { 276 | const bundle = await rollup({ 277 | input: 'test/node_modules/widget/index.js', 278 | external: ['svelte/internal'], 279 | plugins: [plugin()] 280 | }); 281 | 282 | await bundle.write({ 283 | format: 'iife', 284 | file: 'test/node_modules/widget/dist/bundle.js', 285 | globals: { 'svelte/internal': 'svelte' }, 286 | assetFileNames: '[name].[ext]', 287 | sourcemap: true, 288 | }); 289 | 290 | assert.unreachable('should have thrown PARSE_ERROR'); 291 | } catch (err) { 292 | assert.is(err.code, 'PARSE_ERROR'); 293 | assert.match(err.message, 'Note that you need plugins to import files that are not JavaScript'); 294 | assert.match(err.loc.file, /widget[\\\/]+src[\\\/]+Widget.html$/); 295 | } 296 | }); 297 | 298 | test('allows ".html" extension if configured', async () => { 299 | sander.rimrafSync('test/node_modules/widget/dist'); 300 | sander.mkdirSync('test/node_modules/widget/dist'); 301 | 302 | try { 303 | const bundle = await rollup({ 304 | input: 'test/node_modules/widget/index.js', 305 | external: ['svelte/internal'], 306 | plugins: [ 307 | plugin({ 308 | extensions: ['.html'] 309 | }) 310 | ] 311 | }); 312 | 313 | await bundle.write({ 314 | format: 'iife', 315 | file: 'test/node_modules/widget/dist/bundle.js', 316 | globals: { 'svelte/internal': 'svelte' }, 317 | assetFileNames: '[name].[ext]', 318 | sourcemap: true, 319 | }); 320 | } catch (err) { 321 | console.log(err); 322 | throw err; 323 | } 324 | 325 | assert.ok(fs.existsSync('test/node_modules/widget/dist/bundle.js')); 326 | assert.ok(fs.existsSync('test/node_modules/widget/dist/bundle.js.map')); 327 | }); 328 | 329 | test.run(); 330 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const relative = require('require-relative'); 4 | const { createFilter } = require('@rollup/pluginutils'); 5 | const { createMakeHot } = require('svelte-hmr'); 6 | 7 | const PREFIX = '[rollup-plugin-svelte]'; 8 | const pkg_export_errors = new Set(); 9 | 10 | const splitQuery = url => { 11 | const parts = url.split('?'); 12 | if (parts.length < 2) return [parts[0], '']; 13 | const query = parts.pop(); 14 | return [parts.join('?'), '?' + query]; 15 | }; 16 | 17 | const trimQuery = url => splitQuery(url)[0]; 18 | 19 | const readJsonFile = async (file, encoding = 'utf8') => JSON.parse(await fs.promises.readFile(file, encoding)); 20 | 21 | const plugin_options = new Set([ 22 | 'emitCss', 23 | 'exclude', 24 | 'extensions', 25 | 'include', 26 | 'onwarn', 27 | 'preprocess', 28 | 'hot', 29 | ]); 30 | 31 | const cssChanged = (a, b) => { 32 | if (!a && !b) return false; 33 | if (!a && b) return true; 34 | if (a && !b) return true; 35 | return a !== b; 36 | }; 37 | 38 | const normalizeNonCss = (code, cssHash) => { 39 | // trim HMR transform 40 | const indexHmrTransform = code.indexOf('import * as ___SVELTE_HMR_HOT_API from'); 41 | if (indexHmrTransform !== -1) code = code.slice(0, indexHmrTransform); 42 | // remove irrelevant bits 43 | return code 44 | // ignore css hashes in the code (that have changed, necessarily) 45 | .replace(new RegExp('\\s*\\b' + cssHash + '\\b\\s*', 'g'), '') 46 | .replace(/\s*attr_dev\([^,]+,\s*"class",\s*""\);?\s*/g, '') 47 | // Svelte now adds locations in dev mode, code locations can change when 48 | // CSS change, but we're unaffected (not real behaviour changes) 49 | .replace(/\s*\badd_location\s*\([^)]*\)\s*;?/g, ''); 50 | }; 51 | 52 | const jsChanged = (hash, a, b) => { 53 | if (!a && !b) return false; 54 | if (!a && b) return true; 55 | if (a && !b) return true; 56 | return normalizeNonCss(a, hash) !== normalizeNonCss(b, hash); 57 | }; 58 | 59 | /** 60 | * @param [options] {Partial} 61 | * @returns {import('rollup').Plugin} 62 | */ 63 | module.exports = function (options = {}) { 64 | const { compilerOptions={}, svelte, ...rest } = options; 65 | const extensions = rest.extensions || ['.svelte']; 66 | const filter = createFilter(rest.include, rest.exclude); 67 | 68 | const { compile, preprocess, walk } = svelte || require('svelte/compiler'); 69 | 70 | compilerOptions.format = 'esm'; 71 | 72 | for (const key in rest) { 73 | if (plugin_options.has(key)) continue; 74 | console.warn(`${PREFIX} Unknown "${key}" option. Please use "compilerOptions" for any Svelte compiler configuration.`); 75 | } 76 | 77 | // --- Log --- 78 | 79 | let log = console; 80 | 81 | // --- Virtual CSS --- 82 | 83 | // [filename]:[chunk] 84 | const cache_emit = new Map; 85 | const { onwarn, emitCss=true } = rest; 86 | 87 | if (emitCss) { 88 | if (compilerOptions.css) { 89 | console.warn(`${PREFIX} Forcing \`"compilerOptions.css": false\` because "emitCss" was truthy.`); 90 | } 91 | compilerOptions.css = false; 92 | } 93 | 94 | // --- HMR --- 95 | 96 | let makeHot; 97 | 98 | const initMakeHot = () => { 99 | if (rest.hot) { 100 | makeHot = createMakeHot({ walk }); 101 | } else { 102 | makeHot = null; 103 | } 104 | }; 105 | 106 | // --- Vite 2 support --- 107 | 108 | const transformCache = new Map(); 109 | const cssHashes = new Map(); 110 | 111 | let viteConfig; 112 | let isViteDev = !!process.env.ROLLUP_WATCH; 113 | 114 | const isVite = () => !!viteConfig; 115 | 116 | const resolveViteUrl = id => { 117 | if (!viteConfig) return id; 118 | const { root, base } = viteConfig; 119 | if (!id.startsWith(root + '/')) return id; 120 | return base + id.substr(root.length + 1); 121 | }; 122 | 123 | const resolveVitePath = url => { 124 | if (!viteConfig) return url; 125 | const { root, base } = viteConfig; 126 | if (!url.startsWith(base)) return url; 127 | return root + '/' + url.substr(base.length); 128 | }; 129 | 130 | // === Hooks === 131 | 132 | return { 133 | name: 'svelte', 134 | 135 | // --- Vite specific hooks --- 136 | 137 | /** 138 | * Vite specific. Ensure our resolver runs first to resolve svelte field. 139 | */ 140 | enforce: 'pre', 141 | 142 | /** 143 | * Vite specific hook. Used to determine if we're running Vite in dev mode, 144 | * meaning we need to add cache buster query params to modules for HMR, and 145 | * to customize customize config for Svelte. 146 | */ 147 | config(config, { mode, command }) { 148 | // TODO is this the only case we want to catch? 149 | isViteDev = mode === 'development' && command === 'serve'; 150 | return { 151 | // Svelte exports prebundled ESM modules, so it doesn't need to be 152 | // optimized. Exluding it might avoid a false starts, where the page 153 | // isn't immediately available while optimizing and generates "strict 154 | // mime type" errors in the browser (e.g. on very first run, or when 155 | // running dev after build sometimes). 156 | optimizeDeps: { 157 | exclude: ['svelte'] 158 | }, 159 | resolve: { 160 | // Prevent duplicated svelte runtimes with symlinked Svelte libs. 161 | dedupe: ['svelte'] 162 | } 163 | }; 164 | }, 165 | 166 | /** 167 | * Vite specific hook. Vite config is needed to know root directory and 168 | * base URL. 169 | */ 170 | configResolved(config) { 171 | viteConfig = config; 172 | }, 173 | 174 | async handleHotUpdate(ctx) { 175 | const { file, server, read } = ctx; 176 | // guards 177 | if (!emitCss) return; 178 | if (!rest.hot) return; 179 | if (!filter(file)) return; 180 | 181 | // resolve existing from caches 182 | const id = resolveViteUrl(file); 183 | const cssId = id + '.css'; 184 | const cachedCss = cache_emit.get(cssId); 185 | const cachedJs = transformCache.get(id); 186 | 187 | // clear cache to avoid transform from using it 188 | transformCache.delete(id); 189 | 190 | // guard: no cached result 191 | if (!cachedCss || !cachedJs) return; 192 | 193 | // repopulate caches by running transform 194 | const { code: newJs } = await this.transform(await read(), file, false) || {}; 195 | const { code: newCss } = cache_emit.get(cssId) || {}; 196 | 197 | const affectedModules = []; 198 | const cssModules = server.moduleGraph.getModulesByFile(file + '.css'); 199 | const jsModules = server.moduleGraph.getModulesByFile(file); 200 | 201 | const hasJsModules = jsModules && jsModules.size > 0; 202 | const hasCssModules = cssModules && cssModules.size > 0; 203 | 204 | if (!hasJsModules && !hasCssModules) return; 205 | 206 | const hash = cssHashes.get(file); 207 | if (hasJsModules && jsChanged(hash, cachedJs.code, newJs)) { 208 | affectedModules.push(...jsModules); 209 | } 210 | if (hasCssModules && cssChanged(cachedCss.code, newCss)) { 211 | affectedModules.push(...cssModules); 212 | } 213 | 214 | for (const m of affectedModules) { 215 | server.moduleGraph.invalidateModule(m); 216 | } 217 | 218 | return affectedModules; 219 | }, 220 | 221 | // --- Shared Rollup / Vite hooks --- 222 | 223 | /** 224 | * We need to resolve hot or not after knowing if we are in Vite or not. 225 | * 226 | * For hot and dev, Rollup defaults are off, while Vite defaults are auto 227 | * (that is, enabled in dev serve). 228 | */ 229 | buildStart() { 230 | if (!isVite()) { 231 | log = this; 232 | } 233 | if (isViteDev) { 234 | // enable dev/hot in dev serve, if not specified 235 | if (compilerOptions.dev == null) compilerOptions.dev = true; 236 | if (rest.hot == null) rest.hot = true; 237 | if (rest.hot && emitCss && !compilerOptions.cssHash) { 238 | compilerOptions.cssHash = ({hash, filename}) => { 239 | const file = path.resolve(filename); 240 | const id = hash(file).padEnd(12, 0).slice(0, 12); 241 | const cssHash = `svelte-${id}`; 242 | cssHashes.set(file, cssHash); 243 | return cssHash; 244 | }; 245 | } 246 | } 247 | if (rest.hot && !compilerOptions.dev) { 248 | console.info(`${PREFIX} Disabling HMR because "dev" option is disabled.`); 249 | rest.hot = false; 250 | } 251 | initMakeHot(); 252 | }, 253 | 254 | /** 255 | * Resolve an import's full filepath. 256 | */ 257 | async resolveId(importee, importer, options, ssr = false) { 258 | if (isVite()) { 259 | const [fname, query] = splitQuery(importee); 260 | if (cache_emit.has(fname)) { 261 | return ssr ? resolveVitePath(fname + query) : importee; 262 | } 263 | } else { 264 | if (cache_emit.has(importee)) return importee; 265 | } 266 | 267 | if (!importer || importee[0] === '.' || importee[0] === '\0' || path.isAbsolute(importee)) return null; 268 | 269 | // if this is a bare import, see if there's a valid pkg.svelte 270 | const parts = importee.split('/'); 271 | 272 | let dir, pkg, name = parts.shift(); 273 | if (name && name[0] === '@') { 274 | name += `/${parts.shift()}`; 275 | } 276 | 277 | try { 278 | const file = `${name}/package.json`; 279 | const resolved = relative.resolve(file, path.dirname(importer)); 280 | dir = path.dirname(resolved); 281 | // NOTE this can't be a "dynamic" CJS require, because this might end 282 | // up compiled as ESM in Kit 283 | pkg = await readJsonFile(resolved); 284 | } catch (err) { 285 | if (err.code === 'MODULE_NOT_FOUND') return null; 286 | if (err.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') { 287 | pkg_export_errors.add(name); 288 | return null; 289 | } 290 | throw err; 291 | } 292 | 293 | // use pkg.svelte 294 | if (parts.length === 0 && pkg.svelte) { 295 | return path.resolve(dir, pkg.svelte); 296 | } 297 | }, 298 | 299 | /** 300 | * Returns CSS contents for a file, if ours 301 | */ 302 | load(id) { 303 | const cacheKey = isVite() ? trimQuery(resolveViteUrl(id)) : id; 304 | return cache_emit.get(cacheKey) || null; 305 | }, 306 | 307 | /** 308 | * Transforms a `.svelte` file into a `.js` file. 309 | * NOTE: If `emitCss`, append static `import` to virtual CSS file. 310 | */ 311 | async transform(code, id, ssr = false) { 312 | if (!isVite()) { 313 | log = this; 314 | } 315 | 316 | if (!filter(id)) return null; 317 | 318 | if (isVite()) { 319 | const cacheKey = resolveViteUrl(id); 320 | const cached = transformCache.get(cacheKey); 321 | if (cached) { 322 | return cached; 323 | } 324 | } 325 | 326 | const extension = path.extname(id); 327 | if (!~extensions.indexOf(extension)) return null; 328 | 329 | const dependencies = []; 330 | const filename = path.relative(process.cwd(), id); 331 | const svelte_options = { ...compilerOptions, filename }; 332 | 333 | if (ssr) { 334 | svelte_options.generate = 'ssr'; 335 | } 336 | 337 | if (rest.preprocess) { 338 | const processed = await preprocess(code, rest.preprocess, { filename }); 339 | if (processed.dependencies) dependencies.push(...processed.dependencies); 340 | if (processed.map) svelte_options.sourcemap = processed.map; 341 | code = processed.code; 342 | } 343 | 344 | const compiled = compile(code, svelte_options); 345 | 346 | (compiled.warnings || []).forEach(warning => { 347 | if (!emitCss && warning.code === 'css-unused-selector') return; 348 | if (onwarn) onwarn(warning, log.warn); 349 | else log.warn(warning); 350 | }); 351 | 352 | if (emitCss) { 353 | const fname = isVite() 354 | ? resolveViteUrl(id) + '.css' 355 | : id.replace(new RegExp(`\\${extension}$`), '.css'); 356 | if (compiled.css.code) { 357 | compiled.js.code += `\nimport ${JSON.stringify(fname)};\n`; 358 | cache_emit.set(fname, compiled.css); 359 | } else { 360 | cache_emit.set(fname, {code: ''}); 361 | } 362 | } 363 | 364 | if (makeHot && !ssr) { 365 | compiled.js.code = makeHot({ 366 | id, 367 | compiledCode: compiled.js.code, 368 | hotOptions: { 369 | injectCss: !emitCss, 370 | ...rest.hot, 371 | }, 372 | compiled, 373 | originalCode: code, 374 | compileOptions: compilerOptions, 375 | }); 376 | } 377 | 378 | if (this.addWatchFile) { 379 | dependencies.forEach(this.addWatchFile); 380 | } else { 381 | compiled.js.dependencies = dependencies; 382 | } 383 | 384 | if (isVite()) { 385 | const cacheKey = resolveViteUrl(id); 386 | transformCache.set(cacheKey, compiled.js); 387 | } 388 | 389 | return compiled.js; 390 | }, 391 | 392 | /** 393 | * All resolutions done; display warnings wrt `package.json` access. 394 | */ 395 | generateBundle() { 396 | if (pkg_export_errors.size > 0) { 397 | console.warn(`\n${PREFIX} The following packages did not export their \`package.json\` file so we could not check the "svelte" field. If you had difficulties importing svelte components from a package, then please contact the author and ask them to export the package.json file.\n`); 398 | console.warn(Array.from(pkg_export_errors, s => `- ${s}`).join('\n') + '\n'); 399 | } 400 | } 401 | }; 402 | }; 403 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | dependencies: 2 | '@rollup/pluginutils': 4.1.0_rollup@2.39.1 3 | require-relative: 0.8.7 4 | svelte-hmr: 0.14.3_svelte@3.34.0 5 | devDependencies: 6 | eslint: 7.20.0 7 | rollup: 2.39.1 8 | sander: 0.6.0 9 | source-map: 0.7.3 10 | svelte: 3.34.0 11 | uvu: 0.4.1 12 | lockfileVersion: 5.2 13 | packages: 14 | /@babel/code-frame/7.12.11: 15 | dependencies: 16 | '@babel/highlight': 7.12.13 17 | dev: true 18 | resolution: 19 | integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== 20 | /@babel/helper-validator-identifier/7.12.11: 21 | dev: true 22 | resolution: 23 | integrity: sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== 24 | /@babel/highlight/7.12.13: 25 | dependencies: 26 | '@babel/helper-validator-identifier': 7.12.11 27 | chalk: 2.4.2 28 | js-tokens: 4.0.0 29 | dev: true 30 | resolution: 31 | integrity: sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== 32 | /@eslint/eslintrc/0.3.0: 33 | dependencies: 34 | ajv: 6.12.6 35 | debug: 4.3.1 36 | espree: 7.3.1 37 | globals: 12.4.0 38 | ignore: 4.0.6 39 | import-fresh: 3.3.0 40 | js-yaml: 3.14.1 41 | lodash: 4.17.21 42 | minimatch: 3.0.4 43 | strip-json-comments: 3.1.1 44 | dev: true 45 | engines: 46 | node: ^10.12.0 || >=12.0.0 47 | resolution: 48 | integrity: sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== 49 | /@rollup/pluginutils/4.1.0_rollup@2.39.1: 50 | dependencies: 51 | estree-walker: 2.0.2 52 | picomatch: 2.2.2 53 | rollup: 2.39.1 54 | dev: false 55 | engines: 56 | node: '>= 8.0.0' 57 | peerDependencies: 58 | rollup: ^1.20.0||^2.0.0 59 | resolution: 60 | integrity: sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ== 61 | /acorn-jsx/5.3.1_acorn@7.4.1: 62 | dependencies: 63 | acorn: 7.4.1 64 | dev: true 65 | peerDependencies: 66 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 67 | resolution: 68 | integrity: sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== 69 | /acorn/7.4.1: 70 | dev: true 71 | engines: 72 | node: '>=0.4.0' 73 | hasBin: true 74 | resolution: 75 | integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 76 | /ajv/6.12.6: 77 | dependencies: 78 | fast-deep-equal: 3.1.3 79 | fast-json-stable-stringify: 2.1.0 80 | json-schema-traverse: 0.4.1 81 | uri-js: 4.4.1 82 | dev: true 83 | resolution: 84 | integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 85 | /ajv/7.1.1: 86 | dependencies: 87 | fast-deep-equal: 3.1.3 88 | json-schema-traverse: 1.0.0 89 | require-from-string: 2.0.2 90 | uri-js: 4.4.1 91 | dev: true 92 | resolution: 93 | integrity: sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ== 94 | /ansi-colors/4.1.1: 95 | dev: true 96 | engines: 97 | node: '>=6' 98 | resolution: 99 | integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 100 | /ansi-regex/5.0.0: 101 | dev: true 102 | engines: 103 | node: '>=8' 104 | resolution: 105 | integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 106 | /ansi-styles/3.2.1: 107 | dependencies: 108 | color-convert: 1.9.3 109 | dev: true 110 | engines: 111 | node: '>=4' 112 | resolution: 113 | integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 114 | /ansi-styles/4.3.0: 115 | dependencies: 116 | color-convert: 2.0.1 117 | dev: true 118 | engines: 119 | node: '>=8' 120 | resolution: 121 | integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 122 | /argparse/1.0.10: 123 | dependencies: 124 | sprintf-js: 1.0.3 125 | dev: true 126 | resolution: 127 | integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 128 | /astral-regex/2.0.0: 129 | dev: true 130 | engines: 131 | node: '>=8' 132 | resolution: 133 | integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== 134 | /balanced-match/1.0.0: 135 | dev: true 136 | resolution: 137 | integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 138 | /brace-expansion/1.1.11: 139 | dependencies: 140 | balanced-match: 1.0.0 141 | concat-map: 0.0.1 142 | dev: true 143 | resolution: 144 | integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 145 | /callsites/3.1.0: 146 | dev: true 147 | engines: 148 | node: '>=6' 149 | resolution: 150 | integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 151 | /chalk/2.4.2: 152 | dependencies: 153 | ansi-styles: 3.2.1 154 | escape-string-regexp: 1.0.5 155 | supports-color: 5.5.0 156 | dev: true 157 | engines: 158 | node: '>=4' 159 | resolution: 160 | integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 161 | /chalk/4.1.0: 162 | dependencies: 163 | ansi-styles: 4.3.0 164 | supports-color: 7.2.0 165 | dev: true 166 | engines: 167 | node: '>=10' 168 | resolution: 169 | integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 170 | /color-convert/1.9.3: 171 | dependencies: 172 | color-name: 1.1.3 173 | dev: true 174 | resolution: 175 | integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 176 | /color-convert/2.0.1: 177 | dependencies: 178 | color-name: 1.1.4 179 | dev: true 180 | engines: 181 | node: '>=7.0.0' 182 | resolution: 183 | integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 184 | /color-name/1.1.3: 185 | dev: true 186 | resolution: 187 | integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 188 | /color-name/1.1.4: 189 | dev: true 190 | resolution: 191 | integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 192 | /concat-map/0.0.1: 193 | dev: true 194 | resolution: 195 | integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 196 | /cross-spawn/7.0.3: 197 | dependencies: 198 | path-key: 3.1.1 199 | shebang-command: 2.0.0 200 | which: 2.0.2 201 | dev: true 202 | engines: 203 | node: '>= 8' 204 | resolution: 205 | integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 206 | /debug/4.3.1: 207 | dependencies: 208 | ms: 2.1.2 209 | dev: true 210 | engines: 211 | node: '>=6.0' 212 | peerDependencies: 213 | supports-color: '*' 214 | peerDependenciesMeta: 215 | supports-color: 216 | optional: true 217 | resolution: 218 | integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 219 | /deep-is/0.1.3: 220 | dev: true 221 | resolution: 222 | integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 223 | /dequal/2.0.2: 224 | dev: true 225 | engines: 226 | node: '>=6' 227 | resolution: 228 | integrity: sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== 229 | /diff/4.0.2: 230 | dev: true 231 | engines: 232 | node: '>=0.3.1' 233 | resolution: 234 | integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 235 | /doctrine/3.0.0: 236 | dependencies: 237 | esutils: 2.0.3 238 | dev: true 239 | engines: 240 | node: '>=6.0.0' 241 | resolution: 242 | integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 243 | /emoji-regex/8.0.0: 244 | dev: true 245 | resolution: 246 | integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 247 | /enquirer/2.3.6: 248 | dependencies: 249 | ansi-colors: 4.1.1 250 | dev: true 251 | engines: 252 | node: '>=8.6' 253 | resolution: 254 | integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== 255 | /escape-string-regexp/1.0.5: 256 | dev: true 257 | engines: 258 | node: '>=0.8.0' 259 | resolution: 260 | integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 261 | /eslint-scope/5.1.1: 262 | dependencies: 263 | esrecurse: 4.3.0 264 | estraverse: 4.3.0 265 | dev: true 266 | engines: 267 | node: '>=8.0.0' 268 | resolution: 269 | integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 270 | /eslint-utils/2.1.0: 271 | dependencies: 272 | eslint-visitor-keys: 1.3.0 273 | dev: true 274 | engines: 275 | node: '>=6' 276 | resolution: 277 | integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== 278 | /eslint-visitor-keys/1.3.0: 279 | dev: true 280 | engines: 281 | node: '>=4' 282 | resolution: 283 | integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 284 | /eslint-visitor-keys/2.0.0: 285 | dev: true 286 | engines: 287 | node: '>=10' 288 | resolution: 289 | integrity: sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== 290 | /eslint/7.20.0: 291 | dependencies: 292 | '@babel/code-frame': 7.12.11 293 | '@eslint/eslintrc': 0.3.0 294 | ajv: 6.12.6 295 | chalk: 4.1.0 296 | cross-spawn: 7.0.3 297 | debug: 4.3.1 298 | doctrine: 3.0.0 299 | enquirer: 2.3.6 300 | eslint-scope: 5.1.1 301 | eslint-utils: 2.1.0 302 | eslint-visitor-keys: 2.0.0 303 | espree: 7.3.1 304 | esquery: 1.4.0 305 | esutils: 2.0.3 306 | file-entry-cache: 6.0.1 307 | functional-red-black-tree: 1.0.1 308 | glob-parent: 5.1.1 309 | globals: 12.4.0 310 | ignore: 4.0.6 311 | import-fresh: 3.3.0 312 | imurmurhash: 0.1.4 313 | is-glob: 4.0.1 314 | js-yaml: 3.14.1 315 | json-stable-stringify-without-jsonify: 1.0.1 316 | levn: 0.4.1 317 | lodash: 4.17.21 318 | minimatch: 3.0.4 319 | natural-compare: 1.4.0 320 | optionator: 0.9.1 321 | progress: 2.0.3 322 | regexpp: 3.1.0 323 | semver: 7.3.4 324 | strip-ansi: 6.0.0 325 | strip-json-comments: 3.1.1 326 | table: 6.0.7 327 | text-table: 0.2.0 328 | v8-compile-cache: 2.2.0 329 | dev: true 330 | engines: 331 | node: ^10.12.0 || >=12.0.0 332 | hasBin: true 333 | resolution: 334 | integrity: sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw== 335 | /espree/7.3.1: 336 | dependencies: 337 | acorn: 7.4.1 338 | acorn-jsx: 5.3.1_acorn@7.4.1 339 | eslint-visitor-keys: 1.3.0 340 | dev: true 341 | engines: 342 | node: ^10.12.0 || >=12.0.0 343 | resolution: 344 | integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== 345 | /esprima/4.0.1: 346 | dev: true 347 | engines: 348 | node: '>=4' 349 | hasBin: true 350 | resolution: 351 | integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 352 | /esquery/1.4.0: 353 | dependencies: 354 | estraverse: 5.2.0 355 | dev: true 356 | engines: 357 | node: '>=0.10' 358 | resolution: 359 | integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 360 | /esrecurse/4.3.0: 361 | dependencies: 362 | estraverse: 5.2.0 363 | dev: true 364 | engines: 365 | node: '>=4.0' 366 | resolution: 367 | integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 368 | /estraverse/4.3.0: 369 | dev: true 370 | engines: 371 | node: '>=4.0' 372 | resolution: 373 | integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 374 | /estraverse/5.2.0: 375 | dev: true 376 | engines: 377 | node: '>=4.0' 378 | resolution: 379 | integrity: sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== 380 | /estree-walker/2.0.2: 381 | dev: false 382 | resolution: 383 | integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 384 | /esutils/2.0.3: 385 | dev: true 386 | engines: 387 | node: '>=0.10.0' 388 | resolution: 389 | integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 390 | /fast-deep-equal/3.1.3: 391 | dev: true 392 | resolution: 393 | integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 394 | /fast-json-stable-stringify/2.1.0: 395 | dev: true 396 | resolution: 397 | integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 398 | /fast-levenshtein/2.0.6: 399 | dev: true 400 | resolution: 401 | integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 402 | /file-entry-cache/6.0.1: 403 | dependencies: 404 | flat-cache: 3.0.4 405 | dev: true 406 | engines: 407 | node: ^10.12.0 || >=12.0.0 408 | resolution: 409 | integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 410 | /flat-cache/3.0.4: 411 | dependencies: 412 | flatted: 3.1.1 413 | rimraf: 3.0.2 414 | dev: true 415 | engines: 416 | node: ^10.12.0 || >=12.0.0 417 | resolution: 418 | integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 419 | /flatted/3.1.1: 420 | dev: true 421 | resolution: 422 | integrity: sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== 423 | /fs.realpath/1.0.0: 424 | dev: true 425 | resolution: 426 | integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 427 | /fsevents/2.3.2: 428 | dev: true 429 | engines: 430 | node: ^8.16.0 || ^10.6.0 || >=11.0.0 431 | optional: true 432 | os: 433 | - darwin 434 | resolution: 435 | integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 436 | /functional-red-black-tree/1.0.1: 437 | dev: true 438 | resolution: 439 | integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 440 | /glob-parent/5.1.1: 441 | dependencies: 442 | is-glob: 4.0.1 443 | dev: true 444 | engines: 445 | node: '>= 6' 446 | resolution: 447 | integrity: sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 448 | /glob/7.1.6: 449 | dependencies: 450 | fs.realpath: 1.0.0 451 | inflight: 1.0.6 452 | inherits: 2.0.4 453 | minimatch: 3.0.4 454 | once: 1.4.0 455 | path-is-absolute: 1.0.1 456 | dev: true 457 | resolution: 458 | integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 459 | /globals/12.4.0: 460 | dependencies: 461 | type-fest: 0.8.1 462 | dev: true 463 | engines: 464 | node: '>=8' 465 | resolution: 466 | integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== 467 | /graceful-fs/4.2.6: 468 | dev: true 469 | resolution: 470 | integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== 471 | /has-flag/3.0.0: 472 | dev: true 473 | engines: 474 | node: '>=4' 475 | resolution: 476 | integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 477 | /has-flag/4.0.0: 478 | dev: true 479 | engines: 480 | node: '>=8' 481 | resolution: 482 | integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 483 | /ignore/4.0.6: 484 | dev: true 485 | engines: 486 | node: '>= 4' 487 | resolution: 488 | integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 489 | /import-fresh/3.3.0: 490 | dependencies: 491 | parent-module: 1.0.1 492 | resolve-from: 4.0.0 493 | dev: true 494 | engines: 495 | node: '>=6' 496 | resolution: 497 | integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 498 | /imurmurhash/0.1.4: 499 | dev: true 500 | engines: 501 | node: '>=0.8.19' 502 | resolution: 503 | integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= 504 | /inflight/1.0.6: 505 | dependencies: 506 | once: 1.4.0 507 | wrappy: 1.0.2 508 | dev: true 509 | resolution: 510 | integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 511 | /inherits/2.0.4: 512 | dev: true 513 | resolution: 514 | integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 515 | /is-extglob/2.1.1: 516 | dev: true 517 | engines: 518 | node: '>=0.10.0' 519 | resolution: 520 | integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 521 | /is-fullwidth-code-point/3.0.0: 522 | dev: true 523 | engines: 524 | node: '>=8' 525 | resolution: 526 | integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 527 | /is-glob/4.0.1: 528 | dependencies: 529 | is-extglob: 2.1.1 530 | dev: true 531 | engines: 532 | node: '>=0.10.0' 533 | resolution: 534 | integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 535 | /isexe/2.0.0: 536 | dev: true 537 | resolution: 538 | integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 539 | /js-tokens/4.0.0: 540 | dev: true 541 | resolution: 542 | integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 543 | /js-yaml/3.14.1: 544 | dependencies: 545 | argparse: 1.0.10 546 | esprima: 4.0.1 547 | dev: true 548 | hasBin: true 549 | resolution: 550 | integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 551 | /json-schema-traverse/0.4.1: 552 | dev: true 553 | resolution: 554 | integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 555 | /json-schema-traverse/1.0.0: 556 | dev: true 557 | resolution: 558 | integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 559 | /json-stable-stringify-without-jsonify/1.0.1: 560 | dev: true 561 | resolution: 562 | integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 563 | /kleur/4.1.4: 564 | dev: true 565 | engines: 566 | node: '>=6' 567 | resolution: 568 | integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== 569 | /levn/0.4.1: 570 | dependencies: 571 | prelude-ls: 1.2.1 572 | type-check: 0.4.0 573 | dev: true 574 | engines: 575 | node: '>= 0.8.0' 576 | resolution: 577 | integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 578 | /lodash/4.17.21: 579 | dev: true 580 | resolution: 581 | integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 582 | /lru-cache/6.0.0: 583 | dependencies: 584 | yallist: 4.0.0 585 | dev: true 586 | engines: 587 | node: '>=10' 588 | resolution: 589 | integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 590 | /minimatch/3.0.4: 591 | dependencies: 592 | brace-expansion: 1.1.11 593 | dev: true 594 | resolution: 595 | integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 596 | /minimist/1.2.5: 597 | dev: true 598 | resolution: 599 | integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 600 | /mkdirp/0.5.5: 601 | dependencies: 602 | minimist: 1.2.5 603 | dev: true 604 | hasBin: true 605 | resolution: 606 | integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 607 | /mri/1.1.6: 608 | dev: true 609 | engines: 610 | node: '>=4' 611 | resolution: 612 | integrity: sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ== 613 | /ms/2.1.2: 614 | dev: true 615 | resolution: 616 | integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 617 | /natural-compare/1.4.0: 618 | dev: true 619 | resolution: 620 | integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 621 | /once/1.4.0: 622 | dependencies: 623 | wrappy: 1.0.2 624 | dev: true 625 | resolution: 626 | integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 627 | /optionator/0.9.1: 628 | dependencies: 629 | deep-is: 0.1.3 630 | fast-levenshtein: 2.0.6 631 | levn: 0.4.1 632 | prelude-ls: 1.2.1 633 | type-check: 0.4.0 634 | word-wrap: 1.2.3 635 | dev: true 636 | engines: 637 | node: '>= 0.8.0' 638 | resolution: 639 | integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 640 | /parent-module/1.0.1: 641 | dependencies: 642 | callsites: 3.1.0 643 | dev: true 644 | engines: 645 | node: '>=6' 646 | resolution: 647 | integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 648 | /path-is-absolute/1.0.1: 649 | dev: true 650 | engines: 651 | node: '>=0.10.0' 652 | resolution: 653 | integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 654 | /path-key/3.1.1: 655 | dev: true 656 | engines: 657 | node: '>=8' 658 | resolution: 659 | integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 660 | /picomatch/2.2.2: 661 | dev: false 662 | engines: 663 | node: '>=8.6' 664 | resolution: 665 | integrity: sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 666 | /prelude-ls/1.2.1: 667 | dev: true 668 | engines: 669 | node: '>= 0.8.0' 670 | resolution: 671 | integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 672 | /progress/2.0.3: 673 | dev: true 674 | engines: 675 | node: '>=0.4.0' 676 | resolution: 677 | integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 678 | /punycode/2.1.1: 679 | dev: true 680 | engines: 681 | node: '>=6' 682 | resolution: 683 | integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 684 | /regexpp/3.1.0: 685 | dev: true 686 | engines: 687 | node: '>=8' 688 | resolution: 689 | integrity: sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== 690 | /require-from-string/2.0.2: 691 | dev: true 692 | engines: 693 | node: '>=0.10.0' 694 | resolution: 695 | integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 696 | /require-relative/0.8.7: 697 | dev: false 698 | resolution: 699 | integrity: sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= 700 | /resolve-from/4.0.0: 701 | dev: true 702 | engines: 703 | node: '>=4' 704 | resolution: 705 | integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 706 | /rimraf/2.7.1: 707 | dependencies: 708 | glob: 7.1.6 709 | dev: true 710 | hasBin: true 711 | resolution: 712 | integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 713 | /rimraf/3.0.2: 714 | dependencies: 715 | glob: 7.1.6 716 | dev: true 717 | hasBin: true 718 | resolution: 719 | integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 720 | /rollup/2.39.1: 721 | dev: true 722 | engines: 723 | node: '>=10.0.0' 724 | hasBin: true 725 | optionalDependencies: 726 | fsevents: 2.3.2 727 | resolution: 728 | integrity: sha512-9rfr0Z6j+vE+eayfNVFr1KZ+k+jiUl2+0e4quZafy1x6SFCjzFspfRSO2ZZQeWeX9noeDTUDgg6eCENiEPFvQg== 729 | /sade/1.7.4: 730 | dependencies: 731 | mri: 1.1.6 732 | dev: true 733 | engines: 734 | node: '>= 6' 735 | resolution: 736 | integrity: sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA== 737 | /sander/0.6.0: 738 | dependencies: 739 | graceful-fs: 4.2.6 740 | mkdirp: 0.5.5 741 | rimraf: 2.7.1 742 | dev: true 743 | resolution: 744 | integrity: sha1-rxYkzX+2362Y6+9WUxn5IAeNqSU= 745 | /semver/7.3.4: 746 | dependencies: 747 | lru-cache: 6.0.0 748 | dev: true 749 | engines: 750 | node: '>=10' 751 | hasBin: true 752 | resolution: 753 | integrity: sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== 754 | /shebang-command/2.0.0: 755 | dependencies: 756 | shebang-regex: 3.0.0 757 | dev: true 758 | engines: 759 | node: '>=8' 760 | resolution: 761 | integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 762 | /shebang-regex/3.0.0: 763 | dev: true 764 | engines: 765 | node: '>=8' 766 | resolution: 767 | integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 768 | /slice-ansi/4.0.0: 769 | dependencies: 770 | ansi-styles: 4.3.0 771 | astral-regex: 2.0.0 772 | is-fullwidth-code-point: 3.0.0 773 | dev: true 774 | engines: 775 | node: '>=10' 776 | resolution: 777 | integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== 778 | /source-map/0.7.3: 779 | dev: true 780 | engines: 781 | node: '>= 8' 782 | resolution: 783 | integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== 784 | /sprintf-js/1.0.3: 785 | dev: true 786 | resolution: 787 | integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 788 | /string-width/4.2.0: 789 | dependencies: 790 | emoji-regex: 8.0.0 791 | is-fullwidth-code-point: 3.0.0 792 | strip-ansi: 6.0.0 793 | dev: true 794 | engines: 795 | node: '>=8' 796 | resolution: 797 | integrity: sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 798 | /strip-ansi/6.0.0: 799 | dependencies: 800 | ansi-regex: 5.0.0 801 | dev: true 802 | engines: 803 | node: '>=8' 804 | resolution: 805 | integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 806 | /strip-json-comments/3.1.1: 807 | dev: true 808 | engines: 809 | node: '>=8' 810 | resolution: 811 | integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 812 | /supports-color/5.5.0: 813 | dependencies: 814 | has-flag: 3.0.0 815 | dev: true 816 | engines: 817 | node: '>=4' 818 | resolution: 819 | integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 820 | /supports-color/7.2.0: 821 | dependencies: 822 | has-flag: 4.0.0 823 | dev: true 824 | engines: 825 | node: '>=8' 826 | resolution: 827 | integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 828 | /svelte-hmr/0.14.3_svelte@3.34.0: 829 | dependencies: 830 | svelte: 3.34.0 831 | dev: false 832 | peerDependencies: 833 | svelte: '>=3.19.0' 834 | resolution: 835 | integrity: sha512-N56xX405zLMw2tpGHKRx5h+kmdeZwxI21pvyC6OyBHJDCF6DlwWBm9TifdQmSD4dloWSmpDPzHWYa3CSjfopUg== 836 | /svelte/3.34.0: 837 | dev: true 838 | engines: 839 | node: '>= 8' 840 | resolution: 841 | integrity: sha512-xWcaQ/J4Yd5k0UWz+ef6i5RW5WP3hNpluEI2qtTTKlMOXERHpVL509O9lIw7sgEn1JjJgTOS+lnnDj99vQ3YqQ== 842 | /table/6.0.7: 843 | dependencies: 844 | ajv: 7.1.1 845 | lodash: 4.17.21 846 | slice-ansi: 4.0.0 847 | string-width: 4.2.0 848 | dev: true 849 | engines: 850 | node: '>=10.0.0' 851 | resolution: 852 | integrity: sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== 853 | /text-table/0.2.0: 854 | dev: true 855 | resolution: 856 | integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 857 | /totalist/2.0.0: 858 | dev: true 859 | engines: 860 | node: '>=6' 861 | resolution: 862 | integrity: sha512-+Y17F0YzxfACxTyjfhnJQEe7afPA0GSpYlFkl2VFMxYP7jshQf9gXV7cH47EfToBumFThfKBvfAcoUn6fdNeRQ== 863 | /type-check/0.4.0: 864 | dependencies: 865 | prelude-ls: 1.2.1 866 | dev: true 867 | engines: 868 | node: '>= 0.8.0' 869 | resolution: 870 | integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 871 | /type-fest/0.8.1: 872 | dev: true 873 | engines: 874 | node: '>=8' 875 | resolution: 876 | integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 877 | /uri-js/4.4.1: 878 | dependencies: 879 | punycode: 2.1.1 880 | dev: true 881 | resolution: 882 | integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 883 | /uvu/0.4.1: 884 | dependencies: 885 | dequal: 2.0.2 886 | diff: 4.0.2 887 | kleur: 4.1.4 888 | sade: 1.7.4 889 | totalist: 2.0.0 890 | dev: true 891 | engines: 892 | node: '>=8' 893 | hasBin: true 894 | resolution: 895 | integrity: sha512-JgAGSdts0VawIRPpnG4t1G5O0RoSrkJZTvTH+iSrFrlsJq9w12hksrfvd8wHIVAw/215T7WfQalCwYa3vN8tTA== 896 | /v8-compile-cache/2.2.0: 897 | dev: true 898 | resolution: 899 | integrity: sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== 900 | /which/2.0.2: 901 | dependencies: 902 | isexe: 2.0.0 903 | dev: true 904 | engines: 905 | node: '>= 8' 906 | hasBin: true 907 | resolution: 908 | integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 909 | /word-wrap/1.2.3: 910 | dev: true 911 | engines: 912 | node: '>=0.10.0' 913 | resolution: 914 | integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 915 | /wrappy/1.0.2: 916 | dev: true 917 | resolution: 918 | integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 919 | /yallist/4.0.0: 920 | dev: true 921 | resolution: 922 | integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 923 | specifiers: 924 | '@rollup/pluginutils': ^4.1.0 925 | eslint: ^7.14.0 926 | require-relative: ^0.8.7 927 | rollup: ^2.33.3 928 | sander: ^0.6.0 929 | source-map: ^0.7.3 930 | svelte: ^3.30.0 931 | svelte-hmr: ^0.14.3 932 | uvu: ^0.4.1 933 | --------------------------------------------------------------------------------