├── .github ├── renovate.json └── workflows │ ├── benchmark.yml │ └── pull_request.yml ├── .gitignore ├── .node-version ├── .npmrc ├── .prettierignore ├── .yarnrc ├── LICENSE ├── README.md ├── benchmarks ├── .gitignore ├── .npmrc ├── README.md ├── karma.conf.js ├── package.json ├── pnpm-lock.yaml └── src │ ├── advanced.bench.js │ └── basic.bench.js ├── eslint.config.mjs ├── examples └── index.mjs ├── jest.config.js ├── package.json ├── pnpm-lock.yaml ├── prettier.config.mjs ├── rollup.config.mjs ├── src ├── DateProxy.ts ├── __tests__ │ └── test.spec.ts ├── index.ts └── string-raw.ts ├── tsconfig.json └── tsconfig.test.json /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["github>3846masa/configs//renovate/default"], 4 | "packageRules": [ 5 | { 6 | "matchFileNames": ["benchmarks/package.json"], 7 | "semanticCommitType": "chore" 8 | }, 9 | { 10 | "groupName": "size-limit", 11 | "matchPackagePatterns": ["^size-limit$", "^@size-limit/"] 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /.github/workflows/benchmark.yml: -------------------------------------------------------------------------------- 1 | name: Benchmark 2 | on: 3 | workflow_dispatch: {} 4 | schedule: 5 | - cron: '0 0 * * 0' 6 | defaults: 7 | run: 8 | shell: bash -euxo pipefail {0} 9 | jobs: 10 | benchmark: 11 | name: Benchmark 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 16 | - name: Setup pnpm 17 | uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 18 | with: 19 | package_json_file: package.json 20 | - name: Setup Node.js 21 | uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 22 | with: 23 | node-version-file: .node-version 24 | cache: pnpm 25 | cache-dependency-path: benchmarks/pnpm-lock.yaml 26 | - working-directory: ./benchmarks 27 | run: pnpm install 28 | - working-directory: ./benchmarks 29 | env: 30 | PLOTLY_USERNAME: ${{ secrets.PLOTLY_USERNAME }} 31 | PLOTLY_APIKEY: ${{ secrets.PLOTLY_APIKEY }} 32 | run: pnpm run benchmark 33 | -------------------------------------------------------------------------------- /.github/workflows/pull_request.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - main 5 | tags: 6 | - 'v[0-9]+.[0-9]+.[0-9]+' 7 | pull_request: {} 8 | defaults: 9 | run: 10 | shell: bash -euxo pipefail {0} 11 | jobs: 12 | lint: 13 | name: Lint 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Checkout 17 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 18 | - name: Setup pnpm 19 | uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 20 | with: 21 | package_json_file: package.json 22 | - name: Setup Node.js 23 | uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 24 | with: 25 | node-version-file: .node-version 26 | cache: pnpm 27 | - run: pnpm install 28 | - run: pnpm lint 29 | test: 30 | name: Test 31 | runs-on: ubuntu-latest 32 | steps: 33 | - name: Checkout 34 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 35 | - name: Setup pnpm 36 | uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 37 | with: 38 | package_json_file: package.json 39 | - name: Setup Node.js 40 | uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 41 | with: 42 | node-version-file: .node-version 43 | cache: pnpm 44 | - run: pnpm install 45 | - run: pnpm test 46 | - uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3 47 | passed: 48 | name: All CI passed 49 | runs-on: ubuntu-latest 50 | needs: 51 | - lint 52 | - test 53 | if: always() 54 | steps: 55 | - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 56 | env: 57 | RESULT_JSON: ${{ toJSON(needs) }} 58 | with: 59 | script: | 60 | const result = JSON.parse(process.env.RESULT_JSON); 61 | const passed = Object.values(result).every(({ result }) => result === 'success'); 62 | if (!passed) process.exit(1); 63 | release: 64 | name: Release 65 | if: startsWith(github.ref, 'refs/tags/v') 66 | concurrency: 67 | group: release 68 | cancel-in-progress: false 69 | needs: 70 | - passed 71 | runs-on: ubuntu-latest 72 | steps: 73 | - name: Checkout 74 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 75 | - name: Setup pnpm 76 | uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 77 | with: 78 | package_json_file: package.json 79 | - name: Setup Node.js 80 | uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 81 | with: 82 | node-version-file: .node-version 83 | cache: pnpm 84 | - run: pnpm install 85 | - name: Release 86 | env: 87 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 88 | run: | 89 | echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc 90 | pnpm publish 91 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/node,macos,windows 3 | 4 | ### macOS ### 5 | *.DS_Store 6 | .AppleDouble 7 | .LSOverride 8 | 9 | # Icon must end with two \r 10 | Icon 11 | 12 | # Thumbnails 13 | ._* 14 | 15 | # Files that might appear in the root of a volume 16 | .DocumentRevisions-V100 17 | .fseventsd 18 | .Spotlight-V100 19 | .TemporaryItems 20 | .Trashes 21 | .VolumeIcon.icns 22 | .com.apple.timemachine.donotpresent 23 | 24 | # Directories potentially created on remote AFP share 25 | .AppleDB 26 | .AppleDesktop 27 | Network Trash Folder 28 | Temporary Items 29 | .apdisk 30 | 31 | ### Node ### 32 | # Logs 33 | logs 34 | *.log 35 | npm-debug.log* 36 | yarn-debug.log* 37 | yarn-error.log* 38 | 39 | # Runtime data 40 | pids 41 | *.pid 42 | *.seed 43 | *.pid.lock 44 | 45 | # Directory for instrumented libs generated by jscoverage/JSCover 46 | lib-cov 47 | 48 | # Coverage directory used by tools like istanbul 49 | coverage 50 | 51 | # nyc test coverage 52 | .nyc_output 53 | 54 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 55 | .grunt 56 | 57 | # Bower dependency directory (https://bower.io/) 58 | bower_components 59 | 60 | # node-waf configuration 61 | .lock-wscript 62 | 63 | # Compiled binary addons (http://nodejs.org/api/addons.html) 64 | build/Release 65 | 66 | # Dependency directories 67 | node_modules/ 68 | jspm_packages/ 69 | 70 | # Typescript v1 declaration files 71 | typings/ 72 | 73 | # Optional npm cache directory 74 | .npm 75 | 76 | # Optional eslint cache 77 | .eslintcache 78 | 79 | # Optional REPL history 80 | .node_repl_history 81 | 82 | # Output of 'npm pack' 83 | *.tgz 84 | 85 | # Yarn Integrity file 86 | .yarn-integrity 87 | 88 | # dotenv environment variables file 89 | .env 90 | 91 | 92 | ### Windows ### 93 | # Windows thumbnail cache files 94 | Thumbs.db 95 | ehthumbs.db 96 | ehthumbs_vista.db 97 | 98 | # Folder config file 99 | Desktop.ini 100 | 101 | # Recycle Bin used on file shares 102 | $RECYCLE.BIN/ 103 | 104 | # Windows Installer files 105 | *.cab 106 | *.msi 107 | *.msm 108 | *.msp 109 | 110 | # Windows shortcuts 111 | *.lnk 112 | 113 | 114 | # End of https://www.gitignore.io/api/node,macos,windows 115 | 116 | /lib 117 | /dist 118 | .rpt2_cache* 119 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 20.19.2 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | save-prefix='' 2 | enable-pre-post-scripts=true 3 | shell-emulator=true 4 | engine-strict=true 5 | public-hoist-pattern[]=*eslint* 6 | public-hoist-pattern[]=*prettier* 7 | public-hoist-pattern[]=@tsconfig/* 8 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /lib 2 | /coverage 3 | *.yml 4 | *.yaml 5 | -------------------------------------------------------------------------------- /.yarnrc: -------------------------------------------------------------------------------- 1 | version-git-message "chore(release): v%s" 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright © 2018 3846masa 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 12 | all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ⏰ lit-date 2 | 3 | [![NPM](https://img.shields.io/npm/v/lit-date?style=flat-square)](https://www.npmjs.com/package/lit-date) 4 | ![filesize](https://img.shields.io/bundlephobia/minzip/lit-date?label=gzip&color=brightgreen&style=flat-square) 5 | [![codecov](https://img.shields.io/codecov/c/github/3846masa/lit-date?style=flat-square)](https://codecov.io/gh/3846masa/lit-date) 6 | 7 | > Light-weight, faster datetime formatter for modern browsers. 8 | 9 | `lit-date` is ... 10 | 11 | - ⏰ Formatter for **Date** object 12 | - 👼 Light-weight (**~1kB** gzipped!) 13 | - 🦄 Very faster than other datetime libraries (e.g. `moment`) 14 | - 🆕 Powered by `Template literals` 15 | 16 | ## Install 17 | 18 | ### Node.js 19 | 20 | ```bash 21 | npm i --save lit-date 22 | # -- OR -- 23 | yarn add lit-date 24 | ``` 25 | 26 | ### Browser 27 | 28 | ```html 29 | 30 | ``` 31 | 32 | ```html 33 | 36 | ``` 37 | 38 | ## Usage 39 | 40 | ```js 41 | const text = litdate`${'YYYY'}/${'MM'}/${'DD'}`(new Date()); 42 | console.log(text); 43 | ``` 44 | 45 | ```js 46 | // i18n 47 | const dayOfWeek = ({ dayOfWeek }) => [...'日月火水木金土'][dayOfWeek]; 48 | const format = litdate`${'M'}月${'D'}日${dayOfWeek}曜日`; 49 | console.log(format(new Date())); 50 | ``` 51 | 52 | See [examples](https://github.com/3846masa/lit-date/tree/main/examples). 53 | 54 | ## Benchmark 55 | 56 | See [benchmarks](https://github.com/3846masa/lit-date/tree/main/benchmarks) for more details. 57 | 58 | ### Basic usage 59 | 60 | - `new Date()` -> `2000/01/06` 61 | 62 | | Chrome | Firefox | 63 | | :---------------------: | :----------------------: | 64 | | ![Basic usage / Chrome] | ![Basic usage / Firefox] | 65 | 66 | [basic usage / chrome]: https://plot.ly/~3846masa/10.png?width=700&height=700 67 | [basic usage / firefox]: https://plot.ly/~3846masa/4.png?width=700&height=700 68 | 69 | ### Advanced usage 70 | 71 | - `new Date()` -> `1月6日(木)` 72 | 73 | | Chrome | Firefox | 74 | | :------------------------: | :-------------------------: | 75 | | ![Advanced usage / Chrome] | ![Advanced usage / Firefox] | 76 | 77 | [advanced usage / chrome]: https://plot.ly/~3846masa/6.png?width=700&height=700 78 | [advanced usage / firefox]: https://plot.ly/~3846masa/7.png?width=700&height=700 79 | 80 | ### Bundle size 81 | 82 | | | size | gzip | 83 | | :----------- | ------------------: | ------------------: | 84 | | tinydate | ![tinydate_size] | ![tinydate_gzip] | 85 | | time-stamp | ![time-stamp_size] | ![time-stamp_gzip] | 86 | | **lit-date** | ![lit-date_size] | ![lit-date_gzip] | 87 | | tinytime | ![tinytime_size] | ![tinytime_gzip] | 88 | | date-format | ![date-format_size] | ![date-format_gzip] | 89 | | dateformat | ![dateformat_size] | ![dateformat_gzip] | 90 | | formatoid | ![formatoid_size] | ![formatoid_gzip] | 91 | | fecha | ![fecha_size] | ![fecha_gzip] | 92 | | dayjs | ![dayjs_size] | ![dayjs_gzip] | 93 | | date-fns | ![date-fns_size] | ![date-fns_gzip] | 94 | | luxon | ![luxon_size] | ![luxon_gzip] | 95 | | moment | ![moment_size] | ![moment_gzip] | 96 | 97 | [time-stamp_size]: https://img.shields.io/bundlephobia/min/time-stamp?label=size&style=flat-square 98 | [lit-date_size]: https://img.shields.io/bundlephobia/min/lit-date?label=size&style=flat-square 99 | [dateformat_size]: https://img.shields.io/bundlephobia/min/dateformat?label=size&style=flat-square 100 | [fecha_size]: https://img.shields.io/bundlephobia/min/fecha?label=size&style=flat-square 101 | [dayjs_size]: https://img.shields.io/bundlephobia/min/dayjs?label=size&style=flat-square 102 | [date-fns_size]: https://img.shields.io/bundlephobia/min/date-fns?label=size&style=flat-square 103 | [moment_size]: https://img.shields.io/bundlephobia/min/moment?label=size&style=flat-square 104 | [luxon_size]: https://img.shields.io/bundlephobia/min/luxon?label=size&style=flat-square 105 | [tinytime_size]: https://img.shields.io/bundlephobia/min/tinytime?label=size&style=flat-square 106 | [tinydate_size]: https://img.shields.io/bundlephobia/min/tinydate?label=size&style=flat-square 107 | [date-format_size]: https://img.shields.io/bundlephobia/min/date-format?label=size&style=flat-square 108 | [formatoid_size]: https://img.shields.io/bundlephobia/min/formatoid?label=size&style=flat-square 109 | [time-stamp_gzip]: https://img.shields.io/bundlephobia/minzip/time-stamp?label=gzip&color=brightgreen&style=flat-square 110 | [lit-date_gzip]: https://img.shields.io/bundlephobia/minzip/lit-date?label=gzip&color=brightgreen&style=flat-square 111 | [dateformat_gzip]: https://img.shields.io/bundlephobia/minzip/dateformat?label=gzip&color=brightgreen&style=flat-square 112 | [fecha_gzip]: https://img.shields.io/bundlephobia/minzip/fecha?label=gzip&color=brightgreen&style=flat-square 113 | [dayjs_gzip]: https://img.shields.io/bundlephobia/minzip/dayjs?label=gzip&color=brightgreen&style=flat-square 114 | [date-fns_gzip]: https://img.shields.io/bundlephobia/minzip/date-fns?label=gzip&color=brightgreen&style=flat-square 115 | [moment_gzip]: https://img.shields.io/bundlephobia/minzip/moment?label=gzip&color=brightgreen&style=flat-square 116 | [luxon_gzip]: https://img.shields.io/bundlephobia/minzip/luxon?label=gzip&color=brightgreen&style=flat-square 117 | [tinytime_gzip]: https://img.shields.io/bundlephobia/minzip/tinytime?label=gzip&color=brightgreen&style=flat-square 118 | [tinydate_gzip]: https://img.shields.io/bundlephobia/minzip/tinydate?label=gzip&color=brightgreen&style=flat-square 119 | [date-format_gzip]: https://img.shields.io/bundlephobia/minzip/date-format?label=gzip&color=brightgreen&style=flat-square 120 | [formatoid_gzip]: https://img.shields.io/bundlephobia/minzip/formatoid?label=gzip&color=brightgreen&style=flat-square 121 | 122 | ## Contribute 123 | 124 | PRs accepted. 125 | 126 | ## License 127 | 128 | [MIT (c) 3846masa](https://github.com/3846masa/lit-date/blob/main/LICENSE) 129 | -------------------------------------------------------------------------------- /benchmarks/.gitignore: -------------------------------------------------------------------------------- 1 | /tmp 2 | /results/*.png 3 | -------------------------------------------------------------------------------- /benchmarks/.npmrc: -------------------------------------------------------------------------------- 1 | save-prefix='' 2 | enable-pre-post-scripts=true 3 | shell-emulator=true 4 | engine-strict=true 5 | -------------------------------------------------------------------------------- /benchmarks/README.md: -------------------------------------------------------------------------------- 1 | # Benchmark for `lit-date` 2 | 3 | ## Usage 4 | 5 | ### Benchmark on browser 6 | 7 | ```bash 8 | yarn && yarn benchmark 9 | ``` 10 | 11 | ### Bundle size 12 | 13 | ```bash 14 | yarn && yarn bundlesize 15 | ``` 16 | 17 | ## License 18 | 19 | [MIT (c) 3846masa](../LICENSE) 20 | -------------------------------------------------------------------------------- /benchmarks/karma.conf.js: -------------------------------------------------------------------------------- 1 | const usePoltly = !!(process.env.PLOTLY_USERNAME && process.env.PLOTLY_APIKEY); 2 | 3 | module.exports = (config) => { 4 | config.set({ 5 | benchmarkPlotlyReporter: { 6 | apiKey: process.env.PLOTLY_APIKEY, 7 | cloudFilename: [ 8 | 'lit-date_basic_chrome', 9 | 'lit-date_advanced_chrome', 10 | 'lit-date_basic_firefox', 11 | 'lit-date_advanced_firefox', 12 | ], 13 | imageFilename: [null, null, null, null], 14 | makeFigure: (results) => { 15 | const typeList = [ 16 | { browser: 'Chrome', suite: 'Basic usage' }, 17 | { browser: 'Chrome', suite: 'Advanced usage' }, 18 | { browser: 'Firefox', suite: 'Basic usage' }, 19 | { browser: 'Firefox', suite: 'Advanced usage' }, 20 | ]; 21 | return typeList 22 | .map((type) => results.filter((r) => r.suite === type.suite && r.browser.includes(type.browser))) 23 | .map((results) => makeFigureDflt(results)); 24 | }, 25 | username: process.env.PLOTLY_USERNAME, 26 | }, 27 | benchmarkReporter: { 28 | formatSuiteHeading: (suiteName, browser, { style }) => { 29 | return `\n${style.suite(suiteName)} ${style.browser(`[${browser}]`)}\n`; 30 | }, 31 | showSuiteSummary: true, 32 | }, 33 | browsers: ['FirefoxHeadless', 'ChromeHeadless'], 34 | 35 | concurrency: 1, 36 | files: [ 37 | { pattern: 'src/*.bench.js', watched: false }, 38 | { pattern: 'src/**/*.bench.js', watched: false }, 39 | ], 40 | frameworks: ['benchmark'], 41 | logLevel: config.LOG_ERROR, 42 | 43 | plugins: [ 44 | 'karma-benchmark-plotly-reporter', 45 | 'karma-benchmark', 46 | 'karma-benchmarkjs-reporter', 47 | 'karma-chrome-launcher', 48 | 'karma-firefox-launcher', 49 | 'karma-webpack', 50 | ], 51 | preprocessors: { 52 | 'src/*.bench.js': ['webpack'], 53 | 'src/**/*.bench.js': ['webpack'], 54 | }, 55 | reporters: usePoltly ? ['benchmark', 'benchmark-plotly'] : ['benchmark'], 56 | singleRun: true, 57 | 58 | webpack: { 59 | devtool: 'source-map', 60 | externals: { 61 | benchmark: 'Benchmark', 62 | }, 63 | }, 64 | webpackMiddleware: { 65 | stats: 'errors-only', 66 | }, 67 | }); 68 | }; 69 | 70 | function makeFigureDflt(results) { 71 | const trace = { 72 | error_x: { 73 | array: results.map((r) => r.hzDeviation), 74 | }, 75 | hoverinfo: 'x+text', 76 | marker: { 77 | color: results.map((r) => (r.name === 'lit-date' ? '#1565c0' : '#616161')), 78 | }, 79 | orientation: 'h', 80 | text: results.map((r) => [`Suite: ${r.suite}`, `Run: ${r.name}`, `Browser: ${r.browser}`].join('
')), 81 | type: 'bar', 82 | x: results.map((r) => r.hz), 83 | y: results.map((r) => [r.suite, r.name].join('
')), 84 | }; 85 | 86 | const longestLabel = Math.max(...results.map((r) => Math.max(r.suite.length, r.name.length))); 87 | 88 | return { 89 | data: [trace], 90 | layout: { 91 | margin: { 92 | l: 100 + 4 * longestLabel, 93 | }, 94 | xaxis: { 95 | title: 'Operations per second', 96 | }, 97 | yaxis: { 98 | autorange: 'reversed', 99 | tickcolor: 'rgba(0,0,0,0)', 100 | ticklen: 8, 101 | ticks: 'outside', 102 | }, 103 | }, 104 | }; 105 | } 106 | -------------------------------------------------------------------------------- /benchmarks/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "benchmarks", 3 | "private": true, 4 | "scripts": { 5 | "benchmark": "karma start" 6 | }, 7 | "dependencies": { 8 | "cdate": "0.0.7", 9 | "date-fns": "4.1.0", 10 | "date-format": "4.0.14", 11 | "dateformat": "5.0.3", 12 | "dayjs": "1.11.13", 13 | "fecha": "4.2.3", 14 | "formatoid": "1.2.5", 15 | "lit-date": "1.0.4", 16 | "luxon": "3.6.1", 17 | "moment": "2.30.1", 18 | "time-stamp": "2.2.0", 19 | "tinydate": "1.3.0", 20 | "tinytime": "0.2.6" 21 | }, 22 | "devDependencies": { 23 | "benchmark": "2.1.4", 24 | "karma": "6.4.4", 25 | "karma-benchmark": "1.0.4", 26 | "karma-benchmark-plotly-reporter": "1.0.0", 27 | "karma-benchmarkjs-reporter": "1.0.0", 28 | "karma-chrome-launcher": "3.2.0", 29 | "karma-firefox-launcher": "2.1.3", 30 | "karma-webpack": "5.0.1", 31 | "webpack": "5.99.9" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /benchmarks/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | cdate: 9 | specifier: 0.0.7 10 | version: 0.0.7 11 | date-fns: 12 | specifier: 4.1.0 13 | version: 4.1.0 14 | date-format: 15 | specifier: 4.0.14 16 | version: 4.0.14 17 | dateformat: 18 | specifier: 5.0.3 19 | version: 5.0.3 20 | dayjs: 21 | specifier: 1.11.13 22 | version: 1.11.13 23 | fecha: 24 | specifier: 4.2.3 25 | version: 4.2.3 26 | formatoid: 27 | specifier: 1.2.5 28 | version: 1.2.5 29 | lit-date: 30 | specifier: 1.0.4 31 | version: 1.0.4 32 | luxon: 33 | specifier: 3.6.1 34 | version: 3.6.1 35 | moment: 36 | specifier: 2.30.1 37 | version: 2.30.1 38 | time-stamp: 39 | specifier: 2.2.0 40 | version: 2.2.0 41 | tinydate: 42 | specifier: 1.3.0 43 | version: 1.3.0 44 | tinytime: 45 | specifier: 0.2.6 46 | version: 0.2.6 47 | 48 | devDependencies: 49 | benchmark: 50 | specifier: 2.1.4 51 | version: 2.1.4 52 | karma: 53 | specifier: 6.4.4 54 | version: 6.4.4 55 | karma-benchmark: 56 | specifier: 1.0.4 57 | version: 1.0.4(benchmark@2.1.4)(karma@6.4.4) 58 | karma-benchmark-plotly-reporter: 59 | specifier: 1.0.0 60 | version: 1.0.0 61 | karma-benchmarkjs-reporter: 62 | specifier: 1.0.0 63 | version: 1.0.0 64 | karma-chrome-launcher: 65 | specifier: 3.2.0 66 | version: 3.2.0 67 | karma-firefox-launcher: 68 | specifier: 2.1.3 69 | version: 2.1.3 70 | karma-webpack: 71 | specifier: 5.0.1 72 | version: 5.0.1(webpack@5.99.9) 73 | webpack: 74 | specifier: 5.99.9 75 | version: 5.99.9 76 | 77 | packages: 78 | 79 | /@colors/colors@1.5.0: 80 | resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} 81 | engines: {node: '>=0.1.90'} 82 | dev: true 83 | 84 | /@jridgewell/gen-mapping@0.3.3: 85 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 86 | engines: {node: '>=6.0.0'} 87 | dependencies: 88 | '@jridgewell/set-array': 1.1.2 89 | '@jridgewell/sourcemap-codec': 1.4.15 90 | '@jridgewell/trace-mapping': 0.3.25 91 | dev: true 92 | 93 | /@jridgewell/resolve-uri@3.1.1: 94 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 95 | engines: {node: '>=6.0.0'} 96 | dev: true 97 | 98 | /@jridgewell/set-array@1.1.2: 99 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 100 | engines: {node: '>=6.0.0'} 101 | dev: true 102 | 103 | /@jridgewell/source-map@0.3.5: 104 | resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} 105 | dependencies: 106 | '@jridgewell/gen-mapping': 0.3.3 107 | '@jridgewell/trace-mapping': 0.3.25 108 | dev: true 109 | 110 | /@jridgewell/sourcemap-codec@1.4.15: 111 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 112 | dev: true 113 | 114 | /@jridgewell/trace-mapping@0.3.25: 115 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 116 | dependencies: 117 | '@jridgewell/resolve-uri': 3.1.1 118 | '@jridgewell/sourcemap-codec': 1.4.15 119 | dev: true 120 | 121 | /@socket.io/component-emitter@3.1.0: 122 | resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} 123 | dev: true 124 | 125 | /@types/cookie@0.4.1: 126 | resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} 127 | dev: true 128 | 129 | /@types/cors@2.8.17: 130 | resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} 131 | dependencies: 132 | '@types/node': 20.11.4 133 | dev: true 134 | 135 | /@types/eslint-scope@3.7.7: 136 | resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} 137 | dependencies: 138 | '@types/eslint': 9.6.1 139 | '@types/estree': 1.0.6 140 | dev: true 141 | 142 | /@types/eslint@9.6.1: 143 | resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} 144 | dependencies: 145 | '@types/estree': 1.0.6 146 | '@types/json-schema': 7.0.15 147 | dev: true 148 | 149 | /@types/estree@1.0.6: 150 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 151 | dev: true 152 | 153 | /@types/json-schema@7.0.15: 154 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 155 | dev: true 156 | 157 | /@types/node@20.11.4: 158 | resolution: {integrity: sha512-6I0fMH8Aoy2lOejL3s4LhyIYX34DPwY8bl5xlNjBvUEk8OHrcuzsFt+Ied4LvJihbtXPM+8zUqdydfIti86v9g==} 159 | dependencies: 160 | undici-types: 5.26.5 161 | dev: true 162 | 163 | /@webassemblyjs/ast@1.14.1: 164 | resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} 165 | dependencies: 166 | '@webassemblyjs/helper-numbers': 1.13.2 167 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 168 | dev: true 169 | 170 | /@webassemblyjs/floating-point-hex-parser@1.13.2: 171 | resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} 172 | dev: true 173 | 174 | /@webassemblyjs/helper-api-error@1.13.2: 175 | resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} 176 | dev: true 177 | 178 | /@webassemblyjs/helper-buffer@1.14.1: 179 | resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} 180 | dev: true 181 | 182 | /@webassemblyjs/helper-numbers@1.13.2: 183 | resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} 184 | dependencies: 185 | '@webassemblyjs/floating-point-hex-parser': 1.13.2 186 | '@webassemblyjs/helper-api-error': 1.13.2 187 | '@xtuc/long': 4.2.2 188 | dev: true 189 | 190 | /@webassemblyjs/helper-wasm-bytecode@1.13.2: 191 | resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} 192 | dev: true 193 | 194 | /@webassemblyjs/helper-wasm-section@1.14.1: 195 | resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} 196 | dependencies: 197 | '@webassemblyjs/ast': 1.14.1 198 | '@webassemblyjs/helper-buffer': 1.14.1 199 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 200 | '@webassemblyjs/wasm-gen': 1.14.1 201 | dev: true 202 | 203 | /@webassemblyjs/ieee754@1.13.2: 204 | resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} 205 | dependencies: 206 | '@xtuc/ieee754': 1.2.0 207 | dev: true 208 | 209 | /@webassemblyjs/leb128@1.13.2: 210 | resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} 211 | dependencies: 212 | '@xtuc/long': 4.2.2 213 | dev: true 214 | 215 | /@webassemblyjs/utf8@1.13.2: 216 | resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} 217 | dev: true 218 | 219 | /@webassemblyjs/wasm-edit@1.14.1: 220 | resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} 221 | dependencies: 222 | '@webassemblyjs/ast': 1.14.1 223 | '@webassemblyjs/helper-buffer': 1.14.1 224 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 225 | '@webassemblyjs/helper-wasm-section': 1.14.1 226 | '@webassemblyjs/wasm-gen': 1.14.1 227 | '@webassemblyjs/wasm-opt': 1.14.1 228 | '@webassemblyjs/wasm-parser': 1.14.1 229 | '@webassemblyjs/wast-printer': 1.14.1 230 | dev: true 231 | 232 | /@webassemblyjs/wasm-gen@1.14.1: 233 | resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} 234 | dependencies: 235 | '@webassemblyjs/ast': 1.14.1 236 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 237 | '@webassemblyjs/ieee754': 1.13.2 238 | '@webassemblyjs/leb128': 1.13.2 239 | '@webassemblyjs/utf8': 1.13.2 240 | dev: true 241 | 242 | /@webassemblyjs/wasm-opt@1.14.1: 243 | resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} 244 | dependencies: 245 | '@webassemblyjs/ast': 1.14.1 246 | '@webassemblyjs/helper-buffer': 1.14.1 247 | '@webassemblyjs/wasm-gen': 1.14.1 248 | '@webassemblyjs/wasm-parser': 1.14.1 249 | dev: true 250 | 251 | /@webassemblyjs/wasm-parser@1.14.1: 252 | resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} 253 | dependencies: 254 | '@webassemblyjs/ast': 1.14.1 255 | '@webassemblyjs/helper-api-error': 1.13.2 256 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 257 | '@webassemblyjs/ieee754': 1.13.2 258 | '@webassemblyjs/leb128': 1.13.2 259 | '@webassemblyjs/utf8': 1.13.2 260 | dev: true 261 | 262 | /@webassemblyjs/wast-printer@1.14.1: 263 | resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} 264 | dependencies: 265 | '@webassemblyjs/ast': 1.14.1 266 | '@xtuc/long': 4.2.2 267 | dev: true 268 | 269 | /@xtuc/ieee754@1.2.0: 270 | resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} 271 | dev: true 272 | 273 | /@xtuc/long@4.2.2: 274 | resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} 275 | dev: true 276 | 277 | /accepts@1.3.8: 278 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 279 | engines: {node: '>= 0.6'} 280 | dependencies: 281 | mime-types: 2.1.35 282 | negotiator: 0.6.3 283 | dev: true 284 | 285 | /acorn@8.14.0: 286 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 287 | engines: {node: '>=0.4.0'} 288 | hasBin: true 289 | dev: true 290 | 291 | /ajv-formats@2.1.1(ajv@8.17.1): 292 | resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} 293 | peerDependencies: 294 | ajv: ^8.0.0 295 | peerDependenciesMeta: 296 | ajv: 297 | optional: true 298 | dependencies: 299 | ajv: 8.17.1 300 | dev: true 301 | 302 | /ajv-keywords@5.1.0(ajv@8.17.1): 303 | resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} 304 | peerDependencies: 305 | ajv: ^8.8.2 306 | dependencies: 307 | ajv: 8.17.1 308 | fast-deep-equal: 3.1.3 309 | dev: true 310 | 311 | /ajv@8.17.1: 312 | resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 313 | dependencies: 314 | fast-deep-equal: 3.1.3 315 | fast-uri: 3.0.6 316 | json-schema-traverse: 1.0.0 317 | require-from-string: 2.0.2 318 | dev: true 319 | 320 | /ansi-regex@2.1.1: 321 | resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} 322 | engines: {node: '>=0.10.0'} 323 | dev: true 324 | 325 | /ansi-regex@5.0.1: 326 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 327 | engines: {node: '>=8'} 328 | dev: true 329 | 330 | /ansi-styles@2.2.1: 331 | resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} 332 | engines: {node: '>=0.10.0'} 333 | dev: true 334 | 335 | /ansi-styles@4.3.0: 336 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 337 | engines: {node: '>=8'} 338 | dependencies: 339 | color-convert: 2.0.1 340 | dev: true 341 | 342 | /anymatch@3.1.3: 343 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 344 | engines: {node: '>= 8'} 345 | dependencies: 346 | normalize-path: 3.0.0 347 | picomatch: 2.3.1 348 | dev: true 349 | 350 | /balanced-match@1.0.2: 351 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 352 | dev: true 353 | 354 | /base64id@2.0.0: 355 | resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} 356 | engines: {node: ^4.5.0 || >= 5.9} 357 | dev: true 358 | 359 | /benchmark@2.1.4: 360 | resolution: {integrity: sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==} 361 | dependencies: 362 | lodash: 4.17.21 363 | platform: 1.3.6 364 | dev: true 365 | 366 | /binary-extensions@2.2.0: 367 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 368 | engines: {node: '>=8'} 369 | dev: true 370 | 371 | /body-parser@1.20.2: 372 | resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} 373 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 374 | dependencies: 375 | bytes: 3.1.2 376 | content-type: 1.0.5 377 | debug: 2.6.9 378 | depd: 2.0.0 379 | destroy: 1.2.0 380 | http-errors: 2.0.0 381 | iconv-lite: 0.4.24 382 | on-finished: 2.4.1 383 | qs: 6.11.0 384 | raw-body: 2.5.2 385 | type-is: 1.6.18 386 | unpipe: 1.0.0 387 | transitivePeerDependencies: 388 | - supports-color 389 | dev: true 390 | 391 | /brace-expansion@1.1.11: 392 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 393 | dependencies: 394 | balanced-match: 1.0.2 395 | concat-map: 0.0.1 396 | dev: true 397 | 398 | /brace-expansion@2.0.1: 399 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 400 | dependencies: 401 | balanced-match: 1.0.2 402 | dev: true 403 | 404 | /braces@3.0.2: 405 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 406 | engines: {node: '>=8'} 407 | dependencies: 408 | fill-range: 7.0.1 409 | dev: true 410 | 411 | /browserslist@4.24.2: 412 | resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} 413 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 414 | hasBin: true 415 | dependencies: 416 | caniuse-lite: 1.0.30001677 417 | electron-to-chromium: 1.5.50 418 | node-releases: 2.0.18 419 | update-browserslist-db: 1.1.1(browserslist@4.24.2) 420 | dev: true 421 | 422 | /buffer-from@1.1.2: 423 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 424 | dev: true 425 | 426 | /bytes@3.1.2: 427 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 428 | engines: {node: '>= 0.8'} 429 | dev: true 430 | 431 | /call-bind@1.0.5: 432 | resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} 433 | dependencies: 434 | function-bind: 1.1.2 435 | get-intrinsic: 1.2.2 436 | set-function-length: 1.2.0 437 | dev: true 438 | 439 | /caniuse-lite@1.0.30001677: 440 | resolution: {integrity: sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==} 441 | dev: true 442 | 443 | /cdate@0.0.7: 444 | resolution: {integrity: sha512-11EnUjVX6hwL0FcDNE2F0wh+0KnQieTfPUdPHNdQHbrvFdEbqfRULkA8nMcfT2tXCGw/ABRdYLqQ0SmbeWawTA==} 445 | dev: false 446 | 447 | /chalk@1.1.3: 448 | resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} 449 | engines: {node: '>=0.10.0'} 450 | dependencies: 451 | ansi-styles: 2.2.1 452 | escape-string-regexp: 1.0.5 453 | has-ansi: 2.0.0 454 | strip-ansi: 3.0.1 455 | supports-color: 2.0.0 456 | dev: true 457 | 458 | /chokidar@3.5.3: 459 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 460 | engines: {node: '>= 8.10.0'} 461 | dependencies: 462 | anymatch: 3.1.3 463 | braces: 3.0.2 464 | glob-parent: 5.1.2 465 | is-binary-path: 2.1.0 466 | is-glob: 4.0.3 467 | normalize-path: 3.0.0 468 | readdirp: 3.6.0 469 | optionalDependencies: 470 | fsevents: 2.3.3 471 | dev: true 472 | 473 | /chrome-trace-event@1.0.3: 474 | resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} 475 | engines: {node: '>=6.0'} 476 | dev: true 477 | 478 | /cliui@7.0.4: 479 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 480 | dependencies: 481 | string-width: 4.2.3 482 | strip-ansi: 6.0.1 483 | wrap-ansi: 7.0.0 484 | dev: true 485 | 486 | /color-convert@2.0.1: 487 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 488 | engines: {node: '>=7.0.0'} 489 | dependencies: 490 | color-name: 1.1.4 491 | dev: true 492 | 493 | /color-name@1.1.4: 494 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 495 | dev: true 496 | 497 | /commander@2.20.3: 498 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 499 | dev: true 500 | 501 | /concat-map@0.0.1: 502 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 503 | dev: true 504 | 505 | /connect@3.7.0: 506 | resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} 507 | engines: {node: '>= 0.10.0'} 508 | dependencies: 509 | debug: 2.6.9 510 | finalhandler: 1.1.2 511 | parseurl: 1.3.3 512 | utils-merge: 1.0.1 513 | transitivePeerDependencies: 514 | - supports-color 515 | dev: true 516 | 517 | /content-type@1.0.5: 518 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 519 | engines: {node: '>= 0.6'} 520 | dev: true 521 | 522 | /cookie@0.4.2: 523 | resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} 524 | engines: {node: '>= 0.6'} 525 | dev: true 526 | 527 | /cors@2.8.5: 528 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 529 | engines: {node: '>= 0.10'} 530 | dependencies: 531 | object-assign: 4.1.1 532 | vary: 1.1.2 533 | dev: true 534 | 535 | /custom-event@1.0.1: 536 | resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==} 537 | dev: true 538 | 539 | /date-fns@4.1.0: 540 | resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} 541 | dev: false 542 | 543 | /date-format@4.0.14: 544 | resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} 545 | engines: {node: '>=4.0'} 546 | 547 | /dateformat@5.0.3: 548 | resolution: {integrity: sha512-Kvr6HmPXUMerlLcLF+Pwq3K7apHpYmGDVqrxcDasBg86UcKeTSNWbEzU8bwdXnxnR44FtMhJAxI4Bov6Y/KUfA==} 549 | engines: {node: '>=12.20'} 550 | dev: false 551 | 552 | /dayjs@1.11.13: 553 | resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} 554 | dev: false 555 | 556 | /days@1.1.1: 557 | resolution: {integrity: sha512-vzeIwVsEIyA35GH4+mPd4hjVDNI87wYANyZFs0BHjBr5kIBH5zEl7LfD6Wr4SFZca4D3CU9IH1w4DuZLlXzKRw==} 558 | engines: {node: '>=0.10.0'} 559 | dev: false 560 | 561 | /debug@2.6.9: 562 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 563 | peerDependencies: 564 | supports-color: '*' 565 | peerDependenciesMeta: 566 | supports-color: 567 | optional: true 568 | dependencies: 569 | ms: 2.0.0 570 | dev: true 571 | 572 | /debug@4.3.4: 573 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 574 | engines: {node: '>=6.0'} 575 | peerDependencies: 576 | supports-color: '*' 577 | peerDependenciesMeta: 578 | supports-color: 579 | optional: true 580 | dependencies: 581 | ms: 2.1.2 582 | dev: true 583 | 584 | /define-data-property@1.1.1: 585 | resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} 586 | engines: {node: '>= 0.4'} 587 | dependencies: 588 | get-intrinsic: 1.2.2 589 | gopd: 1.0.1 590 | has-property-descriptors: 1.0.1 591 | dev: true 592 | 593 | /depd@2.0.0: 594 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 595 | engines: {node: '>= 0.8'} 596 | dev: true 597 | 598 | /destroy@1.2.0: 599 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 600 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 601 | dev: true 602 | 603 | /di@0.0.1: 604 | resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} 605 | dev: true 606 | 607 | /dom-serialize@2.2.1: 608 | resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==} 609 | dependencies: 610 | custom-event: 1.0.1 611 | ent: 2.2.0 612 | extend: 3.0.2 613 | void-elements: 2.0.1 614 | dev: true 615 | 616 | /ee-first@1.1.1: 617 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 618 | dev: true 619 | 620 | /electron-to-chromium@1.5.50: 621 | resolution: {integrity: sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==} 622 | dev: true 623 | 624 | /emoji-regex@8.0.0: 625 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 626 | dev: true 627 | 628 | /encodeurl@1.0.2: 629 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 630 | engines: {node: '>= 0.8'} 631 | dev: true 632 | 633 | /engine.io-parser@5.2.1: 634 | resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} 635 | engines: {node: '>=10.0.0'} 636 | dev: true 637 | 638 | /engine.io@6.5.4: 639 | resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} 640 | engines: {node: '>=10.2.0'} 641 | dependencies: 642 | '@types/cookie': 0.4.1 643 | '@types/cors': 2.8.17 644 | '@types/node': 20.11.4 645 | accepts: 1.3.8 646 | base64id: 2.0.0 647 | cookie: 0.4.2 648 | cors: 2.8.5 649 | debug: 4.3.4 650 | engine.io-parser: 5.2.1 651 | ws: 8.11.0 652 | transitivePeerDependencies: 653 | - bufferutil 654 | - supports-color 655 | - utf-8-validate 656 | dev: true 657 | 658 | /enhanced-resolve@5.17.1: 659 | resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} 660 | engines: {node: '>=10.13.0'} 661 | dependencies: 662 | graceful-fs: 4.2.11 663 | tapable: 2.2.1 664 | dev: true 665 | 666 | /ent@2.2.0: 667 | resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} 668 | dev: true 669 | 670 | /es-module-lexer@1.4.1: 671 | resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} 672 | dev: true 673 | 674 | /escalade@3.2.0: 675 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 676 | engines: {node: '>=6'} 677 | dev: true 678 | 679 | /escape-html@1.0.3: 680 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 681 | dev: true 682 | 683 | /escape-string-regexp@1.0.5: 684 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 685 | engines: {node: '>=0.8.0'} 686 | dev: true 687 | 688 | /eslint-scope@5.1.1: 689 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 690 | engines: {node: '>=8.0.0'} 691 | dependencies: 692 | esrecurse: 4.3.0 693 | estraverse: 4.3.0 694 | dev: true 695 | 696 | /esrecurse@4.3.0: 697 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 698 | engines: {node: '>=4.0'} 699 | dependencies: 700 | estraverse: 5.3.0 701 | dev: true 702 | 703 | /estraverse@4.3.0: 704 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 705 | engines: {node: '>=4.0'} 706 | dev: true 707 | 708 | /estraverse@5.3.0: 709 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 710 | engines: {node: '>=4.0'} 711 | dev: true 712 | 713 | /eventemitter3@4.0.7: 714 | resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} 715 | dev: true 716 | 717 | /events@3.3.0: 718 | resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 719 | engines: {node: '>=0.8.x'} 720 | dev: true 721 | 722 | /extend@3.0.2: 723 | resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 724 | dev: true 725 | 726 | /fast-deep-equal@3.1.3: 727 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 728 | dev: true 729 | 730 | /fast-uri@3.0.6: 731 | resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} 732 | dev: true 733 | 734 | /fecha@4.2.3: 735 | resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} 736 | dev: false 737 | 738 | /fill-range@7.0.1: 739 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 740 | engines: {node: '>=8'} 741 | dependencies: 742 | to-regex-range: 5.0.1 743 | dev: true 744 | 745 | /fillo@1.0.14: 746 | resolution: {integrity: sha512-XLFFqNMeODV7pEH70lDla0SdOOW2T34X+2VmtCLWC1TyhtTEvX5IddIwBqlZhVb1K8bOOB0EuOM00FMZ+Njmtg==} 747 | dev: false 748 | 749 | /finalhandler@1.1.2: 750 | resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} 751 | engines: {node: '>= 0.8'} 752 | dependencies: 753 | debug: 2.6.9 754 | encodeurl: 1.0.2 755 | escape-html: 1.0.3 756 | on-finished: 2.3.0 757 | parseurl: 1.3.3 758 | statuses: 1.5.0 759 | unpipe: 1.0.0 760 | transitivePeerDependencies: 761 | - supports-color 762 | dev: true 763 | 764 | /flatted@3.2.9: 765 | resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} 766 | dev: true 767 | 768 | /follow-redirects@1.15.5: 769 | resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} 770 | engines: {node: '>=4.0'} 771 | peerDependencies: 772 | debug: '*' 773 | peerDependenciesMeta: 774 | debug: 775 | optional: true 776 | dev: true 777 | 778 | /formatoid@1.2.5: 779 | resolution: {integrity: sha512-ADuqDTwrQd0800jF0G6tL3mWwO8aGStjypqvrwkhTnoQc2fD1hc9reGtrMiRmWK7ti1n2NUfy+6WKfJ+AJUsvA==} 780 | dependencies: 781 | days: 1.1.1 782 | fillo: 1.0.14 783 | months: 1.2.0 784 | parse-it: 1.0.10 785 | dev: false 786 | 787 | /fs-extra@8.1.0: 788 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 789 | engines: {node: '>=6 <7 || >=8'} 790 | dependencies: 791 | graceful-fs: 4.2.11 792 | jsonfile: 4.0.0 793 | universalify: 0.1.2 794 | dev: true 795 | 796 | /fs.realpath@1.0.0: 797 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 798 | dev: true 799 | 800 | /fsevents@2.3.3: 801 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 802 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 803 | os: [darwin] 804 | requiresBuild: true 805 | dev: true 806 | optional: true 807 | 808 | /function-bind@1.1.2: 809 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 810 | dev: true 811 | 812 | /get-caller-file@2.0.5: 813 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 814 | engines: {node: 6.* || 8.* || >= 10.*} 815 | dev: true 816 | 817 | /get-intrinsic@1.2.2: 818 | resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} 819 | dependencies: 820 | function-bind: 1.1.2 821 | has-proto: 1.0.1 822 | has-symbols: 1.0.3 823 | hasown: 2.0.0 824 | dev: true 825 | 826 | /glob-parent@5.1.2: 827 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 828 | engines: {node: '>= 6'} 829 | dependencies: 830 | is-glob: 4.0.3 831 | dev: true 832 | 833 | /glob-to-regexp@0.4.1: 834 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 835 | dev: true 836 | 837 | /glob@7.2.3: 838 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 839 | deprecated: Glob versions prior to v9 are no longer supported 840 | dependencies: 841 | fs.realpath: 1.0.0 842 | inflight: 1.0.6 843 | inherits: 2.0.4 844 | minimatch: 3.1.2 845 | once: 1.4.0 846 | path-is-absolute: 1.0.1 847 | dev: true 848 | 849 | /gopd@1.0.1: 850 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 851 | dependencies: 852 | get-intrinsic: 1.2.2 853 | dev: true 854 | 855 | /graceful-fs@4.2.11: 856 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 857 | dev: true 858 | 859 | /has-ansi@2.0.0: 860 | resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} 861 | engines: {node: '>=0.10.0'} 862 | dependencies: 863 | ansi-regex: 2.1.1 864 | dev: true 865 | 866 | /has-flag@4.0.0: 867 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 868 | engines: {node: '>=8'} 869 | dev: true 870 | 871 | /has-property-descriptors@1.0.1: 872 | resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} 873 | dependencies: 874 | get-intrinsic: 1.2.2 875 | dev: true 876 | 877 | /has-proto@1.0.1: 878 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 879 | engines: {node: '>= 0.4'} 880 | dev: true 881 | 882 | /has-symbols@1.0.3: 883 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 884 | engines: {node: '>= 0.4'} 885 | dev: true 886 | 887 | /hasown@2.0.0: 888 | resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} 889 | engines: {node: '>= 0.4'} 890 | dependencies: 891 | function-bind: 1.1.2 892 | dev: true 893 | 894 | /http-errors@2.0.0: 895 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 896 | engines: {node: '>= 0.8'} 897 | dependencies: 898 | depd: 2.0.0 899 | inherits: 2.0.4 900 | setprototypeof: 1.2.0 901 | statuses: 2.0.1 902 | toidentifier: 1.0.1 903 | dev: true 904 | 905 | /http-proxy@1.18.1: 906 | resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} 907 | engines: {node: '>=8.0.0'} 908 | dependencies: 909 | eventemitter3: 4.0.7 910 | follow-redirects: 1.15.5 911 | requires-port: 1.0.0 912 | transitivePeerDependencies: 913 | - debug 914 | dev: true 915 | 916 | /iconv-lite@0.4.24: 917 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 918 | engines: {node: '>=0.10.0'} 919 | dependencies: 920 | safer-buffer: 2.1.2 921 | dev: true 922 | 923 | /inflight@1.0.6: 924 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 925 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 926 | dependencies: 927 | once: 1.4.0 928 | wrappy: 1.0.2 929 | dev: true 930 | 931 | /inherits@2.0.4: 932 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 933 | dev: true 934 | 935 | /is-binary-path@2.1.0: 936 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 937 | engines: {node: '>=8'} 938 | dependencies: 939 | binary-extensions: 2.2.0 940 | dev: true 941 | 942 | /is-docker@2.2.1: 943 | resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} 944 | engines: {node: '>=8'} 945 | hasBin: true 946 | dev: true 947 | 948 | /is-extglob@2.1.1: 949 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 950 | engines: {node: '>=0.10.0'} 951 | dev: true 952 | 953 | /is-fullwidth-code-point@3.0.0: 954 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 955 | engines: {node: '>=8'} 956 | dev: true 957 | 958 | /is-glob@4.0.3: 959 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 960 | engines: {node: '>=0.10.0'} 961 | dependencies: 962 | is-extglob: 2.1.1 963 | dev: true 964 | 965 | /is-number@7.0.0: 966 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 967 | engines: {node: '>=0.12.0'} 968 | dev: true 969 | 970 | /is-wsl@2.2.0: 971 | resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} 972 | engines: {node: '>=8'} 973 | dependencies: 974 | is-docker: 2.2.1 975 | dev: true 976 | 977 | /isbinaryfile@4.0.10: 978 | resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} 979 | engines: {node: '>= 8.0.0'} 980 | dev: true 981 | 982 | /isexe@2.0.0: 983 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 984 | dev: true 985 | 986 | /jest-worker@27.5.1: 987 | resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} 988 | engines: {node: '>= 10.13.0'} 989 | dependencies: 990 | '@types/node': 20.11.4 991 | merge-stream: 2.0.0 992 | supports-color: 8.1.1 993 | dev: true 994 | 995 | /json-parse-even-better-errors@2.3.1: 996 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 997 | dev: true 998 | 999 | /json-schema-traverse@1.0.0: 1000 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 1001 | dev: true 1002 | 1003 | /jsonfile@4.0.0: 1004 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 1005 | optionalDependencies: 1006 | graceful-fs: 4.2.11 1007 | dev: true 1008 | 1009 | /karma-benchmark-json-reporter@1.0.1: 1010 | resolution: {integrity: sha512-mbt+5HJFN2nhfBIeT0x9yoq07T1Qx4Dlmqlc92TBYY73UNHty/9npG/wd9Er7M1baCrwG8RtO4DBeSJRQKeSeQ==} 1011 | dev: true 1012 | 1013 | /karma-benchmark-plotly-reporter@1.0.0: 1014 | resolution: {integrity: sha512-zYzLwy/99JA2vWc/z3MlqVdttt3MRiQ/3wOr6/2RBNyH+YG6jeDKTVbikOBK1TMByU4lsEdUVALnXeMXWx/Ang==} 1015 | dependencies: 1016 | karma-benchmark-json-reporter: 1.0.1 1017 | plotly: 1.0.6 1018 | dev: true 1019 | 1020 | /karma-benchmark@1.0.4(benchmark@2.1.4)(karma@6.4.4): 1021 | resolution: {integrity: sha512-e9YmWrX3xk7BSosBaL/7lg0ZKSOpwQySKlLb1xa2m5VbwMVFffS29QB9f2UCT7+aMCnJlNRWjcKym4Ch/60OsA==} 1022 | peerDependencies: 1023 | benchmark: ^2.1.4 1024 | karma: ^4.2.0 1025 | dependencies: 1026 | benchmark: 2.1.4 1027 | karma: 6.4.4 1028 | lodash: 4.17.15 1029 | platform: 1.3.5 1030 | dev: true 1031 | 1032 | /karma-benchmarkjs-reporter@1.0.0: 1033 | resolution: {integrity: sha512-DIp3qgYzJsBxkeSlTuxGzq9gtvlu9Sr8u3BtroTg0IyyJoP9HhQscpqinXyO1YswzACg2ITq/PAvX3hvyQiTKA==} 1034 | dependencies: 1035 | chalk: 1.1.3 1036 | lodash: 4.17.21 1037 | strip-ansi: 3.0.1 1038 | dev: true 1039 | 1040 | /karma-chrome-launcher@3.2.0: 1041 | resolution: {integrity: sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==} 1042 | dependencies: 1043 | which: 1.3.1 1044 | dev: true 1045 | 1046 | /karma-firefox-launcher@2.1.3: 1047 | resolution: {integrity: sha512-LMM2bseebLbYjODBOVt7TCPP9OI2vZIXCavIXhkO9m+10Uj5l7u/SKoeRmYx8FYHTVGZSpk6peX+3BMHC1WwNw==} 1048 | dependencies: 1049 | is-wsl: 2.2.0 1050 | which: 3.0.1 1051 | dev: true 1052 | 1053 | /karma-webpack@5.0.1(webpack@5.99.9): 1054 | resolution: {integrity: sha512-oo38O+P3W2mSPCSUrQdySSPv1LvPpXP+f+bBimNomS5sW+1V4SuhCuW8TfJzV+rDv921w2fDSDw0xJbPe6U+kQ==} 1055 | engines: {node: '>= 18'} 1056 | peerDependencies: 1057 | webpack: ^5.0.0 1058 | dependencies: 1059 | glob: 7.2.3 1060 | minimatch: 9.0.3 1061 | webpack: 5.99.9 1062 | webpack-merge: 4.2.2 1063 | dev: true 1064 | 1065 | /karma@6.4.4: 1066 | resolution: {integrity: sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==} 1067 | engines: {node: '>= 10'} 1068 | hasBin: true 1069 | dependencies: 1070 | '@colors/colors': 1.5.0 1071 | body-parser: 1.20.2 1072 | braces: 3.0.2 1073 | chokidar: 3.5.3 1074 | connect: 3.7.0 1075 | di: 0.0.1 1076 | dom-serialize: 2.2.1 1077 | glob: 7.2.3 1078 | graceful-fs: 4.2.11 1079 | http-proxy: 1.18.1 1080 | isbinaryfile: 4.0.10 1081 | lodash: 4.17.21 1082 | log4js: 6.9.1 1083 | mime: 2.6.0 1084 | minimatch: 3.1.2 1085 | mkdirp: 0.5.6 1086 | qjobs: 1.2.0 1087 | range-parser: 1.2.1 1088 | rimraf: 3.0.2 1089 | socket.io: 4.7.4 1090 | source-map: 0.6.1 1091 | tmp: 0.2.1 1092 | ua-parser-js: 0.7.37 1093 | yargs: 16.2.0 1094 | transitivePeerDependencies: 1095 | - bufferutil 1096 | - debug 1097 | - supports-color 1098 | - utf-8-validate 1099 | dev: true 1100 | 1101 | /lit-date@1.0.4: 1102 | resolution: {integrity: sha512-OsYVNNBtiwEmunPI9eYkgRMPi0L8R7qIfMo5f0eeX1DF4LngS1o0d+8/bm1hBD7nhev84sJ+i9/y8TxYFCXWmw==} 1103 | dev: false 1104 | 1105 | /loader-runner@4.3.0: 1106 | resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} 1107 | engines: {node: '>=6.11.5'} 1108 | dev: true 1109 | 1110 | /lodash@4.17.15: 1111 | resolution: {integrity: sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==} 1112 | dev: true 1113 | 1114 | /lodash@4.17.21: 1115 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1116 | dev: true 1117 | 1118 | /log4js@6.9.1: 1119 | resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} 1120 | engines: {node: '>=8.0'} 1121 | dependencies: 1122 | date-format: 4.0.14 1123 | debug: 4.3.4 1124 | flatted: 3.2.9 1125 | rfdc: 1.3.0 1126 | streamroller: 3.1.5 1127 | transitivePeerDependencies: 1128 | - supports-color 1129 | dev: true 1130 | 1131 | /luxon@3.6.1: 1132 | resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==} 1133 | engines: {node: '>=12'} 1134 | dev: false 1135 | 1136 | /media-typer@0.3.0: 1137 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 1138 | engines: {node: '>= 0.6'} 1139 | dev: true 1140 | 1141 | /merge-stream@2.0.0: 1142 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1143 | dev: true 1144 | 1145 | /mime-db@1.52.0: 1146 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1147 | engines: {node: '>= 0.6'} 1148 | dev: true 1149 | 1150 | /mime-types@2.1.35: 1151 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1152 | engines: {node: '>= 0.6'} 1153 | dependencies: 1154 | mime-db: 1.52.0 1155 | dev: true 1156 | 1157 | /mime@2.6.0: 1158 | resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} 1159 | engines: {node: '>=4.0.0'} 1160 | hasBin: true 1161 | dev: true 1162 | 1163 | /minimatch@3.1.2: 1164 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1165 | dependencies: 1166 | brace-expansion: 1.1.11 1167 | dev: true 1168 | 1169 | /minimatch@9.0.3: 1170 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1171 | engines: {node: '>=16 || 14 >=14.17'} 1172 | dependencies: 1173 | brace-expansion: 2.0.1 1174 | dev: true 1175 | 1176 | /minimist@1.2.8: 1177 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1178 | dev: true 1179 | 1180 | /mkdirp@0.5.6: 1181 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1182 | hasBin: true 1183 | dependencies: 1184 | minimist: 1.2.8 1185 | dev: true 1186 | 1187 | /moment@2.30.1: 1188 | resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} 1189 | dev: false 1190 | 1191 | /months@1.2.0: 1192 | resolution: {integrity: sha512-zFM7hUpziSYGk2DNObYGWgHdRRxAOgjl8CC1Rbl50p/q0rGDsREfk0nbxxmSIquVi/lEAuUY8nwbwkZ8biNCOQ==} 1193 | engines: {node: '>=0.10.0'} 1194 | dev: false 1195 | 1196 | /ms@2.0.0: 1197 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1198 | dev: true 1199 | 1200 | /ms@2.1.2: 1201 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1202 | dev: true 1203 | 1204 | /negotiator@0.6.3: 1205 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 1206 | engines: {node: '>= 0.6'} 1207 | dev: true 1208 | 1209 | /neo-async@2.6.2: 1210 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 1211 | dev: true 1212 | 1213 | /node-releases@2.0.18: 1214 | resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} 1215 | dev: true 1216 | 1217 | /normalize-path@3.0.0: 1218 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1219 | engines: {node: '>=0.10.0'} 1220 | dev: true 1221 | 1222 | /object-assign@4.1.1: 1223 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1224 | engines: {node: '>=0.10.0'} 1225 | dev: true 1226 | 1227 | /object-inspect@1.13.1: 1228 | resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} 1229 | dev: true 1230 | 1231 | /on-finished@2.3.0: 1232 | resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} 1233 | engines: {node: '>= 0.8'} 1234 | dependencies: 1235 | ee-first: 1.1.1 1236 | dev: true 1237 | 1238 | /on-finished@2.4.1: 1239 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 1240 | engines: {node: '>= 0.8'} 1241 | dependencies: 1242 | ee-first: 1.1.1 1243 | dev: true 1244 | 1245 | /once@1.4.0: 1246 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1247 | dependencies: 1248 | wrappy: 1.0.2 1249 | dev: true 1250 | 1251 | /parse-it@1.0.10: 1252 | resolution: {integrity: sha512-VAG4EuoNd2TT2wSRUuKyLEkZR3MhdWc+3UPp5CDQzqSt/FiniG+yJ5RXyJYiuzVAMEKL4d97gx6O3LR5jEB3uQ==} 1253 | dependencies: 1254 | regex-escape: 3.4.10 1255 | dev: false 1256 | 1257 | /parseurl@1.3.3: 1258 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1259 | engines: {node: '>= 0.8'} 1260 | dev: true 1261 | 1262 | /path-is-absolute@1.0.1: 1263 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1264 | engines: {node: '>=0.10.0'} 1265 | dev: true 1266 | 1267 | /picocolors@1.1.1: 1268 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1269 | dev: true 1270 | 1271 | /picomatch@2.3.1: 1272 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1273 | engines: {node: '>=8.6'} 1274 | dev: true 1275 | 1276 | /platform@1.3.5: 1277 | resolution: {integrity: sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==} 1278 | dev: true 1279 | 1280 | /platform@1.3.6: 1281 | resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} 1282 | dev: true 1283 | 1284 | /plotly@1.0.6: 1285 | resolution: {integrity: sha512-9DoPWfLJWxqXg6omu1Oj7qkvyOce0Nv+X+2SOoI9lG9mbvA7S/qGVHypwrGMV3r53ruW1Fl1A9a7ZIPt22FrpA==} 1286 | dependencies: 1287 | mkdirp: 0.5.6 1288 | dev: true 1289 | 1290 | /qjobs@1.2.0: 1291 | resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} 1292 | engines: {node: '>=0.9'} 1293 | dev: true 1294 | 1295 | /qs@6.11.0: 1296 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} 1297 | engines: {node: '>=0.6'} 1298 | dependencies: 1299 | side-channel: 1.0.4 1300 | dev: true 1301 | 1302 | /randombytes@2.1.0: 1303 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1304 | dependencies: 1305 | safe-buffer: 5.2.1 1306 | dev: true 1307 | 1308 | /range-parser@1.2.1: 1309 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 1310 | engines: {node: '>= 0.6'} 1311 | dev: true 1312 | 1313 | /raw-body@2.5.2: 1314 | resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} 1315 | engines: {node: '>= 0.8'} 1316 | dependencies: 1317 | bytes: 3.1.2 1318 | http-errors: 2.0.0 1319 | iconv-lite: 0.4.24 1320 | unpipe: 1.0.0 1321 | dev: true 1322 | 1323 | /readdirp@3.6.0: 1324 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1325 | engines: {node: '>=8.10.0'} 1326 | dependencies: 1327 | picomatch: 2.3.1 1328 | dev: true 1329 | 1330 | /regex-escape@3.4.10: 1331 | resolution: {integrity: sha512-qEqf7uzW+iYcKNLMDFnMkghhQBnGdivT6KqVQyKsyjSWnoFyooXVnxrw9dtv3AFLnD6VBGXxtZGAQNFGFTnCqA==} 1332 | dev: false 1333 | 1334 | /require-directory@2.1.1: 1335 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1336 | engines: {node: '>=0.10.0'} 1337 | dev: true 1338 | 1339 | /require-from-string@2.0.2: 1340 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 1341 | engines: {node: '>=0.10.0'} 1342 | dev: true 1343 | 1344 | /requires-port@1.0.0: 1345 | resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 1346 | dev: true 1347 | 1348 | /rfdc@1.3.0: 1349 | resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} 1350 | dev: true 1351 | 1352 | /rimraf@3.0.2: 1353 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1354 | deprecated: Rimraf versions prior to v4 are no longer supported 1355 | hasBin: true 1356 | dependencies: 1357 | glob: 7.2.3 1358 | dev: true 1359 | 1360 | /safe-buffer@5.2.1: 1361 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1362 | dev: true 1363 | 1364 | /safer-buffer@2.1.2: 1365 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1366 | dev: true 1367 | 1368 | /schema-utils@4.3.2: 1369 | resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} 1370 | engines: {node: '>= 10.13.0'} 1371 | dependencies: 1372 | '@types/json-schema': 7.0.15 1373 | ajv: 8.17.1 1374 | ajv-formats: 2.1.1(ajv@8.17.1) 1375 | ajv-keywords: 5.1.0(ajv@8.17.1) 1376 | dev: true 1377 | 1378 | /serialize-javascript@6.0.2: 1379 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 1380 | dependencies: 1381 | randombytes: 2.1.0 1382 | dev: true 1383 | 1384 | /set-function-length@1.2.0: 1385 | resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} 1386 | engines: {node: '>= 0.4'} 1387 | dependencies: 1388 | define-data-property: 1.1.1 1389 | function-bind: 1.1.2 1390 | get-intrinsic: 1.2.2 1391 | gopd: 1.0.1 1392 | has-property-descriptors: 1.0.1 1393 | dev: true 1394 | 1395 | /setprototypeof@1.2.0: 1396 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1397 | dev: true 1398 | 1399 | /side-channel@1.0.4: 1400 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1401 | dependencies: 1402 | call-bind: 1.0.5 1403 | get-intrinsic: 1.2.2 1404 | object-inspect: 1.13.1 1405 | dev: true 1406 | 1407 | /socket.io-adapter@2.5.2: 1408 | resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} 1409 | dependencies: 1410 | ws: 8.11.0 1411 | transitivePeerDependencies: 1412 | - bufferutil 1413 | - utf-8-validate 1414 | dev: true 1415 | 1416 | /socket.io-parser@4.2.4: 1417 | resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} 1418 | engines: {node: '>=10.0.0'} 1419 | dependencies: 1420 | '@socket.io/component-emitter': 3.1.0 1421 | debug: 4.3.4 1422 | transitivePeerDependencies: 1423 | - supports-color 1424 | dev: true 1425 | 1426 | /socket.io@4.7.4: 1427 | resolution: {integrity: sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==} 1428 | engines: {node: '>=10.2.0'} 1429 | dependencies: 1430 | accepts: 1.3.8 1431 | base64id: 2.0.0 1432 | cors: 2.8.5 1433 | debug: 4.3.4 1434 | engine.io: 6.5.4 1435 | socket.io-adapter: 2.5.2 1436 | socket.io-parser: 4.2.4 1437 | transitivePeerDependencies: 1438 | - bufferutil 1439 | - supports-color 1440 | - utf-8-validate 1441 | dev: true 1442 | 1443 | /source-map-support@0.5.21: 1444 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1445 | dependencies: 1446 | buffer-from: 1.1.2 1447 | source-map: 0.6.1 1448 | dev: true 1449 | 1450 | /source-map@0.6.1: 1451 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1452 | engines: {node: '>=0.10.0'} 1453 | dev: true 1454 | 1455 | /statuses@1.5.0: 1456 | resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} 1457 | engines: {node: '>= 0.6'} 1458 | dev: true 1459 | 1460 | /statuses@2.0.1: 1461 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 1462 | engines: {node: '>= 0.8'} 1463 | dev: true 1464 | 1465 | /streamroller@3.1.5: 1466 | resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} 1467 | engines: {node: '>=8.0'} 1468 | dependencies: 1469 | date-format: 4.0.14 1470 | debug: 4.3.4 1471 | fs-extra: 8.1.0 1472 | transitivePeerDependencies: 1473 | - supports-color 1474 | dev: true 1475 | 1476 | /string-width@4.2.3: 1477 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1478 | engines: {node: '>=8'} 1479 | dependencies: 1480 | emoji-regex: 8.0.0 1481 | is-fullwidth-code-point: 3.0.0 1482 | strip-ansi: 6.0.1 1483 | dev: true 1484 | 1485 | /strip-ansi@3.0.1: 1486 | resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} 1487 | engines: {node: '>=0.10.0'} 1488 | dependencies: 1489 | ansi-regex: 2.1.1 1490 | dev: true 1491 | 1492 | /strip-ansi@6.0.1: 1493 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1494 | engines: {node: '>=8'} 1495 | dependencies: 1496 | ansi-regex: 5.0.1 1497 | dev: true 1498 | 1499 | /supports-color@2.0.0: 1500 | resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} 1501 | engines: {node: '>=0.8.0'} 1502 | dev: true 1503 | 1504 | /supports-color@8.1.1: 1505 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1506 | engines: {node: '>=10'} 1507 | dependencies: 1508 | has-flag: 4.0.0 1509 | dev: true 1510 | 1511 | /tapable@2.2.1: 1512 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 1513 | engines: {node: '>=6'} 1514 | dev: true 1515 | 1516 | /terser-webpack-plugin@5.3.11(webpack@5.99.9): 1517 | resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} 1518 | engines: {node: '>= 10.13.0'} 1519 | peerDependencies: 1520 | '@swc/core': '*' 1521 | esbuild: '*' 1522 | uglify-js: '*' 1523 | webpack: ^5.1.0 1524 | peerDependenciesMeta: 1525 | '@swc/core': 1526 | optional: true 1527 | esbuild: 1528 | optional: true 1529 | uglify-js: 1530 | optional: true 1531 | dependencies: 1532 | '@jridgewell/trace-mapping': 0.3.25 1533 | jest-worker: 27.5.1 1534 | schema-utils: 4.3.2 1535 | serialize-javascript: 6.0.2 1536 | terser: 5.39.0 1537 | webpack: 5.99.9 1538 | dev: true 1539 | 1540 | /terser@5.39.0: 1541 | resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} 1542 | engines: {node: '>=10'} 1543 | hasBin: true 1544 | dependencies: 1545 | '@jridgewell/source-map': 0.3.5 1546 | acorn: 8.14.0 1547 | commander: 2.20.3 1548 | source-map-support: 0.5.21 1549 | dev: true 1550 | 1551 | /time-stamp@2.2.0: 1552 | resolution: {integrity: sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==} 1553 | engines: {node: '>=0.10.0'} 1554 | dev: false 1555 | 1556 | /tinydate@1.3.0: 1557 | resolution: {integrity: sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==} 1558 | engines: {node: '>=4'} 1559 | dev: false 1560 | 1561 | /tinytime@0.2.6: 1562 | resolution: {integrity: sha512-FdiVbzssIGxpi9tuDWcMnDb4dUeoYIA4rpsdx1wVzvCaGMk5pt4WyFg2G+MFZ08HGyWB/CM/ajQfLKp6CYiD3w==} 1563 | dev: false 1564 | 1565 | /tmp@0.2.1: 1566 | resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} 1567 | engines: {node: '>=8.17.0'} 1568 | dependencies: 1569 | rimraf: 3.0.2 1570 | dev: true 1571 | 1572 | /to-regex-range@5.0.1: 1573 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1574 | engines: {node: '>=8.0'} 1575 | dependencies: 1576 | is-number: 7.0.0 1577 | dev: true 1578 | 1579 | /toidentifier@1.0.1: 1580 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1581 | engines: {node: '>=0.6'} 1582 | dev: true 1583 | 1584 | /type-is@1.6.18: 1585 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 1586 | engines: {node: '>= 0.6'} 1587 | dependencies: 1588 | media-typer: 0.3.0 1589 | mime-types: 2.1.35 1590 | dev: true 1591 | 1592 | /ua-parser-js@0.7.37: 1593 | resolution: {integrity: sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==} 1594 | dev: true 1595 | 1596 | /undici-types@5.26.5: 1597 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1598 | dev: true 1599 | 1600 | /universalify@0.1.2: 1601 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 1602 | engines: {node: '>= 4.0.0'} 1603 | dev: true 1604 | 1605 | /unpipe@1.0.0: 1606 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1607 | engines: {node: '>= 0.8'} 1608 | dev: true 1609 | 1610 | /update-browserslist-db@1.1.1(browserslist@4.24.2): 1611 | resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} 1612 | hasBin: true 1613 | peerDependencies: 1614 | browserslist: '>= 4.21.0' 1615 | dependencies: 1616 | browserslist: 4.24.2 1617 | escalade: 3.2.0 1618 | picocolors: 1.1.1 1619 | dev: true 1620 | 1621 | /utils-merge@1.0.1: 1622 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 1623 | engines: {node: '>= 0.4.0'} 1624 | dev: true 1625 | 1626 | /vary@1.1.2: 1627 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1628 | engines: {node: '>= 0.8'} 1629 | dev: true 1630 | 1631 | /void-elements@2.0.1: 1632 | resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==} 1633 | engines: {node: '>=0.10.0'} 1634 | dev: true 1635 | 1636 | /watchpack@2.4.1: 1637 | resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} 1638 | engines: {node: '>=10.13.0'} 1639 | dependencies: 1640 | glob-to-regexp: 0.4.1 1641 | graceful-fs: 4.2.11 1642 | dev: true 1643 | 1644 | /webpack-merge@4.2.2: 1645 | resolution: {integrity: sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==} 1646 | dependencies: 1647 | lodash: 4.17.21 1648 | dev: true 1649 | 1650 | /webpack-sources@3.2.3: 1651 | resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} 1652 | engines: {node: '>=10.13.0'} 1653 | dev: true 1654 | 1655 | /webpack@5.99.9: 1656 | resolution: {integrity: sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==} 1657 | engines: {node: '>=10.13.0'} 1658 | hasBin: true 1659 | peerDependencies: 1660 | webpack-cli: '*' 1661 | peerDependenciesMeta: 1662 | webpack-cli: 1663 | optional: true 1664 | dependencies: 1665 | '@types/eslint-scope': 3.7.7 1666 | '@types/estree': 1.0.6 1667 | '@types/json-schema': 7.0.15 1668 | '@webassemblyjs/ast': 1.14.1 1669 | '@webassemblyjs/wasm-edit': 1.14.1 1670 | '@webassemblyjs/wasm-parser': 1.14.1 1671 | acorn: 8.14.0 1672 | browserslist: 4.24.2 1673 | chrome-trace-event: 1.0.3 1674 | enhanced-resolve: 5.17.1 1675 | es-module-lexer: 1.4.1 1676 | eslint-scope: 5.1.1 1677 | events: 3.3.0 1678 | glob-to-regexp: 0.4.1 1679 | graceful-fs: 4.2.11 1680 | json-parse-even-better-errors: 2.3.1 1681 | loader-runner: 4.3.0 1682 | mime-types: 2.1.35 1683 | neo-async: 2.6.2 1684 | schema-utils: 4.3.2 1685 | tapable: 2.2.1 1686 | terser-webpack-plugin: 5.3.11(webpack@5.99.9) 1687 | watchpack: 2.4.1 1688 | webpack-sources: 3.2.3 1689 | transitivePeerDependencies: 1690 | - '@swc/core' 1691 | - esbuild 1692 | - uglify-js 1693 | dev: true 1694 | 1695 | /which@1.3.1: 1696 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 1697 | hasBin: true 1698 | dependencies: 1699 | isexe: 2.0.0 1700 | dev: true 1701 | 1702 | /which@3.0.1: 1703 | resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} 1704 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 1705 | hasBin: true 1706 | dependencies: 1707 | isexe: 2.0.0 1708 | dev: true 1709 | 1710 | /wrap-ansi@7.0.0: 1711 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1712 | engines: {node: '>=10'} 1713 | dependencies: 1714 | ansi-styles: 4.3.0 1715 | string-width: 4.2.3 1716 | strip-ansi: 6.0.1 1717 | dev: true 1718 | 1719 | /wrappy@1.0.2: 1720 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1721 | dev: true 1722 | 1723 | /ws@8.11.0: 1724 | resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} 1725 | engines: {node: '>=10.0.0'} 1726 | peerDependencies: 1727 | bufferutil: ^4.0.1 1728 | utf-8-validate: ^5.0.2 1729 | peerDependenciesMeta: 1730 | bufferutil: 1731 | optional: true 1732 | utf-8-validate: 1733 | optional: true 1734 | dev: true 1735 | 1736 | /y18n@5.0.8: 1737 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1738 | engines: {node: '>=10'} 1739 | dev: true 1740 | 1741 | /yargs-parser@20.2.9: 1742 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 1743 | engines: {node: '>=10'} 1744 | dev: true 1745 | 1746 | /yargs@16.2.0: 1747 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 1748 | engines: {node: '>=10'} 1749 | dependencies: 1750 | cliui: 7.0.4 1751 | escalade: 3.2.0 1752 | get-caller-file: 2.0.5 1753 | require-directory: 2.1.1 1754 | string-width: 4.2.3 1755 | y18n: 5.0.8 1756 | yargs-parser: 20.2.9 1757 | dev: true 1758 | -------------------------------------------------------------------------------- /benchmarks/src/advanced.bench.js: -------------------------------------------------------------------------------- 1 | /* global suite, benchmark */ 2 | import 'moment/locale/ja'; 3 | import 'dayjs/locale/ja'; 4 | 5 | import { cdate } from 'cdate'; 6 | import { format as dateFnsFormat } from 'date-fns'; 7 | import { ja as dateFnsLocaleJa } from 'date-fns/locale'; 8 | import dateformat, { i18n as dateformatI18n } from 'dateformat'; 9 | import dayjs from 'dayjs'; 10 | import fecha from 'fecha'; 11 | import litdate from 'lit-date'; 12 | import { DateTime } from 'luxon'; 13 | import moment from 'moment'; 14 | 15 | const date = new Date('2000-01-06T12:34:56.789Z'); 16 | const expected = '1月6日(木)'; 17 | 18 | // Prepare 19 | const dayOfWeekToName = ({ dayOfWeek }) => ['日', '月', '火', '水', '木', '金', '土'][dayOfWeek]; 20 | Object.assign(dateformatI18n, { 21 | dayNames: ['日', '月', '火', '水', '木', '金', '土'], 22 | }); 23 | fecha.setGlobalDateI18n({ 24 | dayNamesShort: ['日', '月', '火', '水', '木', '金', '土'], 25 | }); 26 | const cdateJa = cdate() 27 | .handler({ 28 | ddd: (dt) => ['日', '月', '火', '水', '木', '金', '土'][dt.getDay()] || '', 29 | }) 30 | .cdateFn(); 31 | 32 | function assert(actual, expected) { 33 | if (actual !== expected) { 34 | throw new Error(`${actual} !== ${expected}`); 35 | } 36 | } 37 | 38 | suite('Advanced usage', () => { 39 | benchmark('moment', () => { 40 | const actual = moment(date).locale('ja').format('M月D日(ddd)'); 41 | assert(actual, expected); 42 | }); 43 | benchmark('luxon', () => { 44 | const actual = DateTime.fromJSDate(date).setLocale('ja').toFormat('M月d日(ccc)'); 45 | assert(actual, expected); 46 | }); 47 | benchmark('fecha', () => { 48 | const actual = fecha.format(date, 'M月D日(ddd)'); 49 | assert(actual, expected); 50 | }); 51 | benchmark('date-fns', () => { 52 | const actual = dateFnsFormat(date, 'M月d日(eee)', { locale: dateFnsLocaleJa }); 53 | assert(actual, expected); 54 | }); 55 | benchmark('dateformat', () => { 56 | const actual = dateformat(date, 'm月d日(ddd)'); 57 | assert(actual, expected); 58 | }); 59 | benchmark('cdate', () => { 60 | const actual = cdateJa(date).format('M月D日(ddd)'); 61 | assert(actual, expected); 62 | }); 63 | benchmark('dayjs', () => { 64 | const actual = dayjs(date).locale('ja').format('M月D日(ddd)'); 65 | assert(actual, expected); 66 | }); 67 | benchmark('lit-date', () => { 68 | const actual = litdate`${'M'}月${'D'}日(${dayOfWeekToName})`(date); 69 | assert(actual, expected); 70 | }); 71 | }); 72 | -------------------------------------------------------------------------------- /benchmarks/src/basic.bench.js: -------------------------------------------------------------------------------- 1 | /* global suite, benchmark */ 2 | import { cdate } from 'cdate'; 3 | import { format as dateFnsFormat } from 'date-fns'; 4 | import dateFormat2 from 'date-format'; 5 | import dateformat from 'dateformat'; 6 | import dayjs from 'dayjs'; 7 | import fecha from 'fecha'; 8 | import formatoid from 'formatoid'; 9 | import litdate from 'lit-date'; 10 | import { DateTime } from 'luxon'; 11 | import moment from 'moment'; 12 | import timeStamp from 'time-stamp'; 13 | import tinydate from 'tinydate'; 14 | import tinytime from 'tinytime'; 15 | 16 | const date = new Date('2000-01-06T12:34:56.789Z'); 17 | const expected = '2000/01/06'; 18 | 19 | function assert(actual, expected) { 20 | if (actual !== expected) { 21 | throw new Error(`${actual} !== ${expected}`); 22 | } 23 | } 24 | 25 | suite('Basic usage', () => { 26 | benchmark('moment', () => { 27 | const actual = moment(date).format('YYYY/MM/DD'); 28 | assert(actual, expected); 29 | }); 30 | benchmark('luxon', () => { 31 | const actual = DateTime.fromJSDate(date).toFormat('yyyy/MM/dd'); 32 | assert(actual, expected); 33 | }); 34 | benchmark('fecha', () => { 35 | const actual = fecha.format(date, 'YYYY/MM/DD'); 36 | assert(actual, expected); 37 | }); 38 | benchmark('date-fns', () => { 39 | const actual = dateFnsFormat(date, 'yyyy/MM/dd'); 40 | assert(actual, expected); 41 | }); 42 | benchmark('dayjs', () => { 43 | const actual = dayjs(date).format('YYYY/MM/DD'); 44 | assert(actual, expected); 45 | }); 46 | benchmark('dateformat', () => { 47 | const actual = dateformat(date, 'yyyy/mm/dd'); 48 | assert(actual, expected); 49 | }); 50 | benchmark('date-format', () => { 51 | const actual = dateFormat2.asString('yyyy/MM/dd', date); 52 | assert(actual, expected); 53 | }); 54 | benchmark('time-stamp', () => { 55 | const actual = timeStamp('YYYY/MM/DD', date); 56 | assert(actual, expected); 57 | }); 58 | benchmark('tinytime', () => { 59 | const actual = tinytime('{YYYY}/{Mo}/{DD}', { padDays: true, padMonth: true }).render(date); 60 | assert(actual, expected); 61 | }); 62 | benchmark('tinydate', () => { 63 | const actual = tinydate('{YYYY}/{MM}/{DD}')(date); 64 | assert(actual, expected); 65 | }); 66 | benchmark('formatoid', () => { 67 | const actual = formatoid(date, 'YYYY/MM/DD'); 68 | assert(actual, expected); 69 | }); 70 | benchmark('cdate', () => { 71 | const actual = cdate(date).format('YYYY/MM/DD'); 72 | assert(actual, expected); 73 | }); 74 | benchmark('lit-date', () => { 75 | const actual = litdate`${'YYYY'}/${'MM'}/${'DD'}`(date); 76 | assert(actual, expected); 77 | }); 78 | }); 79 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { configs as sharedConfigs } from '@3846masa/configs/eslint/config.mjs'; 2 | 3 | /** @type {import('eslint').Linter.FlatConfig[]} */ 4 | const configs = [ 5 | { 6 | ignores: ['/lib', '/coverage', '/benchmarks'], 7 | }, 8 | ...sharedConfigs, 9 | ]; 10 | 11 | export default configs; 12 | -------------------------------------------------------------------------------- /examples/index.mjs: -------------------------------------------------------------------------------- 1 | import litdate from 'lit-date'; 2 | 3 | const now = new Date(); 4 | 5 | // Basic 6 | { 7 | const format = litdate`${'YYYY'}-${'MM'}-${'DD'}T${'HH'}:${'mm'}:${'ss'}.${'SSS'}${'ZZ'}`; 8 | console.log(format(now)); 9 | } 10 | 11 | // With function 12 | { 13 | /** @param {import('lit-date').DateProxy} param */ 14 | const monthName = ({ month }) => 15 | ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][month - 1]; 16 | /** @param {import('lit-date').DateProxy} param */ 17 | const dayWithSuffix = ({ day }) => { 18 | if (Math.floor(day / 10) !== 1) { 19 | switch (day % 10) { 20 | case 1: 21 | return `${day.toString(10)}st`; 22 | case 2: 23 | return `${day.toString(10)}nd`; 24 | case 3: 25 | return `${day.toString(10)}rd`; 26 | } 27 | } 28 | return `${day.toString(10)}th`; 29 | }; 30 | const format = litdate`${monthName} ${dayWithSuffix}, ${'YYYY'}`; 31 | console.log(format(now)); 32 | } 33 | 34 | // Intl 35 | { 36 | /** @param {import('lit-date').DateProxy} param */ 37 | const dayOfWeekName = ({ dayOfWeek }) => ['日', '月', '火', '水', '木', '金', '土'][dayOfWeek]; 38 | const format = litdate`${'M'}月${'D'}日${dayOfWeekName}曜日`; 39 | console.log(format(now)); 40 | } 41 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('jest').Config} */ 2 | const config = { 3 | collectCoverage: true, 4 | coverageReporters: ['text', 'lcov'], 5 | extensionsToTreatAsEsm: ['.ts'], 6 | injectGlobals: false, 7 | roots: ['./src'], 8 | testMatch: ['**/__tests__/*.spec.ts'], 9 | transform: { 10 | '\\.+(ts)$': [ 11 | 'ts-jest', 12 | { 13 | tsconfig: 'tsconfig.test.json', 14 | }, 15 | ], 16 | }, 17 | }; 18 | 19 | module.exports = config; 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lit-date", 3 | "version": "1.0.4", 4 | "description": "Light-weight, faster datetime formatter for modern browsers", 5 | "keywords": [ 6 | "date", 7 | "datetime", 8 | "format", 9 | "formatter" 10 | ], 11 | "repository": "git@github.com:3846masa/lit-date.git", 12 | "license": "MIT", 13 | "author": "3846masa <3846masahiro+git@gmail.com>", 14 | "main": "lib/index.js", 15 | "jsdelivr": "lib/index.umd.js", 16 | "unpkg": "lib/index.umd.js", 17 | "module": "lib/index.mjs", 18 | "browser": "lib/index.umd.js", 19 | "types": "lib/index.d.ts", 20 | "files": [ 21 | "lib" 22 | ], 23 | "scripts": { 24 | "prebuild": "pnpm run clean", 25 | "build": "pnpm run \"/^build:.*/\"", 26 | "build:rollup": "rollup -c rollup.config.mjs", 27 | "clean": "rimraf lib", 28 | "format": "pnpm run --sequential \"/^format:.*/\"", 29 | "format:eslint": "eslint --fix .", 30 | "format:prettier": "prettier --write .", 31 | "lint": "pnpm run \"/^lint:.*/\"", 32 | "lint:eslint": "eslint src/", 33 | "lint:prettier": "prettier --check src/", 34 | "lint:tsc": "tsc --noEmit", 35 | "prepublish": "pnpm run build", 36 | "pretest": "pnpm run build", 37 | "test": "pnpm run \"/^test:.*/\"", 38 | "test:jest": "jest --coverage", 39 | "test:size-limit": "size-limit" 40 | }, 41 | "devDependencies": { 42 | "@3846masa/configs": "github:3846masa/configs#08ba2a3a3e0ec72be611e397595c56a5292ac4c9", 43 | "@jest/globals": "29.7.0", 44 | "@rollup/plugin-terser": "0.4.4", 45 | "@rollup/plugin-typescript": "12.1.2", 46 | "@size-limit/file": "11.2.0", 47 | "@types/eslint": "9.6.1", 48 | "jest": "29.7.0", 49 | "rimraf": "5.0.10", 50 | "rollup": "4.41.1", 51 | "size-limit": "11.2.0", 52 | "ts-jest": "29.3.4", 53 | "ts-node": "10.9.2", 54 | "typescript": "5.8.3" 55 | }, 56 | "packageManager": "pnpm@10.11.0", 57 | "size-limit": [ 58 | { 59 | "path": "./lib/index.umd.js", 60 | "limit": "1 kB" 61 | } 62 | ] 63 | } 64 | -------------------------------------------------------------------------------- /prettier.config.mjs: -------------------------------------------------------------------------------- 1 | import { config as sharedConfig } from '@3846masa/configs/prettier/config.mjs'; 2 | 3 | export default { 4 | ...sharedConfig, 5 | }; 6 | -------------------------------------------------------------------------------- /rollup.config.mjs: -------------------------------------------------------------------------------- 1 | import terser from '@rollup/plugin-terser'; 2 | import typescript from '@rollup/plugin-typescript'; 3 | 4 | const licenseComment = ` 5 | /*! 6 | * Copyright (c) 2018 3846masa 7 | * Released under the MIT license 8 | * https://3846masa.mit-license.org 9 | */ 10 | `.trim(); 11 | 12 | const defaultOpts = { 13 | input: './src/index.ts', 14 | output: { 15 | banner: licenseComment, 16 | name: 'litdate', 17 | sourcemap: true, 18 | }, 19 | plugins: [ 20 | typescript({ 21 | compilerOptions: { 22 | declaration: true, 23 | declarationDir: './lib', 24 | sourceMap: true, 25 | }, 26 | }), 27 | terser({ 28 | mangle: { 29 | properties: { 30 | regex: /^_/, 31 | }, 32 | }, 33 | output: { 34 | comments: /^!/, 35 | }, 36 | }), 37 | ], 38 | }; 39 | 40 | export default [ 41 | { 42 | input: defaultOpts.input, 43 | output: { 44 | ...defaultOpts.output, 45 | file: './lib/index.mjs', 46 | format: 'esm', 47 | }, 48 | plugins: [...defaultOpts.plugins], 49 | }, 50 | { 51 | input: defaultOpts.input, 52 | output: { 53 | ...defaultOpts.output, 54 | file: './lib/index.js', 55 | format: 'cjs', 56 | }, 57 | plugins: [...defaultOpts.plugins], 58 | }, 59 | { 60 | input: defaultOpts.input, 61 | output: { 62 | ...defaultOpts.output, 63 | file: './lib/index.umd.js', 64 | format: 'umd', 65 | }, 66 | plugins: [...defaultOpts.plugins], 67 | }, 68 | ]; 69 | -------------------------------------------------------------------------------- /src/DateProxy.ts: -------------------------------------------------------------------------------- 1 | const pad = (num: number, count = 2) => num.toString(10).padStart(count, '0'); 2 | 3 | class DateProxy { 4 | private _date: Date; 5 | constructor(date: Date | number) { 6 | this._date = new Date(date); 7 | } 8 | /** Month. */ 9 | get month() { 10 | return this._date.getMonth() + 1; 11 | } 12 | /** Month. */ 13 | get M() { 14 | return this.month; 15 | } 16 | /*+ Padded month */ 17 | get MM() { 18 | return pad(this.month); 19 | } 20 | /** Quarter */ 21 | get quarter() { 22 | return Math.ceil(this.month / 3); 23 | } 24 | /** Quarter */ 25 | get Q() { 26 | return this.quarter; 27 | } 28 | /** Day of month */ 29 | get day() { 30 | return this._date.getDate(); 31 | } 32 | /** Day of month */ 33 | get D() { 34 | return this.day; 35 | } 36 | /** Padded day of month */ 37 | get DD() { 38 | return pad(this.day); 39 | } 40 | /** Day of week */ 41 | get dayOfWeek() { 42 | return this._date.getDay(); 43 | } 44 | /** Day of week */ 45 | get d() { 46 | return this.dayOfWeek; 47 | } 48 | /** Year */ 49 | get year() { 50 | return this._date.getFullYear(); 51 | } 52 | /** Year (2 degits) */ 53 | get YY() { 54 | return this.year % 100; 55 | } 56 | /** Year (4 degits) */ 57 | get YYYY() { 58 | return this.year; 59 | } 60 | /** AM / PM */ 61 | get AM_PM() { 62 | return this.hour < 12 ? 'AM' : 'PM'; 63 | } 64 | /** AM / PM */ 65 | get A() { 66 | return this.AM_PM; 67 | } 68 | /** Hour (0-23) */ 69 | get hour() { 70 | return this._date.getHours(); 71 | } 72 | /** Hour (0-23) */ 73 | get H() { 74 | return this.hour; 75 | } 76 | /** Padded Hour (0-23) */ 77 | get HH() { 78 | return pad(this.hour); 79 | } 80 | /** Hour (1-12) */ 81 | get h() { 82 | const hour = this.hour % 12; 83 | return hour !== 0 ? hour : 12; 84 | } 85 | /** Padded Hour (1-12) */ 86 | get hh() { 87 | return pad(this.h); 88 | } 89 | /** Hour (1-24) */ 90 | get k() { 91 | return this.hour === 0 ? 24 : this.hour; 92 | } 93 | /** Padded Hour (1-24) */ 94 | get kk() { 95 | return pad(this.k); 96 | } 97 | /** Minute */ 98 | get minute() { 99 | return this._date.getMinutes(); 100 | } 101 | /** Minute */ 102 | get m() { 103 | return this.minute; 104 | } 105 | /** Padded Minute */ 106 | get mm() { 107 | return pad(this.minute); 108 | } 109 | /** Second */ 110 | get second() { 111 | return this._date.getSeconds(); 112 | } 113 | /** Second */ 114 | get s() { 115 | return this.second; 116 | } 117 | /** Padded Second */ 118 | get ss() { 119 | return pad(this.second); 120 | } 121 | /** Millisecond */ 122 | get milliSecond() { 123 | return this._date.getMilliseconds(); 124 | } 125 | /** Padded Millisecond (3 degits) */ 126 | get SSS() { 127 | return pad(this.milliSecond, 3); 128 | } 129 | /** Time Zone */ 130 | get Z() { 131 | const timezone = this._date.getTimezoneOffset(); 132 | if (timezone === 0) { 133 | return 'Z'; 134 | } 135 | return [timezone > 0 ? '-' : '+', pad(Math.floor(Math.abs(timezone) / 60)), ':', pad(timezone % 60)].join(''); 136 | } 137 | /** Time Zone (no colon) */ 138 | get ZZ() { 139 | const Z = this.Z; 140 | return Z.length === 1 ? Z : Z.replace(':', ''); 141 | } 142 | } 143 | 144 | export default DateProxy; 145 | -------------------------------------------------------------------------------- /src/__tests__/test.spec.ts: -------------------------------------------------------------------------------- 1 | import { afterEach, expect, jest, test } from '@jest/globals'; 2 | 3 | import type { DateProxy } from '../'; 4 | import fdate from '../'; 5 | 6 | afterEach(() => { 7 | jest.restoreAllMocks(); 8 | }); 9 | 10 | test('year', () => { 11 | const date = new Date('2019-05-07T00:00:00.000'); 12 | expect(fdate`${'year'}`(date)).toBe('2019'); 13 | expect(fdate`${'YYYY'}`(date)).toBe('2019'); 14 | expect(fdate`${'YY'}`(date)).toBe('19'); 15 | }); 16 | 17 | test('month', () => { 18 | const date = new Date('2019-05-07T00:00:00.000'); 19 | expect(fdate`${'month'}`(date)).toBe('5'); 20 | expect(fdate`${'MM'}`(date)).toBe('05'); 21 | expect(fdate`${'M'}`(date)).toBe('5'); 22 | }); 23 | 24 | test('day', () => { 25 | const date = new Date('2019-05-07T00:00:00.000'); 26 | expect(fdate`${'day'}`(date)).toBe('7'); 27 | expect(fdate`${'DD'}`(date)).toBe('07'); 28 | expect(fdate`${'D'}`(date)).toBe('7'); 29 | }); 30 | 31 | test('quarter', () => { 32 | expect(fdate`${'quarter'}`(new Date('2019-01-01T00:00:00.000'))).toBe('1'); 33 | expect(fdate`${'quarter'}`(new Date('2019-04-01T00:00:00.000'))).toBe('2'); 34 | expect(fdate`${'quarter'}`(new Date('2019-07-01T00:00:00.000'))).toBe('3'); 35 | expect(fdate`${'quarter'}`(new Date('2019-10-01T00:00:00.000'))).toBe('4'); 36 | 37 | expect(fdate`${'Q'}`(new Date('2019-03-01T00:00:00.000'))).toBe('1'); 38 | expect(fdate`${'Q'}`(new Date('2019-05-01T00:00:00.000'))).toBe('2'); 39 | expect(fdate`${'Q'}`(new Date('2019-09-01T00:00:00.000'))).toBe('3'); 40 | expect(fdate`${'Q'}`(new Date('2019-11-01T00:00:00.000'))).toBe('4'); 41 | }); 42 | 43 | test('dayOfWeek', () => { 44 | expect(fdate`${'dayOfWeek'}`(new Date('2019-01-01T00:00:00.000'))).toBe('2'); 45 | expect(fdate`${'d'}`(new Date('2019-01-06T00:00:00.000'))).toBe('0'); 46 | }); 47 | 48 | test('hour (AM)', () => { 49 | const date = new Date('2019-05-07T09:00:00.000'); 50 | expect(fdate`${'hour'}`(date)).toBe('9'); 51 | expect(fdate`${'HH'}`(date)).toBe('09'); 52 | expect(fdate`${'H'}`(date)).toBe('9'); 53 | expect(fdate`${'kk'}`(date)).toBe('09'); 54 | expect(fdate`${'k'}`(date)).toBe('9'); 55 | expect(fdate`${'hh'}`(date)).toBe('09'); 56 | expect(fdate`${'h'}`(date)).toBe('9'); 57 | }); 58 | 59 | test('hour (PM)', () => { 60 | const date = new Date('2019-05-07T21:00:00.000'); 61 | expect(fdate`${'hour'}`(date)).toBe('21'); 62 | expect(fdate`${'HH'}`(date)).toBe('21'); 63 | expect(fdate`${'H'}`(date)).toBe('21'); 64 | expect(fdate`${'kk'}`(date)).toBe('21'); 65 | expect(fdate`${'k'}`(date)).toBe('21'); 66 | expect(fdate`${'hh'}`(date)).toBe('09'); 67 | expect(fdate`${'h'}`(date)).toBe('9'); 68 | }); 69 | 70 | test('hour (00:00)', () => { 71 | const date = new Date('2019-05-07T00:00:00.000'); 72 | expect(fdate`${'hour'}`(date)).toBe('0'); 73 | expect(fdate`${'HH'}`(date)).toBe('00'); 74 | expect(fdate`${'H'}`(date)).toBe('0'); 75 | expect(fdate`${'kk'}`(date)).toBe('24'); 76 | expect(fdate`${'k'}`(date)).toBe('24'); 77 | expect(fdate`${'hh'}`(date)).toBe('12'); 78 | expect(fdate`${'h'}`(date)).toBe('12'); 79 | }); 80 | 81 | test('AM_PM', () => { 82 | expect(fdate`${'AM_PM'}`(new Date('2019-05-07T09:00:00.000'))).toBe('AM'); 83 | expect(fdate`${'A'}`(new Date('2019-05-07T15:00:00.000'))).toBe('PM'); 84 | }); 85 | 86 | test('minute', () => { 87 | const date = new Date('2019-05-07T09:05:00.000'); 88 | expect(fdate`${'minute'}`(date)).toBe('5'); 89 | expect(fdate`${'mm'}`(date)).toBe('05'); 90 | expect(fdate`${'m'}`(date)).toBe('5'); 91 | }); 92 | 93 | test('second', () => { 94 | const date = new Date('2019-05-07T09:05:08.000'); 95 | expect(fdate`${'second'}`(date)).toBe('8'); 96 | expect(fdate`${'s'}`(date)).toBe('8'); 97 | expect(fdate`${'ss'}`(date)).toBe('08'); 98 | }); 99 | 100 | test('milliSecond', () => { 101 | const date = new Date('2019-05-07T09:05:08.025'); 102 | expect(fdate`${'milliSecond'}`(date)).toBe('25'); 103 | expect(fdate`${'SSS'}`(date)).toBe('025'); 104 | }); 105 | 106 | test('TimeZone', () => { 107 | const date = new Date(); 108 | jest.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(-540); 109 | expect(fdate`${'Z'}`(date)).toBe('+09:00'); 110 | expect(fdate`${'ZZ'}`(date)).toBe('+0900'); 111 | 112 | jest.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(+660); 113 | expect(fdate`${'Z'}`(date)).toBe('-11:00'); 114 | expect(fdate`${'ZZ'}`(date)).toBe('-1100'); 115 | 116 | jest.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(0); 117 | expect(fdate`${'Z'}`(date)).toBe('Z'); 118 | expect(fdate`${'ZZ'}`(date)).toBe('Z'); 119 | }); 120 | 121 | test('i18n', () => { 122 | const date = new Date('2019-02-25T00:00:00.000'); 123 | const era = ({ year }: DateProxy) => { 124 | const eraYear = year - 1988; 125 | return eraYear === 1 ? '平成元年' : `平成${(year - 1988).toString(10)}`; 126 | }; 127 | const dayOfWeek = ({ dayOfWeek }: DateProxy) => '日月火水木金土'[dayOfWeek]; 128 | expect(fdate`${era}年${'M'}月${'D'}日(${dayOfWeek})`(date)).toBe('平成31年2月25日(月)'); 129 | }); 130 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import DateProxy from './DateProxy'; 2 | import stringRaw from './string-raw'; 3 | 4 | type DateProxyType = DateProxy; 5 | type DateKeys = keyof DateProxy; 6 | type DateProxyFunction = (date: DateProxy) => unknown; 7 | 8 | const litdate = 9 | (strArr: TemplateStringsArray, ...args: (DateKeys | DateProxyFunction)[]) => 10 | (date: Date | number) => { 11 | const proxy = new DateProxy(date); 12 | return stringRaw(strArr, ...args.map((argv) => (typeof argv === 'string' ? proxy[argv] : argv(proxy)))); 13 | }; 14 | 15 | export type { DateKeys, DateProxyFunction, DateProxyType as DateProxy }; 16 | export default litdate; 17 | -------------------------------------------------------------------------------- /src/string-raw.ts: -------------------------------------------------------------------------------- 1 | const isChrome = typeof navigator !== 'undefined' && /Chrom(?:e|ium)/.test(navigator.userAgent); 2 | 3 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 4 | const loosePolyfill = (callSite: TemplateStringsArray, ...substitutions: any[]) => { 5 | let t = ''; 6 | const raw = callSite.raw; 7 | const length = raw.length - 1; 8 | for (let idx = 0; idx < length; idx++) { 9 | // eslint-disable-next-line @typescript-eslint/restrict-plus-operands 10 | t += raw[idx] + substitutions[idx]; 11 | } 12 | // eslint-disable-next-line @typescript-eslint/restrict-plus-operands 13 | return t + raw[length]; 14 | }; 15 | 16 | // NOTE: Use polyfill because Chrome has performance issue for String.raw 17 | const stringRaw: typeof String.raw = isChrome || typeof String.raw === 'undefined' ? loosePolyfill : String.raw; 18 | 19 | export default stringRaw; 20 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": true, 4 | "baseUrl": ".", 5 | "esModuleInterop": true, 6 | "lib": ["DOM", "ESNext"], 7 | "moduleResolution": "node", 8 | "noEmit": true, 9 | "paths": { 10 | "lit-date": ["./src/index.ts"] 11 | }, 12 | "target": "ESNext" 13 | }, 14 | "exclude": ["lib/", "benchmarks/", "coverage/"], 15 | "extends": "@3846masa/configs/typescript/tsconfig.json", 16 | "include": ["**/*", "**/.*"] 17 | } 18 | -------------------------------------------------------------------------------- /tsconfig.test.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs" 4 | }, 5 | "extends": "./tsconfig.json" 6 | } 7 | --------------------------------------------------------------------------------