├── .github └── workflows │ └── build.yml ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── dist-js ├── schemaForm.js ├── schemaForm.umd.cjs └── style.css ├── exampleWithScript.html ├── package-lock.json ├── package.json ├── src ├── app.d.ts ├── app.html ├── lib │ ├── SchemaForm.svelte │ ├── SubSchemaForm.svelte │ ├── SubmitForm.svelte │ ├── arrayOps.ts │ ├── css │ │ ├── basic-skin.scss │ │ └── layout.scss │ ├── editors │ │ ├── Array.svelte │ │ ├── ArrayBlocks.svelte │ │ ├── Autocomplete.svelte │ │ ├── Boolean.svelte │ │ ├── Currency.svelte │ │ ├── Enum.svelte │ │ ├── FieldWrapper.svelte │ │ ├── Hidden.svelte │ │ ├── ListDetail.svelte │ │ ├── Number.svelte │ │ ├── Object.svelte │ │ ├── Radio.svelte │ │ ├── String.svelte │ │ ├── TextArea.svelte │ │ └── Upload.svelte │ ├── errorMapper.ts │ ├── img │ │ ├── add-colour.svg │ │ ├── add.svg │ │ ├── del-box.svg │ │ ├── delete.svg │ │ ├── down.svg │ │ ├── duplicate.svg │ │ ├── info.svg │ │ ├── left-arrow.svg │ │ ├── link.svg │ │ ├── right.svg │ │ ├── up.svg │ │ ├── upload.svg │ │ └── upload.zip │ ├── index.ts │ ├── schema │ │ └── schema.test.ts │ ├── schemasafe-extended.d.ts │ ├── types │ │ ├── CommonComponentParameters.ts │ │ └── schema.ts │ └── utilities.ts └── routes │ └── +page.svelte ├── static └── favicon.png ├── svelte.config.js ├── tsconfig.json ├── vite-script.config.ts └── vite.config.ts /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: "Build package" 2 | 3 | on: 4 | push: 5 | branches: 6 | - dev 7 | jobs: 8 | build: 9 | runs-on: ubuntu/latest 10 | strategy: 11 | matrix: 12 | node-version: 13 | - '14.x' 14 | steps: 15 | - uses: actions/checkout@v3 16 | - name: Use Node.js ${{ matrix.node-version }} 17 | uses: actions/setup-node@v3 18 | with: 19 | node-version: ${{ matrix.node-version }} 20 | - name: Install dependencies 21 | run: npm install 22 | 23 | - run: npm run check 24 | - run: npm run package 25 | - run: npm test -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | /dist 7 | .env 8 | .env.* 9 | !.env.example 10 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 restspace 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Svelte Schema Form 2 | 3 | This is a Svelte implementation of a form generator from JSON Schema. It supports subforms, lists with reordering of items, custom renderer components, and customisable CSS skinning separating layout and look-and-feel. 4 | 5 | JSON Schema is a powerful validation/type definition language for JSON data. See this for more information on [JSON Schema](https://cswr.github.io/JsonSchema/spec/introduction/) 6 | 7 | ## How to use 8 | 9 | Install with npm 10 | 11 | npm install @restspace/svelte-schema-form 12 | 13 | Use in a component 14 | 15 | 32 | 33 | 34 | 35 | The `layout.css` file creates a standard form layout. `basic-skin.css` adds a very simple skin with fonts, colours etc on top of that. Note, you'll likely need to configure your bundler to interpret importing css to make this work. 36 | 37 | The `SubmitForm` component manages validation of the entered data using the full JSON Schema spec and renders any error messages beside the relevant components. Standard behaviour is that errors are not shown until the Submit button has been clicked at least once. 38 | 39 | ## JSON Schema support 40 | 41 | | Feature | Support | 42 | |---|---| 43 | |title|This property is used to label a field or fieldset, if it's absent a conversion from camel case (myFieldName) to proper case (My Field Name) is done. Newlines in the string are converted to br tags in HTML| 44 | |description|This property is shown beside the label as a tooltip using the HTML title attribute or as a subheading for arrays/objects.| 45 | |readOnly|This property if present and set to `true` will disable the editor for this field, only using it for display. All children of this field will also be read only| 46 | |type="string"|By default, renders as an input element with type="text"| 47 | |minLength, maxLength|Supported in validation| 48 | |pattern|Supported in validation| 49 | |format|Support for `password`, `email`, `date`, `time` and `date-time` via HTML input type| 50 | |type="number"|By default, renders as an input element with type="number"| 51 | |minimum, maximum|Supported in validation| 52 | |exclusiveMinimum, exclusiveMaximum|Supported in validation| 53 | |enum|A field with the enum property is instead rendered as a Select element with all the enum options given| 54 | |enumText|Custom property to supply display labels for the Select element as an array of strings, one for each enum value| 55 | |type="object"|Every object is rendered within an HTML Fieldset element with a form field for each property| 56 | |required|Object fields named in the `required` list have to have a value entered to be valid. Required fields have the `required` class added to their labels to enable this to be displayed. 57 | |type="array"|Every array is rendered within an HTML Fieldset element with controls for adding, deleting, moving and duplicating array items (based on the `items` property)| 58 | |emptyDisplay|Custom property which determines how the array displays if it has no items. `false` means don't show a header or wrapper. `true` means show the header and wrapper with no items. A string value means display this message in the wrapper. 59 | |controls|Custom property which is a comma separated list of controls including `delete`, `duplicate`, `reorder`, `add`. Default is all these. A readOnly array has no controls.| 60 | |editor|Custom property that lets you pick a custom editor for a schema.| 61 | ||| 62 | 63 | ## Components 64 | 65 | ### SchemaForm 66 | A group of based on a schema, no submit functionality 67 | 68 | import {SchemaForm} from "@restspace/svelte-schema-form"; 69 | 70 | 80 | 81 | ### SubmitForm 82 | An HTML form with a submit button and a submit flow 83 | 84 | import {SubmitForm} from "@restspace/svelte-schema-form"; 85 | 86 | 99 | 100 | ## Custom editors 101 | 102 | ### Currency 103 | 104 | Setting `editor="currency"` on a `type="number"` subschema renders it as a currency field. This automatically inserts a currency symbol in the input field, by default this is a `$` but can be changed to another symbol via setting the `currencySymbol` property on the object passed in to the `componentContext` prop, to e.g. '£'. You can also specify a custom formatting function which takes a value of type number and returns a string and set the `formatCurrency` property on `componentContext` to this function. 105 | 106 | ### Radio 107 | 108 | Setting `editor="radio"` on a subschema with `enum` set renders the enum as radio buttons instead of a select. 109 | 110 | ### Upload 111 | 112 | Setting `editor="upload"` on a `type="string"` subschema means that this property will be rendered as a file uploader. This component requies a `SubmitForm`. The file uploader allows files to be dragged onto it, or to be clicked to open a file dialog. Files are sent on submit via a PUT request to a path composed: 113 | 114 | /// 115 | 116 | - `uploadBaseUrl` is the prop on `SubmitForm` 117 | - `uploadName` is the `uploadNamePattern` with form field value(s) substituted in for `${}` codes so as to create a name that will be unique for each stored record 118 | - `path` is the property path of the upload control with dot separators and array poitions just being an index with no square brackets e.g. `profilePics.3.image` 119 | 120 | After successful submit, the property value for the editor is set to the url where the file was uploaded. The uploader has a button at the right bottom to switch modes to show a text input field with the url of the stored file. 121 | 122 | ### Autocomplete 123 | 124 | Setting `editor="autocomplete"` on a `type="string"` subschema means this property will be rendered as an autocomplete dropdown. The autocomplete component is a text box which on each keystroke sends the entered text to a remote url to get a list of matching items which are then shown as a dropdown. The user can choose one of the displayed items at any point. 125 | 126 | The schema needs an additional property `url` set to the base url for remote querying. Example subschema: 127 | 128 | { 129 | "type": "string", 130 | "editor": "autocomplete", 131 | "url": "https://mysite.com/autocompletes" 132 | } 133 | 134 | 135 | To this url is added the query string item `match=xyz` where xyz is the current text in the search box to match on. A `GET` request is made to the result. The url should respond with an `application/json` body which can either be 136 | 137 | [ "dropdown item 1", "dropdown item 2", ... ] 138 | 139 | or 140 | 141 | [ 142 | { 143 | "id": "1234", 144 | "text": "An item title", 145 | "image": "https://images.com/an-image.jpg" 146 | }, ... 147 | ] 148 | 149 | In the latter case, the `id` field is returned as the value of the editor, the `text` field determines the text shown in the field, and the optional `image` url gives an image to display alongside the text. 150 | 151 | ### List Detail 152 | 153 | Setting `editor="list-detail"` on a `type="array"` subschema whose items are `type="object"` shows the list of objects in a listing grid which when a row is selected, switches to the normal editor for the object selected. It also provides heading-click view ordering (without mutating the order of the underlying data list). It responds to the `emptyDisplay` and 154 | `controls` custom properties defined for an array. 155 | 156 | The `type="object"` subschema can have two optional custom schema properties: 157 | - `headings`: an array of property names which are included as columns in the list. Defaults to all columns. 158 | - `defaultSort`: an object with properties `field` which specifies the default heading field to sort on, and `direction` which can be `"asc"` or `"desc"` to specify the direction of the default sort. 159 | 160 | ## Custom rendering components 161 | 162 | Svelte Schema Form can override or add rendering components at any level by supplying a map of component type names and component classes. 163 | 164 | For example components, look in the /src/lib/editors directory. As an illustration, consider the Number.svelte default editor: 165 | 166 | 172 | 173 | 174 | 175 | { 179 | let val = parseFloat(ev.currentTarget.value); 180 | params.pathChanged(params.path, isNaN(val) ? undefined : val); 181 | }} 182 | /> 183 | 184 | 185 | The component needs to have the 3 props shown in this component. `schema` and `value` are the local parts of the full schema and value which need to be rendered by this component. `params` contains a number of constant values defining the component including `params.pathChanged` which is a function that needs to be called with the property path to the value the component is rendering (this is `params.path`) and the new value when the value of the form field is changed. 186 | 187 | Note how the editor supports the `readOnly` attribute by disabling the editor if set. 188 | 189 | The `` component wrapping the markup renders the default FieldWrapper.svelte component around the actual editor: this adds the field's standard label and error message. 190 | 191 | An example of how to configure a custom component: 192 | 193 | 201 | 202 | 203 | 204 | You'd then make use of this custom editor component in a schema like this: 205 | 206 | { 207 | "type": "object", 208 | "properties": { 209 | "myField": { 210 | "type": "string", 211 | "editor": "myEditor" 212 | } 213 | } 214 | } 215 | 216 | The key in the `components` map is matched to, in priority order, the `editor` property, then the `format` property, then the `type` property. This means you can also substitute editors for field groupings, which is more tricky. Work from the Array.svelte and Object.svelte default editor components in the repo. 217 | -------------------------------------------------------------------------------- /dist-js/style.css: -------------------------------------------------------------------------------- 1 | textarea.svelte-vofknr{background-color:#fff} 2 | -------------------------------------------------------------------------------- /exampleWithScript.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 34 | 35 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@restspace/svelte-schema-form", 3 | "version": "0.1.5", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@restspace/svelte-schema-form", 9 | "version": "0.1.5", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@exodus/schemasafe": "^1.0.0-rc.9", 13 | "lodash-es": "^4.17.21" 14 | }, 15 | "devDependencies": { 16 | "@sveltejs/adapter-auto": "^2.0.1", 17 | "@sveltejs/kit": "^1.16.3", 18 | "@sveltejs/package": "^2.0.2", 19 | "@types/lodash-es": "^4.17.6", 20 | "sass": "^1.57.1", 21 | "svelte": "^3.54.0", 22 | "svelte-check": "^3.0.1", 23 | "tslib": "^2.4.1", 24 | "typescript": "^4.9.3", 25 | "vite": "^4.0.0" 26 | } 27 | }, 28 | "node_modules/@esbuild/android-arm": { 29 | "version": "0.17.18", 30 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", 31 | "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", 32 | "cpu": [ 33 | "arm" 34 | ], 35 | "dev": true, 36 | "optional": true, 37 | "os": [ 38 | "android" 39 | ], 40 | "engines": { 41 | "node": ">=12" 42 | } 43 | }, 44 | "node_modules/@esbuild/android-arm64": { 45 | "version": "0.17.18", 46 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", 47 | "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", 48 | "cpu": [ 49 | "arm64" 50 | ], 51 | "dev": true, 52 | "optional": true, 53 | "os": [ 54 | "android" 55 | ], 56 | "engines": { 57 | "node": ">=12" 58 | } 59 | }, 60 | "node_modules/@esbuild/android-x64": { 61 | "version": "0.17.18", 62 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", 63 | "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", 64 | "cpu": [ 65 | "x64" 66 | ], 67 | "dev": true, 68 | "optional": true, 69 | "os": [ 70 | "android" 71 | ], 72 | "engines": { 73 | "node": ">=12" 74 | } 75 | }, 76 | "node_modules/@esbuild/darwin-arm64": { 77 | "version": "0.17.18", 78 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", 79 | "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", 80 | "cpu": [ 81 | "arm64" 82 | ], 83 | "dev": true, 84 | "optional": true, 85 | "os": [ 86 | "darwin" 87 | ], 88 | "engines": { 89 | "node": ">=12" 90 | } 91 | }, 92 | "node_modules/@esbuild/darwin-x64": { 93 | "version": "0.17.18", 94 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", 95 | "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", 96 | "cpu": [ 97 | "x64" 98 | ], 99 | "dev": true, 100 | "optional": true, 101 | "os": [ 102 | "darwin" 103 | ], 104 | "engines": { 105 | "node": ">=12" 106 | } 107 | }, 108 | "node_modules/@esbuild/freebsd-arm64": { 109 | "version": "0.17.18", 110 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", 111 | "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", 112 | "cpu": [ 113 | "arm64" 114 | ], 115 | "dev": true, 116 | "optional": true, 117 | "os": [ 118 | "freebsd" 119 | ], 120 | "engines": { 121 | "node": ">=12" 122 | } 123 | }, 124 | "node_modules/@esbuild/freebsd-x64": { 125 | "version": "0.17.18", 126 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", 127 | "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", 128 | "cpu": [ 129 | "x64" 130 | ], 131 | "dev": true, 132 | "optional": true, 133 | "os": [ 134 | "freebsd" 135 | ], 136 | "engines": { 137 | "node": ">=12" 138 | } 139 | }, 140 | "node_modules/@esbuild/linux-arm": { 141 | "version": "0.17.18", 142 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", 143 | "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", 144 | "cpu": [ 145 | "arm" 146 | ], 147 | "dev": true, 148 | "optional": true, 149 | "os": [ 150 | "linux" 151 | ], 152 | "engines": { 153 | "node": ">=12" 154 | } 155 | }, 156 | "node_modules/@esbuild/linux-arm64": { 157 | "version": "0.17.18", 158 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", 159 | "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", 160 | "cpu": [ 161 | "arm64" 162 | ], 163 | "dev": true, 164 | "optional": true, 165 | "os": [ 166 | "linux" 167 | ], 168 | "engines": { 169 | "node": ">=12" 170 | } 171 | }, 172 | "node_modules/@esbuild/linux-ia32": { 173 | "version": "0.17.18", 174 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", 175 | "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", 176 | "cpu": [ 177 | "ia32" 178 | ], 179 | "dev": true, 180 | "optional": true, 181 | "os": [ 182 | "linux" 183 | ], 184 | "engines": { 185 | "node": ">=12" 186 | } 187 | }, 188 | "node_modules/@esbuild/linux-loong64": { 189 | "version": "0.17.18", 190 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", 191 | "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", 192 | "cpu": [ 193 | "loong64" 194 | ], 195 | "dev": true, 196 | "optional": true, 197 | "os": [ 198 | "linux" 199 | ], 200 | "engines": { 201 | "node": ">=12" 202 | } 203 | }, 204 | "node_modules/@esbuild/linux-mips64el": { 205 | "version": "0.17.18", 206 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", 207 | "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", 208 | "cpu": [ 209 | "mips64el" 210 | ], 211 | "dev": true, 212 | "optional": true, 213 | "os": [ 214 | "linux" 215 | ], 216 | "engines": { 217 | "node": ">=12" 218 | } 219 | }, 220 | "node_modules/@esbuild/linux-ppc64": { 221 | "version": "0.17.18", 222 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", 223 | "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", 224 | "cpu": [ 225 | "ppc64" 226 | ], 227 | "dev": true, 228 | "optional": true, 229 | "os": [ 230 | "linux" 231 | ], 232 | "engines": { 233 | "node": ">=12" 234 | } 235 | }, 236 | "node_modules/@esbuild/linux-riscv64": { 237 | "version": "0.17.18", 238 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", 239 | "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", 240 | "cpu": [ 241 | "riscv64" 242 | ], 243 | "dev": true, 244 | "optional": true, 245 | "os": [ 246 | "linux" 247 | ], 248 | "engines": { 249 | "node": ">=12" 250 | } 251 | }, 252 | "node_modules/@esbuild/linux-s390x": { 253 | "version": "0.17.18", 254 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", 255 | "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", 256 | "cpu": [ 257 | "s390x" 258 | ], 259 | "dev": true, 260 | "optional": true, 261 | "os": [ 262 | "linux" 263 | ], 264 | "engines": { 265 | "node": ">=12" 266 | } 267 | }, 268 | "node_modules/@esbuild/linux-x64": { 269 | "version": "0.17.18", 270 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", 271 | "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", 272 | "cpu": [ 273 | "x64" 274 | ], 275 | "dev": true, 276 | "optional": true, 277 | "os": [ 278 | "linux" 279 | ], 280 | "engines": { 281 | "node": ">=12" 282 | } 283 | }, 284 | "node_modules/@esbuild/netbsd-x64": { 285 | "version": "0.17.18", 286 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", 287 | "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", 288 | "cpu": [ 289 | "x64" 290 | ], 291 | "dev": true, 292 | "optional": true, 293 | "os": [ 294 | "netbsd" 295 | ], 296 | "engines": { 297 | "node": ">=12" 298 | } 299 | }, 300 | "node_modules/@esbuild/openbsd-x64": { 301 | "version": "0.17.18", 302 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", 303 | "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", 304 | "cpu": [ 305 | "x64" 306 | ], 307 | "dev": true, 308 | "optional": true, 309 | "os": [ 310 | "openbsd" 311 | ], 312 | "engines": { 313 | "node": ">=12" 314 | } 315 | }, 316 | "node_modules/@esbuild/sunos-x64": { 317 | "version": "0.17.18", 318 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", 319 | "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", 320 | "cpu": [ 321 | "x64" 322 | ], 323 | "dev": true, 324 | "optional": true, 325 | "os": [ 326 | "sunos" 327 | ], 328 | "engines": { 329 | "node": ">=12" 330 | } 331 | }, 332 | "node_modules/@esbuild/win32-arm64": { 333 | "version": "0.17.18", 334 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", 335 | "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", 336 | "cpu": [ 337 | "arm64" 338 | ], 339 | "dev": true, 340 | "optional": true, 341 | "os": [ 342 | "win32" 343 | ], 344 | "engines": { 345 | "node": ">=12" 346 | } 347 | }, 348 | "node_modules/@esbuild/win32-ia32": { 349 | "version": "0.17.18", 350 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", 351 | "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", 352 | "cpu": [ 353 | "ia32" 354 | ], 355 | "dev": true, 356 | "optional": true, 357 | "os": [ 358 | "win32" 359 | ], 360 | "engines": { 361 | "node": ">=12" 362 | } 363 | }, 364 | "node_modules/@esbuild/win32-x64": { 365 | "version": "0.17.18", 366 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", 367 | "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", 368 | "cpu": [ 369 | "x64" 370 | ], 371 | "dev": true, 372 | "optional": true, 373 | "os": [ 374 | "win32" 375 | ], 376 | "engines": { 377 | "node": ">=12" 378 | } 379 | }, 380 | "node_modules/@exodus/schemasafe": { 381 | "version": "1.0.1", 382 | "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.1.tgz", 383 | "integrity": "sha512-PQdbF8dGd4LnbwBlcc4ML8RKYdplm+e9sUeWBTr4zgF13/Shiuov9XznvM4T8cb1CfyKK21yTUkuAIIh/DAH/g==" 384 | }, 385 | "node_modules/@jridgewell/resolve-uri": { 386 | "version": "3.1.0", 387 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 388 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 389 | "dev": true, 390 | "engines": { 391 | "node": ">=6.0.0" 392 | } 393 | }, 394 | "node_modules/@jridgewell/sourcemap-codec": { 395 | "version": "1.4.15", 396 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 397 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 398 | "dev": true 399 | }, 400 | "node_modules/@jridgewell/trace-mapping": { 401 | "version": "0.3.18", 402 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", 403 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", 404 | "dev": true, 405 | "dependencies": { 406 | "@jridgewell/resolve-uri": "3.1.0", 407 | "@jridgewell/sourcemap-codec": "1.4.14" 408 | } 409 | }, 410 | "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { 411 | "version": "1.4.14", 412 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 413 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 414 | "dev": true 415 | }, 416 | "node_modules/@nodelib/fs.scandir": { 417 | "version": "2.1.5", 418 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 419 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 420 | "dev": true, 421 | "dependencies": { 422 | "@nodelib/fs.stat": "2.0.5", 423 | "run-parallel": "^1.1.9" 424 | }, 425 | "engines": { 426 | "node": ">= 8" 427 | } 428 | }, 429 | "node_modules/@nodelib/fs.stat": { 430 | "version": "2.0.5", 431 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 432 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 433 | "dev": true, 434 | "engines": { 435 | "node": ">= 8" 436 | } 437 | }, 438 | "node_modules/@nodelib/fs.walk": { 439 | "version": "1.2.8", 440 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 441 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 442 | "dev": true, 443 | "dependencies": { 444 | "@nodelib/fs.scandir": "2.1.5", 445 | "fastq": "^1.6.0" 446 | }, 447 | "engines": { 448 | "node": ">= 8" 449 | } 450 | }, 451 | "node_modules/@polka/url": { 452 | "version": "1.0.0-next.21", 453 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", 454 | "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", 455 | "dev": true 456 | }, 457 | "node_modules/@sveltejs/adapter-auto": { 458 | "version": "2.0.1", 459 | "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.0.1.tgz", 460 | "integrity": "sha512-anxxYMcQy7HWSKxN4YNaVcgNzCHtNFwygq72EA1Xv7c+5gSECOJ1ez1PYoLciPiFa7A3XBvMDQXUFJ2eqLDtAA==", 461 | "dev": true, 462 | "dependencies": { 463 | "import-meta-resolve": "^3.0.0" 464 | }, 465 | "peerDependencies": { 466 | "@sveltejs/kit": "^1.0.0" 467 | } 468 | }, 469 | "node_modules/@sveltejs/kit": { 470 | "version": "1.16.3", 471 | "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.16.3.tgz", 472 | "integrity": "sha512-8uv0udYRpVuE1BweFidcWHfL+u2gAANKmvIal1dN/FWPBl7DJYbt9zYEtr3bNTiXystT8Sn0Wp54RfwpbPqHjQ==", 473 | "dev": true, 474 | "hasInstallScript": true, 475 | "dependencies": { 476 | "@sveltejs/vite-plugin-svelte": "^2.1.1", 477 | "@types/cookie": "^0.5.1", 478 | "cookie": "^0.5.0", 479 | "devalue": "^4.3.0", 480 | "esm-env": "^1.0.0", 481 | "kleur": "^4.1.5", 482 | "magic-string": "^0.30.0", 483 | "mime": "^3.0.0", 484 | "sade": "^1.8.1", 485 | "set-cookie-parser": "^2.6.0", 486 | "sirv": "^2.0.2", 487 | "tiny-glob": "^0.2.9", 488 | "undici": "~5.22.0" 489 | }, 490 | "bin": { 491 | "svelte-kit": "svelte-kit.js" 492 | }, 493 | "engines": { 494 | "node": "^16.14 || >=18" 495 | }, 496 | "peerDependencies": { 497 | "svelte": "^3.54.0", 498 | "vite": "^4.0.0" 499 | } 500 | }, 501 | "node_modules/@sveltejs/package": { 502 | "version": "2.0.2", 503 | "resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-2.0.2.tgz", 504 | "integrity": "sha512-cCOCcO8yMHnhHyaR51nQtvKZ3o/vSU9UYI1EXLT1j2CKNPMuH1/g6JNwKcNNrtQGwwquudc69ZeYy8D/TDNwEw==", 505 | "dev": true, 506 | "dependencies": { 507 | "chokidar": "^3.5.3", 508 | "kleur": "^4.1.5", 509 | "sade": "^1.8.1", 510 | "svelte2tsx": "~0.6.0" 511 | }, 512 | "bin": { 513 | "svelte-package": "svelte-package.js" 514 | }, 515 | "engines": { 516 | "node": "^16.14 || >=18" 517 | }, 518 | "peerDependencies": { 519 | "svelte": "^3.44.0" 520 | } 521 | }, 522 | "node_modules/@sveltejs/vite-plugin-svelte": { 523 | "version": "2.2.0", 524 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.2.0.tgz", 525 | "integrity": "sha512-KDtdva+FZrZlyug15KlbXuubntAPKcBau0K7QhAIqC5SAy0uDbjZwoexDRx0L0J2T4niEfC6FnA9GuQQJKg+Aw==", 526 | "dev": true, 527 | "dependencies": { 528 | "debug": "^4.3.4", 529 | "deepmerge": "^4.3.1", 530 | "kleur": "^4.1.5", 531 | "magic-string": "^0.30.0", 532 | "svelte-hmr": "^0.15.1", 533 | "vitefu": "^0.2.4" 534 | }, 535 | "engines": { 536 | "node": "^14.18.0 || >= 16" 537 | }, 538 | "peerDependencies": { 539 | "svelte": "^3.54.0", 540 | "vite": "^4.0.0" 541 | } 542 | }, 543 | "node_modules/@types/cookie": { 544 | "version": "0.5.1", 545 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", 546 | "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", 547 | "dev": true 548 | }, 549 | "node_modules/@types/lodash": { 550 | "version": "4.14.194", 551 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", 552 | "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", 553 | "dev": true 554 | }, 555 | "node_modules/@types/lodash-es": { 556 | "version": "4.17.7", 557 | "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", 558 | "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", 559 | "dev": true, 560 | "dependencies": { 561 | "@types/lodash": "*" 562 | } 563 | }, 564 | "node_modules/@types/pug": { 565 | "version": "2.0.6", 566 | "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", 567 | "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", 568 | "dev": true 569 | }, 570 | "node_modules/anymatch": { 571 | "version": "3.1.3", 572 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 573 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 574 | "dev": true, 575 | "dependencies": { 576 | "normalize-path": "^3.0.0", 577 | "picomatch": "^2.0.4" 578 | }, 579 | "engines": { 580 | "node": ">= 8" 581 | } 582 | }, 583 | "node_modules/balanced-match": { 584 | "version": "1.0.2", 585 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 586 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 587 | "dev": true 588 | }, 589 | "node_modules/binary-extensions": { 590 | "version": "2.2.0", 591 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 592 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 593 | "dev": true, 594 | "engines": { 595 | "node": ">=8" 596 | } 597 | }, 598 | "node_modules/brace-expansion": { 599 | "version": "1.1.11", 600 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 601 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 602 | "dev": true, 603 | "dependencies": { 604 | "balanced-match": "^1.0.0", 605 | "concat-map": "0.0.1" 606 | } 607 | }, 608 | "node_modules/braces": { 609 | "version": "3.0.2", 610 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 611 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 612 | "dev": true, 613 | "dependencies": { 614 | "fill-range": "^7.0.1" 615 | }, 616 | "engines": { 617 | "node": ">=8" 618 | } 619 | }, 620 | "node_modules/buffer-crc32": { 621 | "version": "0.2.13", 622 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 623 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 624 | "dev": true, 625 | "engines": { 626 | "node": "*" 627 | } 628 | }, 629 | "node_modules/busboy": { 630 | "version": "1.6.0", 631 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 632 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 633 | "dev": true, 634 | "dependencies": { 635 | "streamsearch": "^1.1.0" 636 | }, 637 | "engines": { 638 | "node": ">=10.16.0" 639 | } 640 | }, 641 | "node_modules/callsites": { 642 | "version": "3.1.0", 643 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 644 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 645 | "dev": true, 646 | "engines": { 647 | "node": ">=6" 648 | } 649 | }, 650 | "node_modules/chokidar": { 651 | "version": "3.5.3", 652 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 653 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 654 | "dev": true, 655 | "funding": [ 656 | { 657 | "type": "individual", 658 | "url": "https://paulmillr.com/funding/" 659 | } 660 | ], 661 | "dependencies": { 662 | "anymatch": "~3.1.2", 663 | "braces": "~3.0.2", 664 | "glob-parent": "~5.1.2", 665 | "is-binary-path": "~2.1.0", 666 | "is-glob": "~4.0.1", 667 | "normalize-path": "~3.0.0", 668 | "readdirp": "~3.6.0" 669 | }, 670 | "engines": { 671 | "node": ">= 8.10.0" 672 | }, 673 | "optionalDependencies": { 674 | "fsevents": "~2.3.2" 675 | } 676 | }, 677 | "node_modules/concat-map": { 678 | "version": "0.0.1", 679 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 680 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 681 | "dev": true 682 | }, 683 | "node_modules/cookie": { 684 | "version": "0.5.0", 685 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 686 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 687 | "dev": true, 688 | "engines": { 689 | "node": ">= 0.6" 690 | } 691 | }, 692 | "node_modules/debug": { 693 | "version": "4.3.4", 694 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 695 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 696 | "dev": true, 697 | "dependencies": { 698 | "ms": "2.1.2" 699 | }, 700 | "engines": { 701 | "node": ">=6.0" 702 | }, 703 | "peerDependenciesMeta": { 704 | "supports-color": { 705 | "optional": true 706 | } 707 | } 708 | }, 709 | "node_modules/dedent-js": { 710 | "version": "1.0.1", 711 | "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", 712 | "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==", 713 | "dev": true 714 | }, 715 | "node_modules/deepmerge": { 716 | "version": "4.3.1", 717 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 718 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 719 | "dev": true, 720 | "engines": { 721 | "node": ">=0.10.0" 722 | } 723 | }, 724 | "node_modules/detect-indent": { 725 | "version": "6.1.0", 726 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", 727 | "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", 728 | "dev": true, 729 | "engines": { 730 | "node": ">=8" 731 | } 732 | }, 733 | "node_modules/devalue": { 734 | "version": "4.3.0", 735 | "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz", 736 | "integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==", 737 | "dev": true 738 | }, 739 | "node_modules/es6-promise": { 740 | "version": "3.3.1", 741 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", 742 | "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", 743 | "dev": true 744 | }, 745 | "node_modules/esbuild": { 746 | "version": "0.17.18", 747 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", 748 | "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", 749 | "dev": true, 750 | "hasInstallScript": true, 751 | "bin": { 752 | "esbuild": "bin/esbuild" 753 | }, 754 | "engines": { 755 | "node": ">=12" 756 | }, 757 | "optionalDependencies": { 758 | "@esbuild/android-arm": "0.17.18", 759 | "@esbuild/android-arm64": "0.17.18", 760 | "@esbuild/android-x64": "0.17.18", 761 | "@esbuild/darwin-arm64": "0.17.18", 762 | "@esbuild/darwin-x64": "0.17.18", 763 | "@esbuild/freebsd-arm64": "0.17.18", 764 | "@esbuild/freebsd-x64": "0.17.18", 765 | "@esbuild/linux-arm": "0.17.18", 766 | "@esbuild/linux-arm64": "0.17.18", 767 | "@esbuild/linux-ia32": "0.17.18", 768 | "@esbuild/linux-loong64": "0.17.18", 769 | "@esbuild/linux-mips64el": "0.17.18", 770 | "@esbuild/linux-ppc64": "0.17.18", 771 | "@esbuild/linux-riscv64": "0.17.18", 772 | "@esbuild/linux-s390x": "0.17.18", 773 | "@esbuild/linux-x64": "0.17.18", 774 | "@esbuild/netbsd-x64": "0.17.18", 775 | "@esbuild/openbsd-x64": "0.17.18", 776 | "@esbuild/sunos-x64": "0.17.18", 777 | "@esbuild/win32-arm64": "0.17.18", 778 | "@esbuild/win32-ia32": "0.17.18", 779 | "@esbuild/win32-x64": "0.17.18" 780 | } 781 | }, 782 | "node_modules/esm-env": { 783 | "version": "1.0.0", 784 | "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", 785 | "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", 786 | "dev": true 787 | }, 788 | "node_modules/fast-glob": { 789 | "version": "3.2.12", 790 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 791 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 792 | "dev": true, 793 | "dependencies": { 794 | "@nodelib/fs.stat": "^2.0.2", 795 | "@nodelib/fs.walk": "^1.2.3", 796 | "glob-parent": "^5.1.2", 797 | "merge2": "^1.3.0", 798 | "micromatch": "^4.0.4" 799 | }, 800 | "engines": { 801 | "node": ">=8.6.0" 802 | } 803 | }, 804 | "node_modules/fastq": { 805 | "version": "1.15.0", 806 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 807 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 808 | "dev": true, 809 | "dependencies": { 810 | "reusify": "^1.0.4" 811 | } 812 | }, 813 | "node_modules/fill-range": { 814 | "version": "7.0.1", 815 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 816 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 817 | "dev": true, 818 | "dependencies": { 819 | "to-regex-range": "^5.0.1" 820 | }, 821 | "engines": { 822 | "node": ">=8" 823 | } 824 | }, 825 | "node_modules/fs.realpath": { 826 | "version": "1.0.0", 827 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 828 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 829 | "dev": true 830 | }, 831 | "node_modules/fsevents": { 832 | "version": "2.3.2", 833 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 834 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 835 | "dev": true, 836 | "hasInstallScript": true, 837 | "optional": true, 838 | "os": [ 839 | "darwin" 840 | ], 841 | "engines": { 842 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 843 | } 844 | }, 845 | "node_modules/glob": { 846 | "version": "7.2.3", 847 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 848 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 849 | "dev": true, 850 | "dependencies": { 851 | "fs.realpath": "^1.0.0", 852 | "inflight": "^1.0.4", 853 | "inherits": "2", 854 | "minimatch": "^3.1.1", 855 | "once": "^1.3.0", 856 | "path-is-absolute": "^1.0.0" 857 | }, 858 | "engines": { 859 | "node": "*" 860 | }, 861 | "funding": { 862 | "url": "https://github.com/sponsors/isaacs" 863 | } 864 | }, 865 | "node_modules/glob-parent": { 866 | "version": "5.1.2", 867 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 868 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 869 | "dev": true, 870 | "dependencies": { 871 | "is-glob": "^4.0.1" 872 | }, 873 | "engines": { 874 | "node": ">= 6" 875 | } 876 | }, 877 | "node_modules/globalyzer": { 878 | "version": "0.1.0", 879 | "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", 880 | "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", 881 | "dev": true 882 | }, 883 | "node_modules/globrex": { 884 | "version": "0.1.2", 885 | "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", 886 | "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", 887 | "dev": true 888 | }, 889 | "node_modules/graceful-fs": { 890 | "version": "4.2.11", 891 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 892 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 893 | "dev": true 894 | }, 895 | "node_modules/immutable": { 896 | "version": "4.3.0", 897 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", 898 | "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", 899 | "dev": true 900 | }, 901 | "node_modules/import-fresh": { 902 | "version": "3.3.0", 903 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 904 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 905 | "dev": true, 906 | "dependencies": { 907 | "parent-module": "^1.0.0", 908 | "resolve-from": "^4.0.0" 909 | }, 910 | "engines": { 911 | "node": ">=6" 912 | }, 913 | "funding": { 914 | "url": "https://github.com/sponsors/sindresorhus" 915 | } 916 | }, 917 | "node_modules/import-meta-resolve": { 918 | "version": "3.0.0", 919 | "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", 920 | "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", 921 | "dev": true, 922 | "funding": { 923 | "type": "github", 924 | "url": "https://github.com/sponsors/wooorm" 925 | } 926 | }, 927 | "node_modules/inflight": { 928 | "version": "1.0.6", 929 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 930 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 931 | "dev": true, 932 | "dependencies": { 933 | "once": "^1.3.0", 934 | "wrappy": "1" 935 | } 936 | }, 937 | "node_modules/inherits": { 938 | "version": "2.0.4", 939 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 940 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 941 | "dev": true 942 | }, 943 | "node_modules/is-binary-path": { 944 | "version": "2.1.0", 945 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 946 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 947 | "dev": true, 948 | "dependencies": { 949 | "binary-extensions": "^2.0.0" 950 | }, 951 | "engines": { 952 | "node": ">=8" 953 | } 954 | }, 955 | "node_modules/is-extglob": { 956 | "version": "2.1.1", 957 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 958 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 959 | "dev": true, 960 | "engines": { 961 | "node": ">=0.10.0" 962 | } 963 | }, 964 | "node_modules/is-glob": { 965 | "version": "4.0.3", 966 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 967 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 968 | "dev": true, 969 | "dependencies": { 970 | "is-extglob": "^2.1.1" 971 | }, 972 | "engines": { 973 | "node": ">=0.10.0" 974 | } 975 | }, 976 | "node_modules/is-number": { 977 | "version": "7.0.0", 978 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 979 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 980 | "dev": true, 981 | "engines": { 982 | "node": ">=0.12.0" 983 | } 984 | }, 985 | "node_modules/kleur": { 986 | "version": "4.1.5", 987 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 988 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 989 | "dev": true, 990 | "engines": { 991 | "node": ">=6" 992 | } 993 | }, 994 | "node_modules/lodash-es": { 995 | "version": "4.17.21", 996 | "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", 997 | "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" 998 | }, 999 | "node_modules/lower-case": { 1000 | "version": "2.0.2", 1001 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 1002 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 1003 | "dev": true, 1004 | "dependencies": { 1005 | "tslib": "^2.0.3" 1006 | } 1007 | }, 1008 | "node_modules/magic-string": { 1009 | "version": "0.30.0", 1010 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", 1011 | "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", 1012 | "dev": true, 1013 | "dependencies": { 1014 | "@jridgewell/sourcemap-codec": "^1.4.13" 1015 | }, 1016 | "engines": { 1017 | "node": ">=12" 1018 | } 1019 | }, 1020 | "node_modules/merge2": { 1021 | "version": "1.4.1", 1022 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1023 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1024 | "dev": true, 1025 | "engines": { 1026 | "node": ">= 8" 1027 | } 1028 | }, 1029 | "node_modules/micromatch": { 1030 | "version": "4.0.5", 1031 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1032 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1033 | "dev": true, 1034 | "dependencies": { 1035 | "braces": "^3.0.2", 1036 | "picomatch": "^2.3.1" 1037 | }, 1038 | "engines": { 1039 | "node": ">=8.6" 1040 | } 1041 | }, 1042 | "node_modules/mime": { 1043 | "version": "3.0.0", 1044 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 1045 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 1046 | "dev": true, 1047 | "bin": { 1048 | "mime": "cli.js" 1049 | }, 1050 | "engines": { 1051 | "node": ">=10.0.0" 1052 | } 1053 | }, 1054 | "node_modules/min-indent": { 1055 | "version": "1.0.1", 1056 | "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", 1057 | "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", 1058 | "dev": true, 1059 | "engines": { 1060 | "node": ">=4" 1061 | } 1062 | }, 1063 | "node_modules/minimatch": { 1064 | "version": "3.1.2", 1065 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1066 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1067 | "dev": true, 1068 | "dependencies": { 1069 | "brace-expansion": "^1.1.7" 1070 | }, 1071 | "engines": { 1072 | "node": "*" 1073 | } 1074 | }, 1075 | "node_modules/minimist": { 1076 | "version": "1.2.8", 1077 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1078 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1079 | "dev": true, 1080 | "funding": { 1081 | "url": "https://github.com/sponsors/ljharb" 1082 | } 1083 | }, 1084 | "node_modules/mkdirp": { 1085 | "version": "0.5.6", 1086 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1087 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1088 | "dev": true, 1089 | "dependencies": { 1090 | "minimist": "^1.2.6" 1091 | }, 1092 | "bin": { 1093 | "mkdirp": "bin/cmd.js" 1094 | } 1095 | }, 1096 | "node_modules/mri": { 1097 | "version": "1.2.0", 1098 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 1099 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 1100 | "dev": true, 1101 | "engines": { 1102 | "node": ">=4" 1103 | } 1104 | }, 1105 | "node_modules/mrmime": { 1106 | "version": "1.0.1", 1107 | "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", 1108 | "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", 1109 | "dev": true, 1110 | "engines": { 1111 | "node": ">=10" 1112 | } 1113 | }, 1114 | "node_modules/ms": { 1115 | "version": "2.1.2", 1116 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1117 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1118 | "dev": true 1119 | }, 1120 | "node_modules/nanoid": { 1121 | "version": "3.3.6", 1122 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 1123 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 1124 | "dev": true, 1125 | "funding": [ 1126 | { 1127 | "type": "github", 1128 | "url": "https://github.com/sponsors/ai" 1129 | } 1130 | ], 1131 | "bin": { 1132 | "nanoid": "bin/nanoid.cjs" 1133 | }, 1134 | "engines": { 1135 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1136 | } 1137 | }, 1138 | "node_modules/no-case": { 1139 | "version": "3.0.4", 1140 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 1141 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 1142 | "dev": true, 1143 | "dependencies": { 1144 | "lower-case": "^2.0.2", 1145 | "tslib": "^2.0.3" 1146 | } 1147 | }, 1148 | "node_modules/normalize-path": { 1149 | "version": "3.0.0", 1150 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1151 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1152 | "dev": true, 1153 | "engines": { 1154 | "node": ">=0.10.0" 1155 | } 1156 | }, 1157 | "node_modules/once": { 1158 | "version": "1.4.0", 1159 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1160 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1161 | "dev": true, 1162 | "dependencies": { 1163 | "wrappy": "1" 1164 | } 1165 | }, 1166 | "node_modules/parent-module": { 1167 | "version": "1.0.1", 1168 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1169 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1170 | "dev": true, 1171 | "dependencies": { 1172 | "callsites": "^3.0.0" 1173 | }, 1174 | "engines": { 1175 | "node": ">=6" 1176 | } 1177 | }, 1178 | "node_modules/pascal-case": { 1179 | "version": "3.1.2", 1180 | "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", 1181 | "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", 1182 | "dev": true, 1183 | "dependencies": { 1184 | "no-case": "^3.0.4", 1185 | "tslib": "^2.0.3" 1186 | } 1187 | }, 1188 | "node_modules/path-is-absolute": { 1189 | "version": "1.0.1", 1190 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1191 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1192 | "dev": true, 1193 | "engines": { 1194 | "node": ">=0.10.0" 1195 | } 1196 | }, 1197 | "node_modules/picocolors": { 1198 | "version": "1.0.0", 1199 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1200 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1201 | "dev": true 1202 | }, 1203 | "node_modules/picomatch": { 1204 | "version": "2.3.1", 1205 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1206 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1207 | "dev": true, 1208 | "engines": { 1209 | "node": ">=8.6" 1210 | }, 1211 | "funding": { 1212 | "url": "https://github.com/sponsors/jonschlinkert" 1213 | } 1214 | }, 1215 | "node_modules/postcss": { 1216 | "version": "8.4.23", 1217 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", 1218 | "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", 1219 | "dev": true, 1220 | "funding": [ 1221 | { 1222 | "type": "opencollective", 1223 | "url": "https://opencollective.com/postcss/" 1224 | }, 1225 | { 1226 | "type": "tidelift", 1227 | "url": "https://tidelift.com/funding/github/npm/postcss" 1228 | }, 1229 | { 1230 | "type": "github", 1231 | "url": "https://github.com/sponsors/ai" 1232 | } 1233 | ], 1234 | "dependencies": { 1235 | "nanoid": "^3.3.6", 1236 | "picocolors": "^1.0.0", 1237 | "source-map-js": "^1.0.2" 1238 | }, 1239 | "engines": { 1240 | "node": "^10 || ^12 || >=14" 1241 | } 1242 | }, 1243 | "node_modules/queue-microtask": { 1244 | "version": "1.2.3", 1245 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1246 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1247 | "dev": true, 1248 | "funding": [ 1249 | { 1250 | "type": "github", 1251 | "url": "https://github.com/sponsors/feross" 1252 | }, 1253 | { 1254 | "type": "patreon", 1255 | "url": "https://www.patreon.com/feross" 1256 | }, 1257 | { 1258 | "type": "consulting", 1259 | "url": "https://feross.org/support" 1260 | } 1261 | ] 1262 | }, 1263 | "node_modules/readdirp": { 1264 | "version": "3.6.0", 1265 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1266 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1267 | "dev": true, 1268 | "dependencies": { 1269 | "picomatch": "^2.2.1" 1270 | }, 1271 | "engines": { 1272 | "node": ">=8.10.0" 1273 | } 1274 | }, 1275 | "node_modules/resolve-from": { 1276 | "version": "4.0.0", 1277 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1278 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1279 | "dev": true, 1280 | "engines": { 1281 | "node": ">=4" 1282 | } 1283 | }, 1284 | "node_modules/reusify": { 1285 | "version": "1.0.4", 1286 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1287 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1288 | "dev": true, 1289 | "engines": { 1290 | "iojs": ">=1.0.0", 1291 | "node": ">=0.10.0" 1292 | } 1293 | }, 1294 | "node_modules/rimraf": { 1295 | "version": "2.7.1", 1296 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1297 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1298 | "dev": true, 1299 | "dependencies": { 1300 | "glob": "^7.1.3" 1301 | }, 1302 | "bin": { 1303 | "rimraf": "bin.js" 1304 | } 1305 | }, 1306 | "node_modules/rollup": { 1307 | "version": "3.21.6", 1308 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.6.tgz", 1309 | "integrity": "sha512-SXIICxvxQxR3D4dp/3LDHZIJPC8a4anKMHd4E3Jiz2/JnY+2bEjqrOokAauc5ShGVNFHlEFjBXAXlaxkJqIqSg==", 1310 | "dev": true, 1311 | "bin": { 1312 | "rollup": "dist/bin/rollup" 1313 | }, 1314 | "engines": { 1315 | "node": ">=14.18.0", 1316 | "npm": ">=8.0.0" 1317 | }, 1318 | "optionalDependencies": { 1319 | "fsevents": "~2.3.2" 1320 | } 1321 | }, 1322 | "node_modules/run-parallel": { 1323 | "version": "1.2.0", 1324 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1325 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1326 | "dev": true, 1327 | "funding": [ 1328 | { 1329 | "type": "github", 1330 | "url": "https://github.com/sponsors/feross" 1331 | }, 1332 | { 1333 | "type": "patreon", 1334 | "url": "https://www.patreon.com/feross" 1335 | }, 1336 | { 1337 | "type": "consulting", 1338 | "url": "https://feross.org/support" 1339 | } 1340 | ], 1341 | "dependencies": { 1342 | "queue-microtask": "^1.2.2" 1343 | } 1344 | }, 1345 | "node_modules/sade": { 1346 | "version": "1.8.1", 1347 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 1348 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 1349 | "dev": true, 1350 | "dependencies": { 1351 | "mri": "^1.1.0" 1352 | }, 1353 | "engines": { 1354 | "node": ">=6" 1355 | } 1356 | }, 1357 | "node_modules/sander": { 1358 | "version": "0.5.1", 1359 | "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", 1360 | "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", 1361 | "dev": true, 1362 | "dependencies": { 1363 | "es6-promise": "^3.1.2", 1364 | "graceful-fs": "^4.1.3", 1365 | "mkdirp": "^0.5.1", 1366 | "rimraf": "^2.5.2" 1367 | } 1368 | }, 1369 | "node_modules/sass": { 1370 | "version": "1.62.1", 1371 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", 1372 | "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", 1373 | "dev": true, 1374 | "dependencies": { 1375 | "chokidar": ">=3.0.0 <4.0.0", 1376 | "immutable": "^4.0.0", 1377 | "source-map-js": ">=0.6.2 <2.0.0" 1378 | }, 1379 | "bin": { 1380 | "sass": "sass.js" 1381 | }, 1382 | "engines": { 1383 | "node": ">=14.0.0" 1384 | } 1385 | }, 1386 | "node_modules/set-cookie-parser": { 1387 | "version": "2.6.0", 1388 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", 1389 | "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", 1390 | "dev": true 1391 | }, 1392 | "node_modules/sirv": { 1393 | "version": "2.0.3", 1394 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", 1395 | "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", 1396 | "dev": true, 1397 | "dependencies": { 1398 | "@polka/url": "^1.0.0-next.20", 1399 | "mrmime": "^1.0.0", 1400 | "totalist": "^3.0.0" 1401 | }, 1402 | "engines": { 1403 | "node": ">= 10" 1404 | } 1405 | }, 1406 | "node_modules/sorcery": { 1407 | "version": "0.11.0", 1408 | "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", 1409 | "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", 1410 | "dev": true, 1411 | "dependencies": { 1412 | "@jridgewell/sourcemap-codec": "^1.4.14", 1413 | "buffer-crc32": "^0.2.5", 1414 | "minimist": "^1.2.0", 1415 | "sander": "^0.5.0" 1416 | }, 1417 | "bin": { 1418 | "sorcery": "bin/sorcery" 1419 | } 1420 | }, 1421 | "node_modules/source-map-js": { 1422 | "version": "1.0.2", 1423 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1424 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1425 | "dev": true, 1426 | "engines": { 1427 | "node": ">=0.10.0" 1428 | } 1429 | }, 1430 | "node_modules/streamsearch": { 1431 | "version": "1.1.0", 1432 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 1433 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 1434 | "dev": true, 1435 | "engines": { 1436 | "node": ">=10.0.0" 1437 | } 1438 | }, 1439 | "node_modules/strip-indent": { 1440 | "version": "3.0.0", 1441 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", 1442 | "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", 1443 | "dev": true, 1444 | "dependencies": { 1445 | "min-indent": "^1.0.0" 1446 | }, 1447 | "engines": { 1448 | "node": ">=8" 1449 | } 1450 | }, 1451 | "node_modules/svelte": { 1452 | "version": "3.59.1", 1453 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.1.tgz", 1454 | "integrity": "sha512-pKj8fEBmqf6mq3/NfrB9SLtcJcUvjYSWyePlfCqN9gujLB25RitWK8PvFzlwim6hD/We35KbPlRteuA6rnPGcQ==", 1455 | "dev": true, 1456 | "engines": { 1457 | "node": ">= 8" 1458 | } 1459 | }, 1460 | "node_modules/svelte-check": { 1461 | "version": "3.3.2", 1462 | "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.3.2.tgz", 1463 | "integrity": "sha512-67j3rI0LDc2DvL0ON/2pvCasVVD3nHDrTkZNr4eITNfo2oFXdw7SIyMOiFj4swu+pjmFQAigytBK1IWyik8dBw==", 1464 | "dev": true, 1465 | "dependencies": { 1466 | "@jridgewell/trace-mapping": "^0.3.17", 1467 | "chokidar": "^3.4.1", 1468 | "fast-glob": "^3.2.7", 1469 | "import-fresh": "^3.2.1", 1470 | "picocolors": "^1.0.0", 1471 | "sade": "^1.7.4", 1472 | "svelte-preprocess": "^5.0.3", 1473 | "typescript": "^5.0.3" 1474 | }, 1475 | "bin": { 1476 | "svelte-check": "bin/svelte-check" 1477 | }, 1478 | "peerDependencies": { 1479 | "svelte": "^3.55.0" 1480 | } 1481 | }, 1482 | "node_modules/svelte-check/node_modules/typescript": { 1483 | "version": "5.0.4", 1484 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", 1485 | "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", 1486 | "dev": true, 1487 | "bin": { 1488 | "tsc": "bin/tsc", 1489 | "tsserver": "bin/tsserver" 1490 | }, 1491 | "engines": { 1492 | "node": ">=12.20" 1493 | } 1494 | }, 1495 | "node_modules/svelte-hmr": { 1496 | "version": "0.15.1", 1497 | "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", 1498 | "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", 1499 | "dev": true, 1500 | "engines": { 1501 | "node": "^12.20 || ^14.13.1 || >= 16" 1502 | }, 1503 | "peerDependencies": { 1504 | "svelte": ">=3.19.0" 1505 | } 1506 | }, 1507 | "node_modules/svelte-preprocess": { 1508 | "version": "5.0.3", 1509 | "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.3.tgz", 1510 | "integrity": "sha512-GrHF1rusdJVbOZOwgPWtpqmaexkydznKzy5qIC2FabgpFyKN57bjMUUUqPRfbBXK5igiEWn1uO/DXsa2vJ5VHA==", 1511 | "dev": true, 1512 | "hasInstallScript": true, 1513 | "dependencies": { 1514 | "@types/pug": "^2.0.6", 1515 | "detect-indent": "^6.1.0", 1516 | "magic-string": "^0.27.0", 1517 | "sorcery": "^0.11.0", 1518 | "strip-indent": "^3.0.0" 1519 | }, 1520 | "engines": { 1521 | "node": ">= 14.10.0" 1522 | }, 1523 | "peerDependencies": { 1524 | "@babel/core": "^7.10.2", 1525 | "coffeescript": "^2.5.1", 1526 | "less": "^3.11.3 || ^4.0.0", 1527 | "postcss": "^7 || ^8", 1528 | "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", 1529 | "pug": "^3.0.0", 1530 | "sass": "^1.26.8", 1531 | "stylus": "^0.55.0", 1532 | "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", 1533 | "svelte": "^3.23.0", 1534 | "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" 1535 | }, 1536 | "peerDependenciesMeta": { 1537 | "@babel/core": { 1538 | "optional": true 1539 | }, 1540 | "coffeescript": { 1541 | "optional": true 1542 | }, 1543 | "less": { 1544 | "optional": true 1545 | }, 1546 | "postcss": { 1547 | "optional": true 1548 | }, 1549 | "postcss-load-config": { 1550 | "optional": true 1551 | }, 1552 | "pug": { 1553 | "optional": true 1554 | }, 1555 | "sass": { 1556 | "optional": true 1557 | }, 1558 | "stylus": { 1559 | "optional": true 1560 | }, 1561 | "sugarss": { 1562 | "optional": true 1563 | }, 1564 | "typescript": { 1565 | "optional": true 1566 | } 1567 | } 1568 | }, 1569 | "node_modules/svelte-preprocess/node_modules/magic-string": { 1570 | "version": "0.27.0", 1571 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", 1572 | "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", 1573 | "dev": true, 1574 | "dependencies": { 1575 | "@jridgewell/sourcemap-codec": "^1.4.13" 1576 | }, 1577 | "engines": { 1578 | "node": ">=12" 1579 | } 1580 | }, 1581 | "node_modules/svelte2tsx": { 1582 | "version": "0.6.14", 1583 | "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.6.14.tgz", 1584 | "integrity": "sha512-Sxo9gtpc3dYWuFQ8fruZG+M+I6OZMIvOxxKjt48Lr8jD6Kr9cNf1Hf/yHUDEgDwQdRbAzn5y0FL9xk8Dx5v9lg==", 1585 | "dev": true, 1586 | "dependencies": { 1587 | "dedent-js": "^1.0.1", 1588 | "pascal-case": "^3.1.1" 1589 | }, 1590 | "peerDependencies": { 1591 | "svelte": "^3.55", 1592 | "typescript": "^4.9.4 || ^5.0.0" 1593 | } 1594 | }, 1595 | "node_modules/tiny-glob": { 1596 | "version": "0.2.9", 1597 | "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", 1598 | "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", 1599 | "dev": true, 1600 | "dependencies": { 1601 | "globalyzer": "0.1.0", 1602 | "globrex": "^0.1.2" 1603 | } 1604 | }, 1605 | "node_modules/to-regex-range": { 1606 | "version": "5.0.1", 1607 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1608 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1609 | "dev": true, 1610 | "dependencies": { 1611 | "is-number": "^7.0.0" 1612 | }, 1613 | "engines": { 1614 | "node": ">=8.0" 1615 | } 1616 | }, 1617 | "node_modules/totalist": { 1618 | "version": "3.0.1", 1619 | "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", 1620 | "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", 1621 | "dev": true, 1622 | "engines": { 1623 | "node": ">=6" 1624 | } 1625 | }, 1626 | "node_modules/tslib": { 1627 | "version": "2.5.0", 1628 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", 1629 | "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", 1630 | "dev": true 1631 | }, 1632 | "node_modules/typescript": { 1633 | "version": "4.9.5", 1634 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 1635 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 1636 | "dev": true, 1637 | "bin": { 1638 | "tsc": "bin/tsc", 1639 | "tsserver": "bin/tsserver" 1640 | }, 1641 | "engines": { 1642 | "node": ">=4.2.0" 1643 | } 1644 | }, 1645 | "node_modules/undici": { 1646 | "version": "5.22.1", 1647 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", 1648 | "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", 1649 | "dev": true, 1650 | "dependencies": { 1651 | "busboy": "^1.6.0" 1652 | }, 1653 | "engines": { 1654 | "node": ">=14.0" 1655 | } 1656 | }, 1657 | "node_modules/vite": { 1658 | "version": "4.3.5", 1659 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.5.tgz", 1660 | "integrity": "sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==", 1661 | "dev": true, 1662 | "dependencies": { 1663 | "esbuild": "^0.17.5", 1664 | "postcss": "^8.4.23", 1665 | "rollup": "^3.21.0" 1666 | }, 1667 | "bin": { 1668 | "vite": "bin/vite.js" 1669 | }, 1670 | "engines": { 1671 | "node": "^14.18.0 || >=16.0.0" 1672 | }, 1673 | "optionalDependencies": { 1674 | "fsevents": "~2.3.2" 1675 | }, 1676 | "peerDependencies": { 1677 | "@types/node": ">= 14", 1678 | "less": "*", 1679 | "sass": "*", 1680 | "stylus": "*", 1681 | "sugarss": "*", 1682 | "terser": "^5.4.0" 1683 | }, 1684 | "peerDependenciesMeta": { 1685 | "@types/node": { 1686 | "optional": true 1687 | }, 1688 | "less": { 1689 | "optional": true 1690 | }, 1691 | "sass": { 1692 | "optional": true 1693 | }, 1694 | "stylus": { 1695 | "optional": true 1696 | }, 1697 | "sugarss": { 1698 | "optional": true 1699 | }, 1700 | "terser": { 1701 | "optional": true 1702 | } 1703 | } 1704 | }, 1705 | "node_modules/vitefu": { 1706 | "version": "0.2.4", 1707 | "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", 1708 | "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", 1709 | "dev": true, 1710 | "peerDependencies": { 1711 | "vite": "^3.0.0 || ^4.0.0" 1712 | }, 1713 | "peerDependenciesMeta": { 1714 | "vite": { 1715 | "optional": true 1716 | } 1717 | } 1718 | }, 1719 | "node_modules/wrappy": { 1720 | "version": "1.0.2", 1721 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1722 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1723 | "dev": true 1724 | } 1725 | }, 1726 | "dependencies": { 1727 | "@esbuild/android-arm": { 1728 | "version": "0.17.18", 1729 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", 1730 | "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", 1731 | "dev": true, 1732 | "optional": true 1733 | }, 1734 | "@esbuild/android-arm64": { 1735 | "version": "0.17.18", 1736 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", 1737 | "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", 1738 | "dev": true, 1739 | "optional": true 1740 | }, 1741 | "@esbuild/android-x64": { 1742 | "version": "0.17.18", 1743 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", 1744 | "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", 1745 | "dev": true, 1746 | "optional": true 1747 | }, 1748 | "@esbuild/darwin-arm64": { 1749 | "version": "0.17.18", 1750 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", 1751 | "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", 1752 | "dev": true, 1753 | "optional": true 1754 | }, 1755 | "@esbuild/darwin-x64": { 1756 | "version": "0.17.18", 1757 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", 1758 | "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", 1759 | "dev": true, 1760 | "optional": true 1761 | }, 1762 | "@esbuild/freebsd-arm64": { 1763 | "version": "0.17.18", 1764 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", 1765 | "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", 1766 | "dev": true, 1767 | "optional": true 1768 | }, 1769 | "@esbuild/freebsd-x64": { 1770 | "version": "0.17.18", 1771 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", 1772 | "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", 1773 | "dev": true, 1774 | "optional": true 1775 | }, 1776 | "@esbuild/linux-arm": { 1777 | "version": "0.17.18", 1778 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", 1779 | "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", 1780 | "dev": true, 1781 | "optional": true 1782 | }, 1783 | "@esbuild/linux-arm64": { 1784 | "version": "0.17.18", 1785 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", 1786 | "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", 1787 | "dev": true, 1788 | "optional": true 1789 | }, 1790 | "@esbuild/linux-ia32": { 1791 | "version": "0.17.18", 1792 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", 1793 | "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", 1794 | "dev": true, 1795 | "optional": true 1796 | }, 1797 | "@esbuild/linux-loong64": { 1798 | "version": "0.17.18", 1799 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", 1800 | "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", 1801 | "dev": true, 1802 | "optional": true 1803 | }, 1804 | "@esbuild/linux-mips64el": { 1805 | "version": "0.17.18", 1806 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", 1807 | "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", 1808 | "dev": true, 1809 | "optional": true 1810 | }, 1811 | "@esbuild/linux-ppc64": { 1812 | "version": "0.17.18", 1813 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", 1814 | "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", 1815 | "dev": true, 1816 | "optional": true 1817 | }, 1818 | "@esbuild/linux-riscv64": { 1819 | "version": "0.17.18", 1820 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", 1821 | "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", 1822 | "dev": true, 1823 | "optional": true 1824 | }, 1825 | "@esbuild/linux-s390x": { 1826 | "version": "0.17.18", 1827 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", 1828 | "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", 1829 | "dev": true, 1830 | "optional": true 1831 | }, 1832 | "@esbuild/linux-x64": { 1833 | "version": "0.17.18", 1834 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", 1835 | "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", 1836 | "dev": true, 1837 | "optional": true 1838 | }, 1839 | "@esbuild/netbsd-x64": { 1840 | "version": "0.17.18", 1841 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", 1842 | "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", 1843 | "dev": true, 1844 | "optional": true 1845 | }, 1846 | "@esbuild/openbsd-x64": { 1847 | "version": "0.17.18", 1848 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", 1849 | "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", 1850 | "dev": true, 1851 | "optional": true 1852 | }, 1853 | "@esbuild/sunos-x64": { 1854 | "version": "0.17.18", 1855 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", 1856 | "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", 1857 | "dev": true, 1858 | "optional": true 1859 | }, 1860 | "@esbuild/win32-arm64": { 1861 | "version": "0.17.18", 1862 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", 1863 | "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", 1864 | "dev": true, 1865 | "optional": true 1866 | }, 1867 | "@esbuild/win32-ia32": { 1868 | "version": "0.17.18", 1869 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", 1870 | "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", 1871 | "dev": true, 1872 | "optional": true 1873 | }, 1874 | "@esbuild/win32-x64": { 1875 | "version": "0.17.18", 1876 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", 1877 | "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", 1878 | "dev": true, 1879 | "optional": true 1880 | }, 1881 | "@exodus/schemasafe": { 1882 | "version": "1.0.1", 1883 | "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.0.1.tgz", 1884 | "integrity": "sha512-PQdbF8dGd4LnbwBlcc4ML8RKYdplm+e9sUeWBTr4zgF13/Shiuov9XznvM4T8cb1CfyKK21yTUkuAIIh/DAH/g==" 1885 | }, 1886 | "@jridgewell/resolve-uri": { 1887 | "version": "3.1.0", 1888 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 1889 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 1890 | "dev": true 1891 | }, 1892 | "@jridgewell/sourcemap-codec": { 1893 | "version": "1.4.15", 1894 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 1895 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 1896 | "dev": true 1897 | }, 1898 | "@jridgewell/trace-mapping": { 1899 | "version": "0.3.18", 1900 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", 1901 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", 1902 | "dev": true, 1903 | "requires": { 1904 | "@jridgewell/resolve-uri": "3.1.0", 1905 | "@jridgewell/sourcemap-codec": "1.4.14" 1906 | }, 1907 | "dependencies": { 1908 | "@jridgewell/sourcemap-codec": { 1909 | "version": "1.4.14", 1910 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 1911 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 1912 | "dev": true 1913 | } 1914 | } 1915 | }, 1916 | "@nodelib/fs.scandir": { 1917 | "version": "2.1.5", 1918 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1919 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1920 | "dev": true, 1921 | "requires": { 1922 | "@nodelib/fs.stat": "2.0.5", 1923 | "run-parallel": "^1.1.9" 1924 | } 1925 | }, 1926 | "@nodelib/fs.stat": { 1927 | "version": "2.0.5", 1928 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1929 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1930 | "dev": true 1931 | }, 1932 | "@nodelib/fs.walk": { 1933 | "version": "1.2.8", 1934 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1935 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1936 | "dev": true, 1937 | "requires": { 1938 | "@nodelib/fs.scandir": "2.1.5", 1939 | "fastq": "^1.6.0" 1940 | } 1941 | }, 1942 | "@polka/url": { 1943 | "version": "1.0.0-next.21", 1944 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", 1945 | "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", 1946 | "dev": true 1947 | }, 1948 | "@sveltejs/adapter-auto": { 1949 | "version": "2.0.1", 1950 | "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.0.1.tgz", 1951 | "integrity": "sha512-anxxYMcQy7HWSKxN4YNaVcgNzCHtNFwygq72EA1Xv7c+5gSECOJ1ez1PYoLciPiFa7A3XBvMDQXUFJ2eqLDtAA==", 1952 | "dev": true, 1953 | "requires": { 1954 | "import-meta-resolve": "^3.0.0" 1955 | } 1956 | }, 1957 | "@sveltejs/kit": { 1958 | "version": "1.16.3", 1959 | "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.16.3.tgz", 1960 | "integrity": "sha512-8uv0udYRpVuE1BweFidcWHfL+u2gAANKmvIal1dN/FWPBl7DJYbt9zYEtr3bNTiXystT8Sn0Wp54RfwpbPqHjQ==", 1961 | "dev": true, 1962 | "requires": { 1963 | "@sveltejs/vite-plugin-svelte": "^2.1.1", 1964 | "@types/cookie": "^0.5.1", 1965 | "cookie": "^0.5.0", 1966 | "devalue": "^4.3.0", 1967 | "esm-env": "^1.0.0", 1968 | "kleur": "^4.1.5", 1969 | "magic-string": "^0.30.0", 1970 | "mime": "^3.0.0", 1971 | "sade": "^1.8.1", 1972 | "set-cookie-parser": "^2.6.0", 1973 | "sirv": "^2.0.2", 1974 | "tiny-glob": "^0.2.9", 1975 | "undici": "~5.22.0" 1976 | } 1977 | }, 1978 | "@sveltejs/package": { 1979 | "version": "2.0.2", 1980 | "resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-2.0.2.tgz", 1981 | "integrity": "sha512-cCOCcO8yMHnhHyaR51nQtvKZ3o/vSU9UYI1EXLT1j2CKNPMuH1/g6JNwKcNNrtQGwwquudc69ZeYy8D/TDNwEw==", 1982 | "dev": true, 1983 | "requires": { 1984 | "chokidar": "^3.5.3", 1985 | "kleur": "^4.1.5", 1986 | "sade": "^1.8.1", 1987 | "svelte2tsx": "~0.6.0" 1988 | } 1989 | }, 1990 | "@sveltejs/vite-plugin-svelte": { 1991 | "version": "2.2.0", 1992 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.2.0.tgz", 1993 | "integrity": "sha512-KDtdva+FZrZlyug15KlbXuubntAPKcBau0K7QhAIqC5SAy0uDbjZwoexDRx0L0J2T4niEfC6FnA9GuQQJKg+Aw==", 1994 | "dev": true, 1995 | "requires": { 1996 | "debug": "^4.3.4", 1997 | "deepmerge": "^4.3.1", 1998 | "kleur": "^4.1.5", 1999 | "magic-string": "^0.30.0", 2000 | "svelte-hmr": "^0.15.1", 2001 | "vitefu": "^0.2.4" 2002 | } 2003 | }, 2004 | "@types/cookie": { 2005 | "version": "0.5.1", 2006 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", 2007 | "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", 2008 | "dev": true 2009 | }, 2010 | "@types/lodash": { 2011 | "version": "4.14.194", 2012 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", 2013 | "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", 2014 | "dev": true 2015 | }, 2016 | "@types/lodash-es": { 2017 | "version": "4.17.7", 2018 | "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", 2019 | "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", 2020 | "dev": true, 2021 | "requires": { 2022 | "@types/lodash": "*" 2023 | } 2024 | }, 2025 | "@types/pug": { 2026 | "version": "2.0.6", 2027 | "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", 2028 | "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", 2029 | "dev": true 2030 | }, 2031 | "anymatch": { 2032 | "version": "3.1.3", 2033 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 2034 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 2035 | "dev": true, 2036 | "requires": { 2037 | "normalize-path": "^3.0.0", 2038 | "picomatch": "^2.0.4" 2039 | } 2040 | }, 2041 | "balanced-match": { 2042 | "version": "1.0.2", 2043 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 2044 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 2045 | "dev": true 2046 | }, 2047 | "binary-extensions": { 2048 | "version": "2.2.0", 2049 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 2050 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 2051 | "dev": true 2052 | }, 2053 | "brace-expansion": { 2054 | "version": "1.1.11", 2055 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2056 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2057 | "dev": true, 2058 | "requires": { 2059 | "balanced-match": "^1.0.0", 2060 | "concat-map": "0.0.1" 2061 | } 2062 | }, 2063 | "braces": { 2064 | "version": "3.0.2", 2065 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 2066 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 2067 | "dev": true, 2068 | "requires": { 2069 | "fill-range": "^7.0.1" 2070 | } 2071 | }, 2072 | "buffer-crc32": { 2073 | "version": "0.2.13", 2074 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 2075 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 2076 | "dev": true 2077 | }, 2078 | "busboy": { 2079 | "version": "1.6.0", 2080 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 2081 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 2082 | "dev": true, 2083 | "requires": { 2084 | "streamsearch": "^1.1.0" 2085 | } 2086 | }, 2087 | "callsites": { 2088 | "version": "3.1.0", 2089 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 2090 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 2091 | "dev": true 2092 | }, 2093 | "chokidar": { 2094 | "version": "3.5.3", 2095 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 2096 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 2097 | "dev": true, 2098 | "requires": { 2099 | "anymatch": "~3.1.2", 2100 | "braces": "~3.0.2", 2101 | "fsevents": "~2.3.2", 2102 | "glob-parent": "~5.1.2", 2103 | "is-binary-path": "~2.1.0", 2104 | "is-glob": "~4.0.1", 2105 | "normalize-path": "~3.0.0", 2106 | "readdirp": "~3.6.0" 2107 | } 2108 | }, 2109 | "concat-map": { 2110 | "version": "0.0.1", 2111 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2112 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 2113 | "dev": true 2114 | }, 2115 | "cookie": { 2116 | "version": "0.5.0", 2117 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 2118 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 2119 | "dev": true 2120 | }, 2121 | "debug": { 2122 | "version": "4.3.4", 2123 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2124 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2125 | "dev": true, 2126 | "requires": { 2127 | "ms": "2.1.2" 2128 | } 2129 | }, 2130 | "dedent-js": { 2131 | "version": "1.0.1", 2132 | "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", 2133 | "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==", 2134 | "dev": true 2135 | }, 2136 | "deepmerge": { 2137 | "version": "4.3.1", 2138 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 2139 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 2140 | "dev": true 2141 | }, 2142 | "detect-indent": { 2143 | "version": "6.1.0", 2144 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", 2145 | "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", 2146 | "dev": true 2147 | }, 2148 | "devalue": { 2149 | "version": "4.3.0", 2150 | "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz", 2151 | "integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==", 2152 | "dev": true 2153 | }, 2154 | "es6-promise": { 2155 | "version": "3.3.1", 2156 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", 2157 | "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", 2158 | "dev": true 2159 | }, 2160 | "esbuild": { 2161 | "version": "0.17.18", 2162 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", 2163 | "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", 2164 | "dev": true, 2165 | "requires": { 2166 | "@esbuild/android-arm": "0.17.18", 2167 | "@esbuild/android-arm64": "0.17.18", 2168 | "@esbuild/android-x64": "0.17.18", 2169 | "@esbuild/darwin-arm64": "0.17.18", 2170 | "@esbuild/darwin-x64": "0.17.18", 2171 | "@esbuild/freebsd-arm64": "0.17.18", 2172 | "@esbuild/freebsd-x64": "0.17.18", 2173 | "@esbuild/linux-arm": "0.17.18", 2174 | "@esbuild/linux-arm64": "0.17.18", 2175 | "@esbuild/linux-ia32": "0.17.18", 2176 | "@esbuild/linux-loong64": "0.17.18", 2177 | "@esbuild/linux-mips64el": "0.17.18", 2178 | "@esbuild/linux-ppc64": "0.17.18", 2179 | "@esbuild/linux-riscv64": "0.17.18", 2180 | "@esbuild/linux-s390x": "0.17.18", 2181 | "@esbuild/linux-x64": "0.17.18", 2182 | "@esbuild/netbsd-x64": "0.17.18", 2183 | "@esbuild/openbsd-x64": "0.17.18", 2184 | "@esbuild/sunos-x64": "0.17.18", 2185 | "@esbuild/win32-arm64": "0.17.18", 2186 | "@esbuild/win32-ia32": "0.17.18", 2187 | "@esbuild/win32-x64": "0.17.18" 2188 | } 2189 | }, 2190 | "esm-env": { 2191 | "version": "1.0.0", 2192 | "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", 2193 | "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", 2194 | "dev": true 2195 | }, 2196 | "fast-glob": { 2197 | "version": "3.2.12", 2198 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 2199 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 2200 | "dev": true, 2201 | "requires": { 2202 | "@nodelib/fs.stat": "^2.0.2", 2203 | "@nodelib/fs.walk": "^1.2.3", 2204 | "glob-parent": "^5.1.2", 2205 | "merge2": "^1.3.0", 2206 | "micromatch": "^4.0.4" 2207 | } 2208 | }, 2209 | "fastq": { 2210 | "version": "1.15.0", 2211 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 2212 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 2213 | "dev": true, 2214 | "requires": { 2215 | "reusify": "^1.0.4" 2216 | } 2217 | }, 2218 | "fill-range": { 2219 | "version": "7.0.1", 2220 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2221 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2222 | "dev": true, 2223 | "requires": { 2224 | "to-regex-range": "^5.0.1" 2225 | } 2226 | }, 2227 | "fs.realpath": { 2228 | "version": "1.0.0", 2229 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2230 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 2231 | "dev": true 2232 | }, 2233 | "fsevents": { 2234 | "version": "2.3.2", 2235 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2236 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2237 | "dev": true, 2238 | "optional": true 2239 | }, 2240 | "glob": { 2241 | "version": "7.2.3", 2242 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2243 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2244 | "dev": true, 2245 | "requires": { 2246 | "fs.realpath": "^1.0.0", 2247 | "inflight": "^1.0.4", 2248 | "inherits": "2", 2249 | "minimatch": "^3.1.1", 2250 | "once": "^1.3.0", 2251 | "path-is-absolute": "^1.0.0" 2252 | } 2253 | }, 2254 | "glob-parent": { 2255 | "version": "5.1.2", 2256 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2257 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2258 | "dev": true, 2259 | "requires": { 2260 | "is-glob": "^4.0.1" 2261 | } 2262 | }, 2263 | "globalyzer": { 2264 | "version": "0.1.0", 2265 | "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", 2266 | "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", 2267 | "dev": true 2268 | }, 2269 | "globrex": { 2270 | "version": "0.1.2", 2271 | "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", 2272 | "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", 2273 | "dev": true 2274 | }, 2275 | "graceful-fs": { 2276 | "version": "4.2.11", 2277 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 2278 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 2279 | "dev": true 2280 | }, 2281 | "immutable": { 2282 | "version": "4.3.0", 2283 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", 2284 | "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", 2285 | "dev": true 2286 | }, 2287 | "import-fresh": { 2288 | "version": "3.3.0", 2289 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 2290 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 2291 | "dev": true, 2292 | "requires": { 2293 | "parent-module": "^1.0.0", 2294 | "resolve-from": "^4.0.0" 2295 | } 2296 | }, 2297 | "import-meta-resolve": { 2298 | "version": "3.0.0", 2299 | "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", 2300 | "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", 2301 | "dev": true 2302 | }, 2303 | "inflight": { 2304 | "version": "1.0.6", 2305 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2306 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 2307 | "dev": true, 2308 | "requires": { 2309 | "once": "^1.3.0", 2310 | "wrappy": "1" 2311 | } 2312 | }, 2313 | "inherits": { 2314 | "version": "2.0.4", 2315 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2316 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2317 | "dev": true 2318 | }, 2319 | "is-binary-path": { 2320 | "version": "2.1.0", 2321 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2322 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2323 | "dev": true, 2324 | "requires": { 2325 | "binary-extensions": "^2.0.0" 2326 | } 2327 | }, 2328 | "is-extglob": { 2329 | "version": "2.1.1", 2330 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2331 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2332 | "dev": true 2333 | }, 2334 | "is-glob": { 2335 | "version": "4.0.3", 2336 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2337 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2338 | "dev": true, 2339 | "requires": { 2340 | "is-extglob": "^2.1.1" 2341 | } 2342 | }, 2343 | "is-number": { 2344 | "version": "7.0.0", 2345 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2346 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2347 | "dev": true 2348 | }, 2349 | "kleur": { 2350 | "version": "4.1.5", 2351 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 2352 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 2353 | "dev": true 2354 | }, 2355 | "lodash-es": { 2356 | "version": "4.17.21", 2357 | "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", 2358 | "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" 2359 | }, 2360 | "lower-case": { 2361 | "version": "2.0.2", 2362 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 2363 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 2364 | "dev": true, 2365 | "requires": { 2366 | "tslib": "^2.0.3" 2367 | } 2368 | }, 2369 | "magic-string": { 2370 | "version": "0.30.0", 2371 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", 2372 | "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", 2373 | "dev": true, 2374 | "requires": { 2375 | "@jridgewell/sourcemap-codec": "^1.4.13" 2376 | } 2377 | }, 2378 | "merge2": { 2379 | "version": "1.4.1", 2380 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2381 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2382 | "dev": true 2383 | }, 2384 | "micromatch": { 2385 | "version": "4.0.5", 2386 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 2387 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 2388 | "dev": true, 2389 | "requires": { 2390 | "braces": "^3.0.2", 2391 | "picomatch": "^2.3.1" 2392 | } 2393 | }, 2394 | "mime": { 2395 | "version": "3.0.0", 2396 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 2397 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 2398 | "dev": true 2399 | }, 2400 | "min-indent": { 2401 | "version": "1.0.1", 2402 | "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", 2403 | "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", 2404 | "dev": true 2405 | }, 2406 | "minimatch": { 2407 | "version": "3.1.2", 2408 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2409 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2410 | "dev": true, 2411 | "requires": { 2412 | "brace-expansion": "^1.1.7" 2413 | } 2414 | }, 2415 | "minimist": { 2416 | "version": "1.2.8", 2417 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 2418 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 2419 | "dev": true 2420 | }, 2421 | "mkdirp": { 2422 | "version": "0.5.6", 2423 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 2424 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 2425 | "dev": true, 2426 | "requires": { 2427 | "minimist": "^1.2.6" 2428 | } 2429 | }, 2430 | "mri": { 2431 | "version": "1.2.0", 2432 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 2433 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 2434 | "dev": true 2435 | }, 2436 | "mrmime": { 2437 | "version": "1.0.1", 2438 | "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", 2439 | "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", 2440 | "dev": true 2441 | }, 2442 | "ms": { 2443 | "version": "2.1.2", 2444 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2445 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2446 | "dev": true 2447 | }, 2448 | "nanoid": { 2449 | "version": "3.3.6", 2450 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 2451 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 2452 | "dev": true 2453 | }, 2454 | "no-case": { 2455 | "version": "3.0.4", 2456 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 2457 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 2458 | "dev": true, 2459 | "requires": { 2460 | "lower-case": "^2.0.2", 2461 | "tslib": "^2.0.3" 2462 | } 2463 | }, 2464 | "normalize-path": { 2465 | "version": "3.0.0", 2466 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2467 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2468 | "dev": true 2469 | }, 2470 | "once": { 2471 | "version": "1.4.0", 2472 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2473 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2474 | "dev": true, 2475 | "requires": { 2476 | "wrappy": "1" 2477 | } 2478 | }, 2479 | "parent-module": { 2480 | "version": "1.0.1", 2481 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2482 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2483 | "dev": true, 2484 | "requires": { 2485 | "callsites": "^3.0.0" 2486 | } 2487 | }, 2488 | "pascal-case": { 2489 | "version": "3.1.2", 2490 | "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", 2491 | "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", 2492 | "dev": true, 2493 | "requires": { 2494 | "no-case": "^3.0.4", 2495 | "tslib": "^2.0.3" 2496 | } 2497 | }, 2498 | "path-is-absolute": { 2499 | "version": "1.0.1", 2500 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2501 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2502 | "dev": true 2503 | }, 2504 | "picocolors": { 2505 | "version": "1.0.0", 2506 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2507 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2508 | "dev": true 2509 | }, 2510 | "picomatch": { 2511 | "version": "2.3.1", 2512 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2513 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2514 | "dev": true 2515 | }, 2516 | "postcss": { 2517 | "version": "8.4.23", 2518 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", 2519 | "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", 2520 | "dev": true, 2521 | "requires": { 2522 | "nanoid": "^3.3.6", 2523 | "picocolors": "^1.0.0", 2524 | "source-map-js": "^1.0.2" 2525 | } 2526 | }, 2527 | "queue-microtask": { 2528 | "version": "1.2.3", 2529 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2530 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2531 | "dev": true 2532 | }, 2533 | "readdirp": { 2534 | "version": "3.6.0", 2535 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2536 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2537 | "dev": true, 2538 | "requires": { 2539 | "picomatch": "^2.2.1" 2540 | } 2541 | }, 2542 | "resolve-from": { 2543 | "version": "4.0.0", 2544 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2545 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2546 | "dev": true 2547 | }, 2548 | "reusify": { 2549 | "version": "1.0.4", 2550 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2551 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2552 | "dev": true 2553 | }, 2554 | "rimraf": { 2555 | "version": "2.7.1", 2556 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 2557 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 2558 | "dev": true, 2559 | "requires": { 2560 | "glob": "^7.1.3" 2561 | } 2562 | }, 2563 | "rollup": { 2564 | "version": "3.21.6", 2565 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.6.tgz", 2566 | "integrity": "sha512-SXIICxvxQxR3D4dp/3LDHZIJPC8a4anKMHd4E3Jiz2/JnY+2bEjqrOokAauc5ShGVNFHlEFjBXAXlaxkJqIqSg==", 2567 | "dev": true, 2568 | "requires": { 2569 | "fsevents": "~2.3.2" 2570 | } 2571 | }, 2572 | "run-parallel": { 2573 | "version": "1.2.0", 2574 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2575 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2576 | "dev": true, 2577 | "requires": { 2578 | "queue-microtask": "^1.2.2" 2579 | } 2580 | }, 2581 | "sade": { 2582 | "version": "1.8.1", 2583 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 2584 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 2585 | "dev": true, 2586 | "requires": { 2587 | "mri": "^1.1.0" 2588 | } 2589 | }, 2590 | "sander": { 2591 | "version": "0.5.1", 2592 | "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", 2593 | "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", 2594 | "dev": true, 2595 | "requires": { 2596 | "es6-promise": "^3.1.2", 2597 | "graceful-fs": "^4.1.3", 2598 | "mkdirp": "^0.5.1", 2599 | "rimraf": "^2.5.2" 2600 | } 2601 | }, 2602 | "sass": { 2603 | "version": "1.62.1", 2604 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", 2605 | "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", 2606 | "dev": true, 2607 | "requires": { 2608 | "chokidar": ">=3.0.0 <4.0.0", 2609 | "immutable": "^4.0.0", 2610 | "source-map-js": ">=0.6.2 <2.0.0" 2611 | } 2612 | }, 2613 | "set-cookie-parser": { 2614 | "version": "2.6.0", 2615 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", 2616 | "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", 2617 | "dev": true 2618 | }, 2619 | "sirv": { 2620 | "version": "2.0.3", 2621 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", 2622 | "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", 2623 | "dev": true, 2624 | "requires": { 2625 | "@polka/url": "^1.0.0-next.20", 2626 | "mrmime": "^1.0.0", 2627 | "totalist": "^3.0.0" 2628 | } 2629 | }, 2630 | "sorcery": { 2631 | "version": "0.11.0", 2632 | "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", 2633 | "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", 2634 | "dev": true, 2635 | "requires": { 2636 | "@jridgewell/sourcemap-codec": "^1.4.14", 2637 | "buffer-crc32": "^0.2.5", 2638 | "minimist": "^1.2.0", 2639 | "sander": "^0.5.0" 2640 | } 2641 | }, 2642 | "source-map-js": { 2643 | "version": "1.0.2", 2644 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 2645 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 2646 | "dev": true 2647 | }, 2648 | "streamsearch": { 2649 | "version": "1.1.0", 2650 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 2651 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 2652 | "dev": true 2653 | }, 2654 | "strip-indent": { 2655 | "version": "3.0.0", 2656 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", 2657 | "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", 2658 | "dev": true, 2659 | "requires": { 2660 | "min-indent": "^1.0.0" 2661 | } 2662 | }, 2663 | "svelte": { 2664 | "version": "3.59.1", 2665 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.1.tgz", 2666 | "integrity": "sha512-pKj8fEBmqf6mq3/NfrB9SLtcJcUvjYSWyePlfCqN9gujLB25RitWK8PvFzlwim6hD/We35KbPlRteuA6rnPGcQ==", 2667 | "dev": true 2668 | }, 2669 | "svelte-check": { 2670 | "version": "3.3.2", 2671 | "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.3.2.tgz", 2672 | "integrity": "sha512-67j3rI0LDc2DvL0ON/2pvCasVVD3nHDrTkZNr4eITNfo2oFXdw7SIyMOiFj4swu+pjmFQAigytBK1IWyik8dBw==", 2673 | "dev": true, 2674 | "requires": { 2675 | "@jridgewell/trace-mapping": "^0.3.17", 2676 | "chokidar": "^3.4.1", 2677 | "fast-glob": "^3.2.7", 2678 | "import-fresh": "^3.2.1", 2679 | "picocolors": "^1.0.0", 2680 | "sade": "^1.7.4", 2681 | "svelte-preprocess": "^5.0.3", 2682 | "typescript": "^5.0.3" 2683 | }, 2684 | "dependencies": { 2685 | "typescript": { 2686 | "version": "5.0.4", 2687 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", 2688 | "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", 2689 | "dev": true 2690 | } 2691 | } 2692 | }, 2693 | "svelte-hmr": { 2694 | "version": "0.15.1", 2695 | "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", 2696 | "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", 2697 | "dev": true, 2698 | "requires": {} 2699 | }, 2700 | "svelte-preprocess": { 2701 | "version": "5.0.3", 2702 | "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.3.tgz", 2703 | "integrity": "sha512-GrHF1rusdJVbOZOwgPWtpqmaexkydznKzy5qIC2FabgpFyKN57bjMUUUqPRfbBXK5igiEWn1uO/DXsa2vJ5VHA==", 2704 | "dev": true, 2705 | "requires": { 2706 | "@types/pug": "^2.0.6", 2707 | "detect-indent": "^6.1.0", 2708 | "magic-string": "^0.27.0", 2709 | "sorcery": "^0.11.0", 2710 | "strip-indent": "^3.0.0" 2711 | }, 2712 | "dependencies": { 2713 | "magic-string": { 2714 | "version": "0.27.0", 2715 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", 2716 | "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", 2717 | "dev": true, 2718 | "requires": { 2719 | "@jridgewell/sourcemap-codec": "^1.4.13" 2720 | } 2721 | } 2722 | } 2723 | }, 2724 | "svelte2tsx": { 2725 | "version": "0.6.14", 2726 | "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.6.14.tgz", 2727 | "integrity": "sha512-Sxo9gtpc3dYWuFQ8fruZG+M+I6OZMIvOxxKjt48Lr8jD6Kr9cNf1Hf/yHUDEgDwQdRbAzn5y0FL9xk8Dx5v9lg==", 2728 | "dev": true, 2729 | "requires": { 2730 | "dedent-js": "^1.0.1", 2731 | "pascal-case": "^3.1.1" 2732 | } 2733 | }, 2734 | "tiny-glob": { 2735 | "version": "0.2.9", 2736 | "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", 2737 | "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", 2738 | "dev": true, 2739 | "requires": { 2740 | "globalyzer": "0.1.0", 2741 | "globrex": "^0.1.2" 2742 | } 2743 | }, 2744 | "to-regex-range": { 2745 | "version": "5.0.1", 2746 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2747 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2748 | "dev": true, 2749 | "requires": { 2750 | "is-number": "^7.0.0" 2751 | } 2752 | }, 2753 | "totalist": { 2754 | "version": "3.0.1", 2755 | "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", 2756 | "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", 2757 | "dev": true 2758 | }, 2759 | "tslib": { 2760 | "version": "2.5.0", 2761 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", 2762 | "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", 2763 | "dev": true 2764 | }, 2765 | "typescript": { 2766 | "version": "4.9.5", 2767 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 2768 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 2769 | "dev": true 2770 | }, 2771 | "undici": { 2772 | "version": "5.22.1", 2773 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", 2774 | "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", 2775 | "dev": true, 2776 | "requires": { 2777 | "busboy": "^1.6.0" 2778 | } 2779 | }, 2780 | "vite": { 2781 | "version": "4.3.5", 2782 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.5.tgz", 2783 | "integrity": "sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==", 2784 | "dev": true, 2785 | "requires": { 2786 | "esbuild": "^0.17.5", 2787 | "fsevents": "~2.3.2", 2788 | "postcss": "^8.4.23", 2789 | "rollup": "^3.21.0" 2790 | } 2791 | }, 2792 | "vitefu": { 2793 | "version": "0.2.4", 2794 | "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", 2795 | "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", 2796 | "dev": true, 2797 | "requires": {} 2798 | }, 2799 | "wrappy": { 2800 | "version": "1.0.2", 2801 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2802 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2803 | "dev": true 2804 | } 2805 | } 2806 | } 2807 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@restspace/svelte-schema-form", 3 | "version": "0.1.6", 4 | "description": "JSON Schema based form generator in Svelte", 5 | "author": "James Ellis-Jones", 6 | "license": "MIT", 7 | "repository": { 8 | "type": "git", 9 | "url": "git+https://github.com/restspace/svelte-schema-form.git" 10 | }, 11 | "keywords": [ 12 | "svelte", 13 | "form generator", 14 | "form builder", 15 | "json schema" 16 | ], 17 | "bugs": { 18 | "url": "https://github.com/restspace/svelte-schema-form/issues" 19 | }, 20 | "homepage": "https://github.com/restspace/svelte-schema-form#readme", 21 | "exports": { 22 | ".": { 23 | "types": "./dist/index.d.ts", 24 | "svelte": "./dist/index.js" 25 | }, 26 | "./*": "./dist/*" 27 | }, 28 | "files": ["dist"], 29 | "main": "dist/index.js", 30 | "scripts": { 31 | "dev": "vite dev", 32 | "build": "svelte-kit sync && svelte-package && sass dist/css:dist/css", 33 | "convertBuildToScript": "vite -c vite-script.config.js build", 34 | "package": "svelte-kit sync && svelte-package && sass dist/css:dist/css", 35 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 36 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 37 | "copyout": "xcopy /s /y src\\lib ..\\svelte-schema-form-script\\svelte-schema-form\\src\\lib" 38 | }, 39 | "devDependencies": { 40 | "@sveltejs/adapter-auto": "^2.0.1", 41 | "@sveltejs/kit": "^1.16.3", 42 | "@sveltejs/package": "^2.0.2", 43 | "@types/lodash-es": "^4.17.6", 44 | "sass": "^1.57.1", 45 | "svelte": "^3.54.0", 46 | "svelte-check": "^3.0.1", 47 | "tslib": "^2.4.1", 48 | "typescript": "^4.9.3", 49 | "vite": "^4.0.0" 50 | }, 51 | "type": "module", 52 | "dependencies": { 53 | "@exodus/schemasafe": "^1.0.0-rc.9", 54 | "lodash-es": "^4.17.21" 55 | }, 56 | "peerDependencies": { 57 | "svelte": "^3.0.0" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | // See https://kit.svelte.dev/docs/types#app 4 | // for information about these interfaces 5 | // and what to do when importing types 6 | declare namespace App { 7 | // interface Locals {} 8 | // interface Platform {} 9 | // interface Session {} 10 | // interface Stuff {} 11 | } 12 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /src/lib/SchemaForm.svelte: -------------------------------------------------------------------------------- 1 | 2 | 3 | 146 | 147 | 148 | -------------------------------------------------------------------------------- /src/lib/SubSchemaForm.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/lib/SubmitForm.svelte: -------------------------------------------------------------------------------- 1 | 2 | 3 | 118 | 119 |
120 | 121 |
122 | 123 |
124 | -------------------------------------------------------------------------------- /src/lib/arrayOps.ts: -------------------------------------------------------------------------------- 1 | import type { CommonComponentParameters } from "./types/CommonComponentParameters"; 2 | import { emptyValue } from "./types/schema"; 3 | 4 | export const arrayAdd = (schema: any, params: CommonComponentParameters, value: any[]) => () => { 5 | params.pathChanged(params.path, 6 | [ 7 | ...(value || []), 8 | emptyValue(schema.items) 9 | ]); 10 | } 11 | 12 | export const arrayFill = (schema: any, params: CommonComponentParameters, value: any[]) => () => { 13 | const val = value || []; 14 | if (typeof schema.minItems !== 'number' || val.length >= schema.minItems) return; 15 | const addValues = new Array(schema.minItems - val.length).fill(emptyValue(schema.items)); 16 | 17 | params.pathChanged(params.path, 18 | [ 19 | ...val, 20 | ...addValues 21 | ]); 22 | } 23 | 24 | export const arrayDelete = (idx: number, params: CommonComponentParameters, value: any[]) => () => { 25 | params.pathChanged(params.path, 26 | [ 27 | ...value.slice(0, idx), 28 | ...value.slice(idx + 1) 29 | ], "delete", idx.toString()); 30 | }; 31 | 32 | export const arrayDuplicate = (idx: number, params: CommonComponentParameters, value: any[]) => () => { 33 | params.pathChanged(params.path, 34 | [ 35 | ...value.slice(0, idx), 36 | value[idx], 37 | JSON.parse(JSON.stringify(value[idx])), 38 | ...value.slice(idx + 1) 39 | ], "duplicate", (idx + 1).toString()); 40 | }; 41 | 42 | export const arrayUp = (idx: number, params: CommonComponentParameters, value: any[]) => () => { 43 | if (idx > 0) { 44 | params.pathChanged(params.path, 45 | [ 46 | ...value.slice(0, idx-1), 47 | value[idx], 48 | value[idx-1], 49 | ...value.slice(idx + 1) 50 | ], "up", (idx - 1).toString()); 51 | } 52 | }; 53 | 54 | export const arrayDown = (idx: number, params: CommonComponentParameters, value: any[]) => () => { 55 | if (idx < value.length - 1) { 56 | params.pathChanged(params.path, 57 | [ 58 | ...value.slice(0, idx), 59 | value[idx+1], 60 | value[idx], 61 | ...value.slice(idx + 2) 62 | ], "down", (idx + 1).toString()); 63 | } 64 | }; -------------------------------------------------------------------------------- /src/lib/css/basic-skin.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | --input-padding: 3px; 3 | --input-border: 1px solid #aaa; 4 | } 5 | 6 | form.svelte-schema-form { 7 | font-family: 'Montserrat', sans-serif; 8 | 9 | input { 10 | font-family: 'Montserrat', sans-serif; 11 | } 12 | 13 | .collapser { 14 | background-size: 2rem 2rem; 15 | background-position: 50% 35%; 16 | display: inline-block; 17 | width: 1rem; 18 | height: 1rem; 19 | background-image: url(../img/right.svg); 20 | } 21 | .collapser.open { 22 | background-image: url(../img/down.svg); 23 | } 24 | 25 | .list-control { 26 | background-size: contain; 27 | background-repeat: no-repeat; 28 | width: 1.1em; 29 | height: 1.1em; 30 | border: none; 31 | cursor: pointer; 32 | } 33 | .add { 34 | background-image: url(../img/add.svg); 35 | width: 1.7em; 36 | height: 1.7em; 37 | } 38 | .delete { 39 | background-image: url(../img/delete.svg); 40 | } 41 | .up { 42 | background-image: url(../img/up.svg); 43 | } 44 | .down { 45 | background-image: url(../img/down.svg); 46 | } 47 | .duplicate { 48 | background-image: url(../img/duplicate.svg); 49 | } 50 | .info { 51 | background-size: contain; 52 | background-repeat: no-repeat; 53 | width: 0.6em; 54 | height: 0.6em; 55 | display: inline-block; 56 | background-image: url(../img/info.svg); 57 | background-size: 90% 90%; 58 | cursor: pointer; 59 | } 60 | 61 | 62 | label, .subset-label { 63 | color: #777; 64 | } 65 | .subset-label { 66 | font-weight: bold; 67 | 68 | .subset-label-description { 69 | font-size: 0.8em; 70 | } 71 | } 72 | 73 | .depth-0 > .subset-label { 74 | font-size: 1.5em; 75 | text-decoration: underline; 76 | } 77 | 78 | input, select, .input { 79 | border: var(--input-border); 80 | border-radius: 2px; 81 | padding: var(--input-padding); 82 | color: #777; 83 | } 84 | 85 | button { 86 | background-color: transparent; 87 | } 88 | 89 | .error { 90 | position: relative; 91 | top: -0.5em; 92 | color: red; 93 | } 94 | 95 | .button-container { 96 | display: flex; 97 | justify-content: center; 98 | margin-top: 2em; 99 | 100 | .submit-button { 101 | border: 1px solid #ccc; 102 | padding: 4px 8px; 103 | cursor: pointer; 104 | color: #aaa; 105 | } 106 | button:hover { 107 | background-color: #f8f4f4; 108 | } 109 | 110 | button { 111 | border: 2px solid #aaa; 112 | color: #777; 113 | } 114 | } 115 | 116 | &.dirty .submit-button { 117 | border: 2px solid #aaa; 118 | color: #777; 119 | } 120 | 121 | .sf-drop-area { 122 | height: 4em; 123 | border: var(--input-border); 124 | padding-right: 16px; 125 | position: relative; 126 | box-sizing: border-box; 127 | 128 | &.highlight { 129 | background-color: #eee; 130 | } 131 | 132 | .sf-upload-caption { 133 | font-weight: bold; 134 | font-size: 1.1em; 135 | color: #ccc; 136 | } 137 | 138 | .sf-upload-controls { 139 | .sf-upload-deleter { 140 | background-image: url(../img/delete.svg); 141 | background-repeat: no-repeat; 142 | background-size: contain; 143 | } 144 | 145 | .sf-upload-to-uploader { 146 | background-image: url(../img/upload.svg); 147 | background-repeat: no-repeat; 148 | background-size: contain; 149 | } 150 | .sf-upload-to-link { 151 | background-image: url(../img/link.svg); 152 | background-repeat: no-repeat; 153 | background-size: contain; 154 | } 155 | } 156 | } 157 | 158 | .sf-progress-bars .sf-progress-bar { 159 | border: var(--input-border); 160 | padding: var(--input-padding); 161 | font-size: 1em; 162 | 163 | .sf-progress-done { 164 | background-color: #80808050; 165 | } 166 | } 167 | 168 | .sf-autocomplete { 169 | .sf-items { 170 | background-color: #f8f8f8; 171 | } 172 | 173 | .sf-items, .sf-selected-item { 174 | img { 175 | max-height: 3em; 176 | max-width: 5em; 177 | margin-right: 1em; 178 | } 179 | } 180 | 181 | .sf-items > div { 182 | border: var(--input-border); 183 | border-top: none; 184 | font-size: .8em; 185 | padding: 6px; 186 | } 187 | 188 | .sf-selected-item { 189 | min-height: 22px; 190 | padding: 0; 191 | padding-left: var(--input-padding); 192 | font-size: .8em; 193 | 194 | input { 195 | border: none; 196 | padding: var(--input-padding); 197 | margin: 0; 198 | margin-left: -3px; 199 | width: 100%; 200 | } 201 | } 202 | } 203 | 204 | .list-detail { 205 | margin: 1em 0; 206 | 207 | .array-label { 208 | border: none; 209 | } 210 | 211 | .table-container { 212 | padding: 1em; 213 | border: 1px solid black; 214 | } 215 | 216 | .heading { 217 | text-align: center; 218 | font-weight: bold; 219 | } 220 | .heading, 221 | .heading + .buttons-header { 222 | border-bottom: 1px solid #777; 223 | } 224 | .heading.asc:after, 225 | .heading.desc:after { 226 | content: " "; 227 | display: inline-block; 228 | height: 14px; 229 | width: 14px; 230 | } 231 | .heading.asc:after { 232 | background-image: url(../img/down.svg); 233 | } 234 | .heading.desc:after { 235 | background-image: url(../img/up.svg); 236 | } 237 | 238 | .row-wrapper { 239 | display: contents; 240 | } 241 | 242 | .item { 243 | align-items: center; 244 | justify-content:center; 245 | } 246 | .item, 247 | .row-wrapper + .array-buttons { 248 | border-bottom: 1px solid #ccc; 249 | } 250 | .row-wrapper:hover div, 251 | .row-wrapper:hover + .sf-array-buttons { 252 | background-color: #f8f8f8; 253 | } 254 | 255 | .row-wrapper.selected div, 256 | .row-wrapper.selected + .sf-array-buttons { 257 | background-color: #eef; 258 | } 259 | .table-container > .element { 260 | padding: 5px 13px; 261 | } 262 | 263 | .control-button { 264 | width: 18px; 265 | height: 18px; 266 | margin-top: 0; 267 | } 268 | 269 | .row-buttons { 270 | padding: 5px 0 1px 0; 271 | } 272 | 273 | .add-button-container { 274 | justify-self: center; 275 | padding-top: 10px; 276 | } 277 | 278 | .add-button { 279 | width: 30px; 280 | height: 30px; 281 | } 282 | 283 | .element > .subset { 284 | border-left :none; 285 | } 286 | 287 | .to-list { 288 | border: none; 289 | position: relative; 290 | left: 10px; 291 | cursor: pointer; 292 | top: -7px; 293 | 294 | &:before { 295 | content: " "; 296 | background-image: url(../img/left-arrow.svg); 297 | height: 20px; 298 | width: 20px; 299 | background-size: contain; 300 | display: block; 301 | position: absolute; 302 | left: -19px; 303 | top: -2px; 304 | } 305 | } 306 | } 307 | } -------------------------------------------------------------------------------- /src/lib/css/layout.scss: -------------------------------------------------------------------------------- 1 | form.svelte-schema-form { 2 | .subset { 3 | display: grid; 4 | grid-template-rows: auto; 5 | grid-gap: 1em; 6 | align-items: flex-start; 7 | padding-left: 1em; 8 | box-sizing: border-box; 9 | border: none; 10 | } 11 | 12 | .depth-0 { 13 | padding-left: 0; 14 | } 15 | 16 | .object { 17 | grid-template-columns: max-content 1fr; 18 | border-left: 1px solid #999; 19 | grid-column: span 2; 20 | } 21 | .array > .object { 22 | grid-column: span 1; 23 | } 24 | 25 | .object.depth-0 { 26 | border-left: none; 27 | } 28 | 29 | .array { 30 | grid-column: span 2; 31 | grid-template-columns: 1fr max-content; 32 | } 33 | 34 | .subset > .subset-label { 35 | margin-bottom: 1em; 36 | 37 | .subset-label-title { 38 | display: block; 39 | } 40 | } 41 | .array > legend { 42 | margin-left: -1em; 43 | } 44 | 45 | 46 | .array > .object { 47 | margin-left: -1em; 48 | } 49 | 50 | .list-item { 51 | display: flex; 52 | } 53 | 54 | input[type="checkbox"] { 55 | justify-self: start; 56 | } 57 | 58 | .error { 59 | grid-column: 1 / span 2; 60 | } 61 | 62 | .sf-drop-area { 63 | width: 100%; 64 | display: flex; 65 | 66 | .sf-upload-caption { 67 | position: absolute; 68 | top: 0; 69 | bottom: 0; 70 | left: 0; 71 | right: 30px; 72 | display: flex; 73 | justify-content: center; 74 | align-items: center; 75 | z-index: -1; 76 | } 77 | 78 | .sf-upload-controls { 79 | position: absolute; 80 | right: 0; 81 | display: flex; 82 | flex-direction: column; 83 | justify-content:space-between; 84 | height: 100%; 85 | padding: 4px; 86 | box-sizing: border-box; 87 | 88 | button { 89 | border: 0; 90 | padding: 0; 91 | height: 20px; 92 | width: 20px; 93 | cursor: pointer; 94 | } 95 | 96 | .sf-upload-deleter { 97 | width: 20px; 98 | height: 20px; 99 | cursor: pointer; 100 | } 101 | } 102 | 103 | .sf-upload-input { 104 | align-self: center; 105 | width: calc(100% - 30px); 106 | margin: 0 10px; 107 | } 108 | 109 | &.link .sf-upload-thumb, 110 | &.link .sf-upload-file { 111 | display: none; 112 | } 113 | .sf-upload-file { 114 | font-size: 1.4em; 115 | font-weight: bold; 116 | display: flex; 117 | flex-direction: column; 118 | justify-content: center; 119 | align-items: center; 120 | padding: 0.4em; 121 | color: white; 122 | background-color: #ddd; 123 | } 124 | } 125 | 126 | .sf-progress-bars { 127 | grid-column: 2; 128 | display: flex; 129 | flex-direction: column; 130 | gap: 3px; 131 | box-sizing: border-box; 132 | 133 | .sf-progress-bar { 134 | width: 100%; 135 | position: relative; 136 | box-sizing: border-box; 137 | 138 | .sf-progress-done { 139 | position: absolute; 140 | left: 0; 141 | top: 0; 142 | bottom: 0; 143 | } 144 | } 145 | } 146 | 147 | .sf-autocomplete { 148 | width: 100%; 149 | position: relative; 150 | 151 | .sf-items { 152 | z-index: 1; 153 | position: absolute; 154 | right: 0; 155 | left: 0; 156 | max-height: 12em; 157 | overflow-y: auto; 158 | overflow-x: hidden; 159 | } 160 | 161 | .sf-items > div, 162 | .sf-selected-item { 163 | display: flex; 164 | align-items: center; 165 | } 166 | } 167 | 168 | .list-detail { 169 | width: 100%; 170 | 171 | .table-container { 172 | display: grid; 173 | } 174 | 175 | .row-wrapper { 176 | display: contents; 177 | } 178 | 179 | .item { 180 | display: flex; 181 | } 182 | 183 | .table-container > .element { 184 | grid-column: span 3; 185 | } 186 | 187 | .add-button-container { 188 | grid-column: span 3; 189 | } 190 | } 191 | } -------------------------------------------------------------------------------- /src/lib/editors/Array.svelte: -------------------------------------------------------------------------------- 1 | 28 | 29 | {#if showWrapper} 30 |
31 | {#if params.collapsible || legendText} 32 | 33 | {#if params.collapsible } 34 | 35 | {/if} 36 | {@html stringToHtml(legendText)} 37 | {#if schema.description} 38 | {@html stringToHtml(schema.description)} 39 | {/if} 40 | 41 | {/if} 42 | 43 | {#if collapserOpenState === "open"} 44 | {#if !emptyText} 45 | {#each value || [] as item, idx (idx)} 46 | 56 |
57 | {#if controls.includes('delete') && !atMinItems} 58 | 59 | {/if} 60 | {#if controls.includes('duplicate') && !atMaxItems} 61 | 62 | {/if} 63 | {#if controls.includes('reorder') && idx > 0} 64 | 65 | {/if} 66 | {#if controls.includes('reorder') && idx < (value || []).length - 1} 67 | 68 | {/if} 69 |
70 | 71 | {/each} 72 | {:else} 73 |
{emptyText}
74 | {/if} 75 | {#if controls.includes('add') && !atMaxItems} 76 | 77 | {/if} 78 | {/if} 79 |
80 | {/if} -------------------------------------------------------------------------------- /src/lib/editors/ArrayBlocks.svelte: -------------------------------------------------------------------------------- 1 | 165 | 166 |
167 |
    168 | {#each value || [] as item, idx (item)} 169 |
  1. false} 175 | on:dragenter|preventDefault={() => hovering = idx} 176 | on:dragleave={() => hovering = false} 177 | class:drag-over={hovering === idx}> 178 | 179 |

    180 | {getName(item)} 181 |

    182 |
    183 |
    184 | 185 | 186 |
    187 |
  2. 188 | {/each} 189 | 190 | {#if !adding} 191 |
  3. false} 194 | on:dragenter|preventDefault={() => hovering = lastIdx} 195 | on:dragleave={() => hovering = false} 196 | class:drag-over={hovering === lastIdx}> 197 |
  4. 198 | {/if} 199 |
200 | {#if adding} 201 | 210 | 211 | {/if} 212 |
-------------------------------------------------------------------------------- /src/lib/editors/Autocomplete.svelte: -------------------------------------------------------------------------------- 1 | 73 | 74 | 75 | 76 |
77 |
78 | {#if inputState === "searching"} 79 | 80 | {:else} 81 | {#if selected?.image} 82 | {selected.text}/ 83 | {/if} 84 | {selected?.text || ''} 85 | {/if} 86 |
87 | 88 |
89 | {#each options as item (item.id)} 90 |
91 | {#if item.image} 92 | {item.text}/ 93 | {/if} 94 | {item.text} 95 |
96 | {/each} 97 |
98 |
99 |
-------------------------------------------------------------------------------- /src/lib/editors/Boolean.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | params.pathChanged(params.path, ev.currentTarget.checked)} 14 | /> 15 | -------------------------------------------------------------------------------- /src/lib/editors/Currency.svelte: -------------------------------------------------------------------------------- 1 | 41 | 42 | 43 | 44 | 48 | -------------------------------------------------------------------------------- /src/lib/editors/Enum.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 24 | -------------------------------------------------------------------------------- /src/lib/editors/FieldWrapper.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | {#if params.containerParent !== "array"} 15 | 21 | {/if} 22 | 23 | {#if error && params.showErrors} 24 |
{error}
25 | {/if} -------------------------------------------------------------------------------- /src/lib/editors/Hidden.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/lib/editors/ListDetail.svelte: -------------------------------------------------------------------------------- 1 | 137 | 138 | {#if showWrapper} 139 |
140 | {#if params.collapsible || legendText} 141 | 142 | {#if params.collapsible } 143 | 144 | {/if} 145 | {@html stringToHtml(legendText)} 146 | {#if schema.description} 147 | {@html stringToHtml(schema.description)} 148 | {/if} 149 | 150 | {/if} 151 | 152 | {#if collapserOpenState === "open"} 153 | {#if !emptyText} 154 |
155 | {#if mode === "list"} 156 | {#each listFields as fieldName, idx} 157 |
{fieldName}
158 | {/each} 159 | {#if !readOnly} 160 |
 
161 | {/if} 162 | {#each rowView as item, idx (idx)} 163 |
164 | {#each listProps as propName} 165 |
{item[propName] === undefined ? '\u00A0' : item[propName]}
166 | {/each} 167 |
168 | {#if !readOnly} 169 |
170 |
171 | {#if controls.includes('delete')} 172 | 173 | {/if} 174 | {#if controls.includes('duplicate')} 175 | 176 | {/if} 177 | {#if controls.includes('reorder') && sort === null && idx > 0} 178 | 179 | {/if} 180 | {#if controls.includes('reorder') && sort === null && idx < (value || []).length - 1} 181 | 182 | {/if} 183 |
184 |
185 | {/if} 186 | {/each} 187 | {:else} 188 | 189 |
190 | 200 | {#if schema.submit} 201 | 202 | {/if} 203 |
204 | {/if} 205 |
206 | {:else} 207 |
{emptyText}
208 | {/if} 209 | {#if controls.includes('add')} 210 | 211 | {/if} 212 | {/if} 213 |
214 | {/if} -------------------------------------------------------------------------------- /src/lib/editors/Number.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | { 14 | let val = parseFloat(ev.currentTarget.value); 15 | params.pathChanged(params.path, isNaN(val) ? undefined : val); 16 | }} 17 | /> 18 | -------------------------------------------------------------------------------- /src/lib/editors/Object.svelte: -------------------------------------------------------------------------------- 1 | 25 | 26 |
27 | {#if showLegend } 28 | 29 | {#if params.collapsible } 30 | 31 | {/if} 32 | {#if params.containerParent !== "array" || schema.title} 33 | {@html stringToHtml(schemaLabel(schema, params.path))} 34 | {#if schema.description} 35 | {@html stringToHtml(schema.description)} 36 | {/if} 37 | {/if} 38 | 39 | {/if} 40 | 41 | {#if collapserOpenState === "open"} 42 | {#each propNames as propName (propName)} 43 | 54 | {/each} 55 | {/if} 56 |
-------------------------------------------------------------------------------- /src/lib/editors/Radio.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | 16 |
21 | {#each enumVals as enumVal, idx} 22 | params.pathChanged(params.path, ev.currentTarget.value || undefined)} 27 | value={enumVal} 28 | name={id} 29 | checked={enumVal === value}/> 30 | 31 | {/each} 32 |
33 |
-------------------------------------------------------------------------------- /src/lib/editors/String.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 | 20 | 21 | params.pathChanged(params.path, ev.currentTarget.value || undefined)} /> 25 | -------------------------------------------------------------------------------- /src/lib/editors/TextArea.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/lib/editors/Upload.svelte: -------------------------------------------------------------------------------- 1 | 148 | 149 | 150 | 155 |
164 | {#if mode === "uploader" && !readOnly} 165 |
166 | Drop files or click to upload 167 |
168 | {/if} 169 | {#if value && isImage(value) && mode === "uploader"} 170 | upload file 171 | {/if} 172 | {#if value && !isImage(value) && mode === "uploader"} 173 |
{afterLast(value, ".")}
174 | {/if} 175 | {#if mode === "link"} 176 | {}} 183 | on:input={ev => params.pathChanged(params.path, ev.currentTarget.value || undefined)} /> 184 | {/if} 185 |
186 | {#if !(readOnly)} 187 | 188 | {/if} 189 | 194 |
195 |
196 | {#if Object.keys(progress).length > 0} 197 |
198 | {#each Object.entries(progress) as [name, percent]} 199 |
200 |
201 | {name} 202 |
203 | {/each} 204 |
205 | {/if} 206 |
-------------------------------------------------------------------------------- /src/lib/errorMapper.ts: -------------------------------------------------------------------------------- 1 | import { jsonPointerToPath } from "./types/schema"; 2 | import { afterLast } from "./utilities.js"; 3 | 4 | export function errorMapper(schema: any, value: any, keywordLocation: string, instanceLocation: string): [ string, string ] { 5 | const location = jsonPointerToPath(instanceLocation); 6 | const keyword = afterLast(keywordLocation, '/'); 7 | const fullKeyPath = jsonPointerToPath(keywordLocation); 8 | const keyValue = fullKeyPath.split('.').reduce((sub, key) => sub[key], schema); 9 | switch (keyword) { 10 | case "required": 11 | return [ location, 'Please enter a value for this item' ]; 12 | case "minimum": 13 | return [ location, `Please enter a number at least ${keyValue}` ]; 14 | case "maximum": 15 | return [ location, `Please enter a number at most ${keyValue}` ]; 16 | case "minLength": 17 | return [ location, `Please enter text of at least ${keyValue} characters` ]; 18 | case "maxLength": 19 | return [ location, `Please enter text no longer than ${keyValue} characters` ]; 20 | case "pattern": 21 | return [ location, `Please enter properly formatted value: ${keyValue}` ]; 22 | case "format": 23 | const valMap = { 24 | "date-time": "date and time", 25 | time: "time", 26 | date: "date", 27 | email: "email address", 28 | ipv4: "IPv4 address", 29 | } as Record; 30 | return [ location, `Please enter a properly formatted ${valMap[keyValue] || keyValue}` ]; 31 | } 32 | return [ location, `Fails to satisfy schema at ${jsonPointerToPath(keywordLocation)}` ]; 33 | } -------------------------------------------------------------------------------- /src/lib/img/add-colour.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /src/lib/img/add.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/lib/img/del-box.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /src/lib/img/delete.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/lib/img/down.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/lib/img/duplicate.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/lib/img/info.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/lib/img/left-arrow.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/lib/img/link.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/lib/img/right.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/lib/img/up.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/lib/img/upload.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/lib/img/upload.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/restspace/svelte-schema-form/70953be84a6c1445873a6fa8c3d6d2da86611e2b/src/lib/img/upload.zip -------------------------------------------------------------------------------- /src/lib/index.ts: -------------------------------------------------------------------------------- 1 | export { default as SchemaForm } from "./SchemaForm.svelte"; 2 | export { default as SubmitForm } from "./SubmitForm.svelte"; -------------------------------------------------------------------------------- /src/lib/schema/schema.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test } from "vitest"; 2 | import { validator } from "@exodus/schemasafe"; 3 | 4 | describe("schemasafe behaviour", () => { 5 | test("ignores special properties", () => { 6 | const schema = { 7 | type: "object", 8 | properties: { 9 | salutation: { type: "string", enum: ["Mr", "Mrs", "Ms", "Dr"] }, 10 | firstName: { type: "string", maxLength: 10 }, 11 | lastName: { type: "string", readOnly: true }, 12 | canContact: { 13 | type: "string", 14 | enum: ["yes", "no"], 15 | editor: "radioButtons", 16 | description: "Whether can contact", 17 | }, 18 | preferredContact: { 19 | type: "array", 20 | items: { type: "string", enum: ["phone", "email", "text"] }, 21 | editor: "multiCheck", 22 | }, 23 | dateOfBirth: { type: "string", format: "date" }, 24 | password: { type: "string", format: "password" }, 25 | comments: { type: "string", editor: "textarea" }, 26 | files: { type: "string", editor: "upload" }, 27 | things: { 28 | type: "array", 29 | items: { 30 | type: "object", 31 | properties: { 32 | first: { type: "string" }, 33 | second: { type: "string" }, 34 | }, 35 | }, 36 | }, 37 | address: { 38 | type: "object", 39 | properties: { 40 | addressLine: { type: "string" }, 41 | postcode: { type: "string" }, 42 | }, 43 | required: ["postcode"], 44 | }, 45 | }, 46 | propertyOrder: [ 47 | "salutation", 48 | ["firstName", "lastName"], 49 | "canContact", 50 | "preferredContact", 51 | "dateOfBirth", 52 | "password", 53 | "comments", 54 | "files", 55 | "things", 56 | "address", 57 | ], 58 | if: { 59 | type: "object", 60 | properties: { salutation: { type: "string", const: "Dr" } }, 61 | }, 62 | then: { 63 | type: "object", 64 | properties: { isMedical: { type: "boolean" } }, 65 | propertyOrder: ["canContact", "isMedical"], 66 | }, 67 | }; 68 | const refSchema = { 69 | $id: "http://schema.org/myschema", 70 | type: "object", 71 | properties: { 72 | def: { type: "string" }, 73 | }, 74 | propertyOrder: ["def"], 75 | }; 76 | const validate = validator(schema, { 77 | includeErrors: true, 78 | allErrors: true, 79 | allowUnusedKeywords: true, 80 | schemas: [refSchema], 81 | formats: { 82 | password: (v) => true, 83 | }, 84 | }); 85 | const res = validate({ 86 | abc: "xxx", 87 | }); 88 | console.log("valid: " + JSON.stringify(res)); 89 | }); 90 | }); 91 | -------------------------------------------------------------------------------- /src/lib/schemasafe-extended.d.ts: -------------------------------------------------------------------------------- 1 | declare module "@exodus/schemasafe/src/pointer" { 2 | let get: (obj: any, pointer: string, objpath?: string) => any; 3 | export { get }; 4 | }; -------------------------------------------------------------------------------- /src/lib/types/CommonComponentParameters.ts: -------------------------------------------------------------------------------- 1 | export type ValidationErrors = Record; 2 | 3 | export const FileNone = Symbol(); 4 | export const ProgressContext = Symbol(); 5 | 6 | export interface CommonComponentParameters { 7 | path: string[]; 8 | pathChanged: (path: string[], val: any, op?: string, subPath?: string) => boolean, 9 | components: Record any>, 10 | componentContext?: Record, 11 | value: any, 12 | validationErrors: ValidationErrors, 13 | required?: boolean, 14 | containerParent: "none" | "array" | "object", 15 | containerReadOnly: boolean, 16 | showErrors: boolean, 17 | collapsible: boolean, 18 | idx: number 19 | } 20 | 21 | export const childComponentParameters = (params: CommonComponentParameters, propName: string) => { 22 | return { 23 | ...params, 24 | path: [ ...params.path, propName ] 25 | }; 26 | } 27 | 28 | /* 29 | export const valuePath = (value: any, path: string[]) => { 30 | if (path.length === 0) { 31 | return value; 32 | } else { 33 | return valuePath(value[path[0]], path.slice(1)); 34 | } 35 | } 36 | 37 | export const schemaPath = (schema: any, path: string[]) => { 38 | if (path.length === 0 && schema.type === "array") { 39 | return schema.items; 40 | } else if (path.length === 0) { 41 | return schema; 42 | } else if (schema.type === "array") { 43 | return schemaPath(schema.items, path); 44 | } else if (schema.type === "object") { 45 | return schemaPath(schema.properties[path[0]], path.slice(1)); 46 | } else { 47 | throw new Error('path not present in schema'); 48 | } 49 | } 50 | */ -------------------------------------------------------------------------------- /src/lib/types/schema.ts: -------------------------------------------------------------------------------- 1 | import { camelToTitle } from "../utilities.js"; 2 | 3 | export function editorForSchema(schema: any): string { 4 | let type = schema['type']; 5 | if (schema['enum']) 6 | type = "enum"; 7 | if (schema['format']) 8 | type += "-" + schema['format']; 9 | if (schema['hidden']) 10 | type = "hidden"; 11 | if (schema['editor']) 12 | type = schema['editor']; 13 | switch (type) { 14 | case "string-date-time": 15 | case "string-date": 16 | case "string-time": 17 | case "string-email": 18 | case "string-password": 19 | case "number-currency": 20 | return schema['format']; 21 | default: 22 | return type; 23 | } 24 | } 25 | 26 | export function emptyValue(schema: any): any { 27 | switch (schema['type'] || '') { 28 | case 'object': return {}; 29 | case 'array': return []; 30 | default: return null; 31 | } 32 | } 33 | 34 | export function schemaLabel(schema: any, path: string[]): string { 35 | return schema.title || camelToTitle(path.slice(-1)?.[0] || ''); 36 | } 37 | 38 | export function jsonPointerToPath(pointer: string) { 39 | if (pointer.startsWith('/')) { 40 | pointer = pointer.substring(1); 41 | } else if (pointer.startsWith('#/')) { 42 | pointer = pointer.substring(2); 43 | } else if (pointer.startsWith('http')) { 44 | pointer = pointer.split('#/')?.[1] || ''; 45 | } 46 | 47 | const pathEls = [] as string[]; 48 | pointer.split('/').forEach(el => { 49 | const int = parseInt(el); 50 | if (isNaN(int)) { 51 | pathEls.push(`.${el}`); 52 | } else { 53 | pathEls.push(`[${el}]`); 54 | } 55 | }); 56 | let path = pathEls.join(''); 57 | if (path.startsWith('.')) path = path.substring(1); 58 | return path; 59 | } -------------------------------------------------------------------------------- /src/lib/utilities.ts: -------------------------------------------------------------------------------- 1 | import { get } from "lodash-es"; 2 | 3 | export const upTo = (str: string, match: string, start?: number) => { 4 | const pos = str.indexOf(match, start); 5 | return pos < 0 ? str.substring(start || 0) : str.substring(start || 0, pos); 6 | } 7 | 8 | export const upToLast = (str: string, match: string, end?: number) => { 9 | const pos = str.lastIndexOf(match, end); 10 | return pos < 0 ? str.substring(0, end || str.length) : str.substring(0, pos); 11 | } 12 | 13 | export const after = (str: string, match: string, start?: number) => { 14 | const pos = str.indexOf(match, start); 15 | return pos < 0 ? '' : str.substring(pos + match.length); 16 | } 17 | 18 | export const afterLast = (str: string, match: string, end?: number) => { 19 | const pos = str.lastIndexOf(match, end); 20 | return pos < 0 ? '' : str.substring(pos + match.length, end || str.length); 21 | } 22 | 23 | export function camelToWords(camel: string): string { 24 | camel = camel.trim(); 25 | const words: string[] = []; 26 | let start = 0; 27 | for (let end = 1; end < camel.length; end++) { 28 | if ('A' <= camel[end] && camel[end] <= 'Z') { 29 | words.push(camel.substring(start, end).toLowerCase()); 30 | start = end; 31 | } 32 | } 33 | words.push(camel.substring(start, camel.length).toLowerCase()); 34 | 35 | return words.join(' '); 36 | } 37 | 38 | export function camelToTitle(camel: string): string { 39 | return camelToWords(camel).replace(/[a-z]/i, (ltr) => ltr.toUpperCase()) 40 | } 41 | 42 | /** manipulate the schema to allow any optional property to have a null value 43 | * which is appropriate for form input */ 44 | export function nullOptionalsAllowed(schema: object): object { 45 | if (schema === null || schema === undefined) schema = {}; 46 | let newSchema = deepCopy(schema); 47 | nullOptionalsAllowedApply(newSchema as Record); 48 | return newSchema; 49 | } 50 | 51 | function nullOptionalsAllowedApply(schema: Record) { 52 | let req = (schema['required'] || []) as Array; 53 | if (schema['$ref']) return; 54 | switch (schema['type']) { 55 | case 'object': 56 | const properties = (schema['properties'] || {}) as Record; 57 | for (let prop in properties) { 58 | if (req.indexOf(prop) < 0) { 59 | nullOptionalsAllowedApply(properties[prop] as Record); 60 | } 61 | } 62 | break; 63 | case 'array': 64 | const items = (schema['items'] || {}) as Record; 65 | nullOptionalsAllowedApply(items); 66 | if (items['oneOf'] && !(items['oneOf'] as any[]).some(subschema => subschema["type"] == "null")) { 67 | (items['oneOf'] as any[]).push({ type: 'null' }); 68 | } 69 | break; 70 | default: 71 | if (Array.isArray(schema['type'])) { 72 | if (schema['type'].indexOf('null') < 0) { 73 | schema['type'].push('null'); 74 | } 75 | } else if (schema['type'] != 'null') { 76 | schema['type'] = [schema['type'], 'null']; 77 | } 78 | break; 79 | } 80 | const defns = schema['definitions'] as Record; 81 | if (defns) { 82 | for (let defn in defns) { 83 | nullOptionalsAllowedApply(defns[defn] as Record); 84 | } 85 | } 86 | } 87 | 88 | export function deepCopy(obj: object): object { 89 | var copy; 90 | 91 | // Handle the 3 simple types, and null or undefined 92 | if (null == obj || "object" != typeof obj) return obj; 93 | 94 | // Handle Date 95 | if (obj instanceof Date) { 96 | copy = new Date(); 97 | copy.setTime(obj.getTime()); 98 | return copy; 99 | } 100 | 101 | // Handle Array 102 | if (obj instanceof Array) { 103 | copy = []; 104 | for (var i = 0, len = obj.length; i < len; i++) { 105 | copy[i] = deepCopy(obj[i]); 106 | } 107 | return copy; 108 | } 109 | 110 | // Handle Object 111 | if (obj instanceof Object) { 112 | copy = {} as Record; 113 | const recObj = obj as Record; 114 | for (var attr in recObj) { 115 | if (recObj.hasOwnProperty(attr)) copy[attr] = deepCopy(recObj[attr] as object); 116 | } 117 | return copy; 118 | } 119 | 120 | throw new Error("Unable to copy obj! Its type isn't supported."); 121 | } 122 | 123 | let incrVal = 0; 124 | export const incr = () => incrVal++; 125 | 126 | export const substituteProperties = (subsPattern: string, value: any) => { 127 | if (!subsPattern || !value) return subsPattern; 128 | const parts = subsPattern.split('${'); 129 | const partsOut: string[] = []; 130 | partsOut.push(parts.shift()!); 131 | for (let part of parts) { 132 | if (part.includes('}')) { 133 | const path = upTo(part, '}'); 134 | const subsVal = (path === '' ? value : get(value, path)) || ''; 135 | partsOut.push(`${subsVal}${after(part, '}')}`); 136 | } 137 | } 138 | return partsOut.join(''); 139 | } 140 | 141 | export function slashTrim(s: string): string { 142 | let start = 0; 143 | let end = s.length; 144 | if (s[start] === '/') start++; 145 | if (s[end - 1] === '/') end--; 146 | if (end <= start) return ''; 147 | return s.substring(start, end); 148 | } 149 | 150 | export function slashTrimLeft(s: string): string { 151 | return s.startsWith('/') ? s.substr(1) : s; 152 | } 153 | 154 | export function pathToArray(path: string) { 155 | return slashTrim(path).split('/').filter(s => !!s); 156 | } 157 | 158 | export function getExtension(s: string): string { 159 | let extStart = s.lastIndexOf('.'); 160 | return extStart < 0 ? '' : s.substr(extStart + 1); 161 | } 162 | 163 | export function getFirstLine(s: string): string { 164 | let lineEnd = s.indexOf('\n'); 165 | if (lineEnd < 0) return s; 166 | if (lineEnd > 0 && s[lineEnd - 1] === '\r') lineEnd--; 167 | return s.substring(0, lineEnd); 168 | } 169 | 170 | export function getTailLines(s: string): string { 171 | return s.substring(s.indexOf('\n') + 1); 172 | } 173 | 174 | export function pathCombine(...args: string[]): string { 175 | const stripped = args.filter(a => !!a); 176 | if (stripped.length === 0) return ''; 177 | const startSlash = stripped[0].startsWith('/'); 178 | const endSlash = stripped[stripped.length - 1].endsWith('/'); 179 | let joined = stripped.map(a => slashTrim(a)).filter(a => !!a).join('/'); 180 | if (startSlash) joined = '/' + joined; 181 | if (endSlash && joined !== '/') joined += '/'; 182 | return joined; 183 | } 184 | 185 | export function stringToHtml(s: string) { 186 | return (s || '').replace("\n", "
"); 187 | } -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 82 | 83 |
84 |
85 |
86 | 87 | 88 |
89 | 90 |
91 |
92 | 93 |
94 |
95 |
 96 | 			{valueJson}
 97 | 		
98 |
99 |
100 | 101 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/restspace/svelte-schema-form/70953be84a6c1445873a6fa8c3d6d2da86611e2b/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 | -------------------------------------------------------------------------------- /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 | "outDir": "dist", 13 | "ignoreDeprecations": "5.0", 14 | "verbatimModuleSyntax": true 15 | }, 16 | "exclude": [ 17 | "dist" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /vite-script.config.ts: -------------------------------------------------------------------------------- 1 | import { svelte } from '@sveltejs/vite-plugin-svelte'; 2 | import { defineConfig } from 'vite'; 3 | import { resolve } from 'path'; 4 | 5 | export default defineConfig({ 6 | build: { 7 | lib: { 8 | entry: resolve(__dirname, 'dist/index.js'), 9 | name: 'SchemaForm', 10 | fileName: 'schemaForm', 11 | }, 12 | outDir: 'dist-js', 13 | }, 14 | plugins: [ 15 | svelte(), 16 | ], 17 | }); -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import type { UserConfig } from 'vite'; 3 | import path from 'path'; 4 | 5 | const config: UserConfig = { 6 | plugins: [sveltekit()], 7 | resolve: { 8 | alias: { 9 | 'svelte-schema-form': path.resolve('src/lib') 10 | } 11 | } 12 | }; 13 | 14 | export default config; 15 | --------------------------------------------------------------------------------