├── .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 | [](https://www.npmjs.com/package/lit-date)
4 | 
5 | [](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 |
--------------------------------------------------------------------------------