├── .gitattributes
├── .github
├── FUNDING.yml
└── workflows
│ └── test.yml
├── .gitignore
├── .npmrc
├── .travis.yml
├── LICENSE
├── bench
├── $.html
├── mutation-observer-bench.html
└── readme.md
├── changelog.md
├── docs
├── examples
│ ├── attr-timer.html
│ ├── blotter.html
│ ├── form-login.html
│ ├── rx-use.html
│ ├── time.html
│ └── todomvc.html
└── index.html
├── logo.svg
├── logo2.svg
├── package-lock.json
├── package.json
├── plan.md
├── readme.md
├── spect.js
├── spect.min.js
├── src
└── index.js
├── tea.yaml
└── test
├── index.html
├── index.js
├── libs
└── nodom.js
├── register.cjs
└── testfill.js
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: dy
4 |
--------------------------------------------------------------------------------
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
1 | # This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
3 |
4 | name: test
5 |
6 | on:
7 | push:
8 | branches: [ master ]
9 | pull_request:
10 | branches: [ master ]
11 |
12 | jobs:
13 | build:
14 |
15 | runs-on: ubuntu-latest
16 |
17 | strategy:
18 | matrix:
19 | node-version: [16.x]
20 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
21 |
22 | steps:
23 | - uses: actions/checkout@v2
24 | - name: Use Node.js ${{ matrix.node-version }}
25 | uses: actions/setup-node@v2
26 | with:
27 | node-version: ${{ matrix.node-version }}
28 | cache: 'npm'
29 | - run: npm ci
30 | - run: npm run build --if-present
31 | - run: npm test
32 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Runtime data
9 | pids
10 | *.pid
11 | *.seed
12 | *.pid.lock
13 |
14 | # Directory for instrumented libs generated by jscoverage/JSCover
15 | lib-cov
16 |
17 | # Coverage directory used by tools like istanbul
18 | coverage
19 |
20 | # nyc test coverage
21 | .nyc_output
22 |
23 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
24 | .grunt
25 |
26 | # Bower dependency directory (https://bower.io/)
27 | bower_components
28 |
29 | # node-waf configuration
30 | .lock-wscript
31 |
32 | # Compiled binary addons (https://nodejs.org/api/addons.html)
33 | build/Release
34 |
35 | # Dependency directories
36 | node_modules/
37 | jspm_packages/
38 | web_modules/
39 |
40 | # TypeScript v1 declaration files
41 | typings/
42 |
43 | # Optional npm cache directory
44 | .npm
45 |
46 | # Optional eslint cache
47 | .eslintcache
48 |
49 | # Optional REPL history
50 | .node_repl_history
51 |
52 | # Output of 'npm pack'
53 | *.tgz
54 |
55 | # Yarn Integrity file
56 | .yarn-integrity
57 |
58 | # dotenv environment variables file
59 | .env
60 |
61 | # parcel-bundler cache (https://parceljs.org/)
62 | .cache
63 |
64 | # next.js build output
65 | .next
66 |
67 | # nuxt.js build output
68 | .nuxt
69 |
70 | # vuepress build output
71 | .vuepress/dist
72 |
73 | # Serverless directories
74 | .serverless
75 |
76 | # FuseBox cache
77 | .fusebox/
78 |
79 | bundle*
80 |
81 | pkg/
82 |
83 | .github
84 | .cache
85 | assets
86 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | package-lock=true
2 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - node
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 dmitry ivanov
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/bench/$.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Bench
4 |
18 |
--------------------------------------------------------------------------------
/bench/mutation-observer-bench.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Result: worst case of global mutation observer slows down adding 10000 els + attributes + textContent only for 25% the most.
7 |
8 |
9 |
51 |
--------------------------------------------------------------------------------
/bench/readme.md:
--------------------------------------------------------------------------------
1 | ## $
2 |
3 | Reference: https://ecss.io/appendix1.html.
4 |
5 | 1000 items are being added to HTML:
6 |
7 | ```html
8 |
17 | ```
18 |
19 | Comparing time spent on initializing selectors:
20 |
21 | | `spect@20` | `spect@19` | `vanilla` | `selector-observer` | `regular-elements` | `insertionQuery` | `mutation-summary` | `qso`
22 | ---|---|---|---|---|---
23 | `#a` |
24 | `[name=a]` |
25 | `.link` |
26 | `a` |
27 | `div a` |
28 | `div ul a` |
29 | `*` |
30 | `[data-select]` |
31 | `a[data-select]` |
32 | `[class^="wrap"]` |
33 | `[data-select="link"]` |
34 | `a[data-select="link"]`|
35 | `div[data-div="layer1"] a[data-select="link"]`|
36 | `.tagA.link`|
37 | `.tagUl .link`|
38 | `.tagB > .tagA`|
39 | `.div:nth-of-type(1) a`|
40 | `.div:nth-of-type(1) .div:nth-of-type(1) a`|
41 | `div.tagDiv > div.tagDiv.layer2 > ul.tagUL > li.tagLi > b.tagB > a.tagA.link`|
42 | `.tagLi .tagB a.TagA.link`|
43 |
44 | hasInitialDelay
45 |
46 |
47 | ## h
48 |
49 | `vanilla` | `spect@20` | `spect@19` | `hyperscript` | `incremental-dom` | `lit-html` | `htl` | `react` | `preact/htm` | `uhtml`
50 | ---|---|---|---|---|---|---
51 |
52 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/changelog.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | Version | Changes
4 | ---|---
5 | 24.0.0 | `spect/v` → [value-ref](https://github.com/spectjs/value-ref), `spect/h` → [https://github.com/spectjs/hyperf]
6 | 23.1.0 | internalized deps
7 | 23.0.0 | v reduced to ref: universal observable value reference (vue3-ref like).
8 | 22.0.0 | v reduced to simple observable. Removed i, a.
9 | 21.4.0 | HTM-based h with static caching.
10 | 21.3.0 | HTM-based h - dropping metaprogramming due to complexity and poor result (~40% faster than HTM-based, but way less reliable).
11 | 21.2.0 | Metaprogramming-based h algorightm, presumably faster hyperscript algo.
12 | 21.0.0 | Faster `h` algorithm, `i` and `a` entries.
13 | 20.0.0 | Stage 3: `$` live collections, `h` caching & templates, `v` errors & template literals.
14 | 19.1.0 | Sealed deps on `v`. Observed dep props.
15 | 19.0.0 | Reduced API: `$`, `h`, `v`.
16 | 18.0.0 | Reduced API: `$`, `h`, `v`, `o`, `e`.
17 | 17.0.0 | Removed `list`. `$` now creates live collection. Complete set of v2.0/v8.0-like effects.
18 | 16.1.0 | Expose `get`, `set`, `subscribe`, `next`. Make effects return `channel` or `value`.
19 | 16.0.0 | `observ`/`observable`-compatible implementation.
20 | 15.1.0 | `ref` + `channel` merged into `bus` - accessor/channel primitive. `symbol.bus` and `symbol.observable` introduced.
21 | 15.0.0 | Reactive `html` effect, `input`, better more optimized core.
22 | 14.0.0 | $ is considered a selector observer special effect, added the generic effect `fx` and observables `state`, `calc`, `ref`, `store` etc.
23 | 13.0.0 | Repository reset (orphan branch). Minimal selector-observer implementation, single $ entry.
24 | 12.0.0 | Internalized hooks via augmentor, dropped unihooks dep. Equivalent of [hooked-elements](https://github.com/WebReflection/hooked-elements).
25 | 11.0.0 | Aspects single entry with enabled hooks via unihooks.
26 | 10.0.0 | Web-streams, ReadableStream polyfill.
27 | 9.0.0 | Effects as asynchronous iterables.
28 | 8.0.0 | Atomize: split core $ to multiple effects.
29 | 7.0.0 | Deatomize. Single core approach. Ref-based approach - with `$(target).fx()`.
30 | 6.0.0 | DOM-less core. Pluggable atomic effects.
31 | 5.0.0 | Wrapper as aspect argument, along with props for react-compatible API (tape-like). Effect queues. `$(sel, ({element, fx, state}) => {})`
32 | 4.0.0 | Functional effects (not methods) API design.
33 | 3.0.0 | Wrapped elements jquery-like proxy-based API design `let $el = $(selector); $el.fx();`.
34 | 2.0.0 | Hooks-like global effects (`fx`, `state` etc) API design.
35 | 1.0.0 | HTM compiler remake with support for anonymous attributes, html-comments and unclosed tags, later [xhtm](https://ghub.io/xhtm).
36 | 0.0.1 | [jsxify](https://github.com/scrapjs/jsxify) R&D.
37 | 0.0.0 | Mod framework (Modifiers for DOM).
38 |
39 |
--------------------------------------------------------------------------------
/docs/examples/attr-timer.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/docs/examples/blotter.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
20 |
21 | spect
22 |
23 |
24 |
25 |
59 |
--------------------------------------------------------------------------------
/docs/examples/form-login.html:
--------------------------------------------------------------------------------
1 |
6 |
7 |
42 |
--------------------------------------------------------------------------------
/docs/examples/rx-use.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
14 |
--------------------------------------------------------------------------------
/docs/examples/time.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
18 |
--------------------------------------------------------------------------------
/docs/examples/todomvc.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Spect • TodoMVC
8 |
9 |
10 |
11 |
12 |
13 |
48 |
53 |
54 |
63 |
71 |
151 |
152 |
153 |
154 |
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Spect.js is an selector observer for organizing DOM aspects.
4 |
5 |
8 |
9 |
10 | Examples
11 |
12 | TODO MVC
13 |
--------------------------------------------------------------------------------
/logo.svg:
--------------------------------------------------------------------------------
1 |
52 |
--------------------------------------------------------------------------------
/logo2.svg:
--------------------------------------------------------------------------------
1 |
73 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "spect",
3 | "version": "24.2.1",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "spect",
9 | "version": "24.2.1",
10 | "license": "MIT",
11 | "devDependencies": {
12 | "@rollup/plugin-node-resolve": "^13.1.3",
13 | "es-module-shims": "^1.4.1",
14 | "hyperf": "^1.3.0",
15 | "jsdom": "^16.2.2",
16 | "plur": "^5.1.0",
17 | "rollup": "^2.63.0",
18 | "templize": "^2.1.2",
19 | "terser": "^5.10.0",
20 | "tst": "^7.0.0",
21 | "value-ref": "^2.1.0",
22 | "wait-please": "^3.1.0"
23 | }
24 | },
25 | "node_modules/@rollup/plugin-node-resolve": {
26 | "version": "13.1.3",
27 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz",
28 | "integrity": "sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==",
29 | "dev": true,
30 | "dependencies": {
31 | "@rollup/pluginutils": "^3.1.0",
32 | "@types/resolve": "1.17.1",
33 | "builtin-modules": "^3.1.0",
34 | "deepmerge": "^4.2.2",
35 | "is-module": "^1.0.0",
36 | "resolve": "^1.19.0"
37 | },
38 | "engines": {
39 | "node": ">= 10.0.0"
40 | },
41 | "peerDependencies": {
42 | "rollup": "^2.42.0"
43 | }
44 | },
45 | "node_modules/@rollup/pluginutils": {
46 | "version": "3.1.0",
47 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
48 | "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
49 | "dev": true,
50 | "dependencies": {
51 | "@types/estree": "0.0.39",
52 | "estree-walker": "^1.0.1",
53 | "picomatch": "^2.2.2"
54 | },
55 | "engines": {
56 | "node": ">= 8.0.0"
57 | },
58 | "peerDependencies": {
59 | "rollup": "^1.20.0||^2.0.0"
60 | }
61 | },
62 | "node_modules/@types/estree": {
63 | "version": "0.0.39",
64 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
65 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
66 | "dev": true
67 | },
68 | "node_modules/@types/node": {
69 | "version": "17.0.8",
70 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz",
71 | "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==",
72 | "dev": true
73 | },
74 | "node_modules/@types/resolve": {
75 | "version": "1.17.1",
76 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
77 | "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
78 | "dev": true,
79 | "dependencies": {
80 | "@types/node": "*"
81 | }
82 | },
83 | "node_modules/abab": {
84 | "version": "2.0.3",
85 | "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz",
86 | "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==",
87 | "dev": true
88 | },
89 | "node_modules/acorn": {
90 | "version": "8.7.0",
91 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
92 | "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
93 | "dev": true,
94 | "optional": true,
95 | "peer": true,
96 | "bin": {
97 | "acorn": "bin/acorn"
98 | },
99 | "engines": {
100 | "node": ">=0.4.0"
101 | }
102 | },
103 | "node_modules/acorn-globals": {
104 | "version": "6.0.0",
105 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
106 | "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
107 | "dev": true,
108 | "dependencies": {
109 | "acorn": "^7.1.1",
110 | "acorn-walk": "^7.1.1"
111 | }
112 | },
113 | "node_modules/acorn-globals/node_modules/acorn": {
114 | "version": "7.4.1",
115 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
116 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
117 | "dev": true,
118 | "bin": {
119 | "acorn": "bin/acorn"
120 | },
121 | "engines": {
122 | "node": ">=0.4.0"
123 | }
124 | },
125 | "node_modules/acorn-walk": {
126 | "version": "7.1.1",
127 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz",
128 | "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==",
129 | "dev": true,
130 | "engines": {
131 | "node": ">=0.4.0"
132 | }
133 | },
134 | "node_modules/ajv": {
135 | "version": "6.12.2",
136 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
137 | "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
138 | "dev": true,
139 | "dependencies": {
140 | "fast-deep-equal": "^3.1.1",
141 | "fast-json-stable-stringify": "^2.0.0",
142 | "json-schema-traverse": "^0.4.1",
143 | "uri-js": "^4.2.2"
144 | }
145 | },
146 | "node_modules/asn1": {
147 | "version": "0.2.4",
148 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
149 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
150 | "dev": true,
151 | "dependencies": {
152 | "safer-buffer": "~2.1.0"
153 | }
154 | },
155 | "node_modules/assert-plus": {
156 | "version": "1.0.0",
157 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
158 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
159 | "dev": true,
160 | "engines": {
161 | "node": ">=0.8"
162 | }
163 | },
164 | "node_modules/asynckit": {
165 | "version": "0.4.0",
166 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
167 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
168 | "dev": true
169 | },
170 | "node_modules/aws-sign2": {
171 | "version": "0.7.0",
172 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
173 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
174 | "dev": true,
175 | "engines": {
176 | "node": "*"
177 | }
178 | },
179 | "node_modules/aws4": {
180 | "version": "1.9.1",
181 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
182 | "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==",
183 | "dev": true
184 | },
185 | "node_modules/bcrypt-pbkdf": {
186 | "version": "1.0.2",
187 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
188 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
189 | "dev": true,
190 | "dependencies": {
191 | "tweetnacl": "^0.14.3"
192 | }
193 | },
194 | "node_modules/browser-process-hrtime": {
195 | "version": "1.0.0",
196 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
197 | "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
198 | "dev": true
199 | },
200 | "node_modules/buffer-from": {
201 | "version": "1.1.2",
202 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
203 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
204 | "dev": true
205 | },
206 | "node_modules/builtin-modules": {
207 | "version": "3.2.0",
208 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
209 | "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
210 | "dev": true,
211 | "engines": {
212 | "node": ">=6"
213 | },
214 | "funding": {
215 | "url": "https://github.com/sponsors/sindresorhus"
216 | }
217 | },
218 | "node_modules/caseless": {
219 | "version": "0.12.0",
220 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
221 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
222 | "dev": true
223 | },
224 | "node_modules/combined-stream": {
225 | "version": "1.0.8",
226 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
227 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
228 | "dev": true,
229 | "dependencies": {
230 | "delayed-stream": "~1.0.0"
231 | },
232 | "engines": {
233 | "node": ">= 0.8"
234 | }
235 | },
236 | "node_modules/commander": {
237 | "version": "2.20.3",
238 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
239 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
240 | "dev": true
241 | },
242 | "node_modules/core-util-is": {
243 | "version": "1.0.2",
244 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
245 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
246 | "dev": true
247 | },
248 | "node_modules/cssom": {
249 | "version": "0.4.4",
250 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
251 | "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
252 | "dev": true
253 | },
254 | "node_modules/cssstyle": {
255 | "version": "2.2.0",
256 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz",
257 | "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==",
258 | "dev": true,
259 | "dependencies": {
260 | "cssom": "~0.3.6"
261 | },
262 | "engines": {
263 | "node": ">=8"
264 | }
265 | },
266 | "node_modules/cssstyle/node_modules/cssom": {
267 | "version": "0.3.8",
268 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
269 | "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
270 | "dev": true
271 | },
272 | "node_modules/dashdash": {
273 | "version": "1.14.1",
274 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
275 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
276 | "dev": true,
277 | "dependencies": {
278 | "assert-plus": "^1.0.0"
279 | },
280 | "engines": {
281 | "node": ">=0.10"
282 | }
283 | },
284 | "node_modules/data-urls": {
285 | "version": "2.0.0",
286 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
287 | "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
288 | "dev": true,
289 | "dependencies": {
290 | "abab": "^2.0.3",
291 | "whatwg-mimetype": "^2.3.0",
292 | "whatwg-url": "^8.0.0"
293 | },
294 | "engines": {
295 | "node": ">=10"
296 | }
297 | },
298 | "node_modules/data-urls/node_modules/tr46": {
299 | "version": "2.0.2",
300 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
301 | "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
302 | "dev": true,
303 | "dependencies": {
304 | "punycode": "^2.1.1"
305 | },
306 | "engines": {
307 | "node": ">=8"
308 | }
309 | },
310 | "node_modules/data-urls/node_modules/webidl-conversions": {
311 | "version": "5.0.0",
312 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
313 | "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
314 | "dev": true,
315 | "engines": {
316 | "node": ">=8"
317 | }
318 | },
319 | "node_modules/data-urls/node_modules/whatwg-url": {
320 | "version": "8.0.0",
321 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.0.0.tgz",
322 | "integrity": "sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ==",
323 | "dev": true,
324 | "dependencies": {
325 | "lodash.sortby": "^4.7.0",
326 | "tr46": "^2.0.0",
327 | "webidl-conversions": "^5.0.0"
328 | },
329 | "engines": {
330 | "node": ">=10"
331 | }
332 | },
333 | "node_modules/decimal.js": {
334 | "version": "10.2.0",
335 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz",
336 | "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==",
337 | "dev": true
338 | },
339 | "node_modules/deep-is": {
340 | "version": "0.1.3",
341 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
342 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
343 | "dev": true
344 | },
345 | "node_modules/deepmerge": {
346 | "version": "4.2.2",
347 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
348 | "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
349 | "dev": true,
350 | "engines": {
351 | "node": ">=0.10.0"
352 | }
353 | },
354 | "node_modules/delayed-stream": {
355 | "version": "1.0.0",
356 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
357 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
358 | "dev": true,
359 | "engines": {
360 | "node": ">=0.4.0"
361 | }
362 | },
363 | "node_modules/domexception": {
364 | "version": "2.0.1",
365 | "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
366 | "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
367 | "dev": true,
368 | "dependencies": {
369 | "webidl-conversions": "^5.0.0"
370 | },
371 | "engines": {
372 | "node": ">=8"
373 | }
374 | },
375 | "node_modules/domexception/node_modules/webidl-conversions": {
376 | "version": "5.0.0",
377 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
378 | "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
379 | "dev": true,
380 | "engines": {
381 | "node": ">=8"
382 | }
383 | },
384 | "node_modules/ecc-jsbn": {
385 | "version": "0.1.2",
386 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
387 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
388 | "dev": true,
389 | "dependencies": {
390 | "jsbn": "~0.1.0",
391 | "safer-buffer": "^2.1.0"
392 | }
393 | },
394 | "node_modules/element-props": {
395 | "version": "2.0.4",
396 | "resolved": "https://registry.npmjs.org/element-props/-/element-props-2.0.4.tgz",
397 | "integrity": "sha512-nAGFQ1id3f3woxgdQGoZmlngZulvkWDXLD4rHWUUergsGrAoU0xjMU/SHtLww/NkfKUUHxY9kt/DKweVywj/lA==",
398 | "dev": true
399 | },
400 | "node_modules/es-module-shims": {
401 | "version": "1.4.1",
402 | "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-1.4.1.tgz",
403 | "integrity": "sha512-W2vx+64vuuBhiRR1uMTireQgDAvhnkGdPEWO5Fdplp/wxYnn31oarG0IA/eM01YVQ7eGglgBdWTGe6tYRY1q9A==",
404 | "dev": true
405 | },
406 | "node_modules/escodegen": {
407 | "version": "1.14.1",
408 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz",
409 | "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==",
410 | "dev": true,
411 | "dependencies": {
412 | "esprima": "^4.0.1",
413 | "estraverse": "^4.2.0",
414 | "esutils": "^2.0.2",
415 | "optionator": "^0.8.1"
416 | },
417 | "bin": {
418 | "escodegen": "bin/escodegen.js",
419 | "esgenerate": "bin/esgenerate.js"
420 | },
421 | "engines": {
422 | "node": ">=4.0"
423 | },
424 | "optionalDependencies": {
425 | "source-map": "~0.6.1"
426 | }
427 | },
428 | "node_modules/escodegen/node_modules/source-map": {
429 | "version": "0.6.1",
430 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
431 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
432 | "dev": true,
433 | "optional": true,
434 | "engines": {
435 | "node": ">=0.10.0"
436 | }
437 | },
438 | "node_modules/esprima": {
439 | "version": "4.0.1",
440 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
441 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
442 | "dev": true,
443 | "bin": {
444 | "esparse": "bin/esparse.js",
445 | "esvalidate": "bin/esvalidate.js"
446 | },
447 | "engines": {
448 | "node": ">=4"
449 | }
450 | },
451 | "node_modules/estraverse": {
452 | "version": "4.3.0",
453 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
454 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
455 | "dev": true,
456 | "engines": {
457 | "node": ">=4.0"
458 | }
459 | },
460 | "node_modules/estree-walker": {
461 | "version": "1.0.1",
462 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
463 | "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
464 | "dev": true
465 | },
466 | "node_modules/esutils": {
467 | "version": "2.0.3",
468 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
469 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
470 | "dev": true,
471 | "engines": {
472 | "node": ">=0.10.0"
473 | }
474 | },
475 | "node_modules/extend": {
476 | "version": "3.0.2",
477 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
478 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
479 | "dev": true
480 | },
481 | "node_modules/extsprintf": {
482 | "version": "1.3.0",
483 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
484 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
485 | "dev": true,
486 | "engines": [
487 | "node >=0.6.0"
488 | ]
489 | },
490 | "node_modules/fast-deep-equal": {
491 | "version": "3.1.1",
492 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
493 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
494 | "dev": true
495 | },
496 | "node_modules/fast-json-stable-stringify": {
497 | "version": "2.1.0",
498 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
499 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
500 | "dev": true
501 | },
502 | "node_modules/fast-levenshtein": {
503 | "version": "2.0.6",
504 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
505 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
506 | "dev": true
507 | },
508 | "node_modules/forever-agent": {
509 | "version": "0.6.1",
510 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
511 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
512 | "dev": true,
513 | "engines": {
514 | "node": "*"
515 | }
516 | },
517 | "node_modules/form-data": {
518 | "version": "2.3.3",
519 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
520 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
521 | "dev": true,
522 | "dependencies": {
523 | "asynckit": "^0.4.0",
524 | "combined-stream": "^1.0.6",
525 | "mime-types": "^2.1.12"
526 | },
527 | "engines": {
528 | "node": ">= 0.12"
529 | }
530 | },
531 | "node_modules/fsevents": {
532 | "version": "2.3.2",
533 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
534 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
535 | "dev": true,
536 | "hasInstallScript": true,
537 | "optional": true,
538 | "os": [
539 | "darwin"
540 | ],
541 | "engines": {
542 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
543 | }
544 | },
545 | "node_modules/function-bind": {
546 | "version": "1.1.1",
547 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
548 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
549 | "dev": true
550 | },
551 | "node_modules/getpass": {
552 | "version": "0.1.7",
553 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
554 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
555 | "dev": true,
556 | "dependencies": {
557 | "assert-plus": "^1.0.0"
558 | }
559 | },
560 | "node_modules/har-schema": {
561 | "version": "2.0.0",
562 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
563 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
564 | "dev": true,
565 | "engines": {
566 | "node": ">=4"
567 | }
568 | },
569 | "node_modules/har-validator": {
570 | "version": "5.1.3",
571 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
572 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
573 | "deprecated": "this library is no longer supported",
574 | "dev": true,
575 | "dependencies": {
576 | "ajv": "^6.5.5",
577 | "har-schema": "^2.0.0"
578 | },
579 | "engines": {
580 | "node": ">=6"
581 | }
582 | },
583 | "node_modules/has": {
584 | "version": "1.0.3",
585 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
586 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
587 | "dev": true,
588 | "dependencies": {
589 | "function-bind": "^1.1.1"
590 | },
591 | "engines": {
592 | "node": ">= 0.4.0"
593 | }
594 | },
595 | "node_modules/htm": {
596 | "version": "3.1.0",
597 | "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.0.tgz",
598 | "integrity": "sha512-L0s3Sid5r6YwrEvkig14SK3Emmc+kIjlfLhEGn2Vy3bk21JyDEes4MoDsbJk6luaPp8bugErnxPz86ZuAw6e5Q==",
599 | "dev": true
600 | },
601 | "node_modules/html-encoding-sniffer": {
602 | "version": "2.0.1",
603 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
604 | "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
605 | "dev": true,
606 | "dependencies": {
607 | "whatwg-encoding": "^1.0.5"
608 | },
609 | "engines": {
610 | "node": ">=10"
611 | }
612 | },
613 | "node_modules/http-signature": {
614 | "version": "1.2.0",
615 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
616 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
617 | "dev": true,
618 | "dependencies": {
619 | "assert-plus": "^1.0.0",
620 | "jsprim": "^1.2.2",
621 | "sshpk": "^1.7.0"
622 | },
623 | "engines": {
624 | "node": ">=0.8",
625 | "npm": ">=1.3.7"
626 | }
627 | },
628 | "node_modules/hyperf": {
629 | "version": "1.3.0",
630 | "resolved": "https://registry.npmjs.org/hyperf/-/hyperf-1.3.0.tgz",
631 | "integrity": "sha512-UJTtmUtUmsL3sSj2Zuod0+JrQGBOxRjLEYYfQdxBWS5VYTH9MiYg/d250GPSVwGQ+qYO6ATzvKYZqp4BHTVDlA==",
632 | "dev": true,
633 | "dependencies": {
634 | "element-props": "^2.0.4",
635 | "htm": "^3.1.0",
636 | "sube": "^2.2.1",
637 | "swapdom": "^1.1.1"
638 | }
639 | },
640 | "node_modules/iconv-lite": {
641 | "version": "0.4.24",
642 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
643 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
644 | "dev": true,
645 | "dependencies": {
646 | "safer-buffer": ">= 2.1.2 < 3"
647 | },
648 | "engines": {
649 | "node": ">=0.10.0"
650 | }
651 | },
652 | "node_modules/ip-regex": {
653 | "version": "2.1.0",
654 | "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
655 | "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
656 | "dev": true,
657 | "engines": {
658 | "node": ">=4"
659 | }
660 | },
661 | "node_modules/irregular-plurals": {
662 | "version": "3.3.0",
663 | "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz",
664 | "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==",
665 | "dev": true,
666 | "engines": {
667 | "node": ">=8"
668 | }
669 | },
670 | "node_modules/is-core-module": {
671 | "version": "2.8.1",
672 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
673 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
674 | "dev": true,
675 | "dependencies": {
676 | "has": "^1.0.3"
677 | },
678 | "funding": {
679 | "url": "https://github.com/sponsors/ljharb"
680 | }
681 | },
682 | "node_modules/is-module": {
683 | "version": "1.0.0",
684 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
685 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
686 | "dev": true
687 | },
688 | "node_modules/is-potential-custom-element-name": {
689 | "version": "1.0.0",
690 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
691 | "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=",
692 | "dev": true
693 | },
694 | "node_modules/is-typedarray": {
695 | "version": "1.0.0",
696 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
697 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
698 | "dev": true
699 | },
700 | "node_modules/isstream": {
701 | "version": "0.1.2",
702 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
703 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
704 | "dev": true
705 | },
706 | "node_modules/jsbn": {
707 | "version": "0.1.1",
708 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
709 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
710 | "dev": true
711 | },
712 | "node_modules/jsdom": {
713 | "version": "16.2.2",
714 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.2.2.tgz",
715 | "integrity": "sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==",
716 | "dev": true,
717 | "dependencies": {
718 | "abab": "^2.0.3",
719 | "acorn": "^7.1.1",
720 | "acorn-globals": "^6.0.0",
721 | "cssom": "^0.4.4",
722 | "cssstyle": "^2.2.0",
723 | "data-urls": "^2.0.0",
724 | "decimal.js": "^10.2.0",
725 | "domexception": "^2.0.1",
726 | "escodegen": "^1.14.1",
727 | "html-encoding-sniffer": "^2.0.1",
728 | "is-potential-custom-element-name": "^1.0.0",
729 | "nwsapi": "^2.2.0",
730 | "parse5": "5.1.1",
731 | "request": "^2.88.2",
732 | "request-promise-native": "^1.0.8",
733 | "saxes": "^5.0.0",
734 | "symbol-tree": "^3.2.4",
735 | "tough-cookie": "^3.0.1",
736 | "w3c-hr-time": "^1.0.2",
737 | "w3c-xmlserializer": "^2.0.0",
738 | "webidl-conversions": "^6.0.0",
739 | "whatwg-encoding": "^1.0.5",
740 | "whatwg-mimetype": "^2.3.0",
741 | "whatwg-url": "^8.0.0",
742 | "ws": "^7.2.3",
743 | "xml-name-validator": "^3.0.0"
744 | },
745 | "engines": {
746 | "node": ">=10"
747 | },
748 | "peerDependencies": {
749 | "canvas": "^2.5.0"
750 | },
751 | "peerDependenciesMeta": {
752 | "canvas": {
753 | "optional": true
754 | }
755 | }
756 | },
757 | "node_modules/jsdom/node_modules/acorn": {
758 | "version": "7.4.1",
759 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
760 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
761 | "dev": true,
762 | "bin": {
763 | "acorn": "bin/acorn"
764 | },
765 | "engines": {
766 | "node": ">=0.4.0"
767 | }
768 | },
769 | "node_modules/jsdom/node_modules/tr46": {
770 | "version": "2.0.2",
771 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
772 | "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
773 | "dev": true,
774 | "dependencies": {
775 | "punycode": "^2.1.1"
776 | },
777 | "engines": {
778 | "node": ">=8"
779 | }
780 | },
781 | "node_modules/jsdom/node_modules/webidl-conversions": {
782 | "version": "6.1.0",
783 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
784 | "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
785 | "dev": true,
786 | "engines": {
787 | "node": ">=10.4"
788 | }
789 | },
790 | "node_modules/jsdom/node_modules/whatwg-url": {
791 | "version": "8.0.0",
792 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.0.0.tgz",
793 | "integrity": "sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ==",
794 | "dev": true,
795 | "dependencies": {
796 | "lodash.sortby": "^4.7.0",
797 | "tr46": "^2.0.0",
798 | "webidl-conversions": "^5.0.0"
799 | },
800 | "engines": {
801 | "node": ">=10"
802 | }
803 | },
804 | "node_modules/jsdom/node_modules/whatwg-url/node_modules/webidl-conversions": {
805 | "version": "5.0.0",
806 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
807 | "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
808 | "dev": true,
809 | "engines": {
810 | "node": ">=8"
811 | }
812 | },
813 | "node_modules/json-schema": {
814 | "version": "0.2.3",
815 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
816 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
817 | "dev": true
818 | },
819 | "node_modules/json-schema-traverse": {
820 | "version": "0.4.1",
821 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
822 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
823 | "dev": true
824 | },
825 | "node_modules/json-stringify-safe": {
826 | "version": "5.0.1",
827 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
828 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
829 | "dev": true
830 | },
831 | "node_modules/jsprim": {
832 | "version": "1.4.1",
833 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
834 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
835 | "dev": true,
836 | "engines": [
837 | "node >=0.6.0"
838 | ],
839 | "dependencies": {
840 | "assert-plus": "1.0.0",
841 | "extsprintf": "1.3.0",
842 | "json-schema": "0.2.3",
843 | "verror": "1.10.0"
844 | }
845 | },
846 | "node_modules/levn": {
847 | "version": "0.3.0",
848 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
849 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
850 | "dev": true,
851 | "dependencies": {
852 | "prelude-ls": "~1.1.2",
853 | "type-check": "~0.3.2"
854 | },
855 | "engines": {
856 | "node": ">= 0.8.0"
857 | }
858 | },
859 | "node_modules/lodash": {
860 | "version": "4.17.19",
861 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
862 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
863 | "dev": true
864 | },
865 | "node_modules/lodash.sortby": {
866 | "version": "4.7.0",
867 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
868 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
869 | "dev": true
870 | },
871 | "node_modules/mime-db": {
872 | "version": "1.42.0",
873 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz",
874 | "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==",
875 | "dev": true,
876 | "engines": {
877 | "node": ">= 0.6"
878 | }
879 | },
880 | "node_modules/mime-types": {
881 | "version": "2.1.25",
882 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz",
883 | "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==",
884 | "dev": true,
885 | "dependencies": {
886 | "mime-db": "1.42.0"
887 | },
888 | "engines": {
889 | "node": ">= 0.6"
890 | }
891 | },
892 | "node_modules/nwsapi": {
893 | "version": "2.2.0",
894 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
895 | "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
896 | "dev": true
897 | },
898 | "node_modules/oauth-sign": {
899 | "version": "0.9.0",
900 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
901 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
902 | "dev": true,
903 | "engines": {
904 | "node": "*"
905 | }
906 | },
907 | "node_modules/optionator": {
908 | "version": "0.8.3",
909 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
910 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
911 | "dev": true,
912 | "dependencies": {
913 | "deep-is": "~0.1.3",
914 | "fast-levenshtein": "~2.0.6",
915 | "levn": "~0.3.0",
916 | "prelude-ls": "~1.1.2",
917 | "type-check": "~0.3.2",
918 | "word-wrap": "~1.2.3"
919 | },
920 | "engines": {
921 | "node": ">= 0.8.0"
922 | }
923 | },
924 | "node_modules/parse5": {
925 | "version": "5.1.1",
926 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
927 | "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
928 | "dev": true
929 | },
930 | "node_modules/path-parse": {
931 | "version": "1.0.7",
932 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
933 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
934 | "dev": true
935 | },
936 | "node_modules/performance-now": {
937 | "version": "2.1.0",
938 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
939 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
940 | "dev": true
941 | },
942 | "node_modules/picomatch": {
943 | "version": "2.3.1",
944 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
945 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
946 | "dev": true,
947 | "engines": {
948 | "node": ">=8.6"
949 | },
950 | "funding": {
951 | "url": "https://github.com/sponsors/jonschlinkert"
952 | }
953 | },
954 | "node_modules/plur": {
955 | "version": "5.1.0",
956 | "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz",
957 | "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==",
958 | "dev": true,
959 | "dependencies": {
960 | "irregular-plurals": "^3.3.0"
961 | },
962 | "engines": {
963 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
964 | },
965 | "funding": {
966 | "url": "https://github.com/sponsors/sindresorhus"
967 | }
968 | },
969 | "node_modules/prelude-ls": {
970 | "version": "1.1.2",
971 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
972 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
973 | "dev": true,
974 | "engines": {
975 | "node": ">= 0.8.0"
976 | }
977 | },
978 | "node_modules/psl": {
979 | "version": "1.8.0",
980 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
981 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
982 | "dev": true
983 | },
984 | "node_modules/punycode": {
985 | "version": "2.1.1",
986 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
987 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
988 | "dev": true,
989 | "engines": {
990 | "node": ">=6"
991 | }
992 | },
993 | "node_modules/qs": {
994 | "version": "6.5.2",
995 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
996 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
997 | "dev": true,
998 | "engines": {
999 | "node": ">=0.6"
1000 | }
1001 | },
1002 | "node_modules/request": {
1003 | "version": "2.88.2",
1004 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
1005 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
1006 | "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
1007 | "dev": true,
1008 | "dependencies": {
1009 | "aws-sign2": "~0.7.0",
1010 | "aws4": "^1.8.0",
1011 | "caseless": "~0.12.0",
1012 | "combined-stream": "~1.0.6",
1013 | "extend": "~3.0.2",
1014 | "forever-agent": "~0.6.1",
1015 | "form-data": "~2.3.2",
1016 | "har-validator": "~5.1.3",
1017 | "http-signature": "~1.2.0",
1018 | "is-typedarray": "~1.0.0",
1019 | "isstream": "~0.1.2",
1020 | "json-stringify-safe": "~5.0.1",
1021 | "mime-types": "~2.1.19",
1022 | "oauth-sign": "~0.9.0",
1023 | "performance-now": "^2.1.0",
1024 | "qs": "~6.5.2",
1025 | "safe-buffer": "^5.1.2",
1026 | "tough-cookie": "~2.5.0",
1027 | "tunnel-agent": "^0.6.0",
1028 | "uuid": "^3.3.2"
1029 | },
1030 | "engines": {
1031 | "node": ">= 6"
1032 | }
1033 | },
1034 | "node_modules/request-promise-core": {
1035 | "version": "1.1.3",
1036 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz",
1037 | "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==",
1038 | "dev": true,
1039 | "dependencies": {
1040 | "lodash": "^4.17.15"
1041 | },
1042 | "engines": {
1043 | "node": ">=0.10.0"
1044 | },
1045 | "peerDependencies": {
1046 | "request": "^2.34"
1047 | }
1048 | },
1049 | "node_modules/request-promise-native": {
1050 | "version": "1.0.8",
1051 | "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz",
1052 | "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==",
1053 | "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142",
1054 | "dev": true,
1055 | "dependencies": {
1056 | "request-promise-core": "1.1.3",
1057 | "stealthy-require": "^1.1.1",
1058 | "tough-cookie": "^2.3.3"
1059 | },
1060 | "engines": {
1061 | "node": ">=0.12.0"
1062 | },
1063 | "peerDependencies": {
1064 | "request": "^2.34"
1065 | }
1066 | },
1067 | "node_modules/request-promise-native/node_modules/tough-cookie": {
1068 | "version": "2.5.0",
1069 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1070 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1071 | "dev": true,
1072 | "dependencies": {
1073 | "psl": "^1.1.28",
1074 | "punycode": "^2.1.1"
1075 | },
1076 | "engines": {
1077 | "node": ">=0.8"
1078 | }
1079 | },
1080 | "node_modules/request/node_modules/tough-cookie": {
1081 | "version": "2.5.0",
1082 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1083 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1084 | "dev": true,
1085 | "dependencies": {
1086 | "psl": "^1.1.28",
1087 | "punycode": "^2.1.1"
1088 | },
1089 | "engines": {
1090 | "node": ">=0.8"
1091 | }
1092 | },
1093 | "node_modules/resolve": {
1094 | "version": "1.21.0",
1095 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz",
1096 | "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==",
1097 | "dev": true,
1098 | "dependencies": {
1099 | "is-core-module": "^2.8.0",
1100 | "path-parse": "^1.0.7",
1101 | "supports-preserve-symlinks-flag": "^1.0.0"
1102 | },
1103 | "bin": {
1104 | "resolve": "bin/resolve"
1105 | },
1106 | "funding": {
1107 | "url": "https://github.com/sponsors/ljharb"
1108 | }
1109 | },
1110 | "node_modules/rollup": {
1111 | "version": "2.63.0",
1112 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.63.0.tgz",
1113 | "integrity": "sha512-nps0idjmD+NXl6OREfyYXMn/dar3WGcyKn+KBzPdaLecub3x/LrId0wUcthcr8oZUAcZAR8NKcfGGFlNgGL1kQ==",
1114 | "dev": true,
1115 | "bin": {
1116 | "rollup": "dist/bin/rollup"
1117 | },
1118 | "engines": {
1119 | "node": ">=10.0.0"
1120 | },
1121 | "optionalDependencies": {
1122 | "fsevents": "~2.3.2"
1123 | }
1124 | },
1125 | "node_modules/safe-buffer": {
1126 | "version": "5.1.2",
1127 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1128 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1129 | "dev": true
1130 | },
1131 | "node_modules/safer-buffer": {
1132 | "version": "2.1.2",
1133 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1134 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1135 | "dev": true
1136 | },
1137 | "node_modules/saxes": {
1138 | "version": "5.0.1",
1139 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
1140 | "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
1141 | "dev": true,
1142 | "dependencies": {
1143 | "xmlchars": "^2.2.0"
1144 | },
1145 | "engines": {
1146 | "node": ">=10"
1147 | }
1148 | },
1149 | "node_modules/source-map": {
1150 | "version": "0.7.3",
1151 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
1152 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
1153 | "dev": true,
1154 | "engines": {
1155 | "node": ">= 8"
1156 | }
1157 | },
1158 | "node_modules/source-map-support": {
1159 | "version": "0.5.21",
1160 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
1161 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
1162 | "dev": true,
1163 | "dependencies": {
1164 | "buffer-from": "^1.0.0",
1165 | "source-map": "^0.6.0"
1166 | }
1167 | },
1168 | "node_modules/source-map-support/node_modules/source-map": {
1169 | "version": "0.6.1",
1170 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1171 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1172 | "dev": true,
1173 | "engines": {
1174 | "node": ">=0.10.0"
1175 | }
1176 | },
1177 | "node_modules/sshpk": {
1178 | "version": "1.16.1",
1179 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
1180 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
1181 | "dev": true,
1182 | "dependencies": {
1183 | "asn1": "~0.2.3",
1184 | "assert-plus": "^1.0.0",
1185 | "bcrypt-pbkdf": "^1.0.0",
1186 | "dashdash": "^1.12.0",
1187 | "ecc-jsbn": "~0.1.1",
1188 | "getpass": "^0.1.1",
1189 | "jsbn": "~0.1.0",
1190 | "safer-buffer": "^2.0.2",
1191 | "tweetnacl": "~0.14.0"
1192 | },
1193 | "bin": {
1194 | "sshpk-conv": "bin/sshpk-conv",
1195 | "sshpk-sign": "bin/sshpk-sign",
1196 | "sshpk-verify": "bin/sshpk-verify"
1197 | },
1198 | "engines": {
1199 | "node": ">=0.10.0"
1200 | }
1201 | },
1202 | "node_modules/stealthy-require": {
1203 | "version": "1.1.1",
1204 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
1205 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
1206 | "dev": true,
1207 | "engines": {
1208 | "node": ">=0.10.0"
1209 | }
1210 | },
1211 | "node_modules/sube": {
1212 | "version": "2.2.1",
1213 | "resolved": "https://registry.npmjs.org/sube/-/sube-2.2.1.tgz",
1214 | "integrity": "sha512-BSqw+L5FGGxwxtN7BMLKy0qBv3LlcCiLxQoVkbHvg1Ce1gfOgaY0opNikRboC8aqhAs0rD66HPMEmYVtmcgtFg==",
1215 | "dev": true
1216 | },
1217 | "node_modules/subscript": {
1218 | "version": "6.4.0",
1219 | "resolved": "https://registry.npmjs.org/subscript/-/subscript-6.4.0.tgz",
1220 | "integrity": "sha512-vbTZLumst2jm92uO4hec2Xgt8FSO6gH4irZMKr/jqMCPkqvgZW39KnkKzQzcGiKzBo/87WeudxRjSNRHjs4kPA==",
1221 | "dev": true
1222 | },
1223 | "node_modules/supports-preserve-symlinks-flag": {
1224 | "version": "1.0.0",
1225 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
1226 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
1227 | "dev": true,
1228 | "engines": {
1229 | "node": ">= 0.4"
1230 | },
1231 | "funding": {
1232 | "url": "https://github.com/sponsors/ljharb"
1233 | }
1234 | },
1235 | "node_modules/swapdom": {
1236 | "version": "1.1.1",
1237 | "resolved": "https://registry.npmjs.org/swapdom/-/swapdom-1.1.1.tgz",
1238 | "integrity": "sha512-d6nEZ4rr9uL1aiBc4Oo+P/VyGsmCSYFG7TIkjTlW1SPEG60qEJSqE81aUK/nDTqqmBpGNOzo27rZpUlA4Cq5Jg==",
1239 | "dev": true
1240 | },
1241 | "node_modules/symbol-tree": {
1242 | "version": "3.2.4",
1243 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
1244 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
1245 | "dev": true
1246 | },
1247 | "node_modules/templize": {
1248 | "version": "2.1.2",
1249 | "resolved": "https://registry.npmjs.org/templize/-/templize-2.1.2.tgz",
1250 | "integrity": "sha512-33gZpEen56LQu1UY15MImRkBTW5PnWzsIA1v9Z7Zqx9xqdkGNYHAr3xgT5Bi076poxtIsu9tXOtJA3lySXEINA==",
1251 | "dev": true,
1252 | "dependencies": {
1253 | "element-props": "^2.0.2",
1254 | "sube": "^2.2.1",
1255 | "subscript": "^6.4.0",
1256 | "swapdom": "^1.1.1"
1257 | }
1258 | },
1259 | "node_modules/terser": {
1260 | "version": "5.10.0",
1261 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
1262 | "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
1263 | "dev": true,
1264 | "dependencies": {
1265 | "commander": "^2.20.0",
1266 | "source-map": "~0.7.2",
1267 | "source-map-support": "~0.5.20"
1268 | },
1269 | "bin": {
1270 | "terser": "bin/terser"
1271 | },
1272 | "engines": {
1273 | "node": ">=10"
1274 | },
1275 | "peerDependencies": {
1276 | "acorn": "^8.5.0"
1277 | },
1278 | "peerDependenciesMeta": {
1279 | "acorn": {
1280 | "optional": true
1281 | }
1282 | }
1283 | },
1284 | "node_modules/tough-cookie": {
1285 | "version": "3.0.1",
1286 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
1287 | "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
1288 | "dev": true,
1289 | "dependencies": {
1290 | "ip-regex": "^2.1.0",
1291 | "psl": "^1.1.28",
1292 | "punycode": "^2.1.1"
1293 | },
1294 | "engines": {
1295 | "node": ">=6"
1296 | }
1297 | },
1298 | "node_modules/tst": {
1299 | "version": "7.0.0",
1300 | "resolved": "https://registry.npmjs.org/tst/-/tst-7.0.0.tgz",
1301 | "integrity": "sha512-xVcLee4PSqyTBj/+ckI7Cc43Je+Rr7TE/FyaLEqvmhankj4SfA0e9nU5r9znIkkyUp3zROdP6JyBLuUjwu/qVQ==",
1302 | "dev": true
1303 | },
1304 | "node_modules/tunnel-agent": {
1305 | "version": "0.6.0",
1306 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1307 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1308 | "dev": true,
1309 | "dependencies": {
1310 | "safe-buffer": "^5.0.1"
1311 | },
1312 | "engines": {
1313 | "node": "*"
1314 | }
1315 | },
1316 | "node_modules/tweetnacl": {
1317 | "version": "0.14.5",
1318 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1319 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
1320 | "dev": true
1321 | },
1322 | "node_modules/type-check": {
1323 | "version": "0.3.2",
1324 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
1325 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
1326 | "dev": true,
1327 | "dependencies": {
1328 | "prelude-ls": "~1.1.2"
1329 | },
1330 | "engines": {
1331 | "node": ">= 0.8.0"
1332 | }
1333 | },
1334 | "node_modules/uri-js": {
1335 | "version": "4.2.2",
1336 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
1337 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
1338 | "dev": true,
1339 | "dependencies": {
1340 | "punycode": "^2.1.0"
1341 | }
1342 | },
1343 | "node_modules/uuid": {
1344 | "version": "3.4.0",
1345 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1346 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
1347 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
1348 | "dev": true,
1349 | "bin": {
1350 | "uuid": "bin/uuid"
1351 | }
1352 | },
1353 | "node_modules/value-ref": {
1354 | "version": "2.1.0",
1355 | "resolved": "https://registry.npmjs.org/value-ref/-/value-ref-2.1.0.tgz",
1356 | "integrity": "sha512-74dqNOORKzQDFOsAD4np9UykJgDNCihnb0uxRfYJVW4QMMtewNs2zPonJZgYPYhIc/azP2xHnxbitPCBwt5BZg==",
1357 | "dev": true,
1358 | "dependencies": {
1359 | "sube": "^2.2.1"
1360 | }
1361 | },
1362 | "node_modules/verror": {
1363 | "version": "1.10.0",
1364 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1365 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1366 | "dev": true,
1367 | "engines": [
1368 | "node >=0.6.0"
1369 | ],
1370 | "dependencies": {
1371 | "assert-plus": "^1.0.0",
1372 | "core-util-is": "1.0.2",
1373 | "extsprintf": "^1.2.0"
1374 | }
1375 | },
1376 | "node_modules/w3c-hr-time": {
1377 | "version": "1.0.2",
1378 | "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
1379 | "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
1380 | "dev": true,
1381 | "dependencies": {
1382 | "browser-process-hrtime": "^1.0.0"
1383 | }
1384 | },
1385 | "node_modules/w3c-xmlserializer": {
1386 | "version": "2.0.0",
1387 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
1388 | "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
1389 | "dev": true,
1390 | "dependencies": {
1391 | "xml-name-validator": "^3.0.0"
1392 | },
1393 | "engines": {
1394 | "node": ">=10"
1395 | }
1396 | },
1397 | "node_modules/wait-please": {
1398 | "version": "3.1.0",
1399 | "resolved": "https://registry.npmjs.org/wait-please/-/wait-please-3.1.0.tgz",
1400 | "integrity": "sha512-e6HoJfrAaHqUHzSihLKbevy47fdO6eWDjXenuCKT0QzfuuIK3ekHUYggvjjCOjtsOMx3vcrQSXckJp6+IAkrBA==",
1401 | "dev": true
1402 | },
1403 | "node_modules/whatwg-encoding": {
1404 | "version": "1.0.5",
1405 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
1406 | "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
1407 | "dev": true,
1408 | "dependencies": {
1409 | "iconv-lite": "0.4.24"
1410 | }
1411 | },
1412 | "node_modules/whatwg-mimetype": {
1413 | "version": "2.3.0",
1414 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
1415 | "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
1416 | "dev": true
1417 | },
1418 | "node_modules/word-wrap": {
1419 | "version": "1.2.3",
1420 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
1421 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
1422 | "dev": true,
1423 | "engines": {
1424 | "node": ">=0.10.0"
1425 | }
1426 | },
1427 | "node_modules/ws": {
1428 | "version": "7.2.5",
1429 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz",
1430 | "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==",
1431 | "dev": true,
1432 | "engines": {
1433 | "node": ">=8.3.0"
1434 | },
1435 | "peerDependencies": {
1436 | "bufferutil": "^4.0.1",
1437 | "utf-8-validate": "^5.0.2"
1438 | },
1439 | "peerDependenciesMeta": {
1440 | "bufferutil": {
1441 | "optional": true
1442 | },
1443 | "utf-8-validate": {
1444 | "optional": true
1445 | }
1446 | }
1447 | },
1448 | "node_modules/xml-name-validator": {
1449 | "version": "3.0.0",
1450 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
1451 | "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
1452 | "dev": true
1453 | },
1454 | "node_modules/xmlchars": {
1455 | "version": "2.2.0",
1456 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
1457 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
1458 | "dev": true
1459 | }
1460 | },
1461 | "dependencies": {
1462 | "@rollup/plugin-node-resolve": {
1463 | "version": "13.1.3",
1464 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz",
1465 | "integrity": "sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==",
1466 | "dev": true,
1467 | "requires": {
1468 | "@rollup/pluginutils": "^3.1.0",
1469 | "@types/resolve": "1.17.1",
1470 | "builtin-modules": "^3.1.0",
1471 | "deepmerge": "^4.2.2",
1472 | "is-module": "^1.0.0",
1473 | "resolve": "^1.19.0"
1474 | }
1475 | },
1476 | "@rollup/pluginutils": {
1477 | "version": "3.1.0",
1478 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
1479 | "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
1480 | "dev": true,
1481 | "requires": {
1482 | "@types/estree": "0.0.39",
1483 | "estree-walker": "^1.0.1",
1484 | "picomatch": "^2.2.2"
1485 | }
1486 | },
1487 | "@types/estree": {
1488 | "version": "0.0.39",
1489 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
1490 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
1491 | "dev": true
1492 | },
1493 | "@types/node": {
1494 | "version": "17.0.8",
1495 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz",
1496 | "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==",
1497 | "dev": true
1498 | },
1499 | "@types/resolve": {
1500 | "version": "1.17.1",
1501 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
1502 | "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
1503 | "dev": true,
1504 | "requires": {
1505 | "@types/node": "*"
1506 | }
1507 | },
1508 | "abab": {
1509 | "version": "2.0.3",
1510 | "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz",
1511 | "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==",
1512 | "dev": true
1513 | },
1514 | "acorn": {
1515 | "version": "8.7.0",
1516 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
1517 | "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
1518 | "dev": true,
1519 | "optional": true,
1520 | "peer": true
1521 | },
1522 | "acorn-globals": {
1523 | "version": "6.0.0",
1524 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
1525 | "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
1526 | "dev": true,
1527 | "requires": {
1528 | "acorn": "^7.1.1",
1529 | "acorn-walk": "^7.1.1"
1530 | },
1531 | "dependencies": {
1532 | "acorn": {
1533 | "version": "7.4.1",
1534 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
1535 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
1536 | "dev": true
1537 | }
1538 | }
1539 | },
1540 | "acorn-walk": {
1541 | "version": "7.1.1",
1542 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz",
1543 | "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==",
1544 | "dev": true
1545 | },
1546 | "ajv": {
1547 | "version": "6.12.2",
1548 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
1549 | "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
1550 | "dev": true,
1551 | "requires": {
1552 | "fast-deep-equal": "^3.1.1",
1553 | "fast-json-stable-stringify": "^2.0.0",
1554 | "json-schema-traverse": "^0.4.1",
1555 | "uri-js": "^4.2.2"
1556 | }
1557 | },
1558 | "asn1": {
1559 | "version": "0.2.4",
1560 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
1561 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
1562 | "dev": true,
1563 | "requires": {
1564 | "safer-buffer": "~2.1.0"
1565 | }
1566 | },
1567 | "assert-plus": {
1568 | "version": "1.0.0",
1569 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
1570 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
1571 | "dev": true
1572 | },
1573 | "asynckit": {
1574 | "version": "0.4.0",
1575 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
1576 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
1577 | "dev": true
1578 | },
1579 | "aws-sign2": {
1580 | "version": "0.7.0",
1581 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
1582 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
1583 | "dev": true
1584 | },
1585 | "aws4": {
1586 | "version": "1.9.1",
1587 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
1588 | "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==",
1589 | "dev": true
1590 | },
1591 | "bcrypt-pbkdf": {
1592 | "version": "1.0.2",
1593 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
1594 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
1595 | "dev": true,
1596 | "requires": {
1597 | "tweetnacl": "^0.14.3"
1598 | }
1599 | },
1600 | "browser-process-hrtime": {
1601 | "version": "1.0.0",
1602 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
1603 | "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
1604 | "dev": true
1605 | },
1606 | "buffer-from": {
1607 | "version": "1.1.2",
1608 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
1609 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
1610 | "dev": true
1611 | },
1612 | "builtin-modules": {
1613 | "version": "3.2.0",
1614 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
1615 | "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
1616 | "dev": true
1617 | },
1618 | "caseless": {
1619 | "version": "0.12.0",
1620 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
1621 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
1622 | "dev": true
1623 | },
1624 | "combined-stream": {
1625 | "version": "1.0.8",
1626 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1627 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1628 | "dev": true,
1629 | "requires": {
1630 | "delayed-stream": "~1.0.0"
1631 | }
1632 | },
1633 | "commander": {
1634 | "version": "2.20.3",
1635 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
1636 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
1637 | "dev": true
1638 | },
1639 | "core-util-is": {
1640 | "version": "1.0.2",
1641 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1642 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
1643 | "dev": true
1644 | },
1645 | "cssom": {
1646 | "version": "0.4.4",
1647 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
1648 | "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
1649 | "dev": true
1650 | },
1651 | "cssstyle": {
1652 | "version": "2.2.0",
1653 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz",
1654 | "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==",
1655 | "dev": true,
1656 | "requires": {
1657 | "cssom": "~0.3.6"
1658 | },
1659 | "dependencies": {
1660 | "cssom": {
1661 | "version": "0.3.8",
1662 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
1663 | "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
1664 | "dev": true
1665 | }
1666 | }
1667 | },
1668 | "dashdash": {
1669 | "version": "1.14.1",
1670 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
1671 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
1672 | "dev": true,
1673 | "requires": {
1674 | "assert-plus": "^1.0.0"
1675 | }
1676 | },
1677 | "data-urls": {
1678 | "version": "2.0.0",
1679 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
1680 | "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
1681 | "dev": true,
1682 | "requires": {
1683 | "abab": "^2.0.3",
1684 | "whatwg-mimetype": "^2.3.0",
1685 | "whatwg-url": "^8.0.0"
1686 | },
1687 | "dependencies": {
1688 | "tr46": {
1689 | "version": "2.0.2",
1690 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
1691 | "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
1692 | "dev": true,
1693 | "requires": {
1694 | "punycode": "^2.1.1"
1695 | }
1696 | },
1697 | "webidl-conversions": {
1698 | "version": "5.0.0",
1699 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
1700 | "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
1701 | "dev": true
1702 | },
1703 | "whatwg-url": {
1704 | "version": "8.0.0",
1705 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.0.0.tgz",
1706 | "integrity": "sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ==",
1707 | "dev": true,
1708 | "requires": {
1709 | "lodash.sortby": "^4.7.0",
1710 | "tr46": "^2.0.0",
1711 | "webidl-conversions": "^5.0.0"
1712 | }
1713 | }
1714 | }
1715 | },
1716 | "decimal.js": {
1717 | "version": "10.2.0",
1718 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz",
1719 | "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==",
1720 | "dev": true
1721 | },
1722 | "deep-is": {
1723 | "version": "0.1.3",
1724 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
1725 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
1726 | "dev": true
1727 | },
1728 | "deepmerge": {
1729 | "version": "4.2.2",
1730 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
1731 | "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
1732 | "dev": true
1733 | },
1734 | "delayed-stream": {
1735 | "version": "1.0.0",
1736 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1737 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
1738 | "dev": true
1739 | },
1740 | "domexception": {
1741 | "version": "2.0.1",
1742 | "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
1743 | "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
1744 | "dev": true,
1745 | "requires": {
1746 | "webidl-conversions": "^5.0.0"
1747 | },
1748 | "dependencies": {
1749 | "webidl-conversions": {
1750 | "version": "5.0.0",
1751 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
1752 | "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
1753 | "dev": true
1754 | }
1755 | }
1756 | },
1757 | "ecc-jsbn": {
1758 | "version": "0.1.2",
1759 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
1760 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
1761 | "dev": true,
1762 | "requires": {
1763 | "jsbn": "~0.1.0",
1764 | "safer-buffer": "^2.1.0"
1765 | }
1766 | },
1767 | "element-props": {
1768 | "version": "2.0.4",
1769 | "resolved": "https://registry.npmjs.org/element-props/-/element-props-2.0.4.tgz",
1770 | "integrity": "sha512-nAGFQ1id3f3woxgdQGoZmlngZulvkWDXLD4rHWUUergsGrAoU0xjMU/SHtLww/NkfKUUHxY9kt/DKweVywj/lA==",
1771 | "dev": true
1772 | },
1773 | "es-module-shims": {
1774 | "version": "1.4.1",
1775 | "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-1.4.1.tgz",
1776 | "integrity": "sha512-W2vx+64vuuBhiRR1uMTireQgDAvhnkGdPEWO5Fdplp/wxYnn31oarG0IA/eM01YVQ7eGglgBdWTGe6tYRY1q9A==",
1777 | "dev": true
1778 | },
1779 | "escodegen": {
1780 | "version": "1.14.1",
1781 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz",
1782 | "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==",
1783 | "dev": true,
1784 | "requires": {
1785 | "esprima": "^4.0.1",
1786 | "estraverse": "^4.2.0",
1787 | "esutils": "^2.0.2",
1788 | "optionator": "^0.8.1",
1789 | "source-map": "~0.6.1"
1790 | },
1791 | "dependencies": {
1792 | "source-map": {
1793 | "version": "0.6.1",
1794 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1795 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1796 | "dev": true,
1797 | "optional": true
1798 | }
1799 | }
1800 | },
1801 | "esprima": {
1802 | "version": "4.0.1",
1803 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
1804 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
1805 | "dev": true
1806 | },
1807 | "estraverse": {
1808 | "version": "4.3.0",
1809 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
1810 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
1811 | "dev": true
1812 | },
1813 | "estree-walker": {
1814 | "version": "1.0.1",
1815 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
1816 | "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
1817 | "dev": true
1818 | },
1819 | "esutils": {
1820 | "version": "2.0.3",
1821 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
1822 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
1823 | "dev": true
1824 | },
1825 | "extend": {
1826 | "version": "3.0.2",
1827 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
1828 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
1829 | "dev": true
1830 | },
1831 | "extsprintf": {
1832 | "version": "1.3.0",
1833 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
1834 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
1835 | "dev": true
1836 | },
1837 | "fast-deep-equal": {
1838 | "version": "3.1.1",
1839 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
1840 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
1841 | "dev": true
1842 | },
1843 | "fast-json-stable-stringify": {
1844 | "version": "2.1.0",
1845 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1846 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1847 | "dev": true
1848 | },
1849 | "fast-levenshtein": {
1850 | "version": "2.0.6",
1851 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1852 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
1853 | "dev": true
1854 | },
1855 | "forever-agent": {
1856 | "version": "0.6.1",
1857 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
1858 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
1859 | "dev": true
1860 | },
1861 | "form-data": {
1862 | "version": "2.3.3",
1863 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
1864 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
1865 | "dev": true,
1866 | "requires": {
1867 | "asynckit": "^0.4.0",
1868 | "combined-stream": "^1.0.6",
1869 | "mime-types": "^2.1.12"
1870 | }
1871 | },
1872 | "fsevents": {
1873 | "version": "2.3.2",
1874 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1875 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1876 | "dev": true,
1877 | "optional": true
1878 | },
1879 | "function-bind": {
1880 | "version": "1.1.1",
1881 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1882 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1883 | "dev": true
1884 | },
1885 | "getpass": {
1886 | "version": "0.1.7",
1887 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
1888 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
1889 | "dev": true,
1890 | "requires": {
1891 | "assert-plus": "^1.0.0"
1892 | }
1893 | },
1894 | "har-schema": {
1895 | "version": "2.0.0",
1896 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
1897 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
1898 | "dev": true
1899 | },
1900 | "har-validator": {
1901 | "version": "5.1.3",
1902 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
1903 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
1904 | "dev": true,
1905 | "requires": {
1906 | "ajv": "^6.5.5",
1907 | "har-schema": "^2.0.0"
1908 | }
1909 | },
1910 | "has": {
1911 | "version": "1.0.3",
1912 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1913 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1914 | "dev": true,
1915 | "requires": {
1916 | "function-bind": "^1.1.1"
1917 | }
1918 | },
1919 | "htm": {
1920 | "version": "3.1.0",
1921 | "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.0.tgz",
1922 | "integrity": "sha512-L0s3Sid5r6YwrEvkig14SK3Emmc+kIjlfLhEGn2Vy3bk21JyDEes4MoDsbJk6luaPp8bugErnxPz86ZuAw6e5Q==",
1923 | "dev": true
1924 | },
1925 | "html-encoding-sniffer": {
1926 | "version": "2.0.1",
1927 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
1928 | "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
1929 | "dev": true,
1930 | "requires": {
1931 | "whatwg-encoding": "^1.0.5"
1932 | }
1933 | },
1934 | "http-signature": {
1935 | "version": "1.2.0",
1936 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
1937 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
1938 | "dev": true,
1939 | "requires": {
1940 | "assert-plus": "^1.0.0",
1941 | "jsprim": "^1.2.2",
1942 | "sshpk": "^1.7.0"
1943 | }
1944 | },
1945 | "hyperf": {
1946 | "version": "1.3.0",
1947 | "resolved": "https://registry.npmjs.org/hyperf/-/hyperf-1.3.0.tgz",
1948 | "integrity": "sha512-UJTtmUtUmsL3sSj2Zuod0+JrQGBOxRjLEYYfQdxBWS5VYTH9MiYg/d250GPSVwGQ+qYO6ATzvKYZqp4BHTVDlA==",
1949 | "dev": true,
1950 | "requires": {
1951 | "element-props": "^2.0.4",
1952 | "htm": "^3.1.0",
1953 | "sube": "^2.2.1",
1954 | "swapdom": "^1.1.1"
1955 | }
1956 | },
1957 | "iconv-lite": {
1958 | "version": "0.4.24",
1959 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1960 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1961 | "dev": true,
1962 | "requires": {
1963 | "safer-buffer": ">= 2.1.2 < 3"
1964 | }
1965 | },
1966 | "ip-regex": {
1967 | "version": "2.1.0",
1968 | "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
1969 | "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
1970 | "dev": true
1971 | },
1972 | "irregular-plurals": {
1973 | "version": "3.3.0",
1974 | "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz",
1975 | "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==",
1976 | "dev": true
1977 | },
1978 | "is-core-module": {
1979 | "version": "2.8.1",
1980 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
1981 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
1982 | "dev": true,
1983 | "requires": {
1984 | "has": "^1.0.3"
1985 | }
1986 | },
1987 | "is-module": {
1988 | "version": "1.0.0",
1989 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
1990 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
1991 | "dev": true
1992 | },
1993 | "is-potential-custom-element-name": {
1994 | "version": "1.0.0",
1995 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
1996 | "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=",
1997 | "dev": true
1998 | },
1999 | "is-typedarray": {
2000 | "version": "1.0.0",
2001 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
2002 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
2003 | "dev": true
2004 | },
2005 | "isstream": {
2006 | "version": "0.1.2",
2007 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
2008 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
2009 | "dev": true
2010 | },
2011 | "jsbn": {
2012 | "version": "0.1.1",
2013 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
2014 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
2015 | "dev": true
2016 | },
2017 | "jsdom": {
2018 | "version": "16.2.2",
2019 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.2.2.tgz",
2020 | "integrity": "sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==",
2021 | "dev": true,
2022 | "requires": {
2023 | "abab": "^2.0.3",
2024 | "acorn": "^7.1.1",
2025 | "acorn-globals": "^6.0.0",
2026 | "cssom": "^0.4.4",
2027 | "cssstyle": "^2.2.0",
2028 | "data-urls": "^2.0.0",
2029 | "decimal.js": "^10.2.0",
2030 | "domexception": "^2.0.1",
2031 | "escodegen": "^1.14.1",
2032 | "html-encoding-sniffer": "^2.0.1",
2033 | "is-potential-custom-element-name": "^1.0.0",
2034 | "nwsapi": "^2.2.0",
2035 | "parse5": "5.1.1",
2036 | "request": "^2.88.2",
2037 | "request-promise-native": "^1.0.8",
2038 | "saxes": "^5.0.0",
2039 | "symbol-tree": "^3.2.4",
2040 | "tough-cookie": "^3.0.1",
2041 | "w3c-hr-time": "^1.0.2",
2042 | "w3c-xmlserializer": "^2.0.0",
2043 | "webidl-conversions": "^6.0.0",
2044 | "whatwg-encoding": "^1.0.5",
2045 | "whatwg-mimetype": "^2.3.0",
2046 | "whatwg-url": "^8.0.0",
2047 | "ws": "^7.2.3",
2048 | "xml-name-validator": "^3.0.0"
2049 | },
2050 | "dependencies": {
2051 | "acorn": {
2052 | "version": "7.4.1",
2053 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
2054 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
2055 | "dev": true
2056 | },
2057 | "tr46": {
2058 | "version": "2.0.2",
2059 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
2060 | "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
2061 | "dev": true,
2062 | "requires": {
2063 | "punycode": "^2.1.1"
2064 | }
2065 | },
2066 | "webidl-conversions": {
2067 | "version": "6.1.0",
2068 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
2069 | "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
2070 | "dev": true
2071 | },
2072 | "whatwg-url": {
2073 | "version": "8.0.0",
2074 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.0.0.tgz",
2075 | "integrity": "sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ==",
2076 | "dev": true,
2077 | "requires": {
2078 | "lodash.sortby": "^4.7.0",
2079 | "tr46": "^2.0.0",
2080 | "webidl-conversions": "^5.0.0"
2081 | },
2082 | "dependencies": {
2083 | "webidl-conversions": {
2084 | "version": "5.0.0",
2085 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
2086 | "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
2087 | "dev": true
2088 | }
2089 | }
2090 | }
2091 | }
2092 | },
2093 | "json-schema": {
2094 | "version": "0.2.3",
2095 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
2096 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
2097 | "dev": true
2098 | },
2099 | "json-schema-traverse": {
2100 | "version": "0.4.1",
2101 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2102 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
2103 | "dev": true
2104 | },
2105 | "json-stringify-safe": {
2106 | "version": "5.0.1",
2107 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
2108 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
2109 | "dev": true
2110 | },
2111 | "jsprim": {
2112 | "version": "1.4.1",
2113 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
2114 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
2115 | "dev": true,
2116 | "requires": {
2117 | "assert-plus": "1.0.0",
2118 | "extsprintf": "1.3.0",
2119 | "json-schema": "0.2.3",
2120 | "verror": "1.10.0"
2121 | }
2122 | },
2123 | "levn": {
2124 | "version": "0.3.0",
2125 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
2126 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
2127 | "dev": true,
2128 | "requires": {
2129 | "prelude-ls": "~1.1.2",
2130 | "type-check": "~0.3.2"
2131 | }
2132 | },
2133 | "lodash": {
2134 | "version": "4.17.19",
2135 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
2136 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
2137 | "dev": true
2138 | },
2139 | "lodash.sortby": {
2140 | "version": "4.7.0",
2141 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
2142 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
2143 | "dev": true
2144 | },
2145 | "mime-db": {
2146 | "version": "1.42.0",
2147 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz",
2148 | "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==",
2149 | "dev": true
2150 | },
2151 | "mime-types": {
2152 | "version": "2.1.25",
2153 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz",
2154 | "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==",
2155 | "dev": true,
2156 | "requires": {
2157 | "mime-db": "1.42.0"
2158 | }
2159 | },
2160 | "nwsapi": {
2161 | "version": "2.2.0",
2162 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
2163 | "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
2164 | "dev": true
2165 | },
2166 | "oauth-sign": {
2167 | "version": "0.9.0",
2168 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
2169 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
2170 | "dev": true
2171 | },
2172 | "optionator": {
2173 | "version": "0.8.3",
2174 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
2175 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
2176 | "dev": true,
2177 | "requires": {
2178 | "deep-is": "~0.1.3",
2179 | "fast-levenshtein": "~2.0.6",
2180 | "levn": "~0.3.0",
2181 | "prelude-ls": "~1.1.2",
2182 | "type-check": "~0.3.2",
2183 | "word-wrap": "~1.2.3"
2184 | }
2185 | },
2186 | "parse5": {
2187 | "version": "5.1.1",
2188 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
2189 | "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
2190 | "dev": true
2191 | },
2192 | "path-parse": {
2193 | "version": "1.0.7",
2194 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
2195 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
2196 | "dev": true
2197 | },
2198 | "performance-now": {
2199 | "version": "2.1.0",
2200 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
2201 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
2202 | "dev": true
2203 | },
2204 | "picomatch": {
2205 | "version": "2.3.1",
2206 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2207 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2208 | "dev": true
2209 | },
2210 | "plur": {
2211 | "version": "5.1.0",
2212 | "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz",
2213 | "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==",
2214 | "dev": true,
2215 | "requires": {
2216 | "irregular-plurals": "^3.3.0"
2217 | }
2218 | },
2219 | "prelude-ls": {
2220 | "version": "1.1.2",
2221 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
2222 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
2223 | "dev": true
2224 | },
2225 | "psl": {
2226 | "version": "1.8.0",
2227 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
2228 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
2229 | "dev": true
2230 | },
2231 | "punycode": {
2232 | "version": "2.1.1",
2233 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
2234 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
2235 | "dev": true
2236 | },
2237 | "qs": {
2238 | "version": "6.5.2",
2239 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
2240 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
2241 | "dev": true
2242 | },
2243 | "request": {
2244 | "version": "2.88.2",
2245 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
2246 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
2247 | "dev": true,
2248 | "requires": {
2249 | "aws-sign2": "~0.7.0",
2250 | "aws4": "^1.8.0",
2251 | "caseless": "~0.12.0",
2252 | "combined-stream": "~1.0.6",
2253 | "extend": "~3.0.2",
2254 | "forever-agent": "~0.6.1",
2255 | "form-data": "~2.3.2",
2256 | "har-validator": "~5.1.3",
2257 | "http-signature": "~1.2.0",
2258 | "is-typedarray": "~1.0.0",
2259 | "isstream": "~0.1.2",
2260 | "json-stringify-safe": "~5.0.1",
2261 | "mime-types": "~2.1.19",
2262 | "oauth-sign": "~0.9.0",
2263 | "performance-now": "^2.1.0",
2264 | "qs": "~6.5.2",
2265 | "safe-buffer": "^5.1.2",
2266 | "tough-cookie": "~2.5.0",
2267 | "tunnel-agent": "^0.6.0",
2268 | "uuid": "^3.3.2"
2269 | },
2270 | "dependencies": {
2271 | "tough-cookie": {
2272 | "version": "2.5.0",
2273 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
2274 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
2275 | "dev": true,
2276 | "requires": {
2277 | "psl": "^1.1.28",
2278 | "punycode": "^2.1.1"
2279 | }
2280 | }
2281 | }
2282 | },
2283 | "request-promise-core": {
2284 | "version": "1.1.3",
2285 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz",
2286 | "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==",
2287 | "dev": true,
2288 | "requires": {
2289 | "lodash": "^4.17.15"
2290 | }
2291 | },
2292 | "request-promise-native": {
2293 | "version": "1.0.8",
2294 | "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz",
2295 | "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==",
2296 | "dev": true,
2297 | "requires": {
2298 | "request-promise-core": "1.1.3",
2299 | "stealthy-require": "^1.1.1",
2300 | "tough-cookie": "^2.3.3"
2301 | },
2302 | "dependencies": {
2303 | "tough-cookie": {
2304 | "version": "2.5.0",
2305 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
2306 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
2307 | "dev": true,
2308 | "requires": {
2309 | "psl": "^1.1.28",
2310 | "punycode": "^2.1.1"
2311 | }
2312 | }
2313 | }
2314 | },
2315 | "resolve": {
2316 | "version": "1.21.0",
2317 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz",
2318 | "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==",
2319 | "dev": true,
2320 | "requires": {
2321 | "is-core-module": "^2.8.0",
2322 | "path-parse": "^1.0.7",
2323 | "supports-preserve-symlinks-flag": "^1.0.0"
2324 | }
2325 | },
2326 | "rollup": {
2327 | "version": "2.63.0",
2328 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.63.0.tgz",
2329 | "integrity": "sha512-nps0idjmD+NXl6OREfyYXMn/dar3WGcyKn+KBzPdaLecub3x/LrId0wUcthcr8oZUAcZAR8NKcfGGFlNgGL1kQ==",
2330 | "dev": true,
2331 | "requires": {
2332 | "fsevents": "~2.3.2"
2333 | }
2334 | },
2335 | "safe-buffer": {
2336 | "version": "5.1.2",
2337 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2338 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2339 | "dev": true
2340 | },
2341 | "safer-buffer": {
2342 | "version": "2.1.2",
2343 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2344 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
2345 | "dev": true
2346 | },
2347 | "saxes": {
2348 | "version": "5.0.1",
2349 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
2350 | "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
2351 | "dev": true,
2352 | "requires": {
2353 | "xmlchars": "^2.2.0"
2354 | }
2355 | },
2356 | "source-map": {
2357 | "version": "0.7.3",
2358 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
2359 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
2360 | "dev": true
2361 | },
2362 | "source-map-support": {
2363 | "version": "0.5.21",
2364 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
2365 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
2366 | "dev": true,
2367 | "requires": {
2368 | "buffer-from": "^1.0.0",
2369 | "source-map": "^0.6.0"
2370 | },
2371 | "dependencies": {
2372 | "source-map": {
2373 | "version": "0.6.1",
2374 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2375 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2376 | "dev": true
2377 | }
2378 | }
2379 | },
2380 | "sshpk": {
2381 | "version": "1.16.1",
2382 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
2383 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
2384 | "dev": true,
2385 | "requires": {
2386 | "asn1": "~0.2.3",
2387 | "assert-plus": "^1.0.0",
2388 | "bcrypt-pbkdf": "^1.0.0",
2389 | "dashdash": "^1.12.0",
2390 | "ecc-jsbn": "~0.1.1",
2391 | "getpass": "^0.1.1",
2392 | "jsbn": "~0.1.0",
2393 | "safer-buffer": "^2.0.2",
2394 | "tweetnacl": "~0.14.0"
2395 | }
2396 | },
2397 | "stealthy-require": {
2398 | "version": "1.1.1",
2399 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
2400 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
2401 | "dev": true
2402 | },
2403 | "sube": {
2404 | "version": "2.2.1",
2405 | "resolved": "https://registry.npmjs.org/sube/-/sube-2.2.1.tgz",
2406 | "integrity": "sha512-BSqw+L5FGGxwxtN7BMLKy0qBv3LlcCiLxQoVkbHvg1Ce1gfOgaY0opNikRboC8aqhAs0rD66HPMEmYVtmcgtFg==",
2407 | "dev": true
2408 | },
2409 | "subscript": {
2410 | "version": "6.4.0",
2411 | "resolved": "https://registry.npmjs.org/subscript/-/subscript-6.4.0.tgz",
2412 | "integrity": "sha512-vbTZLumst2jm92uO4hec2Xgt8FSO6gH4irZMKr/jqMCPkqvgZW39KnkKzQzcGiKzBo/87WeudxRjSNRHjs4kPA==",
2413 | "dev": true
2414 | },
2415 | "supports-preserve-symlinks-flag": {
2416 | "version": "1.0.0",
2417 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2418 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
2419 | "dev": true
2420 | },
2421 | "swapdom": {
2422 | "version": "1.1.1",
2423 | "resolved": "https://registry.npmjs.org/swapdom/-/swapdom-1.1.1.tgz",
2424 | "integrity": "sha512-d6nEZ4rr9uL1aiBc4Oo+P/VyGsmCSYFG7TIkjTlW1SPEG60qEJSqE81aUK/nDTqqmBpGNOzo27rZpUlA4Cq5Jg==",
2425 | "dev": true
2426 | },
2427 | "symbol-tree": {
2428 | "version": "3.2.4",
2429 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
2430 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
2431 | "dev": true
2432 | },
2433 | "templize": {
2434 | "version": "2.1.2",
2435 | "resolved": "https://registry.npmjs.org/templize/-/templize-2.1.2.tgz",
2436 | "integrity": "sha512-33gZpEen56LQu1UY15MImRkBTW5PnWzsIA1v9Z7Zqx9xqdkGNYHAr3xgT5Bi076poxtIsu9tXOtJA3lySXEINA==",
2437 | "dev": true,
2438 | "requires": {
2439 | "element-props": "^2.0.2",
2440 | "sube": "^2.2.1",
2441 | "subscript": "^6.4.0",
2442 | "swapdom": "^1.1.1"
2443 | }
2444 | },
2445 | "terser": {
2446 | "version": "5.10.0",
2447 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
2448 | "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
2449 | "dev": true,
2450 | "requires": {
2451 | "commander": "^2.20.0",
2452 | "source-map": "~0.7.2",
2453 | "source-map-support": "~0.5.20"
2454 | }
2455 | },
2456 | "tough-cookie": {
2457 | "version": "3.0.1",
2458 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
2459 | "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
2460 | "dev": true,
2461 | "requires": {
2462 | "ip-regex": "^2.1.0",
2463 | "psl": "^1.1.28",
2464 | "punycode": "^2.1.1"
2465 | }
2466 | },
2467 | "tst": {
2468 | "version": "7.0.0",
2469 | "resolved": "https://registry.npmjs.org/tst/-/tst-7.0.0.tgz",
2470 | "integrity": "sha512-xVcLee4PSqyTBj/+ckI7Cc43Je+Rr7TE/FyaLEqvmhankj4SfA0e9nU5r9znIkkyUp3zROdP6JyBLuUjwu/qVQ==",
2471 | "dev": true
2472 | },
2473 | "tunnel-agent": {
2474 | "version": "0.6.0",
2475 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
2476 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
2477 | "dev": true,
2478 | "requires": {
2479 | "safe-buffer": "^5.0.1"
2480 | }
2481 | },
2482 | "tweetnacl": {
2483 | "version": "0.14.5",
2484 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
2485 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
2486 | "dev": true
2487 | },
2488 | "type-check": {
2489 | "version": "0.3.2",
2490 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
2491 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
2492 | "dev": true,
2493 | "requires": {
2494 | "prelude-ls": "~1.1.2"
2495 | }
2496 | },
2497 | "uri-js": {
2498 | "version": "4.2.2",
2499 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
2500 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
2501 | "dev": true,
2502 | "requires": {
2503 | "punycode": "^2.1.0"
2504 | }
2505 | },
2506 | "uuid": {
2507 | "version": "3.4.0",
2508 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
2509 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
2510 | "dev": true
2511 | },
2512 | "value-ref": {
2513 | "version": "2.1.0",
2514 | "resolved": "https://registry.npmjs.org/value-ref/-/value-ref-2.1.0.tgz",
2515 | "integrity": "sha512-74dqNOORKzQDFOsAD4np9UykJgDNCihnb0uxRfYJVW4QMMtewNs2zPonJZgYPYhIc/azP2xHnxbitPCBwt5BZg==",
2516 | "dev": true,
2517 | "requires": {
2518 | "sube": "^2.2.1"
2519 | }
2520 | },
2521 | "verror": {
2522 | "version": "1.10.0",
2523 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
2524 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
2525 | "dev": true,
2526 | "requires": {
2527 | "assert-plus": "^1.0.0",
2528 | "core-util-is": "1.0.2",
2529 | "extsprintf": "^1.2.0"
2530 | }
2531 | },
2532 | "w3c-hr-time": {
2533 | "version": "1.0.2",
2534 | "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
2535 | "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
2536 | "dev": true,
2537 | "requires": {
2538 | "browser-process-hrtime": "^1.0.0"
2539 | }
2540 | },
2541 | "w3c-xmlserializer": {
2542 | "version": "2.0.0",
2543 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
2544 | "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
2545 | "dev": true,
2546 | "requires": {
2547 | "xml-name-validator": "^3.0.0"
2548 | }
2549 | },
2550 | "wait-please": {
2551 | "version": "3.1.0",
2552 | "resolved": "https://registry.npmjs.org/wait-please/-/wait-please-3.1.0.tgz",
2553 | "integrity": "sha512-e6HoJfrAaHqUHzSihLKbevy47fdO6eWDjXenuCKT0QzfuuIK3ekHUYggvjjCOjtsOMx3vcrQSXckJp6+IAkrBA==",
2554 | "dev": true
2555 | },
2556 | "whatwg-encoding": {
2557 | "version": "1.0.5",
2558 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
2559 | "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
2560 | "dev": true,
2561 | "requires": {
2562 | "iconv-lite": "0.4.24"
2563 | }
2564 | },
2565 | "whatwg-mimetype": {
2566 | "version": "2.3.0",
2567 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
2568 | "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
2569 | "dev": true
2570 | },
2571 | "word-wrap": {
2572 | "version": "1.2.3",
2573 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
2574 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
2575 | "dev": true
2576 | },
2577 | "ws": {
2578 | "version": "7.2.5",
2579 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz",
2580 | "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==",
2581 | "dev": true,
2582 | "requires": {}
2583 | },
2584 | "xml-name-validator": {
2585 | "version": "3.0.0",
2586 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
2587 | "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
2588 | "dev": true
2589 | },
2590 | "xmlchars": {
2591 | "version": "2.2.0",
2592 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
2593 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
2594 | "dev": true
2595 | }
2596 | }
2597 | }
2598 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "spect",
3 | "version": "24.2.1",
4 | "description": "Observe selectors in DOM",
5 | "main": "./src/index.js",
6 | "module": "./spect.min.js",
7 | "unpkg": "./spect.min.js",
8 | "type": "module",
9 | "scripts": {
10 | "test": "node -r ./test/register.cjs test/index.js",
11 | "build": "rollup src/index.js -p @rollup/plugin-node-resolve --file spect.js --format esm",
12 | "minify": "terser spect.js -o spect.min.js --module -c passes=3 -m"
13 | },
14 | "repository": {
15 | "type": "git",
16 | "url": "git+https://github.com/spectjs/spect.git"
17 | },
18 | "browserslist": [
19 | "last 1 Chrome versions"
20 | ],
21 | "keywords": [
22 | "dom aspects",
23 | "aspect",
24 | "aop",
25 | "aspect oriented programming",
26 | "pointcut",
27 | "join point",
28 | "advice",
29 | "observable",
30 | "live collection",
31 | "HTMLCollection",
32 | "animationevent",
33 | "insertionQuery",
34 | "selector-observer",
35 | "selector-set",
36 | "fast-on-load",
37 | "qso",
38 | "mutation observer"
39 | ],
40 | "author": "Dmitry Iv ",
41 | "license": "MIT",
42 | "bugs": {
43 | "url": "https://github.com/spectjs/spect/issues"
44 | },
45 | "homepage": "https://github.com/spectjs/spect#readme",
46 | "devDependencies": {
47 | "@rollup/plugin-node-resolve": "^13.1.3",
48 | "es-module-shims": "^1.4.1",
49 | "hyperf": "^1.3.0",
50 | "jsdom": "^16.2.2",
51 | "plur": "^5.1.0",
52 | "rollup": "^2.63.0",
53 | "templize": "^2.1.2",
54 | "terser": "^5.10.0",
55 | "tst": "^7.0.0",
56 | "value-ref": "^2.1.0",
57 | "wait-please": "^3.1.0"
58 | },
59 | "files": [
60 | "src",
61 | "spect.js",
62 | "spect.min.js"
63 | ]
64 | }
65 |
--------------------------------------------------------------------------------
/plan.md:
--------------------------------------------------------------------------------
1 | # plan
2 |
3 | * [ ] make use of weakref (iterable weakmap)
4 |
5 | * [ ] migrate tests to github
6 |
7 | * [ ] publish to microjs
8 |
9 | * [x] reogranize building
10 |
11 | * [x] use sube as dependency?
12 |
13 | * [x] Split h, v, and $ into separate components:
14 | + it's confusing now to have mix of 3 separate purpose funtions
15 | + often we need just value ref, or dom builder, not aspector
16 | + _spect_ better reflects aspecting purpose of library, not mix of 3 tools
17 | + allows <5kb entry for microjs
18 | + $ can act directly with templize, not necessary own h
19 | + less tests
20 | + reduces complexity/messiness of project, separates concerns of benchmarking etc.
21 | → hyperf, vref, spect
22 |
23 | * [x] ~~swap spect(cnt, sel, fn) to spect(sel, fn, cnt?) ?~~
24 | - cnt at the end is too far
25 | + cnt is optional
26 | - cnt specifies sel naturally...
27 | → no: makes more sense as first arg, aslo api-compatible
28 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 |
5 |
6 | #
spect
7 |
8 | > Observe selectors in DOM.
9 |
10 | #### _`spect( container=document, selector, handler? )`_
11 |
12 | Observes _`selector`_ in _`container`_, invokes `handler` any time matching elements appear.
13 | Handler can return a teardown function, called for unmatched elements.
14 | Returns live collection of elements.
15 |
16 | ```js
17 | import spect from 'spect';
18 |
19 | // assign aspect
20 | const foos = spect('.foo', el => {
21 | console.log('connected');
22 | return () => console.log('disconnected');
23 | });
24 |
25 | // modify DOM
26 | const foo = document.createElement('div');
27 | foo.className = 'foo';
28 | document.body.append(foo);
29 | // ... "connected"
30 |
31 | foo.remove();
32 | // ... "disconnected"
33 | ```
34 |
35 | #### _`spect(element[s], handler)`_
36 |
37 | Listens for connected/disconnected events for the list of elements. (alternative to [fast-on-load](https://www.npmjs.com/package/fast-on-load))
38 |
39 | ```js
40 | const nodes = [...document.querySelectorAll('.foo'), document.createElement('div')];
41 |
42 | // assign listener
43 | spect(nodes, el => {
44 | console.log("connected");
45 | return () => console.log("disconnected");
46 | });
47 |
48 | document.body.appendChild(nodes.at(-1))
49 | // ... "connected"
50 |
51 | nodes.at(-1).remove()
52 | // ... "disconnected"
53 | ```
54 |
55 | ### Live Collection
56 |
57 | Spect creates live collection of elements matching the selector. Collection extends Array and implements Set / HTMLColection interfaces.
58 |
59 | ```js
60 | const foos = spect(`.foo`);
61 |
62 | // live collection
63 | foos[idx], foos.at(idx) // Array
64 | foos.has(el), foos.add(el), foos.delete(el) // Set
65 | foos.item(idx), foos.namedItem(elementId) // HTMLCollection
66 | foos.dispose() // destroy selector observer / unsubscribe
67 | ```
68 |
69 | ### Technique
70 |
71 | It combines selector parts indexing from [selector-observer](https://github.com/josh/selector-observer) for simple queries and animation events from [insertionQuery](https://github.com/naugtur/insertionQuery) for complex selectors.
72 |
73 | Simple selector is id/name/class/tag followed by classes or attrs.
74 |
75 | * `#a`, `.x.y`, `[name="e"].x`, `*`, `a-b-c:x` - simple selectors.
76 | * `a b`, `#b .c` - complex selectors.
77 |
78 |
227 |
228 |
236 |
237 |
238 |
239 |
240 | ## Alternatives
241 |
242 | [element-behaviors](https://github.com/lume/element-behaviors),
243 | [insertionQuery](https://github.com/naugtur/insertionQuery),
244 | [selector-observer](https://github.com/josh/selector-observer),
245 | [qso](https://www.npmjs.com/package/qso),
246 | [qsa-observer](https://www.npmjs.com/package/qsa-observer),
247 | [element-observer](https://github.com/WebReflection/element-observer),
248 | [livequery](https://github.com/hazzik/livequery),
249 | [selector-listener](https://github.com/csuwildcat/SelectorListener),
250 | [mutation-summary](https://github.com/rafaelw/mutation-summary),
251 | [fast-on-load](https://ghub.io/fast-on-load),
252 | [selector-set](https://github.com/josh/selector-set),
253 | [rkusa/selector-observer](https://github.com/rkusa/selector-observer).
254 | [css-chain](https://github.com/sashafirsov/css-chain)
255 |
256 | ॐ
257 |
--------------------------------------------------------------------------------
/spect.js:
--------------------------------------------------------------------------------
1 | const ELEMENT = 1, SPECT_CLASS = '⬡';
2 |
3 | let count = 0, ids = {}, classes = {}, tags = {}, names = {}, animations = {}, setCache = new WeakMap,
4 | doc = document,
5 | hasAnimevent = typeof AnimationEvent !== 'undefined',
6 | style = doc.head.appendChild(doc.createElement('style')),
7 | _proto = Symbol();
8 |
9 | // FIXME: use Symbol.species to fix add/map/etc?
10 |
11 | function spect (scope, selector, fn) {
12 | // spect`#x`
13 | if (scope && scope.raw) return new SelectorCollection(null, String.raw.apply(null, arguments))
14 | // spect(selector, fn)
15 | if (typeof scope === 'string') return new SelectorCollection(null, scope, selector)
16 | // spect(target, fn)
17 | if (!selector || typeof selector === 'function') {
18 | fn = selector;
19 | let target = scope;
20 | if (!target) target = [];
21 | if (target.nodeType) target = [target];
22 |
23 | const set = new SelectorCollection(null, null, fn);
24 | target.forEach(el => set.add(el));
25 | return set
26 | }
27 |
28 | return new SelectorCollection(scope, selector, fn)
29 | }
30 |
31 | class SelectorCollection extends Array {
32 | #items
33 | #delete
34 | #teardown
35 | #scope
36 | #callback
37 | #selector
38 | #animation
39 | #match
40 |
41 | constructor(scope, selector, fn){
42 | // self-call, like splice, map, slice etc. fall back to array
43 | if (typeof scope === 'number') return Array(scope)
44 |
45 | super();
46 |
47 | this.#items = new WeakMap;
48 | this.#delete = new WeakSet;
49 | this.#teardown = new WeakMap;
50 | this.#scope = scope;
51 | this.#callback = fn;
52 | this[_proto] = Object.getPrototypeOf(this);
53 |
54 | // ignore non-selector collections
55 | if (!selector) return
56 |
57 | // init existing elements
58 | ;(scope || doc).querySelectorAll(selector).forEach(el => { this[_proto].add.call(this, el); });
59 |
60 | // if last selector part is simple (id|name|class|tag), followed by classes or attrs - index that
61 | // #a[x][y], [name="e"].x, .x.y, *, a-b-c:x - simple
62 | // a b - not simple
63 | // a.b.c - simple, but filter is .b.c
64 | const rtokens = /(?:#([\w:-]+)|\[\s*name=['"]?([\w:-]+)['"]?\s*\]|\.([\w:-]+)|([\*\w:-]+))(\[[^\]]+\]|\.[\w:-]+)*$/;
65 |
66 | this.#selector = selector.split(/\s*,\s*/).map(selector => {
67 | selector = new String(selector);
68 |
69 | const match = selector.match(rtokens);
70 | selector.filter = selector; // default filter is itself?
71 | if (!match) return selector // skip indexing (complex one?)
72 |
73 | let [str, id, name, cls, tag, filter] = match;
74 | if (id) (ids[selector.id = id] = ids[id] || []).push(this);
75 | else if (name) (names[selector.name = name] = names[name] || []).push(this);
76 | else if (cls) (classes[selector.class = cls] = classes[cls] || []).push(this);
77 | else if (tag) (selector.tag = tag = tag.toUpperCase(), tags[tag] = tags[tag] || []).push(this);
78 |
79 | if (filter) selector.filter = selector.slice(0, match.index) + selector.slice(-filter.length);
80 | // `match.index` === 0 means selector is simple and need no match check
81 | else if (!match.index) delete selector.filter;
82 |
83 | return selector
84 | });
85 |
86 | // if extra match (filtering) is needed
87 | this.#match = this.#selector.some(sel => sel.filter);
88 |
89 | // complex selectors are handled via anim events (technique from insertionQuery).
90 | // Cases:
91 | // - dynamically added attributes so that existing nodes match (we don't observe attribs in mutation obserever)
92 | // - complex selectors, including `*` - we avoid > O(c) sync mutations check
93 | // NOTE: only connected scope supports anim observer
94 | if (!hasAnimevent || !this.#selector.every(sel => sel.tag && !sel.filter)) {
95 | let anim = animations[this.#selector];
96 | if (!anim) {
97 | const { sheet } = style, { cssRules } = sheet;
98 | anim = animations[this.#selector] = [];
99 | anim.id = `${SPECT_CLASS}-${(count++).toString(36)}`;
100 | sheet.insertRule(`@keyframes ${ anim.id }{}`, cssRules.length);
101 | sheet.insertRule(`${ this.#selector.map(sel => sel + `:not(.${ anim.id })`) }{animation:${ anim.id }}`, cssRules.length);
102 | sheet.insertRule(`.${ anim.id }{animation:${ anim.id }}`, cssRules.length);
103 | sheet.insertRule(`${ this.#selector.map(sel => sel + `.${ anim.id }`) }{animation:unset;animation:revert}`, cssRules.length);
104 | anim.rules = [].slice.call(cssRules, -4);
105 |
106 | anim.onanim = e => {
107 | if (e.animationName !== anim.id) return
108 | e.stopPropagation();
109 | e.preventDefault();
110 |
111 | let {target} = e;
112 |
113 | if (!target.classList.contains(anim.id)) {
114 | target.classList.add(anim.id);
115 | anim.forEach(set => set[_proto].add.call(set, target, false));
116 | }
117 | else {
118 | target.classList.remove(anim.id);
119 | anim.forEach(set => set.delete(target));
120 | }
121 | };
122 | doc.addEventListener('animationstart', anim.onanim, true);
123 | }
124 | this.#animation = anim.id;
125 | anim.push(this);
126 | }
127 | }
128 |
129 | add(el, check=this.#match) {
130 | if (!el) return
131 |
132 | // ignore existing
133 | if (this.#items.has(el)) return
134 |
135 | // ignore not-matching
136 | if (check) if (!el.matches(this.#selector)) return
137 |
138 | // ignore out-of-scope
139 | if (this.#scope && (this.#scope === el || !this.#scope.contains(el))) return
140 |
141 | // track collection
142 | this.push(el);
143 | this.#items.set(el, [el.id, el.name]);
144 | if (el.name) this[el.name] = el;
145 | if (el.id) this[el.id] = el;
146 |
147 | // cancel planned delete
148 | if (this.#delete.has(el)) this.#delete.delete(el);
149 |
150 | // ignore existing items
151 | if (setCache.has(el) && setCache.get(el).has(this)) return
152 |
153 | // FIXME: name/id ref obsever - seems like overkill, waiting for real-case demand
154 | // NOTE: this does not hook props added after
155 | // if ((el.name || el.id)) {
156 | // if (!el[_observer]) {
157 | // let name = el.name, id = el.id
158 | // // id/name mutation observer tracks refs and handles unmatch
159 | // ;(el[_observer] = new MutationObserver(records => {
160 | // if (name && (el.name !== name)) if (names[name]) names[name].forEach(c => (delete c[name], c.delete(el)))
161 | // if (name = el.name) if (names[name]) names[name].forEach(c => c.add(el))
162 | // if (id && (el.id !== id)) if (ids[id]) ids[id].forEach(c => (delete c[id], c.delete(el)))
163 | // if (id = el.id) if (ids[id]) ids[id].forEach(c => c.add(el))
164 | // }))
165 | // .observe(el, {attributes: true, attributeFilter: ['name', 'id']})
166 | // }
167 | // }
168 |
169 | // enable item
170 | if (!setCache.has(el)) setCache.set(el, new Set);
171 |
172 | // mark element
173 | setCache.get(el).add(this);
174 | el.classList.add(SPECT_CLASS);
175 |
176 | // notify
177 | this.#teardown.set(el, this.#callback?.(el));
178 | }
179 |
180 | delete(el, immediate = false) {
181 | if (!this.#items.has(el)) return
182 |
183 | // remove element from list sync
184 | if (this.length) this.splice(this.indexOf(el >>> 0, 1), 1);
185 | const [id, name] = this.#items.get(el);
186 | if (name) delete this[name];
187 | if (id) delete this[id];
188 | this.#items.delete(el);
189 | // plan destroy async (can be re-added)
190 | this.#delete.add(el);
191 |
192 | const del = () => {
193 | if (!this.#delete.has(el) || !this.#items) return
194 | this.#delete.delete(el);
195 |
196 | if (!setCache.has(el)) return
197 | const teardown = this.#teardown.get(el);
198 | if (teardown) {
199 | if (teardown.call) teardown(el);
200 | else if (teardown.then) teardown.then(fn => fn && fn.call && fn());
201 | }
202 | this.#teardown.delete(el);
203 |
204 | setCache.get(el).delete(this);
205 | if (!setCache.get(el).size) {
206 | setCache.delete(el);
207 | el.classList.remove(SPECT_CLASS);
208 | // if (el[_observer]) {
209 | // el[_observer].disconnect()
210 | // delete el[_observer]
211 | // }
212 | }
213 | };
214 |
215 | if (immediate) del();
216 | else requestAnimationFrame(del);
217 | }
218 |
219 | item(n) { return n < 0 ? this[this.length + n] : this[n] }
220 |
221 | namedItem(name) { return this[name] }
222 |
223 | has(item) { return this.#items.has(item) }
224 |
225 | dispose() {
226 | if (this.#selector) {
227 | this.#selector.forEach(({id, class:cls, name, tag}) => {
228 | id && ids[id].splice(ids[id].indexOf(this) >>> 0, 1);
229 | name && names[name].splice(names[name].indexOf(this) >>> 0, 1);
230 | cls && classes[cls].splice(classes[cls].indexOf(this) >>> 0, 1);
231 | tag && tags[tag].splice(tags[tag].indexOf(this) >>> 0, 1);
232 | });
233 | }
234 | if (this.#animation) {
235 | const anim = animations[this.#selector];
236 | anim.splice(anim.indexOf(this) >>> 0, 1);
237 | if (!anim.length) {
238 | doc.removeEventListener('animationstart', anim.onanim);
239 | delete animations[this.#selector];
240 | if (anim.rules) anim.rules.forEach(rule => {
241 | let idx = [].indexOf.call(style.sheet.cssRules, rule);
242 | if (~idx) style.sheet.deleteRule(idx);
243 | });
244 | }
245 | }
246 |
247 | let els = [...this];
248 | this.length = 0;
249 | els.forEach(el => this.delete(el, true));
250 | }
251 |
252 | [Symbol.dispose||=Symbol('dispose')]() { return this.dispose }
253 | }
254 |
255 | const queryAdd = (targets, sets, check) => {
256 | if (!sets || !targets) return
257 | // HTMLCollection has only iterable method
258 | ;[].forEach.call(targets, target => sets.forEach(set => set[_proto].add.call(set, target, check))
259 | );
260 | },
261 | queryDelete = target => [target.classList.contains(SPECT_CLASS) ? target : null, ...target.getElementsByClassName(SPECT_CLASS)]
262 | .forEach(node => setCache.has(node) && setCache.get(node).forEach(set => set.delete(node)))
263 |
264 | ;(new MutationObserver((list) => {
265 | for (let mutation of list) {
266 | let { addedNodes, removedNodes, target } = mutation;
267 |
268 | // fallback for no-animevents env (like SSR)
269 | // WARN: O(n*m) or worse performance (insignificant for small docs)
270 | if (!hasAnimevent) {
271 | queryDelete(target);
272 | for (let sel in animations) queryAdd([target, ...target.querySelectorAll(sel)], animations[sel], true);
273 | }
274 |
275 | removedNodes.forEach(target => target.nodeType === ELEMENT && queryDelete(target));
276 |
277 | addedNodes.forEach(target => {
278 | if (target.nodeType !== ELEMENT) return
279 |
280 | // selector-set optimization:
281 | // instead of walking all registered selectors for each node, we detect which selectors are applicable for the node
282 | if (target.id && ids[target.id]) queryAdd([target], ids[target.id]);
283 | if (target.name && names[target.name]) queryAdd([target], names[target.name]);
284 | if (target.className) target.classList.forEach(cls => queryAdd([target], classes[cls]));
285 | if (tags[target.tagName]) queryAdd([target], tags[target.tagName]);
286 |
287 | // detect children against tables
288 | // FIXME: this can be O(n)
289 | if (target.hasChildNodes()) {
290 | // NOTE: and other inlines may not have `getElementById`
291 | if (target.getElementById) for (let id in ids) queryAdd(target.getElementById(id), ids[id]);
292 | for (let name in names) queryAdd(target.getElementsByName(name), names[name]);
293 | for (let cls in classes) queryAdd(target.getElementsByClassName(cls), classes[cls]);
294 | for (let tag in tags) queryAdd(target.getElementsByTagName(tag), tags[tag]);
295 | }
296 | });
297 | }
298 | }))
299 | .observe(doc, {
300 | childList: true,
301 | subtree: true,
302 | attributes: !hasAnimevent
303 | });
304 |
305 | export { SelectorCollection, spect as default };
306 |
--------------------------------------------------------------------------------
/spect.min.js:
--------------------------------------------------------------------------------
1 | let e=0,t={},s={},i={},a={},n={},l=new WeakMap,h=document,r="undefined"!=typeof AnimationEvent,o=h.head.appendChild(h.createElement("style")),d=Symbol();function c(e,t,s){if(e&&e.raw)return new m(null,String.raw.apply(null,arguments));if("string"==typeof e)return new m(null,e,t);if(!t||"function"==typeof t){s=t;let i=e;i||(i=[]),i.nodeType&&(i=[i]);const a=new m(null,null,s);return i.forEach((e=>a.add(e))),a}return new m(e,t,s)}class m extends Array{#e;#t;#s;#i;#a;#n;#l;#h;constructor(l,c,m){if("number"==typeof l)return Array(l);if(super(),this.#e=new WeakMap,this.#t=new WeakSet,this.#s=new WeakMap,this.#i=l,this.#a=m,this[d]=Object.getPrototypeOf(this),!c)return;(l||h).querySelectorAll(c).forEach((e=>{this[d].add.call(this,e)}));const f=/(?:#([\w:-]+)|\[\s*name=['"]?([\w:-]+)['"]?\s*\]|\.([\w:-]+)|([\*\w:-]+))(\[[^\]]+\]|\.[\w:-]+)*$/;if(this.#n=c.split(/\s*,\s*/).map((e=>{const n=(e=new String(e)).match(f);if(e.filter=e,!n)return e;let[l,h,r,o,d,c]=n;return h?(t[e.id=h]=t[h]||[]).push(this):r?(a[e.name=r]=a[r]||[]).push(this):o?(s[e.class=o]=s[o]||[]).push(this):d&&(e.tag=d=d.toUpperCase(),i[d]=i[d]||[]).push(this),c?e.filter=e.slice(0,n.index)+e.slice(-c.length):n.index||delete e.filter,e})),this.#h=this.#n.some((e=>e.filter)),!r||!this.#n.every((e=>e.tag&&!e.filter))){let t=n[this.#n];if(!t){const{sheet:s}=o,{cssRules:i}=s;t=n[this.#n]=[],t.id=`⬡-${(e++).toString(36)}`,s.insertRule(`@keyframes ${t.id}{}`,i.length),s.insertRule(`${this.#n.map((e=>e+`:not(.${t.id})`))}{animation:${t.id}}`,i.length),s.insertRule(`.${t.id}{animation:${t.id}}`,i.length),s.insertRule(`${this.#n.map((e=>e+`.${t.id}`))}{animation:unset;animation:revert}`,i.length),t.rules=[].slice.call(i,-4),t.onanim=e=>{if(e.animationName!==t.id)return;e.stopPropagation(),e.preventDefault();let{target:s}=e;s.classList.contains(t.id)?(s.classList.remove(t.id),t.forEach((e=>e.delete(s)))):(s.classList.add(t.id),t.forEach((e=>e[d].add.call(e,s,!1))))},h.addEventListener("animationstart",t.onanim,!0)}this.#l=t.id,t.push(this)}}add(e,t=this.#h){e&&(this.#e.has(e)||t&&!e.matches(this.#n)||(!this.#i||this.#i!==e&&this.#i.contains(e))&&(this.push(e),this.#e.set(e,[e.id,e.name]),e.name&&(this[e.name]=e),e.id&&(this[e.id]=e),this.#t.has(e)&&this.#t.delete(e),l.has(e)&&l.get(e).has(this)||(l.has(e)||l.set(e,new Set),l.get(e).add(this),e.classList.add("⬡"),this.#s.set(e,this.#a?.(e)))))}delete(e,t=!1){if(!this.#e.has(e))return;this.length&&this.splice(this.indexOf(e>>>0,1),1);const[s,i]=this.#e.get(e);i&&delete this[i],s&&delete this[s],this.#e.delete(e),this.#t.add(e);const a=()=>{if(!this.#t.has(e)||!this.#e)return;if(this.#t.delete(e),!l.has(e))return;const t=this.#s.get(e);t&&(t.call?t(e):t.then&&t.then((e=>e&&e.call&&e()))),this.#s.delete(e),l.get(e).delete(this),l.get(e).size||(l.delete(e),e.classList.remove("⬡"))};t?a():requestAnimationFrame(a)}item(e){return e<0?this[this.length+e]:this[e]}namedItem(e){return this[e]}has(e){return this.#e.has(e)}dispose(){if(this.#n&&this.#n.forEach((({id:e,class:n,name:l,tag:h})=>{e&&t[e].splice(t[e].indexOf(this)>>>0,1),l&&a[l].splice(a[l].indexOf(this)>>>0,1),n&&s[n].splice(s[n].indexOf(this)>>>0,1),h&&i[h].splice(i[h].indexOf(this)>>>0,1)})),this.#l){const e=n[this.#n];e.splice(e.indexOf(this)>>>0,1),e.length||(h.removeEventListener("animationstart",e.onanim),delete n[this.#n],e.rules&&e.rules.forEach((e=>{let t=[].indexOf.call(o.sheet.cssRules,e);~t&&o.sheet.deleteRule(t)})))}let e=[...this];this.length=0,e.forEach((e=>this.delete(e,!0)))}[Symbol.dispose||=Symbol("dispose")](){return this.dispose}}const f=(e,t,s)=>{t&&e&&[].forEach.call(e,(e=>t.forEach((t=>t[d].add.call(t,e,s)))))},u=e=>[e.classList.contains("⬡")?e:null,...e.getElementsByClassName("⬡")].forEach((e=>l.has(e)&&l.get(e).forEach((t=>t.delete(e)))));new MutationObserver((e=>{for(let l of e){let{addedNodes:e,removedNodes:h,target:o}=l;if(!r){u(o);for(let e in n)f([o,...o.querySelectorAll(e)],n[e],!0)}h.forEach((e=>1===e.nodeType&&u(e))),e.forEach((e=>{if(1===e.nodeType&&(e.id&&t[e.id]&&f([e],t[e.id]),e.name&&a[e.name]&&f([e],a[e.name]),e.className&&e.classList.forEach((t=>f([e],s[t]))),i[e.tagName]&&f([e],i[e.tagName]),e.hasChildNodes())){if(e.getElementById)for(let s in t)f(e.getElementById(s),t[s]);for(let t in a)f(e.getElementsByName(t),a[t]);for(let t in s)f(e.getElementsByClassName(t),s[t]);for(let t in i)f(e.getElementsByTagName(t),i[t])}}))}})).observe(h,{childList:!0,subtree:!0,attributes:!r});export{m as SelectorCollection,c as default};
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | const ELEMENT = 1, SPECT_CLASS = '⬡'
2 |
3 | let count = 0, ids = {}, classes = {}, tags = {}, names = {}, animations = {}, setCache = new WeakMap,
4 | doc = document,
5 | hasAnimevent = typeof AnimationEvent !== 'undefined',
6 | style = doc.head.appendChild(doc.createElement('style')),
7 | _proto = Symbol()
8 |
9 | // FIXME: use Symbol.species to fix add/map/etc?
10 |
11 | export default function spect (scope, selector, fn) {
12 | // spect`#x`
13 | if (scope && scope.raw) return new SelectorCollection(null, String.raw.apply(null, arguments))
14 | // spect(selector, fn)
15 | if (typeof scope === 'string') return new SelectorCollection(null, scope, selector)
16 | // spect(target, fn)
17 | if (!selector || typeof selector === 'function') {
18 | fn = selector
19 | let target = scope
20 | if (!target) target = []
21 | if (target.nodeType) target = [target]
22 |
23 | const set = new SelectorCollection(null, null, fn)
24 | target.forEach(el => set.add(el))
25 | return set
26 | }
27 |
28 | return new SelectorCollection(scope, selector, fn)
29 | }
30 |
31 | export class SelectorCollection extends Array {
32 | #items
33 | #delete
34 | #teardown
35 | #scope
36 | #callback
37 | #selector
38 | #animation
39 | #match
40 |
41 | constructor(scope, selector, fn){
42 | // self-call, like splice, map, slice etc. fall back to array
43 | if (typeof scope === 'number') return Array(scope)
44 |
45 | super()
46 |
47 | this.#items = new WeakMap
48 | this.#delete = new WeakSet
49 | this.#teardown = new WeakMap
50 | this.#scope = scope
51 | this.#callback = fn
52 | this[_proto] = Object.getPrototypeOf(this)
53 |
54 | // ignore non-selector collections
55 | if (!selector) return
56 |
57 | // init existing elements
58 | ;(scope || doc).querySelectorAll(selector).forEach(el => { this[_proto].add.call(this, el) })
59 |
60 | // if last selector part is simple (id|name|class|tag), followed by classes or attrs - index that
61 | // #a[x][y], [name="e"].x, .x.y, *, a-b-c:x - simple
62 | // a b - not simple
63 | // a.b.c - simple, but filter is .b.c
64 | const rtokens = /(?:#([\w:-]+)|\[\s*name=['"]?([\w:-]+)['"]?\s*\]|\.([\w:-]+)|([\*\w:-]+))(\[[^\]]+\]|\.[\w:-]+)*$/
65 |
66 | this.#selector = selector.split(/\s*,\s*/).map(selector => {
67 | selector = new String(selector)
68 |
69 | const match = selector.match(rtokens)
70 | selector.filter = selector // default filter is itself?
71 | if (!match) return selector // skip indexing (complex one?)
72 |
73 | let [str, id, name, cls, tag, filter] = match
74 | if (id) (ids[selector.id = id] = ids[id] || []).push(this)
75 | else if (name) (names[selector.name = name] = names[name] || []).push(this)
76 | else if (cls) (classes[selector.class = cls] = classes[cls] || []).push(this)
77 | else if (tag) (selector.tag = tag = tag.toUpperCase(), tags[tag] = tags[tag] || []).push(this)
78 |
79 | if (filter) selector.filter = selector.slice(0, match.index) + selector.slice(-filter.length)
80 | // `match.index` === 0 means selector is simple and need no match check
81 | else if (!match.index) delete selector.filter
82 |
83 | return selector
84 | })
85 |
86 | // if extra match (filtering) is needed
87 | this.#match = this.#selector.some(sel => sel.filter)
88 |
89 | // complex selectors are handled via anim events (technique from insertionQuery).
90 | // Cases:
91 | // - dynamically added attributes so that existing nodes match (we don't observe attribs in mutation obserever)
92 | // - complex selectors, including `*` - we avoid > O(c) sync mutations check
93 | // NOTE: only connected scope supports anim observer
94 | if (!hasAnimevent || !this.#selector.every(sel => sel.tag && !sel.filter)) {
95 | let anim = animations[this.#selector]
96 | if (!anim) {
97 | const { sheet } = style, { cssRules } = sheet
98 | anim = animations[this.#selector] = []
99 | anim.id = `${SPECT_CLASS}-${(count++).toString(36)}`
100 | sheet.insertRule(`@keyframes ${ anim.id }{}`, cssRules.length)
101 | sheet.insertRule(`${ this.#selector.map(sel => sel + `:not(.${ anim.id })`) }{animation:${ anim.id }}`, cssRules.length)
102 | sheet.insertRule(`.${ anim.id }{animation:${ anim.id }}`, cssRules.length)
103 | sheet.insertRule(`${ this.#selector.map(sel => sel + `.${ anim.id }`) }{animation:unset;animation:revert}`, cssRules.length)
104 | anim.rules = [].slice.call(cssRules, -4)
105 |
106 | anim.onanim = e => {
107 | if (e.animationName !== anim.id) return
108 | e.stopPropagation()
109 | e.preventDefault()
110 |
111 | let {target} = e
112 |
113 | if (!target.classList.contains(anim.id)) {
114 | target.classList.add(anim.id)
115 | anim.forEach(set => set[_proto].add.call(set, target, false))
116 | }
117 | else {
118 | target.classList.remove(anim.id)
119 | anim.forEach(set => set.delete(target))
120 | }
121 | }
122 | doc.addEventListener('animationstart', anim.onanim, true)
123 | }
124 | this.#animation = anim.id
125 | anim.push(this)
126 | }
127 | }
128 |
129 | add(el, check=this.#match) {
130 | if (!el) return
131 |
132 | // ignore existing
133 | if (this.#items.has(el)) return
134 |
135 | // ignore not-matching
136 | if (check) if (!el.matches(this.#selector)) return
137 |
138 | // ignore out-of-scope
139 | if (this.#scope && (this.#scope === el || !this.#scope.contains(el))) return
140 |
141 | // track collection
142 | this.push(el)
143 | this.#items.set(el, [el.id, el.name])
144 | if (el.name) this[el.name] = el
145 | if (el.id) this[el.id] = el
146 |
147 | // cancel planned delete
148 | if (this.#delete.has(el)) this.#delete.delete(el)
149 |
150 | // ignore existing items
151 | if (setCache.has(el) && setCache.get(el).has(this)) return
152 |
153 | // FIXME: name/id ref obsever - seems like overkill, waiting for real-case demand
154 | // NOTE: this does not hook props added after
155 | // if ((el.name || el.id)) {
156 | // if (!el[_observer]) {
157 | // let name = el.name, id = el.id
158 | // // id/name mutation observer tracks refs and handles unmatch
159 | // ;(el[_observer] = new MutationObserver(records => {
160 | // if (name && (el.name !== name)) if (names[name]) names[name].forEach(c => (delete c[name], c.delete(el)))
161 | // if (name = el.name) if (names[name]) names[name].forEach(c => c.add(el))
162 | // if (id && (el.id !== id)) if (ids[id]) ids[id].forEach(c => (delete c[id], c.delete(el)))
163 | // if (id = el.id) if (ids[id]) ids[id].forEach(c => c.add(el))
164 | // }))
165 | // .observe(el, {attributes: true, attributeFilter: ['name', 'id']})
166 | // }
167 | // }
168 |
169 | // enable item
170 | if (!setCache.has(el)) setCache.set(el, new Set)
171 |
172 | // mark element
173 | setCache.get(el).add(this)
174 | el.classList.add(SPECT_CLASS)
175 |
176 | // notify
177 | this.#teardown.set(el, this.#callback?.(el))
178 | }
179 |
180 | delete(el, immediate = false) {
181 | if (!this.#items.has(el)) return
182 |
183 | // remove element from list sync
184 | if (this.length) this.splice(this.indexOf(el >>> 0, 1), 1)
185 | const [id, name] = this.#items.get(el)
186 | if (name) delete this[name]
187 | if (id) delete this[id]
188 | this.#items.delete(el)
189 | // plan destroy async (can be re-added)
190 | this.#delete.add(el)
191 |
192 | const del = () => {
193 | if (!this.#delete.has(el) || !this.#items) return
194 | this.#delete.delete(el)
195 |
196 | if (!setCache.has(el)) return
197 | const teardown = this.#teardown.get(el)
198 | if (teardown) {
199 | if (teardown.call) teardown(el)
200 | else if (teardown.then) teardown.then(fn => fn && fn.call && fn())
201 | }
202 | this.#teardown.delete(el)
203 |
204 | setCache.get(el).delete(this)
205 | if (!setCache.get(el).size) {
206 | setCache.delete(el)
207 | el.classList.remove(SPECT_CLASS)
208 | // if (el[_observer]) {
209 | // el[_observer].disconnect()
210 | // delete el[_observer]
211 | // }
212 | }
213 | }
214 |
215 | if (immediate) del()
216 | else requestAnimationFrame(del)
217 | }
218 |
219 | item(n) { return n < 0 ? this[this.length + n] : this[n] }
220 |
221 | namedItem(name) { return this[name] }
222 |
223 | has(item) { return this.#items.has(item) }
224 |
225 | dispose() {
226 | if (this.#selector) {
227 | this.#selector.forEach(({id, class:cls, name, tag}) => {
228 | id && ids[id].splice(ids[id].indexOf(this) >>> 0, 1)
229 | name && names[name].splice(names[name].indexOf(this) >>> 0, 1)
230 | cls && classes[cls].splice(classes[cls].indexOf(this) >>> 0, 1)
231 | tag && tags[tag].splice(tags[tag].indexOf(this) >>> 0, 1)
232 | })
233 | }
234 | if (this.#animation) {
235 | const anim = animations[this.#selector]
236 | anim.splice(anim.indexOf(this) >>> 0, 1)
237 | if (!anim.length) {
238 | doc.removeEventListener('animationstart', anim.onanim)
239 | delete animations[this.#selector]
240 | if (anim.rules) anim.rules.forEach(rule => {
241 | let idx = [].indexOf.call(style.sheet.cssRules, rule)
242 | if (~idx) style.sheet.deleteRule(idx)
243 | })
244 | }
245 | }
246 |
247 | let els = [...this]
248 | this.length = 0
249 | els.forEach(el => this.delete(el, true))
250 | }
251 |
252 | [Symbol.dispose||=Symbol('dispose')]() { return this.dispose }
253 | }
254 |
255 | const queryAdd = (targets, sets, check) => {
256 | if (!sets || !targets) return
257 | // HTMLCollection has only iterable method
258 | ;[].forEach.call(targets, target => sets.forEach(set => set[_proto].add.call(set, target, check))
259 | )
260 | },
261 | queryDelete = target => [target.classList.contains(SPECT_CLASS) ? target : null, ...target.getElementsByClassName(SPECT_CLASS)]
262 | .forEach(node => setCache.has(node) && setCache.get(node).forEach(set => set.delete(node)))
263 |
264 | ;(new MutationObserver((list) => {
265 | for (let mutation of list) {
266 | let { addedNodes, removedNodes, target } = mutation
267 |
268 | // fallback for no-animevents env (like SSR)
269 | // WARN: O(n*m) or worse performance (insignificant for small docs)
270 | if (!hasAnimevent) {
271 | queryDelete(target)
272 | for (let sel in animations) queryAdd([target, ...target.querySelectorAll(sel)], animations[sel], true)
273 | }
274 |
275 | removedNodes.forEach(target => target.nodeType === ELEMENT && queryDelete(target))
276 |
277 | addedNodes.forEach(target => {
278 | if (target.nodeType !== ELEMENT) return
279 |
280 | // selector-set optimization:
281 | // instead of walking all registered selectors for each node, we detect which selectors are applicable for the node
282 | if (target.id && ids[target.id]) queryAdd([target], ids[target.id])
283 | if (target.name && names[target.name]) queryAdd([target], names[target.name])
284 | if (target.className) target.classList.forEach(cls => queryAdd([target], classes[cls]))
285 | if (tags[target.tagName]) queryAdd([target], tags[target.tagName])
286 |
287 | // detect children against tables
288 | // FIXME: this can be O(n)
289 | if (target.hasChildNodes()) {
290 | // NOTE: and other inlines may not have `getElementById`
291 | if (target.getElementById) for (let id in ids) queryAdd(target.getElementById(id), ids[id])
292 | for (let name in names) queryAdd(target.getElementsByName(name), names[name])
293 | for (let cls in classes) queryAdd(target.getElementsByClassName(cls), classes[cls])
294 | for (let tag in tags) queryAdd(target.getElementsByTagName(tag), tags[tag])
295 | }
296 | })
297 | }
298 | }))
299 | .observe(doc, {
300 | childList: true,
301 | subtree: true,
302 | attributes: !hasAnimevent
303 | })
304 |
--------------------------------------------------------------------------------
/tea.yaml:
--------------------------------------------------------------------------------
1 | # https://tea.xyz/what-is-this-file
2 | ---
3 | version: 1.0.0
4 | codeOwners:
5 | - '0x18CEa38f92a0E9b028ea27DD935B36A55Cf83b06'
6 | quorum: 1
7 |
--------------------------------------------------------------------------------
/test/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Test
4 |
5 |
6 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/test/index.js:
--------------------------------------------------------------------------------
1 | import './testfill.js'
2 | import spect from '../src/index.js'
3 | import t, {is, throws, same, ok, not} from 'tst'
4 | import { tick, frame, idle, time } from 'wait-please'
5 | import v from 'value-ref'
6 | import h from 'hyperf'
7 |
8 | t('spect: tag selector', async t => {
9 | let ellog = []
10 | let proplog = []
11 | let container = document.body.appendChild(document.createElement('div'))
12 |
13 |
14 | let x1 = spect('x', el => {
15 | ellog.push(el.tagName.toLowerCase())
16 | })
17 |
18 | let el = document.createElement('x')
19 | container.appendChild(el)
20 | await tick()
21 | is(ellog, ['x'], 'simple creation')
22 |
23 | container.appendChild(document.createElement('x'))
24 | container.appendChild(document.createElement('x'))
25 | await tick()
26 | is(ellog, ['x', 'x', 'x'], 'create multiple')
27 |
28 | let x2 = spect('x', el => {
29 | proplog.push(1)
30 | })
31 | is(proplog, [1,1,1])
32 | container.appendChild(document.createElement('x'))
33 | await tick()
34 | is(ellog, ['x', 'x', 'x', 'x'], 'additional aspect')
35 | is(proplog, [1, 1, 1, 1], 'additional aspect')
36 |
37 | document.body.removeChild(container)
38 | x1.dispose()
39 | x2.dispose()
40 |
41 | })
42 | t('spect: id selector', async t => {
43 | let container = document.body.appendChild(document.createElement('div'))
44 | let log = []
45 |
46 | let x1 = spect('#x', el => {
47 | log.push(el.tagName.toLowerCase())
48 | })
49 |
50 | let x = document.createElement('div')
51 | x.id = 'x'
52 | container.appendChild(x)
53 |
54 | await frame()
55 | is(log, ['div'])
56 |
57 | document.body.removeChild(container)
58 | x1.dispose()
59 |
60 | })
61 | t('spect: init existing elements', async t => {
62 | let log = []
63 | let container = document.body.appendChild(document.createElement('div'))
64 | container.appendChild(document.createElement('x'))
65 | container.appendChild(document.createElement('x'))
66 |
67 | let xs = spect('x', el => {
68 | log.push(el.tagName.toLowerCase())
69 | })
70 |
71 | await Promise.resolve()
72 | is(log, ['x', 'x'], 'simple creation')
73 |
74 | xs.dispose()
75 | document.body.removeChild(container)
76 | })
77 | t('spect: dynamically assigned selector', async t => {
78 | let log = []
79 |
80 | let xs = spect('.x', el => {
81 | log.push(el)
82 | })
83 |
84 | let el = document.createElement('div')
85 | document.body.appendChild(el)
86 |
87 | await frame(2)
88 | is(log, [])
89 |
90 | console.log('add class')
91 | el.classList.add('x')
92 | await frame(3)
93 |
94 | is(log, [el])
95 |
96 | el.remove()
97 | xs.dispose()
98 |
99 | await frame(2)
100 | })
101 | t('spect: throwing error must not create recursion', async t => {
102 | let a = document.createElement('a')
103 | document.body.appendChild(a)
104 | // console.groupCollapsed('error here')
105 | throws(() => spect('a', el => {
106 | throw Error('That error is planned')
107 | }), 'That error is planned')
108 | // console.groupEnd()
109 | await tick()
110 |
111 | document.body.removeChild(a)
112 | // as.dispose()
113 | })
114 | t('spect: remove/add should not retrigger element', async t => {
115 | let a = document.createElement('a')
116 | let b = document.createElement('b')
117 | document.body.appendChild(b.appendChild(a))
118 |
119 | let log = []
120 | let as = spect('a', el => log.push('a'))
121 | setTimeout(() => document.body.appendChild(a))
122 |
123 | await time(10)
124 | is(log, ['a'])
125 |
126 | b.remove()
127 | a.remove()
128 | as.dispose()
129 |
130 | await frame(2)
131 | })
132 | t('spect: remove/add internal should not retrigger element', async t => {
133 | let a = document.createElement('a')
134 | let b = document.createElement('b')
135 | a.appendChild(b)
136 |
137 | let log = []
138 | let abs = spect('a b', el => log.push('b'))
139 | setTimeout(() => document.body.appendChild(a))
140 | await time(5)
141 | await frame(2)
142 | is(log, ['b'])
143 |
144 | a.remove()
145 | abs.dispose()
146 | await frame(2)
147 | })
148 | t('spect: scoped asterisk selector', async t => {
149 | let log = [], el = document.body.appendChild(document.createElement('div'))
150 | let list = spect(el, '*', el => log.push(el))
151 | let x, y, z
152 | el.appendChild(x = document.createElement('x'))
153 | el.appendChild(y = document.createElement('y'))
154 | await frame(2)
155 | is(log, [x, y])
156 |
157 | list.dispose()
158 | el.appendChild(z = document.createElement('y'))
159 | is(log, [x, y])
160 |
161 | document.body.removeChild(el)
162 | })
163 | t('spect: destructor is called on unmount', async t => {
164 | let el = document.body.appendChild(document.createElement('div'))
165 | let log = []
166 | let all = spect(el, '*', el => {
167 | log.push(1)
168 | return () => {
169 | log.push(2)
170 | }
171 | })
172 | is(log, [])
173 | el.innerHTML = 'xx'
174 | await frame(2)
175 | is(log, [1, 1])
176 |
177 | el.innerHTML = ''
178 | await frame(4)
179 | is(log, [1, 1, 2, 2], 'clear up')
180 | all.dispose()
181 |
182 | el.innerHTML = 'xx'
183 | await frame(2)
184 | is(log, [1, 1, 2, 2])
185 | el.innerHTML = ''
186 | })
187 | t('spect: changed attribute matches new nodes', async t => {
188 | let el = document.body.appendChild(document.createElement('div'))
189 | el.innerHTML = ''
190 |
191 | let log = []
192 | const abb = spect(el, 'a b.b', e => {
193 | log.push('+2')
194 | return () => log.push('-2')
195 | })
196 | const abb2 = spect(el, 'a b.b', e => { log.push('+2a')})
197 | const abbc = spect(el, 'a b.b c', e => {
198 | log.push('+3')
199 | return () => log.push('-3')
200 | })
201 | await frame(3)
202 |
203 | is(log, [])
204 | await frame(3)
205 | is(log, [])
206 |
207 | console.log('add .b')
208 | el.querySelector('b').classList.add('b')
209 | await frame(3)
210 | is(log, ['+2', '+2a', '+3'])
211 |
212 | console.log('remove .b')
213 | el.querySelector('b').classList.remove('b')
214 | await frame(3)
215 | is(log, ['+2', '+2a', '+3', '-2', '-3'])
216 |
217 |
218 | console.log('add .b again')
219 | log = []
220 | el.querySelector('b').classList.add('b')
221 | await frame(3)
222 | is(log, ['+2', '+2a', '+3'])
223 |
224 | console.log('remove .b again')
225 | el.querySelector('b').classList.remove('b')
226 | await frame(3)
227 | is(log, ['+2', '+2a', '+3', '-2', '-3'])
228 |
229 | abb.dispose()
230 | abb2.dispose()
231 | abbc.dispose()
232 |
233 | console.log('destructed')
234 | log = []
235 | el.querySelector('b').classList.add('b')
236 | await frame(2)
237 | is(log, [])
238 |
239 | el.remove()
240 | })
241 | t('spect: contextual query', async t => {
242 | let el = document.body.appendChild(document.createElement('div'))
243 | let log = []
244 | spect(el, '.x y', y => {
245 | log.push('.x y')
246 | })
247 | spect(el, '.x', el => {
248 | log.push('.x')
249 | })
250 | spect(el, () => {
251 | log.push('-')
252 | })
253 | spect(el, 'y', el => {
254 | log.push(' y')
255 | })
256 | el.innerHTML = ''
257 | await frame(3)
258 | same(log, ['.x y', '.x', '-', ' y'])
259 | })
260 | t('spect: adding/removing attribute with attribute selector, mixed with direct selector', async t => {
261 | let el = document.body.appendChild(document.createElement('div'))
262 | const log = []
263 | el.innerHTML = ''
264 | const x = el.firstChild
265 | spect(el, 'x', e => {log.push(0)})
266 | spect(el, 'x[y]', e => {
267 | log.push(1)
268 | return () => log.push(2)
269 | })
270 | await frame(2)
271 | is(log, [0])
272 | x.setAttribute('y', true)
273 | await frame(2)
274 | is(log, [0,1])
275 | x.removeAttribute('y')
276 | await frame(2)
277 | is(log, [0, 1, 2])
278 | el.remove()
279 | })
280 | t('spect: matching nodes in added subtrees', async t => {
281 | let el = document.body.appendChild(document.createElement('div'))
282 | let log = []
283 | spect(el, 'a b c d', el => {
284 | log.push('+')
285 | return () => {
286 | log.push('-')
287 | }
288 | })
289 | el.innerHTML = ''
290 | await frame(2)
291 | is(log, ['+'])
292 | el.innerHTML = ''
293 | await frame(2)
294 | is(log, ['+', '-'])
295 | })
296 | t('new custom element', async t => {
297 | let log = []
298 | spect('custom-element', () => {
299 | log.push(el.tagName)
300 | })
301 | let el = document.createElement('custom-element')
302 | document.body.appendChild(el)
303 | await frame()
304 | is(log, ['CUSTOM-ELEMENT'])
305 | document.body.removeChild(el)
306 | })
307 | t('async aspects', async t => {
308 | let a = document.createElement('a')
309 | document.body.appendChild(a)
310 |
311 | let log = []
312 | let as = spect('a', async el => {
313 | log.push(1)
314 | await tick()
315 | log.push(2)
316 | return () => log.push(3)
317 | })
318 | await frame(2)
319 | document.body.removeChild(a)
320 | await frame(2)
321 | is(log, [1, 2, 3])
322 | // as.dispose()
323 | })
324 | // FIXME: this breaks in travis
325 | t.demo('rebinding to other document', async t => {
326 | let all = await import('./libs/nodom.js')
327 | let document = new Document()
328 |
329 | var div = document.createElement("div")
330 | div.className = "foo bar"
331 |
332 | spect(div, el => {
333 | is(el.nodeName.toUpperCase(), 'DIV')
334 | })
335 | })
336 | t('empty selectors', t => {
337 | let $x = spect()
338 | is($x.length, 0)
339 |
340 | let $y = spect('xyz')
341 | is($y.length, 0)
342 |
343 | let $z = spect(null)
344 | is($z.length, 0)
345 |
346 | let $w = spect`www`
347 | is($w.length, 0)
348 |
349 | ok($x !== $y)
350 | ok($x !== $z)
351 | ok($x !== $w)
352 | })
353 | t('spect: returned result is live collection', async t => {
354 | let scope = document.body.appendChild(document.createElement('div'))
355 | let els = spect(scope, '.x')
356 | is([...els], [])
357 | scope.innerHTML = ''
358 | await frame(2)
359 | is(els.length, 1)
360 | scope.innerHTML = ''
361 | await frame(4)
362 | is(els.length, 2)
363 | scope.innerHTML = ''
364 | await frame(2)
365 | is(els.length, 0)
366 | scope.remove()
367 | })
368 | t.todo('spect: handles passed live collections like HTMLCollection')
369 | t('spect: selecting by name', async t => {
370 | let $f = spect(h``, 'input')
371 |
372 | is($f.length, 2)
373 | ok($f.a)
374 | ok($f.b)
375 |
376 | })
377 | t('spect: init on list of elements', async t => {
378 | let log = []
379 | let el = document.body.appendChild(document.createElement('div'))
380 | el.innerHTML = '12'
381 | let chldrn = spect(el.childNodes, el => {
382 | log.push(el.textContent)
383 | return () => log.push('un' + el.textContent)
384 | })
385 | is(log, ['1', '2'])
386 | el.innerHTML = ''
387 | chldrn.dispose()
388 |
389 | await frame(2)
390 | is(log, ['1', '2', 'un1', 'un2'])
391 |
392 | el.remove()
393 | })
394 | t.todo('spect: init/destroy in body of web-component')
395 | t('spect: template literal', async t => {
396 | let el = document.createElement('div')
397 | document.body.appendChild(el)
398 | el.innerHTML = ''
399 |
400 | let els = spect`div.${'x'}`
401 | is([...els], [...el.childNodes])
402 | })
403 | t('spect: changed attribute name rewires reference', async t => {
404 | let el = document.body.appendChild(h``)
405 | let x = spect(el, '#a, #b')
406 | el.childNodes[1].id = 'a'
407 | await frame(2)
408 | is([...x], [el.childNodes[1]])
409 | is(x.a, el.childNodes[1])
410 |
411 | console.log('set b')
412 | el.childNodes[1].id = 'b'
413 | x.forEach(el => (x.delete(el), x.add(el)))
414 | await tick(2)
415 | is([...x], [el.childNodes[1]])
416 | is(x.a, undefined)
417 | is(x.b, el.childNodes[1])
418 |
419 | el.innerHTML = ''
420 | await frame(2)
421 | is([...x], [])
422 | is(x.a, undefined)
423 |
424 | x.dispose()
425 | await frame(2)
426 | })
427 | t.todo('spect: comma-separated simple selectors are still simple')
428 | t('spect: simple selector cases', async t => {
429 | let root = document.body.appendChild(h``)
430 |
431 | let a = spect(root, 'a#b c.d'), ab
432 | root.append(ab = h``)
433 | await tick()
434 | is([...a], [root.childNodes[0].childNodes[1]])
435 |
436 | let b = spect('a b#c.d[name=e] f')
437 | root.append(h``)
438 | await tick(2)
439 | is([...b], [root.childNodes[2].childNodes[2].childNodes[1]])
440 |
441 | let c = spect('a[name~="b"]')
442 | root.append(h``)
443 | await tick()
444 | is([...c], [root.childNodes[3]])
445 |
446 | root.remove()
447 | a.dispose()
448 | b.dispose()
449 | c.dispose()
450 | })
451 | t('spect: does not expose private props', t => {
452 | is(Object.keys(spect`privates`), [])
453 | })
454 | t.skip('spect: complex selectors', async t => {
455 | spect('a [x] b', el => {
456 | })
457 |
458 | spect('a b > c')
459 | })
460 | t('spect: conflicting id with Set/Array method name', t => {
461 | let el = document.createElement('div')
462 | el.innerHTML = ''
463 | document.body.appendChild(el)
464 | let a = spect`#add`
465 | console.log(a)
466 |
467 | a.dispose()
468 | })
469 | t('spect: item, namedItem', async t => {
470 | let el = document.createElement('div')
471 | el.innerHTML = ''
472 | let a = spect(el, 'a')
473 |
474 | await tick(4)
475 |
476 | is(a.add, el.firstChild)
477 | is(a.item(0), a.add)
478 | is(a.namedItem('add'), a.add)
479 |
480 | a.dispose()
481 | })
482 | t('spect: debugger cases', async t => {
483 | let set
484 | console.log('*', set = spect('*'))
485 | set.delete(document.body, true)
486 | console.log(set)
487 | // is(set._match, false)
488 | set.dispose()
489 |
490 | console.log('a', set = spect('a'))
491 | // is(set._match, false)
492 | set.dispose()
493 |
494 | console.log('#a', set = spect('#a'))
495 | // is(set._match, false)
496 | set.dispose()
497 |
498 | console.log('.a', set = spect('.a'))
499 | // is(set._match, false)
500 | set.dispose()
501 |
502 | console.log('a#b', set = spect('a#b'))
503 | // is(set._match, true)
504 | set.dispose()
505 | console.log('a b', set = spect('a b'))
506 | // is(set._match, true)
507 | set.dispose()
508 | console.log('empty', spect())
509 | console.log('list', spect([h``, h``, h``]))
510 | })
511 |
512 |
513 | t.skip('spect: FOUC on unmatch', async t => {
514 | let style = document.createElement('style')
515 | style.innerHTML = '.x { color: red; font-style: italic; }'
516 | document.body.appendChild(style)
517 |
518 | spect('.x', el => {
519 | el.style.cssText = `font-size: 10rem;`
520 | return () => {
521 | el.style.cssText = ``
522 | }
523 | })
524 |
525 | let x = document.createElement('div')
526 | x.innerHTML = '123'
527 | document.body.appendChild(x)
528 | x.classList.add('x')
529 |
530 | setTimeout(() => x.classList.remove('x'), 1000)
531 | })
532 |
533 |
--------------------------------------------------------------------------------
/test/libs/nodom.js:
--------------------------------------------------------------------------------
1 | export default function nodom(t){"use strict";function e(t){this.reset(t.className)}function n(){this.childNodes=[]}(e.prototype=[]).reset=function(t){var e=(t||"").split(" ");this.length=e.length;for(var n=0;n":">"};function i(t){n.apply(this),this.nodeType=3,this.textContent=String(t)}((i.prototype=Object.create(n.prototype)).constructor=i).prototype.render=function(){return function(t){return(t||"").replace(/[&<>]/g,function(t){return r[t]})}(this.textContent)},Object.defineProperty(i.prototype,"nodeValue",{get:function(){return this.textContent}});function o(t){return t.substr(1)}var s,u=new RegExp("\\s*([ >+~])\\s*","g"),c=new RegExp("(^|[ >+~])([^ >+~]+)","ig"),a=new RegExp("#[^. >+~]+","g"),l=new RegExp("^(?:[ >+~])?([^#. >+~\\[\\]]+)"),h=new RegExp("\\.[^. >+~]+","g"),p=function(t){return null!=t?t[0]:null},d=function(t){return Array.isArray(t)&&1":if(!g(r.parentNode,n[e]))return{v:!1};break;case"+":if(!g(r.parentNode.childNodes.find(function(t){return t.nextSibling===r}),n[e]))return{v:!1};break;case"~":if(!r.parentNode.childNodes.slice(0,r.parentNode.childNodes.indexOf(r)).some(function(t){return g(t,n[e])}))return{v:!1}}},i=1;i=n));s++);return o}function b(t,e){return v(t,e,1)[0]||null}function E(){}function w(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function j(t){var n=[],r=t.split("");r.map(function(t,e){"-"===t&&n.push(e)});var i=t.split("");return n.map(function(t,e){var n=r[t+1].toUpperCase();i.splice(t-e,2,n)}),i.join("")}function L(t){var n=[],e=t.split("");e.map(function(t,e){/^[A-Z]/.test(t)&&n.push(e)});var r=t.split("");return n.map(function(t){r.splice(t,1,"-"+e[t].toLowerCase())}),r.join("")}function O(){}function C(){}E.prototype={},(O.prototype=Object.create({})).getPropertyPriority=function(t){return""},O.prototype.getPropertyValue=function(t){return w(this,t=j(t))?this[t]:""},O.prototype.setProperty=function(t,e){this[j(t)]=e},O.prototype.removeProperty=function(t){var e=this.getPropertyValue(t);return e&&delete this[j(t)],e},O.prototype.valueOf=function(){return this},O.prototype.toString=function(){var t="";for(var e in this)w(this,e)&&(t+=L(e)+": "+this[e]+"; ");return t},O.prototype.setValue=function(t){var e=t.split(";");for(var n in e){var r=n.split(":");this[r[0].trim()]=r[1].trim()}},Object.defineProperty(O.prototype,"cssText",{get:function(){return this.toString()},set:function(t){this.setValue(t)},enumerable:!0}),C.prototype={};var T="area base br col command embed hr img input keygen link meta param source track wbr".split(" ").reduce(function(t,e){return t[e]=!0,t},{});function P(t){for(var e in n.apply(this),this.attributes=new E,this.style=new O,this.dataset=new C,this.nodeType=1,t)this[e]=t[e];this.tagName||(this.tagName="div"),this.tagName=this.tagName.toLowerCase(),Object.defineProperty(this,"isVoidEl",{value:T[this.tagName]})}var x=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e}(P);(P.prototype=Object.create(n.prototype)).constructor=P;function B(){}"blur click focus".split(" ").forEach(function(t){return P.prototype[t]=B});var _="tagName view nodeType isVoidEl parent parentNode childNodes isMounted".split(" ").reduce(function(t,e){return t[e]=!0,t},{});function A(t){return t.render()}function S(){this.documentElement=this.createElement("html"),this.head=this.documentElement.appendChild(this.createElement("head")),this.body=this.documentElement.appendChild(this.createElement("body")),this.nodeType=9}P.prototype.render=function(t){var e=this,n=this.isVoidEl,r=[],i=!1,o="";for(var s in this)if("isMounted"!==s&&"style"!==s&&"attributes"!==s&&"dataset"!==s&&"_classList"!==s&&w(this,s))if(_[s])this.childNodes.length&&(i=!0);else if("_innerHTML"===s)o=this._innerHTML;else if(!_[s]){if(s in this.attributes)continue;if("function"==typeof this[s])continue;var u=void 0;switch(typeof this[s]){case"string":case"number":u='"'+this[s]+'"';break;default:u="'"+JSON.stringify(this[s])+"'"}r.push(s+"="+u)}this.className&&r.push('class="'+this.className+'"');var c=this.style.cssText;0"+this.childNodes.map(A).join("")+""+l+">"}if(!n&&o){var h=this.tagName;return"<"+[this.tagName].concat(r).join(" ")+">"+o+""+h+">"}var p=[this.tagName].concat(r).join(" ");return n?"<"+p+">":"<"+p+">"+this.tagName+">"},P.prototype.addEventListener=function(){},P.prototype.removeEventListener=function(){},P.prototype.setAttribute=function(t,e){var n=this;if("class"===t)return this.classList.splice(0,this.classList.length),void e.split(" ").forEach(function(t){return n.classList.add(t)});var r,i,o,s,u=t;/^data-/.test(t)?(u=j(t),this.dataset[u]=e,Object.defineProperty(this,u,{get:(o=this,s=u,function(){return o.dataset[s]}),enumerable:!1,configurable:!0})):w(this,u)||Object.defineProperty(this,u,{get:(r=this,i=u,function(){return r.attributes[i]}),enumerable:!0,configurable:!0}),this.attributes[t]=e},P.prototype.getAttribute=function(t){return this.attributes[t]||this[t]||null},P.prototype.removeAttribute=function(t){"class"!==t?(/^data-/.test(t)&&delete this.dataset[j(t)],w(this.attributes,t)&&(delete this.attributes[t],delete this[t])):this.classList.reset()},P.prototype.appendChild=function(t){if(this.isVoidEl)return t;t.parentNode=this;for(var e=0;e`, {
4 | url: "http://localhost/",
5 | storageQuota: 10000000,
6 | pretendToBeVisual: true,
7 | FetchExternalResources: false,
8 | ProcessExternalResources: false
9 | })
10 |
11 | let props = Object.getOwnPropertyNames(window)
12 |
13 | props.forEach(prop => {
14 | if (prop in global) return
15 | Object.defineProperty(global, prop, {
16 | configurable: true,
17 | get: () => window[prop]
18 | })
19 | })
20 |
--------------------------------------------------------------------------------
/test/testfill.js:
--------------------------------------------------------------------------------
1 | // test helpers
2 | Object.defineProperty(DocumentFragment.prototype, 'outerHTML', {
3 | get() {
4 | let s = '<>'
5 | this.childNodes.forEach(n => {
6 | s += n.nodeType === 3 ? n.textContent : n.outerHTML != null ? n.outerHTML : ''
7 | })
8 | s+='>'
9 | return s
10 | }
11 | })
12 | Object.defineProperty(DocumentFragment.prototype, 'innerHTML', {get() { return this.outerHTML.slice(2,-3) }})
13 | Object.defineProperty(DocumentFragment.prototype, 'innerHTMLClean', {get() { return this.outerHTMLClean.slice(2,-3) }})
14 | Object.defineProperty(DocumentFragment.prototype, 'outerHTMLClean', {
15 | get() {
16 | let s = '<>'
17 | this.childNodes.forEach(n => {
18 | s += n.nodeType === 3 ? n.textContent : (n.outerHTMLClean != null ? n.outerHTMLClean : '')
19 | })
20 | s+='>'
21 | return s
22 | }
23 | })
24 |
25 | Object.defineProperty(Element.prototype, 'innerHTMLClean', {
26 | get() {
27 | let ihtml = this.innerHTML
28 | return ihtml.replace(//g, '').replace(/\u200C/g, '')
29 | }
30 | })
31 | Object.defineProperty(Element.prototype, 'outerHTMLClean', {
32 | get() {
33 | let ohtml = this.outerHTML
34 | return ohtml.replace(//g, '').replace(/\u200C/g, '')
35 | }
36 | })
37 |
38 | export default null
39 |
--------------------------------------------------------------------------------