From a1fcc3ff21059a92834119d7c4a3cc9b57bdf58f Mon Sep 17 00:00:00 2001 From: Jacobtread Date: Thu, 26 Mar 2026 16:05:06 +1300 Subject: [PATCH] feat: replace prettier with oxfmt --- .github/ISSUE_TEMPLATE/bug_report.md | 11 +- .github/ISSUE_TEMPLATE/feature_request.md | 9 +- .github/ISSUE_TEMPLATE/task.md | 3 +- .../pull_request_template.md | 6 +- .gitignore | 5 +- .oxfmtrc.json | 9 + .prettierrc.cjs | 8 - .vscode/extensions.json | 3 + .vscode/settings.json | 8 + .zed/settings.json | 10 + CODE_OF_CONDUCT.md | 28 +- CONTRIBUTING.md | 82 +- cspell.json | 26 +- manifest.json | 2 +- package-lock.json | 6051 +++++++---------- package.json | 71 +- scripts/build.js | 42 +- scripts/dev.js | 106 +- src/commands/__mocks__/obsidian.ts | 4 +- src/commands/stopAllTimekeeps.test.ts | 25 +- src/commands/stopAllTimekeeps.ts | 3 +- src/commands/stopFileTimekeeps.test.ts | 17 +- src/commands/stopFileTimekeeps.ts | 35 +- src/components/pdf/renderer.ts | 582 +- src/components/timesheetApp.ts | 20 +- src/components/timesheetCounters.ts | 16 +- src/components/timesheetExportActions.ts | 30 +- src/components/timesheetRowContainer.ts | 4 +- src/components/timesheetRowContent.ts | 50 +- src/components/timesheetRowContentEditing.ts | 17 +- src/components/timesheetRowDuration.ts | 5 +- src/components/timesheetSaveError.ts | 6 +- src/components/timesheetStart.ts | 11 +- src/components/timesheetStartRunning.ts | 9 +- src/components/timesheetTable.ts | 11 +- src/export/index.ts | 7 +- src/export/markdown-table.ts | 11 +- src/export/pdf.ts | 5 +- src/main.ts | 51 +- src/output.ts | 6 +- src/settings-tab.ts | 73 +- src/settings.test.ts | 24 +- .../extracting/createCodeBlock.ts | 6 +- src/timekeep/create.test.ts | 166 +- src/timekeep/create.ts | 12 +- src/timekeep/parser.test.ts | 273 +- src/timekeep/parser.ts | 184 +- src/timekeep/queries.test.ts | 213 +- src/timekeep/queries.ts | 18 +- src/timekeep/schema.ts | 21 +- src/timekeep/sort.test.ts | 22 +- src/timekeep/sort.ts | 23 +- src/timekeep/start.test.ts | 36 +- src/timekeep/start.ts | 6 +- src/timekeep/update.ts | 21 +- src/utils/confirm-modal.ts | 6 +- src/utils/name.test.ts | 232 +- src/utils/name.ts | 3 +- src/utils/time.test.ts | 61 +- src/utils/time.ts | 30 +- src/views/timekeep-markdown-view.ts | 44 +- src/views/timekeep-merger-modal.ts | 25 +- .../Dataview-Longest-Ordered-Example.md | 3 +- test-vault/Obsidian Timekeep.md | 9 +- tsconfig.json | 38 +- versions.json | 2 +- vite.config.js | 92 +- 67 files changed, 3915 insertions(+), 5133 deletions(-) create mode 100644 .oxfmtrc.json delete mode 100644 .prettierrc.cjs create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 .zed/settings.json diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 853a1d8..14a8f2c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,27 +1,32 @@ --- name: Bug report about: Create a report to help us improve -title: 'Bug: ' +title: "Bug: " labels: bug assignees: jacobtread - --- **Describe the bug** + **To Reproduce** + -1. + +1. 2. 3. 4. **Expected behavior** + **Screenshots** + **Additional context** + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index f4b0503..68dfe38 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,20 +1,23 @@ --- name: Feature request about: Suggest an idea for this project -title: 'Feature:' +title: "Feature:" labels: enhancement assignees: jacobtread - --- ## Is your feature request related to a problem? Please describe. + ## Describe the solution you'd like - + + ## Describe alternatives you've considered + ## Additional context + diff --git a/.github/ISSUE_TEMPLATE/task.md b/.github/ISSUE_TEMPLATE/task.md index 8474476..fae5cfa 100644 --- a/.github/ISSUE_TEMPLATE/task.md +++ b/.github/ISSUE_TEMPLATE/task.md @@ -1,10 +1,9 @@ --- name: Task about: Template for a task that needs to be done -title: 'Task: ' +title: "Task: " labels: enhancement assignees: jacobtread - --- ## Description diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md index cb6cd26..b86f287 100644 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -1,9 +1,11 @@ ## Description ## Changes -- + +- ## Related Issues -- + +- ## Screenshots (If applicable) diff --git a/.gitignore b/.gitignore index 8d7be27..0d5d6cf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ -# vscode -.vscode + # Intellij *.iml @@ -25,4 +24,4 @@ dist coverage -test-vault/.obsidian \ No newline at end of file +test-vault/.obsidian diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000..05304e1 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,9 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "tabWidth": 4, + "trailingComma": "es5", + "semi": true, + "singleQuote": false, + "bracketSameLine": true, + "ignorePatterns": ["dist/**", "*.min.js", "README.md", "types/**"] +} diff --git a/.prettierrc.cjs b/.prettierrc.cjs deleted file mode 100644 index a75f2fb..0000000 --- a/.prettierrc.cjs +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import("prettier").Config} */ -module.exports = { - trailingComma: "es5", - tabWidth: 4, - semi: true, - singleQuote: false, - bracketSameLine: true, -}; diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..9879019 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["oxc.oxc-vscode"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1b3b7c1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "oxc.fmt.configPath": ".oxfmtrc.json", + "editor.defaultFormatter": "oxc.oxc-vscode", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.oxc": "always" + } +} diff --git a/.zed/settings.json b/.zed/settings.json new file mode 100644 index 0000000..51c9b3d --- /dev/null +++ b/.zed/settings.json @@ -0,0 +1,10 @@ +{ + "prettier": { + "allowed": false + }, + "formatter": { + "language_server": { + "name": "oxfmt" + } + } +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 4f9f060..9d31ce5 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -14,23 +14,23 @@ appearance, race, religion, or sexual identity and orientation. Examples of behaviour that contributes to a positive environment for our community include: -- Demonstrating empathy and kindness toward other people -- Being respectful of differing opinions, viewpoints, and experiences -- Giving and gracefully accepting constructive feedback -- Accepting responsibility and apologising to those affected by our mistakes, - and learning from the experience -- Focusing on what is best not just for us as individuals, but for the - overall community +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologising to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the + overall community Examples of unacceptable behaviour include: -- The use of sexualised language or imagery, and sexual attention or advances -- Trolling, insulting or derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or email - address, without their explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting +- The use of sexualised language or imagery, and sexual attention or advances +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email + address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting ## Our Responsibilities diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6f5f930..5697074 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,24 +8,24 @@ All types of contributions are encouraged and valued. See the [Table of Contents > And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about: > -> - Star the project -> - Tweet about it -> - Refer this project in your project's readme -> - Mention the project at local meetups and tell your friends/colleagues +> - Star the project +> - Tweet about it +> - Refer this project in your project's readme +> - Mention the project at local meetups and tell your friends/colleagues ## Table of Contents -- [Use of Generative AI](#use-of-generative-ai) -- [Code of Conduct](#code-of-conduct) -- [I Have a Question](#i-have-a-question) -- [I Want To Contribute](#i-want-to-contribute) -- [Reporting Bugs](#reporting-bugs) -- [Suggesting Enhancements](#suggesting-enhancements) -- [Styleguides](#styleguides) -- [Commit Messages](#commit-messages) -- [Join The Project Team](#join-the-project-team) +- [Use of Generative AI](#use-of-generative-ai) +- [Code of Conduct](#code-of-conduct) +- [I Have a Question](#i-have-a-question) +- [I Want To Contribute](#i-want-to-contribute) +- [Reporting Bugs](#reporting-bugs) +- [Suggesting Enhancements](#suggesting-enhancements) +- [Styleguides](#styleguides) +- [Commit Messages](#commit-messages) +- [Join The Project Team](#join-the-project-team) ## Use of Generative AI @@ -48,9 +48,9 @@ Before you ask a question, it is best to search for existing [Issues](https://gi If you then still feel the need to ask a question and need clarification, we recommend the following: -- Open an [Issue](https://github.com/jacobtread/obsidian-timekeep/issues/new). -- Provide as much context as you can about what you're running into. -- Provide project and platform versions (nodejs, npm, etc), depending on what seems relevant. +- Open an [Issue](https://github.com/jacobtread/obsidian-timekeep/issues/new). +- Provide as much context as you can about what you're running into. +- Provide project and platform versions (nodejs, npm, etc), depending on what seems relevant. We will then take care of the issue as soon as possible. @@ -83,16 +83,16 @@ Depending on how large the project is, you may want to outsource the questioning A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible. -- Make sure that you are using the latest version. -- Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (If you are looking for support, you might want to check [this section](#i-have-a-question)). -- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/jacobtread/obsidian-timekeep/issues?q=label%3Abug). -- Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue. -- Collect information about the bug: - - Stack trace (Traceback) - - OS, Platform and Version (Windows, Linux, macOS, x86, ARM) - - Version of the interpreter, compiler, SDK, runtime environment, package manager, depending on what seems relevant. - - Possibly your input and the output - - Can you reliably reproduce the issue? And can you also reproduce it with older versions? +- Make sure that you are using the latest version. +- Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (If you are looking for support, you might want to check [this section](#i-have-a-question)). +- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/jacobtread/obsidian-timekeep/issues?q=label%3Abug). +- Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue. +- Collect information about the bug: + - Stack trace (Traceback) + - OS, Platform and Version (Windows, Linux, macOS, x86, ARM) + - Version of the interpreter, compiler, SDK, runtime environment, package manager, depending on what seems relevant. + - Possibly your input and the output + - Can you reliably reproduce the issue? And can you also reproduce it with older versions? @@ -104,16 +104,16 @@ A good bug report shouldn't leave others needing to chase you up for more inform We use GitHub issues to track bugs and errors. If you run into an issue with the project: -- Open an [Issue](https://github.com/jacobtread/obsidian-timekeep/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.) -- Explain the behavior you would expect and the actual behavior. -- Please provide as much context as possible and describe the _reproduction steps_ that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case. -- Provide the information you collected in the previous section. +- Open an [Issue](https://github.com/jacobtread/obsidian-timekeep/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.) +- Explain the behavior you would expect and the actual behavior. +- Please provide as much context as possible and describe the _reproduction steps_ that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case. +- Provide the information you collected in the previous section. Once it's filed: -- The project team will label the issue accordingly. -- A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced. -- If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be implemented by someone. +- The project team will label the issue accordingly. +- A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced. +- If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be implemented by someone. @@ -125,9 +125,9 @@ This section guides you through submitting an enhancement suggestion for Obsidia #### Before Submitting an Enhancement -- Make sure that you are using the latest version. -- Perform a [search](https://github.com/jacobtread/obsidian-timekeep/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. -- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library. +- Make sure that you are using the latest version. +- Perform a [search](https://github.com/jacobtread/obsidian-timekeep/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. +- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library. @@ -135,11 +135,11 @@ This section guides you through submitting an enhancement suggestion for Obsidia Enhancement suggestions are tracked as [GitHub issues](https://github.com/jacobtread/obsidian-timekeep/issues). -- Use a **clear and descriptive title** for the issue to identify the suggestion. -- Provide a **step-by-step description of the suggested enhancement** in as many details as possible. -- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you. -- You may want to **include screenshots or screen recordings** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [LICEcap](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and the built-in [screen recorder in GNOME](https://help.gnome.org/users/gnome-help/stable/screen-shot-record.html.en) or [SimpleScreenRecorder](https://github.com/MaartenBaert/ssr) on Linux. -- **Explain why this enhancement would be useful** to most Timekeep users. You may also want to point out the other projects that solved it better and which could serve as inspiration. +- Use a **clear and descriptive title** for the issue to identify the suggestion. +- Provide a **step-by-step description of the suggested enhancement** in as many details as possible. +- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you. +- You may want to **include screenshots or screen recordings** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [LICEcap](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and the built-in [screen recorder in GNOME](https://help.gnome.org/users/gnome-help/stable/screen-shot-record.html.en) or [SimpleScreenRecorder](https://github.com/MaartenBaert/ssr) on Linux. +- **Explain why this enhancement would be useful** to most Timekeep users. You may also want to point out the other projects that solved it better and which could serve as inspiration. diff --git a/cspell.json b/cspell.json index d60a622..b627351 100644 --- a/cspell.json +++ b/cspell.json @@ -1,14 +1,14 @@ { - "words": [ - "datetime", - "Jacobtread", - "lucide", - "Roboto", - "stylesheet", - "timekeep", - "timesheet", - "unstarted", - "Timekeeps", - "pdfmake" - ] -} \ No newline at end of file + "words": [ + "datetime", + "Jacobtread", + "lucide", + "Roboto", + "stylesheet", + "timekeep", + "timesheet", + "unstarted", + "Timekeeps", + "pdfmake" + ] +} diff --git a/manifest.json b/manifest.json index 421324a..4396d98 100644 --- a/manifest.json +++ b/manifest.json @@ -8,4 +8,4 @@ "authorUrl": "https://jacobtread.com", "fundingUrl": "https://www.buymeacoffee.com/jacobtread", "isDesktopOnly": false -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index e8e360d..5a7b157 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3409 +1,2646 @@ { - "name": "obsidian-timekeep", - "version": "1.16.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "obsidian-timekeep", - "version": "1.16.0", - "license": "MIT", - "dependencies": { - "moment": "^2.30.1", - "pdfmake": "^0.3.7", - "uuid": "^11.0.5", - "zod": "^4.3.6" - }, - "devDependencies": { - "@types/node": "^20.19.37", - "@types/pdfmake": "^0.3.2", - "@vitest/coverage-v8": "^4.1.1", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-perfectionist": "^5.7.0", - "obsidian": "latest", - "oxlint": "^1.57.0", - "prettier": "^3.8.1", - "typescript": "5.9.2", - "vite": "^8.0.2", - "vitest": "^4.1.1" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@codemirror/state": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.0.tgz", - "integrity": "sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@marijn/find-cluster-break": "^1.0.0" - } - }, - "node_modules/@codemirror/view": { - "version": "6.38.6", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.6.tgz", - "integrity": "sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@codemirror/state": "^6.5.0", - "crelt": "^1.0.6", - "style-mod": "^4.1.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@emnapi/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", - "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", - "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", - "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.23.3", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", - "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/object-schema": "^3.0.3", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", - "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/core": "^1.1.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", - "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/object-schema": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", - "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", - "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/core": "^1.1.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@marijn/find-cluster-break": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@noble/ciphers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", - "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.122.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", - "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.57.0.tgz", - "integrity": "sha512-C7EiyfAJG4B70496eV543nKiq5cH0o/xIh/ufbjQz3SIvHhlDDsyn+mRFh+aW8KskTyUpyH2LGWL8p2oN6bl1A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.57.0.tgz", - "integrity": "sha512-9i80AresjZ/FZf5xK8tKFbhQnijD4s1eOZw6/FHUwD59HEZbVLRc2C88ADYJfLZrF5XofWDiRX/Ja9KefCLy7w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.57.0.tgz", - "integrity": "sha512-0eUfhRz5L2yKa9I8k3qpyl37XK3oBS5BvrgdVIx599WZK63P8sMbg+0s4IuxmIiZuBK68Ek+Z+gcKgeYf0otsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.57.0.tgz", - "integrity": "sha512-UvrSuzBaYOue+QMAcuDITe0k/Vhj6KZGjfnI6x+NkxBTke/VoM7ZisaxgNY0LWuBkTnd1OmeQfEQdQ48fRjkQg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.57.0.tgz", - "integrity": "sha512-wtQq0dCoiw4bUwlsNVDJJ3pxJA218fOezpgtLKrbQqUtQJcM9yP8z+I9fu14aHg0uyAxIY+99toL6uBa2r7nxA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.57.0.tgz", - "integrity": "sha512-qxFWl2BBBFcT4djKa+OtMdnLgoHEJXpqjyGwz8OhW35ImoCwR5qtAGqApNYce5260FQqoAHW8S8eZTjiX67Tsg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.57.0.tgz", - "integrity": "sha512-SQoIsBU7J0bDW15/f0/RvxHfY3Y0+eB/caKBQtNFbuerTiA6JCYx9P1MrrFTwY2dTm/lMgTSgskvCEYk2AtG/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.57.0.tgz", - "integrity": "sha512-jqxYd1W6WMeozsCmqe9Rzbu3SRrGTyGDAipRlRggetyYbUksJqJKvUNTQtZR/KFoJPb+grnSm5SHhdWrywv3RQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.57.0.tgz", - "integrity": "sha512-i66WyEPVEvq9bxRUCJ/MP5EBfnTDN3nhwEdFZFTO5MmLLvzngfWEG3NSdXQzTT3vk5B9i6C2XSIYBh+aG6uqyg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.57.0.tgz", - "integrity": "sha512-oMZDCwz4NobclZU3pH+V1/upVlJZiZvne4jQP+zhJwt+lmio4XXr4qG47CehvrW1Lx2YZiIHuxM2D4YpkG3KVA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.57.0.tgz", - "integrity": "sha512-uoBnjJ3MMEBbfnWC1jSFr7/nSCkcQYa72NYoNtLl1imshDnWSolYCjzb8LVCwYCCfLJXD+0gBLD7fyC14c0+0g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.57.0.tgz", - "integrity": "sha512-BdrwD7haPZ8a9KrZhKJRSj6jwCor+Z8tHFZ3PT89Y3Jq5v3LfMfEePeAmD0LOTWpiTmzSzdmyw9ijneapiVHKQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.57.0.tgz", - "integrity": "sha512-BNs+7ZNsRstVg2tpNxAXfMX/Iv5oZh204dVyb8Z37+/gCh+yZqNTlg6YwCLIMPSk5wLWIGOaQjT0GUOahKYImw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.57.0.tgz", - "integrity": "sha512-AghS18w+XcENcAX0+BQGLiqjpqpaxKJa4cWWP0OWNLacs27vHBxu7TYkv9LUSGe5w8lOJHeMxcYfZNOAPqw2bg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.57.0.tgz", - "integrity": "sha512-E/FV3GB8phu/Rpkhz5T96hAiJlGzn91qX5yj5gU754P5cmVGXY1Jw/VSjDSlZBCY3VHjsVLdzgdkJaomEmcNOg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.57.0.tgz", - "integrity": "sha512-xvZ2yZt0nUVfU14iuGv3V25jpr9pov5N0Wr28RXnHFxHCRxNDMtYPHV61gGLhN9IlXM96gI4pyYpLSJC5ClLCQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.57.0.tgz", - "integrity": "sha512-Z4D8Pd0AyHBKeazhdIXeUUy5sIS3Mo0veOlzlDECg6PhRRKgEsBJCCV1n+keUZtQ04OP+i7+itS3kOykUyNhDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.57.0.tgz", - "integrity": "sha512-StOZ9nFMVKvevicbQfql6Pouu9pgbeQnu60Fvhz2S6yfMaii+wnueLnqQ5I1JPgNF0Syew4voBlAaHD13wH6tw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.57.0.tgz", - "integrity": "sha512-6PuxhYgth8TuW0+ABPOIkGdBYw+qYGxgIdXPHSVpiCDm+hqTTWCmC739St1Xni0DJBt8HnSHTG67i1y6gr8qrA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.11.tgz", - "integrity": "sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.11.tgz", - "integrity": "sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.11.tgz", - "integrity": "sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.11.tgz", - "integrity": "sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.11.tgz", - "integrity": "sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.11.tgz", - "integrity": "sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.11.tgz", - "integrity": "sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.11.tgz", - "integrity": "sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.11.tgz", - "integrity": "sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.11.tgz", - "integrity": "sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", - "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.11.tgz", - "integrity": "sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.11.tgz", - "integrity": "sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.11.tgz", - "integrity": "sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@swc/helpers": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.19.tgz", - "integrity": "sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/codemirror": { - "version": "5.60.8", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", - "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/tern": "*" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/node": { - "version": "20.19.37", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", - "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/pdfkit": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/pdfkit/-/pdfkit-0.17.5.tgz", - "integrity": "sha512-T3ZHnvF91HsEco5ClhBCOuBwobZfPcI2jaiSHybkkKYq4KhVIIurod94JVKvDIG0JXT6o3KiERC0X0//m8dyrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/pdfmake": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@types/pdfmake/-/pdfmake-0.3.2.tgz", - "integrity": "sha512-2TZSL8puKJs/rHvMV1b8BhHD+qYyV9da8mVY83/x7ZR/NaEPXbm3+t5SwkwaH6QAIhY1zQVAaFDhHWL0haMstA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/pdfkit": "*" - } - }, - "node_modules/@types/tern": { - "version": "0.23.9", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", - "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.2.tgz", - "integrity": "sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.57.2", - "@typescript-eslint/types": "^8.57.2", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.2.tgz", - "integrity": "sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/visitor-keys": "8.57.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.2.tgz", - "integrity": "sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.2.tgz", - "integrity": "sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.2.tgz", - "integrity": "sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.57.2", - "@typescript-eslint/tsconfig-utils": "8.57.2", - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/visitor-keys": "8.57.2", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.2.tgz", - "integrity": "sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.57.2", - "@typescript-eslint/types": "8.57.2", - "@typescript-eslint/typescript-estree": "8.57.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.57.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.2.tgz", - "integrity": "sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.57.2", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@vitest/coverage-v8": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.1.tgz", - "integrity": "sha512-nZ4RWwGCoGOQRMmU/Q9wlUY540RVRxJZ9lxFsFfy0QV7Zmo5VVBhB6Sl9Xa0KIp2iIs3zWfPlo9LcY1iqbpzCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.1", - "ast-v8-to-istanbul": "^1.0.0", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.2.0", - "magicast": "^0.5.2", - "obug": "^2.1.1", - "std-env": "^4.0.0-rc.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/browser": "4.1.1", - "vitest": "4.1.1" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } - } - }, - "node_modules/@vitest/coverage-v8/node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/expect": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.1.tgz", - "integrity": "sha512-xAV0fqBTk44Rn6SjJReEQkHP3RrqbJo6JQ4zZ7/uVOiJZRarBtblzrOfFIZeYUrukp2YD6snZG6IBqhOoHTm+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.1", - "@vitest/utils": "4.1.1", - "chai": "^6.2.2", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.1.tgz", - "integrity": "sha512-h3BOylsfsCLPeceuCPAAJ+BvNwSENgJa4hXoXu4im0bs9Lyp4URc4JYK4pWLZ4pG/UQn7AT92K6IByi6rE6g3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.1", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.1.tgz", - "integrity": "sha512-GM+TEQN5WhOygr1lp7skeVjdLPqqWMHsfzXrcHAqZJi/lIVh63H0kaRCY8MDhNWikx19zBUK8ceaLB7X5AH9NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.1.tgz", - "integrity": "sha512-f7+FPy75vN91QGWsITueq0gedwUZy1fLtHOCMeQpjs8jTekAHeKP80zfDEnhrleviLHzVSDXIWuCIOFn3D3f8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.1", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.1.tgz", - "integrity": "sha512-kMVSgcegWV2FibXEx9p9WIKgje58lcTbXgnJixfcg15iK8nzCXhmalL0ZLtTWLW9PH1+1NEDShiFFedB3tEgWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.1", - "@vitest/utils": "4.1.1", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.1.tgz", - "integrity": "sha512-6Ti/KT5OVaiupdIZEuZN7l3CZcR0cxnxt70Z0//3CtwgObwA6jZhmVBA3yrXSVN3gmwjgd7oDNLlsXz526gpRA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.1.tgz", - "integrity": "sha512-cNxAlaB3sHoCdL6pj6yyUXv9Gry1NHNg0kFTXdvSIZXLHsqKH7chiWOkwJ5s5+d/oMwcoG9T0bKU38JZWKusrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.1", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-v8-to-istanbul": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", - "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.31", - "estree-walker": "^3.0.3", - "js-tokens": "^10.0.0" - } - }, - "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/brotli": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", - "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.1.2" - } - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/dfa": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", - "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", - "license": "MIT" - }, - "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.1.0.tgz", - "integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.3", - "@eslint/config-helpers": "^0.5.3", - "@eslint/core": "^1.1.1", - "@eslint/plugin-kit": "^0.6.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-perfectionist": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-5.7.0.tgz", - "integrity": "sha512-WRHj7OZS/INutQ/gKN5C1ZGnMhkQ3oKZQAA2I7rl5yM8keBtSd9oj/qlJaHuwh5873FhMPqYlttcadF0YsTN7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^8.57.1", - "natural-orderby": "^5.0.0" - }, - "engines": { - "node": "^20.0.0 || >=22.0.0" - }, - "peerDependencies": { - "eslint": "^8.45.0 || ^9.0.0 || ^10.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/fontkit": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", - "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", - "license": "MIT", - "dependencies": { - "@swc/helpers": "^0.5.12", - "brotli": "^1.3.2", - "clone": "^2.1.2", - "dfa": "^1.2.0", - "fast-deep-equal": "^3.1.3", - "restructure": "^3.0.0", - "tiny-inflate": "^1.0.3", - "unicode-properties": "^1.4.0", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-md5": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz", - "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==", - "license": "MIT" - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/linebreak": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", - "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", - "license": "MIT", - "dependencies": { - "base64-js": "0.0.8", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/linebreak/node_modules/base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/magicast": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", - "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "source-map-js": "^1.2.1" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/natural-orderby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz", - "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/obsidian": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.12.3.tgz", - "integrity": "sha512-HxWqe763dOqzXjnNiHmAJTRERN8KILBSqxDSEqbeSr7W8R8Jxezzbca+nz1LiiqXnMpM8lV2jzAezw3CZ4xNUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/codemirror": "5.60.8", - "moment": "2.29.4" - }, - "peerDependencies": { - "@codemirror/state": "6.5.0", - "@codemirror/view": "6.38.6" - } - }, - "node_modules/obsidian/node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/oxlint": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.57.0.tgz", - "integrity": "sha512-DGFsuBX5MFZX9yiDdtKjTrYPq45CZ8Fft6qCltJITYZxfwYjVdGf/6wycGYTACloauwIPxUnYhBVeZbHvleGhw==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.57.0", - "@oxlint/binding-android-arm64": "1.57.0", - "@oxlint/binding-darwin-arm64": "1.57.0", - "@oxlint/binding-darwin-x64": "1.57.0", - "@oxlint/binding-freebsd-x64": "1.57.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.57.0", - "@oxlint/binding-linux-arm-musleabihf": "1.57.0", - "@oxlint/binding-linux-arm64-gnu": "1.57.0", - "@oxlint/binding-linux-arm64-musl": "1.57.0", - "@oxlint/binding-linux-ppc64-gnu": "1.57.0", - "@oxlint/binding-linux-riscv64-gnu": "1.57.0", - "@oxlint/binding-linux-riscv64-musl": "1.57.0", - "@oxlint/binding-linux-s390x-gnu": "1.57.0", - "@oxlint/binding-linux-x64-gnu": "1.57.0", - "@oxlint/binding-linux-x64-musl": "1.57.0", - "@oxlint/binding-openharmony-arm64": "1.57.0", - "@oxlint/binding-win32-arm64-msvc": "1.57.0", - "@oxlint/binding-win32-ia32-msvc": "1.57.0", - "@oxlint/binding-win32-x64-msvc": "1.57.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=0.15.0" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - } - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pdfkit": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.18.0.tgz", - "integrity": "sha512-NvUwSDZ0eYEzqAiWwVQkRkjYUkZ48kcsHuCO31ykqPPIVkwoSDjDGiwIgHHNtsiwls3z3P/zy4q00hl2chg2Ug==", - "license": "MIT", - "dependencies": { - "@noble/ciphers": "^1.0.0", - "@noble/hashes": "^1.6.0", - "fontkit": "^2.0.4", - "js-md5": "^0.8.3", - "linebreak": "^1.1.0", - "png-js": "^1.0.0" - } - }, - "node_modules/pdfmake": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.3.7.tgz", - "integrity": "sha512-SwTFcaH3kCJBlPFWi/YB34zRg6lpCxq90tkZ9GxfSi9/v4Tk96cv4IvOstA+CC40rdW1OzQIuNhD2DLD1RDVgA==", - "license": "MIT", - "dependencies": { - "linebreak": "^1.1.0", - "pdfkit": "^0.18.0", - "xmldoc": "^2.0.3" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/png-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", - "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" - }, - "node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/restructure": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", - "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", - "license": "MIT" - }, - "node_modules/rolldown": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.11.tgz", - "integrity": "sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.122.0", - "@rolldown/pluginutils": "1.0.0-rc.11" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.11", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.11", - "@rolldown/binding-darwin-x64": "1.0.0-rc.11", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.11", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.11", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.11", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.11", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.11", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.11", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.11", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.11", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.11" - } - }, - "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", - "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/style-mod": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", - "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", - "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unicode-properties": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", - "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.0", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/unicode-trie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", - "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", - "license": "MIT", - "dependencies": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - }, - "node_modules/unicode-trie/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "license": "MIT" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/vite": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.2.tgz", - "integrity": "sha512-1gFhNi+bHhRE/qKZOJXACm6tX4bA3Isy9KuKF15AgSRuRazNBOJfdDemPBU16/mpMxApDPrWvZ08DcLPEoRnuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.11", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.0", - "esbuild": "^0.27.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.1.tgz", - "integrity": "sha512-yF+o4POL41rpAzj5KVILUxm1GCjKnELvaqmU9TLLUbMfDzuN0UpUR9uaDs+mCtjPe+uYPksXDRLQGGPvj1cTmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.1", - "@vitest/mocker": "4.1.1", - "@vitest/pretty-format": "4.1.1", - "@vitest/runner": "4.1.1", - "@vitest/snapshot": "4.1.1", - "@vitest/spy": "4.1.1", - "@vitest/utils": "4.1.1", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.1", - "@vitest/browser-preview": "4.1.1", - "@vitest/browser-webdriverio": "4.1.1", - "@vitest/ui": "4.1.1", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/xmldoc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-2.0.3.tgz", - "integrity": "sha512-6gRk4NY/Jvg67xn7OzJuxLRsGgiXBaPUQplVJ/9l99uIugxh4FTOewYz5ic8WScj7Xx/2WvhENiQKwkK9RpE4w==", - "license": "MIT", - "dependencies": { - "sax": "^1.4.3" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } + "name": "obsidian-timekeep", + "version": "1.16.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "obsidian-timekeep", + "version": "1.16.0", + "license": "MIT", + "dependencies": { + "moment": "^2.30.1", + "pdfmake": "^0.3.7", + "uuid": "^11.0.5", + "zod": "^4.3.6" + }, + "devDependencies": { + "@types/node": "^20.19.37", + "@types/pdfmake": "^0.3.2", + "@vitest/coverage-v8": "^4.1.1", + "obsidian": "latest", + "oxfmt": "^0.42.0", + "oxlint": "^1.57.0", + "typescript": "5.9.2", + "vite": "^8.0.2", + "vitest": "^4.1.1" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@codemirror/state": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.0.tgz", + "integrity": "sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.38.6", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.6.tgz", + "integrity": "sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxfmt/binding-android-arm-eabi": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.42.0.tgz", + "integrity": "sha512-dsqPTYsozeokRjlrt/b4E7Pj0z3eS3Eg74TWQuuKbjY4VttBmA88rB7d50Xrd+TZ986qdXCNeZRPEzZHAe+jow==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-android-arm64": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.42.0.tgz", + "integrity": "sha512-t+aAjHxcr5eOBphFHdg1ouQU9qmZZoRxnX7UOJSaTwSoKsb6TYezNKO0YbWytGXCECObRqNcUxPoPr0KaraAIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-arm64": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.42.0.tgz", + "integrity": "sha512-ulpSEYMKg61C5bRMZinFHrKJYRoKGVbvMEXA5zM1puX3O9T6Q4XXDbft20yrDijpYWeuG59z3Nabt+npeTsM1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-x64": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.42.0.tgz", + "integrity": "sha512-ttxLKhQYPdFiM8I/Ri37cvqChE4Xa562nNOsZFcv1CKTVLeEozXjKuYClNvxkXmNlcF55nzM80P+CQkdFBu+uQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-freebsd-x64": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.42.0.tgz", + "integrity": "sha512-Og7QS3yI3tdIKYZ58SXik0rADxIk2jmd+/YvuHRyKULWpG4V2fR5V4hvKm624Mc0cQET35waPXiCQWvjQEjwYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.42.0.tgz", + "integrity": "sha512-jwLOw/3CW4H6Vxcry4/buQHk7zm9Ne2YsidzTL1kpiMe4qqrRCwev3dkyWe2YkFmP+iZCQ7zku4KwjcLRoh8ew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-musleabihf": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.42.0.tgz", + "integrity": "sha512-XwXu2vkMtiq2h7tfvN+WA/9/5/1IoGAVCFPiiQUvcAuG3efR97KNcRGM8BetmbYouFotQ2bDal3yyjUx6IPsTg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-gnu": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.42.0.tgz", + "integrity": "sha512-ea7s/XUJoT7ENAtUQDudFe3nkSM3e3Qpz4nJFRdzO2wbgXEcjnchKLEsV3+t4ev3r8nWxIYr9NRjPWtnyIFJVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-musl": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.42.0.tgz", + "integrity": "sha512-+JA0YMlSdDqmacygGi2REp57c3fN+tzARD8nwsukx9pkCHK+6DkbAA9ojS4lNKsiBjIW8WWa0pBrBWhdZEqfuw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-ppc64-gnu": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.42.0.tgz", + "integrity": "sha512-VfnET0j4Y5mdfCzh5gBt0NK28lgn5DKx+8WgSMLYYeSooHhohdbzwAStLki9pNuGy51y4I7IoW8bqwAaCMiJQg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-gnu": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.42.0.tgz", + "integrity": "sha512-gVlCbmBkB0fxBWbhBj9rcxezPydsQHf4MFKeHoTSPicOQ+8oGeTQgQ8EeesSybWeiFPVRx3bgdt4IJnH6nOjAA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-musl": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.42.0.tgz", + "integrity": "sha512-zN5OfstL0avgt/IgvRu0zjQzVh/EPkcLzs33E9LMAzpqlLWiPWeMDZyMGFlSRGOdDjuNmlZBCgj0pFnK5u32TQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-s390x-gnu": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.42.0.tgz", + "integrity": "sha512-9X6+H2L0qMc2sCAgO9HS03bkGLMKvOFjmEdchaFlany3vNZOjnVui//D8k/xZAtQv2vaCs1reD5KAgPoIU4msA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-gnu": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.42.0.tgz", + "integrity": "sha512-BajxJ6KQvMMdpXGPWhBGyjb2Jvx4uec0w+wi6TJZ6Tv7+MzPwe0pO8g5h1U0jyFgoaF7mDl6yKPW3ykWcbUJRw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-musl": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.42.0.tgz", + "integrity": "sha512-0wV284I6vc5f0AqAhgAbHU2935B4bVpncPoe5n/WzVZY/KnHgqxC8iSFGeSyLWEgstFboIcWkOPck7tqbdHkzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-openharmony-arm64": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.42.0.tgz", + "integrity": "sha512-p4BG6HpGnhfgHk1rzZfyR6zcWkE7iLrWxyehHfXUy4Qa5j3e0roglFOdP/Nj5cJJ58MA3isQ5dlfkW2nNEpolw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-arm64-msvc": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.42.0.tgz", + "integrity": "sha512-mn//WV60A+IetORDxYieYGAoQso4KnVRRjORDewMcod4irlRe0OSC7YPhhwaexYNPQz/GCFk+v9iUcZ2W22yxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-ia32-msvc": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.42.0.tgz", + "integrity": "sha512-3gWltUrvuz4LPJXWivoAxZ28Of2O4N7OGuM5/X3ubPXCEV8hmgECLZzjz7UYvSDUS3grfdccQwmjynm+51EFpw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-x64-msvc": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.42.0.tgz", + "integrity": "sha512-Wg4TMAfQRL9J9AZevJ/ZNy3uyyDztDYQtGr4P8UyyzIhLhFrdSmz1J/9JT+rv0fiCDLaFOBQnj3f3K3+a5PzDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.57.0.tgz", + "integrity": "sha512-C7EiyfAJG4B70496eV543nKiq5cH0o/xIh/ufbjQz3SIvHhlDDsyn+mRFh+aW8KskTyUpyH2LGWL8p2oN6bl1A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.57.0.tgz", + "integrity": "sha512-9i80AresjZ/FZf5xK8tKFbhQnijD4s1eOZw6/FHUwD59HEZbVLRc2C88ADYJfLZrF5XofWDiRX/Ja9KefCLy7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.57.0.tgz", + "integrity": "sha512-0eUfhRz5L2yKa9I8k3qpyl37XK3oBS5BvrgdVIx599WZK63P8sMbg+0s4IuxmIiZuBK68Ek+Z+gcKgeYf0otsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.57.0.tgz", + "integrity": "sha512-UvrSuzBaYOue+QMAcuDITe0k/Vhj6KZGjfnI6x+NkxBTke/VoM7ZisaxgNY0LWuBkTnd1OmeQfEQdQ48fRjkQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.57.0.tgz", + "integrity": "sha512-wtQq0dCoiw4bUwlsNVDJJ3pxJA218fOezpgtLKrbQqUtQJcM9yP8z+I9fu14aHg0uyAxIY+99toL6uBa2r7nxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.57.0.tgz", + "integrity": "sha512-qxFWl2BBBFcT4djKa+OtMdnLgoHEJXpqjyGwz8OhW35ImoCwR5qtAGqApNYce5260FQqoAHW8S8eZTjiX67Tsg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.57.0.tgz", + "integrity": "sha512-SQoIsBU7J0bDW15/f0/RvxHfY3Y0+eB/caKBQtNFbuerTiA6JCYx9P1MrrFTwY2dTm/lMgTSgskvCEYk2AtG/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.57.0.tgz", + "integrity": "sha512-jqxYd1W6WMeozsCmqe9Rzbu3SRrGTyGDAipRlRggetyYbUksJqJKvUNTQtZR/KFoJPb+grnSm5SHhdWrywv3RQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.57.0.tgz", + "integrity": "sha512-i66WyEPVEvq9bxRUCJ/MP5EBfnTDN3nhwEdFZFTO5MmLLvzngfWEG3NSdXQzTT3vk5B9i6C2XSIYBh+aG6uqyg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.57.0.tgz", + "integrity": "sha512-oMZDCwz4NobclZU3pH+V1/upVlJZiZvne4jQP+zhJwt+lmio4XXr4qG47CehvrW1Lx2YZiIHuxM2D4YpkG3KVA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.57.0.tgz", + "integrity": "sha512-uoBnjJ3MMEBbfnWC1jSFr7/nSCkcQYa72NYoNtLl1imshDnWSolYCjzb8LVCwYCCfLJXD+0gBLD7fyC14c0+0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.57.0.tgz", + "integrity": "sha512-BdrwD7haPZ8a9KrZhKJRSj6jwCor+Z8tHFZ3PT89Y3Jq5v3LfMfEePeAmD0LOTWpiTmzSzdmyw9ijneapiVHKQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.57.0.tgz", + "integrity": "sha512-BNs+7ZNsRstVg2tpNxAXfMX/Iv5oZh204dVyb8Z37+/gCh+yZqNTlg6YwCLIMPSk5wLWIGOaQjT0GUOahKYImw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.57.0.tgz", + "integrity": "sha512-AghS18w+XcENcAX0+BQGLiqjpqpaxKJa4cWWP0OWNLacs27vHBxu7TYkv9LUSGe5w8lOJHeMxcYfZNOAPqw2bg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.57.0.tgz", + "integrity": "sha512-E/FV3GB8phu/Rpkhz5T96hAiJlGzn91qX5yj5gU754P5cmVGXY1Jw/VSjDSlZBCY3VHjsVLdzgdkJaomEmcNOg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.57.0.tgz", + "integrity": "sha512-xvZ2yZt0nUVfU14iuGv3V25jpr9pov5N0Wr28RXnHFxHCRxNDMtYPHV61gGLhN9IlXM96gI4pyYpLSJC5ClLCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.57.0.tgz", + "integrity": "sha512-Z4D8Pd0AyHBKeazhdIXeUUy5sIS3Mo0veOlzlDECg6PhRRKgEsBJCCV1n+keUZtQ04OP+i7+itS3kOykUyNhDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.57.0.tgz", + "integrity": "sha512-StOZ9nFMVKvevicbQfql6Pouu9pgbeQnu60Fvhz2S6yfMaii+wnueLnqQ5I1JPgNF0Syew4voBlAaHD13wH6tw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.57.0.tgz", + "integrity": "sha512-6PuxhYgth8TuW0+ABPOIkGdBYw+qYGxgIdXPHSVpiCDm+hqTTWCmC739St1Xni0DJBt8HnSHTG67i1y6gr8qrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.11.tgz", + "integrity": "sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.11.tgz", + "integrity": "sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.11.tgz", + "integrity": "sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.11.tgz", + "integrity": "sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.11.tgz", + "integrity": "sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.11.tgz", + "integrity": "sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.11.tgz", + "integrity": "sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.11.tgz", + "integrity": "sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.11.tgz", + "integrity": "sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.11.tgz", + "integrity": "sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.11.tgz", + "integrity": "sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.11.tgz", + "integrity": "sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.11.tgz", + "integrity": "sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.11.tgz", + "integrity": "sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.11.tgz", + "integrity": "sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.11.tgz", + "integrity": "sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.19.tgz", + "integrity": "sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/codemirror": { + "version": "5.60.8", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", + "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/tern": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/pdfkit": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/pdfkit/-/pdfkit-0.17.5.tgz", + "integrity": "sha512-T3ZHnvF91HsEco5ClhBCOuBwobZfPcI2jaiSHybkkKYq4KhVIIurod94JVKvDIG0JXT6o3KiERC0X0//m8dyrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/pdfmake": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@types/pdfmake/-/pdfmake-0.3.2.tgz", + "integrity": "sha512-2TZSL8puKJs/rHvMV1b8BhHD+qYyV9da8mVY83/x7ZR/NaEPXbm3+t5SwkwaH6QAIhY1zQVAaFDhHWL0haMstA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/pdfkit": "*" + } + }, + "node_modules/@types/tern": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", + "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.1.tgz", + "integrity": "sha512-nZ4RWwGCoGOQRMmU/Q9wlUY540RVRxJZ9lxFsFfy0QV7Zmo5VVBhB6Sl9Xa0KIp2iIs3zWfPlo9LcY1iqbpzCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.1.1", + "ast-v8-to-istanbul": "^1.0.0", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "std-env": "^4.0.0-rc.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.1.1", + "vitest": "4.1.1" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/coverage-v8/node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.1.tgz", + "integrity": "sha512-xAV0fqBTk44Rn6SjJReEQkHP3RrqbJo6JQ4zZ7/uVOiJZRarBtblzrOfFIZeYUrukp2YD6snZG6IBqhOoHTm+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.1", + "@vitest/utils": "4.1.1", + "chai": "^6.2.2", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.1.tgz", + "integrity": "sha512-h3BOylsfsCLPeceuCPAAJ+BvNwSENgJa4hXoXu4im0bs9Lyp4URc4JYK4pWLZ4pG/UQn7AT92K6IByi6rE6g3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.1", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.1.tgz", + "integrity": "sha512-GM+TEQN5WhOygr1lp7skeVjdLPqqWMHsfzXrcHAqZJi/lIVh63H0kaRCY8MDhNWikx19zBUK8ceaLB7X5AH9NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.1.tgz", + "integrity": "sha512-f7+FPy75vN91QGWsITueq0gedwUZy1fLtHOCMeQpjs8jTekAHeKP80zfDEnhrleviLHzVSDXIWuCIOFn3D3f8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.1", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.1.tgz", + "integrity": "sha512-kMVSgcegWV2FibXEx9p9WIKgje58lcTbXgnJixfcg15iK8nzCXhmalL0ZLtTWLW9PH1+1NEDShiFFedB3tEgWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.1", + "@vitest/utils": "4.1.1", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.1.tgz", + "integrity": "sha512-6Ti/KT5OVaiupdIZEuZN7l3CZcR0cxnxt70Z0//3CtwgObwA6jZhmVBA3yrXSVN3gmwjgd7oDNLlsXz526gpRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.1.tgz", + "integrity": "sha512-cNxAlaB3sHoCdL6pj6yyUXv9Gry1NHNg0kFTXdvSIZXLHsqKH7chiWOkwJ5s5+d/oMwcoG9T0bKU38JZWKusrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.1", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-v8-to-istanbul": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", + "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "license": "MIT" + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fontkit": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", + "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.12", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "dfa": "^1.2.0", + "fast-deep-equal": "^3.1.3", + "restructure": "^3.0.0", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.4.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-md5": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz", + "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "license": "MIT", + "dependencies": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/linebreak/node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/obsidian": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.12.3.tgz", + "integrity": "sha512-HxWqe763dOqzXjnNiHmAJTRERN8KILBSqxDSEqbeSr7W8R8Jxezzbca+nz1LiiqXnMpM8lV2jzAezw3CZ4xNUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/codemirror": "5.60.8", + "moment": "2.29.4" + }, + "peerDependencies": { + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.38.6" + } + }, + "node_modules/obsidian/node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/oxfmt": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.42.0.tgz", + "integrity": "sha512-QhejGErLSMReNuZ6vxgFHDyGoPbjTRNi6uGHjy0cvIjOQFqD6xmr/T+3L41ixR3NIgzcNiJ6ylQKpvShTgDfqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinypool": "2.1.0" + }, + "bin": { + "oxfmt": "bin/oxfmt" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxfmt/binding-android-arm-eabi": "0.42.0", + "@oxfmt/binding-android-arm64": "0.42.0", + "@oxfmt/binding-darwin-arm64": "0.42.0", + "@oxfmt/binding-darwin-x64": "0.42.0", + "@oxfmt/binding-freebsd-x64": "0.42.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.42.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.42.0", + "@oxfmt/binding-linux-arm64-gnu": "0.42.0", + "@oxfmt/binding-linux-arm64-musl": "0.42.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.42.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.42.0", + "@oxfmt/binding-linux-riscv64-musl": "0.42.0", + "@oxfmt/binding-linux-s390x-gnu": "0.42.0", + "@oxfmt/binding-linux-x64-gnu": "0.42.0", + "@oxfmt/binding-linux-x64-musl": "0.42.0", + "@oxfmt/binding-openharmony-arm64": "0.42.0", + "@oxfmt/binding-win32-arm64-msvc": "0.42.0", + "@oxfmt/binding-win32-ia32-msvc": "0.42.0", + "@oxfmt/binding-win32-x64-msvc": "0.42.0" + } + }, + "node_modules/oxlint": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.57.0.tgz", + "integrity": "sha512-DGFsuBX5MFZX9yiDdtKjTrYPq45CZ8Fft6qCltJITYZxfwYjVdGf/6wycGYTACloauwIPxUnYhBVeZbHvleGhw==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.57.0", + "@oxlint/binding-android-arm64": "1.57.0", + "@oxlint/binding-darwin-arm64": "1.57.0", + "@oxlint/binding-darwin-x64": "1.57.0", + "@oxlint/binding-freebsd-x64": "1.57.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.57.0", + "@oxlint/binding-linux-arm-musleabihf": "1.57.0", + "@oxlint/binding-linux-arm64-gnu": "1.57.0", + "@oxlint/binding-linux-arm64-musl": "1.57.0", + "@oxlint/binding-linux-ppc64-gnu": "1.57.0", + "@oxlint/binding-linux-riscv64-gnu": "1.57.0", + "@oxlint/binding-linux-riscv64-musl": "1.57.0", + "@oxlint/binding-linux-s390x-gnu": "1.57.0", + "@oxlint/binding-linux-x64-gnu": "1.57.0", + "@oxlint/binding-linux-x64-musl": "1.57.0", + "@oxlint/binding-openharmony-arm64": "1.57.0", + "@oxlint/binding-win32-arm64-msvc": "1.57.0", + "@oxlint/binding-win32-ia32-msvc": "1.57.0", + "@oxlint/binding-win32-x64-msvc": "1.57.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.15.0" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + } + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pdfkit": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.18.0.tgz", + "integrity": "sha512-NvUwSDZ0eYEzqAiWwVQkRkjYUkZ48kcsHuCO31ykqPPIVkwoSDjDGiwIgHHNtsiwls3z3P/zy4q00hl2chg2Ug==", + "license": "MIT", + "dependencies": { + "@noble/ciphers": "^1.0.0", + "@noble/hashes": "^1.6.0", + "fontkit": "^2.0.4", + "js-md5": "^0.8.3", + "linebreak": "^1.1.0", + "png-js": "^1.0.0" + } + }, + "node_modules/pdfmake": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.3.7.tgz", + "integrity": "sha512-SwTFcaH3kCJBlPFWi/YB34zRg6lpCxq90tkZ9GxfSi9/v4Tk96cv4IvOstA+CC40rdW1OzQIuNhD2DLD1RDVgA==", + "license": "MIT", + "dependencies": { + "linebreak": "^1.1.0", + "pdfkit": "^0.18.0", + "xmldoc": "^2.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/restructure": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", + "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", + "license": "MIT" + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.11.tgz", + "integrity": "sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.11" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.11", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.11", + "@rolldown/binding-darwin-x64": "1.0.0-rc.11", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.11", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.11", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.11", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.11", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.11", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.11", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.11", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.11", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.11", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.11", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.11", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.11" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-2.1.0.tgz", + "integrity": "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vite": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.2.tgz", + "integrity": "sha512-1gFhNi+bHhRE/qKZOJXACm6tX4bA3Isy9KuKF15AgSRuRazNBOJfdDemPBU16/mpMxApDPrWvZ08DcLPEoRnuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.11", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.1.tgz", + "integrity": "sha512-yF+o4POL41rpAzj5KVILUxm1GCjKnELvaqmU9TLLUbMfDzuN0UpUR9uaDs+mCtjPe+uYPksXDRLQGGPvj1cTmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.1", + "@vitest/mocker": "4.1.1", + "@vitest/pretty-format": "4.1.1", + "@vitest/runner": "4.1.1", + "@vitest/snapshot": "4.1.1", + "@vitest/spy": "4.1.1", + "@vitest/utils": "4.1.1", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.1", + "@vitest/browser-preview": "4.1.1", + "@vitest/browser-webdriverio": "4.1.1", + "@vitest/ui": "4.1.1", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/xmldoc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-2.0.3.tgz", + "integrity": "sha512-6gRk4NY/Jvg67xn7OzJuxLRsGgiXBaPUQplVJ/9l99uIugxh4FTOewYz5ic8WScj7Xx/2WvhENiQKwkK9RpE4w==", + "license": "MIT", + "dependencies": { + "sax": "^1.4.3" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } } diff --git a/package.json b/package.json index f4e1cd0..8180363 100644 --- a/package.json +++ b/package.json @@ -1,38 +1,37 @@ { - "name": "obsidian-timekeep", - "version": "1.16.0", - "description": "Obsidian plugin for time tracking", - "main": "main.js", - "type": "module", - "scripts": { - "dev": "node scripts/dev.js", - "build": "node scripts/build.js", - "version": "node scripts/version-bump.js && git add manifest.json versions.json", - "lint": "oxlint src", - "lint:fix": "oxlint --fix src", - "format": "prettier -w src", - "test": "vitest run --coverage" - }, - "keywords": [], - "author": "Jacobtread", - "license": "MIT", - "devDependencies": { - "@types/node": "^20.19.37", - "@types/pdfmake": "^0.3.2", - "@vitest/coverage-v8": "^4.1.1", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-perfectionist": "^5.7.0", - "obsidian": "latest", - "oxlint": "^1.57.0", - "prettier": "^3.8.1", - "typescript": "5.9.2", - "vite": "^8.0.2", - "vitest": "^4.1.1" - }, - "dependencies": { - "moment": "^2.30.1", - "pdfmake": "^0.3.7", - "uuid": "^11.0.5", - "zod": "^4.3.6" - } + "name": "obsidian-timekeep", + "version": "1.16.0", + "description": "Obsidian plugin for time tracking", + "keywords": [], + "license": "MIT", + "author": "Jacobtread", + "type": "module", + "main": "main.js", + "scripts": { + "dev": "node scripts/dev.js", + "build": "node scripts/build.js", + "version": "node scripts/version-bump.js && git add manifest.json versions.json", + "lint": "oxlint", + "lint:fix": "oxlint --fix", + "fmt": "oxfmt", + "fmt:check": "oxfmt --check", + "test": "vitest run --coverage" + }, + "dependencies": { + "moment": "^2.30.1", + "pdfmake": "^0.3.7", + "uuid": "^11.0.5", + "zod": "^4.3.6" + }, + "devDependencies": { + "@types/node": "^20.19.37", + "@types/pdfmake": "^0.3.2", + "@vitest/coverage-v8": "^4.1.1", + "obsidian": "latest", + "oxfmt": "^0.42.0", + "oxlint": "^1.57.0", + "typescript": "5.9.2", + "vite": "^8.0.2", + "vitest": "^4.1.1" + } } diff --git a/scripts/build.js b/scripts/build.js index 3d9e731..6e8ce3c 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -4,34 +4,34 @@ import { build } from "vite"; import { fileURLToPath } from "url"; async function buildPlugin() { - const __filename = fileURLToPath(import.meta.url); - const __dirname = path.dirname(__filename); - const rootPath = path.resolve(__dirname, "../"); - const manifestPath = path.join(rootPath, "manifest.json"); - const outputPath = path.join(rootPath, "dist"); + const __filename = fileURLToPath(import.meta.url); + const __dirname = path.dirname(__filename); + const rootPath = path.resolve(__dirname, "../"); + const manifestPath = path.join(rootPath, "manifest.json"); + const outputPath = path.join(rootPath, "dist"); - await ensureDir(outputPath); + await ensureDir(outputPath); - await build({ - configFile: path.resolve(rootPath, "vite.config.js"), - }); + await build({ + configFile: path.resolve(rootPath, "vite.config.js"), + }); - const destManifest = path.join(outputPath, "manifest.json"); - try { - await fs.copyFile(manifestPath, destManifest); - console.info(`Copied manifest.json`); - } catch (e) { - console.error(`Failed to copy manifest.json:`, e.message); - } + const destManifest = path.join(outputPath, "manifest.json"); + try { + await fs.copyFile(manifestPath, destManifest); + console.info(`Copied manifest.json`); + } catch (e) { + console.error(`Failed to copy manifest.json:`, e.message); + } } async function ensureDir(dir) { - try { - await fs.mkdir(dir, { recursive: true }); - } catch {} + try { + await fs.mkdir(dir, { recursive: true }); + } catch {} } buildPlugin().catch((err) => { - console.error(err); - process.exit(1); + console.error(err); + process.exit(1); }); diff --git a/scripts/dev.js b/scripts/dev.js index c07115e..311cb4b 100644 --- a/scripts/dev.js +++ b/scripts/dev.js @@ -4,74 +4,66 @@ import { build } from "vite"; import { fileURLToPath } from "url"; async function dev() { - const __filename = fileURLToPath(import.meta.url); - const __dirname = path.dirname(__filename); - const rootPath = path.resolve(__dirname, "../"); - const manifestPath = path.join(rootPath, "manifest.json"); - const outputPath = path.join(rootPath, "dist"); + const __filename = fileURLToPath(import.meta.url); + const __dirname = path.dirname(__filename); + const rootPath = path.resolve(__dirname, "../"); + const manifestPath = path.join(rootPath, "manifest.json"); + const outputPath = path.join(rootPath, "dist"); - const manifestContents = await fs.readFile(manifestPath, "utf-8"); - const manifest = JSON.parse(manifestContents); + const manifestContents = await fs.readFile(manifestPath, "utf-8"); + const manifest = JSON.parse(manifestContents); - const vaultPath = path.join(rootPath, "test-vault"); - const pluginPath = path.join( - vaultPath, - ".obsidian", - "plugins", - manifest.id - ); + const vaultPath = path.join(rootPath, "test-vault"); + const pluginPath = path.join(vaultPath, ".obsidian", "plugins", manifest.id); - await ensureDir(pluginPath); - await ensureDir(outputPath); + await ensureDir(pluginPath); + await ensureDir(outputPath); - const inputFiles = [ - path.join(outputPath, "main.js"), - path.join(outputPath, "styles.css"), - manifestPath, - ]; + const inputFiles = [ + path.join(outputPath, "main.js"), + path.join(outputPath, "styles.css"), + manifestPath, + ]; - build({ - mode: "development", - configFile: path.resolve(rootPath, "vite.config.js"), - build: { - watch: {}, - }, - plugins: [ - { - name: "build-finish-copy", - closeBundle() { - console.info("Build finished copying files"); - copyFiles(); - }, - }, - ], - }); + build({ + mode: "development", + configFile: path.resolve(rootPath, "vite.config.js"), + build: { + watch: {}, + }, + plugins: [ + { + name: "build-finish-copy", + closeBundle() { + console.info("Build finished copying files"); + copyFiles(); + }, + }, + ], + }); - const copyFiles = async () => { - for (const filePath of inputFiles) { - const destPath = path.join(pluginPath, path.basename(filePath)); - try { - await fs.copyFile(filePath, destPath); - console.info(`✓ Updated ${path.basename(filePath)}`); - } catch (e) { - console.error( - `Failed to copy ${path.basename(filePath)}:`, - e.message - ); - } - } - }; + const copyFiles = async () => { + for (const filePath of inputFiles) { + const destPath = path.join(pluginPath, path.basename(filePath)); + try { + await fs.copyFile(filePath, destPath); + console.info(`✓ Updated ${path.basename(filePath)}`); + } catch (e) { + console.error(`Failed to copy ${path.basename(filePath)}:`, e.message); + } + } + }; - console.info("🚀 Dev server started. Watching for changes..."); + console.info("🚀 Dev server started. Watching for changes..."); } async function ensureDir(dir) { - try { - await fs.mkdir(dir, { recursive: true }); - } catch {} + try { + await fs.mkdir(dir, { recursive: true }); + } catch {} } dev().catch((err) => { - console.error(err); - process.exit(1); + console.error(err); + process.exit(1); }); diff --git a/src/commands/__mocks__/obsidian.ts b/src/commands/__mocks__/obsidian.ts index 3fd9993..21ade65 100644 --- a/src/commands/__mocks__/obsidian.ts +++ b/src/commands/__mocks__/obsidian.ts @@ -32,9 +32,7 @@ export class MockVault { } getMarkdownFiles = vi.fn(() => { - return Object.keys(this._files).map((path) => - createTFile(this.asVault(), path) - ); + return Object.keys(this._files).map((path) => createTFile(this.asVault(), path)); }); process = vi.fn(async (file: TFile, func: (data: string) => string) => { diff --git a/src/commands/stopAllTimekeeps.test.ts b/src/commands/stopAllTimekeeps.test.ts index 75f1822..f304f16 100644 --- a/src/commands/stopAllTimekeeps.test.ts +++ b/src/commands/stopAllTimekeeps.test.ts @@ -8,10 +8,7 @@ import { expect, it, describe } from "vitest"; describe("stopAllTimekeeps", () => { it("should stop nothing when no markdown files", async () => { const vault = new MockVault(); - const amount = await stopAllTimekeeps( - vault.asVault(), - moment("2025-11-07T00:31:03.714Z") - ); + const amount = await stopAllTimekeeps(vault.asVault(), moment("2025-11-07T00:31:03.714Z")); expect(amount).toBe(0); }); @@ -23,10 +20,7 @@ describe("stopAllTimekeeps", () => { vault.addFile("TEST_MARKDOWN_2.md", ""); vault.addFile("TEST_MARKDOWN_3.md", ""); - const amount = await stopAllTimekeeps( - vault.asVault(), - moment("2025-11-07T00:31:03.714Z") - ); + const amount = await stopAllTimekeeps(vault.asVault(), moment("2025-11-07T00:31:03.714Z")); expect(amount).toBe(0); }); @@ -55,10 +49,7 @@ describe("stopAllTimekeeps", () => { const file2 = vault.addFile("TEST_MARKDOWN_2.md", TEST_MARKDOWN_3); const file3 = vault.addFile("TEST_MARKDOWN_3.md", TEST_MARKDOWN_3); - const amount = await stopAllTimekeeps( - vault.asVault(), - moment("2025-11-07T00:31:03.714Z") - ); + const amount = await stopAllTimekeeps(vault.asVault(), moment("2025-11-07T00:31:03.714Z")); const output1 = await vault.read(file1); expect(output1).toEqual(TEST_MARKDOWN_1_STOPPED); @@ -103,10 +94,7 @@ describe("stopAllTimekeeps", () => { const file2 = vault.addFile("TEST_MARKDOWN_2.md", TEST_MARKDOWN_2); const file3 = vault.addFile("TEST_MARKDOWN_3.md", TEST_MARKDOWN_3); - const amount = await stopAllTimekeeps( - vault.asVault(), - moment("2025-11-07T00:31:03.714Z") - ); + const amount = await stopAllTimekeeps(vault.asVault(), moment("2025-11-07T00:31:03.714Z")); const output1 = await vault.read(file1); expect(output1).toEqual(TEST_MARKDOWN_1_STOPPED); @@ -137,10 +125,7 @@ describe("stopAllTimekeeps", () => { vault.read.mockReturnValueOnce(Promise.resolve("")); await expect( - stopAllTimekeeps( - vault.asVault(), - moment("2025-11-07T00:31:03.714Z") - ) + stopAllTimekeeps(vault.asVault(), moment("2025-11-07T00:31:03.714Z")) ).rejects.toThrow(); }); }); diff --git a/src/commands/stopAllTimekeeps.ts b/src/commands/stopAllTimekeeps.ts index c48d1ce..0a1e58c 100644 --- a/src/commands/stopAllTimekeeps.ts +++ b/src/commands/stopAllTimekeeps.ts @@ -14,8 +14,7 @@ export async function stopAllTimekeeps(vault: Vault, currentTime: Moment) { const markdownFiles = vault.getMarkdownFiles(); const batchSize = 10; - const processFile = (file: TFile) => - stopFileTimekeeps(vault, file, currentTime); + const processFile = (file: TFile) => stopFileTimekeeps(vault, file, currentTime); let totalStopped = 0; diff --git a/src/commands/stopFileTimekeeps.test.ts b/src/commands/stopFileTimekeeps.test.ts index 65bd3af..ee08518 100644 --- a/src/commands/stopFileTimekeeps.test.ts +++ b/src/commands/stopFileTimekeeps.test.ts @@ -26,10 +26,7 @@ describe("stopFileTimekeeps", () => { "utf-8" ); - const file1 = vault.addFile( - "TEST_MARKDOWN_1.md", - TEST_MARKDOWN_1_STOPPED - ); + const file1 = vault.addFile("TEST_MARKDOWN_1.md", TEST_MARKDOWN_1_STOPPED); const amount = await stopFileTimekeeps( vault.asVault(), @@ -81,11 +78,7 @@ describe("stopFileTimekeeps", () => { ); const file = vault.addFile("TEST_MARKDOWN_2.md", TEST_MARKDOWN_2); - await stopFileTimekeeps( - vault.asVault(), - file, - moment("2025-11-07T00:31:03.714Z") - ); + await stopFileTimekeeps(vault.asVault(), file, moment("2025-11-07T00:31:03.714Z")); const output = await vault.read(file); expect(output).toEqual(TEST_MARKDOWN_2_STOPPED); @@ -108,11 +101,7 @@ describe("stopFileTimekeeps", () => { vault.read.mockReturnValueOnce(Promise.resolve("")); await expect( - stopFileTimekeeps( - vault.asVault(), - file, - moment("2025-11-07T00:31:03.714Z") - ) + stopFileTimekeeps(vault.asVault(), file, moment("2025-11-07T00:31:03.714Z")) ).rejects.toThrow(); }); }); diff --git a/src/commands/stopFileTimekeeps.ts b/src/commands/stopFileTimekeeps.ts index e8342ec..dfe5afa 100644 --- a/src/commands/stopFileTimekeeps.ts +++ b/src/commands/stopFileTimekeeps.ts @@ -2,10 +2,7 @@ import { Moment } from "moment"; import { TFile, Vault } from "obsidian"; import { Timekeep } from "@/timekeep/schema"; import { getRunningEntry, stopRunningEntries } from "@/timekeep"; -import { - replaceTimekeepCodeblock, - extractTimekeepCodeblocksWithPosition, -} from "@/timekeep/parser"; +import { replaceTimekeepCodeblock, extractTimekeepCodeblocksWithPosition } from "@/timekeep/parser"; /** * Stops all timekeeps in the provided file if there are any running. @@ -18,27 +15,20 @@ import { * @param currentTime The current time to use as the stopped time * @returns The total number of stopped timekeeps */ -export async function stopFileTimekeeps( - vault: Vault, - file: TFile, - currentTime: Moment -) { +export async function stopFileTimekeeps(vault: Vault, file: TFile, currentTime: Moment) { const content = await vault.cachedRead(file); const initialTimekeeps = extractTimekeepCodeblocksWithPosition(content); // Collect the indexes of running timekeeps - const runningIndexes = initialTimekeeps.reduce( - (runningIndexes, timekeep, index) => { - const entry = getRunningEntry(timekeep.timekeep.entries); + const runningIndexes = initialTimekeeps.reduce((runningIndexes, timekeep, index) => { + const entry = getRunningEntry(timekeep.timekeep.entries); - if (entry !== null) { - runningIndexes.push(index); - } + if (entry !== null) { + runningIndexes.push(index); + } - return runningIndexes; - }, - [] - ); + return runningIndexes; + }, []); // Nothing to process if (runningIndexes.length < 1) { @@ -64,12 +54,7 @@ export async function stopFileTimekeeps( entries: stopRunningEntries(timekeep.entries, currentTime), }; - content = replaceTimekeepCodeblock( - stoppedTimekeep, - content, - startLine, - endLine - ); + content = replaceTimekeepCodeblock(stoppedTimekeep, content, startLine, endLine); } return content; diff --git a/src/components/pdf/renderer.ts b/src/components/pdf/renderer.ts index e6b7b4c..07130b5 100644 --- a/src/components/pdf/renderer.ts +++ b/src/components/pdf/renderer.ts @@ -4,10 +4,10 @@ import type { Moment } from "moment"; import pdfMake from "pdfmake"; import type { - DynamicContent, - TableCell, - TDocumentDefinitions, - TFontDictionary, + DynamicContent, + TableCell, + TDocumentDefinitions, + TFontDictionary, } from "pdfmake/interfaces"; // Embedded fonts @@ -16,362 +16,346 @@ import RubikRegular from "@/fonts/Rubik-Regular.ttf"; import RubikBold from "@/fonts/Rubik-Bold.ttf"; import RobotoRegular from "@/fonts/Roboto-Regular.ttf"; import { getEntryDuration, getTotalDuration } from "@/timekeep"; -import { - formatDurationLong, - formatDurationShort, - formatPdfDate, - formatPdfRowDate, -} from "@/utils"; +import { formatDurationLong, formatDurationShort, formatPdfDate, formatPdfRowDate } from "@/utils"; import { Readable } from "stream"; const fonts: TFontDictionary = { - Roboto: { - normal: "Roboto-Regular.ttf", - bold: "Roboto-Bold.ttf", - }, - Rubik: { - normal: "Rubik-Regular.ttf", - bold: "Rubik-Bold.ttf", - }, + Roboto: { + normal: "Roboto-Regular.ttf", + bold: "Roboto-Bold.ttf", + }, + Rubik: { + normal: "Rubik-Regular.ttf", + bold: "Rubik-Bold.ttf", + }, }; function stripDataUrlPrefix(text: string): string { - return text.substring("data:font/ttf;base64,".length); + return text.substring("data:font/ttf;base64,".length); } pdfMake.addVirtualFileSystem({ - "Roboto-Regular.ttf": stripDataUrlPrefix(RobotoRegular), - "Roboto-Bold.ttf": stripDataUrlPrefix(RobotoBold), - "Rubik-Regular.ttf": stripDataUrlPrefix(RubikRegular), - "Rubik-Bold.ttf": stripDataUrlPrefix(RubikBold), + "Roboto-Regular.ttf": stripDataUrlPrefix(RobotoRegular), + "Roboto-Bold.ttf": stripDataUrlPrefix(RobotoBold), + "Rubik-Regular.ttf": stripDataUrlPrefix(RubikRegular), + "Rubik-Bold.ttf": stripDataUrlPrefix(RubikBold), }); pdfMake.addFonts(fonts); export async function createPdfExport( - timekeep: Timekeep, - settings: TimekeepSettings, - currentTime: Moment + timekeep: Timekeep, + settings: TimekeepSettings, + currentTime: Moment ): Promise { - const definition = createPdfDefinition(timekeep, settings, currentTime); - const pdf = pdfMake.createPdf(definition, {}); - const stream = await pdf.getBuffer(); - return Readable.from([stream]); + const definition = createPdfDefinition(timekeep, settings, currentTime); + const pdf = pdfMake.createPdf(definition, {}); + const stream = await pdf.getBuffer(); + return Readable.from([stream]); } export function createPdfDefinition( - timekeep: Timekeep, - settings: TimekeepSettings, - currentTime: Moment + timekeep: Timekeep, + settings: TimekeepSettings, + currentTime: Moment ): TDocumentDefinitions { - const duration = getTotalDuration(timekeep.entries, currentTime); - const currentDate = formatPdfDate(currentTime, settings); - const totalDuration = formatDurationLong(duration); - const totalDurationShort = formatDurationShort(duration); + const duration = getTotalDuration(timekeep.entries, currentTime); + const currentDate = formatPdfDate(currentTime, settings); + const totalDuration = formatDurationLong(duration); + const totalDurationShort = formatDurationShort(duration); - return { - content: [ - createPdfHeader( - settings.pdfTitle, - currentDate, - totalDuration, - totalDurationShort - ), - createPdfTable(timekeep, totalDuration, settings, currentTime), - ], - footer: createPdfFooter(settings), - defaultStyle: { - font: settings.pdfFontFamily, - }, - pageSize: "A4", - pageMargins: 15, - styles: { - heading: { - marginBottom: 5, - columnGap: 10, - }, - title: { - bold: true, - fontSize: 12, - marginBottom: 5, - }, - details: { - marginBottom: 5, - }, - footNote: { - noWrap: true, - fontSize: 6, - bold: true, - }, - pageNumber: { - noWrap: true, - fontSize: 6, - }, - footer: { - marginLeft: 15, - marginRight: 15, - }, - tableCell: { - fontSize: 8, - }, - tableCellTime: { - alignment: "right", - }, - tableCellHeader: { - bold: true, - }, - }, - }; + return { + content: [ + createPdfHeader(settings.pdfTitle, currentDate, totalDuration, totalDurationShort), + createPdfTable(timekeep, totalDuration, settings, currentTime), + ], + footer: createPdfFooter(settings), + defaultStyle: { + font: settings.pdfFontFamily, + }, + pageSize: "A4", + pageMargins: 15, + styles: { + heading: { + marginBottom: 5, + columnGap: 10, + }, + title: { + bold: true, + fontSize: 12, + marginBottom: 5, + }, + details: { + marginBottom: 5, + }, + footNote: { + noWrap: true, + fontSize: 6, + bold: true, + }, + pageNumber: { + noWrap: true, + fontSize: 6, + }, + footer: { + marginLeft: 15, + marginRight: 15, + }, + tableCell: { + fontSize: 8, + }, + tableCellTime: { + alignment: "right", + }, + tableCellHeader: { + bold: true, + }, + }, + }; } function createPdfHeader( - pdfTitle: string, - currentDate: string, - totalDuration: string, - totalDurationShort: string + pdfTitle: string, + currentDate: string, + totalDuration: string, + totalDurationShort: string ): pdfMake.Content { - return [ - { - columns: [ - { - text: pdfTitle, - alignment: "left", - style: "title", - width: "50%", - }, - { - text: "Timesheet", - alignment: "right", - style: "title", - width: "50%", - }, - ], - style: "heading", - }, - { - stack: [ - createPdfHeaderDetailField("Date", currentDate), - createPdfHeaderDetailField("Total Duration", totalDuration), - createPdfHeaderDetailField( - "Total Duration (hours)", - totalDurationShort - ), - ], + return [ + { + columns: [ + { + text: pdfTitle, + alignment: "left", + style: "title", + width: "50%", + }, + { + text: "Timesheet", + alignment: "right", + style: "title", + width: "50%", + }, + ], + style: "heading", + }, + { + stack: [ + createPdfHeaderDetailField("Date", currentDate), + createPdfHeaderDetailField("Total Duration", totalDuration), + createPdfHeaderDetailField("Total Duration (hours)", totalDurationShort), + ], - style: "details", - }, - ]; + style: "details", + }, + ]; } -function createPdfHeaderDetailField( - title: string, - value: string -): pdfMake.Content { - return { - text: [ - { text: title + ": ", fontSize: 8, bold: true }, - { text: value, fontSize: 8 }, - ], - marginBottom: 8, - }; +function createPdfHeaderDetailField(title: string, value: string): pdfMake.Content { + return { + text: [ + { text: title + ": ", fontSize: 8, bold: true }, + { text: value, fontSize: 8 }, + ], + marginBottom: 8, + }; } function createPdfFooter(settings: TimekeepSettings): DynamicContent { - return function (currentPage: number, pageCount: number) { - return { - columns: [ - { - text: `${settings.pdfFootnote}`, - style: "footNote", - width: "50%", - alignment: "left", - }, - { - text: `${currentPage} of ${pageCount}`, - style: "pageNumber", - width: "50%", - alignment: "right", - }, - ], - style: "footer", - }; - }; + return function (currentPage: number, pageCount: number) { + return { + columns: [ + { + text: `${settings.pdfFootnote}`, + style: "footNote", + width: "50%", + alignment: "left", + }, + { + text: `${currentPage} of ${pageCount}`, + style: "pageNumber", + width: "50%", + alignment: "right", + }, + ], + style: "footer", + }; + }; } function createPdfTable( - timekeep: Timekeep, - totalDuration: string, - settings: TimekeepSettings, - currentTime: Moment + timekeep: Timekeep, + totalDuration: string, + settings: TimekeepSettings, + currentTime: Moment ): pdfMake.Content { - const rows = createPdfTableRows(timekeep.entries, settings, currentTime); + const rows = createPdfTableRows(timekeep.entries, settings, currentTime); - return { - table: { - headerRows: 1, - widths: ["*", 70, 70, 50], - body: [ - [ - { - text: "Block Name", - style: ["tableCell", "tableCellHeader"], - border: [true, false, false, true], - }, - { - text: "Start Time", - style: ["tableCell", "tableCellHeader"], - alignment: "center", - border: [false, false, false, true], - }, - { - text: "End Time", - style: ["tableCell", "tableCellHeader"], - alignment: "center", - border: [false, false, false, true], - }, - { - text: "Duration", - style: ["tableCell", "tableCellHeader"], - alignment: "right", - border: [false, false, true, true], - }, - ], - ...rows.map((row) => row.row), - [ - { text: "Total", style: "tableCell" }, - { text: "", style: "tableCell" }, - { text: "", style: "tableCell" }, - { - text: totalDuration, - style: ["tableCell", "tableCellFooter"], - bold: true, - alignment: "right", - }, - ], - ], - }, + return { + table: { + headerRows: 1, + widths: ["*", 70, 70, 50], + body: [ + [ + { + text: "Block Name", + style: ["tableCell", "tableCellHeader"], + border: [true, false, false, true], + }, + { + text: "Start Time", + style: ["tableCell", "tableCellHeader"], + alignment: "center", + border: [false, false, false, true], + }, + { + text: "End Time", + style: ["tableCell", "tableCellHeader"], + alignment: "center", + border: [false, false, false, true], + }, + { + text: "Duration", + style: ["tableCell", "tableCellHeader"], + alignment: "right", + border: [false, false, true, true], + }, + ], + ...rows.map((row) => row.row), + [ + { text: "Total", style: "tableCell" }, + { text: "", style: "tableCell" }, + { text: "", style: "tableCell" }, + { + text: totalDuration, + style: ["tableCell", "tableCellFooter"], + bold: true, + alignment: "right", + }, + ], + ], + }, - layout: { - fillColor: function (rowIndex, _node, _columnIndex) { - // Header & Footer styling - if (rowIndex === 0 || rowIndex === rows.length + 1) { - return "#ececec"; - } + layout: { + fillColor: function (rowIndex, _node, _columnIndex) { + // Header & Footer styling + if (rowIndex === 0 || rowIndex === rows.length + 1) { + return "#ececec"; + } - // Group row styling - if (rowIndex > 0 && rowIndex - 1 < rows.length) { - if (rows[rowIndex - 1].group) { - return "#f4f4f4"; - } - } + // Group row styling + if (rowIndex > 0 && rowIndex - 1 < rows.length) { + if (rows[rowIndex - 1].group) { + return "#f4f4f4"; + } + } - // Default styling - return "#ffffff"; - }, + // Default styling + return "#ffffff"; + }, - vLineColor: function (_columnIndex, _node, _rowIndex) { - return "#ececec"; - }, + vLineColor: function (_columnIndex, _node, _rowIndex) { + return "#ececec"; + }, - hLineColor: function (_rowIndex, _node, _columnIndex) { - return "#ececec"; - }, - paddingBottom: cellPadding, - paddingLeft: cellPadding, - paddingTop: cellPadding, - paddingRight: cellPadding, - }, - }; + hLineColor: function (_rowIndex, _node, _columnIndex) { + return "#ececec"; + }, + paddingBottom: cellPadding, + paddingLeft: cellPadding, + paddingTop: cellPadding, + paddingRight: cellPadding, + }, + }; } const cellPadding = () => 8; type TableEntryRow = { - row: TableCell[]; - depth: number; - group: boolean; + row: TableCell[]; + depth: number; + group: boolean; }; function createPdfTableRows( - entries: TimeEntry[], - settings: TimekeepSettings, - currentTime: Moment + entries: TimeEntry[], + settings: TimekeepSettings, + currentTime: Moment ): TableEntryRow[] { - type StackEntry = { entry: TimeEntry; depth: number }; + type StackEntry = { entry: TimeEntry; depth: number }; - const rows: TableEntryRow[] = []; - const stack: StackEntry[] = entries.map((entry) => ({ entry, depth: 0 })); + const rows: TableEntryRow[] = []; + const stack: StackEntry[] = entries.map((entry) => ({ entry, depth: 0 })); - while (stack.length > 0) { - const { entry, depth } = stack.pop()!; + while (stack.length > 0) { + const { entry, depth } = stack.pop()!; - rows.push({ - group: entry.subEntries !== null && entry.subEntries.length > 0, - row: createTableEntryCells(entry, depth, settings, currentTime), - depth, - }); + rows.push({ + group: entry.subEntries !== null && entry.subEntries.length > 0, + row: createTableEntryCells(entry, depth, settings, currentTime), + depth, + }); - if (entry.subEntries && entry.subEntries.length > 0) { - for (let i = entry.subEntries.length - 1; i >= 0; i--) { - stack.push({ - entry: entry.subEntries[i], - depth: depth + 1, - }); - } - } - } + if (entry.subEntries && entry.subEntries.length > 0) { + for (let i = entry.subEntries.length - 1; i >= 0; i--) { + stack.push({ + entry: entry.subEntries[i], + depth: depth + 1, + }); + } + } + } - return rows; + return rows; } function createTableEntryCells( - entry: TimeEntry, - depth: number, - settings: TimekeepSettings, - currentTime: Moment + entry: TimeEntry, + depth: number, + settings: TimekeepSettings, + currentTime: Moment ): TableCell[] { - const duration = getEntryDuration(entry, currentTime); - const durationFormatted = formatDurationLong(duration); + const duration = getEntryDuration(entry, currentTime); + const durationFormatted = formatDurationLong(duration); - let startTime: string; - let endTime: string; + let startTime: string; + let endTime: string; - if (entry.startTime !== null) { - startTime = formatPdfRowDate(entry.startTime, settings); - endTime = formatPdfRowDate(entry.endTime ?? currentTime, settings); - } else { - startTime = ""; - endTime = ""; - } + if (entry.startTime !== null) { + startTime = formatPdfRowDate(entry.startTime, settings); + endTime = formatPdfRowDate(entry.endTime ?? currentTime, settings); + } else { + startTime = ""; + endTime = ""; + } - const marginLeft = depth * 5; + const marginLeft = depth * 5; - if (depth > 0) { - const _bg = "#999"; - } + if (depth > 0) { + const _bg = "#999"; + } - return [ - { - text: entry.name, - style: ["tableCell", "tableCellBlock"], - marginLeft, - border: [true, false, false, true], - }, - { - text: startTime, - style: ["tableCell", "tableCellTime"], - alignment: "center", - }, - { - text: endTime, - style: ["tableCell", "tableCellTime"], - alignment: "center", - }, - { - text: durationFormatted, - style: ["tableCell", "tableCellTime"], - alignment: "right", - border: [false, false, true, true], - }, - ]; + return [ + { + text: entry.name, + style: ["tableCell", "tableCellBlock"], + marginLeft, + border: [true, false, false, true], + }, + { + text: startTime, + style: ["tableCell", "tableCellTime"], + alignment: "center", + }, + { + text: endTime, + style: ["tableCell", "tableCellTime"], + alignment: "center", + }, + { + text: durationFormatted, + style: ["tableCell", "tableCellTime"], + alignment: "right", + border: [false, false, true, true], + }, + ]; } diff --git a/src/components/timesheetApp.ts b/src/components/timesheetApp.ts index c71d324..8dfc3d8 100644 --- a/src/components/timesheetApp.ts +++ b/src/components/timesheetApp.ts @@ -63,25 +63,11 @@ export class TimesheetApp extends Component { this.#wrapperEl = wrapperEl; - const counters = new TimesheetCounters( - wrapperEl, - this.settings, - this.timekeep - ); + const counters = new TimesheetCounters(wrapperEl, this.settings, this.timekeep); - const start = new TimesheetStart( - wrapperEl, - this.app, - this.timekeep, - this.settings - ); + const start = new TimesheetStart(wrapperEl, this.app, this.timekeep, this.settings); - const table = new TimesheetTable( - wrapperEl, - this.app, - this.timekeep, - this.settings - ); + const table = new TimesheetTable(wrapperEl, this.app, this.timekeep, this.settings); const exportActions = new TimesheetExportActions( wrapperEl, diff --git a/src/components/timesheetCounters.ts b/src/components/timesheetCounters.ts index 65ed803..7b2f932 100644 --- a/src/components/timesheetCounters.ts +++ b/src/components/timesheetCounters.ts @@ -3,12 +3,7 @@ import type { Store } from "@/store"; import type { Timekeep } from "@/timekeep/schema"; import { Component } from "obsidian"; import moment from "moment"; -import { - getEntryDuration, - getRunningEntry, - getTotalDuration, - isKeepRunning, -} from "@/timekeep"; +import { getEntryDuration, getRunningEntry, getTotalDuration, isKeepRunning } from "@/timekeep"; import { formatDuration } from "@/utils"; import { TimesheetTimer } from "./timesheetTimer"; @@ -96,10 +91,7 @@ export class TimesheetCounters extends Component { // Only schedule further updates if we are running const timekeep = this.timekeep.getState(); if (isKeepRunning(timekeep)) { - const intervalID = window.setInterval( - this.updateTimers.bind(this), - 1000 - ); + const intervalID = window.setInterval(this.updateTimers.bind(this), 1000); this.currentContentInterval = intervalID; this.registerInterval(intervalID); @@ -116,9 +108,7 @@ export class TimesheetCounters extends Component { const currentTime = moment(); const total = getTotalDuration(timekeep.entries, currentTime); const runningEntry = getRunningEntry(timekeep.entries); - const current = runningEntry - ? getEntryDuration(runningEntry, currentTime) - : 0; + const current = runningEntry ? getEntryDuration(runningEntry, currentTime) : 0; this.currentTimer.setHidden(runningEntry === null); this.currentTimer.setValues( diff --git a/src/components/timesheetExportActions.ts b/src/components/timesheetExportActions.ts index d221716..54354f4 100644 --- a/src/components/timesheetExportActions.ts +++ b/src/components/timesheetExportActions.ts @@ -66,29 +66,13 @@ export class TimesheetExportActions extends Component { text: "Save PDF", }); - this.registerDomEvent( - copyMarkdownButton, - "click", - this.onCopyMarkdown.bind(this) - ); + this.registerDomEvent(copyMarkdownButton, "click", this.onCopyMarkdown.bind(this)); - this.registerDomEvent( - copyCSVButton, - "click", - this.onCopyCSV.bind(this) - ); + this.registerDomEvent(copyCSVButton, "click", this.onCopyCSV.bind(this)); - this.registerDomEvent( - copyJSONButton, - "click", - this.onCopyJSON.bind(this) - ); + this.registerDomEvent(copyJSONButton, "click", this.onCopyJSON.bind(this)); - this.registerDomEvent( - savePdfButton, - "click", - this.onSavePDF.bind(this) - ); + this.registerDomEvent(savePdfButton, "click", this.onSavePDF.bind(this)); // Disable and hide the save as PDF button on mobile if (Platform.isMobileApp) { @@ -96,10 +80,8 @@ export class TimesheetExportActions extends Component { savePdfButton.hidden = true; } - const createCustomButtons = - this.createCustomOutputFormatButtons.bind(this); - const unsubscribeCustomFormats = - this.customOutputFormats.subscribe(createCustomButtons); + const createCustomButtons = this.createCustomOutputFormatButtons.bind(this); + const unsubscribeCustomFormats = this.customOutputFormats.subscribe(createCustomButtons); this.register(unsubscribeCustomFormats); createCustomButtons(); } diff --git a/src/components/timesheetRowContainer.ts b/src/components/timesheetRowContainer.ts index 7d3c9b3..644027c 100644 --- a/src/components/timesheetRowContainer.ts +++ b/src/components/timesheetRowContainer.ts @@ -98,9 +98,7 @@ export class TimesheetRowContainer extends Component { * * @param content The new content to show */ - private swapContent( - content: TimesheetRowContent | TimesheetRowContentEditing | undefined - ) { + private swapContent(content: TimesheetRowContent | TimesheetRowContentEditing | undefined) { if (this.#content) { this.removeChild(this.#content); } diff --git a/src/components/timesheetRowContent.ts b/src/components/timesheetRowContent.ts index 262eed4..32cff64 100644 --- a/src/components/timesheetRowContent.ts +++ b/src/components/timesheetRowContent.ts @@ -84,11 +84,7 @@ export class TimesheetRowContent extends Component { title: entry.name, }); - this.registerDomEvent( - nameEl, - "click", - this.onToggleCollapsed.bind(this) - ); + this.registerDomEvent(nameEl, "click", this.onToggleCollapsed.bind(this)); if (entry.subEntries !== null && entry.folder) { createObsidianIcon(nameEl, "folder", "timekeep-folder-icon"); @@ -131,10 +127,7 @@ export class TimesheetRowContent extends Component { cls: ["timekeep-col", "timekeep-col--duration"], }); - const duration = new TimesheetRowDurationComponent( - durationColEl, - entry - ); + const duration = new TimesheetRowDurationComponent(durationColEl, entry); this.addChild(duration); @@ -158,30 +151,18 @@ export class TimesheetRowContent extends Component { createObsidianIcon(editButton, "edit", "button-icon"); - this.registerDomEvent( - startButton, - "click", - this.onClickStart.bind(this) - ); + this.registerDomEvent(startButton, "click", this.onClickStart.bind(this)); this.registerDomEvent(editButton, "click", this.onBeginEditing); this.updateTimes(); this.updateState(); - const unsubscribeSettings = this.settings.subscribe( - this.updateTimes.bind(this) - ); + const unsubscribeSettings = this.settings.subscribe(this.updateTimes.bind(this)); this.register(unsubscribeSettings); - this.#columns.push( - nameColEl, - startTimeColEl, - endTimeColEl, - durationColEl, - actionsColEl - ); + this.#columns.push(nameColEl, startTimeColEl, endTimeColEl, durationColEl, actionsColEl); } onunload(): void { @@ -203,9 +184,7 @@ export class TimesheetRowContent extends Component { ? formatTimestamp(entry.startTime, settings) : ""; - this.#endTimeEl.textContent = entry.endTime - ? formatTimestamp(entry.endTime, settings) - : ""; + this.#endTimeEl.textContent = entry.endTime ? formatTimestamp(entry.endTime, settings) : ""; } updateState() { @@ -213,12 +192,10 @@ export class TimesheetRowContent extends Component { const entry = this.entry; - const isSelfRunning = - entry.subEntries === null && isEntryRunning(entry); + const isSelfRunning = entry.subEntries === null && isEntryRunning(entry); const isRunningWithin = - entry.subEntries !== null && - getRunningEntry(entry.subEntries) !== null; + entry.subEntries !== null && getRunningEntry(entry.subEntries) !== null; const isInvalidEntry = entry.startTime !== null && @@ -229,10 +206,7 @@ export class TimesheetRowContent extends Component { rowEl.setAttribute("data-running", String(isSelfRunning)); rowEl.setAttribute("data-running-within", String(isRunningWithin)); - rowEl.setAttribute( - "data-sub-entires", - String(this.entry.subEntries !== null) - ); + rowEl.setAttribute("data-sub-entires", String(this.entry.subEntries !== null)); rowEl.setAttribute("data-invalid", String(isInvalidEntry)); } @@ -252,11 +226,7 @@ export class TimesheetRowContent extends Component { this.timekeep.setState((timekeep) => { const currentTime = moment(); - const entries = startNewNestedEntry( - currentTime, - entry.id, - timekeep.entries - ); + const entries = startNewNestedEntry(currentTime, entry.id, timekeep.entries); return { ...timekeep, diff --git a/src/components/timesheetRowContentEditing.ts b/src/components/timesheetRowContentEditing.ts index fa44ac6..0bc1b16 100644 --- a/src/components/timesheetRowContentEditing.ts +++ b/src/components/timesheetRowContentEditing.ts @@ -129,11 +129,7 @@ export class TimesheetRowContentEditing extends Component { createObsidianIcon(deleteButton, "trash", "text-button-icon"); deleteButton.appendText("Delete"); - this.registerDomEvent( - deleteButton, - "click", - this.onConfirmDelete.bind(this) - ); + this.registerDomEvent(deleteButton, "click", this.onConfirmDelete.bind(this)); const onUpdateState = this.onUpdateState.bind(this); const unsubscribeSettings = this.settings.subscribe(onUpdateState); @@ -196,11 +192,7 @@ export class TimesheetRowContentEditing extends Component { } onSubmit(event: Event) { - if ( - !this.#nameInputEl || - !this.#startTimeInputEl || - !this.#endTimeInputEl - ) { + if (!this.#nameInputEl || !this.#startTimeInputEl || !this.#endTimeInputEl) { return; } @@ -219,10 +211,7 @@ export class TimesheetRowContentEditing extends Component { // Update the start and end times for non groups if (newEntry.subEntries === null) { if (entry.startTime !== null) { - const startTimeValue = parseEditableTimestamp( - startTime, - settings - ); + const startTimeValue = parseEditableTimestamp(startTime, settings); if (startTimeValue.isValid()) { newEntry.startTime = startTimeValue; } diff --git a/src/components/timesheetRowDuration.ts b/src/components/timesheetRowDuration.ts index 7f7c3bb..abc796e 100644 --- a/src/components/timesheetRowDuration.ts +++ b/src/components/timesheetRowDuration.ts @@ -46,10 +46,7 @@ export class TimesheetRowDurationComponent extends Component { // Only schedule further updates if we are running if (isRunning) { - const intervalID = window.setInterval( - this.updateTime.bind(this), - 1000 - ); + const intervalID = window.setInterval(this.updateTime.bind(this), 1000); this.currentContentInterval = intervalID; this.registerInterval(intervalID); diff --git a/src/components/timesheetSaveError.ts b/src/components/timesheetSaveError.ts index f00b06f..ba380f3 100644 --- a/src/components/timesheetSaveError.ts +++ b/src/components/timesheetSaveError.ts @@ -57,11 +57,7 @@ export class TimesheetSaveError extends Component { text: "Copy Timekeep", }); - this.registerDomEvent( - retryButton, - "click", - this.onRetrySave.bind(this) - ); + this.registerDomEvent(retryButton, "click", this.onRetrySave.bind(this)); this.registerDomEvent(copyButton, "click", this.onCopy.bind(this)); } diff --git a/src/components/timesheetStart.ts b/src/components/timesheetStart.ts index dcec823..8839de0 100644 --- a/src/components/timesheetStart.ts +++ b/src/components/timesheetStart.ts @@ -117,9 +117,7 @@ export class TimesheetStart extends Component { * * @param content The new content to show */ - private swapContent( - content: TimesheetStartRunning | TimekeepStartEditing | undefined - ) { + private swapContent(content: TimesheetStartRunning | TimekeepStartEditing | undefined) { if (this.#content) { this.removeChild(this.#content); } @@ -149,12 +147,9 @@ export class TimesheetStart extends Component { const currentEntry = getRunningEntry(timekeep.entries); const isTimekeepRunning = currentEntry !== null; - this.#blockPauseWarningEl.hidden = - currentEntry === null || currentEntry.startTime === null; + this.#blockPauseWarningEl.hidden = currentEntry === null || currentEntry.startTime === null; - this.#startButtonEl.title = isTimekeepRunning - ? "Stop and start" - : "Start"; + this.#startButtonEl.title = isTimekeepRunning ? "Stop and start" : "Start"; } setEmptyView() { diff --git a/src/components/timesheetStartRunning.ts b/src/components/timesheetStartRunning.ts index 278d2cd..fefa330 100644 --- a/src/components/timesheetStartRunning.ts +++ b/src/components/timesheetStartRunning.ts @@ -139,10 +139,7 @@ export class TimesheetStartRunning extends Component { const timekeep = this.timekeep.getState(); const settings = this.settings.getState(); - this.#timeValueEl.textContent = formatTimestamp( - currentEntry.startTime, - settings - ); + this.#timeValueEl.textContent = formatTimestamp(currentEntry.startTime, settings); // Clear existing path this.#pathEl.empty(); @@ -151,9 +148,7 @@ export class TimesheetStartRunning extends Component { if (pathToEntry && pathToEntry.length > 0) { for (let i = 0; i < pathToEntry.length; i++) { const path = pathToEntry[i]; - const text = `${path.name} ${ - i < pathToEntry.length - 1 ? " >" : "" - }`; + const text = `${path.name} ${i < pathToEntry.length - 1 ? " >" : ""}`; this.#pathEl.createSpan({ text }); } } diff --git a/src/components/timesheetTable.ts b/src/components/timesheetTable.ts index c43d321..29a56f7 100644 --- a/src/components/timesheetTable.ts +++ b/src/components/timesheetTable.ts @@ -151,15 +151,8 @@ export class TimesheetTable extends Component { this.addChild(row); this.#rows.push(row); - if ( - entry.subEntries && - !entry.collapsed && - entry.subEntries.length > 0 - ) { - const sortedEntries = getEntriesSorted( - entry.subEntries, - settings - ); + if (entry.subEntries && !entry.collapsed && entry.subEntries.length > 0) { + const sortedEntries = getEntriesSorted(entry.subEntries, settings); for (let i = sortedEntries.length - 1; i >= 0; i--) { stack.push({ diff --git a/src/export/index.ts b/src/export/index.ts index 7df1ae8..eaa3174 100644 --- a/src/export/index.ts +++ b/src/export/index.ts @@ -25,9 +25,7 @@ export function createRawTable( settings: TimekeepSettings, currentTime: Moment ): RawTableRow[] { - return entries.flatMap((entry) => - createRawTableEntries(entry, settings, currentTime) - ); + return entries.flatMap((entry) => createRawTableEntries(entry, settings, currentTime)); } /** @@ -51,8 +49,7 @@ export function createRawTableEntries( entry.startTime ? formatTimestamp(entry.startTime, settings) : "", entry.endTime ? formatTimestamp(entry.endTime, settings) : "", // Include duration for entries that are finished - (entry.startTime !== null && entry.endTime !== null) || - entry.subEntries !== null + (entry.startTime !== null && entry.endTime !== null) || entry.subEntries !== null ? formatDuration( settings.exportDurationFormat, getEntryDuration(entry, currentTime) diff --git a/src/export/markdown-table.ts b/src/export/markdown-table.ts index 428599a..69c0a3f 100644 --- a/src/export/markdown-table.ts +++ b/src/export/markdown-table.ts @@ -27,10 +27,7 @@ function createFooter( currentTime: Moment, durationFormat: DurationFormat ): RawTableRow { - const total: string = formatDuration( - durationFormat, - getTotalDuration(entries, currentTime) - ); + const total: string = formatDuration(durationFormat, getTotalDuration(entries, currentTime)); return ["**Total**", "", "", `**${total}**`]; } @@ -73,11 +70,7 @@ export function createMarkdownTable( // Markdown raw table contents ...createRawTable(timekeep.entries, settings, currentTime), // Markdown footer row - createFooter( - timekeep.entries, - currentTime, - settings.exportDurationFormat - ), + createFooter(timekeep.entries, currentTime, settings.exportDurationFormat), ]; // Array of indexes for all the columns (0 - TOTAL_COLUMNS) diff --git a/src/export/pdf.ts b/src/export/pdf.ts index 7bd7cc8..b651256 100644 --- a/src/export/pdf.ts +++ b/src/export/pdf.ts @@ -6,10 +6,7 @@ import { Timekeep } from "@/timekeep/schema"; import { mkdir, writeFile } from "fs/promises"; import { TimekeepSettings, PdfExportBehavior } from "@/settings"; -export async function exportPdf( - timekeep: Timekeep, - settings: TimekeepSettings -) { +export async function exportPdf(timekeep: Timekeep, settings: TimekeepSettings) { // Pdf exports don't work in mobile mode if (Platform.isMobileApp) return; diff --git a/src/main.ts b/src/main.ts index fedbd83..70ef920 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,16 +1,8 @@ import moment, { Moment } from "moment"; import { Store, createStore } from "@/store"; import { TimekeepSettingsTab } from "@/settings-tab"; -import { - defaultSettings, - TimekeepSettings, - legacySettingsCompatibility, -} from "@/settings"; -import { - load, - replaceTimekeepCodeblock, - extractTimekeepCodeblocks, -} from "@/timekeep/parser"; +import { defaultSettings, TimekeepSettings, legacySettingsCompatibility } from "@/settings"; +import { load, replaceTimekeepCodeblock, extractTimekeepCodeblocks } from "@/timekeep/parser"; import { isKeepRunning, isEntryRunning, @@ -53,11 +45,7 @@ export default class TimekeepPlugin extends Plugin { getEntryDuration: (entry: TimeEntry, currentTime: Moment) => number; getTotalDuration: (entries: TimeEntry[], currentTime: Moment) => number; stopAllTimekeeps: (vault: Vault, currentTime: Moment) => Promise; - stopFileTimekeeps: ( - vault: Vault, - file: TFile, - currentTime: Moment - ) => Promise; + stopFileTimekeeps: (vault: Vault, file: TFile, currentTime: Moment) => Promise; constructor(app: ObsidianApp, manifest: PluginManifest) { super(app, manifest); @@ -103,11 +91,7 @@ export default class TimekeepPlugin extends Plugin { this.registerMarkdownCodeBlockProcessor( "timekeep", - ( - source: string, - el: HTMLElement, - context: MarkdownPostProcessorContext - ) => { + (source: string, el: HTMLElement, context: MarkdownPostProcessorContext) => { const loadResult = load(source); context.addChild( @@ -140,23 +124,13 @@ export default class TimekeepPlugin extends Plugin { this.addCommand({ id: `create-merged`, name: `Create Merged Tracker`, - callback: () => - new TimekeepMergerModal( - this.app, - this.settingsStore, - false - ).open(), + callback: () => new TimekeepMergerModal(this.app, this.settingsStore, false).open(), }); this.addCommand({ id: `export-merged-pdf`, name: `Export Merged Tracker PDF`, - callback: () => - new TimekeepMergerModal( - this.app, - this.settingsStore, - true - ).open(), + callback: () => new TimekeepMergerModal(this.app, this.settingsStore, true).open(), }); this.addCommand({ @@ -186,10 +160,7 @@ export default class TimekeepPlugin extends Plugin { error = "Unknown error occurred"; } - new Notice( - "Failed to stop timekeeps: " + errorMessage, - 1500 - ); + new Notice("Failed to stop timekeeps: " + errorMessage, 1500); }); }, }); @@ -199,8 +170,7 @@ export default class TimekeepPlugin extends Plugin { name: `Stop All Running Trackers (Current File Only)`, callback: () => { const currentTime = moment(); - const currentFile = - this.app.workspace.activeEditor?.file ?? null; + const currentFile = this.app.workspace.activeEditor?.file ?? null; if (currentFile === null) { new Notice("No active file detected", 1500); @@ -229,10 +199,7 @@ export default class TimekeepPlugin extends Plugin { error = "Unknown error occurred"; } - new Notice( - "Failed to stop timekeeps: " + errorMessage, - 1500 - ); + new Notice("Failed to stop timekeeps: " + errorMessage, 1500); }); }, }); diff --git a/src/output.ts b/src/output.ts index 95ed705..d5c663a 100644 --- a/src/output.ts +++ b/src/output.ts @@ -17,9 +17,5 @@ export interface CustomOutputFormat { * @param settings The timekeep settings * @param currentTime The current time to use for unfinished entries */ - onExport( - timekeep: Timekeep, - settings: TimekeepSettings, - currentTime: Moment - ): void; + onExport(timekeep: Timekeep, settings: TimekeepSettings, currentTime: Moment): void; } diff --git a/src/settings-tab.ts b/src/settings-tab.ts index b0a3979..001ece6 100644 --- a/src/settings-tab.ts +++ b/src/settings-tab.ts @@ -43,9 +43,7 @@ export class TimekeepSettingsTab extends PluginSettingTab { t.setValue(String(settings.timestampFormat)); t.onChange((v) => { // Only use a custom format if the value is not blank - const newFormat = v.length - ? v - : defaultSettings.timestampFormat; + const newFormat = v.length ? v : defaultSettings.timestampFormat; this.settingsStore.setState((currentValue) => ({ ...currentValue, @@ -56,18 +54,13 @@ export class TimekeepSettingsTab extends PluginSettingTab { new Setting(this.containerEl) .setName("Primary duration format") - .setDesc( - "Format to show durations for the current and total timers" - ) + .setDesc("Format to show durations for the current and total timers") .addDropdown((t) => { t.addOptions({ - [DurationFormat.LONG]: - "Long - Format including all units (1h 30m 25s)", - [DurationFormat.SHORT]: - "Short - Format just including hours (1.5h)", - [DurationFormat.DECIMAL]: - "Decimal - Short format without units (1.5)", + [DurationFormat.LONG]: "Long - Format including all units (1h 30m 25s)", + [DurationFormat.SHORT]: "Short - Format just including hours (1.5h)", + [DurationFormat.DECIMAL]: "Decimal - Short format without units (1.5)", }); t.setValue(String(settings.primaryDurationFormat)); t.onChange((v) => { @@ -80,18 +73,13 @@ export class TimekeepSettingsTab extends PluginSettingTab { new Setting(this.containerEl) .setName("Secondary duration format") - .setDesc( - "Format to show a second durations under the current and total timers" - ) + .setDesc("Format to show a second durations under the current and total timers") .addDropdown((t) => { t.addOptions({ - [DurationFormat.LONG]: - "Long - Format including all units (1h 30m 25s)", - [DurationFormat.SHORT]: - "Short - Format just including hours (1.5h)", - [DurationFormat.DECIMAL]: - "Decimal - Short format without units (1.5)", + [DurationFormat.LONG]: "Long - Format including all units (1h 30m 25s)", + [DurationFormat.SHORT]: "Short - Format just including hours (1.5h)", + [DurationFormat.DECIMAL]: "Decimal - Short format without units (1.5)", [DurationFormat.NONE]: "None - No time is displayed", }); t.setValue(String(settings.secondaryDurationFormat)); @@ -105,9 +93,7 @@ export class TimekeepSettingsTab extends PluginSettingTab { new Setting(this.containerEl) .setName("Sort order") - .setDesc( - "How entries should be sorted both when viewing and exporting" - ) + .setDesc("How entries should be sorted both when viewing and exporting") .addDropdown((t) => { t.addOptions({ @@ -175,12 +161,9 @@ export class TimekeepSettingsTab extends PluginSettingTab { .addDropdown((t) => { t.addOptions({ - [DurationFormat.LONG]: - "Long - Format including all units (1h 30m 25s)", - [DurationFormat.SHORT]: - "Short - Format just including hours (1.5h)", - [DurationFormat.DECIMAL]: - "Decimal - Short format without units (1.5)", + [DurationFormat.LONG]: "Long - Format including all units (1h 30m 25s)", + [DurationFormat.SHORT]: "Short - Format just including hours (1.5h)", + [DurationFormat.DECIMAL]: "Decimal - Short format without units (1.5)", }); t.setValue(String(settings.exportDurationFormat)); t.onChange((v) => { @@ -219,9 +202,7 @@ export class TimekeepSettingsTab extends PluginSettingTab { t.setValue(String(settings.pdfFootnote)); t.onChange((v) => { // Only use a custom format if the value is not blank - const newPdfFootnote = v.length - ? v - : defaultSettings.pdfFootnote; + const newPdfFootnote = v.length ? v : defaultSettings.pdfFootnote; this.settingsStore.setState((currentValue) => ({ ...currentValue, @@ -237,10 +218,8 @@ export class TimekeepSettingsTab extends PluginSettingTab { .addDropdown((t) => { t.addOptions({ [PdfExportBehavior.NONE]: "Do nothing", - [PdfExportBehavior.OPEN_FILE]: - "Open exported file with default app", - [PdfExportBehavior.OPEN_PATH]: - "Open directory containing the exported file", + [PdfExportBehavior.OPEN_FILE]: "Open exported file with default app", + [PdfExportBehavior.OPEN_PATH]: "Open directory containing the exported file", }); t.setValue(String(settings.pdfExportBehavior)); t.onChange((v) => { @@ -269,9 +248,7 @@ export class TimekeepSettingsTab extends PluginSettingTab { t.setValue(String(settings.pdfDateFormat)); t.onChange((v) => { // Only use a custom format if the value is not blank - const newPdfDateFormat = v.length - ? v - : defaultSettings.pdfDateFormat; + const newPdfDateFormat = v.length ? v : defaultSettings.pdfDateFormat; this.settingsStore.setState((currentValue) => ({ ...currentValue, @@ -298,9 +275,7 @@ export class TimekeepSettingsTab extends PluginSettingTab { t.setValue(String(settings.pdfRowDateFormat)); t.onChange((v) => { // Only use a custom format if the value is not blank - const newPdfRowDateFormat = v.length - ? v - : defaultSettings.pdfRowDateFormat; + const newPdfRowDateFormat = v.length ? v : defaultSettings.pdfRowDateFormat; this.settingsStore.setState((currentValue) => ({ ...currentValue, @@ -334,9 +309,7 @@ export class TimekeepSettingsTab extends PluginSettingTab { new Setting(this.containerEl) .setName("CSV heading row") - .setDesc( - "Whether to use the first row of generated CSV as a title row" - ) + .setDesc("Whether to use the first row of generated CSV as a title row") .addToggle((t) => { t.setValue(settings.csvTitle); t.onChange((v) => { @@ -355,9 +328,7 @@ export class TimekeepSettingsTab extends PluginSettingTab { .addText((t) => { t.setValue(String(settings.csvDelimiter)); t.onChange((v) => { - const newCsvDelimiter = v.length - ? v - : defaultSettings.csvDelimiter; + const newCsvDelimiter = v.length ? v : defaultSettings.csvDelimiter; this.settingsStore.setState((currentValue) => ({ ...currentValue, @@ -371,9 +342,7 @@ export class TimekeepSettingsTab extends PluginSettingTab { new Setting(this.containerEl) .setName("Format copied JSON") - .setDesc( - "Whether to format the JSON contents before copying them to clipboard." - ) + .setDesc("Whether to format the JSON contents before copying them to clipboard.") .addToggle((t) => { t.setValue(settings.formatCopiedJSON); t.onChange((v) => { diff --git a/src/settings.test.ts b/src/settings.test.ts index 709811b..d217285 100644 --- a/src/settings.test.ts +++ b/src/settings.test.ts @@ -24,32 +24,18 @@ describe("legacy settings compatibility conversion", () => { }); test.each([ - [ - { reverseSegmentOrder: true }, - { sortOrder: SortOrder.REVERSE_INSERTION }, - ], + [{ reverseSegmentOrder: true }, { sortOrder: SortOrder.REVERSE_INSERTION }], [{ reverseSegmentOrder: false }, { sortOrder: SortOrder.INSERTION }], - [ - { showDecimalHours: true }, - { secondaryDurationFormat: DurationFormat.SHORT }, - ], - [ - { showDecimalHours: false }, - { secondaryDurationFormat: DurationFormat.NONE }, - ], + [{ showDecimalHours: true }, { secondaryDurationFormat: DurationFormat.SHORT }], + [{ showDecimalHours: false }, { secondaryDurationFormat: DurationFormat.NONE }], ])('for "%s" should expected "%s"', (legacySetting, expected) => { // Check the legacy setting gets replaced with the new setting - const partialSetting = Object.assign( - {}, - legacySetting - ) as TimekeepSettings; + const partialSetting = Object.assign({}, legacySetting) as TimekeepSettings; legacySettingsCompatibility(partialSetting); expect(partialSetting).toStrictEqual(expected); const setting = Object.assign({}, defaultSettings, legacySetting); legacySettingsCompatibility(setting); - expect(setting).toStrictEqual( - Object.assign({}, defaultSettings, expected) - ); + expect(setting).toStrictEqual(Object.assign({}, defaultSettings, expected)); }); }); diff --git a/src/timekeep/__fixtures__/extracting/createCodeBlock.ts b/src/timekeep/__fixtures__/extracting/createCodeBlock.ts index 20731c0..a3d71e7 100644 --- a/src/timekeep/__fixtures__/extracting/createCodeBlock.ts +++ b/src/timekeep/__fixtures__/extracting/createCodeBlock.ts @@ -7,11 +7,7 @@ * @param linesAfter Number of lines after the codeblock * @returns The generated codeblock */ -export function createCodeBlock( - json: string, - linesBefore: number, - linesAfter: number -) { +export function createCodeBlock(json: string, linesBefore: number, linesAfter: number) { let output = ""; for (let i = 0; i < linesBefore; i++) { output += "\n"; diff --git a/src/timekeep/create.test.ts b/src/timekeep/create.test.ts index edb13b0..7059cbb 100644 --- a/src/timekeep/create.test.ts +++ b/src/timekeep/create.test.ts @@ -5,119 +5,99 @@ import { stripEntryRuntimeData, stripEntriesRuntimeData } from "./schema"; import { expect, it, describe } from "vitest"; describe("createEntry", () => { - it("creating entry should use current time", () => { - const currentTime = moment(); + it("creating entry should use current time", () => { + const currentTime = moment(); - const entry = createEntry("Block 1", currentTime); - expect(stripEntryRuntimeData(entry)).toStrictEqual({ - name: "Block 1", - startTime: currentTime, - endTime: null, - subEntries: null, - }); - }); + const entry = createEntry("Block 1", currentTime); + expect(stripEntryRuntimeData(entry)).toStrictEqual({ + name: "Block 1", + startTime: currentTime, + endTime: null, + subEntries: null, + }); + }); - it("each created entry should have a unique id", () => { - const currentTime = moment(); + it("each created entry should have a unique id", () => { + const currentTime = moment(); - const entry1 = createEntry("Block 1", currentTime); - const entry2 = createEntry("Block 2", currentTime); - expect(entry1.id).not.toBe(entry2.id); - }); + const entry1 = createEntry("Block 1", currentTime); + const entry2 = createEntry("Block 2", currentTime); + expect(entry1.id).not.toBe(entry2.id); + }); }); describe("withEntry", () => { - it("should add new entry to entries", async () => { - const { input, currentTime, expected } = - await import("./__fixtures__/manipulating/adding_entry/addNewEntry"); - const output = withEntry(input, "New Entry", currentTime); - expect(stripEntriesRuntimeData(output)).toEqual( - stripEntriesRuntimeData(expected) - ); - }); + it("should add new entry to entries", async () => { + const { input, currentTime, expected } = + await import("./__fixtures__/manipulating/adding_entry/addNewEntry"); + const output = withEntry(input, "New Entry", currentTime); + expect(stripEntriesRuntimeData(output)).toEqual(stripEntriesRuntimeData(expected)); + }); - it("should generate block name when empty", async () => { - const { input, currentTime, expected } = - await import("./__fixtures__/manipulating/adding_entry/addEmptyBlockName"); + it("should generate block name when empty", async () => { + const { input, currentTime, expected } = + await import("./__fixtures__/manipulating/adding_entry/addEmptyBlockName"); - const output1 = withEntry(input, "", currentTime); - expect(stripEntriesRuntimeData(output1)).toEqual( - stripEntriesRuntimeData(expected) - ); + const output1 = withEntry(input, "", currentTime); + expect(stripEntriesRuntimeData(output1)).toEqual(stripEntriesRuntimeData(expected)); - // Empty whitespace string should also count as an empty name - const output2 = withEntry(input, " ".repeat(5), currentTime); - expect(stripEntriesRuntimeData(output2)).toEqual( - stripEntriesRuntimeData(expected) - ); - }); + // Empty whitespace string should also count as an empty name + const output2 = withEntry(input, " ".repeat(5), currentTime); + expect(stripEntriesRuntimeData(output2)).toEqual(stripEntriesRuntimeData(expected)); + }); - it("should maintain existing entries when adding to a list", async () => { - const { input, currentTime, expected } = - await import("./__fixtures__/manipulating/adding_entry/addEntryToList"); + it("should maintain existing entries when adding to a list", async () => { + const { input, currentTime, expected } = + await import("./__fixtures__/manipulating/adding_entry/addEntryToList"); - const output = withEntry(input, "New Test Entry", currentTime); - expect(stripEntriesRuntimeData(output)).toEqual( - stripEntriesRuntimeData(expected) - ); - }); + const output = withEntry(input, "New Test Entry", currentTime); + expect(stripEntriesRuntimeData(output)).toEqual(stripEntriesRuntimeData(expected)); + }); }); describe("withSubEntry", () => { - it("adding first entry should convert to group", async () => { - const { input, currentTime, expected } = - await import("./__fixtures__/manipulating/adding_sub_entry/addConvertToGroup"); - const output = withSubEntry(input, "New Entry", currentTime); - expect(stripEntryRuntimeData(output)).toEqual( - stripEntryRuntimeData(expected) - ); - }); + it("adding first entry should convert to group", async () => { + const { input, currentTime, expected } = + await import("./__fixtures__/manipulating/adding_sub_entry/addConvertToGroup"); + const output = withSubEntry(input, "New Entry", currentTime); + expect(stripEntryRuntimeData(output)).toEqual(stripEntryRuntimeData(expected)); + }); - it("adding first entry for folder should populate subentries", async () => { - const { input, currentTime, expected } = - await import("./__fixtures__/manipulating/adding_sub_entry/addFolderPopulateSubEntries"); - const output = withSubEntry(input, "New Entry", currentTime); - expect(stripEntryRuntimeData(output)).toEqual( - stripEntryRuntimeData(expected) - ); - }); + it("adding first entry for folder should populate subentries", async () => { + const { input, currentTime, expected } = + await import("./__fixtures__/manipulating/adding_sub_entry/addFolderPopulateSubEntries"); + const output = withSubEntry(input, "New Entry", currentTime); + expect(stripEntryRuntimeData(output)).toEqual(stripEntryRuntimeData(expected)); + }); - it("adding first entry for folder should extend subentries", async () => { - const { input, currentTime, expected } = - await import("./__fixtures__/manipulating/adding_sub_entry/addFolderExtendSubEntries"); - const output = withSubEntry(input, "New Entry 2", currentTime); - expect(stripEntryRuntimeData(output)).toEqual( - stripEntryRuntimeData(expected) - ); - }); + it("adding first entry for folder should extend subentries", async () => { + const { input, currentTime, expected } = + await import("./__fixtures__/manipulating/adding_sub_entry/addFolderExtendSubEntries"); + const output = withSubEntry(input, "New Entry 2", currentTime); + expect(stripEntryRuntimeData(output)).toEqual(stripEntryRuntimeData(expected)); + }); - it("adding to group should extend sub entries", async () => { - const { input, currentTime, expected } = - await import("./__fixtures__/manipulating/adding_sub_entry/addToGroupExtendSubEntries"); + it("adding to group should extend sub entries", async () => { + const { input, currentTime, expected } = + await import("./__fixtures__/manipulating/adding_sub_entry/addToGroupExtendSubEntries"); - const output = withSubEntry(input, "New Entry", currentTime); - expect(stripEntryRuntimeData(output)).toEqual( - stripEntryRuntimeData(expected) - ); - }); + const output = withSubEntry(input, "New Entry", currentTime); + expect(stripEntryRuntimeData(output)).toEqual(stripEntryRuntimeData(expected)); + }); - it("empty name should generate a part name (single)", async () => { - const { input, currentTime, expected } = - await import("./__fixtures__/manipulating/adding_sub_entry/emptyNameCreatePartNameSingle"); + it("empty name should generate a part name (single)", async () => { + const { input, currentTime, expected } = + await import("./__fixtures__/manipulating/adding_sub_entry/emptyNameCreatePartNameSingle"); - const output = withSubEntry(input, "", currentTime); - expect(stripEntryRuntimeData(output)).toEqual( - stripEntryRuntimeData(expected) - ); - }); + const output = withSubEntry(input, "", currentTime); + expect(stripEntryRuntimeData(output)).toEqual(stripEntryRuntimeData(expected)); + }); - it("empty name should generate a part name (group)", async () => { - const { input, currentTime, expected } = - await import("./__fixtures__/manipulating/adding_sub_entry/emptyNameCreatePartNameGroup"); + it("empty name should generate a part name (group)", async () => { + const { input, currentTime, expected } = + await import("./__fixtures__/manipulating/adding_sub_entry/emptyNameCreatePartNameGroup"); - const output = withSubEntry(input, "", currentTime); - expect(stripEntryRuntimeData(output)).toEqual( - stripEntryRuntimeData(expected) - ); - }); + const output = withSubEntry(input, "", currentTime); + expect(stripEntryRuntimeData(output)).toEqual(stripEntryRuntimeData(expected)); + }); }); diff --git a/src/timekeep/create.ts b/src/timekeep/create.ts index d723709..404d411 100644 --- a/src/timekeep/create.ts +++ b/src/timekeep/create.ts @@ -29,11 +29,7 @@ export function createEntry(name: string, startTime: Moment): TimeEntry { * @param startTime The start time of the new entry * @returns The new collection of entries */ -export function withEntry( - entries: TimeEntry[], - name: string, - startTime: Moment -): TimeEntry[] { +export function withEntry(entries: TimeEntry[], name: string, startTime: Moment): TimeEntry[] { const entryName = getEntryName(name, entries); return [...entries, createEntry(entryName, startTime)]; } @@ -66,11 +62,7 @@ function getEntryName(name: string, entries: TimeEntry[]) { * @param startTime The start time for the new entry * @returns The updated/created entry */ -export function withSubEntry( - parent: TimeEntry, - name: string, - startTime: Moment -): TimeEntry { +export function withSubEntry(parent: TimeEntry, name: string, startTime: Moment): TimeEntry { const groupEntry = makeGroupEntry(parent); const entryName = getSubEntryName(name, groupEntry); const newEntry = createEntry(entryName, startTime); diff --git a/src/timekeep/parser.test.ts b/src/timekeep/parser.test.ts index 17f0a65..c72a0dc 100644 --- a/src/timekeep/parser.test.ts +++ b/src/timekeep/parser.test.ts @@ -2,11 +2,11 @@ import moment from "moment"; import { Timekeep, stripTimekeepRuntimeData } from "./schema"; import { - load, - LoadError, - LoadSuccess, - replaceTimekeepCodeblock, - extractTimekeepCodeblocks, + load, + LoadError, + LoadSuccess, + replaceTimekeepCodeblock, + extractTimekeepCodeblocks, } from "./parser"; import { expect, it, describe } from "vitest"; @@ -19,183 +19,168 @@ import { expect, it, describe } from "vitest"; * @param linesAfter Number of lines after the codeblock * @returns The generated codeblock */ -const createCodeBlock = ( - json: string, - linesBefore: number, - linesAfter: number -) => { - let output = ""; - for (let i = 0; i < linesBefore; i++) { - output += "\n"; - } - output += "```timekeep\n"; - output += json; - output += "\n```"; - for (let i = 0; i < linesAfter; i++) { - output += "\n"; - } - return output; +const createCodeBlock = (json: string, linesBefore: number, linesAfter: number) => { + let output = ""; + for (let i = 0; i < linesBefore; i++) { + output += "\n"; + } + output += "```timekeep\n"; + output += json; + output += "\n```"; + for (let i = 0; i < linesAfter; i++) { + output += "\n"; + } + return output; }; describe("extracting code blocks", () => { - it("should extract codeblock contents", async () => { - const { text, inputTimekeep1, inputTimekeep2 } = - await import("./__fixtures__/extracting/codeblockContents"); + it("should extract codeblock contents", async () => { + const { text, inputTimekeep1, inputTimekeep2 } = + await import("./__fixtures__/extracting/codeblockContents"); - const output = extractTimekeepCodeblocks(text); + const output = extractTimekeepCodeblocks(text); - expect(stripTimekeepRuntimeData(output[0])).toStrictEqual( - stripTimekeepRuntimeData(inputTimekeep1) - ); - expect(stripTimekeepRuntimeData(output[1])).toStrictEqual( - stripTimekeepRuntimeData(inputTimekeep2) - ); - expect(output.length).toBe(2); - }); + expect(stripTimekeepRuntimeData(output[0])).toStrictEqual( + stripTimekeepRuntimeData(inputTimekeep1) + ); + expect(stripTimekeepRuntimeData(output[1])).toStrictEqual( + stripTimekeepRuntimeData(inputTimekeep2) + ); + expect(output.length).toBe(2); + }); - it("should ignore codeblocks that are not closed", async () => { - const { text, inputTimekeep1 } = - await import("./__fixtures__/extracting/unclosedCodeBlock"); - const output = extractTimekeepCodeblocks(text); + it("should ignore codeblocks that are not closed", async () => { + const { text, inputTimekeep1 } = + await import("./__fixtures__/extracting/unclosedCodeBlock"); + const output = extractTimekeepCodeblocks(text); - expect(stripTimekeepRuntimeData(output[0])).toStrictEqual( - stripTimekeepRuntimeData(inputTimekeep1) - ); - expect(output.length).toBe(1); - }); + expect(stripTimekeepRuntimeData(output[0])).toStrictEqual( + stripTimekeepRuntimeData(inputTimekeep1) + ); + expect(output.length).toBe(1); + }); }); describe("replacing content", () => { - it("should replace codeblock contents", () => { - const lineStart = 4; // Line the codeblock should start on - const lineEnd = lineStart + 2; // Line the codeblock should end on + it("should replace codeblock contents", () => { + const lineStart = 4; // Line the codeblock should start on + const lineEnd = lineStart + 2; // Line the codeblock should end on - // Input data to replace - const input = createCodeBlock( - `{"entries":[{"name":"Block 1","startTime":"2024-03-17T01:33:51.630Z","endTime":"2024-03-17T01:33:55.151Z","subEntries":null}]}`, - 4, - 4 - ); + // Input data to replace + const input = createCodeBlock( + `{"entries":[{"name":"Block 1","startTime":"2024-03-17T01:33:51.630Z","endTime":"2024-03-17T01:33:55.151Z","subEntries":null}]}`, + 4, + 4 + ); - // Timekeep with a renamed block - const inputTimekeep: Timekeep = { - entries: [ - { - id: "49b99108-b1ad-4355-baa9-89c49c342be2", - name: "Block 2", - startTime: moment("2024-03-17T01:33:51.630Z"), - endTime: moment("2024-03-17T01:33:55.151Z"), - subEntries: null, - }, - ], - }; + // Timekeep with a renamed block + const inputTimekeep: Timekeep = { + entries: [ + { + id: "49b99108-b1ad-4355-baa9-89c49c342be2", + name: "Block 2", + startTime: moment("2024-03-17T01:33:51.630Z"), + endTime: moment("2024-03-17T01:33:55.151Z"), + subEntries: null, + }, + ], + }; - // Value with the renamed block - const expected = createCodeBlock( - `{"entries":[{"name":"Block 2","startTime":"2024-03-17T01:33:51.630Z","endTime":"2024-03-17T01:33:55.151Z","subEntries":null}]}`, - 4, - 4 - ); + // Value with the renamed block + const expected = createCodeBlock( + `{"entries":[{"name":"Block 2","startTime":"2024-03-17T01:33:51.630Z","endTime":"2024-03-17T01:33:55.151Z","subEntries":null}]}`, + 4, + 4 + ); - const output = replaceTimekeepCodeblock( - inputTimekeep, - input, - lineStart, - lineEnd - ); + const output = replaceTimekeepCodeblock(inputTimekeep, input, lineStart, lineEnd); - expect(output).toBe(expected); - }); + expect(output).toBe(expected); + }); - it("should fail if codeblock is missing", () => { - const input = createCodeBlock("", 4, 4); - // Start not code fences - expect(() => - replaceTimekeepCodeblock({ entries: [] }, input, 2, 4) - ).toThrow(); + it("should fail if codeblock is missing", () => { + const input = createCodeBlock("", 4, 4); + // Start not code fences + expect(() => replaceTimekeepCodeblock({ entries: [] }, input, 2, 4)).toThrow(); - // End not code fences - expect(() => - replaceTimekeepCodeblock({ entries: [] }, input, 4, 8) - ).toThrow(); - }); + // End not code fences + expect(() => replaceTimekeepCodeblock({ entries: [] }, input, 4, 8)).toThrow(); + }); }); describe("loading timekeep", () => { - it("should give empty timekeep when given empty string", () => { - const result = load(""); + it("should give empty timekeep when given empty string", () => { + const result = load(""); - expect(result.success).toBe(true); + expect(result.success).toBe(true); - const successResult = result as LoadSuccess; + const successResult = result as LoadSuccess; - // Ensure the contents match - expect(successResult.timekeep).toEqual({ entries: [] }); - }); + // Ensure the contents match + expect(successResult.timekeep).toEqual({ entries: [] }); + }); - it("should load valid timekeep successfully", () => { - const data = `{"entries":[{"name":"Block 1","startTime":"2024-03-17T01:33:51.630Z","endTime":"2024-03-17T01:33:55.151Z","subEntries":null},{"name":"Block 2","startTime":"2024-03-17T01:33:51.630Z","endTime":null,"subEntries":null},{"name":"Non Started Block","startTime":null,"endTime":null,"subEntries":null}]}`; - const expected = { - entries: [ - { - name: "Block 1", - startTime: moment("2024-03-17T01:33:51.630Z"), - endTime: moment("2024-03-17T01:33:55.151Z"), - subEntries: null, - }, - { - name: "Block 2", - startTime: moment("2024-03-17T01:33:51.630Z"), - endTime: null, - subEntries: null, - }, - { - name: "Non Started Block", - startTime: null, - endTime: null, - subEntries: null, - }, - ], - }; + it("should load valid timekeep successfully", () => { + const data = `{"entries":[{"name":"Block 1","startTime":"2024-03-17T01:33:51.630Z","endTime":"2024-03-17T01:33:55.151Z","subEntries":null},{"name":"Block 2","startTime":"2024-03-17T01:33:51.630Z","endTime":null,"subEntries":null},{"name":"Non Started Block","startTime":null,"endTime":null,"subEntries":null}]}`; + const expected = { + entries: [ + { + name: "Block 1", + startTime: moment("2024-03-17T01:33:51.630Z"), + endTime: moment("2024-03-17T01:33:55.151Z"), + subEntries: null, + }, + { + name: "Block 2", + startTime: moment("2024-03-17T01:33:51.630Z"), + endTime: null, + subEntries: null, + }, + { + name: "Non Started Block", + startTime: null, + endTime: null, + subEntries: null, + }, + ], + }; - const result = load(data); + const result = load(data); - expect(result.success).toBe(true); + expect(result.success).toBe(true); - const successResult = result as LoadSuccess; + const successResult = result as LoadSuccess; - // Ensure the contents match - expect(stripTimekeepRuntimeData(successResult.timekeep)).toEqual( - expected - ); - }); + // Ensure the contents match + expect(stripTimekeepRuntimeData(successResult.timekeep)).toEqual(expected); + }); - it("should give error on invalid timekeep (JSON)", () => { - const data = "{"; + it("should give error on invalid timekeep (JSON)", () => { + const data = "{"; - const result = load(data); + const result = load(data); - expect(result.success).toBe(false); + expect(result.success).toBe(false); - const errorResult = result as LoadError; + const errorResult = result as LoadError; - expect(errorResult.error).toBe("Failed to parse timekeep JSON"); - }); + expect(errorResult.error).toBe("Failed to parse timekeep JSON"); + }); - it("should tolerate a timekeep with leading or trailing whitespaces", () => { - const input = ` + it("should tolerate a timekeep with leading or trailing whitespaces", () => { + const input = ` \`\`\`timekeep \`\`\` `; - // Start not code fences - replaceTimekeepCodeblock({ entries: [] }, input, 1, 2); - }); + // Start not code fences + replaceTimekeepCodeblock({ entries: [] }, input, 1, 2); + }); - it("should give error on invalid timekeep (validation)", () => { - const data = `{"entries":[{"startTime":"2024-03-17T01:33:51.630Z","endTime":"2024-03-17T01:33:55.151Z","subEntries":null}]}`; + it("should give error on invalid timekeep (validation)", () => { + const data = `{"entries":[{"startTime":"2024-03-17T01:33:51.630Z","endTime":"2024-03-17T01:33:55.151Z","subEntries":null}]}`; - const result = load(data); + const result = load(data); - expect(result.success).toBe(false); - }); + expect(result.success).toBe(false); + }); }); diff --git a/src/timekeep/parser.ts b/src/timekeep/parser.ts index bd95d74..df89e77 100644 --- a/src/timekeep/parser.ts +++ b/src/timekeep/parser.ts @@ -1,9 +1,5 @@ import { isEmptyString } from "@/utils"; -import { - TIMEKEEP, - Timekeep, - stripTimekeepRuntimeData, -} from "@/timekeep/schema"; +import { TIMEKEEP, Timekeep, stripTimekeepRuntimeData } from "@/timekeep/schema"; export type LoadResult = LoadSuccess | LoadError; @@ -18,40 +14,40 @@ export type LoadError = { success: false; error: string }; * @return The load result */ export function load(value: string): LoadResult { - // Empty string should create an empty timekeep - if (isEmptyString(value)) { - return { success: true, timekeep: { entries: [] } }; - } + // Empty string should create an empty timekeep + if (isEmptyString(value)) { + return { success: true, timekeep: { entries: [] } }; + } - // Load the JSON value - let parsedValue: unknown; - try { - parsedValue = JSON.parse(value); - } catch (e) { - console.error(e); - return { - success: false, - error: "Failed to parse timekeep JSON", - }; - } + // Load the JSON value + let parsedValue: unknown; + try { + parsedValue = JSON.parse(value); + } catch (e) { + console.error(e); + return { + success: false, + error: "Failed to parse timekeep JSON", + }; + } - // Parse the data against the schema - const timekeepResult = TIMEKEEP.safeParse(parsedValue); - if (!timekeepResult.success) { - return { - success: false, - error: timekeepResult.error.toString(), - }; - } + // Parse the data against the schema + const timekeepResult = TIMEKEEP.safeParse(parsedValue); + if (!timekeepResult.success) { + return { + success: false, + error: timekeepResult.error.toString(), + }; + } - const timekeep = timekeepResult.data; - return { success: true, timekeep }; + const timekeep = timekeepResult.data; + return { success: true, timekeep }; } export interface TimekeepWithPosition { - timekeep: Timekeep; - startLine: number; - endLine: number; + timekeep: Timekeep; + startLine: number; + endLine: number; } /** @@ -63,45 +59,41 @@ export interface TimekeepWithPosition { * @param value The file text contents * @returns The extracted timekeep blocks */ -export function extractTimekeepCodeblocksWithPosition( - value: string -): TimekeepWithPosition[] { - const out: TimekeepWithPosition[] = []; - const lines = value.replace("\n\r", "\n").split("\n"); +export function extractTimekeepCodeblocksWithPosition(value: string): TimekeepWithPosition[] { + const out: TimekeepWithPosition[] = []; + const lines = value.replace("\n\r", "\n").split("\n"); - for (let i = 0; i < lines.length; i++) { - const startLine = lines[i]; + for (let i = 0; i < lines.length; i++) { + const startLine = lines[i]; - // Skip lines till a timekeep block is found - if (!startLine.trim().startsWith("```timekeep")) { - continue; - } + // Skip lines till a timekeep block is found + if (!startLine.trim().startsWith("```timekeep")) { + continue; + } - // Find end of codeblock - const endLineIndex = lines.findIndex( - (line, index) => index > i && line.trim() === "```" - ); + // Find end of codeblock + const endLineIndex = lines.findIndex((line, index) => index > i && line.trim() === "```"); - if (endLineIndex === -1) { - continue; - } + if (endLineIndex === -1) { + continue; + } - let content = ""; - for (let lineIndex = i + 1; lineIndex < endLineIndex; lineIndex++) { - content += lines[lineIndex] + "\n"; - } + let content = ""; + for (let lineIndex = i + 1; lineIndex < endLineIndex; lineIndex++) { + content += lines[lineIndex] + "\n"; + } - const result = load(content); - if (result.success) { - out.push({ - timekeep: result.timekeep, - startLine: i, - endLine: endLineIndex, - }); - } - } + const result = load(content); + if (result.success) { + out.push({ + timekeep: result.timekeep, + startLine: i, + endLine: endLineIndex, + }); + } + } - return out; + return out; } /** @@ -112,11 +104,11 @@ export function extractTimekeepCodeblocksWithPosition( * @returns The extracted timekeep blocks */ export function extractTimekeepCodeblocks(value: string): Timekeep[] { - return ( - extractTimekeepCodeblocksWithPosition(value) - // - .map((value) => value.timekeep) - ); + return ( + extractTimekeepCodeblocksWithPosition(value) + // + .map((value) => value.timekeep) + ); } /** @@ -124,37 +116,37 @@ export function extractTimekeepCodeblocks(value: string): Timekeep[] { * a file returning the modified contents to be saved */ export function replaceTimekeepCodeblock( - timekeep: Timekeep, - content: string, - lineStart: number, - lineEnd: number + timekeep: Timekeep, + content: string, + lineStart: number, + lineEnd: number ): string { - const timekeepJSON = JSON.stringify(stripTimekeepRuntimeData(timekeep)); + const timekeepJSON = JSON.stringify(stripTimekeepRuntimeData(timekeep)); - // The actual JSON is the line after the code block start - const contentStart = lineStart + 1; - const contentLength = lineEnd - contentStart; + // The actual JSON is the line after the code block start + const contentStart = lineStart + 1; + const contentLength = lineEnd - contentStart; - // Split the content into lines - const lines = content.split("\n"); + // Split the content into lines + const lines = content.split("\n"); - // Sanity checks to prevent overriding content - if (!lines[lineStart].trim().startsWith("```")) { - throw new Error( - "Content timekeep out of sync, line number for codeblock start doesn't match: " + - content[lineStart] - ); - } + // Sanity checks to prevent overriding content + if (!lines[lineStart].trim().startsWith("```")) { + throw new Error( + "Content timekeep out of sync, line number for codeblock start doesn't match: " + + content[lineStart] + ); + } - if (!lines[lineEnd].trim().startsWith("```")) { - throw new Error( - "Content timekeep out of sync, line number for codeblock end doesn't match" + - content[lineEnd] - ); - } + if (!lines[lineEnd].trim().startsWith("```")) { + throw new Error( + "Content timekeep out of sync, line number for codeblock end doesn't match" + + content[lineEnd] + ); + } - // Splice the new JSON content in between the codeblock, removing the old codeblock lines - lines.splice(contentStart, contentLength, timekeepJSON); + // Splice the new JSON content in between the codeblock, removing the old codeblock lines + lines.splice(contentStart, contentLength, timekeepJSON); - return lines.join("\n"); + return lines.join("\n"); } diff --git a/src/timekeep/queries.test.ts b/src/timekeep/queries.test.ts index 6e45d09..46c4de4 100644 --- a/src/timekeep/queries.test.ts +++ b/src/timekeep/queries.test.ts @@ -1,169 +1,164 @@ import { - getEntryById, - isKeepRunning, - getPathToEntry, - isEntryRunning, - getRunningEntry, - getEntryDuration, - getTotalDuration, + getEntryById, + isKeepRunning, + getPathToEntry, + isEntryRunning, + getRunningEntry, + getEntryDuration, + getTotalDuration, } from "./queries"; import { expect, it, describe } from "vitest"; describe("getEntryById", () => { - it("find top level entry", async () => { - const { input, targetEntry, targetEntryId } = - await import("./__fixtures__/checking/findEntryById"); + it("find top level entry", async () => { + const { input, targetEntry, targetEntryId } = + await import("./__fixtures__/checking/findEntryById"); - const output = getEntryById(targetEntryId, input); - expect(output).toEqual(targetEntry); - }); + const output = getEntryById(targetEntryId, input); + expect(output).toEqual(targetEntry); + }); - it("find nested entry", async () => { - const { input, targetEntry, targetEntryId } = - await import("./__fixtures__/checking/findEntryByIdNested"); + it("find nested entry", async () => { + const { input, targetEntry, targetEntryId } = + await import("./__fixtures__/checking/findEntryByIdNested"); - const output = getEntryById(targetEntryId, input); - expect(output).toEqual(targetEntry); - }); + const output = getEntryById(targetEntryId, input); + expect(output).toEqual(targetEntry); + }); - it("find entry non existent", async () => { - const { input, targetEntryId } = - await import("./__fixtures__/checking/findEntryByIdMissing"); + it("find entry non existent", async () => { + const { input, targetEntryId } = + await import("./__fixtures__/checking/findEntryByIdMissing"); - const output = getEntryById(targetEntryId, input); - expect(output).toBeUndefined(); - }); + const output = getEntryById(targetEntryId, input); + expect(output).toBeUndefined(); + }); }); describe("getPathToEntry", () => { - it("path not found", async () => { - const { targetEntry, entries, expected } = - await import("./__fixtures__/path/pathNotFound"); - const output = getPathToEntry(entries, targetEntry); - expect(output).toEqual(expected); - }); + it("path not found", async () => { + const { targetEntry, entries, expected } = await import("./__fixtures__/path/pathNotFound"); + const output = getPathToEntry(entries, targetEntry); + expect(output).toEqual(expected); + }); - it("top level path found", () => {}); + it("top level path found", () => {}); - it("deep path found", () => {}); + it("deep path found", () => {}); - it("should find running entry path", async () => { - const { input, runningEntry, path } = - await import("./__fixtures__/checking/findRunningEntryPath"); + it("should find running entry path", async () => { + const { input, runningEntry, path } = + await import("./__fixtures__/checking/findRunningEntryPath"); - const output = getPathToEntry(input, runningEntry); - expect(output).toEqual(path); - }); + const output = getPathToEntry(input, runningEntry); + expect(output).toEqual(path); + }); }); describe("isEntryRunning", () => { - it("should determine entry running state", async () => { - const { running, notRunning } = - await import("./__fixtures__/checking/runningState"); + it("should determine entry running state", async () => { + const { running, notRunning } = await import("./__fixtures__/checking/runningState"); - expect(isEntryRunning(running)).toBe(true); - expect(isEntryRunning(notRunning)).toBe(false); - }); + expect(isEntryRunning(running)).toBe(true); + expect(isEntryRunning(notRunning)).toBe(false); + }); - it("should determine entry running state (nested)", async () => { - const { runningNested, stoppedNested } = - await import("./__fixtures__/checking/runningState"); + it("should determine entry running state (nested)", async () => { + const { runningNested, stoppedNested } = + await import("./__fixtures__/checking/runningState"); - expect(isEntryRunning(runningNested)).toBe(true); - expect(isEntryRunning(stoppedNested)).toBe(false); - }); + expect(isEntryRunning(runningNested)).toBe(true); + expect(isEntryRunning(stoppedNested)).toBe(false); + }); }); describe("getRunningEntry", () => { - it("should find running entry", async () => { - const { input, runningEntry } = - await import("./__fixtures__/checking/shouldFindRunningEntry"); + it("should find running entry", async () => { + const { input, runningEntry } = + await import("./__fixtures__/checking/shouldFindRunningEntry"); - const output = getRunningEntry(input); + const output = getRunningEntry(input); - expect(output).toBe(runningEntry); - }); + expect(output).toBe(runningEntry); + }); - it("should find nested running entry", async () => { - const { input, runningEntry } = - await import("./__fixtures__/checking/shouldFindRunningEntryNested"); + it("should find nested running entry", async () => { + const { input, runningEntry } = + await import("./__fixtures__/checking/shouldFindRunningEntryNested"); - const output = getRunningEntry(input); + const output = getRunningEntry(input); - expect(output).toBe(runningEntry); - }); + expect(output).toBe(runningEntry); + }); - it("should not find running entry", async () => { - const { input } = - await import("./__fixtures__/checking/shouldNotFindRunningEntry"); + it("should not find running entry", async () => { + const { input } = await import("./__fixtures__/checking/shouldNotFindRunningEntry"); - const output = getRunningEntry(input); + const output = getRunningEntry(input); - expect(output).toBe(null); - }); + expect(output).toBe(null); + }); }); describe("isKeepRunning", () => { - it("should show keep running", async () => { - const { input } = - await import("./__fixtures__/checking/shouldBeRunning"); + it("should show keep running", async () => { + const { input } = await import("./__fixtures__/checking/shouldBeRunning"); - expect(isKeepRunning(input)).toBe(true); - }); + expect(isKeepRunning(input)).toBe(true); + }); - it("should show keep not running", async () => { - const { input } = - await import("./__fixtures__/checking/shouldNotBeRunning"); + it("should show keep not running", async () => { + const { input } = await import("./__fixtures__/checking/shouldNotBeRunning"); - expect(isKeepRunning(input)).toBe(false); - }); + expect(isKeepRunning(input)).toBe(false); + }); }); describe("getEntryDuration", () => { - it("should get entry duration", async () => { - const { input, currentTime, durationMs } = - await import("./__fixtures__/duration/shouldGetEntryDuration"); + it("should get entry duration", async () => { + const { input, currentTime, durationMs } = + await import("./__fixtures__/duration/shouldGetEntryDuration"); - const output = getEntryDuration(input, currentTime); + const output = getEntryDuration(input, currentTime); - expect(output).toBe(durationMs); - }); + expect(output).toBe(durationMs); + }); - it("duration of non started entry should be zero", async () => { - const { input, currentTime, durationMs } = - await import("./__fixtures__/duration/nonStartedZeroDuration"); + it("duration of non started entry should be zero", async () => { + const { input, currentTime, durationMs } = + await import("./__fixtures__/duration/nonStartedZeroDuration"); - const output = getEntryDuration(input, currentTime); + const output = getEntryDuration(input, currentTime); - expect(output).toBe(durationMs); - }); + expect(output).toBe(durationMs); + }); - it("duration should include children", async () => { - const { input, currentTime, expected } = - await import("./__fixtures__/duration/durationIncludeChildren"); + it("duration should include children", async () => { + const { input, currentTime, expected } = + await import("./__fixtures__/duration/durationIncludeChildren"); - const output = getEntryDuration(input, currentTime); + const output = getEntryDuration(input, currentTime); - expect(output).toBe(expected); - }); + expect(output).toBe(expected); + }); - it("duration should use current as end for unfinished entries", async () => { - const { input, endTime, durationMs } = - await import("./__fixtures__/duration/currentEndUnfinished"); + it("duration should use current as end for unfinished entries", async () => { + const { input, endTime, durationMs } = + await import("./__fixtures__/duration/currentEndUnfinished"); - const output = getEntryDuration(input, endTime); + const output = getEntryDuration(input, endTime); - expect(output).toBe(durationMs); - }); + expect(output).toBe(durationMs); + }); }); describe("getTotalDuration", () => { - it("should get total duration", async () => { - const { input, currentTime, expected } = - await import("./__fixtures__/duration/totalDuration"); + it("should get total duration", async () => { + const { input, currentTime, expected } = + await import("./__fixtures__/duration/totalDuration"); - const output = getTotalDuration(input, currentTime); + const output = getTotalDuration(input, currentTime); - expect(output).toBe(expected); - }); + expect(output).toBe(expected); + }); }); diff --git a/src/timekeep/queries.ts b/src/timekeep/queries.ts index c0d8f28..9e7ace6 100644 --- a/src/timekeep/queries.ts +++ b/src/timekeep/queries.ts @@ -8,10 +8,7 @@ import { Timekeep, TimeEntry } from "@/timekeep/schema"; * @param entries List of entries to search * @returns The found entry or undefined */ -export function getEntryById( - entryId: string, - entries: TimeEntry[] -): TimeEntry | undefined { +export function getEntryById(entryId: string, entries: TimeEntry[]): TimeEntry | undefined { for (const entry of entries) { if (entry.id === entryId) { return entry; @@ -127,10 +124,7 @@ export function isKeepRunning(timekeep: Timekeep): boolean { * @param currentTime The current time to use for unfinished entries * @returns The duration in milliseconds */ -export function getEntryDuration( - entry: TimeEntry, - currentTime: Moment -): number { +export function getEntryDuration(entry: TimeEntry, currentTime: Moment): number { if (entry.subEntries !== null) { return getTotalDuration(entry.subEntries, currentTime); } @@ -153,13 +147,9 @@ export function getEntryDuration( * @param currentTime The current time to use for unfinished entries * @returns The total duration in milliseconds */ -export function getTotalDuration( - entries: TimeEntry[], - currentTime: Moment -): number { +export function getTotalDuration(entries: TimeEntry[], currentTime: Moment): number { return entries.reduce( - (totalDuration, entry) => - totalDuration + getEntryDuration(entry, currentTime), + (totalDuration, entry) => totalDuration + getEntryDuration(entry, currentTime), 0 ); } diff --git a/src/timekeep/schema.ts b/src/timekeep/schema.ts index 4b8cf30..a5cf534 100644 --- a/src/timekeep/schema.ts +++ b/src/timekeep/schema.ts @@ -55,18 +55,15 @@ const TIME_ENTRY_GROUP_BASE = z.object({ }); // Schema for a time entry group -const TIME_ENTRY_GROUP: z.ZodType = - TIME_ENTRY_GROUP_BASE.extend({ - subEntries: z.lazy(() => - z.array(z.union([TIME_ENTRY_SINGLE, TIME_ENTRY_GROUP])) - ), - }) - // At runtime a unique ID is inserted - /* istanbul ignore next */ - .transform((entry) => ({ - ...entry, - id: uuid(), - })); +const TIME_ENTRY_GROUP: z.ZodType = TIME_ENTRY_GROUP_BASE.extend({ + subEntries: z.lazy(() => z.array(z.union([TIME_ENTRY_SINGLE, TIME_ENTRY_GROUP]))), +}) + // At runtime a unique ID is inserted + /* istanbul ignore next */ + .transform((entry) => ({ + ...entry, + id: uuid(), + })); // Schema for time entries const TIME_ENTRY = z.union([TIME_ENTRY_SINGLE, TIME_ENTRY_GROUP]); diff --git a/src/timekeep/sort.test.ts b/src/timekeep/sort.test.ts index 59ecf61..5fd6485 100644 --- a/src/timekeep/sort.test.ts +++ b/src/timekeep/sort.test.ts @@ -1,16 +1,10 @@ -import { - SortOrder, - UnstartedOrder, - defaultSettings, - TimekeepSettings, -} from "@/settings"; +import { SortOrder, UnstartedOrder, defaultSettings, TimekeepSettings } from "@/settings"; import { expect, it, describe } from "vitest"; import { getEntriesSorted } from "./sort"; describe("getEntriesSorted", () => { it("should be in reverse order", async () => { - const { input, expected } = - await import("./__fixtures__/ordering/reverseOrder"); + const { input, expected } = await import("./__fixtures__/ordering/reverseOrder"); const settings: TimekeepSettings = defaultSettings; settings.sortOrder = SortOrder.REVERSE_INSERTION; @@ -20,8 +14,7 @@ describe("getEntriesSorted", () => { }); it("should be in newest first order", async () => { - const { input, expected } = - await import("./__fixtures__/ordering/newestFirstOrder"); + const { input, expected } = await import("./__fixtures__/ordering/newestFirstOrder"); const settings: TimekeepSettings = defaultSettings; settings.sortOrder = SortOrder.NEWEST_START; @@ -31,8 +24,7 @@ describe("getEntriesSorted", () => { }); it("should be in newest last order", async () => { - const { input, expected } = - await import("./__fixtures__/ordering/newestLastOrder"); + const { input, expected } = await import("./__fixtures__/ordering/newestLastOrder"); const settings: TimekeepSettings = defaultSettings; settings.sortOrder = SortOrder.OLDEST_START; @@ -42,8 +34,7 @@ describe("getEntriesSorted", () => { }); it("should be in newest last order with nulls first", async () => { - const { input, expected } = - await import("./__fixtures__/ordering/newestLastNullsFirst"); + const { input, expected } = await import("./__fixtures__/ordering/newestLastNullsFirst"); const settings: TimekeepSettings = defaultSettings; settings.sortOrder = SortOrder.OLDEST_START; @@ -54,8 +45,7 @@ describe("getEntriesSorted", () => { }); it("order should not change", async () => { - const { input, expected } = - await import("./__fixtures__/ordering/orderShouldNotChange"); + const { input, expected } = await import("./__fixtures__/ordering/orderShouldNotChange"); const settings: TimekeepSettings = defaultSettings; settings.sortOrder = SortOrder.INSERTION; diff --git a/src/timekeep/sort.ts b/src/timekeep/sort.ts index 59397d7..5ff9239 100644 --- a/src/timekeep/sort.ts +++ b/src/timekeep/sort.ts @@ -5,10 +5,7 @@ import { getStartTime } from "./queries"; type TimeEntryWithIndex = TimeEntry & { index: number }; -type EntriesComparator = ( - a: TimeEntryWithIndex, - b: TimeEntryWithIndex -) => number; +type EntriesComparator = (a: TimeEntryWithIndex, b: TimeEntryWithIndex) => number; /** * Provides a sorted copy of the provided entries list. @@ -20,10 +17,7 @@ type EntriesComparator = ( * @param settings The timekeep settings for which order to use * @returns The sorted entries list */ -export function getEntriesSorted( - entries: TimeEntry[], - settings: TimekeepSettings -): TimeEntry[] { +export function getEntriesSorted(entries: TimeEntry[], settings: TimekeepSettings): TimeEntry[] { // List order should be unchanged if (settings.sortOrder === SortOrder.INSERTION) { return entries; @@ -56,9 +50,7 @@ function getEntriesSortedReverseInsertion(entries: TimeEntry[]): TimeEntry[] { if (entry.subEntries !== null) { return { ...entry, - subEntries: getEntriesSortedReverseInsertion( - entry.subEntries - ), + subEntries: getEntriesSortedReverseInsertion(entry.subEntries), }; } @@ -86,10 +78,7 @@ function getEntriesSortedComparator( if (entry.subEntries !== null) { return { ...entry, - subEntries: getEntriesSortedComparator( - entry.subEntries, - comparator - ), + subEntries: getEntriesSortedComparator(entry.subEntries, comparator), index, }; } @@ -125,9 +114,7 @@ function createEntriesComparator( // Sort newest when both have a start time if (aStartTime && bStartTime) { - return newest - ? bStartTime.diff(aStartTime) - : aStartTime.diff(bStartTime); + return newest ? bStartTime.diff(aStartTime) : aStartTime.diff(bStartTime); } if (aStartTime) { diff --git a/src/timekeep/start.test.ts b/src/timekeep/start.test.ts index 34c27ac..7ddb77d 100644 --- a/src/timekeep/start.test.ts +++ b/src/timekeep/start.test.ts @@ -13,9 +13,7 @@ describe("startNewEntry", () => { expect(stoppedEntry).toBeDefined(); expect(stoppedEntry!.endTime).not.toBeNull(); - expect(stripEntriesRuntimeData(output)).toEqual( - stripEntriesRuntimeData(expected) - ); + expect(stripEntriesRuntimeData(output)).toEqual(stripEntriesRuntimeData(expected)); }); it("starting a new entry should add a new entry", async () => { @@ -23,9 +21,7 @@ describe("startNewEntry", () => { await import("./__fixtures__/manipulating/start_entry/startShouldStopRunning"); const output = startNewEntry(name, currentTime, input); - expect(stripEntriesRuntimeData(output)).toEqual( - stripEntriesRuntimeData(expected) - ); + expect(stripEntriesRuntimeData(output)).toEqual(stripEntriesRuntimeData(expected)); }); }); @@ -35,9 +31,7 @@ describe("startNewNestedEntry", () => { await import("./__fixtures__/manipulating/start_entry/startNotStartedEntry"); const output = startNewNestedEntry(currentTime, targetEntry.id, input); - expect(stripEntriesRuntimeData(output)).toEqual( - stripEntriesRuntimeData(expected) - ); + expect(stripEntriesRuntimeData(output)).toEqual(stripEntriesRuntimeData(expected)); }); it("starting a new entry within a folder should create a subentry", async () => { @@ -45,9 +39,7 @@ describe("startNewNestedEntry", () => { await import("./__fixtures__/manipulating/start_entry/startNestedFolderEntry"); const output = startNewNestedEntry(currentTime, targetEntry.id, input); - expect(stripEntriesRuntimeData(output)).toEqual( - stripEntriesRuntimeData(expected) - ); + expect(stripEntriesRuntimeData(output)).toEqual(stripEntriesRuntimeData(expected)); }); it("starting a new entry should stop any running entries", async () => { @@ -55,9 +47,7 @@ describe("startNewNestedEntry", () => { await import("./__fixtures__/manipulating/start_entry/startNotStartedEntry"); const output = startNewNestedEntry(currentTime, targetEntry.id, input); - expect(stripEntriesRuntimeData(output)).toEqual( - stripEntriesRuntimeData(expected) - ); + expect(stripEntriesRuntimeData(output)).toEqual(stripEntriesRuntimeData(expected)); }); it("starting a new entry should stop any running entries", async () => { @@ -65,9 +55,7 @@ describe("startNewNestedEntry", () => { await import("./__fixtures__/manipulating/start_entry/startNestedNonExistent"); const output = startNewNestedEntry(currentTime, targetEntryId, input); - expect(stripEntriesRuntimeData(output)).toEqual( - stripEntriesRuntimeData(expected) - ); + expect(stripEntriesRuntimeData(output)).toEqual(stripEntriesRuntimeData(expected)); }); it("starting a new entry should stop any running entries", async () => { @@ -77,16 +65,12 @@ describe("startNewNestedEntry", () => { const output = startNewNestedEntry(currentTime, targetEntry.id, input); const outerEntry = output[0]; - const stoppedEntry = outerEntry.subEntries?.find( - (entry) => entry.id === stopped - ); + const stoppedEntry = outerEntry.subEntries?.find((entry) => entry.id === stopped); expect(stoppedEntry).toBeDefined(); expect(stoppedEntry!.endTime).not.toBeNull(); - expect(stripEntriesRuntimeData(output)).toEqual( - stripEntriesRuntimeData(expected) - ); + expect(stripEntriesRuntimeData(output)).toEqual(stripEntriesRuntimeData(expected)); }); it("starting a new entry should add a new entry", async () => { @@ -94,8 +78,6 @@ describe("startNewNestedEntry", () => { await import("./__fixtures__/manipulating/start_entry/startNestedShouldStopRunning"); const output = startNewNestedEntry(currentTime, targetEntry.id, input); - expect(stripEntriesRuntimeData(output)).toEqual( - stripEntriesRuntimeData(expected) - ); + expect(stripEntriesRuntimeData(output)).toEqual(stripEntriesRuntimeData(expected)); }); }); diff --git a/src/timekeep/start.ts b/src/timekeep/start.ts index a56172a..a073027 100644 --- a/src/timekeep/start.ts +++ b/src/timekeep/start.ts @@ -60,9 +60,5 @@ export function startNewNestedEntry( } // If the entry hasn't been started then start it - return updateEntry( - entries, - currentEntry.id, - createEntry(currentEntry.name, currentTime) - ); + return updateEntry(entries, currentEntry.id, createEntry(currentEntry.name, currentTime)); } diff --git a/src/timekeep/update.ts b/src/timekeep/update.ts index 34ff5b0..55c3d11 100644 --- a/src/timekeep/update.ts +++ b/src/timekeep/update.ts @@ -23,11 +23,7 @@ export function updateEntry( if (entry.subEntries !== null) { return { ...entry, - subEntries: updateEntry( - entry.subEntries, - previousEntryId, - newEntry - ), + subEntries: updateEntry(entry.subEntries, previousEntryId, newEntry), }; } @@ -43,10 +39,7 @@ export function updateEntry( * @param collapsed The collapse state * @returns The new updated entry */ -export function setEntryCollapsed( - entry: TimeEntry, - collapsed: boolean -): TimeEntry { +export function setEntryCollapsed(entry: TimeEntry, collapsed: boolean): TimeEntry { // Entry cannot be collapsed if (entry.subEntries === null) { return entry; @@ -69,10 +62,7 @@ export function setEntryCollapsed( * @param entries The entries to stop * @returns The new list of stopped entries */ -export function stopRunningEntries( - entries: TimeEntry[], - endTime: Moment -): TimeEntry[] { +export function stopRunningEntries(entries: TimeEntry[], endTime: Moment): TimeEntry[] { return entries.map((entry) => { // Stop the sub entries if (entry.subEntries) { @@ -105,10 +95,7 @@ export function stopRunningEntries( * @param target The target entry to remove * @returns The new list with the entry removed */ -export function removeEntry( - entries: TimeEntry[], - target: TimeEntry -): TimeEntry[] { +export function removeEntry(entries: TimeEntry[], target: TimeEntry): TimeEntry[] { return entries.reduce((acc: TimeEntry[], entry: TimeEntry) => { if (entry.id !== target.id) { // Filter sub entries for matching entries diff --git a/src/utils/confirm-modal.ts b/src/utils/confirm-modal.ts index 7eaf118..ee37fff 100644 --- a/src/utils/confirm-modal.ts +++ b/src/utils/confirm-modal.ts @@ -10,11 +10,7 @@ export class ConfirmModal extends Modal { // Whether an option was picked picked: boolean; - constructor( - app: App, - message: string, - callback: (choice: boolean) => void - ) { + constructor(app: App, message: string, callback: (choice: boolean) => void) { super(app); this.message = message; this.callback = callback; diff --git a/src/utils/name.test.ts b/src/utils/name.test.ts index 3626036..0ddf7f7 100644 --- a/src/utils/name.test.ts +++ b/src/utils/name.test.ts @@ -2,132 +2,128 @@ import { NameSegmentType, parseNameSegments } from "./name"; import { expect, it, describe } from "vitest"; describe("parseNameSegments", () => { - it("should parse plain text without modification", () => { - const input = "Hello World"; - const result = parseNameSegments(input); - expect(result).toEqual([ - { type: NameSegmentType.Text, text: "Hello World" }, - ]); - }); + it("should parse plain text without modification", () => { + const input = "Hello World"; + const result = parseNameSegments(input); + expect(result).toEqual([{ type: NameSegmentType.Text, text: "Hello World" }]); + }); - it("should parse a Wikilink with no other content", () => { - const input = "[[Wikilink]]"; - const result = parseNameSegments(input); - expect(result).toEqual([ - { - type: NameSegmentType.Link, - url: "Wikilink", - text: "Wikilink", - }, - ]); - }); + it("should parse a Wikilink with no other content", () => { + const input = "[[Wikilink]]"; + const result = parseNameSegments(input); + expect(result).toEqual([ + { + type: NameSegmentType.Link, + url: "Wikilink", + text: "Wikilink", + }, + ]); + }); - it("should parse text with a Wikilink", () => { - const input = "Hello [[Wikilink]]"; - const result = parseNameSegments(input); - expect(result).toEqual([ - { type: NameSegmentType.Text, text: "Hello " }, - { - type: NameSegmentType.Link, - url: "Wikilink", - text: "Wikilink", - }, - ]); - }); + it("should parse text with a Wikilink", () => { + const input = "Hello [[Wikilink]]"; + const result = parseNameSegments(input); + expect(result).toEqual([ + { type: NameSegmentType.Text, text: "Hello " }, + { + type: NameSegmentType.Link, + url: "Wikilink", + text: "Wikilink", + }, + ]); + }); - it("should parse a Markdown link with no other content", () => { - const input = "[Text](https://example.com)"; - const result = parseNameSegments(input); - expect(result).toEqual([ - { - type: NameSegmentType.Link, - url: "https://example.com", - text: "Text", - }, - ]); - }); + it("should parse a Markdown link with no other content", () => { + const input = "[Text](https://example.com)"; + const result = parseNameSegments(input); + expect(result).toEqual([ + { + type: NameSegmentType.Link, + url: "https://example.com", + text: "Text", + }, + ]); + }); - it("should parse text with a Markdown link", () => { - const input = "Hello [Text](https://example.com)"; - const result = parseNameSegments(input); - expect(result).toEqual([ - { type: NameSegmentType.Text, text: "Hello " }, - { - type: NameSegmentType.Link, - url: "https://example.com", - text: "Text", - }, - ]); - }); + it("should parse text with a Markdown link", () => { + const input = "Hello [Text](https://example.com)"; + const result = parseNameSegments(input); + expect(result).toEqual([ + { type: NameSegmentType.Text, text: "Hello " }, + { + type: NameSegmentType.Link, + url: "https://example.com", + text: "Text", + }, + ]); + }); - it("should handle malformed Wikilinks gracefully", () => { - const input = "[[Wikilink"; - const result = parseNameSegments(input); - expect(result).toEqual([ - { type: NameSegmentType.Text, text: "[[Wikilink" }, - ]); - }); + it("should handle malformed Wikilinks gracefully", () => { + const input = "[[Wikilink"; + const result = parseNameSegments(input); + expect(result).toEqual([{ type: NameSegmentType.Text, text: "[[Wikilink" }]); + }); - it("should handle malformed Markdown links gracefully", () => { - const input = "[Text](https://example.com"; - const result = parseNameSegments(input); - expect(result).toEqual([ - { type: NameSegmentType.Text, text: "[Text](https://example.com" }, - ]); - }); + it("should handle malformed Markdown links gracefully", () => { + const input = "[Text](https://example.com"; + const result = parseNameSegments(input); + expect(result).toEqual([ + { type: NameSegmentType.Text, text: "[Text](https://example.com" }, + ]); + }); - it("should parse a combination of Wikilinks and Markdown links", () => { - const input = "Hello [[Wikilink]] and [Text](https://example.com)"; - const result = parseNameSegments(input); - expect(result).toEqual([ - { type: NameSegmentType.Text, text: "Hello " }, - { - type: NameSegmentType.Link, - url: "Wikilink", - text: "Wikilink", - }, - { type: NameSegmentType.Text, text: " and " }, - { - type: NameSegmentType.Link, - url: "https://example.com", - text: "Text", - }, - ]); - }); + it("should parse a combination of Wikilinks and Markdown links", () => { + const input = "Hello [[Wikilink]] and [Text](https://example.com)"; + const result = parseNameSegments(input); + expect(result).toEqual([ + { type: NameSegmentType.Text, text: "Hello " }, + { + type: NameSegmentType.Link, + url: "Wikilink", + text: "Wikilink", + }, + { type: NameSegmentType.Text, text: " and " }, + { + type: NameSegmentType.Link, + url: "https://example.com", + text: "Text", + }, + ]); + }); - it("should parse a combination of Wikilinks and Markdown links with trailing text", () => { - const input = "Hello [[Wikilink]] and [Text](https://example.com)."; - const result = parseNameSegments(input); - expect(result).toEqual([ - { type: NameSegmentType.Text, text: "Hello " }, - { - type: NameSegmentType.Link, - url: "Wikilink", - text: "Wikilink", - }, - { type: NameSegmentType.Text, text: " and " }, - { - type: NameSegmentType.Link, - url: "https://example.com", - text: "Text", - }, - { type: NameSegmentType.Text, text: "." }, - ]); - }); + it("should parse a combination of Wikilinks and Markdown links with trailing text", () => { + const input = "Hello [[Wikilink]] and [Text](https://example.com)."; + const result = parseNameSegments(input); + expect(result).toEqual([ + { type: NameSegmentType.Text, text: "Hello " }, + { + type: NameSegmentType.Link, + url: "Wikilink", + text: "Wikilink", + }, + { type: NameSegmentType.Text, text: " and " }, + { + type: NameSegmentType.Link, + url: "https://example.com", + text: "Text", + }, + { type: NameSegmentType.Text, text: "." }, + ]); + }); - it("should handle multiple Wikilinks correctly", () => { - const input = "[[Link1]] and [[Link2]]"; - const result = parseNameSegments(input); - expect(result).toEqual([ - { type: NameSegmentType.Link, url: "Link1", text: "Link1" }, - { type: NameSegmentType.Text, text: " and " }, - { type: NameSegmentType.Link, url: "Link2", text: "Link2" }, - ]); - }); + it("should handle multiple Wikilinks correctly", () => { + const input = "[[Link1]] and [[Link2]]"; + const result = parseNameSegments(input); + expect(result).toEqual([ + { type: NameSegmentType.Link, url: "Link1", text: "Link1" }, + { type: NameSegmentType.Text, text: " and " }, + { type: NameSegmentType.Link, url: "Link2", text: "Link2" }, + ]); + }); - it("should handle empty input gracefully", () => { - const input = ""; - const result = parseNameSegments(input); - expect(result).toEqual([]); - }); + it("should handle empty input gracefully", () => { + const input = ""; + const result = parseNameSegments(input); + expect(result).toEqual([]); + }); }); diff --git a/src/utils/name.ts b/src/utils/name.ts index cbf3a43..6dc4bab 100644 --- a/src/utils/name.ts +++ b/src/utils/name.ts @@ -29,8 +29,7 @@ export function parseNameSegments(input: string): NameSegment[] { // Handle the text before the current link const beforeLink = input.slice(lastIndex, index); - if (beforeLink) - segments.push({ type: NameSegmentType.Text, text: beforeLink }); + if (beforeLink) segments.push({ type: NameSegmentType.Text, text: beforeLink }); // Handle the matched link if (match[1]) { diff --git a/src/utils/time.test.ts b/src/utils/time.test.ts index 8204e70..0dead5b 100644 --- a/src/utils/time.test.ts +++ b/src/utils/time.test.ts @@ -60,14 +60,11 @@ describe("format duration", () => { [1000 * 60 * 60 * 2, "2h 0s"], [1000 * 60 * 60 * 2.5, "2h 30m 0s"], [1000 * 60 * 60 * 2.505, "2h 30m 18s"], - ])( - 'for duration "%s" should expected formatted "%s"', - (input, expected) => { - const output = formatDurationLong(input); + ])('for duration "%s" should expected formatted "%s"', (input, expected) => { + const output = formatDurationLong(input); - expect(output).toBe(expected); - } - ); + expect(output).toBe(expected); + }); }); describe("format duration short", () => { @@ -76,14 +73,11 @@ describe("format duration short", () => { [1000 * 60 * 60 * 25.25, "25.25h"], [1000 * 60 * 60 * 25.255, "25.25h"], [1000 * 60 * 60 * 50.5, "50.50h"], - ])( - 'for duration "%s" should expected formatted "%s"', - (input, expected) => { - const output = formatDurationShort(input); + ])('for duration "%s" should expected formatted "%s"', (input, expected) => { + const output = formatDurationShort(input); - expect(output).toBe(expected); - } - ); + expect(output).toBe(expected); + }); }); describe("format duration decimal", () => { @@ -92,14 +86,11 @@ describe("format duration decimal", () => { [1000 * 60 * 60 * 25.25, "25.25"], [1000 * 60 * 60 * 25.255, "25.25"], [1000 * 60 * 60 * 50.5, "50.50"], - ])( - 'for duration "%s" should expected formatted "%s"', - (input, expected) => { - const output = formatDurationDecimal(input); + ])('for duration "%s" should expected formatted "%s"', (input, expected) => { + const output = formatDurationDecimal(input); - expect(output).toBe(expected); - } - ); + expect(output).toBe(expected); + }); }); describe("format duration with format", () => { @@ -134,14 +125,11 @@ describe("format duration with format", () => { test.each([ ["ANY" as DurationFormat, 1000, "unknown duration format"], ["" as DurationFormat, 1000, "unknown duration format"], - ])( - 'for format "%s" with duration "%s" should thrown Error "%s"', - (format, input, error) => { - expect(() => { - formatDuration(format, input); - }).toThrow(error); - } - ); + ])('for format "%s" with duration "%s" should thrown Error "%s"', (format, input, error) => { + expect(() => { + formatDuration(format, input); + }).toThrow(error); + }); }); describe("format pdf date", () => { @@ -169,14 +157,11 @@ describe("format pdf row date", () => { ["2024-01-12 14:34:45", "12/01/2024 14:34"], ["2024-09-24 18:34:45", "24/09/2024 18:34"], ["2023-09-24 20:34:45", "24/09/2023 20:34"], - ])( - 'for date time "%s" should expected formatted "%s"', - (input, expected) => { - const settings: TimekeepSettings = defaultSettings; - settings.pdfRowDateFormat = "DD/MM/YYYY HH:mm"; - const output = formatPdfRowDate(moment(input), settings); + ])('for date time "%s" should expected formatted "%s"', (input, expected) => { + const settings: TimekeepSettings = defaultSettings; + settings.pdfRowDateFormat = "DD/MM/YYYY HH:mm"; + const output = formatPdfRowDate(moment(input), settings); - expect(output).toBe(expected); - } - ); + expect(output).toBe(expected); + }); }); diff --git a/src/utils/time.ts b/src/utils/time.ts index f205e93..b88dd9d 100644 --- a/src/utils/time.ts +++ b/src/utils/time.ts @@ -8,10 +8,7 @@ import { DurationFormat, TimekeepSettings } from "@/settings"; * @param settings The timekeep settings * @returns The formatted timestamp */ -export function formatTimestamp( - timestamp: Moment, - settings: TimekeepSettings -): string { +export function formatTimestamp(timestamp: Moment, settings: TimekeepSettings): string { return timestamp.format(settings.timestampFormat); } @@ -23,10 +20,7 @@ export function formatTimestamp( * @param settings The timekeep settings * @returns The formatted timestamp */ -export function formatEditableTimestamp( - timestamp: Moment, - settings: TimekeepSettings -): string { +export function formatEditableTimestamp(timestamp: Moment, settings: TimekeepSettings): string { return timestamp.format(settings.editableTimestampFormat); } @@ -37,10 +31,7 @@ export function formatEditableTimestamp( * @param settings The timekeep settings * @returns The timestamp */ -export function parseEditableTimestamp( - formatted: string, - settings: TimekeepSettings -): Moment { +export function parseEditableTimestamp(formatted: string, settings: TimekeepSettings): Moment { return moment(formatted, settings.editableTimestampFormat, true); } @@ -52,10 +43,7 @@ export function parseEditableTimestamp( * @throws unknown duration format when format is not supported * @returns The formatted duration */ -export function formatDuration( - format: DurationFormat, - durationMS: number -): string { +export function formatDuration(format: DurationFormat, durationMS: number): string { switch (format) { case DurationFormat.LONG: return formatDurationLong(durationMS); @@ -124,10 +112,7 @@ export function formatDurationDecimal(durationMS: number): string { * @param settings The settings * @returns The formatted date */ -export function formatPdfDate( - value: Moment, - settings: TimekeepSettings -): string { +export function formatPdfDate(value: Moment, settings: TimekeepSettings): string { return value.format(settings.pdfDateFormat); } @@ -140,9 +125,6 @@ export function formatPdfDate( * @param settings The settings * @returns The formatted timestamp */ -export function formatPdfRowDate( - value: Moment, - settings: TimekeepSettings -): string { +export function formatPdfRowDate(value: Moment, settings: TimekeepSettings): string { return value.format(settings.pdfRowDateFormat); } diff --git a/src/views/timekeep-markdown-view.ts b/src/views/timekeep-markdown-view.ts index 08ed38b..38ed113 100644 --- a/src/views/timekeep-markdown-view.ts +++ b/src/views/timekeep-markdown-view.ts @@ -5,12 +5,7 @@ import { TimekeepSettings } from "@/settings"; import { CustomOutputFormat } from "@/output"; import { Timekeep, stripTimekeepRuntimeData } from "@/timekeep/schema"; import { LoadResult, replaceTimekeepCodeblock } from "@/timekeep/parser"; -import { - TFile, - TAbstractFile, - MarkdownRenderChild, - MarkdownPostProcessorContext, -} from "obsidian"; +import { TFile, TAbstractFile, MarkdownRenderChild, MarkdownPostProcessorContext } from "obsidian"; import { Timesheet } from "@/components/timesheet"; import { TimesheetLoadError } from "@/components/timesheetLoadError"; @@ -53,17 +48,11 @@ export class TimekeepMarkdownView extends MarkdownRenderChild { onload(): void { // Hook file renaming to update the file we are saving to if its renamed this.registerEvent( - this.app.vault.on( - "rename", - (file: TAbstractFile, oldName: string) => { - if ( - file instanceof TFile && - oldName == this.fileSourcePath - ) { - this.fileSourcePath = file.path; - } + this.app.vault.on("rename", (file: TAbstractFile, oldName: string) => { + if (file instanceof TFile && oldName == this.fileSourcePath) { + this.fileSourcePath = file.path; } - ) + }) ); // Render the content @@ -106,10 +95,7 @@ export class TimekeepMarkdownView extends MarkdownRenderChild { this.addChild(timesheet); this.timesheet = timesheet; } else { - const timesheet = new TimesheetLoadError( - this.containerEl, - this.loadResult.error - ); + const timesheet = new TimesheetLoadError(this.containerEl, this.loadResult.error); this.addChild(timesheet); this.timesheet = timesheet; } @@ -134,10 +120,7 @@ export class TimekeepMarkdownView extends MarkdownRenderChild { const editor = activeEditor.editor; if (!editor) return; - editor.scrollTo( - this.restoreScrollInfo.left, - this.restoreScrollInfo.top - ); + editor.scrollTo(this.restoreScrollInfo.left, this.restoreScrollInfo.top); } /** @@ -166,10 +149,7 @@ export class TimekeepMarkdownView extends MarkdownRenderChild { return false; } finally { // Queue scroll restoration after 50ms (Should be enough for the codeblock to re-render) - this.restoreScrollTimeout = setTimeout( - this.restoreEditorScroll.bind(this), - 50 - ); + this.restoreScrollTimeout = setTimeout(this.restoreEditorScroll.bind(this), 50); } } @@ -182,8 +162,7 @@ export class TimekeepMarkdownView extends MarkdownRenderChild { const sectionInfo = this.context.getSectionInfo(this.containerEl); // Ensure we actually have a section to write to - if (sectionInfo === null) - throw new Error("Section to write did not exist"); + if (sectionInfo === null) throw new Error("Section to write did not exist"); const file = this.app.vault.getFileByPath(this.fileSourcePath); @@ -213,9 +192,6 @@ export class TimekeepMarkdownView extends MarkdownRenderChild { const backupFileName = `timekeep-write-backup-${moment().format("YYYY-MM-DD HH-mm-ss")}.json`; // Write to the backup file - this.app.vault.create( - backupFileName, - JSON.stringify(stripTimekeepRuntimeData(timekeep)) - ); + this.app.vault.create(backupFileName, JSON.stringify(stripTimekeepRuntimeData(timekeep))); } } diff --git a/src/views/timekeep-merger-modal.ts b/src/views/timekeep-merger-modal.ts index f52824a..b911f41 100644 --- a/src/views/timekeep-merger-modal.ts +++ b/src/views/timekeep-merger-modal.ts @@ -26,11 +26,7 @@ export class TimekeepMergerModal extends Modal { private exportPdf: boolean; private settings: Store; - constructor( - app: App, - settings: Store, - exportPdf = false - ) { + constructor(app: App, settings: Store, exportPdf = false) { super(app); this.exportPdf = exportPdf; @@ -102,10 +98,7 @@ export class TimekeepMergerModal extends Modal { }; for (const result of this.selectedResults) { - timekeep.entries = [ - ...timekeep.entries, - ...result.timekeep.entries, - ]; + timekeep.entries = [...timekeep.entries, ...result.timekeep.entries]; } // Close after taking the results as closing resets the list @@ -148,8 +141,7 @@ export class TimekeepMergerModal extends Modal { updateSelectAll() { if (this.selectContainer) { - this.selectContainer.style.display = - this.filteredResults.length > 0 ? "flex" : "none"; + this.selectContainer.style.display = this.filteredResults.length > 0 ? "flex" : "none"; } const isAllSelected = this.isAllSelected(); @@ -168,9 +160,7 @@ export class TimekeepMergerModal extends Modal { } for (const result of this.filteredResults) { - const selected = this.selectedResults.find( - (selected) => selected.id === result.id - ); + const selected = this.selectedResults.find((selected) => selected.id === result.id); if (selected === undefined) { return false; @@ -192,9 +182,7 @@ export class TimekeepMergerModal extends Modal { if (checked) { // Find all results that aren't already selected const toBeSelected = this.filteredResults.filter((result) => { - const selected = this.selectedResults.find( - (selected) => selected.id === result.id - ); + const selected = this.selectedResults.find((selected) => selected.id === result.id); return selected === undefined; }); @@ -279,8 +267,7 @@ export class TimekeepMergerModal extends Modal { type: "checkbox", }); checkbox.checked = - this.selectedResults.find((other) => other.id === result.id) !== - undefined; + this.selectedResults.find((other) => other.id === result.id) !== undefined; checkbox.id = `timekeep-${result.id}`; checkbox.onchange = () => { diff --git a/test-vault/Dataview-Longest-Ordered-Example.md b/test-vault/Dataview-Longest-Ordered-Example.md index 3bbc8e6..c20a9c4 100644 --- a/test-vault/Dataview-Longest-Ordered-Example.md +++ b/test-vault/Dataview-Longest-Ordered-Example.md @@ -1,4 +1,3 @@ - ```dataviewjs // Get the currently open file const targetFile = this.app.vault.getFileByPath("Obsidian Timekeep.md"); @@ -32,7 +31,7 @@ function formatDuration(totalTime) { for (const timekeep of timekeeps) { // Create the entries const data = timekeep.entries - .map((entry) => { + .map((entry) => { let duration = timekeepPlugin.getEntryDuration(entry, currentTime); return [entry.name, duration]; }) diff --git a/test-vault/Obsidian Timekeep.md b/test-vault/Obsidian Timekeep.md index bc0ab8d..66a4d37 100644 --- a/test-vault/Obsidian Timekeep.md +++ b/test-vault/Obsidian Timekeep.md @@ -1,11 +1,10 @@ - ```dataviewjs // Get the currently open file const activeFile = this.app.workspace.getActiveFile(); -if(!activeFile || !activeFile.name) return; +if(!activeFile || !activeFile.name) return; // Read the file -const text = await this.app.vault.read(activeFile); +const text = await this.app.vault.read(activeFile); // Get the timekeep plugin API const timekeepPlugin = this.app.plugins.plugins.timekeep; @@ -26,12 +25,12 @@ for (const timekeep of timekeeps) { dv.span(totalRunningDuration); ``` - ```timekeep {"entries":[{"name":"Block 4 1","startTime":null,"endTime":null,"subEntries":[{"name":"Part 1","startTime":null,"endTime":null,"subEntries":[{"name":"Part 1","startTime":"2024-03-17T01:33:51.000Z","endTime":"2024-09-17T07:50:55.000Z","subEntries":null},{"name":"Part 2","startTime":null,"endTime":null,"subEntries":[{"name":"Part 1","startTime":"2024-03-24T05:20:54.000Z","endTime":"2024-03-24T05:20:55.000Z","subEntries":null},{"name":"Part 2","startTime":"2026-03-25T22:33:49.279Z","endTime":"2026-03-25T23:04:57.335Z","subEntries":null}]}]},{"name":"Part 2","startTime":"2024-03-24T05:20:51.498Z","endTime":"2024-03-24T05:20:53.370Z","subEntries":null},{"name":"Part 3","startTime":"2024-03-24T05:20:56.000Z","endTime":"2024-03-24T05:21:30.000Z","subEntries":null}]},{"name":"Block 5","startTime":"2024-03-17T01:33:57.375Z","endTime":"2024-03-17T01:33:58.867Z","subEntries":null},{"name":"Block 8","startTime":"2024-03-17T01:37:33.000Z","endTime":"2024-03-17T06:37:35.000Z","subEntries":null},{"name":"Block 9","startTime":"2024-03-17T01:37:44.470Z","endTime":"2024-03-17T01:37:45.141Z","subEntries":null},{"name":"Block 6","startTime":"2024-03-17T02:00:38.491Z","endTime":"2024-03-17T02:00:39.208Z","subEntries":null},{"name":"Block 7","startTime":"2024-03-17T02:00:39.528Z","endTime":"2024-03-17T02:00:39.823Z","subEntries":null},{"name":"Block 8","startTime":"2024-03-17T02:00:40.118Z","endTime":"2024-03-17T02:00:40.428Z","subEntries":null},{"name":"Block 9","startTime":"2024-03-17T02:00:40.814Z","endTime":"2024-03-17T02:00:41.066Z","subEntries":null},{"name":"Block 10","startTime":"2024-03-17T02:00:41.327Z","endTime":"2024-03-17T02:00:41.507Z","subEntries":null},{"name":"Block 11","startTime":"2024-03-17T02:00:41.783Z","endTime":"2024-03-17T02:00:42.009Z","subEntries":null},{"name":"Block 13","startTime":"2024-03-17T02:57:16.000Z","endTime":"2024-03-17T02:57:16.000Z","subEntries":null},{"name":"Block 14","startTime":"2024-03-17T02:57:19.000Z","endTime":"2024-03-17T02:57:19.000Z","subEntries":null},{"name":"Block 15","startTime":"2024-03-17T02:57:24.000Z","endTime":"2024-03-17T02:57:24.000Z","subEntries":null},{"name":"Block 16 Supper reallly long name that leaves the table bounds","startTime":"2024-03-17T02:57:25.000Z","endTime":"2024-03-17T02:57:25.000Z","subEntries":null},{"name":"Block 17","startTime":"2024-03-17T03:29:53.766Z","endTime":"2024-03-17T03:29:54.925Z","subEntries":null},{"name":"Block 18","startTime":"2024-03-17T03:30:26.368Z","endTime":"2024-03-17T03:30:34.257Z","subEntries":null},{"name":"New Block","startTime":"2024-03-17T03:32:42.451Z","endTime":"2024-03-17T03:33:41.318Z","subEntries":null},{"name":"Block 20","startTime":"2024-03-17T03:37:45.552Z","endTime":"2024-03-17T03:37:47.568Z","subEntries":null},{"name":"Block 21","startTime":"2024-03-17T03:38:14.405Z","endTime":"2024-03-17T03:38:18.039Z","subEntries":null},{"name":"Block 21","startTime":"2024-03-17T05:01:30.553Z","endTime":"2024-03-17T05:01:36.012Z","subEntries":null},{"name":"Block 22","startTime":"2024-03-17T05:01:37.365Z","endTime":"2024-03-17T05:01:40.180Z","subEntries":null},{"name":"Block 23","startTime":"2024-03-24T03:44:16.500Z","endTime":"2024-03-24T03:44:18.168Z","subEntries":null},{"name":"Block 24","startTime":"2024-03-24T03:44:34.125Z","endTime":"2024-03-24T03:44:35.421Z","subEntries":null},{"name":"Block 25","startTime":"2024-03-24T03:44:38.073Z","endTime":"2024-03-24T03:44:50.001Z","subEntries":null},{"name":"Block 26","startTime":"2024-03-24T04:05:50.912Z","endTime":"2024-03-24T04:05:53.243Z","subEntries":null},{"name":"This is my block","startTime":"2024-03-24T04:09:02.146Z","endTime":"2024-03-24T04:09:06.662Z","subEntries":null},{"name":"Block 28","startTime":"2024-03-24T04:15:47.980Z","endTime":"2024-03-24T04:15:48.924Z","subEntries":null},{"name":"Block 29","startTime":"2024-03-24T04:15:49.518Z","endTime":"2024-03-24T04:15:50.561Z","subEntries":null},{"name":"Block 30","startTime":"2024-03-24T04:15:51.654Z","endTime":"2024-03-24T04:15:52.560Z","subEntries":null},{"name":"Block 31","startTime":"2024-03-24T04:17:34.822Z","endTime":"2024-03-24T04:17:35.571Z","subEntries":null},{"name":"Block 32","startTime":"2024-03-24T04:17:36.303Z","endTime":"2024-03-24T04:17:36.936Z","subEntries":null},{"name":"Block 33","startTime":"2024-03-24T04:17:43.413Z","endTime":"2024-03-24T04:17:44.142Z","subEntries":null},{"name":"Block 34","startTime":"2024-03-24T04:17:44.916Z","endTime":"2024-03-24T04:17:45.552Z","subEntries":null},{"name":"Block 35","startTime":"2024-03-24T04:17:52.315Z","endTime":"2024-03-24T04:17:52.971Z","subEntries":null},{"name":"Block 36","startTime":"2024-03-24T04:17:53.590Z","endTime":"2024-03-24T04:17:54.318Z","subEntries":null},{"name":"Block 37","startTime":"2024-03-24T04:17:54.858Z","endTime":"2024-03-24T04:17:56.340Z","subEntries":null},{"name":"Block 38","startTime":"2024-03-24T04:21:19.540Z","endTime":"2024-03-24T04:21:20.803Z","subEntries":null},{"name":"Block 39","startTime":"2024-03-24T04:21:21.876Z","endTime":"2024-03-24T04:21:24.420Z","subEntries":null},{"name":"Block 40","startTime":"2024-03-24T04:22:14.073Z","endTime":"2024-03-24T04:22:14.793Z","subEntries":null},{"name":"Block 41","startTime":"2024-03-24T04:22:15.463Z","endTime":"2024-03-24T04:22:16.016Z","subEntries":null},{"name":"Block 42","startTime":"2024-03-24T04:28:14.807Z","endTime":"2024-03-24T04:28:15.565Z","subEntries":null},{"name":"Block 43","startTime":"2024-03-24T04:28:39.885Z","endTime":"2024-03-24T04:28:42.912Z","subEntries":null},{"name":"Block 44","startTime":"2024-03-24T04:28:44.495Z","endTime":"2024-03-24T04:28:45.736Z","subEntries":null},{"name":"Block 44","startTime":"2024-03-24T04:30:43.184Z","endTime":"2024-03-24T04:30:45.307Z","subEntries":null},{"name":"Block 45","startTime":"2024-03-24T04:30:46.565Z","endTime":"2024-03-24T04:30:47.749Z","subEntries":null},{"name":"Block 46","startTime":"2024-03-24T04:30:48.502Z","endTime":"2024-03-24T04:30:49.762Z","subEntries":null},{"name":"Block 47","startTime":"2024-03-24T04:31:01.261Z","endTime":"2024-03-24T04:31:12.831Z","subEntries":null},{"name":"Block 48","startTime":"2024-03-24T04:31:14.603Z","endTime":"2024-03-24T04:31:16.328Z","subEntries":null},{"name":"Block 49","startTime":"2024-03-24T04:31:17.249Z","endTime":"2024-03-24T04:31:18.115Z","subEntries":null},{"name":"Block 50","startTime":"2024-03-24T04:31:19.266Z","endTime":"2024-03-24T04:31:20.199Z","subEntries":null},{"name":"Block 51","startTime":"2024-03-24T04:33:17.046Z","endTime":"2024-03-24T04:33:17.646Z","subEntries":null},{"name":"Block 52","startTime":"2024-03-24T04:33:18.253Z","endTime":"2024-03-24T04:33:18.969Z","subEntries":null},{"name":"Block 53","startTime":"2024-03-24T04:33:19.684Z","endTime":"2024-03-24T04:33:21.706Z","subEntries":null},{"name":"Block 54","startTime":"2024-03-24T04:33:22.293Z","endTime":"2024-03-24T04:33:22.674Z","subEntries":null},{"name":"Block 55","startTime":"2024-03-24T06:35:53.785Z","endTime":"2024-03-24T06:35:54.322Z","subEntries":null},{"name":"Block 56","startTime":"2024-03-24T06:35:54.693Z","endTime":"2024-03-24T06:35:54.864Z","subEntries":null},{"name":"Block 57","startTime":"2024-03-24T06:35:55.031Z","endTime":"2024-03-24T06:35:55.190Z","subEntries":null},{"name":"Block 58","startTime":"2024-03-24T06:35:55.631Z","endTime":"2024-03-24T06:35:57.836Z","subEntries":null},{"name":"Block 59","startTime":"2024-03-24T06:36:06.400Z","endTime":"2024-03-24T06:36:08.452Z","subEntries":null},{"name":"Block 60","startTime":"2024-03-24T06:36:53.108Z","endTime":"2024-03-24T06:36:53.791Z","subEntries":null},{"name":"Block 61","startTime":"2024-03-24T06:42:04.593Z","endTime":"2024-03-24T06:42:05.961Z","subEntries":null},{"name":"Block 62","startTime":"2024-03-24T06:42:30.789Z","endTime":"2024-03-24T06:42:31.609Z","subEntries":null},{"name":"Block 63","startTime":"2024-05-01T08:17:37.721Z","endTime":"2024-05-01T08:20:49.070Z","subEntries":null},{"name":"Test dwada uidawh dawhiud hawhiduia uhiwdiuhhauiw dhawd ihuawuidh awudhiu ahiwudhiu ahwiudihu awhiudhiu hiud ihuawhid hiuahiud ihwad","startTime":"2024-05-01T08:20:56.478Z","endTime":"2024-05-01T08:21:01.643Z","subEntries":null},{"name":"Test","startTime":"2024-05-01T08:21:03.005Z","endTime":"2024-05-01T08:21:35.567Z","subEntries":null},{"name":"tEWADAWDAWDAWD","startTime":"2024-05-01T08:21:37.838Z","endTime":"2024-05-01T08:22:25.344Z","subEntries":null},{"name":"Tewadwdawd","startTime":"2024-05-01T08:22:27.180Z","endTime":"2024-05-01T08:22:28.683Z","subEntries":null},{"name":"awdawd","startTime":"2024-05-01T08:22:30.186Z","endTime":"2024-05-01T08:22:36.241Z","subEntries":null},{"name":"Block 69","startTime":"2024-05-01T08:22:36.760Z","endTime":"2024-05-01T08:22:37.361Z","subEntries":null},{"name":"Block 70","startTime":"2024-05-01T08:22:37.695Z","endTime":"2024-05-01T08:22:38.428Z","subEntries":null},{"name":"Block 71","startTime":"2024-05-01T08:22:39.077Z","endTime":"2024-05-01T08:22:40.410Z","subEntries":null},{"name":"Block 72","startTime":"2024-05-01T08:22:40.991Z","endTime":"2024-05-01T08:22:41.538Z","subEntries":null},{"name":"Block 73","startTime":"2024-05-01T08:22:41.943Z","endTime":"2024-05-01T08:22:42.729Z","subEntries":null},{"name":"Block 74","startTime":"2024-05-01T08:22:43.160Z","endTime":"2024-05-01T08:22:44.806Z","subEntries":null},{"name":"Block 75","startTime":"2024-05-01T08:22:45.423Z","endTime":"2024-05-01T08:22:46.040Z","subEntries":null},{"name":"Block 76","startTime":"2024-05-01T08:22:49.574Z","endTime":"2024-05-01T08:22:50.712Z","subEntries":null},{"name":"Block 77","startTime":"2024-05-01T08:22:51.298Z","endTime":"2024-05-01T08:23:06.033Z","subEntries":null},{"name":"Block 78","startTime":"2024-05-01T08:23:07.620Z","endTime":"2024-05-01T08:23:08.124Z","subEntries":null},{"name":"Block 79","startTime":"2024-05-01T08:23:09.529Z","endTime":"2024-05-01T08:23:09.984Z","subEntries":null},{"name":"Block 80","startTime":"2024-05-01T08:23:44.681Z","endTime":"2024-05-01T08:23:56.772Z","subEntries":null},{"name":"Block 82","startTime":null,"endTime":null,"collapsed":true,"subEntries":[{"name":"Part 1","startTime":"2024-07-21T07:12:56.433Z","endTime":"2024-07-21T07:13:33.907Z","subEntries":null},{"name":"Part 2","startTime":"2024-07-21T07:24:44.769Z","endTime":"2024-07-21T07:24:48.149Z","subEntries":null},{"name":"Part 3","startTime":"2024-07-21T09:06:54.527Z","endTime":"2024-07-21T09:06:57.360Z","subEntries":null},{"name":"Part 4","startTime":"2024-07-21T09:07:10.820Z","endTime":"2024-07-21T09:07:11.426Z","subEntries":null}]},{"name":"Block 82","startTime":null,"endTime":null,"collapsed":true,"subEntries":[{"name":"Part 1","startTime":"2024-07-21T07:13:34.743Z","endTime":"2024-07-21T07:14:13.095Z","subEntries":null},{"name":"Part 2","startTime":"2024-07-21T07:14:13.562Z","endTime":"2024-07-21T07:14:14.679Z","subEntries":null},{"name":"Part 3","startTime":"2024-07-21T07:14:15.566Z","endTime":"2024-07-21T07:14:15.970Z","subEntries":null},{"name":"Part 4","startTime":"2024-07-21T09:06:52.510Z","endTime":"2024-07-21T09:06:53.351Z","subEntries":null},{"name":"Part 5","startTime":"2024-07-21T09:07:19.089Z","endTime":"2024-07-21T09:07:20.066Z","subEntries":null}]},{"name":"Block 83","startTime":"2024-07-21T09:07:21.923Z","endTime":"2024-07-21T09:07:22.516Z","subEntries":null},{"name":"Block 81","startTime":null,"endTime":null,"subEntries":[{"name":"Part 1","startTime":"2025-01-07T02:20:00.000Z","endTime":"2025-01-07T03:20:00.000Z","subEntries":null},{"name":"Part 2","startTime":"2026-03-25T23:04:57.335Z","endTime":"2026-03-25T23:05:00.051Z","subEntries":null}]},{"name":"Block 85 [[#Test]] ","startTime":"2025-01-07T04:18:19.000Z","endTime":"2025-01-07T03:18:20.000Z","subEntries":null},{"name":"Block 86","startTime":"2026-03-25T20:20:44.814Z","endTime":"2026-03-25T20:53:38.364Z","subEntries":null},{"name":"Block 87","startTime":"2026-03-25T22:20:11.034Z","endTime":"2026-03-25T22:20:13.254Z","subEntries":null},{"name":"Block 88","startTime":null,"endTime":null,"subEntries":[{"name":"Part 1","startTime":null,"endTime":null,"subEntries":[{"name":"Part 1","startTime":null,"endTime":null,"subEntries":[{"name":"Part 1","startTime":"2026-03-25T22:20:13.921Z","endTime":"2026-03-25T22:33:49.279Z","subEntries":null},{"name":"Part 2","startTime":"2026-03-25T23:05:33.696Z","endTime":"2026-03-25T23:05:35.361Z","subEntries":null}]},{"name":"Part 2","startTime":null,"endTime":null,"subEntries":[{"name":"Part 1","startTime":"2026-03-25T23:05:12.433Z","endTime":"2026-03-25T23:05:14.427Z","subEntries":null},{"name":"Part 2","startTime":"2026-03-25T23:05:18.672Z","endTime":"2026-03-25T23:05:22.812Z","subEntries":null}]},{"name":"Part 3","startTime":"2026-03-25T23:09:44.281Z","endTime":"2026-03-25T23:09:46.096Z","subEntries":null}]},{"name":"Part 2","startTime":"2026-03-25T23:05:10.205Z","endTime":"2026-03-25T23:05:11.240Z","subEntries":null},{"name":"Part 3","startTime":"2026-03-25T23:05:15.995Z","endTime":"2026-03-25T23:05:17.046Z","subEntries":null}]}]} ``` + ```timekeep {"entries":[{"name":"Block 1","startTime":null,"endTime":null,"subEntries":[{"name":"Part 1","startTime":"2024-03-31T07:27:36.569Z","endTime":"2024-03-31T07:27:37.726Z","subEntries":null},{"name":"Part 2","startTime":null,"endTime":null,"subEntries":[{"name":"Part 1","startTime":"2024-03-31T07:27:42.846Z","endTime":"2024-03-31T07:27:44.468Z","subEntries":null},{"name":"Part 2","startTime":"2024-03-31T07:27:47.517Z","endTime":"2024-03-31T07:27:48.459Z","subEntries":null}]}]},{"name":"Block 2","startTime":"2024-03-31T07:27:38.418Z","endTime":"2024-03-31T07:27:38.917Z","subEntries":null},{"name":"Block 3","startTime":"2024-03-31T07:27:39.480Z","endTime":"2024-03-31T07:27:39.796Z","subEntries":null},{"name":"Block 4","startTime":"2024-03-31T07:27:40.088Z","endTime":"2024-03-31T07:27:40.331Z","subEntries":null},{"name":"Block 5","startTime":"2024-03-31T07:27:40.548Z","endTime":"2024-03-31T07:27:40.795Z","subEntries":null},{"name":"Block 6","startTime":"2024-03-31T07:27:41.037Z","endTime":"2024-03-31T07:27:41.520Z","subEntries":null}]} ``` -# Test \ No newline at end of file +# Test diff --git a/tsconfig.json b/tsconfig.json index 823a5ca..4e32b4e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,21 +1,21 @@ { - "compilerOptions": { - "baseUrl": ".", - "inlineSourceMap": true, - "inlineSources": true, - "module": "ESNext", - "target": "ESNext", - "allowJs": true, - "noImplicitAny": true, - "moduleResolution": "node", - "isolatedModules": true, - "strictNullChecks": true, - "lib": ["DOM", "ES5", "ES6"], - "allowSyntheticDefaultImports": true, - "paths": { - "@/*": ["src/*"] - }, - "esModuleInterop": true - }, - "include": ["src/**/*", "types/**/*"] + "compilerOptions": { + "baseUrl": ".", + "inlineSourceMap": true, + "inlineSources": true, + "module": "ESNext", + "target": "ESNext", + "allowJs": true, + "noImplicitAny": true, + "moduleResolution": "node", + "isolatedModules": true, + "strictNullChecks": true, + "lib": ["DOM", "ES5", "ES6"], + "allowSyntheticDefaultImports": true, + "paths": { + "@/*": ["src/*"] + }, + "esModuleInterop": true + }, + "include": ["src/**/*", "types/**/*"] } diff --git a/versions.json b/versions.json index c65c569..12775a5 100644 --- a/versions.json +++ b/versions.json @@ -38,4 +38,4 @@ "1.14.1": "1.5.12", "1.15.0": "1.5.12", "1.16.0": "1.5.12" -} \ No newline at end of file +} diff --git a/vite.config.js b/vite.config.js index d54f034..ebda31e 100644 --- a/vite.config.js +++ b/vite.config.js @@ -7,52 +7,52 @@ const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); export default defineConfig((env) => ({ - build: { - outDir: "dist", - sourcemap: env.mode === "production" ? false : "inline", - target: "es2018", - minify: true, - lib: { - entry: "src/main.ts", - formats: ["cjs"], - fileName: () => "main.js", - }, - rolldownOptions: { - input: { - main: path.resolve(__dirname, "src/main.ts"), - styles: path.resolve(__dirname, "src/styles.css"), - }, - external: [ - "obsidian", - "electron", - "@codemirror/autocomplete", - "@codemirror/collab", - "@codemirror/commands", - "@codemirror/language", - "@codemirror/lint", - "@codemirror/search", - "@codemirror/state", - "@codemirror/view", - "@lezer/common", - "@lezer/highlight", - "@lezer/lr", - ...builtinModules, - ], - output: { - exports: "auto", - }, - }, - // - cssCodeSplit: true, - // Inline all assets (.ttf ...etc) - assetsInlineLimit: Infinity, - }, + build: { + outDir: "dist", + sourcemap: env.mode === "production" ? false : "inline", + target: "es2018", + minify: true, + lib: { + entry: "src/main.ts", + formats: ["cjs"], + fileName: () => "main.js", + }, + rolldownOptions: { + input: { + main: path.resolve(__dirname, "src/main.ts"), + styles: path.resolve(__dirname, "src/styles.css"), + }, + external: [ + "obsidian", + "electron", + "@codemirror/autocomplete", + "@codemirror/collab", + "@codemirror/commands", + "@codemirror/language", + "@codemirror/lint", + "@codemirror/search", + "@codemirror/state", + "@codemirror/view", + "@lezer/common", + "@lezer/highlight", + "@lezer/lr", + ...builtinModules, + ], + output: { + exports: "auto", + }, + }, + // + cssCodeSplit: true, + // Inline all assets (.ttf ...etc) + assetsInlineLimit: Infinity, + }, - resolve: { - alias: { - "@": path.resolve(__dirname, "src"), - }, - }, + resolve: { + alias: { + "@": path.resolve(__dirname, "src"), + }, + }, - test: {}, + test: {}, }));