├── .gitignore ├── .npmignore ├── LICENSE.md ├── README.md ├── index.js ├── package-lock.json ├── package.json ├── paper-sizes.js └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | bower_components 2 | node_modules 3 | *.log 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | bower_components 2 | node_modules 3 | *.log 4 | .DS_Store 5 | .npmignore 6 | LICENSE.md -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2024 Matt DesLauriers 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 17 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 18 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 19 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 20 | OR OTHER DEALINGS IN THE SOFTWARE. 21 | 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # canvas-dimensions 2 | 3 | A utility that provides user and screen units for a 2D Canvas. 4 | 5 | ```js 6 | import getDocument from "canvas-dimensions"; 7 | 8 | const settings = { 9 | // a standard paper size or [w, h] 10 | dimensions: "A4", 11 | // pixel resolution 12 | pixelsPerInch: 300, 13 | // a user coordinate space to work in 14 | units: "cm", 15 | }; 16 | 17 | const { 18 | // Size in user space coordinates 19 | width, 20 | height, 21 | // Size in display/screen coordinates 22 | canvasWidth, 23 | canvasHeight, 24 | } = getDocument(settings); 25 | 26 | // Setup your 2D canvas 27 | canvas.width = canvasWidth; 28 | canvas.height = canvasHeight; 29 | 30 | // Scale context to user coordinates 31 | context.scale(canvasWidth / width, canvasHeight / height); 32 | 33 | // Draw your graphics in user space coordinates 34 | context.fillRect(0, 0, width, height); 35 | ``` 36 | 37 | ## Install 38 | 39 | Use [npm](https://npmjs.com/) to install. 40 | 41 | ```sh 42 | npm install canvas-dimensions --save 43 | ``` 44 | 45 | ## Usage 46 | 47 | #### `output = getDocument(settings = {})` 48 | 49 | Gets document size information from the given input options. 50 | 51 | Input options: 52 | 53 | - `dimensions` can be a string defining a paper size preset like `'A4'` or `'letter'` (case insensitive), or an array of `[ width, height ]` 54 | - `units` a string, the output units you would like to work in, can be `'px'`, `'in'`, `'cm'`, `'mm'` (default `'px'`) 55 | - `pixelsPerInch` used when converting physical sizes to canvas pixel sizes, defaults to `72` 56 | - `orientation` an optional string, can be `"landscape"` or `"portrait"` and will flip the input `dimensions` accordingly, mostly useful if you are specifying a paper size preset. Note, the paper size presets are all portrait by default. 57 | - `pixelRatio` a factor to multiply the final canvas size by, default `1` 58 | 59 | The `settings` input can also just be an `[ width, height ]` array, which is the same as passing `{ dimensions: [ width, height ], units: 'px' }`. 60 | 61 | Output: 62 | 63 | - `units` a string identifying the user coordinate space, such as `'px'` or `'cm'` 64 | - `width` the document width in user coordinates 65 | - `height` the document height in user coordinates 66 | - `pixelsPerInch` the document resolution 67 | - `canvasWidth` the display/pixel width of the resulting canvas 68 | - `canvasHeight` the display/pixel height of the resulting canvas 69 | - `pixelRatio` the pixel ratio that has been applied to canvas size 70 | 71 | #### `import paperSizes from 'canvas-dimensions/paper-sizes.js'` 72 | 73 | The raw list of possible paper size keywords, see [./paper-sizes](./paper-sizes.js). 74 | 75 | ## Recipes 76 | 77 | Some more examples and recipes: 78 | 79 | ```js 80 | // 1280 x 1280 pixel image 81 | doc = getDocument([1280, 1280]); 82 | 83 | // Size canvas to browser size 84 | doc = getDocument({ 85 | dimensions: [window.innerWidth, window.innerHeight], 86 | pixelRatio: window.devicePixelRatio, 87 | }); 88 | 89 | // 18 x 18 " artwork ready for print 90 | doc = getDocument({ 91 | dimensions: [18, 18], 92 | units: "in", 93 | pixelsPerInch: 300, 94 | }); 95 | 96 | // A4 landscape artwork, working in millimeters 97 | doc = getDocument({ 98 | dimensions: "A4", 99 | units: "mm", 100 | orientation: "landscape", 101 | pixelsPerInch: 300, 102 | }); 103 | ``` 104 | 105 | ## License 106 | 107 | MIT, see [LICENSE.md](http://github.com/mattdesl/canvas-dimensions/blob/master/LICENSE.md) for details. 108 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import paperSizes from "./paper-sizes.js"; 2 | import convert from "convert-length"; 3 | 4 | /** 5 | * @typedef {Object} Document 6 | * @type {Object} 7 | * @property {string} units - The units used for the user coordinate space ('px', 'cm', etc.). 8 | * @property {number} width - The width of the document in user coordinates. 9 | * @property {number} height - The height of the document in user coordinates. 10 | * @property {number} pixelsPerInch - The resolution of the document in pixels per inch. 11 | * @property {number} canvasWidth - The display/pixel width of the resulting canvas. 12 | * @property {number} canvasHeight - The display/pixel height of the resulting canvas. 13 | * @property {number} pixelRatio - The pixel ratio that has been applied to the canvas size. 14 | */ 15 | 16 | /** 17 | * Gets document size information based on the given opts. 18 | * 19 | * @param {Object} [opts={}] - The input opts for calculating document size. 20 | * @param {(string|Array)} [opts.dimensions='A4'] - Can be a string defining a paper size preset ('A4', 'letter') or an array [width, height]. 21 | * @param {string} [opts.units='px'] - The output units ('px', 'in', 'cm', 'mm'). Defaults to 'px'. 22 | * @param {number} [opts.pixelsPerInch=72] - Used when converting physical sizes to canvas pixel sizes. 23 | * @param {string} [opts.orientation] - Can be 'landscape' or 'portrait'. Flips the input dimensions if using a paper size preset. 24 | * @param {number} [opts.pixelRatio=1] - A factor to multiply the final canvas size by. 25 | * @returns {Document} The document size information, including width, height, canvas size, and pixel ratio in the specified units. 26 | */ 27 | export default function getDocument(opts = {}) { 28 | if (Array.isArray(opts)) { 29 | opts = { 30 | dimensions: opts, 31 | }; 32 | } 33 | 34 | let dimensions = opts.dimensions; 35 | if (!dimensions) throw new Error("Must specify { dimensions }"); 36 | 37 | const units = opts.units || "px"; 38 | if (typeof dimensions === "string") { 39 | // paper size key 40 | const key = dimensions.toLowerCase(); 41 | if (!(key in paperSizes)) 42 | throw new Error(`No paper size by the key "${dimensions}"`); 43 | const inputSize = paperSizes[key]; 44 | dimensions = inputSize.dimensions.map((d) => 45 | inputSize.units === units ? d : convert(d, inputSize.units, units) 46 | ); 47 | } 48 | 49 | if (!Array.isArray(dimensions)) 50 | throw new Error("expected array or string for { dimensions }"); 51 | dimensions = dimensions.slice(); 52 | if (dimensions.length !== 2) 53 | throw new Error("Expected two dimensional { dimensions }"); 54 | 55 | const initialOrientation = 56 | dimensions[0] > dimensions[1] ? "landscape" : "portrait"; 57 | if (opts.orientation) { 58 | const ori = opts.orientation.toLowerCase(); 59 | if (!["landscape", "portrait"].includes(ori)) 60 | throw new Error('Expected orientation to be "landscape" or "portrait"'); 61 | if (ori !== initialOrientation) { 62 | dimensions.reverse(); 63 | } 64 | } 65 | 66 | const pixelsPerInch = opts.pixelsPerInch || 72; 67 | 68 | let [canvasWidth, canvasHeight] = dimensions.map((d) => 69 | units === "px" 70 | ? d 71 | : convert(d, units, "px", { roundPixel: true, pixelsPerInch }) 72 | ); 73 | 74 | const [width, height] = dimensions; 75 | 76 | const pixelRatio = opts.pixelRatio ?? 1; 77 | canvasWidth *= pixelRatio; 78 | canvasHeight *= pixelRatio; 79 | 80 | return { 81 | width, 82 | height, 83 | units, 84 | canvasWidth, 85 | canvasHeight, 86 | pixelsPerInch, 87 | pixelRatio, 88 | }; 89 | } 90 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "canvas-dimensions", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "canvas-dimensions", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "convert-length": "^1.0.1" 13 | }, 14 | "devDependencies": { 15 | "tape": "^5.7.5" 16 | } 17 | }, 18 | "node_modules/@ljharb/resumer": { 19 | "version": "0.1.3", 20 | "resolved": "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.1.3.tgz", 21 | "integrity": "sha512-d+tsDgfkj9X5QTriqM4lKesCkMMJC3IrbPKHvayP00ELx2axdXvDfWkqjxrLXIzGcQzmj7VAUT1wopqARTvafw==", 22 | "dev": true, 23 | "dependencies": { 24 | "@ljharb/through": "^2.3.13", 25 | "call-bind": "^1.0.7" 26 | }, 27 | "engines": { 28 | "node": ">= 0.4" 29 | } 30 | }, 31 | "node_modules/@ljharb/through": { 32 | "version": "2.3.13", 33 | "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", 34 | "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", 35 | "dev": true, 36 | "dependencies": { 37 | "call-bind": "^1.0.7" 38 | }, 39 | "engines": { 40 | "node": ">= 0.4" 41 | } 42 | }, 43 | "node_modules/array-buffer-byte-length": { 44 | "version": "1.0.1", 45 | "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", 46 | "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", 47 | "dev": true, 48 | "dependencies": { 49 | "call-bind": "^1.0.5", 50 | "is-array-buffer": "^3.0.4" 51 | }, 52 | "engines": { 53 | "node": ">= 0.4" 54 | }, 55 | "funding": { 56 | "url": "https://github.com/sponsors/ljharb" 57 | } 58 | }, 59 | "node_modules/array.prototype.every": { 60 | "version": "1.1.6", 61 | "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.6.tgz", 62 | "integrity": "sha512-gNEqZD97w6bfQRNmHkFv7rNnGM+VWyHZT+h/rf9C+22owcXuENr66Lfo0phItpU5KoXW6Owb34q2+8MnSIZ57w==", 63 | "dev": true, 64 | "dependencies": { 65 | "call-bind": "^1.0.7", 66 | "define-properties": "^1.2.1", 67 | "es-abstract": "^1.23.0", 68 | "es-object-atoms": "^1.0.0", 69 | "is-string": "^1.0.7" 70 | }, 71 | "engines": { 72 | "node": ">= 0.4" 73 | }, 74 | "funding": { 75 | "url": "https://github.com/sponsors/ljharb" 76 | } 77 | }, 78 | "node_modules/arraybuffer.prototype.slice": { 79 | "version": "1.0.3", 80 | "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", 81 | "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", 82 | "dev": true, 83 | "dependencies": { 84 | "array-buffer-byte-length": "^1.0.1", 85 | "call-bind": "^1.0.5", 86 | "define-properties": "^1.2.1", 87 | "es-abstract": "^1.22.3", 88 | "es-errors": "^1.2.1", 89 | "get-intrinsic": "^1.2.3", 90 | "is-array-buffer": "^3.0.4", 91 | "is-shared-array-buffer": "^1.0.2" 92 | }, 93 | "engines": { 94 | "node": ">= 0.4" 95 | }, 96 | "funding": { 97 | "url": "https://github.com/sponsors/ljharb" 98 | } 99 | }, 100 | "node_modules/available-typed-arrays": { 101 | "version": "1.0.7", 102 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", 103 | "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", 104 | "dev": true, 105 | "dependencies": { 106 | "possible-typed-array-names": "^1.0.0" 107 | }, 108 | "engines": { 109 | "node": ">= 0.4" 110 | }, 111 | "funding": { 112 | "url": "https://github.com/sponsors/ljharb" 113 | } 114 | }, 115 | "node_modules/balanced-match": { 116 | "version": "1.0.2", 117 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 118 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 119 | "dev": true 120 | }, 121 | "node_modules/call-bind": { 122 | "version": "1.0.7", 123 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 124 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 125 | "dev": true, 126 | "dependencies": { 127 | "es-define-property": "^1.0.0", 128 | "es-errors": "^1.3.0", 129 | "function-bind": "^1.1.2", 130 | "get-intrinsic": "^1.2.4", 131 | "set-function-length": "^1.2.1" 132 | }, 133 | "engines": { 134 | "node": ">= 0.4" 135 | }, 136 | "funding": { 137 | "url": "https://github.com/sponsors/ljharb" 138 | } 139 | }, 140 | "node_modules/concat-map": { 141 | "version": "0.0.1", 142 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 143 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 144 | "dev": true 145 | }, 146 | "node_modules/convert-length": { 147 | "version": "1.0.1", 148 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 149 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 150 | "dependencies": { 151 | "defined": "^1.0.0" 152 | } 153 | }, 154 | "node_modules/data-view-buffer": { 155 | "version": "1.0.1", 156 | "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", 157 | "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", 158 | "dev": true, 159 | "dependencies": { 160 | "call-bind": "^1.0.6", 161 | "es-errors": "^1.3.0", 162 | "is-data-view": "^1.0.1" 163 | }, 164 | "engines": { 165 | "node": ">= 0.4" 166 | }, 167 | "funding": { 168 | "url": "https://github.com/sponsors/ljharb" 169 | } 170 | }, 171 | "node_modules/data-view-byte-length": { 172 | "version": "1.0.1", 173 | "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", 174 | "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", 175 | "dev": true, 176 | "dependencies": { 177 | "call-bind": "^1.0.7", 178 | "es-errors": "^1.3.0", 179 | "is-data-view": "^1.0.1" 180 | }, 181 | "engines": { 182 | "node": ">= 0.4" 183 | }, 184 | "funding": { 185 | "url": "https://github.com/sponsors/ljharb" 186 | } 187 | }, 188 | "node_modules/data-view-byte-offset": { 189 | "version": "1.0.0", 190 | "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", 191 | "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", 192 | "dev": true, 193 | "dependencies": { 194 | "call-bind": "^1.0.6", 195 | "es-errors": "^1.3.0", 196 | "is-data-view": "^1.0.1" 197 | }, 198 | "engines": { 199 | "node": ">= 0.4" 200 | }, 201 | "funding": { 202 | "url": "https://github.com/sponsors/ljharb" 203 | } 204 | }, 205 | "node_modules/deep-equal": { 206 | "version": "2.2.3", 207 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", 208 | "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", 209 | "dev": true, 210 | "dependencies": { 211 | "array-buffer-byte-length": "^1.0.0", 212 | "call-bind": "^1.0.5", 213 | "es-get-iterator": "^1.1.3", 214 | "get-intrinsic": "^1.2.2", 215 | "is-arguments": "^1.1.1", 216 | "is-array-buffer": "^3.0.2", 217 | "is-date-object": "^1.0.5", 218 | "is-regex": "^1.1.4", 219 | "is-shared-array-buffer": "^1.0.2", 220 | "isarray": "^2.0.5", 221 | "object-is": "^1.1.5", 222 | "object-keys": "^1.1.1", 223 | "object.assign": "^4.1.4", 224 | "regexp.prototype.flags": "^1.5.1", 225 | "side-channel": "^1.0.4", 226 | "which-boxed-primitive": "^1.0.2", 227 | "which-collection": "^1.0.1", 228 | "which-typed-array": "^1.1.13" 229 | }, 230 | "engines": { 231 | "node": ">= 0.4" 232 | }, 233 | "funding": { 234 | "url": "https://github.com/sponsors/ljharb" 235 | } 236 | }, 237 | "node_modules/define-data-property": { 238 | "version": "1.1.4", 239 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 240 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 241 | "dev": true, 242 | "dependencies": { 243 | "es-define-property": "^1.0.0", 244 | "es-errors": "^1.3.0", 245 | "gopd": "^1.0.1" 246 | }, 247 | "engines": { 248 | "node": ">= 0.4" 249 | }, 250 | "funding": { 251 | "url": "https://github.com/sponsors/ljharb" 252 | } 253 | }, 254 | "node_modules/define-properties": { 255 | "version": "1.2.1", 256 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 257 | "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 258 | "dev": true, 259 | "dependencies": { 260 | "define-data-property": "^1.0.1", 261 | "has-property-descriptors": "^1.0.0", 262 | "object-keys": "^1.1.1" 263 | }, 264 | "engines": { 265 | "node": ">= 0.4" 266 | }, 267 | "funding": { 268 | "url": "https://github.com/sponsors/ljharb" 269 | } 270 | }, 271 | "node_modules/defined": { 272 | "version": "1.0.1", 273 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 274 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 275 | "funding": { 276 | "url": "https://github.com/sponsors/ljharb" 277 | } 278 | }, 279 | "node_modules/dotignore": { 280 | "version": "0.1.2", 281 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 282 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 283 | "dev": true, 284 | "dependencies": { 285 | "minimatch": "^3.0.4" 286 | }, 287 | "bin": { 288 | "ignored": "bin/ignored" 289 | } 290 | }, 291 | "node_modules/dotignore/node_modules/brace-expansion": { 292 | "version": "1.1.11", 293 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 294 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 295 | "dev": true, 296 | "dependencies": { 297 | "balanced-match": "^1.0.0", 298 | "concat-map": "0.0.1" 299 | } 300 | }, 301 | "node_modules/dotignore/node_modules/minimatch": { 302 | "version": "3.1.2", 303 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 304 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 305 | "dev": true, 306 | "dependencies": { 307 | "brace-expansion": "^1.1.7" 308 | }, 309 | "engines": { 310 | "node": "*" 311 | } 312 | }, 313 | "node_modules/es-abstract": { 314 | "version": "1.23.3", 315 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", 316 | "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", 317 | "dev": true, 318 | "dependencies": { 319 | "array-buffer-byte-length": "^1.0.1", 320 | "arraybuffer.prototype.slice": "^1.0.3", 321 | "available-typed-arrays": "^1.0.7", 322 | "call-bind": "^1.0.7", 323 | "data-view-buffer": "^1.0.1", 324 | "data-view-byte-length": "^1.0.1", 325 | "data-view-byte-offset": "^1.0.0", 326 | "es-define-property": "^1.0.0", 327 | "es-errors": "^1.3.0", 328 | "es-object-atoms": "^1.0.0", 329 | "es-set-tostringtag": "^2.0.3", 330 | "es-to-primitive": "^1.2.1", 331 | "function.prototype.name": "^1.1.6", 332 | "get-intrinsic": "^1.2.4", 333 | "get-symbol-description": "^1.0.2", 334 | "globalthis": "^1.0.3", 335 | "gopd": "^1.0.1", 336 | "has-property-descriptors": "^1.0.2", 337 | "has-proto": "^1.0.3", 338 | "has-symbols": "^1.0.3", 339 | "hasown": "^2.0.2", 340 | "internal-slot": "^1.0.7", 341 | "is-array-buffer": "^3.0.4", 342 | "is-callable": "^1.2.7", 343 | "is-data-view": "^1.0.1", 344 | "is-negative-zero": "^2.0.3", 345 | "is-regex": "^1.1.4", 346 | "is-shared-array-buffer": "^1.0.3", 347 | "is-string": "^1.0.7", 348 | "is-typed-array": "^1.1.13", 349 | "is-weakref": "^1.0.2", 350 | "object-inspect": "^1.13.1", 351 | "object-keys": "^1.1.1", 352 | "object.assign": "^4.1.5", 353 | "regexp.prototype.flags": "^1.5.2", 354 | "safe-array-concat": "^1.1.2", 355 | "safe-regex-test": "^1.0.3", 356 | "string.prototype.trim": "^1.2.9", 357 | "string.prototype.trimend": "^1.0.8", 358 | "string.prototype.trimstart": "^1.0.8", 359 | "typed-array-buffer": "^1.0.2", 360 | "typed-array-byte-length": "^1.0.1", 361 | "typed-array-byte-offset": "^1.0.2", 362 | "typed-array-length": "^1.0.6", 363 | "unbox-primitive": "^1.0.2", 364 | "which-typed-array": "^1.1.15" 365 | }, 366 | "engines": { 367 | "node": ">= 0.4" 368 | }, 369 | "funding": { 370 | "url": "https://github.com/sponsors/ljharb" 371 | } 372 | }, 373 | "node_modules/es-define-property": { 374 | "version": "1.0.0", 375 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 376 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 377 | "dev": true, 378 | "dependencies": { 379 | "get-intrinsic": "^1.2.4" 380 | }, 381 | "engines": { 382 | "node": ">= 0.4" 383 | } 384 | }, 385 | "node_modules/es-errors": { 386 | "version": "1.3.0", 387 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 388 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 389 | "dev": true, 390 | "engines": { 391 | "node": ">= 0.4" 392 | } 393 | }, 394 | "node_modules/es-get-iterator": { 395 | "version": "1.1.3", 396 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", 397 | "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", 398 | "dev": true, 399 | "dependencies": { 400 | "call-bind": "^1.0.2", 401 | "get-intrinsic": "^1.1.3", 402 | "has-symbols": "^1.0.3", 403 | "is-arguments": "^1.1.1", 404 | "is-map": "^2.0.2", 405 | "is-set": "^2.0.2", 406 | "is-string": "^1.0.7", 407 | "isarray": "^2.0.5", 408 | "stop-iteration-iterator": "^1.0.0" 409 | }, 410 | "funding": { 411 | "url": "https://github.com/sponsors/ljharb" 412 | } 413 | }, 414 | "node_modules/es-object-atoms": { 415 | "version": "1.0.0", 416 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", 417 | "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", 418 | "dev": true, 419 | "dependencies": { 420 | "es-errors": "^1.3.0" 421 | }, 422 | "engines": { 423 | "node": ">= 0.4" 424 | } 425 | }, 426 | "node_modules/es-set-tostringtag": { 427 | "version": "2.0.3", 428 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", 429 | "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", 430 | "dev": true, 431 | "dependencies": { 432 | "get-intrinsic": "^1.2.4", 433 | "has-tostringtag": "^1.0.2", 434 | "hasown": "^2.0.1" 435 | }, 436 | "engines": { 437 | "node": ">= 0.4" 438 | } 439 | }, 440 | "node_modules/es-to-primitive": { 441 | "version": "1.2.1", 442 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 443 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 444 | "dev": true, 445 | "dependencies": { 446 | "is-callable": "^1.1.4", 447 | "is-date-object": "^1.0.1", 448 | "is-symbol": "^1.0.2" 449 | }, 450 | "engines": { 451 | "node": ">= 0.4" 452 | }, 453 | "funding": { 454 | "url": "https://github.com/sponsors/ljharb" 455 | } 456 | }, 457 | "node_modules/for-each": { 458 | "version": "0.3.3", 459 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 460 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 461 | "dev": true, 462 | "dependencies": { 463 | "is-callable": "^1.1.3" 464 | } 465 | }, 466 | "node_modules/fs.realpath": { 467 | "version": "1.0.0", 468 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 469 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 470 | "dev": true 471 | }, 472 | "node_modules/function-bind": { 473 | "version": "1.1.2", 474 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 475 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 476 | "dev": true, 477 | "funding": { 478 | "url": "https://github.com/sponsors/ljharb" 479 | } 480 | }, 481 | "node_modules/function.prototype.name": { 482 | "version": "1.1.6", 483 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", 484 | "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", 485 | "dev": true, 486 | "dependencies": { 487 | "call-bind": "^1.0.2", 488 | "define-properties": "^1.2.0", 489 | "es-abstract": "^1.22.1", 490 | "functions-have-names": "^1.2.3" 491 | }, 492 | "engines": { 493 | "node": ">= 0.4" 494 | }, 495 | "funding": { 496 | "url": "https://github.com/sponsors/ljharb" 497 | } 498 | }, 499 | "node_modules/functions-have-names": { 500 | "version": "1.2.3", 501 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 502 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 503 | "dev": true, 504 | "funding": { 505 | "url": "https://github.com/sponsors/ljharb" 506 | } 507 | }, 508 | "node_modules/get-intrinsic": { 509 | "version": "1.2.4", 510 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 511 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 512 | "dev": true, 513 | "dependencies": { 514 | "es-errors": "^1.3.0", 515 | "function-bind": "^1.1.2", 516 | "has-proto": "^1.0.1", 517 | "has-symbols": "^1.0.3", 518 | "hasown": "^2.0.0" 519 | }, 520 | "engines": { 521 | "node": ">= 0.4" 522 | }, 523 | "funding": { 524 | "url": "https://github.com/sponsors/ljharb" 525 | } 526 | }, 527 | "node_modules/get-package-type": { 528 | "version": "0.1.0", 529 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 530 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 531 | "dev": true, 532 | "engines": { 533 | "node": ">=8.0.0" 534 | } 535 | }, 536 | "node_modules/get-symbol-description": { 537 | "version": "1.0.2", 538 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", 539 | "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", 540 | "dev": true, 541 | "dependencies": { 542 | "call-bind": "^1.0.5", 543 | "es-errors": "^1.3.0", 544 | "get-intrinsic": "^1.2.4" 545 | }, 546 | "engines": { 547 | "node": ">= 0.4" 548 | }, 549 | "funding": { 550 | "url": "https://github.com/sponsors/ljharb" 551 | } 552 | }, 553 | "node_modules/globalthis": { 554 | "version": "1.0.4", 555 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", 556 | "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", 557 | "dev": true, 558 | "dependencies": { 559 | "define-properties": "^1.2.1", 560 | "gopd": "^1.0.1" 561 | }, 562 | "engines": { 563 | "node": ">= 0.4" 564 | }, 565 | "funding": { 566 | "url": "https://github.com/sponsors/ljharb" 567 | } 568 | }, 569 | "node_modules/gopd": { 570 | "version": "1.0.1", 571 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 572 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 573 | "dev": true, 574 | "dependencies": { 575 | "get-intrinsic": "^1.1.3" 576 | }, 577 | "funding": { 578 | "url": "https://github.com/sponsors/ljharb" 579 | } 580 | }, 581 | "node_modules/has-bigints": { 582 | "version": "1.0.2", 583 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 584 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 585 | "dev": true, 586 | "funding": { 587 | "url": "https://github.com/sponsors/ljharb" 588 | } 589 | }, 590 | "node_modules/has-dynamic-import": { 591 | "version": "2.1.0", 592 | "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.1.0.tgz", 593 | "integrity": "sha512-su0anMkNEnJKZ/rB99jn3y6lV/J8Ro96hBJ28YAeVzj5rWxH+YL/AdCyiYYA1HDLV9YhmvqpWSJJj2KLo1MX6g==", 594 | "dev": true, 595 | "dependencies": { 596 | "call-bind": "^1.0.5", 597 | "get-intrinsic": "^1.2.2" 598 | }, 599 | "engines": { 600 | "node": ">= 0.4" 601 | }, 602 | "funding": { 603 | "url": "https://github.com/sponsors/ljharb" 604 | } 605 | }, 606 | "node_modules/has-property-descriptors": { 607 | "version": "1.0.2", 608 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 609 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 610 | "dev": true, 611 | "dependencies": { 612 | "es-define-property": "^1.0.0" 613 | }, 614 | "funding": { 615 | "url": "https://github.com/sponsors/ljharb" 616 | } 617 | }, 618 | "node_modules/has-proto": { 619 | "version": "1.0.3", 620 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 621 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 622 | "dev": true, 623 | "engines": { 624 | "node": ">= 0.4" 625 | }, 626 | "funding": { 627 | "url": "https://github.com/sponsors/ljharb" 628 | } 629 | }, 630 | "node_modules/has-symbols": { 631 | "version": "1.0.3", 632 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 633 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 634 | "dev": true, 635 | "engines": { 636 | "node": ">= 0.4" 637 | }, 638 | "funding": { 639 | "url": "https://github.com/sponsors/ljharb" 640 | } 641 | }, 642 | "node_modules/has-tostringtag": { 643 | "version": "1.0.2", 644 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 645 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 646 | "dev": true, 647 | "dependencies": { 648 | "has-symbols": "^1.0.3" 649 | }, 650 | "engines": { 651 | "node": ">= 0.4" 652 | }, 653 | "funding": { 654 | "url": "https://github.com/sponsors/ljharb" 655 | } 656 | }, 657 | "node_modules/hasown": { 658 | "version": "2.0.2", 659 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 660 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 661 | "dev": true, 662 | "dependencies": { 663 | "function-bind": "^1.1.2" 664 | }, 665 | "engines": { 666 | "node": ">= 0.4" 667 | } 668 | }, 669 | "node_modules/inflight": { 670 | "version": "1.0.6", 671 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 672 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 673 | "dev": true, 674 | "dependencies": { 675 | "once": "^1.3.0", 676 | "wrappy": "1" 677 | } 678 | }, 679 | "node_modules/inherits": { 680 | "version": "2.0.4", 681 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 682 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 683 | "dev": true 684 | }, 685 | "node_modules/internal-slot": { 686 | "version": "1.0.7", 687 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", 688 | "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", 689 | "dev": true, 690 | "dependencies": { 691 | "es-errors": "^1.3.0", 692 | "hasown": "^2.0.0", 693 | "side-channel": "^1.0.4" 694 | }, 695 | "engines": { 696 | "node": ">= 0.4" 697 | } 698 | }, 699 | "node_modules/is-arguments": { 700 | "version": "1.1.1", 701 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 702 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 703 | "dev": true, 704 | "dependencies": { 705 | "call-bind": "^1.0.2", 706 | "has-tostringtag": "^1.0.0" 707 | }, 708 | "engines": { 709 | "node": ">= 0.4" 710 | }, 711 | "funding": { 712 | "url": "https://github.com/sponsors/ljharb" 713 | } 714 | }, 715 | "node_modules/is-array-buffer": { 716 | "version": "3.0.4", 717 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", 718 | "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", 719 | "dev": true, 720 | "dependencies": { 721 | "call-bind": "^1.0.2", 722 | "get-intrinsic": "^1.2.1" 723 | }, 724 | "engines": { 725 | "node": ">= 0.4" 726 | }, 727 | "funding": { 728 | "url": "https://github.com/sponsors/ljharb" 729 | } 730 | }, 731 | "node_modules/is-bigint": { 732 | "version": "1.0.4", 733 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 734 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 735 | "dev": true, 736 | "dependencies": { 737 | "has-bigints": "^1.0.1" 738 | }, 739 | "funding": { 740 | "url": "https://github.com/sponsors/ljharb" 741 | } 742 | }, 743 | "node_modules/is-boolean-object": { 744 | "version": "1.1.2", 745 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 746 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 747 | "dev": true, 748 | "dependencies": { 749 | "call-bind": "^1.0.2", 750 | "has-tostringtag": "^1.0.0" 751 | }, 752 | "engines": { 753 | "node": ">= 0.4" 754 | }, 755 | "funding": { 756 | "url": "https://github.com/sponsors/ljharb" 757 | } 758 | }, 759 | "node_modules/is-callable": { 760 | "version": "1.2.7", 761 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 762 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 763 | "dev": true, 764 | "engines": { 765 | "node": ">= 0.4" 766 | }, 767 | "funding": { 768 | "url": "https://github.com/sponsors/ljharb" 769 | } 770 | }, 771 | "node_modules/is-core-module": { 772 | "version": "2.13.1", 773 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 774 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 775 | "dev": true, 776 | "dependencies": { 777 | "hasown": "^2.0.0" 778 | }, 779 | "funding": { 780 | "url": "https://github.com/sponsors/ljharb" 781 | } 782 | }, 783 | "node_modules/is-data-view": { 784 | "version": "1.0.1", 785 | "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", 786 | "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", 787 | "dev": true, 788 | "dependencies": { 789 | "is-typed-array": "^1.1.13" 790 | }, 791 | "engines": { 792 | "node": ">= 0.4" 793 | }, 794 | "funding": { 795 | "url": "https://github.com/sponsors/ljharb" 796 | } 797 | }, 798 | "node_modules/is-date-object": { 799 | "version": "1.0.5", 800 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 801 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 802 | "dev": true, 803 | "dependencies": { 804 | "has-tostringtag": "^1.0.0" 805 | }, 806 | "engines": { 807 | "node": ">= 0.4" 808 | }, 809 | "funding": { 810 | "url": "https://github.com/sponsors/ljharb" 811 | } 812 | }, 813 | "node_modules/is-map": { 814 | "version": "2.0.3", 815 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", 816 | "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", 817 | "dev": true, 818 | "engines": { 819 | "node": ">= 0.4" 820 | }, 821 | "funding": { 822 | "url": "https://github.com/sponsors/ljharb" 823 | } 824 | }, 825 | "node_modules/is-negative-zero": { 826 | "version": "2.0.3", 827 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", 828 | "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", 829 | "dev": true, 830 | "engines": { 831 | "node": ">= 0.4" 832 | }, 833 | "funding": { 834 | "url": "https://github.com/sponsors/ljharb" 835 | } 836 | }, 837 | "node_modules/is-number-object": { 838 | "version": "1.0.7", 839 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 840 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 841 | "dev": true, 842 | "dependencies": { 843 | "has-tostringtag": "^1.0.0" 844 | }, 845 | "engines": { 846 | "node": ">= 0.4" 847 | }, 848 | "funding": { 849 | "url": "https://github.com/sponsors/ljharb" 850 | } 851 | }, 852 | "node_modules/is-regex": { 853 | "version": "1.1.4", 854 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 855 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 856 | "dev": true, 857 | "dependencies": { 858 | "call-bind": "^1.0.2", 859 | "has-tostringtag": "^1.0.0" 860 | }, 861 | "engines": { 862 | "node": ">= 0.4" 863 | }, 864 | "funding": { 865 | "url": "https://github.com/sponsors/ljharb" 866 | } 867 | }, 868 | "node_modules/is-set": { 869 | "version": "2.0.3", 870 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", 871 | "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", 872 | "dev": true, 873 | "engines": { 874 | "node": ">= 0.4" 875 | }, 876 | "funding": { 877 | "url": "https://github.com/sponsors/ljharb" 878 | } 879 | }, 880 | "node_modules/is-shared-array-buffer": { 881 | "version": "1.0.3", 882 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", 883 | "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", 884 | "dev": true, 885 | "dependencies": { 886 | "call-bind": "^1.0.7" 887 | }, 888 | "engines": { 889 | "node": ">= 0.4" 890 | }, 891 | "funding": { 892 | "url": "https://github.com/sponsors/ljharb" 893 | } 894 | }, 895 | "node_modules/is-string": { 896 | "version": "1.0.7", 897 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 898 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 899 | "dev": true, 900 | "dependencies": { 901 | "has-tostringtag": "^1.0.0" 902 | }, 903 | "engines": { 904 | "node": ">= 0.4" 905 | }, 906 | "funding": { 907 | "url": "https://github.com/sponsors/ljharb" 908 | } 909 | }, 910 | "node_modules/is-symbol": { 911 | "version": "1.0.4", 912 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 913 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 914 | "dev": true, 915 | "dependencies": { 916 | "has-symbols": "^1.0.2" 917 | }, 918 | "engines": { 919 | "node": ">= 0.4" 920 | }, 921 | "funding": { 922 | "url": "https://github.com/sponsors/ljharb" 923 | } 924 | }, 925 | "node_modules/is-typed-array": { 926 | "version": "1.1.13", 927 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", 928 | "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", 929 | "dev": true, 930 | "dependencies": { 931 | "which-typed-array": "^1.1.14" 932 | }, 933 | "engines": { 934 | "node": ">= 0.4" 935 | }, 936 | "funding": { 937 | "url": "https://github.com/sponsors/ljharb" 938 | } 939 | }, 940 | "node_modules/is-weakmap": { 941 | "version": "2.0.2", 942 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", 943 | "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", 944 | "dev": true, 945 | "engines": { 946 | "node": ">= 0.4" 947 | }, 948 | "funding": { 949 | "url": "https://github.com/sponsors/ljharb" 950 | } 951 | }, 952 | "node_modules/is-weakref": { 953 | "version": "1.0.2", 954 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 955 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 956 | "dev": true, 957 | "dependencies": { 958 | "call-bind": "^1.0.2" 959 | }, 960 | "funding": { 961 | "url": "https://github.com/sponsors/ljharb" 962 | } 963 | }, 964 | "node_modules/is-weakset": { 965 | "version": "2.0.3", 966 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", 967 | "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", 968 | "dev": true, 969 | "dependencies": { 970 | "call-bind": "^1.0.7", 971 | "get-intrinsic": "^1.2.4" 972 | }, 973 | "engines": { 974 | "node": ">= 0.4" 975 | }, 976 | "funding": { 977 | "url": "https://github.com/sponsors/ljharb" 978 | } 979 | }, 980 | "node_modules/isarray": { 981 | "version": "2.0.5", 982 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 983 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 984 | "dev": true 985 | }, 986 | "node_modules/minimist": { 987 | "version": "1.2.8", 988 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 989 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 990 | "dev": true, 991 | "funding": { 992 | "url": "https://github.com/sponsors/ljharb" 993 | } 994 | }, 995 | "node_modules/mock-property": { 996 | "version": "1.0.3", 997 | "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.0.3.tgz", 998 | "integrity": "sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==", 999 | "dev": true, 1000 | "dependencies": { 1001 | "define-data-property": "^1.1.1", 1002 | "functions-have-names": "^1.2.3", 1003 | "gopd": "^1.0.1", 1004 | "has-property-descriptors": "^1.0.0", 1005 | "hasown": "^2.0.0", 1006 | "isarray": "^2.0.5" 1007 | }, 1008 | "engines": { 1009 | "node": ">= 0.4" 1010 | }, 1011 | "funding": { 1012 | "url": "https://github.com/sponsors/ljharb" 1013 | } 1014 | }, 1015 | "node_modules/object-inspect": { 1016 | "version": "1.13.1", 1017 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1018 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 1019 | "dev": true, 1020 | "funding": { 1021 | "url": "https://github.com/sponsors/ljharb" 1022 | } 1023 | }, 1024 | "node_modules/object-is": { 1025 | "version": "1.1.6", 1026 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", 1027 | "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", 1028 | "dev": true, 1029 | "dependencies": { 1030 | "call-bind": "^1.0.7", 1031 | "define-properties": "^1.2.1" 1032 | }, 1033 | "engines": { 1034 | "node": ">= 0.4" 1035 | }, 1036 | "funding": { 1037 | "url": "https://github.com/sponsors/ljharb" 1038 | } 1039 | }, 1040 | "node_modules/object-keys": { 1041 | "version": "1.1.1", 1042 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1043 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1044 | "dev": true, 1045 | "engines": { 1046 | "node": ">= 0.4" 1047 | } 1048 | }, 1049 | "node_modules/object.assign": { 1050 | "version": "4.1.5", 1051 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", 1052 | "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", 1053 | "dev": true, 1054 | "dependencies": { 1055 | "call-bind": "^1.0.5", 1056 | "define-properties": "^1.2.1", 1057 | "has-symbols": "^1.0.3", 1058 | "object-keys": "^1.1.1" 1059 | }, 1060 | "engines": { 1061 | "node": ">= 0.4" 1062 | }, 1063 | "funding": { 1064 | "url": "https://github.com/sponsors/ljharb" 1065 | } 1066 | }, 1067 | "node_modules/once": { 1068 | "version": "1.4.0", 1069 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1070 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1071 | "dev": true, 1072 | "dependencies": { 1073 | "wrappy": "1" 1074 | } 1075 | }, 1076 | "node_modules/path-is-absolute": { 1077 | "version": "1.0.1", 1078 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1079 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1080 | "dev": true, 1081 | "engines": { 1082 | "node": ">=0.10.0" 1083 | } 1084 | }, 1085 | "node_modules/path-parse": { 1086 | "version": "1.0.7", 1087 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1088 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1089 | "dev": true 1090 | }, 1091 | "node_modules/possible-typed-array-names": { 1092 | "version": "1.0.0", 1093 | "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", 1094 | "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", 1095 | "dev": true, 1096 | "engines": { 1097 | "node": ">= 0.4" 1098 | } 1099 | }, 1100 | "node_modules/regexp.prototype.flags": { 1101 | "version": "1.5.2", 1102 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", 1103 | "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", 1104 | "dev": true, 1105 | "dependencies": { 1106 | "call-bind": "^1.0.6", 1107 | "define-properties": "^1.2.1", 1108 | "es-errors": "^1.3.0", 1109 | "set-function-name": "^2.0.1" 1110 | }, 1111 | "engines": { 1112 | "node": ">= 0.4" 1113 | }, 1114 | "funding": { 1115 | "url": "https://github.com/sponsors/ljharb" 1116 | } 1117 | }, 1118 | "node_modules/resolve": { 1119 | "version": "2.0.0-next.5", 1120 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", 1121 | "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", 1122 | "dev": true, 1123 | "dependencies": { 1124 | "is-core-module": "^2.13.0", 1125 | "path-parse": "^1.0.7", 1126 | "supports-preserve-symlinks-flag": "^1.0.0" 1127 | }, 1128 | "bin": { 1129 | "resolve": "bin/resolve" 1130 | }, 1131 | "funding": { 1132 | "url": "https://github.com/sponsors/ljharb" 1133 | } 1134 | }, 1135 | "node_modules/safe-array-concat": { 1136 | "version": "1.1.2", 1137 | "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", 1138 | "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", 1139 | "dev": true, 1140 | "dependencies": { 1141 | "call-bind": "^1.0.7", 1142 | "get-intrinsic": "^1.2.4", 1143 | "has-symbols": "^1.0.3", 1144 | "isarray": "^2.0.5" 1145 | }, 1146 | "engines": { 1147 | "node": ">=0.4" 1148 | }, 1149 | "funding": { 1150 | "url": "https://github.com/sponsors/ljharb" 1151 | } 1152 | }, 1153 | "node_modules/safe-regex-test": { 1154 | "version": "1.0.3", 1155 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", 1156 | "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", 1157 | "dev": true, 1158 | "dependencies": { 1159 | "call-bind": "^1.0.6", 1160 | "es-errors": "^1.3.0", 1161 | "is-regex": "^1.1.4" 1162 | }, 1163 | "engines": { 1164 | "node": ">= 0.4" 1165 | }, 1166 | "funding": { 1167 | "url": "https://github.com/sponsors/ljharb" 1168 | } 1169 | }, 1170 | "node_modules/set-function-length": { 1171 | "version": "1.2.2", 1172 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1173 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1174 | "dev": true, 1175 | "dependencies": { 1176 | "define-data-property": "^1.1.4", 1177 | "es-errors": "^1.3.0", 1178 | "function-bind": "^1.1.2", 1179 | "get-intrinsic": "^1.2.4", 1180 | "gopd": "^1.0.1", 1181 | "has-property-descriptors": "^1.0.2" 1182 | }, 1183 | "engines": { 1184 | "node": ">= 0.4" 1185 | } 1186 | }, 1187 | "node_modules/set-function-name": { 1188 | "version": "2.0.2", 1189 | "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", 1190 | "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", 1191 | "dev": true, 1192 | "dependencies": { 1193 | "define-data-property": "^1.1.4", 1194 | "es-errors": "^1.3.0", 1195 | "functions-have-names": "^1.2.3", 1196 | "has-property-descriptors": "^1.0.2" 1197 | }, 1198 | "engines": { 1199 | "node": ">= 0.4" 1200 | } 1201 | }, 1202 | "node_modules/side-channel": { 1203 | "version": "1.0.6", 1204 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 1205 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 1206 | "dev": true, 1207 | "dependencies": { 1208 | "call-bind": "^1.0.7", 1209 | "es-errors": "^1.3.0", 1210 | "get-intrinsic": "^1.2.4", 1211 | "object-inspect": "^1.13.1" 1212 | }, 1213 | "engines": { 1214 | "node": ">= 0.4" 1215 | }, 1216 | "funding": { 1217 | "url": "https://github.com/sponsors/ljharb" 1218 | } 1219 | }, 1220 | "node_modules/stop-iteration-iterator": { 1221 | "version": "1.0.0", 1222 | "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", 1223 | "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", 1224 | "dev": true, 1225 | "dependencies": { 1226 | "internal-slot": "^1.0.4" 1227 | }, 1228 | "engines": { 1229 | "node": ">= 0.4" 1230 | } 1231 | }, 1232 | "node_modules/string.prototype.trim": { 1233 | "version": "1.2.9", 1234 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", 1235 | "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", 1236 | "dev": true, 1237 | "dependencies": { 1238 | "call-bind": "^1.0.7", 1239 | "define-properties": "^1.2.1", 1240 | "es-abstract": "^1.23.0", 1241 | "es-object-atoms": "^1.0.0" 1242 | }, 1243 | "engines": { 1244 | "node": ">= 0.4" 1245 | }, 1246 | "funding": { 1247 | "url": "https://github.com/sponsors/ljharb" 1248 | } 1249 | }, 1250 | "node_modules/string.prototype.trimend": { 1251 | "version": "1.0.8", 1252 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", 1253 | "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", 1254 | "dev": true, 1255 | "dependencies": { 1256 | "call-bind": "^1.0.7", 1257 | "define-properties": "^1.2.1", 1258 | "es-object-atoms": "^1.0.0" 1259 | }, 1260 | "funding": { 1261 | "url": "https://github.com/sponsors/ljharb" 1262 | } 1263 | }, 1264 | "node_modules/string.prototype.trimstart": { 1265 | "version": "1.0.8", 1266 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", 1267 | "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", 1268 | "dev": true, 1269 | "dependencies": { 1270 | "call-bind": "^1.0.7", 1271 | "define-properties": "^1.2.1", 1272 | "es-object-atoms": "^1.0.0" 1273 | }, 1274 | "engines": { 1275 | "node": ">= 0.4" 1276 | }, 1277 | "funding": { 1278 | "url": "https://github.com/sponsors/ljharb" 1279 | } 1280 | }, 1281 | "node_modules/supports-preserve-symlinks-flag": { 1282 | "version": "1.0.0", 1283 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1284 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1285 | "dev": true, 1286 | "engines": { 1287 | "node": ">= 0.4" 1288 | }, 1289 | "funding": { 1290 | "url": "https://github.com/sponsors/ljharb" 1291 | } 1292 | }, 1293 | "node_modules/tape": { 1294 | "version": "5.7.5", 1295 | "resolved": "https://registry.npmjs.org/tape/-/tape-5.7.5.tgz", 1296 | "integrity": "sha512-C5Gm1MR8ujZmNrsmOiHSkKFfY2thrnUrFw/fFtcva9FABbN7LrHuQPi3MTS0Z0i/SLfYSJtRIcJYDUpwPsQ8yA==", 1297 | "dev": true, 1298 | "dependencies": { 1299 | "@ljharb/resumer": "^0.1.2", 1300 | "@ljharb/through": "^2.3.12", 1301 | "array.prototype.every": "^1.1.5", 1302 | "call-bind": "^1.0.7", 1303 | "deep-equal": "^2.2.3", 1304 | "defined": "^1.0.1", 1305 | "dotignore": "^0.1.2", 1306 | "for-each": "^0.3.3", 1307 | "get-package-type": "^0.1.0", 1308 | "glob": "^7.2.3", 1309 | "has-dynamic-import": "^2.1.0", 1310 | "hasown": "^2.0.1", 1311 | "inherits": "^2.0.4", 1312 | "is-regex": "^1.1.4", 1313 | "minimist": "^1.2.8", 1314 | "mock-property": "^1.0.3", 1315 | "object-inspect": "^1.13.1", 1316 | "object-is": "^1.1.5", 1317 | "object-keys": "^1.1.1", 1318 | "object.assign": "^4.1.5", 1319 | "resolve": "^2.0.0-next.5", 1320 | "string.prototype.trim": "^1.2.8" 1321 | }, 1322 | "bin": { 1323 | "tape": "bin/tape" 1324 | }, 1325 | "funding": { 1326 | "url": "https://github.com/sponsors/ljharb" 1327 | } 1328 | }, 1329 | "node_modules/tape/node_modules/brace-expansion": { 1330 | "version": "1.1.11", 1331 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1332 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1333 | "dev": true, 1334 | "dependencies": { 1335 | "balanced-match": "^1.0.0", 1336 | "concat-map": "0.0.1" 1337 | } 1338 | }, 1339 | "node_modules/tape/node_modules/glob": { 1340 | "version": "7.2.3", 1341 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1342 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1343 | "dev": true, 1344 | "dependencies": { 1345 | "fs.realpath": "^1.0.0", 1346 | "inflight": "^1.0.4", 1347 | "inherits": "2", 1348 | "minimatch": "^3.1.1", 1349 | "once": "^1.3.0", 1350 | "path-is-absolute": "^1.0.0" 1351 | }, 1352 | "engines": { 1353 | "node": "*" 1354 | }, 1355 | "funding": { 1356 | "url": "https://github.com/sponsors/isaacs" 1357 | } 1358 | }, 1359 | "node_modules/tape/node_modules/minimatch": { 1360 | "version": "3.1.2", 1361 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1362 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1363 | "dev": true, 1364 | "dependencies": { 1365 | "brace-expansion": "^1.1.7" 1366 | }, 1367 | "engines": { 1368 | "node": "*" 1369 | } 1370 | }, 1371 | "node_modules/typed-array-buffer": { 1372 | "version": "1.0.2", 1373 | "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", 1374 | "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", 1375 | "dev": true, 1376 | "dependencies": { 1377 | "call-bind": "^1.0.7", 1378 | "es-errors": "^1.3.0", 1379 | "is-typed-array": "^1.1.13" 1380 | }, 1381 | "engines": { 1382 | "node": ">= 0.4" 1383 | } 1384 | }, 1385 | "node_modules/typed-array-byte-length": { 1386 | "version": "1.0.1", 1387 | "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", 1388 | "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", 1389 | "dev": true, 1390 | "dependencies": { 1391 | "call-bind": "^1.0.7", 1392 | "for-each": "^0.3.3", 1393 | "gopd": "^1.0.1", 1394 | "has-proto": "^1.0.3", 1395 | "is-typed-array": "^1.1.13" 1396 | }, 1397 | "engines": { 1398 | "node": ">= 0.4" 1399 | }, 1400 | "funding": { 1401 | "url": "https://github.com/sponsors/ljharb" 1402 | } 1403 | }, 1404 | "node_modules/typed-array-byte-offset": { 1405 | "version": "1.0.2", 1406 | "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", 1407 | "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", 1408 | "dev": true, 1409 | "dependencies": { 1410 | "available-typed-arrays": "^1.0.7", 1411 | "call-bind": "^1.0.7", 1412 | "for-each": "^0.3.3", 1413 | "gopd": "^1.0.1", 1414 | "has-proto": "^1.0.3", 1415 | "is-typed-array": "^1.1.13" 1416 | }, 1417 | "engines": { 1418 | "node": ">= 0.4" 1419 | }, 1420 | "funding": { 1421 | "url": "https://github.com/sponsors/ljharb" 1422 | } 1423 | }, 1424 | "node_modules/typed-array-length": { 1425 | "version": "1.0.6", 1426 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", 1427 | "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", 1428 | "dev": true, 1429 | "dependencies": { 1430 | "call-bind": "^1.0.7", 1431 | "for-each": "^0.3.3", 1432 | "gopd": "^1.0.1", 1433 | "has-proto": "^1.0.3", 1434 | "is-typed-array": "^1.1.13", 1435 | "possible-typed-array-names": "^1.0.0" 1436 | }, 1437 | "engines": { 1438 | "node": ">= 0.4" 1439 | }, 1440 | "funding": { 1441 | "url": "https://github.com/sponsors/ljharb" 1442 | } 1443 | }, 1444 | "node_modules/unbox-primitive": { 1445 | "version": "1.0.2", 1446 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 1447 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 1448 | "dev": true, 1449 | "dependencies": { 1450 | "call-bind": "^1.0.2", 1451 | "has-bigints": "^1.0.2", 1452 | "has-symbols": "^1.0.3", 1453 | "which-boxed-primitive": "^1.0.2" 1454 | }, 1455 | "funding": { 1456 | "url": "https://github.com/sponsors/ljharb" 1457 | } 1458 | }, 1459 | "node_modules/which-boxed-primitive": { 1460 | "version": "1.0.2", 1461 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1462 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1463 | "dev": true, 1464 | "dependencies": { 1465 | "is-bigint": "^1.0.1", 1466 | "is-boolean-object": "^1.1.0", 1467 | "is-number-object": "^1.0.4", 1468 | "is-string": "^1.0.5", 1469 | "is-symbol": "^1.0.3" 1470 | }, 1471 | "funding": { 1472 | "url": "https://github.com/sponsors/ljharb" 1473 | } 1474 | }, 1475 | "node_modules/which-collection": { 1476 | "version": "1.0.2", 1477 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", 1478 | "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", 1479 | "dev": true, 1480 | "dependencies": { 1481 | "is-map": "^2.0.3", 1482 | "is-set": "^2.0.3", 1483 | "is-weakmap": "^2.0.2", 1484 | "is-weakset": "^2.0.3" 1485 | }, 1486 | "engines": { 1487 | "node": ">= 0.4" 1488 | }, 1489 | "funding": { 1490 | "url": "https://github.com/sponsors/ljharb" 1491 | } 1492 | }, 1493 | "node_modules/which-typed-array": { 1494 | "version": "1.1.15", 1495 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", 1496 | "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", 1497 | "dev": true, 1498 | "dependencies": { 1499 | "available-typed-arrays": "^1.0.7", 1500 | "call-bind": "^1.0.7", 1501 | "for-each": "^0.3.3", 1502 | "gopd": "^1.0.1", 1503 | "has-tostringtag": "^1.0.2" 1504 | }, 1505 | "engines": { 1506 | "node": ">= 0.4" 1507 | }, 1508 | "funding": { 1509 | "url": "https://github.com/sponsors/ljharb" 1510 | } 1511 | }, 1512 | "node_modules/wrappy": { 1513 | "version": "1.0.2", 1514 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1515 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1516 | "dev": true 1517 | } 1518 | } 1519 | } 1520 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "canvas-dimensions", 3 | "version": "1.0.0", 4 | "description": "utilities for paper and print dimensions", 5 | "type": "module", 6 | "main": "index.js", 7 | "license": "MIT", 8 | "author": { 9 | "name": "Matt DesLauriers", 10 | "url": "https://github.com/mattdesl" 11 | }, 12 | "dependencies": { 13 | "convert-length": "^1.0.1" 14 | }, 15 | "scripts": { 16 | "test": "node test.js" 17 | }, 18 | "keywords": [ 19 | "paper", 20 | "size", 21 | "px", 22 | "in", 23 | "cm", 24 | "mm", 25 | "m", 26 | "a4", 27 | "a3", 28 | "a2", 29 | "a1", 30 | "a0", 31 | "a5", 32 | "a6", 33 | "standard", 34 | "print", 35 | "dimensions", 36 | "sizes" 37 | ], 38 | "repository": { 39 | "type": "git", 40 | "url": "git://github.com/mattdesl/canvas-dimensions.git" 41 | }, 42 | "homepage": "https://github.com/mattdesl/canvas-dimensions", 43 | "bugs": { 44 | "url": "https://github.com/mattdesl/canvas-dimensions/issues" 45 | }, 46 | "devDependencies": { 47 | "tape": "^5.7.5" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /paper-sizes.js: -------------------------------------------------------------------------------- 1 | // When no units are specified, it will default to mm 2 | const defaultUnits = "mm"; 3 | 4 | const data = [ 5 | // Common Paper Sizes 6 | // (Mostly North-American based) 7 | ["postcard", 101.6, 152.4], 8 | ["poster-small", 280, 430], 9 | ["poster", 460, 610], 10 | ["poster-large", 610, 910], 11 | ["business-card", 50.8, 88.9], 12 | 13 | // Photographic Print Paper Sizes 14 | ["2r", 64, 89], 15 | ["3r", 89, 127], 16 | ["4r", 102, 152], 17 | ["5r", 127, 178], // 5″x7″ 18 | ["6r", 152, 203], // 6″x8″ 19 | ["8r", 203, 254], // 8″x10″ 20 | ["10r", 254, 305], // 10″x12″ 21 | ["11r", 279, 356], // 11″x14″ 22 | ["12r", 305, 381], 23 | 24 | // Standard Paper Sizes 25 | ["a0", 841, 1189], 26 | ["a1", 594, 841], 27 | ["a2", 420, 594], 28 | ["a3", 297, 420], 29 | ["a4", 210, 297], 30 | ["a5", 148, 210], 31 | ["a6", 105, 148], 32 | ["a7", 74, 105], 33 | ["a8", 52, 74], 34 | ["a9", 37, 52], 35 | ["a10", 26, 37], 36 | ["2a0", 1189, 1682], 37 | ["4a0", 1682, 2378], 38 | ["b0", 1000, 1414], 39 | ["b1", 707, 1000], 40 | ["b1+", 720, 1020], 41 | ["b2", 500, 707], 42 | ["b2+", 520, 720], 43 | ["b3", 353, 500], 44 | ["b4", 250, 353], 45 | ["b5", 176, 250], 46 | ["b6", 125, 176], 47 | ["b7", 88, 125], 48 | ["b8", 62, 88], 49 | ["b9", 44, 62], 50 | ["b10", 31, 44], 51 | ["b11", 22, 32], 52 | ["b12", 16, 22], 53 | ["c0", 917, 1297], 54 | ["c1", 648, 917], 55 | ["c2", 458, 648], 56 | ["c3", 324, 458], 57 | ["c4", 229, 324], 58 | ["c5", 162, 229], 59 | ["c6", 114, 162], 60 | ["c7", 81, 114], 61 | ["c8", 57, 81], 62 | ["c9", 40, 57], 63 | ["c10", 28, 40], 64 | ["c11", 22, 32], 65 | ["c12", 16, 22], 66 | 67 | // Use inches for North American sizes, 68 | // as it produces less float precision errors 69 | ["half-letter", 5.5, 8.5, "in"], 70 | ["letter", 8.5, 11, "in"], 71 | ["legal", 8.5, 14, "in"], 72 | ["junior-legal", 5, 8, "in"], 73 | ["ledger", 11, 17, "in"], 74 | ["tabloid", 11, 17, "in"], 75 | ["ansi-a", 8.5, 11.0, "in"], 76 | ["ansi-b", 11.0, 17.0, "in"], 77 | ["ansi-c", 17.0, 22.0, "in"], 78 | ["ansi-d", 22.0, 34.0, "in"], 79 | ["ansi-e", 34.0, 44.0, "in"], 80 | ["arch-a", 9, 12, "in"], 81 | ["arch-b", 12, 18, "in"], 82 | ["arch-c", 18, 24, "in"], 83 | ["arch-d", 24, 36, "in"], 84 | ["arch-e", 36, 48, "in"], 85 | ["arch-e1", 30, 42, "in"], 86 | ["arch-e2", 26, 38, "in"], 87 | ["arch-e3", 27, 39, "in"], 88 | ]; 89 | 90 | export default data.reduce((dict, preset) => { 91 | const item = { 92 | units: preset[3] || defaultUnits, 93 | dimensions: [preset[1], preset[2]], 94 | }; 95 | dict[preset[0]] = item; 96 | return dict; 97 | }, {}); 98 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | import test from "tape"; 2 | import sizes from "./paper-sizes.js"; 3 | import getDocument from "./index.js"; 4 | 5 | test("sizes", async (t) => { 6 | t.deepEqual(sizes.a4, { units: "mm", dimensions: [210, 297] }); 7 | t.deepEqual(sizes.letter, { units: "in", dimensions: [8.5, 11] }); 8 | t.deepEqual(sizes["half-letter"], { units: "in", dimensions: [5.5, 8.5] }); 9 | }); 10 | 11 | test("getSize", async (t) => { 12 | t.throws(() => getDocument(null)); 13 | t.throws(() => getDocument({ dimensions: [1] })); 14 | t.throws(() => getDocument({ dimensions: [1, 2, 3] })); 15 | t.throws(() => getDocument({ dimensions: "aha" })); 16 | t.deepEqual(getDocument([128, 128]), { 17 | width: 128, 18 | height: 128, 19 | units: "px", 20 | canvasWidth: 128, 21 | canvasHeight: 128, 22 | pixelsPerInch: 72, 23 | pixelRatio: 1, 24 | }); 25 | t.deepEqual(getDocument({ dimensions: [128, 128], pixelRatio: 2 }), { 26 | width: 128, 27 | height: 128, 28 | units: "px", 29 | canvasWidth: 256, 30 | canvasHeight: 256, 31 | pixelsPerInch: 72, 32 | pixelRatio: 2, 33 | }); 34 | t.equals(getDocument({ dimensions: [120, 10] }).units, "px"); 35 | t.equals(getDocument({ dimensions: "a4" }).units, "px"); 36 | t.equals(getDocument({ dimensions: "A4", units: "cm" }).units, "cm"); 37 | t.deepEqual(getDocument({ dimensions: "A4", units: "cm" }), { 38 | width: 21, 39 | height: 29.7, 40 | units: "cm", 41 | canvasWidth: 595, 42 | canvasHeight: 842, 43 | pixelsPerInch: 72, 44 | pixelRatio: 1, 45 | }); 46 | 47 | t.deepEqual( 48 | getDocument({ dimensions: "A4", units: "cm", pixelsPerInch: 300 }), 49 | { 50 | width: 21, 51 | height: 29.7, 52 | units: "cm", 53 | canvasWidth: 2480, 54 | canvasHeight: 3508, 55 | pixelsPerInch: 300, 56 | pixelRatio: 1, 57 | } 58 | ); 59 | t.deepEqual( 60 | getDocument({ 61 | dimensions: [200, 100], 62 | orientation: "portrait", 63 | }), 64 | { 65 | width: 100, 66 | height: 200, 67 | units: "px", 68 | canvasWidth: 100, 69 | canvasHeight: 200, 70 | pixelsPerInch: 72, 71 | pixelRatio: 1, 72 | } 73 | ); 74 | t.deepEqual( 75 | getDocument({ 76 | dimensions: [200, 100], 77 | orientation: "landscape", 78 | }), 79 | { 80 | width: 200, 81 | height: 100, 82 | units: "px", 83 | canvasWidth: 200, 84 | canvasHeight: 100, 85 | pixelsPerInch: 72, 86 | pixelRatio: 1, 87 | } 88 | ); 89 | 90 | t.deepEqual( 91 | getDocument({ 92 | dimensions: "A4", 93 | units: "cm", 94 | orientation: "landscape", 95 | pixelsPerInch: 300, 96 | }), 97 | { 98 | width: 29.7, 99 | height: 21, 100 | units: "cm", 101 | canvasWidth: 3508, 102 | canvasHeight: 2480, 103 | pixelsPerInch: 300, 104 | pixelRatio: 1, 105 | } 106 | ); 107 | }); 108 | --------------------------------------------------------------------------------