├── .eslintignore ├── .eslintrc.cjs ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.yaml │ └── feature_request.yaml ├── flow.png ├── flow_dark.png └── workflows │ ├── lint.yml │ └── publish-to-npm.yml ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── package.json ├── playwright.config.ts ├── pnpm-lock.yaml ├── src ├── app.d.ts ├── app.html ├── index.test.ts ├── lib │ ├── constants.ts │ ├── defer.ts │ ├── handle.ts │ ├── index.ts │ ├── store.ts │ └── vite │ │ └── index.ts └── routes │ └── +page.svelte ├── static └── favicon.png ├── svelte.config.js ├── tests └── test.ts ├── tsconfig.json └── vite.config.ts /.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: '@typescript-eslint/parser', 4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], 5 | plugins: ['svelte3', '@typescript-eslint'], 6 | ignorePatterns: ['*.cjs'], 7 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 8 | settings: { 9 | 'svelte3/typescript': () => require('typescript') 10 | }, 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020 14 | }, 15 | env: { 16 | browser: true, 17 | es2017: true, 18 | node: true 19 | }, 20 | rules: { 21 | '@typescript-eslint/no-explicit-any': 'off' 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yaml: -------------------------------------------------------------------------------- 1 | name: "\U0001F41E Bug report" 2 | description: Report an issue 3 | body: 4 | - type: markdown 5 | attributes: 6 | value: | 7 | First thing first, thanks for reporting! 8 | - type: textarea 9 | id: bug-description 10 | attributes: 11 | label: Describe the bug 12 | description: A clear and concise description of what the bug is. If you intend to submit a PR for this issue, tell us in the description. Thanks! 13 | placeholder: Bug description 14 | validations: 15 | required: true 16 | - type: textarea 17 | id: reproduction 18 | attributes: 19 | label: Reproduction 20 | description: Please provide a link to a repo or better a stackblitz/replit that can reproduce the problem you ran into. This will speed up the fixing. 21 | placeholder: Reproduction 22 | validations: 23 | required: true 24 | - type: textarea 25 | id: logs 26 | attributes: 27 | label: Logs 28 | description: 'Please include browser console and server logs around the time this bug occurred. Optional if provided reproduction. Please try not to insert an image but copy paste the log text.' 29 | render: shell 30 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yaml: -------------------------------------------------------------------------------- 1 | name: "\U0001F4A1 Feature Request" 2 | description: Request a new feature 3 | body: 4 | - type: markdown 5 | attributes: 6 | value: | 7 | Thank you for taking the time to propose a new idea 8 | - type: textarea 9 | id: problem 10 | attributes: 11 | label: Describe the problem 12 | description: Please provide a clear and concise description the problem this feature would solve. The more information you can provide here, the better. 13 | placeholder: I would like to... 14 | validations: 15 | required: true 16 | - type: textarea 17 | id: solution 18 | attributes: 19 | label: Describe the proposed solution 20 | description: Try to provide a description of the API you would like to see implemented 21 | placeholder: I would like to see... 22 | validations: 23 | required: true 24 | -------------------------------------------------------------------------------- /.github/flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paoloricciuti/sveltekit-defer/661ec5aecc2202d551231ce898e9cad6bd0015db/.github/flow.png -------------------------------------------------------------------------------- /.github/flow_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paoloricciuti/sveltekit-defer/661ec5aecc2202d551231ce898e9cad6bd0015db/.github/flow_dark.png -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Run Lint 2 | on: 3 | pull_request: 4 | branches: 5 | - master 6 | 7 | jobs: 8 | lint: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - uses: actions/setup-node@v2 13 | with: 14 | node-version: '16' 15 | - run: npm install -g pnpm 16 | - run: pnpm install 17 | - run: pnpm run lint 18 | # - run: npm test 19 | -------------------------------------------------------------------------------- /.github/workflows/publish-to-npm.yml: -------------------------------------------------------------------------------- 1 | name: Publish Package to npmjs 2 | on: 3 | release: 4 | types: [created] 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v3 10 | # Setup .npmrc file to publish to npm 11 | - uses: actions/setup-node@v3 12 | with: 13 | node-version: '16.x' 14 | registry-url: 'https://registry.npmjs.org' 15 | - run: npm i 16 | - run: npm run build 17 | - working-directory: package 18 | run: npm publish 19 | env: 20 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | vite.config.js.timestamp-* 10 | vite.config.ts.timestamp-* 11 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "pluginSearchDirs": ["."], 8 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 9 | } 10 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | - Demonstrating empathy and kindness toward other people 21 | - Being respectful of differing opinions, viewpoints, and experiences 22 | - Giving and gracefully accepting constructive feedback 23 | - Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | - Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | - The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | - Trolling, insulting or derogatory comments, and personal or political attacks 33 | - Public or private harassment 34 | - Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | - Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | ricciutipaolo@gmail.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Paolo Ricciuti 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > **Warning** Since this project Sveltekit has proper support for the defer api. This package is hereby deprecated. See [the official documentation](https://kit.svelte.dev/docs/load#streaming-with-promises) to know how to stream in Sveltekit. 2 | 3 | # sveltekit-defer 4 | 5 | ⚠ This is extremely WIP 6 | 7 | This package allows you to transfare Promises over the wire in sveltekit. It uses SSE and stores to let you write code as close as possible to "vanilla sveltekit" while giving you the opportunity (with a simple await) to choose what data you want available as soon as the page load and what data it's not that important to you. 8 | 9 | Here's an example of what you would write; 10 | 11 | **hooks.server.ts** 12 | 13 | ```ts 14 | import { defer_handle } from 'sveltekit-defer'; 15 | import type { Handle } from '@sveltejs/kit'; 16 | 17 | export const handle: Handle = defer_handle; 18 | ``` 19 | 20 | if you have other handles you can chain them with the utility function `sequence` provided by sveltekit. 21 | 22 | **hooks.server.ts** 23 | 24 | ```ts 25 | import { defer_handle } from 'sveltekit-defer'; 26 | import { sequence } from '@sveltejs/kit/hooks'; 27 | import type { Handle } from '@sveltejs/kit'; 28 | 29 | export const handle: Handle = sequence(defer_handle, your_handle); 30 | ``` 31 | 32 | you can than define a `+page.server.ts` wrapping the load function inside the defer function 33 | 34 | ```ts 35 | import type { ServerLoadEvent } from '@sveltejs/kit'; 36 | import { defer } from 'sveltekit-defer'; 37 | import type { PageServerLoad } from './$types'; 38 | 39 | async function get_blog() { 40 | await new Promise((r) => setTimeout(r, 7000)); 41 | return "A long blog post that it's very critical so the user need to see it right away"; 42 | } 43 | 44 | async function get_comments() { 45 | await new Promise((r) => setTimeout(r, 10000)); 46 | return [ 47 | { author: 'Antonio', comment: 'Very cool' }, 48 | { author: 'Oskar', comment: "Yeah it's wonderful" } 49 | ]; 50 | } 51 | 52 | /** 53 | * Wrap you actual load function inside our defer function to unlock the defer functionality 54 | */ 55 | export const load: PageServerLoad = defer(async (event: ServerLoadEvent) => { 56 | // start the fetch for the comments right away without awaiting 57 | const comments = get_comments(); 58 | // await the blog post given that is critical content 59 | const blog = await get_blog(); 60 | //return the promise (comments) and the blog post 61 | return { 62 | blog, 63 | comments 64 | }; 65 | }); 66 | ``` 67 | 68 | then on the client side you can access the data via the store provided by `sveltekit-defer` 69 | 70 | ```svelte 71 | 77 | 78 |
79 |
80 | 81 | {$data.blog} 82 |
83 |
84 | 94 |
95 |
96 | ``` 97 | 98 | ## Configuration 99 | 100 | `sveltekit-defer` makes use of apis that require to choose a name for them (e.g we need to create a couple of endpoints, an event name, a field to store the deferred promises etc etc). We tryed to chose unique enaugh names so that they should never collide with your applications but you know what they say and the internet is a vast enaugh place to encounter the weirdest circumstances. To avoid this `sveltekit-defer` provide a custom vite plugin to override those names. 101 | 102 | ```ts 103 | import { sveltekit } from '@sveltejs/kit/vite'; 104 | import { sveltekit_defer } from 'sveltekit-defer/vite'; 105 | import type { UserConfig } from 'vite'; 106 | 107 | const config: UserConfig = { 108 | plugins: [ 109 | sveltekit_defer({ 110 | cookie_name: 'your_cookie_name', 111 | stream_event: 'your_stream_event', 112 | stream_pathname: '/your_pathname', //this should start with a / but don't worry, if you don't we take care of it 113 | promise_field: 'your_promise_field' 114 | }), 115 | sveltekit() 116 | ] 117 | }; 118 | 119 | export default config; 120 | ``` 121 | 122 | Make sure to put this plugin before the `sveltekit` one. 123 | 124 | ## How it works? 125 | 126 | Here's how it works: 127 | 128 | 1. The handle function add two endpoints to your project, a GET and a POST: the GET endpoint uses server sent event to notify the client whenever one of the Promises on the server has resolved and the POST endpoint is used to trigger such event 129 | 1. The defer function takes the return value of your load function and keep track of your Promises sticking them into an array. 130 | 1. Once on the client the store create an EventStream and register a callback on the server sent event, it take the data returned from the load function and for every key in the promises array it create a new Promise saving the resolver and the rejecter in a Map 131 | 1. Once the promise on the server resolves a post request is made to the POST endpoint managed by the handle function 132 | 1. A new event is put out from the server sent event endpoint 133 | 1. The callback registered in the store fires and the store resolves the correct Promise giving you back the data. 134 | 135 | Here's a simple flow diagram to depict this 136 | 137 | ![](https://raw.githubusercontent.com/paoloricciuti/sveltekit-defer/master/.github/flow.png#gh-light-mode-only) 138 | ![](https://raw.githubusercontent.com/paoloricciuti/sveltekit-defer/master/.github/flow_dark.png#gh-dark-mode-only) 139 | 140 | ## What to do now? 141 | 142 | There's a lot to do, but the first thing is to make sure that this doesn't create some super-huge security/performance issue and generally if there are things that can be done better. 143 | 144 | Feel free to open an issue if you found something that is not working or if you have some ideas on how to improve. 145 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sveltekit-defer", 3 | "version": "0.0.6", 4 | "repository": "git+https://github.com/paoloricciuti/sveltekit-defer.git", 5 | "author": "Paolo Ricciuti", 6 | "license": "MIT", 7 | "scripts": { 8 | "dev": "vite dev", 9 | "build": "svelte-kit sync && svelte-package", 10 | "prepublishOnly": "echo 'Did you mean to publish `./package/`, instead of `./`?' && exit 1", 11 | "test": "playwright test", 12 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 13 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 14 | "test:unit": "vitest", 15 | "lint": "prettier --plugin-search-dir . --check . && eslint .", 16 | "format": "prettier --plugin-search-dir . --write ." 17 | }, 18 | "devDependencies": { 19 | "@playwright/test": "^1.28.1", 20 | "@sveltejs/adapter-auto": "^1.0.0", 21 | "@sveltejs/kit": "^1.0.0", 22 | "@sveltejs/package": "^1.0.0", 23 | "@typescript-eslint/eslint-plugin": "^5.45.0", 24 | "@typescript-eslint/parser": "^5.45.0", 25 | "eslint": "^8.28.0", 26 | "eslint-config-prettier": "^8.5.0", 27 | "eslint-plugin-svelte3": "^4.0.0", 28 | "prettier": "^2.8.0", 29 | "prettier-plugin-svelte": "^2.8.1", 30 | "svelte": "^3.54.0", 31 | "svelte-check": "^3.0.1", 32 | "tslib": "^2.4.1", 33 | "typescript": "^4.9.3", 34 | "vite": "^4.0.0", 35 | "vitest": "^0.25.3" 36 | }, 37 | "peerDependencies": { 38 | "@sveltejs/kit": "^1.0.0", 39 | "devalue": "^4.2.3", 40 | "magic-string": "^0.27.0", 41 | "svelte": "^3.54.0" 42 | }, 43 | "type": "module", 44 | "dependencies": { 45 | "devalue": "^4.2.3", 46 | "magic-string": "^0.27.0" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import type { PlaywrightTestConfig } from '@playwright/test'; 2 | 3 | const config: PlaywrightTestConfig = { 4 | webServer: { 5 | command: 'npm run build && npm run preview', 6 | port: 4173 7 | }, 8 | testDir: 'tests' 9 | }; 10 | 11 | export default config; 12 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@playwright/test': ^1.28.1 5 | '@sveltejs/adapter-auto': ^1.0.0 6 | '@sveltejs/kit': ^1.0.0 7 | '@sveltejs/package': ^1.0.0 8 | '@typescript-eslint/eslint-plugin': ^5.45.0 9 | '@typescript-eslint/parser': ^5.45.0 10 | devalue: ^4.2.3 11 | eslint: ^8.28.0 12 | eslint-config-prettier: ^8.5.0 13 | eslint-plugin-svelte3: ^4.0.0 14 | magic-string: ^0.27.0 15 | prettier: ^2.8.0 16 | prettier-plugin-svelte: ^2.8.1 17 | svelte: ^3.54.0 18 | svelte-check: ^3.0.1 19 | tslib: ^2.4.1 20 | typescript: ^4.9.3 21 | vite: ^4.0.0 22 | vitest: ^0.25.3 23 | 24 | dependencies: 25 | devalue: 4.2.3 26 | magic-string: 0.27.0 27 | 28 | devDependencies: 29 | '@playwright/test': 1.30.0 30 | '@sveltejs/adapter-auto': 1.0.2_@sveltejs+kit@1.3.10 31 | '@sveltejs/kit': 1.3.10_svelte@3.55.1+vite@4.1.1 32 | '@sveltejs/package': 1.0.2_4x7phaipmicbaooxtnresslofa 33 | '@typescript-eslint/eslint-plugin': 5.50.0_go4drrxstycfikanvu45pi4vgq 34 | '@typescript-eslint/parser': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64 35 | eslint: 8.33.0 36 | eslint-config-prettier: 8.6.0_eslint@8.33.0 37 | eslint-plugin-svelte3: 4.0.0_4omm2ewoudhgnmf7aocafatnc4 38 | prettier: 2.8.3 39 | prettier-plugin-svelte: 2.9.0_kdmmghgdi3ngrsq6otxkjilbry 40 | svelte: 3.55.1 41 | svelte-check: 3.0.3_svelte@3.55.1 42 | tslib: 2.5.0 43 | typescript: 4.9.5 44 | vite: 4.1.1 45 | vitest: 0.25.8 46 | 47 | packages: 48 | 49 | /@esbuild/android-arm/0.16.17: 50 | resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} 51 | engines: {node: '>=12'} 52 | cpu: [arm] 53 | os: [android] 54 | requiresBuild: true 55 | dev: true 56 | optional: true 57 | 58 | /@esbuild/android-arm64/0.16.17: 59 | resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} 60 | engines: {node: '>=12'} 61 | cpu: [arm64] 62 | os: [android] 63 | requiresBuild: true 64 | dev: true 65 | optional: true 66 | 67 | /@esbuild/android-x64/0.16.17: 68 | resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} 69 | engines: {node: '>=12'} 70 | cpu: [x64] 71 | os: [android] 72 | requiresBuild: true 73 | dev: true 74 | optional: true 75 | 76 | /@esbuild/darwin-arm64/0.16.17: 77 | resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} 78 | engines: {node: '>=12'} 79 | cpu: [arm64] 80 | os: [darwin] 81 | requiresBuild: true 82 | dev: true 83 | optional: true 84 | 85 | /@esbuild/darwin-x64/0.16.17: 86 | resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} 87 | engines: {node: '>=12'} 88 | cpu: [x64] 89 | os: [darwin] 90 | requiresBuild: true 91 | dev: true 92 | optional: true 93 | 94 | /@esbuild/freebsd-arm64/0.16.17: 95 | resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} 96 | engines: {node: '>=12'} 97 | cpu: [arm64] 98 | os: [freebsd] 99 | requiresBuild: true 100 | dev: true 101 | optional: true 102 | 103 | /@esbuild/freebsd-x64/0.16.17: 104 | resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} 105 | engines: {node: '>=12'} 106 | cpu: [x64] 107 | os: [freebsd] 108 | requiresBuild: true 109 | dev: true 110 | optional: true 111 | 112 | /@esbuild/linux-arm/0.16.17: 113 | resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} 114 | engines: {node: '>=12'} 115 | cpu: [arm] 116 | os: [linux] 117 | requiresBuild: true 118 | dev: true 119 | optional: true 120 | 121 | /@esbuild/linux-arm64/0.16.17: 122 | resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} 123 | engines: {node: '>=12'} 124 | cpu: [arm64] 125 | os: [linux] 126 | requiresBuild: true 127 | dev: true 128 | optional: true 129 | 130 | /@esbuild/linux-ia32/0.16.17: 131 | resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} 132 | engines: {node: '>=12'} 133 | cpu: [ia32] 134 | os: [linux] 135 | requiresBuild: true 136 | dev: true 137 | optional: true 138 | 139 | /@esbuild/linux-loong64/0.16.17: 140 | resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} 141 | engines: {node: '>=12'} 142 | cpu: [loong64] 143 | os: [linux] 144 | requiresBuild: true 145 | dev: true 146 | optional: true 147 | 148 | /@esbuild/linux-mips64el/0.16.17: 149 | resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} 150 | engines: {node: '>=12'} 151 | cpu: [mips64el] 152 | os: [linux] 153 | requiresBuild: true 154 | dev: true 155 | optional: true 156 | 157 | /@esbuild/linux-ppc64/0.16.17: 158 | resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} 159 | engines: {node: '>=12'} 160 | cpu: [ppc64] 161 | os: [linux] 162 | requiresBuild: true 163 | dev: true 164 | optional: true 165 | 166 | /@esbuild/linux-riscv64/0.16.17: 167 | resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} 168 | engines: {node: '>=12'} 169 | cpu: [riscv64] 170 | os: [linux] 171 | requiresBuild: true 172 | dev: true 173 | optional: true 174 | 175 | /@esbuild/linux-s390x/0.16.17: 176 | resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} 177 | engines: {node: '>=12'} 178 | cpu: [s390x] 179 | os: [linux] 180 | requiresBuild: true 181 | dev: true 182 | optional: true 183 | 184 | /@esbuild/linux-x64/0.16.17: 185 | resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} 186 | engines: {node: '>=12'} 187 | cpu: [x64] 188 | os: [linux] 189 | requiresBuild: true 190 | dev: true 191 | optional: true 192 | 193 | /@esbuild/netbsd-x64/0.16.17: 194 | resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} 195 | engines: {node: '>=12'} 196 | cpu: [x64] 197 | os: [netbsd] 198 | requiresBuild: true 199 | dev: true 200 | optional: true 201 | 202 | /@esbuild/openbsd-x64/0.16.17: 203 | resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} 204 | engines: {node: '>=12'} 205 | cpu: [x64] 206 | os: [openbsd] 207 | requiresBuild: true 208 | dev: true 209 | optional: true 210 | 211 | /@esbuild/sunos-x64/0.16.17: 212 | resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} 213 | engines: {node: '>=12'} 214 | cpu: [x64] 215 | os: [sunos] 216 | requiresBuild: true 217 | dev: true 218 | optional: true 219 | 220 | /@esbuild/win32-arm64/0.16.17: 221 | resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} 222 | engines: {node: '>=12'} 223 | cpu: [arm64] 224 | os: [win32] 225 | requiresBuild: true 226 | dev: true 227 | optional: true 228 | 229 | /@esbuild/win32-ia32/0.16.17: 230 | resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} 231 | engines: {node: '>=12'} 232 | cpu: [ia32] 233 | os: [win32] 234 | requiresBuild: true 235 | dev: true 236 | optional: true 237 | 238 | /@esbuild/win32-x64/0.16.17: 239 | resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} 240 | engines: {node: '>=12'} 241 | cpu: [x64] 242 | os: [win32] 243 | requiresBuild: true 244 | dev: true 245 | optional: true 246 | 247 | /@eslint/eslintrc/1.4.1: 248 | resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} 249 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 250 | dependencies: 251 | ajv: 6.12.6 252 | debug: 4.3.4 253 | espree: 9.4.1 254 | globals: 13.20.0 255 | ignore: 5.2.4 256 | import-fresh: 3.3.0 257 | js-yaml: 4.1.0 258 | minimatch: 3.1.2 259 | strip-json-comments: 3.1.1 260 | transitivePeerDependencies: 261 | - supports-color 262 | dev: true 263 | 264 | /@humanwhocodes/config-array/0.11.8: 265 | resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} 266 | engines: {node: '>=10.10.0'} 267 | dependencies: 268 | '@humanwhocodes/object-schema': 1.2.1 269 | debug: 4.3.4 270 | minimatch: 3.1.2 271 | transitivePeerDependencies: 272 | - supports-color 273 | dev: true 274 | 275 | /@humanwhocodes/module-importer/1.0.1: 276 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 277 | engines: {node: '>=12.22'} 278 | dev: true 279 | 280 | /@humanwhocodes/object-schema/1.2.1: 281 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 282 | dev: true 283 | 284 | /@jridgewell/resolve-uri/3.1.0: 285 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 286 | engines: {node: '>=6.0.0'} 287 | dev: true 288 | 289 | /@jridgewell/sourcemap-codec/1.4.14: 290 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 291 | 292 | /@jridgewell/trace-mapping/0.3.17: 293 | resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} 294 | dependencies: 295 | '@jridgewell/resolve-uri': 3.1.0 296 | '@jridgewell/sourcemap-codec': 1.4.14 297 | dev: true 298 | 299 | /@nodelib/fs.scandir/2.1.5: 300 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 301 | engines: {node: '>= 8'} 302 | dependencies: 303 | '@nodelib/fs.stat': 2.0.5 304 | run-parallel: 1.2.0 305 | dev: true 306 | 307 | /@nodelib/fs.stat/2.0.5: 308 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 309 | engines: {node: '>= 8'} 310 | dev: true 311 | 312 | /@nodelib/fs.walk/1.2.8: 313 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 314 | engines: {node: '>= 8'} 315 | dependencies: 316 | '@nodelib/fs.scandir': 2.1.5 317 | fastq: 1.15.0 318 | dev: true 319 | 320 | /@playwright/test/1.30.0: 321 | resolution: {integrity: sha512-SVxkQw1xvn/Wk/EvBnqWIq6NLo1AppwbYOjNLmyU0R1RoQ3rLEBtmjTnElcnz8VEtn11fptj1ECxK0tgURhajw==} 322 | engines: {node: '>=14'} 323 | hasBin: true 324 | dependencies: 325 | '@types/node': 18.11.18 326 | playwright-core: 1.30.0 327 | dev: true 328 | 329 | /@polka/url/1.0.0-next.21: 330 | resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} 331 | dev: true 332 | 333 | /@sveltejs/adapter-auto/1.0.2_@sveltejs+kit@1.3.10: 334 | resolution: {integrity: sha512-UXpEO/gutERZnD+Z5Vi4J/ifD3WSRuCI7xwtLJTcKNQvJ6t5Xsj1X3Mw2F8Vv/XTUuxf7xPLYUgThU331r0Y9w==} 335 | peerDependencies: 336 | '@sveltejs/kit': ^1.0.0 337 | dependencies: 338 | '@sveltejs/kit': 1.3.10_svelte@3.55.1+vite@4.1.1 339 | import-meta-resolve: 2.2.1 340 | dev: true 341 | 342 | /@sveltejs/kit/1.3.10_svelte@3.55.1+vite@4.1.1: 343 | resolution: {integrity: sha512-I3DgWCwTYbTz4ZPCJIRkSDrKkMu0bsdk6ghqsOBVNqesf1wBdTdfkXhag3ESWgIEjUV3VUIWPQF7fnt7328mhQ==} 344 | engines: {node: ^16.14 || >=18} 345 | hasBin: true 346 | requiresBuild: true 347 | peerDependencies: 348 | svelte: ^3.54.0 349 | vite: ^4.0.0 350 | dependencies: 351 | '@sveltejs/vite-plugin-svelte': 2.0.2_svelte@3.55.1+vite@4.1.1 352 | '@types/cookie': 0.5.1 353 | cookie: 0.5.0 354 | devalue: 4.2.3 355 | esm-env: 1.0.0 356 | kleur: 4.1.5 357 | magic-string: 0.27.0 358 | mime: 3.0.0 359 | sade: 1.8.1 360 | set-cookie-parser: 2.5.1 361 | sirv: 2.0.2 362 | svelte: 3.55.1 363 | tiny-glob: 0.2.9 364 | undici: 5.16.0 365 | vite: 4.1.1 366 | transitivePeerDependencies: 367 | - supports-color 368 | dev: true 369 | 370 | /@sveltejs/package/1.0.2_4x7phaipmicbaooxtnresslofa: 371 | resolution: {integrity: sha512-VY9U+05d9uNFDj7ScKRlHORYlfPSHwJewBjV+V2RsnViexpLFPUrboC9SiPYDCpLnbeqwXerxhO6twGHUBGeIA==} 372 | engines: {node: ^16.14 || >=18} 373 | hasBin: true 374 | peerDependencies: 375 | svelte: ^3.44.0 376 | dependencies: 377 | chokidar: 3.5.3 378 | kleur: 4.1.5 379 | sade: 1.8.1 380 | svelte: 3.55.1 381 | svelte2tsx: 0.6.1_4x7phaipmicbaooxtnresslofa 382 | transitivePeerDependencies: 383 | - typescript 384 | dev: true 385 | 386 | /@sveltejs/vite-plugin-svelte/2.0.2_svelte@3.55.1+vite@4.1.1: 387 | resolution: {integrity: sha512-xCEan0/NNpQuL0l5aS42FjwQ6wwskdxC3pW1OeFtEKNZwRg7Evro9lac9HesGP6TdFsTv2xMes5ASQVKbCacxg==} 388 | engines: {node: ^14.18.0 || >= 16} 389 | peerDependencies: 390 | svelte: ^3.54.0 391 | vite: ^4.0.0 392 | dependencies: 393 | debug: 4.3.4 394 | deepmerge: 4.3.0 395 | kleur: 4.1.5 396 | magic-string: 0.27.0 397 | svelte: 3.55.1 398 | svelte-hmr: 0.15.1_svelte@3.55.1 399 | vite: 4.1.1 400 | vitefu: 0.2.4_vite@4.1.1 401 | transitivePeerDependencies: 402 | - supports-color 403 | dev: true 404 | 405 | /@types/chai-subset/1.3.3: 406 | resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} 407 | dependencies: 408 | '@types/chai': 4.3.4 409 | dev: true 410 | 411 | /@types/chai/4.3.4: 412 | resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} 413 | dev: true 414 | 415 | /@types/cookie/0.5.1: 416 | resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} 417 | dev: true 418 | 419 | /@types/json-schema/7.0.11: 420 | resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} 421 | dev: true 422 | 423 | /@types/node/18.11.18: 424 | resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} 425 | dev: true 426 | 427 | /@types/pug/2.0.6: 428 | resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} 429 | dev: true 430 | 431 | /@types/sass/1.43.1: 432 | resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} 433 | dependencies: 434 | '@types/node': 18.11.18 435 | dev: true 436 | 437 | /@types/semver/7.3.13: 438 | resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} 439 | dev: true 440 | 441 | /@typescript-eslint/eslint-plugin/5.50.0_go4drrxstycfikanvu45pi4vgq: 442 | resolution: {integrity: sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==} 443 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 444 | peerDependencies: 445 | '@typescript-eslint/parser': ^5.0.0 446 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 447 | typescript: '*' 448 | peerDependenciesMeta: 449 | typescript: 450 | optional: true 451 | dependencies: 452 | '@typescript-eslint/parser': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64 453 | '@typescript-eslint/scope-manager': 5.50.0 454 | '@typescript-eslint/type-utils': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64 455 | '@typescript-eslint/utils': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64 456 | debug: 4.3.4 457 | eslint: 8.33.0 458 | grapheme-splitter: 1.0.4 459 | ignore: 5.2.4 460 | natural-compare-lite: 1.4.0 461 | regexpp: 3.2.0 462 | semver: 7.3.8 463 | tsutils: 3.21.0_typescript@4.9.5 464 | typescript: 4.9.5 465 | transitivePeerDependencies: 466 | - supports-color 467 | dev: true 468 | 469 | /@typescript-eslint/parser/5.50.0_4vsywjlpuriuw3tl5oq6zy5a64: 470 | resolution: {integrity: sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==} 471 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 472 | peerDependencies: 473 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 474 | typescript: '*' 475 | peerDependenciesMeta: 476 | typescript: 477 | optional: true 478 | dependencies: 479 | '@typescript-eslint/scope-manager': 5.50.0 480 | '@typescript-eslint/types': 5.50.0 481 | '@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5 482 | debug: 4.3.4 483 | eslint: 8.33.0 484 | typescript: 4.9.5 485 | transitivePeerDependencies: 486 | - supports-color 487 | dev: true 488 | 489 | /@typescript-eslint/scope-manager/5.50.0: 490 | resolution: {integrity: sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==} 491 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 492 | dependencies: 493 | '@typescript-eslint/types': 5.50.0 494 | '@typescript-eslint/visitor-keys': 5.50.0 495 | dev: true 496 | 497 | /@typescript-eslint/type-utils/5.50.0_4vsywjlpuriuw3tl5oq6zy5a64: 498 | resolution: {integrity: sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==} 499 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 500 | peerDependencies: 501 | eslint: '*' 502 | typescript: '*' 503 | peerDependenciesMeta: 504 | typescript: 505 | optional: true 506 | dependencies: 507 | '@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5 508 | '@typescript-eslint/utils': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64 509 | debug: 4.3.4 510 | eslint: 8.33.0 511 | tsutils: 3.21.0_typescript@4.9.5 512 | typescript: 4.9.5 513 | transitivePeerDependencies: 514 | - supports-color 515 | dev: true 516 | 517 | /@typescript-eslint/types/5.50.0: 518 | resolution: {integrity: sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==} 519 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 520 | dev: true 521 | 522 | /@typescript-eslint/typescript-estree/5.50.0_typescript@4.9.5: 523 | resolution: {integrity: sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==} 524 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 525 | peerDependencies: 526 | typescript: '*' 527 | peerDependenciesMeta: 528 | typescript: 529 | optional: true 530 | dependencies: 531 | '@typescript-eslint/types': 5.50.0 532 | '@typescript-eslint/visitor-keys': 5.50.0 533 | debug: 4.3.4 534 | globby: 11.1.0 535 | is-glob: 4.0.3 536 | semver: 7.3.8 537 | tsutils: 3.21.0_typescript@4.9.5 538 | typescript: 4.9.5 539 | transitivePeerDependencies: 540 | - supports-color 541 | dev: true 542 | 543 | /@typescript-eslint/utils/5.50.0_4vsywjlpuriuw3tl5oq6zy5a64: 544 | resolution: {integrity: sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==} 545 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 546 | peerDependencies: 547 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 548 | dependencies: 549 | '@types/json-schema': 7.0.11 550 | '@types/semver': 7.3.13 551 | '@typescript-eslint/scope-manager': 5.50.0 552 | '@typescript-eslint/types': 5.50.0 553 | '@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5 554 | eslint: 8.33.0 555 | eslint-scope: 5.1.1 556 | eslint-utils: 3.0.0_eslint@8.33.0 557 | semver: 7.3.8 558 | transitivePeerDependencies: 559 | - supports-color 560 | - typescript 561 | dev: true 562 | 563 | /@typescript-eslint/visitor-keys/5.50.0: 564 | resolution: {integrity: sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==} 565 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 566 | dependencies: 567 | '@typescript-eslint/types': 5.50.0 568 | eslint-visitor-keys: 3.3.0 569 | dev: true 570 | 571 | /acorn-jsx/5.3.2_acorn@8.8.2: 572 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 573 | peerDependencies: 574 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 575 | dependencies: 576 | acorn: 8.8.2 577 | dev: true 578 | 579 | /acorn-walk/8.2.0: 580 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 581 | engines: {node: '>=0.4.0'} 582 | dev: true 583 | 584 | /acorn/8.8.2: 585 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 586 | engines: {node: '>=0.4.0'} 587 | hasBin: true 588 | dev: true 589 | 590 | /ajv/6.12.6: 591 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 592 | dependencies: 593 | fast-deep-equal: 3.1.3 594 | fast-json-stable-stringify: 2.1.0 595 | json-schema-traverse: 0.4.1 596 | uri-js: 4.4.1 597 | dev: true 598 | 599 | /ansi-regex/5.0.1: 600 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 601 | engines: {node: '>=8'} 602 | dev: true 603 | 604 | /ansi-styles/4.3.0: 605 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 606 | engines: {node: '>=8'} 607 | dependencies: 608 | color-convert: 2.0.1 609 | dev: true 610 | 611 | /anymatch/3.1.3: 612 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 613 | engines: {node: '>= 8'} 614 | dependencies: 615 | normalize-path: 3.0.0 616 | picomatch: 2.3.1 617 | dev: true 618 | 619 | /argparse/2.0.1: 620 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 621 | dev: true 622 | 623 | /array-union/2.1.0: 624 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 625 | engines: {node: '>=8'} 626 | dev: true 627 | 628 | /assertion-error/1.1.0: 629 | resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 630 | dev: true 631 | 632 | /balanced-match/1.0.2: 633 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 634 | dev: true 635 | 636 | /binary-extensions/2.2.0: 637 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 638 | engines: {node: '>=8'} 639 | dev: true 640 | 641 | /brace-expansion/1.1.11: 642 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 643 | dependencies: 644 | balanced-match: 1.0.2 645 | concat-map: 0.0.1 646 | dev: true 647 | 648 | /braces/3.0.2: 649 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 650 | engines: {node: '>=8'} 651 | dependencies: 652 | fill-range: 7.0.1 653 | dev: true 654 | 655 | /buffer-crc32/0.2.13: 656 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 657 | dev: true 658 | 659 | /busboy/1.6.0: 660 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 661 | engines: {node: '>=10.16.0'} 662 | dependencies: 663 | streamsearch: 1.1.0 664 | dev: true 665 | 666 | /callsites/3.1.0: 667 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 668 | engines: {node: '>=6'} 669 | dev: true 670 | 671 | /chai/4.3.7: 672 | resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} 673 | engines: {node: '>=4'} 674 | dependencies: 675 | assertion-error: 1.1.0 676 | check-error: 1.0.2 677 | deep-eql: 4.1.3 678 | get-func-name: 2.0.0 679 | loupe: 2.3.6 680 | pathval: 1.1.1 681 | type-detect: 4.0.8 682 | dev: true 683 | 684 | /chalk/4.1.2: 685 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 686 | engines: {node: '>=10'} 687 | dependencies: 688 | ansi-styles: 4.3.0 689 | supports-color: 7.2.0 690 | dev: true 691 | 692 | /check-error/1.0.2: 693 | resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} 694 | dev: true 695 | 696 | /chokidar/3.5.3: 697 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 698 | engines: {node: '>= 8.10.0'} 699 | dependencies: 700 | anymatch: 3.1.3 701 | braces: 3.0.2 702 | glob-parent: 5.1.2 703 | is-binary-path: 2.1.0 704 | is-glob: 4.0.3 705 | normalize-path: 3.0.0 706 | readdirp: 3.6.0 707 | optionalDependencies: 708 | fsevents: 2.3.2 709 | dev: true 710 | 711 | /color-convert/2.0.1: 712 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 713 | engines: {node: '>=7.0.0'} 714 | dependencies: 715 | color-name: 1.1.4 716 | dev: true 717 | 718 | /color-name/1.1.4: 719 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 720 | dev: true 721 | 722 | /concat-map/0.0.1: 723 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 724 | dev: true 725 | 726 | /cookie/0.5.0: 727 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 728 | engines: {node: '>= 0.6'} 729 | dev: true 730 | 731 | /cross-spawn/7.0.3: 732 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 733 | engines: {node: '>= 8'} 734 | dependencies: 735 | path-key: 3.1.1 736 | shebang-command: 2.0.0 737 | which: 2.0.2 738 | dev: true 739 | 740 | /debug/4.3.4: 741 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 742 | engines: {node: '>=6.0'} 743 | peerDependencies: 744 | supports-color: '*' 745 | peerDependenciesMeta: 746 | supports-color: 747 | optional: true 748 | dependencies: 749 | ms: 2.1.2 750 | dev: true 751 | 752 | /dedent-js/1.0.1: 753 | resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} 754 | dev: true 755 | 756 | /deep-eql/4.1.3: 757 | resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} 758 | engines: {node: '>=6'} 759 | dependencies: 760 | type-detect: 4.0.8 761 | dev: true 762 | 763 | /deep-is/0.1.4: 764 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 765 | dev: true 766 | 767 | /deepmerge/4.3.0: 768 | resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} 769 | engines: {node: '>=0.10.0'} 770 | dev: true 771 | 772 | /detect-indent/6.1.0: 773 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 774 | engines: {node: '>=8'} 775 | dev: true 776 | 777 | /devalue/4.2.3: 778 | resolution: {integrity: sha512-JG6Q248aN0pgFL57e3zqTVeFraBe+5W2ugvv1mLXsJP6YYIYJhRZhAl7QP8haJrqob6X10F9NEkuCvNILZTPeQ==} 779 | 780 | /dir-glob/3.0.1: 781 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 782 | engines: {node: '>=8'} 783 | dependencies: 784 | path-type: 4.0.0 785 | dev: true 786 | 787 | /doctrine/3.0.0: 788 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 789 | engines: {node: '>=6.0.0'} 790 | dependencies: 791 | esutils: 2.0.3 792 | dev: true 793 | 794 | /es6-promise/3.3.1: 795 | resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} 796 | dev: true 797 | 798 | /esbuild/0.16.17: 799 | resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} 800 | engines: {node: '>=12'} 801 | hasBin: true 802 | requiresBuild: true 803 | optionalDependencies: 804 | '@esbuild/android-arm': 0.16.17 805 | '@esbuild/android-arm64': 0.16.17 806 | '@esbuild/android-x64': 0.16.17 807 | '@esbuild/darwin-arm64': 0.16.17 808 | '@esbuild/darwin-x64': 0.16.17 809 | '@esbuild/freebsd-arm64': 0.16.17 810 | '@esbuild/freebsd-x64': 0.16.17 811 | '@esbuild/linux-arm': 0.16.17 812 | '@esbuild/linux-arm64': 0.16.17 813 | '@esbuild/linux-ia32': 0.16.17 814 | '@esbuild/linux-loong64': 0.16.17 815 | '@esbuild/linux-mips64el': 0.16.17 816 | '@esbuild/linux-ppc64': 0.16.17 817 | '@esbuild/linux-riscv64': 0.16.17 818 | '@esbuild/linux-s390x': 0.16.17 819 | '@esbuild/linux-x64': 0.16.17 820 | '@esbuild/netbsd-x64': 0.16.17 821 | '@esbuild/openbsd-x64': 0.16.17 822 | '@esbuild/sunos-x64': 0.16.17 823 | '@esbuild/win32-arm64': 0.16.17 824 | '@esbuild/win32-ia32': 0.16.17 825 | '@esbuild/win32-x64': 0.16.17 826 | dev: true 827 | 828 | /escape-string-regexp/4.0.0: 829 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 830 | engines: {node: '>=10'} 831 | dev: true 832 | 833 | /eslint-config-prettier/8.6.0_eslint@8.33.0: 834 | resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} 835 | hasBin: true 836 | peerDependencies: 837 | eslint: '>=7.0.0' 838 | dependencies: 839 | eslint: 8.33.0 840 | dev: true 841 | 842 | /eslint-plugin-svelte3/4.0.0_4omm2ewoudhgnmf7aocafatnc4: 843 | resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==} 844 | peerDependencies: 845 | eslint: '>=8.0.0' 846 | svelte: ^3.2.0 847 | dependencies: 848 | eslint: 8.33.0 849 | svelte: 3.55.1 850 | dev: true 851 | 852 | /eslint-scope/5.1.1: 853 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 854 | engines: {node: '>=8.0.0'} 855 | dependencies: 856 | esrecurse: 4.3.0 857 | estraverse: 4.3.0 858 | dev: true 859 | 860 | /eslint-scope/7.1.1: 861 | resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} 862 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 863 | dependencies: 864 | esrecurse: 4.3.0 865 | estraverse: 5.3.0 866 | dev: true 867 | 868 | /eslint-utils/3.0.0_eslint@8.33.0: 869 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 870 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 871 | peerDependencies: 872 | eslint: '>=5' 873 | dependencies: 874 | eslint: 8.33.0 875 | eslint-visitor-keys: 2.1.0 876 | dev: true 877 | 878 | /eslint-visitor-keys/2.1.0: 879 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 880 | engines: {node: '>=10'} 881 | dev: true 882 | 883 | /eslint-visitor-keys/3.3.0: 884 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 885 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 886 | dev: true 887 | 888 | /eslint/8.33.0: 889 | resolution: {integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==} 890 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 891 | hasBin: true 892 | dependencies: 893 | '@eslint/eslintrc': 1.4.1 894 | '@humanwhocodes/config-array': 0.11.8 895 | '@humanwhocodes/module-importer': 1.0.1 896 | '@nodelib/fs.walk': 1.2.8 897 | ajv: 6.12.6 898 | chalk: 4.1.2 899 | cross-spawn: 7.0.3 900 | debug: 4.3.4 901 | doctrine: 3.0.0 902 | escape-string-regexp: 4.0.0 903 | eslint-scope: 7.1.1 904 | eslint-utils: 3.0.0_eslint@8.33.0 905 | eslint-visitor-keys: 3.3.0 906 | espree: 9.4.1 907 | esquery: 1.4.0 908 | esutils: 2.0.3 909 | fast-deep-equal: 3.1.3 910 | file-entry-cache: 6.0.1 911 | find-up: 5.0.0 912 | glob-parent: 6.0.2 913 | globals: 13.20.0 914 | grapheme-splitter: 1.0.4 915 | ignore: 5.2.4 916 | import-fresh: 3.3.0 917 | imurmurhash: 0.1.4 918 | is-glob: 4.0.3 919 | is-path-inside: 3.0.3 920 | js-sdsl: 4.3.0 921 | js-yaml: 4.1.0 922 | json-stable-stringify-without-jsonify: 1.0.1 923 | levn: 0.4.1 924 | lodash.merge: 4.6.2 925 | minimatch: 3.1.2 926 | natural-compare: 1.4.0 927 | optionator: 0.9.1 928 | regexpp: 3.2.0 929 | strip-ansi: 6.0.1 930 | strip-json-comments: 3.1.1 931 | text-table: 0.2.0 932 | transitivePeerDependencies: 933 | - supports-color 934 | dev: true 935 | 936 | /esm-env/1.0.0: 937 | resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} 938 | dev: true 939 | 940 | /espree/9.4.1: 941 | resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} 942 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 943 | dependencies: 944 | acorn: 8.8.2 945 | acorn-jsx: 5.3.2_acorn@8.8.2 946 | eslint-visitor-keys: 3.3.0 947 | dev: true 948 | 949 | /esquery/1.4.0: 950 | resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} 951 | engines: {node: '>=0.10'} 952 | dependencies: 953 | estraverse: 5.3.0 954 | dev: true 955 | 956 | /esrecurse/4.3.0: 957 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 958 | engines: {node: '>=4.0'} 959 | dependencies: 960 | estraverse: 5.3.0 961 | dev: true 962 | 963 | /estraverse/4.3.0: 964 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 965 | engines: {node: '>=4.0'} 966 | dev: true 967 | 968 | /estraverse/5.3.0: 969 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 970 | engines: {node: '>=4.0'} 971 | dev: true 972 | 973 | /esutils/2.0.3: 974 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 975 | engines: {node: '>=0.10.0'} 976 | dev: true 977 | 978 | /fast-deep-equal/3.1.3: 979 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 980 | dev: true 981 | 982 | /fast-glob/3.2.12: 983 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 984 | engines: {node: '>=8.6.0'} 985 | dependencies: 986 | '@nodelib/fs.stat': 2.0.5 987 | '@nodelib/fs.walk': 1.2.8 988 | glob-parent: 5.1.2 989 | merge2: 1.4.1 990 | micromatch: 4.0.5 991 | dev: true 992 | 993 | /fast-json-stable-stringify/2.1.0: 994 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 995 | dev: true 996 | 997 | /fast-levenshtein/2.0.6: 998 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 999 | dev: true 1000 | 1001 | /fastq/1.15.0: 1002 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1003 | dependencies: 1004 | reusify: 1.0.4 1005 | dev: true 1006 | 1007 | /file-entry-cache/6.0.1: 1008 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1009 | engines: {node: ^10.12.0 || >=12.0.0} 1010 | dependencies: 1011 | flat-cache: 3.0.4 1012 | dev: true 1013 | 1014 | /fill-range/7.0.1: 1015 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1016 | engines: {node: '>=8'} 1017 | dependencies: 1018 | to-regex-range: 5.0.1 1019 | dev: true 1020 | 1021 | /find-up/5.0.0: 1022 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1023 | engines: {node: '>=10'} 1024 | dependencies: 1025 | locate-path: 6.0.0 1026 | path-exists: 4.0.0 1027 | dev: true 1028 | 1029 | /flat-cache/3.0.4: 1030 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1031 | engines: {node: ^10.12.0 || >=12.0.0} 1032 | dependencies: 1033 | flatted: 3.2.7 1034 | rimraf: 3.0.2 1035 | dev: true 1036 | 1037 | /flatted/3.2.7: 1038 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1039 | dev: true 1040 | 1041 | /fs.realpath/1.0.0: 1042 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1043 | dev: true 1044 | 1045 | /fsevents/2.3.2: 1046 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1047 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1048 | os: [darwin] 1049 | requiresBuild: true 1050 | dev: true 1051 | optional: true 1052 | 1053 | /function-bind/1.1.1: 1054 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1055 | dev: true 1056 | 1057 | /get-func-name/2.0.0: 1058 | resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} 1059 | dev: true 1060 | 1061 | /glob-parent/5.1.2: 1062 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1063 | engines: {node: '>= 6'} 1064 | dependencies: 1065 | is-glob: 4.0.3 1066 | dev: true 1067 | 1068 | /glob-parent/6.0.2: 1069 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1070 | engines: {node: '>=10.13.0'} 1071 | dependencies: 1072 | is-glob: 4.0.3 1073 | dev: true 1074 | 1075 | /glob/7.2.3: 1076 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1077 | dependencies: 1078 | fs.realpath: 1.0.0 1079 | inflight: 1.0.6 1080 | inherits: 2.0.4 1081 | minimatch: 3.1.2 1082 | once: 1.4.0 1083 | path-is-absolute: 1.0.1 1084 | dev: true 1085 | 1086 | /globals/13.20.0: 1087 | resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} 1088 | engines: {node: '>=8'} 1089 | dependencies: 1090 | type-fest: 0.20.2 1091 | dev: true 1092 | 1093 | /globalyzer/0.1.0: 1094 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 1095 | dev: true 1096 | 1097 | /globby/11.1.0: 1098 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1099 | engines: {node: '>=10'} 1100 | dependencies: 1101 | array-union: 2.1.0 1102 | dir-glob: 3.0.1 1103 | fast-glob: 3.2.12 1104 | ignore: 5.2.4 1105 | merge2: 1.4.1 1106 | slash: 3.0.0 1107 | dev: true 1108 | 1109 | /globrex/0.1.2: 1110 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 1111 | dev: true 1112 | 1113 | /graceful-fs/4.2.10: 1114 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 1115 | dev: true 1116 | 1117 | /grapheme-splitter/1.0.4: 1118 | resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} 1119 | dev: true 1120 | 1121 | /has-flag/4.0.0: 1122 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1123 | engines: {node: '>=8'} 1124 | dev: true 1125 | 1126 | /has/1.0.3: 1127 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1128 | engines: {node: '>= 0.4.0'} 1129 | dependencies: 1130 | function-bind: 1.1.1 1131 | dev: true 1132 | 1133 | /ignore/5.2.4: 1134 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 1135 | engines: {node: '>= 4'} 1136 | dev: true 1137 | 1138 | /import-fresh/3.3.0: 1139 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1140 | engines: {node: '>=6'} 1141 | dependencies: 1142 | parent-module: 1.0.1 1143 | resolve-from: 4.0.0 1144 | dev: true 1145 | 1146 | /import-meta-resolve/2.2.1: 1147 | resolution: {integrity: sha512-C6lLL7EJPY44kBvA80gq4uMsVFw5x3oSKfuMl1cuZ2RkI5+UJqQXgn+6hlUew0y4ig7Ypt4CObAAIzU53Nfpuw==} 1148 | dev: true 1149 | 1150 | /imurmurhash/0.1.4: 1151 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1152 | engines: {node: '>=0.8.19'} 1153 | dev: true 1154 | 1155 | /inflight/1.0.6: 1156 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1157 | dependencies: 1158 | once: 1.4.0 1159 | wrappy: 1.0.2 1160 | dev: true 1161 | 1162 | /inherits/2.0.4: 1163 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1164 | dev: true 1165 | 1166 | /is-binary-path/2.1.0: 1167 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1168 | engines: {node: '>=8'} 1169 | dependencies: 1170 | binary-extensions: 2.2.0 1171 | dev: true 1172 | 1173 | /is-core-module/2.11.0: 1174 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 1175 | dependencies: 1176 | has: 1.0.3 1177 | dev: true 1178 | 1179 | /is-extglob/2.1.1: 1180 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1181 | engines: {node: '>=0.10.0'} 1182 | dev: true 1183 | 1184 | /is-glob/4.0.3: 1185 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1186 | engines: {node: '>=0.10.0'} 1187 | dependencies: 1188 | is-extglob: 2.1.1 1189 | dev: true 1190 | 1191 | /is-number/7.0.0: 1192 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1193 | engines: {node: '>=0.12.0'} 1194 | dev: true 1195 | 1196 | /is-path-inside/3.0.3: 1197 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1198 | engines: {node: '>=8'} 1199 | dev: true 1200 | 1201 | /isexe/2.0.0: 1202 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1203 | dev: true 1204 | 1205 | /js-sdsl/4.3.0: 1206 | resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} 1207 | dev: true 1208 | 1209 | /js-yaml/4.1.0: 1210 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1211 | hasBin: true 1212 | dependencies: 1213 | argparse: 2.0.1 1214 | dev: true 1215 | 1216 | /json-schema-traverse/0.4.1: 1217 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1218 | dev: true 1219 | 1220 | /json-stable-stringify-without-jsonify/1.0.1: 1221 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1222 | dev: true 1223 | 1224 | /kleur/4.1.5: 1225 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 1226 | engines: {node: '>=6'} 1227 | dev: true 1228 | 1229 | /levn/0.4.1: 1230 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1231 | engines: {node: '>= 0.8.0'} 1232 | dependencies: 1233 | prelude-ls: 1.2.1 1234 | type-check: 0.4.0 1235 | dev: true 1236 | 1237 | /local-pkg/0.4.3: 1238 | resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} 1239 | engines: {node: '>=14'} 1240 | dev: true 1241 | 1242 | /locate-path/6.0.0: 1243 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1244 | engines: {node: '>=10'} 1245 | dependencies: 1246 | p-locate: 5.0.0 1247 | dev: true 1248 | 1249 | /lodash.merge/4.6.2: 1250 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1251 | dev: true 1252 | 1253 | /loupe/2.3.6: 1254 | resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} 1255 | dependencies: 1256 | get-func-name: 2.0.0 1257 | dev: true 1258 | 1259 | /lower-case/2.0.2: 1260 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 1261 | dependencies: 1262 | tslib: 2.5.0 1263 | dev: true 1264 | 1265 | /lru-cache/6.0.0: 1266 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1267 | engines: {node: '>=10'} 1268 | dependencies: 1269 | yallist: 4.0.0 1270 | dev: true 1271 | 1272 | /magic-string/0.27.0: 1273 | resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} 1274 | engines: {node: '>=12'} 1275 | dependencies: 1276 | '@jridgewell/sourcemap-codec': 1.4.14 1277 | 1278 | /merge2/1.4.1: 1279 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1280 | engines: {node: '>= 8'} 1281 | dev: true 1282 | 1283 | /micromatch/4.0.5: 1284 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1285 | engines: {node: '>=8.6'} 1286 | dependencies: 1287 | braces: 3.0.2 1288 | picomatch: 2.3.1 1289 | dev: true 1290 | 1291 | /mime/3.0.0: 1292 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 1293 | engines: {node: '>=10.0.0'} 1294 | hasBin: true 1295 | dev: true 1296 | 1297 | /min-indent/1.0.1: 1298 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 1299 | engines: {node: '>=4'} 1300 | dev: true 1301 | 1302 | /minimatch/3.1.2: 1303 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1304 | dependencies: 1305 | brace-expansion: 1.1.11 1306 | dev: true 1307 | 1308 | /minimist/1.2.7: 1309 | resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} 1310 | dev: true 1311 | 1312 | /mkdirp/0.5.6: 1313 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1314 | hasBin: true 1315 | dependencies: 1316 | minimist: 1.2.7 1317 | dev: true 1318 | 1319 | /mri/1.2.0: 1320 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1321 | engines: {node: '>=4'} 1322 | dev: true 1323 | 1324 | /mrmime/1.0.1: 1325 | resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} 1326 | engines: {node: '>=10'} 1327 | dev: true 1328 | 1329 | /ms/2.1.2: 1330 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1331 | dev: true 1332 | 1333 | /nanoid/3.3.4: 1334 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 1335 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1336 | hasBin: true 1337 | dev: true 1338 | 1339 | /natural-compare-lite/1.4.0: 1340 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 1341 | dev: true 1342 | 1343 | /natural-compare/1.4.0: 1344 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1345 | dev: true 1346 | 1347 | /no-case/3.0.4: 1348 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 1349 | dependencies: 1350 | lower-case: 2.0.2 1351 | tslib: 2.5.0 1352 | dev: true 1353 | 1354 | /normalize-path/3.0.0: 1355 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1356 | engines: {node: '>=0.10.0'} 1357 | dev: true 1358 | 1359 | /once/1.4.0: 1360 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1361 | dependencies: 1362 | wrappy: 1.0.2 1363 | dev: true 1364 | 1365 | /optionator/0.9.1: 1366 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 1367 | engines: {node: '>= 0.8.0'} 1368 | dependencies: 1369 | deep-is: 0.1.4 1370 | fast-levenshtein: 2.0.6 1371 | levn: 0.4.1 1372 | prelude-ls: 1.2.1 1373 | type-check: 0.4.0 1374 | word-wrap: 1.2.3 1375 | dev: true 1376 | 1377 | /p-limit/3.1.0: 1378 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1379 | engines: {node: '>=10'} 1380 | dependencies: 1381 | yocto-queue: 0.1.0 1382 | dev: true 1383 | 1384 | /p-locate/5.0.0: 1385 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1386 | engines: {node: '>=10'} 1387 | dependencies: 1388 | p-limit: 3.1.0 1389 | dev: true 1390 | 1391 | /parent-module/1.0.1: 1392 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1393 | engines: {node: '>=6'} 1394 | dependencies: 1395 | callsites: 3.1.0 1396 | dev: true 1397 | 1398 | /pascal-case/3.1.2: 1399 | resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} 1400 | dependencies: 1401 | no-case: 3.0.4 1402 | tslib: 2.5.0 1403 | dev: true 1404 | 1405 | /path-exists/4.0.0: 1406 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1407 | engines: {node: '>=8'} 1408 | dev: true 1409 | 1410 | /path-is-absolute/1.0.1: 1411 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1412 | engines: {node: '>=0.10.0'} 1413 | dev: true 1414 | 1415 | /path-key/3.1.1: 1416 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1417 | engines: {node: '>=8'} 1418 | dev: true 1419 | 1420 | /path-parse/1.0.7: 1421 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1422 | dev: true 1423 | 1424 | /path-type/4.0.0: 1425 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1426 | engines: {node: '>=8'} 1427 | dev: true 1428 | 1429 | /pathval/1.1.1: 1430 | resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 1431 | dev: true 1432 | 1433 | /picocolors/1.0.0: 1434 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1435 | dev: true 1436 | 1437 | /picomatch/2.3.1: 1438 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1439 | engines: {node: '>=8.6'} 1440 | dev: true 1441 | 1442 | /playwright-core/1.30.0: 1443 | resolution: {integrity: sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g==} 1444 | engines: {node: '>=14'} 1445 | hasBin: true 1446 | dev: true 1447 | 1448 | /postcss/8.4.21: 1449 | resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} 1450 | engines: {node: ^10 || ^12 || >=14} 1451 | dependencies: 1452 | nanoid: 3.3.4 1453 | picocolors: 1.0.0 1454 | source-map-js: 1.0.2 1455 | dev: true 1456 | 1457 | /prelude-ls/1.2.1: 1458 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1459 | engines: {node: '>= 0.8.0'} 1460 | dev: true 1461 | 1462 | /prettier-plugin-svelte/2.9.0_kdmmghgdi3ngrsq6otxkjilbry: 1463 | resolution: {integrity: sha512-3doBi5NO4IVgaNPtwewvrgPpqAcvNv0NwJNflr76PIGgi9nf1oguQV1Hpdm9TI2ALIQVn/9iIwLpBO5UcD2Jiw==} 1464 | peerDependencies: 1465 | prettier: ^1.16.4 || ^2.0.0 1466 | svelte: ^3.2.0 1467 | dependencies: 1468 | prettier: 2.8.3 1469 | svelte: 3.55.1 1470 | dev: true 1471 | 1472 | /prettier/2.8.3: 1473 | resolution: {integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==} 1474 | engines: {node: '>=10.13.0'} 1475 | hasBin: true 1476 | dev: true 1477 | 1478 | /punycode/2.3.0: 1479 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 1480 | engines: {node: '>=6'} 1481 | dev: true 1482 | 1483 | /queue-microtask/1.2.3: 1484 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1485 | dev: true 1486 | 1487 | /readdirp/3.6.0: 1488 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1489 | engines: {node: '>=8.10.0'} 1490 | dependencies: 1491 | picomatch: 2.3.1 1492 | dev: true 1493 | 1494 | /regexpp/3.2.0: 1495 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 1496 | engines: {node: '>=8'} 1497 | dev: true 1498 | 1499 | /resolve-from/4.0.0: 1500 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1501 | engines: {node: '>=4'} 1502 | dev: true 1503 | 1504 | /resolve/1.22.1: 1505 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 1506 | hasBin: true 1507 | dependencies: 1508 | is-core-module: 2.11.0 1509 | path-parse: 1.0.7 1510 | supports-preserve-symlinks-flag: 1.0.0 1511 | dev: true 1512 | 1513 | /reusify/1.0.4: 1514 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1515 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1516 | dev: true 1517 | 1518 | /rimraf/2.7.1: 1519 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 1520 | hasBin: true 1521 | dependencies: 1522 | glob: 7.2.3 1523 | dev: true 1524 | 1525 | /rimraf/3.0.2: 1526 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1527 | hasBin: true 1528 | dependencies: 1529 | glob: 7.2.3 1530 | dev: true 1531 | 1532 | /rollup/3.13.0: 1533 | resolution: {integrity: sha512-HJwQtrXAc0AmyDohTJ/2c+Bx/sWPScJLlAUJ1kuD7rAkCro8Cr2SnVB2gVYBiSLxpgD2kZ24jbyXtG++GumrYQ==} 1534 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1535 | hasBin: true 1536 | optionalDependencies: 1537 | fsevents: 2.3.2 1538 | dev: true 1539 | 1540 | /run-parallel/1.2.0: 1541 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1542 | dependencies: 1543 | queue-microtask: 1.2.3 1544 | dev: true 1545 | 1546 | /sade/1.8.1: 1547 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 1548 | engines: {node: '>=6'} 1549 | dependencies: 1550 | mri: 1.2.0 1551 | dev: true 1552 | 1553 | /sander/0.5.1: 1554 | resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} 1555 | dependencies: 1556 | es6-promise: 3.3.1 1557 | graceful-fs: 4.2.10 1558 | mkdirp: 0.5.6 1559 | rimraf: 2.7.1 1560 | dev: true 1561 | 1562 | /semver/7.3.8: 1563 | resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} 1564 | engines: {node: '>=10'} 1565 | hasBin: true 1566 | dependencies: 1567 | lru-cache: 6.0.0 1568 | dev: true 1569 | 1570 | /set-cookie-parser/2.5.1: 1571 | resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} 1572 | dev: true 1573 | 1574 | /shebang-command/2.0.0: 1575 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1576 | engines: {node: '>=8'} 1577 | dependencies: 1578 | shebang-regex: 3.0.0 1579 | dev: true 1580 | 1581 | /shebang-regex/3.0.0: 1582 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1583 | engines: {node: '>=8'} 1584 | dev: true 1585 | 1586 | /sirv/2.0.2: 1587 | resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==} 1588 | engines: {node: '>= 10'} 1589 | dependencies: 1590 | '@polka/url': 1.0.0-next.21 1591 | mrmime: 1.0.1 1592 | totalist: 3.0.0 1593 | dev: true 1594 | 1595 | /slash/3.0.0: 1596 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1597 | engines: {node: '>=8'} 1598 | dev: true 1599 | 1600 | /sorcery/0.11.0: 1601 | resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} 1602 | hasBin: true 1603 | dependencies: 1604 | '@jridgewell/sourcemap-codec': 1.4.14 1605 | buffer-crc32: 0.2.13 1606 | minimist: 1.2.7 1607 | sander: 0.5.1 1608 | dev: true 1609 | 1610 | /source-map-js/1.0.2: 1611 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1612 | engines: {node: '>=0.10.0'} 1613 | dev: true 1614 | 1615 | /source-map/0.6.1: 1616 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1617 | engines: {node: '>=0.10.0'} 1618 | dev: true 1619 | 1620 | /streamsearch/1.1.0: 1621 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 1622 | engines: {node: '>=10.0.0'} 1623 | dev: true 1624 | 1625 | /strip-ansi/6.0.1: 1626 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1627 | engines: {node: '>=8'} 1628 | dependencies: 1629 | ansi-regex: 5.0.1 1630 | dev: true 1631 | 1632 | /strip-indent/3.0.0: 1633 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 1634 | engines: {node: '>=8'} 1635 | dependencies: 1636 | min-indent: 1.0.1 1637 | dev: true 1638 | 1639 | /strip-json-comments/3.1.1: 1640 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1641 | engines: {node: '>=8'} 1642 | dev: true 1643 | 1644 | /strip-literal/1.0.1: 1645 | resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} 1646 | dependencies: 1647 | acorn: 8.8.2 1648 | dev: true 1649 | 1650 | /supports-color/7.2.0: 1651 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1652 | engines: {node: '>=8'} 1653 | dependencies: 1654 | has-flag: 4.0.0 1655 | dev: true 1656 | 1657 | /supports-preserve-symlinks-flag/1.0.0: 1658 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1659 | engines: {node: '>= 0.4'} 1660 | dev: true 1661 | 1662 | /svelte-check/3.0.3_svelte@3.55.1: 1663 | resolution: {integrity: sha512-ByBFXo3bfHRGIsYEasHkdMhLkNleVfszX/Ns1oip58tPJlKdo5Ssr8kgVIuo5oq00hss8AIcdesuy0Xt0BcTvg==} 1664 | hasBin: true 1665 | peerDependencies: 1666 | svelte: ^3.55.0 1667 | dependencies: 1668 | '@jridgewell/trace-mapping': 0.3.17 1669 | chokidar: 3.5.3 1670 | fast-glob: 3.2.12 1671 | import-fresh: 3.3.0 1672 | picocolors: 1.0.0 1673 | sade: 1.8.1 1674 | svelte: 3.55.1 1675 | svelte-preprocess: 5.0.1_4x7phaipmicbaooxtnresslofa 1676 | typescript: 4.9.5 1677 | transitivePeerDependencies: 1678 | - '@babel/core' 1679 | - coffeescript 1680 | - less 1681 | - postcss 1682 | - postcss-load-config 1683 | - pug 1684 | - sass 1685 | - stylus 1686 | - sugarss 1687 | dev: true 1688 | 1689 | /svelte-hmr/0.15.1_svelte@3.55.1: 1690 | resolution: {integrity: sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==} 1691 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 1692 | peerDependencies: 1693 | svelte: '>=3.19.0' 1694 | dependencies: 1695 | svelte: 3.55.1 1696 | dev: true 1697 | 1698 | /svelte-preprocess/5.0.1_4x7phaipmicbaooxtnresslofa: 1699 | resolution: {integrity: sha512-0HXyhCoc9rsW4zGOgtInylC6qj259E1hpFnJMJWTf+aIfeqh4O/QHT31KT2hvPEqQfdjmqBR/kO2JDkkciBLrQ==} 1700 | engines: {node: '>= 14.10.0'} 1701 | requiresBuild: true 1702 | peerDependencies: 1703 | '@babel/core': ^7.10.2 1704 | coffeescript: ^2.5.1 1705 | less: ^3.11.3 || ^4.0.0 1706 | postcss: ^7 || ^8 1707 | postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 1708 | pug: ^3.0.0 1709 | sass: ^1.26.8 1710 | stylus: ^0.55.0 1711 | sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 1712 | svelte: ^3.23.0 1713 | typescript: ^3.9.5 || ^4.0.0 1714 | peerDependenciesMeta: 1715 | '@babel/core': 1716 | optional: true 1717 | coffeescript: 1718 | optional: true 1719 | less: 1720 | optional: true 1721 | postcss: 1722 | optional: true 1723 | postcss-load-config: 1724 | optional: true 1725 | pug: 1726 | optional: true 1727 | sass: 1728 | optional: true 1729 | stylus: 1730 | optional: true 1731 | sugarss: 1732 | optional: true 1733 | typescript: 1734 | optional: true 1735 | dependencies: 1736 | '@types/pug': 2.0.6 1737 | '@types/sass': 1.43.1 1738 | detect-indent: 6.1.0 1739 | magic-string: 0.27.0 1740 | sorcery: 0.11.0 1741 | strip-indent: 3.0.0 1742 | svelte: 3.55.1 1743 | typescript: 4.9.5 1744 | dev: true 1745 | 1746 | /svelte/3.55.1: 1747 | resolution: {integrity: sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ==} 1748 | engines: {node: '>= 8'} 1749 | dev: true 1750 | 1751 | /svelte2tsx/0.6.1_4x7phaipmicbaooxtnresslofa: 1752 | resolution: {integrity: sha512-O/1+5UyChfmhp1/GUv8b8iveTrn6eZwHxEXc+rw7LMKRidr9KHk5w/EiliLjDUwHa2VA6CoEty+CQylROVU4Sw==} 1753 | peerDependencies: 1754 | svelte: ^3.55 1755 | typescript: ^4.9.4 1756 | dependencies: 1757 | dedent-js: 1.0.1 1758 | pascal-case: 3.1.2 1759 | svelte: 3.55.1 1760 | typescript: 4.9.5 1761 | dev: true 1762 | 1763 | /text-table/0.2.0: 1764 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1765 | dev: true 1766 | 1767 | /tiny-glob/0.2.9: 1768 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 1769 | dependencies: 1770 | globalyzer: 0.1.0 1771 | globrex: 0.1.2 1772 | dev: true 1773 | 1774 | /tinybench/2.3.1: 1775 | resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==} 1776 | dev: true 1777 | 1778 | /tinypool/0.3.1: 1779 | resolution: {integrity: sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==} 1780 | engines: {node: '>=14.0.0'} 1781 | dev: true 1782 | 1783 | /tinyspy/1.0.2: 1784 | resolution: {integrity: sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==} 1785 | engines: {node: '>=14.0.0'} 1786 | dev: true 1787 | 1788 | /to-regex-range/5.0.1: 1789 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1790 | engines: {node: '>=8.0'} 1791 | dependencies: 1792 | is-number: 7.0.0 1793 | dev: true 1794 | 1795 | /totalist/3.0.0: 1796 | resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==} 1797 | engines: {node: '>=6'} 1798 | dev: true 1799 | 1800 | /tslib/1.14.1: 1801 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 1802 | dev: true 1803 | 1804 | /tslib/2.5.0: 1805 | resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} 1806 | dev: true 1807 | 1808 | /tsutils/3.21.0_typescript@4.9.5: 1809 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 1810 | engines: {node: '>= 6'} 1811 | peerDependencies: 1812 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 1813 | dependencies: 1814 | tslib: 1.14.1 1815 | typescript: 4.9.5 1816 | dev: true 1817 | 1818 | /type-check/0.4.0: 1819 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1820 | engines: {node: '>= 0.8.0'} 1821 | dependencies: 1822 | prelude-ls: 1.2.1 1823 | dev: true 1824 | 1825 | /type-detect/4.0.8: 1826 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1827 | engines: {node: '>=4'} 1828 | dev: true 1829 | 1830 | /type-fest/0.20.2: 1831 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1832 | engines: {node: '>=10'} 1833 | dev: true 1834 | 1835 | /typescript/4.9.5: 1836 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 1837 | engines: {node: '>=4.2.0'} 1838 | hasBin: true 1839 | dev: true 1840 | 1841 | /undici/5.16.0: 1842 | resolution: {integrity: sha512-KWBOXNv6VX+oJQhchXieUznEmnJMqgXMbs0xxH2t8q/FUAWSJvOSr/rMaZKnX5RIVq7JDn0JbP4BOnKG2SGXLQ==} 1843 | engines: {node: '>=12.18'} 1844 | dependencies: 1845 | busboy: 1.6.0 1846 | dev: true 1847 | 1848 | /uri-js/4.4.1: 1849 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1850 | dependencies: 1851 | punycode: 2.3.0 1852 | dev: true 1853 | 1854 | /vite/4.1.1: 1855 | resolution: {integrity: sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==} 1856 | engines: {node: ^14.18.0 || >=16.0.0} 1857 | hasBin: true 1858 | peerDependencies: 1859 | '@types/node': '>= 14' 1860 | less: '*' 1861 | sass: '*' 1862 | stylus: '*' 1863 | sugarss: '*' 1864 | terser: ^5.4.0 1865 | peerDependenciesMeta: 1866 | '@types/node': 1867 | optional: true 1868 | less: 1869 | optional: true 1870 | sass: 1871 | optional: true 1872 | stylus: 1873 | optional: true 1874 | sugarss: 1875 | optional: true 1876 | terser: 1877 | optional: true 1878 | dependencies: 1879 | esbuild: 0.16.17 1880 | postcss: 8.4.21 1881 | resolve: 1.22.1 1882 | rollup: 3.13.0 1883 | optionalDependencies: 1884 | fsevents: 2.3.2 1885 | dev: true 1886 | 1887 | /vite/4.1.1_@types+node@18.11.18: 1888 | resolution: {integrity: sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==} 1889 | engines: {node: ^14.18.0 || >=16.0.0} 1890 | hasBin: true 1891 | peerDependencies: 1892 | '@types/node': '>= 14' 1893 | less: '*' 1894 | sass: '*' 1895 | stylus: '*' 1896 | sugarss: '*' 1897 | terser: ^5.4.0 1898 | peerDependenciesMeta: 1899 | '@types/node': 1900 | optional: true 1901 | less: 1902 | optional: true 1903 | sass: 1904 | optional: true 1905 | stylus: 1906 | optional: true 1907 | sugarss: 1908 | optional: true 1909 | terser: 1910 | optional: true 1911 | dependencies: 1912 | '@types/node': 18.11.18 1913 | esbuild: 0.16.17 1914 | postcss: 8.4.21 1915 | resolve: 1.22.1 1916 | rollup: 3.13.0 1917 | optionalDependencies: 1918 | fsevents: 2.3.2 1919 | dev: true 1920 | 1921 | /vitefu/0.2.4_vite@4.1.1: 1922 | resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} 1923 | peerDependencies: 1924 | vite: ^3.0.0 || ^4.0.0 1925 | peerDependenciesMeta: 1926 | vite: 1927 | optional: true 1928 | dependencies: 1929 | vite: 4.1.1 1930 | dev: true 1931 | 1932 | /vitest/0.25.8: 1933 | resolution: {integrity: sha512-X75TApG2wZTJn299E/TIYevr4E9/nBo1sUtZzn0Ci5oK8qnpZAZyhwg0qCeMSakGIWtc6oRwcQFyFfW14aOFWg==} 1934 | engines: {node: '>=v14.16.0'} 1935 | hasBin: true 1936 | peerDependencies: 1937 | '@edge-runtime/vm': '*' 1938 | '@vitest/browser': '*' 1939 | '@vitest/ui': '*' 1940 | happy-dom: '*' 1941 | jsdom: '*' 1942 | peerDependenciesMeta: 1943 | '@edge-runtime/vm': 1944 | optional: true 1945 | '@vitest/browser': 1946 | optional: true 1947 | '@vitest/ui': 1948 | optional: true 1949 | happy-dom: 1950 | optional: true 1951 | jsdom: 1952 | optional: true 1953 | dependencies: 1954 | '@types/chai': 4.3.4 1955 | '@types/chai-subset': 1.3.3 1956 | '@types/node': 18.11.18 1957 | acorn: 8.8.2 1958 | acorn-walk: 8.2.0 1959 | chai: 4.3.7 1960 | debug: 4.3.4 1961 | local-pkg: 0.4.3 1962 | source-map: 0.6.1 1963 | strip-literal: 1.0.1 1964 | tinybench: 2.3.1 1965 | tinypool: 0.3.1 1966 | tinyspy: 1.0.2 1967 | vite: 4.1.1_@types+node@18.11.18 1968 | transitivePeerDependencies: 1969 | - less 1970 | - sass 1971 | - stylus 1972 | - sugarss 1973 | - supports-color 1974 | - terser 1975 | dev: true 1976 | 1977 | /which/2.0.2: 1978 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1979 | engines: {node: '>= 8'} 1980 | hasBin: true 1981 | dependencies: 1982 | isexe: 2.0.0 1983 | dev: true 1984 | 1985 | /word-wrap/1.2.3: 1986 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 1987 | engines: {node: '>=0.10.0'} 1988 | dev: true 1989 | 1990 | /wrappy/1.0.2: 1991 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1992 | dev: true 1993 | 1994 | /yallist/4.0.0: 1995 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1996 | dev: true 1997 | 1998 | /yocto-queue/0.1.0: 1999 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2000 | engines: {node: '>=10'} 2001 | dev: true 2002 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface Platform {} 9 | } 10 | } 11 | 12 | export {}; 13 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /src/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | 3 | describe('sum test', () => { 4 | it('adds 1 + 2 to equal 3', () => { 5 | expect(1 + 2).toBe(3); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /src/lib/constants.ts: -------------------------------------------------------------------------------- 1 | /// @sveltekit-defer-constants 2 | export const env = { 3 | cookie_name: 'sveltekit-defer-user', 4 | stream_pathname: '/__sveltekit-defer-events', 5 | stream_event: 'sveltekit-defer-resolved', 6 | promise_field: '__sveltekit-defer-promises' 7 | } as const; 8 | 9 | export type Env = typeof env; 10 | 11 | export type SveltekitDeferOptions = { 12 | -readonly [K in keyof Env]?: LiteralToPrimitive; 13 | }; 14 | 15 | export type PromisesField = Env['promise_field']; 16 | 17 | /* 18 | MIT License 19 | 20 | Copyright (c) Sindre Sorhus (https://sindresorhus.com) 21 | 22 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 23 | 24 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 25 | 26 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | type LiteralToPrimitive = T extends number 29 | ? number 30 | : T extends bigint 31 | ? bigint 32 | : T extends string 33 | ? string 34 | : T extends boolean 35 | ? boolean 36 | : T extends symbol 37 | ? symbol 38 | : T extends null 39 | ? null 40 | : T extends undefined 41 | ? undefined 42 | : T extends any[] 43 | ? LiteralToPrimitive[] 44 | : T extends object 45 | ? { 46 | [K in keyof T]: LiteralToPrimitive; 47 | } 48 | : never; 49 | -------------------------------------------------------------------------------- /src/lib/defer.ts: -------------------------------------------------------------------------------- 1 | import type { ServerLoadEvent } from '@sveltejs/kit'; 2 | import { env, type PromisesField } from './constants'; 3 | import * as devalue from 'devalue'; 4 | 5 | function pushEvent(event: ServerLoadEvent, data: any) { 6 | event.fetch(`${env.stream_pathname}?load=${event.url}`, { 7 | method: 'POST', 8 | body: JSON.stringify(data) 9 | }); 10 | } 11 | 12 | type GetPromises = { 13 | [Key in keyof T]: T[Key] extends Promise ? Key : never; 14 | }[keyof T]; 15 | 16 | type Transform = { 17 | [Key in keyof T]: T[Key]; 18 | } & { 19 | [K in PromisesField]: GetPromises[]; 20 | }; 21 | 22 | function get_promise_or_throw(promise: Promise) { 23 | return Promise.race([promise, Promise.reject()]); 24 | } 25 | 26 | function stringify(value: any) { 27 | let ret; 28 | try { 29 | ret = devalue.stringify(value); 30 | } catch (e) { 31 | ret = JSON.stringify(value); 32 | } 33 | return ret; 34 | } 35 | 36 | export function defer any>( 37 | func: T 38 | ): (event: ServerLoadEvent) => Promise>>> { 39 | return async (event: ServerLoadEvent) => { 40 | if (!event.cookies.get(env.cookie_name)) { 41 | event.cookies.set(env.cookie_name, crypto.randomUUID(), { 42 | path: '/', 43 | httpOnly: true, 44 | secure: true 45 | }); 46 | } 47 | const returnVal = await func(event); 48 | const keys = Object.keys(returnVal as any); 49 | for (const _key of keys) { 50 | const key = _key as keyof typeof returnVal; 51 | if ((returnVal as any)[key] instanceof Promise) { 52 | try { 53 | const actualValue = await get_promise_or_throw(returnVal[key]); 54 | returnVal[key] = actualValue; 55 | } catch (e) { 56 | if (!returnVal[env.promise_field]) { 57 | returnVal[env.promise_field] = []; 58 | } 59 | returnVal[env.promise_field].push(key); 60 | returnVal[key] 61 | .then((res: any) => { 62 | pushEvent(event, { value: stringify(res), key, kind: 'resolve' }); 63 | }) 64 | .catch((error: any) => { 65 | pushEvent(event, { value: stringify(error), key, kind: 'reject' }); 66 | }); 67 | returnVal[key] = '__PROMISE_TO_DEFER__'; 68 | } 69 | } 70 | } 71 | return returnVal; 72 | }; 73 | } 74 | -------------------------------------------------------------------------------- /src/lib/handle.ts: -------------------------------------------------------------------------------- 1 | import type { Handle } from '@sveltejs/kit'; 2 | import { env } from './constants'; 3 | 4 | const controllers = new Map>(); 5 | const queued = new Map) => void)[]>(); 6 | 7 | async function enqueue(request: Request, key: string) { 8 | const controller = controllers.get(key); 9 | const data = await request.clone().text(); 10 | const to_write = `event: ${env.stream_event}\ndata: ${data}\n\n`; 11 | const flush = (controller: ReadableStreamController) => { 12 | const encoder = new TextEncoder(); 13 | controller.enqueue(encoder.encode(to_write)); 14 | }; 15 | if (!controller) { 16 | let queue = queued.get(key); 17 | if (!queue) { 18 | queue = []; 19 | queued.set(key, queue); 20 | } 21 | queue.push(flush); 22 | return new Response(null, { 23 | status: 401 24 | }); 25 | } 26 | flush(controller); 27 | return new Response(null, { 28 | status: 200 29 | }); 30 | } 31 | 32 | export const defer_handle: Handle = async ({ event, resolve }) => { 33 | const { searchParams, pathname } = new URL(event.request.url); 34 | if (pathname === env.stream_pathname) { 35 | const defer_user = event.cookies.get(env.cookie_name); 36 | const load = searchParams.get('load') ?? ''; 37 | const key = [defer_user, load].toString(); 38 | if (!defer_user) { 39 | return new Response(null, { 40 | status: 401 41 | }); 42 | } 43 | if (event.request.method === 'GET') { 44 | let controller: ReadableStreamController; 45 | return new Response( 46 | new ReadableStream({ 47 | start: (_) => { 48 | controller = _; 49 | const to_flush = queued.get(key) ?? []; 50 | let flush = to_flush.pop(); 51 | while (flush) { 52 | flush(controller); 53 | flush = to_flush.pop(); 54 | } 55 | controllers.set(key, controller); 56 | }, 57 | cancel: () => { 58 | controllers.delete(key); 59 | } 60 | }), 61 | { 62 | headers: { 63 | 'Cache-Control': 'no-store', 64 | 'Content-Type': 'text/event-stream', 65 | Connection: 'keep-alive' 66 | }, 67 | status: 200 68 | } 69 | ); 70 | } else if (event.request.method === 'POST') { 71 | return enqueue(event.request, key); 72 | } 73 | } 74 | const response = await resolve(event); 75 | return response; 76 | }; 77 | -------------------------------------------------------------------------------- /src/lib/index.ts: -------------------------------------------------------------------------------- 1 | export { defer_handle } from './handle.js'; 2 | export { defer } from './defer.js'; 3 | export { get_data } from './store.js'; 4 | 5 | // Reexport your entry components here 6 | -------------------------------------------------------------------------------- /src/lib/store.ts: -------------------------------------------------------------------------------- 1 | import { page } from '$app/stores'; 2 | import { onDestroy, onMount } from 'svelte'; 3 | import { derived, get } from 'svelte/store'; 4 | import { env, type PromisesField } from './constants'; 5 | import * as devalue from 'devalue'; 6 | 7 | function parse(value: any) { 8 | let ret; 9 | try { 10 | ret = devalue.parse(value); 11 | } catch (e) { 12 | ret = JSON.parse(value); 13 | } 14 | return ret; 15 | } 16 | 17 | type TransformBack = Omit< 18 | { 19 | [Key in keyof T]: [Key] extends T[PromisesField] ? Promise : T[Key]; 20 | }, 21 | PromisesField 22 | >; 23 | 24 | export function get_data() { 25 | const resolvers: Map void; reject: (arg: any) => void }> = 26 | new Map(); 27 | let eventSource: EventSource; 28 | onMount(() => { 29 | const $page = get(page); 30 | eventSource = new EventSource(`${env.stream_pathname}?load=${$page.url.href}`, { 31 | withCredentials: true 32 | }); 33 | eventSource?.addEventListener(env.stream_event, (evt) => { 34 | const resolved = JSON.parse(evt.data); 35 | const resolver = resolvers.get(resolved.key); 36 | if (resolved.kind === 'resolve') { 37 | resolver?.resolve(parse(resolved.value)); 38 | } else { 39 | resolver?.reject(parse(resolved.value)); 40 | } 41 | }); 42 | }); 43 | onDestroy(() => { 44 | eventSource?.close(); 45 | }); 46 | const retval = derived>(page, ($page) => { 47 | const data = $page.data; 48 | const { [env.promise_field]: promises = [] } = data; 49 | resolvers.clear(); 50 | Object.keys(data).forEach((_key) => { 51 | const key = _key as keyof typeof data; 52 | if (promises.includes(key)) { 53 | data[key] = new Promise((resolve, reject) => { 54 | resolvers.set(key, { resolve, reject }); 55 | }); 56 | } 57 | }); 58 | delete data[env.promise_field]; 59 | return data as TransformBack; 60 | }); 61 | 62 | return retval; 63 | } 64 | -------------------------------------------------------------------------------- /src/lib/vite/index.ts: -------------------------------------------------------------------------------- 1 | import type { SveltekitDeferOptions } from '$lib/constants'; 2 | import type { Plugin } from 'vite'; 3 | import MagicString from 'magic-string'; 4 | import fs from 'fs'; 5 | 6 | export const env_parser: { 7 | [K in keyof SveltekitDeferOptions]?: ( 8 | to_parse: SveltekitDeferOptions[K] 9 | ) => SveltekitDeferOptions[K]; 10 | } = { 11 | stream_pathname(to_parse) { 12 | if (!to_parse || to_parse.startsWith('/')) return to_parse; 13 | return `/${to_parse}`; 14 | } 15 | }; 16 | 17 | function fix_code(code: string, options: SveltekitDeferOptions) { 18 | if (code.startsWith('/// @sveltekit-defer-constants')) { 19 | const magicCode = new MagicString(code); 20 | Object.keys(options).forEach((_key) => { 21 | const key = _key as keyof typeof options; 22 | const to_replace = env_parser[key]?.(options[key]) ?? options[key]; 23 | if (to_replace) { 24 | magicCode.replace( 25 | new RegExp(`${key}:\\s\\'.*\\',?\\r?\\n`), 26 | `${key}: '${to_replace}',\r\n` 27 | ); 28 | } 29 | }); 30 | return { 31 | code: magicCode.toString(), 32 | map: magicCode.generateMap() 33 | }; 34 | } 35 | } 36 | 37 | export function sveltekit_defer(options: SveltekitDeferOptions): Plugin { 38 | return { 39 | name: 'vite-plugin-sveltekit-defer', 40 | config() { 41 | return { 42 | optimizeDeps: { 43 | force: true, 44 | esbuildOptions: { 45 | plugins: [ 46 | { 47 | name: 'esbuild-plugin-fix-constants', 48 | setup(build) { 49 | build.onLoad( 50 | { 51 | filter: /constants/ 52 | }, 53 | ({ path }) => { 54 | if (!path.includes('sveltekit-defer')) return; 55 | const code = fs.readFileSync(path, 'utf-8'); 56 | const contents = fix_code(code, options)?.code; 57 | return contents 58 | ? { 59 | contents 60 | } 61 | : undefined; 62 | } 63 | ); 64 | } 65 | } 66 | ] 67 | } 68 | } 69 | }; 70 | }, 71 | transform(code, id) { 72 | if (id.endsWith('node_modules/sveltekit-defer/constants.js')) { 73 | return fix_code(code, options); 74 | } 75 | } 76 | }; 77 | } 78 | -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 |

Welcome to your library project

2 |

Create your package using @sveltejs/package and preview/showcase your work with SvelteKit

3 |

Visit kit.svelte.dev to read the documentation

4 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paoloricciuti/sveltekit-defer/661ec5aecc2202d551231ce898e9cad6bd0015db/static/favicon.png -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import { vitePreprocess } from '@sveltejs/kit/vite'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors 7 | // for more information about preprocessors 8 | preprocess: vitePreprocess(), 9 | 10 | kit: { 11 | adapter: adapter() 12 | } 13 | }; 14 | 15 | export default config; 16 | -------------------------------------------------------------------------------- /tests/test.ts: -------------------------------------------------------------------------------- 1 | import { expect, test } from '@playwright/test'; 2 | 3 | test('index page has expected h1', async ({ page }) => { 4 | await page.goto('/'); 5 | expect(await page.textContent('h1')).toBe('Welcome to SvelteKit'); 6 | }); 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true 12 | } 13 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 14 | // 15 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 16 | // from the referenced tsconfig.json - TypeScript does not merge them in 17 | } 18 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import type { UserConfig } from 'vite'; 3 | 4 | const config: UserConfig = { 5 | plugins: [sveltekit()], 6 | test: { 7 | include: ['src/**/*.{test,spec}.{js,ts}'] 8 | } 9 | }; 10 | 11 | export default config; 12 | --------------------------------------------------------------------------------