├── 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 |
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 |
--------------------------------------------------------------------------------