AT protocol bookmarking platforms in obsidian

Compare changes

Choose any two refs to compare.

+2 -11995
-10
.editorconfig
··· 1 - # top-most EditorConfig file 2 - root = true 3 - 4 - [*] 5 - charset = utf-8 6 - end_of_line = lf 7 - insert_final_newline = true 8 - indent_style = tab 9 - indent_size = 4 10 - tab_width = 4
-28
.github/workflows/lint.yml
··· 1 - name: Node.js build 2 - 3 - on: 4 - push: 5 - branches: ["**"] 6 - pull_request: 7 - branches: ["**"] 8 - 9 - jobs: 10 - build: 11 - runs-on: ubuntu-latest 12 - 13 - strategy: 14 - matrix: 15 - node-version: [20.x, 22.x] 16 - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 17 - 18 - steps: 19 - - uses: actions/checkout@v4 20 - - name: Use Node.js ${{ matrix.node-version }} 21 - uses: actions/setup-node@v4 22 - with: 23 - node-version: ${{ matrix.node-version }} 24 - cache: "npm" 25 - - run: npm ci 26 - - run: npm run build --if-present 27 - - run: npm run lint 28 -
-37
.github/workflows/release.yml
··· 1 - name: Release Obsidian Plugin 2 - 3 - on: 4 - push: 5 - tags: 6 - - "*" 7 - 8 - permissions: 9 - contents: write 10 - 11 - jobs: 12 - build: 13 - runs-on: ubuntu-latest 14 - 15 - steps: 16 - - uses: actions/checkout@v4 17 - 18 - - name: Use Node.js 19 - uses: actions/setup-node@v4 20 - with: 21 - node-version: "18.x" 22 - 23 - - name: Install dependencies 24 - run: npm install 25 - 26 - - name: Build plugin 27 - run: npm run build 28 - 29 - - name: Create release 30 - env: 31 - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 32 - run: | 33 - tag="${{ github.ref_name }}" 34 - gh release create "$tag" \ 35 - --title="$tag" \ 36 - --draft \ 37 - main.js manifest.json styles.css
-22
.gitignore
··· 1 - # vscode 2 - .vscode 3 - 4 - # Intellij 5 - *.iml 6 - .idea 7 - 8 - # npm 9 - node_modules 10 - 11 - # Don't include the compiled main.js file in the repo. 12 - # They should be uploaded to GitHub releases instead. 13 - main.js 14 - 15 - # Exclude sourcemaps 16 - *.map 17 - 18 - # obsidian 19 - data.json 20 - 21 - # Exclude macOS Finder (System Explorer) View States 22 - .DS_Store
-1
.npmrc
··· 1 - tag-version-prefix=""
-251
AGENTS.md
··· 1 - # Obsidian community plugin 2 - 3 - ## Project overview 4 - 5 - - Target: Obsidian Community Plugin (TypeScript โ†’ bundled JavaScript). 6 - - Entry point: `main.ts` compiled to `main.js` and loaded by Obsidian. 7 - - Required release artifacts: `main.js`, `manifest.json`, and optional `styles.css`. 8 - 9 - ## Environment & tooling 10 - 11 - - Node.js: use current LTS (Node 18+ recommended). 12 - - **Package manager: npm** (required for this sample - `package.json` defines npm scripts and dependencies). 13 - - **Bundler: esbuild** (required for this sample - `esbuild.config.mjs` and build scripts depend on it). Alternative bundlers like Rollup or webpack are acceptable for other projects if they bundle all external dependencies into `main.js`. 14 - - Types: `obsidian` type definitions. 15 - 16 - **Note**: This sample project has specific technical dependencies on npm and esbuild. If you're creating a plugin from scratch, you can choose different tools, but you'll need to replace the build configuration accordingly. 17 - 18 - ### Install 19 - 20 - ```bash 21 - npm install 22 - ``` 23 - 24 - ### Dev (watch) 25 - 26 - ```bash 27 - npm run dev 28 - ``` 29 - 30 - ### Production build 31 - 32 - ```bash 33 - npm run build 34 - ``` 35 - 36 - ## Linting 37 - 38 - - To use eslint install eslint from terminal: `npm install -g eslint` 39 - - To use eslint to analyze this project use this command: `eslint main.ts` 40 - - eslint will then create a report with suggestions for code improvement by file and line number. 41 - - If your source code is in a folder, such as `src`, you can use eslint with this command to analyze all files in that folder: `eslint ./src/` 42 - 43 - ## File & folder conventions 44 - 45 - - **Organize code into multiple files**: Split functionality across separate modules rather than putting everything in `main.ts`. 46 - - Source lives in `src/`. Keep `main.ts` small and focused on plugin lifecycle (loading, unloading, registering commands). 47 - - **Example file structure**: 48 - ``` 49 - src/ 50 - main.ts # Plugin entry point, lifecycle management 51 - settings.ts # Settings interface and defaults 52 - commands/ # Command implementations 53 - command1.ts 54 - command2.ts 55 - ui/ # UI components, modals, views 56 - modal.ts 57 - view.ts 58 - utils/ # Utility functions, helpers 59 - helpers.ts 60 - constants.ts 61 - types.ts # TypeScript interfaces and types 62 - ``` 63 - - **Do not commit build artifacts**: Never commit `node_modules/`, `main.js`, or other generated files to version control. 64 - - Keep the plugin small. Avoid large dependencies. Prefer browser-compatible packages. 65 - - Generated output should be placed at the plugin root or `dist/` depending on your build setup. Release artifacts must end up at the top level of the plugin folder in the vault (`main.js`, `manifest.json`, `styles.css`). 66 - 67 - ## Manifest rules (`manifest.json`) 68 - 69 - - Must include (non-exhaustive): 70 - - `id` (plugin ID; for local dev it should match the folder name) 71 - - `name` 72 - - `version` (Semantic Versioning `x.y.z`) 73 - - `minAppVersion` 74 - - `description` 75 - - `isDesktopOnly` (boolean) 76 - - Optional: `author`, `authorUrl`, `fundingUrl` (string or map) 77 - - Never change `id` after release. Treat it as stable API. 78 - - Keep `minAppVersion` accurate when using newer APIs. 79 - - Canonical requirements are coded here: https://github.com/obsidianmd/obsidian-releases/blob/master/.github/workflows/validate-plugin-entry.yml 80 - 81 - ## Testing 82 - 83 - - Manual install for testing: copy `main.js`, `manifest.json`, `styles.css` (if any) to: 84 - ``` 85 - <Vault>/.obsidian/plugins/<plugin-id>/ 86 - ``` 87 - - Reload Obsidian and enable the plugin in **Settings โ†’ Community plugins**. 88 - 89 - ## Commands & settings 90 - 91 - - Any user-facing commands should be added via `this.addCommand(...)`. 92 - - If the plugin has configuration, provide a settings tab and sensible defaults. 93 - - Persist settings using `this.loadData()` / `this.saveData()`. 94 - - Use stable command IDs; avoid renaming once released. 95 - 96 - ## Versioning & releases 97 - 98 - - Bump `version` in `manifest.json` (SemVer) and update `versions.json` to map plugin version โ†’ minimum app version. 99 - - Create a GitHub release whose tag exactly matches `manifest.json`'s `version`. Do not use a leading `v`. 100 - - Attach `manifest.json`, `main.js`, and `styles.css` (if present) to the release as individual assets. 101 - - After the initial release, follow the process to add/update your plugin in the community catalog as required. 102 - 103 - ## Security, privacy, and compliance 104 - 105 - Follow Obsidian's **Developer Policies** and **Plugin Guidelines**. In particular: 106 - 107 - - Default to local/offline operation. Only make network requests when essential to the feature. 108 - - No hidden telemetry. If you collect optional analytics or call third-party services, require explicit opt-in and document clearly in `README.md` and in settings. 109 - - Never execute remote code, fetch and eval scripts, or auto-update plugin code outside of normal releases. 110 - - Minimize scope: read/write only what's necessary inside the vault. Do not access files outside the vault. 111 - - Clearly disclose any external services used, data sent, and risks. 112 - - Respect user privacy. Do not collect vault contents, filenames, or personal information unless absolutely necessary and explicitly consented. 113 - - Avoid deceptive patterns, ads, or spammy notifications. 114 - - Register and clean up all DOM, app, and interval listeners using the provided `register*` helpers so the plugin unloads safely. 115 - 116 - ## UX & copy guidelines (for UI text, commands, settings) 117 - 118 - - Prefer sentence case for headings, buttons, and titles. 119 - - Use clear, action-oriented imperatives in step-by-step copy. 120 - - Use **bold** to indicate literal UI labels. Prefer "select" for interactions. 121 - - Use arrow notation for navigation: **Settings โ†’ Community plugins**. 122 - - Keep in-app strings short, consistent, and free of jargon. 123 - 124 - ## Performance 125 - 126 - - Keep startup light. Defer heavy work until needed. 127 - - Avoid long-running tasks during `onload`; use lazy initialization. 128 - - Batch disk access and avoid excessive vault scans. 129 - - Debounce/throttle expensive operations in response to file system events. 130 - 131 - ## Coding conventions 132 - 133 - - TypeScript with `"strict": true` preferred. 134 - - **Keep `main.ts` minimal**: Focus only on plugin lifecycle (onload, onunload, addCommand calls). Delegate all feature logic to separate modules. 135 - - **Split large files**: If any file exceeds ~200-300 lines, consider breaking it into smaller, focused modules. 136 - - **Use clear module boundaries**: Each file should have a single, well-defined responsibility. 137 - - Bundle everything into `main.js` (no unbundled runtime deps). 138 - - Avoid Node/Electron APIs if you want mobile compatibility; set `isDesktopOnly` accordingly. 139 - - Prefer `async/await` over promise chains; handle errors gracefully. 140 - 141 - ## Mobile 142 - 143 - - Where feasible, test on iOS and Android. 144 - - Don't assume desktop-only behavior unless `isDesktopOnly` is `true`. 145 - - Avoid large in-memory structures; be mindful of memory and storage constraints. 146 - 147 - ## Agent do/don't 148 - 149 - **Do** 150 - - Add commands with stable IDs (don't rename once released). 151 - - Provide defaults and validation in settings. 152 - - Write idempotent code paths so reload/unload doesn't leak listeners or intervals. 153 - - Use `this.register*` helpers for everything that needs cleanup. 154 - 155 - **Don't** 156 - - Introduce network calls without an obvious user-facing reason and documentation. 157 - - Ship features that require cloud services without clear disclosure and explicit opt-in. 158 - - Store or transmit vault contents unless essential and consented. 159 - 160 - ## Common tasks 161 - 162 - ### Organize code across multiple files 163 - 164 - **main.ts** (minimal, lifecycle only): 165 - ```ts 166 - import { Plugin } from "obsidian"; 167 - import { MySettings, DEFAULT_SETTINGS } from "./settings"; 168 - import { registerCommands } from "./commands"; 169 - 170 - export default class MyPlugin extends Plugin { 171 - settings: MySettings; 172 - 173 - async onload() { 174 - this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); 175 - registerCommands(this); 176 - } 177 - } 178 - ``` 179 - 180 - **settings.ts**: 181 - ```ts 182 - export interface MySettings { 183 - enabled: boolean; 184 - apiKey: string; 185 - } 186 - 187 - export const DEFAULT_SETTINGS: MySettings = { 188 - enabled: true, 189 - apiKey: "", 190 - }; 191 - ``` 192 - 193 - **commands/index.ts**: 194 - ```ts 195 - import { Plugin } from "obsidian"; 196 - import { doSomething } from "./my-command"; 197 - 198 - export function registerCommands(plugin: Plugin) { 199 - plugin.addCommand({ 200 - id: "do-something", 201 - name: "Do something", 202 - callback: () => doSomething(plugin), 203 - }); 204 - } 205 - ``` 206 - 207 - ### Add a command 208 - 209 - ```ts 210 - this.addCommand({ 211 - id: "your-command-id", 212 - name: "Do the thing", 213 - callback: () => this.doTheThing(), 214 - }); 215 - ``` 216 - 217 - ### Persist settings 218 - 219 - ```ts 220 - interface MySettings { enabled: boolean } 221 - const DEFAULT_SETTINGS: MySettings = { enabled: true }; 222 - 223 - async onload() { 224 - this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); 225 - await this.saveData(this.settings); 226 - } 227 - ``` 228 - 229 - ### Register listeners safely 230 - 231 - ```ts 232 - this.registerEvent(this.app.workspace.on("file-open", f => { /* ... */ })); 233 - this.registerDomEvent(window, "resize", () => { /* ... */ }); 234 - this.registerInterval(window.setInterval(() => { /* ... */ }, 1000)); 235 - ``` 236 - 237 - ## Troubleshooting 238 - 239 - - Plugin doesn't load after build: ensure `main.js` and `manifest.json` are at the top level of the plugin folder under `<Vault>/.obsidian/plugins/<plugin-id>/`. 240 - - Build issues: if `main.js` is missing, run `npm run build` or `npm run dev` to compile your TypeScript source code. 241 - - Commands not appearing: verify `addCommand` runs after `onload` and IDs are unique. 242 - - Settings not persisting: ensure `loadData`/`saveData` are awaited and you re-render the UI after changes. 243 - - Mobile-only issues: confirm you're not using desktop-only APIs; check `isDesktopOnly` and adjust. 244 - 245 - ## References 246 - 247 - - Obsidian sample plugin: https://github.com/obsidianmd/obsidian-sample-plugin 248 - - API documentation: https://docs.obsidian.md 249 - - Developer policies: https://docs.obsidian.md/Developer+policies 250 - - Plugin guidelines: https://docs.obsidian.md/Plugins/Releasing/Plugin+guidelines 251 - - Style guide: https://help.obsidian.md/style-guide
-21
LICENSE
··· 1 - MIT License 2 - 3 - Copyright (c) 2025 treethought 4 - 5 - Permission is hereby granted, free of charge, to any person obtaining a copy 6 - of this software and associated documentation files (the "Software"), to deal 7 - in the Software without restriction, including without limitation the rights 8 - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 - copies of the Software, and to permit persons to whom the Software is 10 - furnished to do so, subject to the following conditions: 11 - 12 - The above copyright notice and this permission notice shall be included in all 13 - copies or substantial portions of the Software. 14 - 15 - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 - SOFTWARE.
+2 -40
README.md
··· 1 - # ATmark 1 + # ATmark (archived) 2 2 3 3 Obsidian plugin for AT Protocol bookmarking platforms. 4 4 5 - 6 - ## Supported platforms 7 - 8 - - **Semble** (`network.cosmik.*`) - Collections and cards 9 - - **Bookmarks** (`community.lexicon.bookmarks.*`) - Community bookmarks lexicon with tag filtering (supports kipclip tags) 10 - - **margin.at** (`at.margin.*`) - Bookmarks with collections and tags support 11 - 12 - ![](/preview.png) 13 - ![](/preview-sidebar.png) 14 - 15 - ## Installation 16 - 17 - Install via [BRAT](https://github.com/TfTHacker/obsidian42-brat): 18 - 19 - 1. Install the BRAT plugin from Community Plugins 20 - 2. Open BRAT settings 21 - 3. Click "Add Beta plugin" 22 - 4. Enter the GitHub URL: `https://github.com/treethought/obsidian-atmark` 23 - 5. Enable the plugin in Community Plugins 24 - 25 - ## Getting Started 26 - 27 - ### Authentication 28 - 29 - 1. Open Settings > ATmark 30 - 2. Enter your AT Protocol handle or DID 31 - 3. Create an app password in your AT Protocol client (Bluesky: Settings > Privacy and security > App passwords) 32 - 4. Enter the app password in the plugin settings 33 - 5. Save settings 34 - 35 - The plugin will automatically connect using your credentials. 36 - 37 - ### Opening the View 38 - 39 - Open the command palette (Ctrl/Cmd + P) and search for "ATmark: Open view". The view will show your bookmarks from all supported platforms. 40 - 41 - ## Network Use 42 - 43 - This plugin connects to AT Protocol services to fetch and manage your bookmarks. 5 + This project has been renamed and moved to [obsidian-atmosphere](https://tangled.org/treethought.xyz/obsidian-atmosphere)
-49
esbuild.config.mjs
··· 1 - import esbuild from "esbuild"; 2 - import process from "process"; 3 - import { builtinModules } from 'node:module'; 4 - 5 - const banner = 6 - `/* 7 - THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 8 - if you want to view the source, please visit the github repository of this plugin 9 - */ 10 - `; 11 - 12 - const prod = (process.argv[2] === "production"); 13 - 14 - const context = await esbuild.context({ 15 - banner: { 16 - js: banner, 17 - }, 18 - entryPoints: ["src/main.ts"], 19 - bundle: true, 20 - external: [ 21 - "obsidian", 22 - "electron", 23 - "@codemirror/autocomplete", 24 - "@codemirror/collab", 25 - "@codemirror/commands", 26 - "@codemirror/language", 27 - "@codemirror/lint", 28 - "@codemirror/search", 29 - "@codemirror/state", 30 - "@codemirror/view", 31 - "@lezer/common", 32 - "@lezer/highlight", 33 - "@lezer/lr", 34 - ...builtinModules], 35 - format: "cjs", 36 - target: "es2018", 37 - logLevel: "info", 38 - sourcemap: prod ? false : "inline", 39 - treeShaking: true, 40 - outfile: "main.js", 41 - minify: prod, 42 - }); 43 - 44 - if (prod) { 45 - await context.rebuild(); 46 - process.exit(0); 47 - } else { 48 - await context.watch(); 49 - }
-36
eslint.config.mts
··· 1 - import tseslint from 'typescript-eslint'; 2 - import obsidianmd from "eslint-plugin-obsidianmd"; 3 - import globals from "globals"; 4 - import { globalIgnores } from "eslint/config"; 5 - 6 - export default tseslint.config( 7 - { 8 - languageOptions: { 9 - globals: { 10 - ...globals.browser, 11 - }, 12 - parserOptions: { 13 - projectService: { 14 - allowDefaultProject: [ 15 - 'eslint.config.js', 16 - 'manifest.json' 17 - ] 18 - }, 19 - tsconfigRootDir: import.meta.dirname, 20 - extraFileExtensions: ['.json'] 21 - }, 22 - }, 23 - }, 24 - ...obsidianmd.configs.recommended, 25 - globalIgnores([ 26 - "node_modules", 27 - "dist", 28 - "esbuild.config.mjs", 29 - "eslint.config.js", 30 - "version-bump.mjs", 31 - "versions.json", 32 - "main.js", 33 - "lex.config.js", 34 - "src/lexicons", 35 - ]), 36 - );
-25
lex.config.js
··· 1 - // file: lex.config.js 2 - import { defineLexiconConfig } from '@atcute/lex-cli'; 3 - 4 - export default defineLexiconConfig({ 5 - files: ['lexicons/**/*.json'], 6 - outdir: 'src/lexicons/', 7 - pull: { 8 - outdir: 'lexicons/', 9 - clean: true, 10 - sources: [ 11 - { 12 - type: 'git', 13 - remote: 'https://github.com/cosmik-network/semble.git', 14 - ref: 'main', 15 - pattern: ['src/modules/atproto/infrastructure/lexicons/**/*.json'], 16 - }, 17 - { 18 - type: 'git', 19 - remote: 'https://tangled.org/margin.at/margin.git', 20 - ref: 'main', 21 - pattern: ['lexicons/**/*.json'], 22 - }, 23 - ], 24 - }, 25 - });
-8
lexicons/README.md
··· 1 - # lexicon sources 2 - 3 - this directory contains lexicon documents pulled from the following sources: 4 - 5 - - https://github.com/cosmik-network/semble.git (ref: main) 6 - - commit: 6a806594dd7411268299e3467ed09fd173c8f478 7 - - https://tangled.org/margin.at/margin.git (ref: main) 8 - - commit: 87cca4daaa23df443e7d53aaf58af59f06e4c4c9
-273
lexicons/at/margin/annotation.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "at.margin.annotation", 4 - "revision": 2, 5 - "description": "W3C Web Annotation Data Model compliant annotation record for ATProto", 6 - "defs": { 7 - "main": { 8 - "type": "record", 9 - "description": "A W3C-compliant web annotation stored on the AT Protocol", 10 - "key": "tid", 11 - "record": { 12 - "type": "object", 13 - "required": ["target", "createdAt"], 14 - "properties": { 15 - "motivation": { 16 - "type": "string", 17 - "description": "W3C motivation for the annotation", 18 - "knownValues": [ 19 - "commenting", 20 - "highlighting", 21 - "bookmarking", 22 - "tagging", 23 - "describing", 24 - "linking", 25 - "replying", 26 - "editing", 27 - "questioning", 28 - "assessing" 29 - ] 30 - }, 31 - "body": { 32 - "type": "ref", 33 - "ref": "#body", 34 - "description": "The annotation content (text or reference)" 35 - }, 36 - "target": { 37 - "type": "ref", 38 - "ref": "#target", 39 - "description": "The resource being annotated with optional selector" 40 - }, 41 - "tags": { 42 - "type": "array", 43 - "description": "Tags for categorization", 44 - "items": { 45 - "type": "string", 46 - "maxLength": 64, 47 - "maxGraphemes": 32 48 - }, 49 - "maxLength": 10 50 - }, 51 - "createdAt": { 52 - "type": "string", 53 - "format": "datetime" 54 - } 55 - } 56 - } 57 - }, 58 - "body": { 59 - "type": "object", 60 - "description": "Annotation body - the content of the annotation", 61 - "properties": { 62 - "value": { 63 - "type": "string", 64 - "maxLength": 10000, 65 - "maxGraphemes": 3000, 66 - "description": "Text content of the annotation" 67 - }, 68 - "format": { 69 - "type": "string", 70 - "description": "MIME type of the body content", 71 - "default": "text/plain" 72 - }, 73 - "language": { 74 - "type": "string", 75 - "description": "BCP47 language tag" 76 - }, 77 - "uri": { 78 - "type": "string", 79 - "format": "uri", 80 - "description": "Reference to external body content" 81 - } 82 - } 83 - }, 84 - "target": { 85 - "type": "object", 86 - "description": "W3C SpecificResource - the target with optional selector", 87 - "required": ["source"], 88 - "properties": { 89 - "source": { 90 - "type": "string", 91 - "format": "uri", 92 - "description": "The URL being annotated" 93 - }, 94 - "sourceHash": { 95 - "type": "string", 96 - "description": "SHA256 hash of normalized URL for indexing" 97 - }, 98 - "title": { 99 - "type": "string", 100 - "maxLength": 500, 101 - "description": "Page title at time of annotation" 102 - }, 103 - "selector": { 104 - "type": "union", 105 - "description": "Selector to identify the specific segment", 106 - "refs": [ 107 - "#textQuoteSelector", 108 - "#textPositionSelector", 109 - "#cssSelector", 110 - "#xpathSelector", 111 - "#fragmentSelector", 112 - "#rangeSelector" 113 - ] 114 - }, 115 - "state": { 116 - "type": "ref", 117 - "ref": "#timeState", 118 - "description": "State of the resource at annotation time" 119 - } 120 - } 121 - }, 122 - "textQuoteSelector": { 123 - "type": "object", 124 - "description": "W3C TextQuoteSelector - select text by quoting it with context", 125 - "required": ["exact"], 126 - "properties": { 127 - "type": { 128 - "type": "string", 129 - "const": "TextQuoteSelector" 130 - }, 131 - "exact": { 132 - "type": "string", 133 - "maxLength": 5000, 134 - "maxGraphemes": 1500, 135 - "description": "The exact text to match" 136 - }, 137 - "prefix": { 138 - "type": "string", 139 - "maxLength": 500, 140 - "maxGraphemes": 150, 141 - "description": "Text immediately before the selection" 142 - }, 143 - "suffix": { 144 - "type": "string", 145 - "maxLength": 500, 146 - "maxGraphemes": 150, 147 - "description": "Text immediately after the selection" 148 - } 149 - } 150 - }, 151 - "textPositionSelector": { 152 - "type": "object", 153 - "description": "W3C TextPositionSelector - select by character offsets", 154 - "required": ["start", "end"], 155 - "properties": { 156 - "type": { 157 - "type": "string", 158 - "const": "TextPositionSelector" 159 - }, 160 - "start": { 161 - "type": "integer", 162 - "minimum": 0, 163 - "description": "Starting character position (0-indexed, inclusive)" 164 - }, 165 - "end": { 166 - "type": "integer", 167 - "minimum": 0, 168 - "description": "Ending character position (exclusive)" 169 - } 170 - } 171 - }, 172 - "cssSelector": { 173 - "type": "object", 174 - "description": "W3C CssSelector - select DOM elements by CSS selector", 175 - "required": ["value"], 176 - "properties": { 177 - "type": { 178 - "type": "string", 179 - "const": "CssSelector" 180 - }, 181 - "value": { 182 - "type": "string", 183 - "maxLength": 2000, 184 - "description": "CSS selector string" 185 - } 186 - } 187 - }, 188 - "xpathSelector": { 189 - "type": "object", 190 - "description": "W3C XPathSelector - select by XPath expression", 191 - "required": ["value"], 192 - "properties": { 193 - "type": { 194 - "type": "string", 195 - "const": "XPathSelector" 196 - }, 197 - "value": { 198 - "type": "string", 199 - "maxLength": 2000, 200 - "description": "XPath expression" 201 - } 202 - } 203 - }, 204 - "fragmentSelector": { 205 - "type": "object", 206 - "description": "W3C FragmentSelector - select by URI fragment", 207 - "required": ["value"], 208 - "properties": { 209 - "type": { 210 - "type": "string", 211 - "const": "FragmentSelector" 212 - }, 213 - "value": { 214 - "type": "string", 215 - "maxLength": 1000, 216 - "description": "Fragment identifier value" 217 - }, 218 - "conformsTo": { 219 - "type": "string", 220 - "format": "uri", 221 - "description": "Specification the fragment conforms to" 222 - } 223 - } 224 - }, 225 - "rangeSelector": { 226 - "type": "object", 227 - "description": "W3C RangeSelector - select range between two selectors", 228 - "required": ["startSelector", "endSelector"], 229 - "properties": { 230 - "type": { 231 - "type": "string", 232 - "const": "RangeSelector" 233 - }, 234 - "startSelector": { 235 - "type": "union", 236 - "description": "Selector for range start", 237 - "refs": [ 238 - "#textQuoteSelector", 239 - "#textPositionSelector", 240 - "#cssSelector", 241 - "#xpathSelector" 242 - ] 243 - }, 244 - "endSelector": { 245 - "type": "union", 246 - "description": "Selector for range end", 247 - "refs": [ 248 - "#textQuoteSelector", 249 - "#textPositionSelector", 250 - "#cssSelector", 251 - "#xpathSelector" 252 - ] 253 - } 254 - } 255 - }, 256 - "timeState": { 257 - "type": "object", 258 - "description": "W3C TimeState - record when content was captured", 259 - "properties": { 260 - "sourceDate": { 261 - "type": "string", 262 - "format": "datetime", 263 - "description": "When the source was accessed" 264 - }, 265 - "cached": { 266 - "type": "string", 267 - "format": "uri", 268 - "description": "URL to cached/archived version" 269 - } 270 - } 271 - } 272 - } 273 - }
-30
lexicons/at/margin/authFull.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "at.margin.authFull", 4 - "defs": { 5 - "main": { 6 - "type": "permission-set", 7 - "title": "Margin", 8 - "title:langs": {}, 9 - "detail": "Full access to Margin features including annotations, highlights, bookmarks, and collections.", 10 - "detail:langs": {}, 11 - "permissions": [ 12 - { 13 - "type": "permission", 14 - "resource": "repo", 15 - "action": ["create", "update", "delete"], 16 - "collection": [ 17 - "at.margin.annotation", 18 - "at.margin.highlight", 19 - "at.margin.bookmark", 20 - "at.margin.reply", 21 - "at.margin.like", 22 - "at.margin.collection", 23 - "at.margin.collectionItem", 24 - "at.margin.profile" 25 - ] 26 - } 27 - ] 28 - } 29 - } 30 - }
-52
lexicons/at/margin/bookmark.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "at.margin.bookmark", 4 - "description": "A bookmark record - save URL for later", 5 - "defs": { 6 - "main": { 7 - "type": "record", 8 - "description": "A bookmarked URL (motivation: bookmarking)", 9 - "key": "tid", 10 - "record": { 11 - "type": "object", 12 - "required": ["source", "createdAt"], 13 - "properties": { 14 - "source": { 15 - "type": "string", 16 - "format": "uri", 17 - "description": "The bookmarked URL" 18 - }, 19 - "sourceHash": { 20 - "type": "string", 21 - "description": "SHA256 hash of normalized URL for indexing" 22 - }, 23 - "title": { 24 - "type": "string", 25 - "maxLength": 500, 26 - "description": "Page title" 27 - }, 28 - "description": { 29 - "type": "string", 30 - "maxLength": 1000, 31 - "maxGraphemes": 300, 32 - "description": "Optional description/note" 33 - }, 34 - "tags": { 35 - "type": "array", 36 - "description": "Tags for categorization", 37 - "items": { 38 - "type": "string", 39 - "maxLength": 64, 40 - "maxGraphemes": 32 41 - }, 42 - "maxLength": 10 43 - }, 44 - "createdAt": { 45 - "type": "string", 46 - "format": "datetime" 47 - } 48 - } 49 - } 50 - } 51 - } 52 - }
-40
lexicons/at/margin/collection.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "at.margin.collection", 4 - "description": "A collection of annotations (like a folder or notebook)", 5 - "defs": { 6 - "main": { 7 - "type": "record", 8 - "description": "A named collection for organizing annotations", 9 - "key": "tid", 10 - "record": { 11 - "type": "object", 12 - "required": ["name", "createdAt"], 13 - "properties": { 14 - "name": { 15 - "type": "string", 16 - "maxLength": 100, 17 - "maxGraphemes": 50, 18 - "description": "Collection name" 19 - }, 20 - "description": { 21 - "type": "string", 22 - "maxLength": 500, 23 - "maxGraphemes": 150, 24 - "description": "Collection description" 25 - }, 26 - "icon": { 27 - "type": "string", 28 - "maxLength": 100, 29 - "maxGraphemes": 100, 30 - "description": "Emoji icon or icon identifier for the collection" 31 - }, 32 - "createdAt": { 33 - "type": "string", 34 - "format": "datetime" 35 - } 36 - } 37 - } 38 - } 39 - } 40 - }
-37
lexicons/at/margin/collectionItem.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "at.margin.collectionItem", 4 - "description": "An item in a collection (links annotation to collection)", 5 - "defs": { 6 - "main": { 7 - "type": "record", 8 - "description": "Associates an annotation with a collection", 9 - "key": "tid", 10 - "record": { 11 - "type": "object", 12 - "required": ["collection", "annotation", "createdAt"], 13 - "properties": { 14 - "collection": { 15 - "type": "string", 16 - "format": "at-uri", 17 - "description": "AT URI of the collection" 18 - }, 19 - "annotation": { 20 - "type": "string", 21 - "format": "at-uri", 22 - "description": "AT URI of the annotation, highlight, or bookmark" 23 - }, 24 - "position": { 25 - "type": "integer", 26 - "minimum": 0, 27 - "description": "Sort order within the collection" 28 - }, 29 - "createdAt": { 30 - "type": "string", 31 - "format": "datetime" 32 - } 33 - } 34 - } 35 - } 36 - } 37 - }
-42
lexicons/at/margin/highlight.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "at.margin.highlight", 4 - "description": "A lightweight highlight record - annotation without body text", 5 - "defs": { 6 - "main": { 7 - "type": "record", 8 - "description": "A highlight on a web page (motivation: highlighting)", 9 - "key": "tid", 10 - "record": { 11 - "type": "object", 12 - "required": ["target", "createdAt"], 13 - "properties": { 14 - "target": { 15 - "type": "ref", 16 - "ref": "at.margin.annotation#target", 17 - "description": "The resource and segment being highlighted" 18 - }, 19 - "color": { 20 - "type": "string", 21 - "description": "Highlight color (hex or named)", 22 - "maxLength": 20 23 - }, 24 - "tags": { 25 - "type": "array", 26 - "description": "Tags for categorization", 27 - "items": { 28 - "type": "string", 29 - "maxLength": 64, 30 - "maxGraphemes": 32 31 - }, 32 - "maxLength": 10 33 - }, 34 - "createdAt": { 35 - "type": "string", 36 - "format": "datetime" 37 - } 38 - } 39 - } 40 - } 41 - } 42 - }
-40
lexicons/at/margin/like.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "at.margin.like", 4 - "defs": { 5 - "main": { 6 - "type": "record", 7 - "description": "A like on an annotation or reply", 8 - "key": "tid", 9 - "record": { 10 - "type": "object", 11 - "required": ["subject", "createdAt"], 12 - "properties": { 13 - "subject": { 14 - "type": "ref", 15 - "ref": "#subjectRef", 16 - "description": "Reference to the annotation or reply being liked" 17 - }, 18 - "createdAt": { 19 - "type": "string", 20 - "format": "datetime" 21 - } 22 - } 23 - } 24 - }, 25 - "subjectRef": { 26 - "type": "object", 27 - "required": ["uri", "cid"], 28 - "properties": { 29 - "uri": { 30 - "type": "string", 31 - "format": "at-uri" 32 - }, 33 - "cid": { 34 - "type": "string", 35 - "format": "cid" 36 - } 37 - } 38 - } 39 - } 40 - }
-40
lexicons/at/margin/profile.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "at.margin.profile", 4 - "defs": { 5 - "main": { 6 - "type": "record", 7 - "description": "A profile for a user on the Margin network.", 8 - "key": "literal:self", 9 - "record": { 10 - "type": "object", 11 - "required": ["createdAt"], 12 - "properties": { 13 - "bio": { 14 - "type": "string", 15 - "maxLength": 5000, 16 - "description": "User biography or description." 17 - }, 18 - "website": { 19 - "type": "string", 20 - "maxLength": 1000, 21 - "description": "User website URL." 22 - }, 23 - "links": { 24 - "type": "array", 25 - "description": "List of other relevant links (e.g. GitHub, Bluesky, etc).", 26 - "items": { 27 - "type": "string", 28 - "maxLength": 1000 29 - }, 30 - "maxLength": 20 31 - }, 32 - "createdAt": { 33 - "type": "string", 34 - "format": "datetime" 35 - } 36 - } 37 - } 38 - } 39 - } 40 - }
-59
lexicons/at/margin/reply.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "at.margin.reply", 4 - "revision": 2, 5 - "description": "A reply to an annotation or another reply", 6 - "defs": { 7 - "main": { 8 - "type": "record", 9 - "description": "A reply to an annotation (motivation: replying)", 10 - "key": "tid", 11 - "record": { 12 - "type": "object", 13 - "required": ["parent", "root", "text", "createdAt"], 14 - "properties": { 15 - "parent": { 16 - "type": "ref", 17 - "ref": "#replyRef", 18 - "description": "Reference to the parent annotation or reply" 19 - }, 20 - "root": { 21 - "type": "ref", 22 - "ref": "#replyRef", 23 - "description": "Reference to the root annotation of the thread" 24 - }, 25 - "text": { 26 - "type": "string", 27 - "maxLength": 10000, 28 - "maxGraphemes": 3000, 29 - "description": "Reply text content" 30 - }, 31 - "format": { 32 - "type": "string", 33 - "description": "MIME type of the text content", 34 - "default": "text/plain" 35 - }, 36 - "createdAt": { 37 - "type": "string", 38 - "format": "datetime" 39 - } 40 - } 41 - } 42 - }, 43 - "replyRef": { 44 - "type": "object", 45 - "description": "Strong reference to an annotation or reply", 46 - "required": ["uri", "cid"], 47 - "properties": { 48 - "uri": { 49 - "type": "string", 50 - "format": "at-uri" 51 - }, 52 - "cid": { 53 - "type": "string", 54 - "format": "cid" 55 - } 56 - } 57 - } 58 - } 59 - }
-21
lexicons/com/atproto/repo/strongRef.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "com.atproto.repo.strongRef", 4 - "description": "A URI with a content-hash fingerprint.", 5 - "defs": { 6 - "main": { 7 - "type": "object", 8 - "required": ["uri", "cid"], 9 - "properties": { 10 - "cid": { 11 - "type": "string", 12 - "format": "cid" 13 - }, 14 - "uri": { 15 - "type": "string", 16 - "format": "at-uri" 17 - } 18 - } 19 - } 20 - } 21 - }
-131
lexicons/network/cosmik/card.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "network.cosmik.card", 4 - "description": "A single record type for all cards.", 5 - "defs": { 6 - "main": { 7 - "type": "record", 8 - "description": "A record representing a card with content.", 9 - "key": "tid", 10 - "record": { 11 - "type": "object", 12 - "required": ["type", "content"], 13 - "properties": { 14 - "type": { 15 - "type": "string", 16 - "description": "The type of card", 17 - "knownValues": ["URL", "NOTE"] 18 - }, 19 - "content": { 20 - "type": "union", 21 - "description": "The specific content of the card, determined by the card type.", 22 - "refs": ["#urlContent", "#noteContent"] 23 - }, 24 - "url": { 25 - "type": "string", 26 - "format": "uri", 27 - "description": "Optional URL associated with the card. Required for URL cards, optional for NOTE cards." 28 - }, 29 - "parentCard": { 30 - "type": "ref", 31 - "description": "Optional strong reference to a parent card (for NOTE cards).", 32 - "ref": "com.atproto.repo.strongRef" 33 - }, 34 - "createdAt": { 35 - "type": "string", 36 - "format": "datetime", 37 - "description": "Timestamp when this card was created (usually set by PDS)." 38 - }, 39 - "originalCard": { 40 - "type": "ref", 41 - "description": "Optional strong reference to the original card (for NOTE cards).", 42 - "ref": "com.atproto.repo.strongRef" 43 - }, 44 - "provenance": { 45 - "type": "ref", 46 - "description": "Optional provenance information for this card.", 47 - "ref": "network.cosmik.defs#provenance" 48 - } 49 - } 50 - } 51 - }, 52 - "urlContent": { 53 - "type": "object", 54 - "description": "Content structure for a URL card.", 55 - "required": ["url"], 56 - "properties": { 57 - "url": { 58 - "type": "string", 59 - "format": "uri", 60 - "description": "The URL being saved" 61 - }, 62 - "metadata": { 63 - "type": "ref", 64 - "ref": "#urlMetadata", 65 - "description": "Optional metadata about the URL" 66 - } 67 - } 68 - }, 69 - "noteContent": { 70 - "type": "object", 71 - "description": "Content structure for a note card.", 72 - "required": ["text"], 73 - "properties": { 74 - "text": { 75 - "type": "string", 76 - "description": "The note text content", 77 - "maxLength": 10000 78 - } 79 - } 80 - }, 81 - "urlMetadata": { 82 - "type": "object", 83 - "description": "Metadata about a URL.", 84 - "properties": { 85 - "title": { 86 - "type": "string", 87 - "description": "Title of the page" 88 - }, 89 - "description": { 90 - "type": "string", 91 - "description": "Description of the page" 92 - }, 93 - "author": { 94 - "type": "string", 95 - "description": "Author of the content" 96 - }, 97 - "publishedDate": { 98 - "type": "string", 99 - "format": "datetime", 100 - "description": "When the content was published" 101 - }, 102 - "siteName": { 103 - "type": "string", 104 - "description": "Name of the site" 105 - }, 106 - "imageUrl": { 107 - "type": "string", 108 - "format": "uri", 109 - "description": "URL of a representative image" 110 - }, 111 - "type": { 112 - "type": "string", 113 - "description": "Type of content (e.g., 'video', 'article')" 114 - }, 115 - "retrievedAt": { 116 - "type": "string", 117 - "format": "datetime", 118 - "description": "When the metadata was retrieved" 119 - }, 120 - "doi": { 121 - "type": "string", 122 - "description": "Digital Object Identifier (DOI) for academic content" 123 - }, 124 - "isbn": { 125 - "type": "string", 126 - "description": "International Standard Book Number (ISBN) for books" 127 - } 128 - } 129 - } 130 - } 131 - }
-51
lexicons/network/cosmik/collection.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "network.cosmik.collection", 4 - "description": "A single record type for collections of cards.", 5 - "defs": { 6 - "main": { 7 - "type": "record", 8 - "description": "A record representing a collection of cards.", 9 - "key": "tid", 10 - "record": { 11 - "type": "object", 12 - "required": ["name", "accessType"], 13 - "properties": { 14 - "name": { 15 - "type": "string", 16 - "description": "Name of the collection", 17 - "maxLength": 100 18 - }, 19 - "description": { 20 - "type": "string", 21 - "description": "Description of the collection", 22 - "maxLength": 500 23 - }, 24 - "accessType": { 25 - "type": "string", 26 - "description": "Access control for the collection", 27 - "knownValues": ["OPEN", "CLOSED"] 28 - }, 29 - "collaborators": { 30 - "type": "array", 31 - "description": "List of collaborator DIDs who can add cards to closed collections", 32 - "items": { 33 - "type": "string", 34 - "description": "DID of a collaborator" 35 - } 36 - }, 37 - "createdAt": { 38 - "type": "string", 39 - "format": "datetime", 40 - "description": "Timestamp when this collection was created (usually set by PDS)." 41 - }, 42 - "updatedAt": { 43 - "type": "string", 44 - "format": "datetime", 45 - "description": "Timestamp when this collection was last updated." 46 - } 47 - } 48 - } 49 - } 50 - } 51 - }
-52
lexicons/network/cosmik/collectionLink.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "network.cosmik.collectionLink", 4 - "description": "A record that links a card to a collection.", 5 - "defs": { 6 - "main": { 7 - "type": "record", 8 - "description": "A record representing the relationship between a card and a collection.", 9 - "key": "tid", 10 - "record": { 11 - "type": "object", 12 - "required": ["collection", "card", "addedBy", "addedAt"], 13 - "properties": { 14 - "collection": { 15 - "type": "ref", 16 - "description": "Strong reference to the collection record.", 17 - "ref": "com.atproto.repo.strongRef" 18 - }, 19 - "card": { 20 - "type": "ref", 21 - "description": "Strong reference to the card record in the users library.", 22 - "ref": "com.atproto.repo.strongRef" 23 - }, 24 - "originalCard": { 25 - "type": "ref", 26 - "description": "Strong reference to the original card record (may be in another library).", 27 - "ref": "com.atproto.repo.strongRef" 28 - }, 29 - "addedBy": { 30 - "type": "string", 31 - "description": "DID of the user who added the card to the collection" 32 - }, 33 - "addedAt": { 34 - "type": "string", 35 - "format": "datetime", 36 - "description": "Timestamp when the card was added to the collection." 37 - }, 38 - "createdAt": { 39 - "type": "string", 40 - "format": "datetime", 41 - "description": "Timestamp when this link record was created (usually set by PDS)." 42 - }, 43 - "provenance": { 44 - "type": "ref", 45 - "description": "Optional provenance information for this link.", 46 - "ref": "network.cosmik.defs#provenance" 47 - } 48 - } 49 - } 50 - } 51 - } 52 - }
-18
lexicons/network/cosmik/defs.json
··· 1 - { 2 - "lexicon": 1, 3 - "id": "network.cosmik.defs", 4 - "description": "Common definitions for annotation types and references", 5 - "defs": { 6 - "provenance": { 7 - "type": "object", 8 - "description": "Represents the provenance or source of a record.", 9 - "properties": { 10 - "via": { 11 - "type": "ref", 12 - "description": "Strong reference to the card that led to this record.", 13 - "ref": "com.atproto.repo.strongRef" 14 - } 15 - } 16 - } 17 - } 18 - }
-10
manifest.json
··· 1 - { 2 - "id": "atmark", 3 - "name": "ATmark", 4 - "version": "0.1.8", 5 - "minAppVersion": "0.15.0", 6 - "description": "View and manage AT Protocol bookmarks.", 7 - "author": "treethought", 8 - "authorUrl": "https://github.com/treethought", 9 - "isDesktopOnly": false 10 - }
-5515
package-lock.json
··· 1 - { 2 - "name": "obsidian-sample-plugin", 3 - "version": "1.0.0", 4 - "lockfileVersion": 3, 5 - "requires": true, 6 - "packages": { 7 - "": { 8 - "name": "obsidian-sample-plugin", 9 - "version": "1.0.0", 10 - "license": "0-BSD", 11 - "dependencies": { 12 - "@atcute/atproto": "^3.1.10", 13 - "@atcute/bluesky": "^3.2.15", 14 - "@atcute/client": "^4.2.1", 15 - "@atcute/lex-cli": "^2.5.2", 16 - "@atcute/oauth-browser-client": "^2.0.3", 17 - "obsidian": "latest" 18 - }, 19 - "devDependencies": { 20 - "@eslint/js": "9.30.1", 21 - "@types/node": "^16.11.6", 22 - "esbuild": "0.25.5", 23 - "eslint-plugin-obsidianmd": "0.1.9", 24 - "globals": "14.0.0", 25 - "jiti": "2.6.1", 26 - "tslib": "2.4.0", 27 - "typescript": "^5.8.3", 28 - "typescript-eslint": "8.35.1" 29 - } 30 - }, 31 - "node_modules/@atcute/atproto": { 32 - "version": "3.1.10", 33 - "resolved": "https://registry.npmjs.org/@atcute/atproto/-/atproto-3.1.10.tgz", 34 - "integrity": "sha512-+GKZpOc0PJcdWMQEkTfg/rSNDAAHxmAUGBl60g2az15etqJn5WaUPNGFE2sB7hKpwi5Ue2h/L0OacINcE/JDDQ==", 35 - "license": "0BSD", 36 - "dependencies": { 37 - "@atcute/lexicons": "^1.2.6" 38 - } 39 - }, 40 - "node_modules/@atcute/bluesky": { 41 - "version": "3.2.15", 42 - "resolved": "https://registry.npmjs.org/@atcute/bluesky/-/bluesky-3.2.15.tgz", 43 - "integrity": "sha512-H4RW3WffjfdKvOZ9issEUQnuSR4KfuAwwJnYu0fclA9VDa99JTJ+pa8tTl9lFeBV9DINtWJAx7rdIbICoVCstQ==", 44 - "license": "0BSD", 45 - "dependencies": { 46 - "@atcute/atproto": "^3.1.10", 47 - "@atcute/lexicons": "^1.2.6" 48 - } 49 - }, 50 - "node_modules/@atcute/car": { 51 - "version": "5.1.0", 52 - "resolved": "https://registry.npmjs.org/@atcute/car/-/car-5.1.0.tgz", 53 - "integrity": "sha512-W9axHVrwIkZJaeN/VQ1LyyU3b95wHBjQnrREouxygvmvWd1lmjFvF8Si8b0AG0VkWJ6h7h6qhOeUATynBzBFIg==", 54 - "license": "0BSD", 55 - "dependencies": { 56 - "@atcute/cbor": "^2.3.0", 57 - "@atcute/cid": "^2.4.0", 58 - "@atcute/uint8array": "^1.0.6", 59 - "@atcute/varint": "^1.0.3" 60 - } 61 - }, 62 - "node_modules/@atcute/cbor": { 63 - "version": "2.3.0", 64 - "resolved": "https://registry.npmjs.org/@atcute/cbor/-/cbor-2.3.0.tgz", 65 - "integrity": "sha512-7G2AndkfYzIXMBOBqUPUWP6oIJJm77KY5nYzS4Mr5NNxnmnrBrXEQqp+seCE3X5TV8FUSWQK5YRTU87uPjafMQ==", 66 - "license": "0BSD", 67 - "dependencies": { 68 - "@atcute/cid": "^2.4.0", 69 - "@atcute/multibase": "^1.1.6", 70 - "@atcute/uint8array": "^1.0.6" 71 - } 72 - }, 73 - "node_modules/@atcute/cid": { 74 - "version": "2.4.0", 75 - "resolved": "https://registry.npmjs.org/@atcute/cid/-/cid-2.4.0.tgz", 76 - "integrity": "sha512-6+5u9MpUrgSRQ94z7vaIX4BYk8fYr2KXUBS+rrr2NhlPy8xam8nbTlmd3hvBbtpSwShbhRAE4tA5Ab7eYUp2Yw==", 77 - "license": "0BSD", 78 - "dependencies": { 79 - "@atcute/multibase": "^1.1.6", 80 - "@atcute/uint8array": "^1.0.6" 81 - } 82 - }, 83 - "node_modules/@atcute/client": { 84 - "version": "4.2.1", 85 - "resolved": "https://registry.npmjs.org/@atcute/client/-/client-4.2.1.tgz", 86 - "integrity": "sha512-ZBFM2pW075JtgGFu5g7HHZBecrClhlcNH8GVP9Zz1aViWR+cjjBsTpeE63rJs+FCOHFYlirUyo5L8SGZ4kMINw==", 87 - "license": "0BSD", 88 - "dependencies": { 89 - "@atcute/identity": "^1.1.3", 90 - "@atcute/lexicons": "^1.2.6" 91 - } 92 - }, 93 - "node_modules/@atcute/crypto": { 94 - "version": "2.3.0", 95 - "resolved": "https://registry.npmjs.org/@atcute/crypto/-/crypto-2.3.0.tgz", 96 - "integrity": "sha512-w5pkJKCjbNMQu+F4JRHbR3ROQyhi1wbn+GSC6WDQamcYHkZmEZk1/eoI354bIQOOfkEM6aFLv718iskrkon4GQ==", 97 - "license": "0BSD", 98 - "dependencies": { 99 - "@atcute/multibase": "^1.1.6", 100 - "@atcute/uint8array": "^1.0.6", 101 - "@noble/secp256k1": "^3.0.0" 102 - } 103 - }, 104 - "node_modules/@atcute/identity": { 105 - "version": "1.1.3", 106 - "resolved": "https://registry.npmjs.org/@atcute/identity/-/identity-1.1.3.tgz", 107 - "integrity": "sha512-oIqPoI8TwWeQxvcLmFEZLdN2XdWcaLVtlm8pNk0E72As9HNzzD9pwKPrLr3rmTLRIoULPPFmq9iFNsTeCIU9ng==", 108 - "license": "0BSD", 109 - "peer": true, 110 - "dependencies": { 111 - "@atcute/lexicons": "^1.2.4", 112 - "@badrap/valita": "^0.4.6" 113 - } 114 - }, 115 - "node_modules/@atcute/identity-resolver": { 116 - "version": "1.2.2", 117 - "resolved": "https://registry.npmjs.org/@atcute/identity-resolver/-/identity-resolver-1.2.2.tgz", 118 - "integrity": "sha512-eUh/UH4bFvuXS0X7epYCeJC/kj4rbBXfSRumLEH4smMVwNOgTo7cL/0Srty+P/qVPoZEyXdfEbS0PHJyzoXmHw==", 119 - "license": "0BSD", 120 - "peer": true, 121 - "dependencies": { 122 - "@atcute/lexicons": "^1.2.6", 123 - "@atcute/util-fetch": "^1.0.5", 124 - "@badrap/valita": "^0.4.6" 125 - }, 126 - "peerDependencies": { 127 - "@atcute/identity": "^1.0.0" 128 - } 129 - }, 130 - "node_modules/@atcute/lex-cli": { 131 - "version": "2.5.2", 132 - "resolved": "https://registry.npmjs.org/@atcute/lex-cli/-/lex-cli-2.5.2.tgz", 133 - "integrity": "sha512-u3xeu7uF7mAgAErYpXvdUaH2bxpthGWLg+vUf20cejWZHBH/dAzL4ixLRjw/39WwoVmmCQDTde79WTPoBjuhpg==", 134 - "license": "0BSD", 135 - "dependencies": { 136 - "@atcute/identity": "^1.1.3", 137 - "@atcute/identity-resolver": "^1.2.0", 138 - "@atcute/lexicon-doc": "^2.0.5", 139 - "@atcute/lexicon-resolver": "^0.1.5", 140 - "@atcute/lexicons": "^1.2.5", 141 - "@badrap/valita": "^0.4.6", 142 - "@optique/core": "^0.6.3", 143 - "@optique/run": "^0.6.3", 144 - "picocolors": "^1.1.1", 145 - "prettier": "^3.7.1" 146 - }, 147 - "bin": { 148 - "lex-cli": "cli.mjs" 149 - } 150 - }, 151 - "node_modules/@atcute/lexicon-doc": { 152 - "version": "2.0.6", 153 - "resolved": "https://registry.npmjs.org/@atcute/lexicon-doc/-/lexicon-doc-2.0.6.tgz", 154 - "integrity": "sha512-iDYJkuom+tIw3zIvU1ggCEVFfReXKfOUtIhpY2kEg2kQeSfMB75F+8k1QOpeAQBetyWYmjsHqBuSUX9oQS6L1Q==", 155 - "license": "0BSD", 156 - "dependencies": { 157 - "@atcute/identity": "^1.1.3", 158 - "@atcute/lexicons": "^1.2.6", 159 - "@atcute/uint8array": "^1.0.6", 160 - "@atcute/util-text": "^0.0.1", 161 - "@badrap/valita": "^0.4.6" 162 - } 163 - }, 164 - "node_modules/@atcute/lexicon-resolver": { 165 - "version": "0.1.6", 166 - "resolved": "https://registry.npmjs.org/@atcute/lexicon-resolver/-/lexicon-resolver-0.1.6.tgz", 167 - "integrity": "sha512-wJC/ChmpP7k+ywpOd07CMvioXjIGaFpF3bDwXLi/086LYjSWHOvtW6pyC+mqP5wLhjyH2hn4wmi77Buew1l1aw==", 168 - "license": "0BSD", 169 - "dependencies": { 170 - "@atcute/crypto": "^2.3.0", 171 - "@atcute/lexicon-doc": "^2.0.6", 172 - "@atcute/lexicons": "^1.2.6", 173 - "@atcute/repo": "^0.1.1", 174 - "@atcute/util-fetch": "^1.0.5", 175 - "@badrap/valita": "^0.4.6" 176 - }, 177 - "peerDependencies": { 178 - "@atcute/identity": "^1.1.0", 179 - "@atcute/identity-resolver": "^1.1.3" 180 - } 181 - }, 182 - "node_modules/@atcute/lexicons": { 183 - "version": "1.2.6", 184 - "resolved": "https://registry.npmjs.org/@atcute/lexicons/-/lexicons-1.2.6.tgz", 185 - "integrity": "sha512-s76UQd8D+XmHIzrjD9CJ9SOOeeLPHc+sMmcj7UFakAW/dDFXc579fcRdRfuUKvXBL5v1Gs2VgDdlh/IvvQZAwA==", 186 - "license": "0BSD", 187 - "dependencies": { 188 - "@atcute/uint8array": "^1.0.6", 189 - "@atcute/util-text": "^0.0.1", 190 - "@standard-schema/spec": "^1.1.0", 191 - "esm-env": "^1.2.2" 192 - } 193 - }, 194 - "node_modules/@atcute/mst": { 195 - "version": "0.1.2", 196 - "resolved": "https://registry.npmjs.org/@atcute/mst/-/mst-0.1.2.tgz", 197 - "integrity": "sha512-Oz5CZTjqauEJLT9B+zkoy/mjl216DrjCxJFrguRV3N+1NkIbCfAcSRf3UDSNjfzDzBkJvC1WjA/3oQkm83duPg==", 198 - "license": "0BSD", 199 - "dependencies": { 200 - "@atcute/cbor": "^2.3.0", 201 - "@atcute/cid": "^2.4.0", 202 - "@atcute/uint8array": "^1.0.6" 203 - } 204 - }, 205 - "node_modules/@atcute/multibase": { 206 - "version": "1.1.6", 207 - "resolved": "https://registry.npmjs.org/@atcute/multibase/-/multibase-1.1.6.tgz", 208 - "integrity": "sha512-HBxuCgYLKPPxETV0Rot4VP9e24vKl8JdzGCZOVsDaOXJgbRZoRIF67Lp0H/OgnJeH/Xpva8Z5ReoTNJE5dn3kg==", 209 - "license": "0BSD", 210 - "dependencies": { 211 - "@atcute/uint8array": "^1.0.5" 212 - } 213 - }, 214 - "node_modules/@atcute/oauth-browser-client": { 215 - "version": "2.0.3", 216 - "resolved": "https://registry.npmjs.org/@atcute/oauth-browser-client/-/oauth-browser-client-2.0.3.tgz", 217 - "integrity": "sha512-rzUjwhjE4LRRKdQnCFQag/zXRZMEAB1hhBoLfnoQuHwWbmDUCL7fzwC3jRhDPp3om8XaYNDj8a/iqRip0wRqoQ==", 218 - "license": "0BSD", 219 - "dependencies": { 220 - "@atcute/client": "^4.1.1", 221 - "@atcute/identity-resolver": "^1.2.0", 222 - "@atcute/lexicons": "^1.2.5", 223 - "@atcute/multibase": "^1.1.6", 224 - "@atcute/uint8array": "^1.0.6", 225 - "nanoid": "^5.1.6" 226 - } 227 - }, 228 - "node_modules/@atcute/repo": { 229 - "version": "0.1.1", 230 - "resolved": "https://registry.npmjs.org/@atcute/repo/-/repo-0.1.1.tgz", 231 - "integrity": "sha512-P5aWjt3bvcquUkUmGPslF0naAfLGRHse5Qdz9/RJYrFuoH0iiEMyRnW6M+3ksOe20GPsMnbq71WbzzFkRFPBtg==", 232 - "license": "0BSD", 233 - "dependencies": { 234 - "@atcute/car": "^5.0.0", 235 - "@atcute/cbor": "^2.2.8", 236 - "@atcute/cid": "^2.2.6", 237 - "@atcute/crypto": "^2.3.0", 238 - "@atcute/lexicons": "^1.2.5", 239 - "@atcute/mst": "^0.1.0", 240 - "@atcute/uint8array": "^1.0.6" 241 - } 242 - }, 243 - "node_modules/@atcute/uint8array": { 244 - "version": "1.0.6", 245 - "resolved": "https://registry.npmjs.org/@atcute/uint8array/-/uint8array-1.0.6.tgz", 246 - "integrity": "sha512-ucfRBQc7BFT8n9eCyGOzDHEMKF/nZwhS2pPao4Xtab1ML3HdFYcX2DM1tadCzas85QTGxHe5urnUAAcNKGRi9A==", 247 - "license": "0BSD" 248 - }, 249 - "node_modules/@atcute/util-fetch": { 250 - "version": "1.0.5", 251 - "resolved": "https://registry.npmjs.org/@atcute/util-fetch/-/util-fetch-1.0.5.tgz", 252 - "integrity": "sha512-qjHj01BGxjSjIFdPiAjSARnodJIIyKxnCMMEcXMESo9TAyND6XZQqrie5fia+LlYWVXdpsTds8uFQwc9jdKTig==", 253 - "license": "0BSD", 254 - "dependencies": { 255 - "@badrap/valita": "^0.4.6" 256 - } 257 - }, 258 - "node_modules/@atcute/util-text": { 259 - "version": "0.0.1", 260 - "resolved": "https://registry.npmjs.org/@atcute/util-text/-/util-text-0.0.1.tgz", 261 - "integrity": "sha512-t1KZqvn0AYy+h2KcJyHnKF9aEqfRfMUmyY8j1ELtAEIgqN9CxINAjxnoRCJIFUlvWzb+oY3uElQL/Vyk3yss0g==", 262 - "license": "0BSD", 263 - "dependencies": { 264 - "unicode-segmenter": "^0.14.4" 265 - } 266 - }, 267 - "node_modules/@atcute/varint": { 268 - "version": "1.0.3", 269 - "resolved": "https://registry.npmjs.org/@atcute/varint/-/varint-1.0.3.tgz", 270 - "integrity": "sha512-fdvMPyBB+McDT+Ai5e9RwEbwYV4yjZ60S2Dn5PTjGqUyxvoCH1z42viuheDZRUDkmfQehXJTZ5az7dSozVNtog==", 271 - "license": "0BSD" 272 - }, 273 - "node_modules/@badrap/valita": { 274 - "version": "0.4.6", 275 - "resolved": "https://registry.npmjs.org/@badrap/valita/-/valita-0.4.6.tgz", 276 - "integrity": "sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==", 277 - "license": "MIT", 278 - "engines": { 279 - "node": ">= 18" 280 - } 281 - }, 282 - "node_modules/@codemirror/state": { 283 - "version": "6.5.0", 284 - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.0.tgz", 285 - "integrity": "sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==", 286 - "license": "MIT", 287 - "peer": true, 288 - "dependencies": { 289 - "@marijn/find-cluster-break": "^1.0.0" 290 - } 291 - }, 292 - "node_modules/@codemirror/view": { 293 - "version": "6.38.6", 294 - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.6.tgz", 295 - "integrity": "sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==", 296 - "license": "MIT", 297 - "peer": true, 298 - "dependencies": { 299 - "@codemirror/state": "^6.5.0", 300 - "crelt": "^1.0.6", 301 - "style-mod": "^4.1.0", 302 - "w3c-keyname": "^2.2.4" 303 - } 304 - }, 305 - "node_modules/@esbuild/aix-ppc64": { 306 - "version": "0.25.5", 307 - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", 308 - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", 309 - "cpu": [ 310 - "ppc64" 311 - ], 312 - "dev": true, 313 - "license": "MIT", 314 - "optional": true, 315 - "os": [ 316 - "aix" 317 - ], 318 - "engines": { 319 - "node": ">=18" 320 - } 321 - }, 322 - "node_modules/@esbuild/android-arm": { 323 - "version": "0.25.5", 324 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", 325 - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", 326 - "cpu": [ 327 - "arm" 328 - ], 329 - "dev": true, 330 - "license": "MIT", 331 - "optional": true, 332 - "os": [ 333 - "android" 334 - ], 335 - "engines": { 336 - "node": ">=18" 337 - } 338 - }, 339 - "node_modules/@esbuild/android-arm64": { 340 - "version": "0.25.5", 341 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", 342 - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", 343 - "cpu": [ 344 - "arm64" 345 - ], 346 - "dev": true, 347 - "license": "MIT", 348 - "optional": true, 349 - "os": [ 350 - "android" 351 - ], 352 - "engines": { 353 - "node": ">=18" 354 - } 355 - }, 356 - "node_modules/@esbuild/android-x64": { 357 - "version": "0.25.5", 358 - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", 359 - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", 360 - "cpu": [ 361 - "x64" 362 - ], 363 - "dev": true, 364 - "license": "MIT", 365 - "optional": true, 366 - "os": [ 367 - "android" 368 - ], 369 - "engines": { 370 - "node": ">=18" 371 - } 372 - }, 373 - "node_modules/@esbuild/darwin-arm64": { 374 - "version": "0.25.5", 375 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", 376 - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", 377 - "cpu": [ 378 - "arm64" 379 - ], 380 - "dev": true, 381 - "license": "MIT", 382 - "optional": true, 383 - "os": [ 384 - "darwin" 385 - ], 386 - "engines": { 387 - "node": ">=18" 388 - } 389 - }, 390 - "node_modules/@esbuild/darwin-x64": { 391 - "version": "0.25.5", 392 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", 393 - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", 394 - "cpu": [ 395 - "x64" 396 - ], 397 - "dev": true, 398 - "license": "MIT", 399 - "optional": true, 400 - "os": [ 401 - "darwin" 402 - ], 403 - "engines": { 404 - "node": ">=18" 405 - } 406 - }, 407 - "node_modules/@esbuild/freebsd-arm64": { 408 - "version": "0.25.5", 409 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", 410 - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", 411 - "cpu": [ 412 - "arm64" 413 - ], 414 - "dev": true, 415 - "license": "MIT", 416 - "optional": true, 417 - "os": [ 418 - "freebsd" 419 - ], 420 - "engines": { 421 - "node": ">=18" 422 - } 423 - }, 424 - "node_modules/@esbuild/freebsd-x64": { 425 - "version": "0.25.5", 426 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", 427 - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", 428 - "cpu": [ 429 - "x64" 430 - ], 431 - "dev": true, 432 - "license": "MIT", 433 - "optional": true, 434 - "os": [ 435 - "freebsd" 436 - ], 437 - "engines": { 438 - "node": ">=18" 439 - } 440 - }, 441 - "node_modules/@esbuild/linux-arm": { 442 - "version": "0.25.5", 443 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", 444 - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", 445 - "cpu": [ 446 - "arm" 447 - ], 448 - "dev": true, 449 - "license": "MIT", 450 - "optional": true, 451 - "os": [ 452 - "linux" 453 - ], 454 - "engines": { 455 - "node": ">=18" 456 - } 457 - }, 458 - "node_modules/@esbuild/linux-arm64": { 459 - "version": "0.25.5", 460 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", 461 - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", 462 - "cpu": [ 463 - "arm64" 464 - ], 465 - "dev": true, 466 - "license": "MIT", 467 - "optional": true, 468 - "os": [ 469 - "linux" 470 - ], 471 - "engines": { 472 - "node": ">=18" 473 - } 474 - }, 475 - "node_modules/@esbuild/linux-ia32": { 476 - "version": "0.25.5", 477 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", 478 - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", 479 - "cpu": [ 480 - "ia32" 481 - ], 482 - "dev": true, 483 - "license": "MIT", 484 - "optional": true, 485 - "os": [ 486 - "linux" 487 - ], 488 - "engines": { 489 - "node": ">=18" 490 - } 491 - }, 492 - "node_modules/@esbuild/linux-loong64": { 493 - "version": "0.25.5", 494 - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", 495 - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", 496 - "cpu": [ 497 - "loong64" 498 - ], 499 - "dev": true, 500 - "license": "MIT", 501 - "optional": true, 502 - "os": [ 503 - "linux" 504 - ], 505 - "engines": { 506 - "node": ">=18" 507 - } 508 - }, 509 - "node_modules/@esbuild/linux-mips64el": { 510 - "version": "0.25.5", 511 - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", 512 - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", 513 - "cpu": [ 514 - "mips64el" 515 - ], 516 - "dev": true, 517 - "license": "MIT", 518 - "optional": true, 519 - "os": [ 520 - "linux" 521 - ], 522 - "engines": { 523 - "node": ">=18" 524 - } 525 - }, 526 - "node_modules/@esbuild/linux-ppc64": { 527 - "version": "0.25.5", 528 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", 529 - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", 530 - "cpu": [ 531 - "ppc64" 532 - ], 533 - "dev": true, 534 - "license": "MIT", 535 - "optional": true, 536 - "os": [ 537 - "linux" 538 - ], 539 - "engines": { 540 - "node": ">=18" 541 - } 542 - }, 543 - "node_modules/@esbuild/linux-riscv64": { 544 - "version": "0.25.5", 545 - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", 546 - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", 547 - "cpu": [ 548 - "riscv64" 549 - ], 550 - "dev": true, 551 - "license": "MIT", 552 - "optional": true, 553 - "os": [ 554 - "linux" 555 - ], 556 - "engines": { 557 - "node": ">=18" 558 - } 559 - }, 560 - "node_modules/@esbuild/linux-s390x": { 561 - "version": "0.25.5", 562 - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", 563 - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", 564 - "cpu": [ 565 - "s390x" 566 - ], 567 - "dev": true, 568 - "license": "MIT", 569 - "optional": true, 570 - "os": [ 571 - "linux" 572 - ], 573 - "engines": { 574 - "node": ">=18" 575 - } 576 - }, 577 - "node_modules/@esbuild/linux-x64": { 578 - "version": "0.25.5", 579 - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", 580 - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", 581 - "cpu": [ 582 - "x64" 583 - ], 584 - "dev": true, 585 - "license": "MIT", 586 - "optional": true, 587 - "os": [ 588 - "linux" 589 - ], 590 - "engines": { 591 - "node": ">=18" 592 - } 593 - }, 594 - "node_modules/@esbuild/netbsd-arm64": { 595 - "version": "0.25.5", 596 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", 597 - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", 598 - "cpu": [ 599 - "arm64" 600 - ], 601 - "dev": true, 602 - "license": "MIT", 603 - "optional": true, 604 - "os": [ 605 - "netbsd" 606 - ], 607 - "engines": { 608 - "node": ">=18" 609 - } 610 - }, 611 - "node_modules/@esbuild/netbsd-x64": { 612 - "version": "0.25.5", 613 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", 614 - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", 615 - "cpu": [ 616 - "x64" 617 - ], 618 - "dev": true, 619 - "license": "MIT", 620 - "optional": true, 621 - "os": [ 622 - "netbsd" 623 - ], 624 - "engines": { 625 - "node": ">=18" 626 - } 627 - }, 628 - "node_modules/@esbuild/openbsd-arm64": { 629 - "version": "0.25.5", 630 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", 631 - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", 632 - "cpu": [ 633 - "arm64" 634 - ], 635 - "dev": true, 636 - "license": "MIT", 637 - "optional": true, 638 - "os": [ 639 - "openbsd" 640 - ], 641 - "engines": { 642 - "node": ">=18" 643 - } 644 - }, 645 - "node_modules/@esbuild/openbsd-x64": { 646 - "version": "0.25.5", 647 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", 648 - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", 649 - "cpu": [ 650 - "x64" 651 - ], 652 - "dev": true, 653 - "license": "MIT", 654 - "optional": true, 655 - "os": [ 656 - "openbsd" 657 - ], 658 - "engines": { 659 - "node": ">=18" 660 - } 661 - }, 662 - "node_modules/@esbuild/sunos-x64": { 663 - "version": "0.25.5", 664 - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", 665 - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", 666 - "cpu": [ 667 - "x64" 668 - ], 669 - "dev": true, 670 - "license": "MIT", 671 - "optional": true, 672 - "os": [ 673 - "sunos" 674 - ], 675 - "engines": { 676 - "node": ">=18" 677 - } 678 - }, 679 - "node_modules/@esbuild/win32-arm64": { 680 - "version": "0.25.5", 681 - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", 682 - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", 683 - "cpu": [ 684 - "arm64" 685 - ], 686 - "dev": true, 687 - "license": "MIT", 688 - "optional": true, 689 - "os": [ 690 - "win32" 691 - ], 692 - "engines": { 693 - "node": ">=18" 694 - } 695 - }, 696 - "node_modules/@esbuild/win32-ia32": { 697 - "version": "0.25.5", 698 - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", 699 - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", 700 - "cpu": [ 701 - "ia32" 702 - ], 703 - "dev": true, 704 - "license": "MIT", 705 - "optional": true, 706 - "os": [ 707 - "win32" 708 - ], 709 - "engines": { 710 - "node": ">=18" 711 - } 712 - }, 713 - "node_modules/@esbuild/win32-x64": { 714 - "version": "0.25.5", 715 - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", 716 - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", 717 - "cpu": [ 718 - "x64" 719 - ], 720 - "dev": true, 721 - "license": "MIT", 722 - "optional": true, 723 - "os": [ 724 - "win32" 725 - ], 726 - "engines": { 727 - "node": ">=18" 728 - } 729 - }, 730 - "node_modules/@eslint-community/eslint-utils": { 731 - "version": "4.9.0", 732 - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", 733 - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", 734 - "dev": true, 735 - "license": "MIT", 736 - "dependencies": { 737 - "eslint-visitor-keys": "^3.4.3" 738 - }, 739 - "engines": { 740 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 741 - }, 742 - "funding": { 743 - "url": "https://opencollective.com/eslint" 744 - }, 745 - "peerDependencies": { 746 - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 747 - } 748 - }, 749 - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 750 - "version": "3.4.3", 751 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 752 - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 753 - "dev": true, 754 - "license": "Apache-2.0", 755 - "engines": { 756 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 757 - }, 758 - "funding": { 759 - "url": "https://opencollective.com/eslint" 760 - } 761 - }, 762 - "node_modules/@eslint-community/regexpp": { 763 - "version": "4.12.2", 764 - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", 765 - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", 766 - "dev": true, 767 - "license": "MIT", 768 - "engines": { 769 - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 770 - } 771 - }, 772 - "node_modules/@eslint/config-array": { 773 - "version": "0.21.1", 774 - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", 775 - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", 776 - "dev": true, 777 - "license": "Apache-2.0", 778 - "dependencies": { 779 - "@eslint/object-schema": "^2.1.7", 780 - "debug": "^4.3.1", 781 - "minimatch": "^3.1.2" 782 - }, 783 - "engines": { 784 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 785 - } 786 - }, 787 - "node_modules/@eslint/config-helpers": { 788 - "version": "0.4.2", 789 - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", 790 - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", 791 - "dev": true, 792 - "license": "Apache-2.0", 793 - "dependencies": { 794 - "@eslint/core": "^0.17.0" 795 - }, 796 - "engines": { 797 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 798 - } 799 - }, 800 - "node_modules/@eslint/core": { 801 - "version": "0.17.0", 802 - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", 803 - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", 804 - "dev": true, 805 - "license": "Apache-2.0", 806 - "dependencies": { 807 - "@types/json-schema": "^7.0.15" 808 - }, 809 - "engines": { 810 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 811 - } 812 - }, 813 - "node_modules/@eslint/eslintrc": { 814 - "version": "3.3.1", 815 - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", 816 - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", 817 - "dev": true, 818 - "license": "MIT", 819 - "dependencies": { 820 - "ajv": "^6.12.4", 821 - "debug": "^4.3.2", 822 - "espree": "^10.0.1", 823 - "globals": "^14.0.0", 824 - "ignore": "^5.2.0", 825 - "import-fresh": "^3.2.1", 826 - "js-yaml": "^4.1.0", 827 - "minimatch": "^3.1.2", 828 - "strip-json-comments": "^3.1.1" 829 - }, 830 - "engines": { 831 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 832 - }, 833 - "funding": { 834 - "url": "https://opencollective.com/eslint" 835 - } 836 - }, 837 - "node_modules/@eslint/js": { 838 - "version": "9.30.1", 839 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz", 840 - "integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==", 841 - "dev": true, 842 - "license": "MIT", 843 - "peer": true, 844 - "engines": { 845 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 846 - }, 847 - "funding": { 848 - "url": "https://eslint.org/donate" 849 - } 850 - }, 851 - "node_modules/@eslint/json": { 852 - "version": "0.14.0", 853 - "resolved": "https://registry.npmjs.org/@eslint/json/-/json-0.14.0.tgz", 854 - "integrity": "sha512-rvR/EZtvUG3p9uqrSmcDJPYSH7atmWr0RnFWN6m917MAPx82+zQgPUmDu0whPFG6XTyM0vB/hR6c1Q63OaYtCQ==", 855 - "dev": true, 856 - "license": "Apache-2.0", 857 - "peer": true, 858 - "dependencies": { 859 - "@eslint/core": "^0.17.0", 860 - "@eslint/plugin-kit": "^0.4.1", 861 - "@humanwhocodes/momoa": "^3.3.10", 862 - "natural-compare": "^1.4.0" 863 - }, 864 - "engines": { 865 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 866 - } 867 - }, 868 - "node_modules/@eslint/object-schema": { 869 - "version": "2.1.7", 870 - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", 871 - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", 872 - "dev": true, 873 - "license": "Apache-2.0", 874 - "engines": { 875 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 876 - } 877 - }, 878 - "node_modules/@eslint/plugin-kit": { 879 - "version": "0.4.1", 880 - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", 881 - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", 882 - "dev": true, 883 - "license": "Apache-2.0", 884 - "dependencies": { 885 - "@eslint/core": "^0.17.0", 886 - "levn": "^0.4.1" 887 - }, 888 - "engines": { 889 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 890 - } 891 - }, 892 - "node_modules/@humanfs/core": { 893 - "version": "0.19.1", 894 - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 895 - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 896 - "dev": true, 897 - "license": "Apache-2.0", 898 - "engines": { 899 - "node": ">=18.18.0" 900 - } 901 - }, 902 - "node_modules/@humanfs/node": { 903 - "version": "0.16.7", 904 - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", 905 - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", 906 - "dev": true, 907 - "license": "Apache-2.0", 908 - "dependencies": { 909 - "@humanfs/core": "^0.19.1", 910 - "@humanwhocodes/retry": "^0.4.0" 911 - }, 912 - "engines": { 913 - "node": ">=18.18.0" 914 - } 915 - }, 916 - "node_modules/@humanwhocodes/module-importer": { 917 - "version": "1.0.1", 918 - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 919 - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 920 - "dev": true, 921 - "license": "Apache-2.0", 922 - "engines": { 923 - "node": ">=12.22" 924 - }, 925 - "funding": { 926 - "type": "github", 927 - "url": "https://github.com/sponsors/nzakas" 928 - } 929 - }, 930 - "node_modules/@humanwhocodes/momoa": { 931 - "version": "3.3.10", 932 - "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-3.3.10.tgz", 933 - "integrity": "sha512-KWiFQpSAqEIyrTXko3hFNLeQvSK8zXlJQzhhxsyVn58WFRYXST99b3Nqnu+ttOtjds2Pl2grUHGpe2NzhPynuQ==", 934 - "dev": true, 935 - "license": "Apache-2.0", 936 - "engines": { 937 - "node": ">=18" 938 - } 939 - }, 940 - "node_modules/@humanwhocodes/retry": { 941 - "version": "0.4.3", 942 - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", 943 - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", 944 - "dev": true, 945 - "license": "Apache-2.0", 946 - "engines": { 947 - "node": ">=18.18" 948 - }, 949 - "funding": { 950 - "type": "github", 951 - "url": "https://github.com/sponsors/nzakas" 952 - } 953 - }, 954 - "node_modules/@marijn/find-cluster-break": { 955 - "version": "1.0.2", 956 - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", 957 - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", 958 - "license": "MIT" 959 - }, 960 - "node_modules/@microsoft/eslint-plugin-sdl": { 961 - "version": "1.1.0", 962 - "resolved": "https://registry.npmjs.org/@microsoft/eslint-plugin-sdl/-/eslint-plugin-sdl-1.1.0.tgz", 963 - "integrity": "sha512-dxdNHOemLnBhfY3eByrujX9KyLigcNtW8sU+axzWv5nLGcsSBeKW2YYyTpfPo1hV8YPOmIGnfA4fZHyKVtWqBQ==", 964 - "dev": true, 965 - "license": "MIT", 966 - "dependencies": { 967 - "eslint-plugin-n": "17.10.3", 968 - "eslint-plugin-react": "7.37.3", 969 - "eslint-plugin-security": "1.4.0" 970 - }, 971 - "engines": { 972 - "node": ">=18.0.0" 973 - }, 974 - "peerDependencies": { 975 - "eslint": "^9" 976 - } 977 - }, 978 - "node_modules/@microsoft/eslint-plugin-sdl/node_modules/eslint-plugin-security": { 979 - "version": "1.4.0", 980 - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz", 981 - "integrity": "sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA==", 982 - "dev": true, 983 - "license": "Apache-2.0", 984 - "dependencies": { 985 - "safe-regex": "^1.1.0" 986 - } 987 - }, 988 - "node_modules/@microsoft/eslint-plugin-sdl/node_modules/safe-regex": { 989 - "version": "1.1.0", 990 - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 991 - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", 992 - "dev": true, 993 - "license": "MIT", 994 - "dependencies": { 995 - "ret": "~0.1.10" 996 - } 997 - }, 998 - "node_modules/@noble/secp256k1": { 999 - "version": "3.0.0", 1000 - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-3.0.0.tgz", 1001 - "integrity": "sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg==", 1002 - "license": "MIT", 1003 - "funding": { 1004 - "url": "https://paulmillr.com/funding/" 1005 - } 1006 - }, 1007 - "node_modules/@nodelib/fs.scandir": { 1008 - "version": "2.1.5", 1009 - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1010 - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1011 - "dev": true, 1012 - "license": "MIT", 1013 - "dependencies": { 1014 - "@nodelib/fs.stat": "2.0.5", 1015 - "run-parallel": "^1.1.9" 1016 - }, 1017 - "engines": { 1018 - "node": ">= 8" 1019 - } 1020 - }, 1021 - "node_modules/@nodelib/fs.stat": { 1022 - "version": "2.0.5", 1023 - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1024 - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1025 - "dev": true, 1026 - "license": "MIT", 1027 - "engines": { 1028 - "node": ">= 8" 1029 - } 1030 - }, 1031 - "node_modules/@nodelib/fs.walk": { 1032 - "version": "1.2.8", 1033 - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1034 - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1035 - "dev": true, 1036 - "license": "MIT", 1037 - "dependencies": { 1038 - "@nodelib/fs.scandir": "2.1.5", 1039 - "fastq": "^1.6.0" 1040 - }, 1041 - "engines": { 1042 - "node": ">= 8" 1043 - } 1044 - }, 1045 - "node_modules/@optique/core": { 1046 - "version": "0.6.11", 1047 - "resolved": "https://registry.npmjs.org/@optique/core/-/core-0.6.11.tgz", 1048 - "integrity": "sha512-GVLFihzBA1j78NFlkU5N1Lu0jRqET0k6Z66WK8VQKG/a3cxmCInVGSKMIdQG8i6pgC8wD5OizF6Y3QMztmhAxg==", 1049 - "funding": [ 1050 - "https://github.com/sponsors/dahlia" 1051 - ], 1052 - "license": "MIT", 1053 - "engines": { 1054 - "bun": ">=1.2.0", 1055 - "deno": ">=2.3.0", 1056 - "node": ">=20.0.0" 1057 - } 1058 - }, 1059 - "node_modules/@optique/run": { 1060 - "version": "0.6.11", 1061 - "resolved": "https://registry.npmjs.org/@optique/run/-/run-0.6.11.tgz", 1062 - "integrity": "sha512-tsXBEygGSzNpFK2gjsRlXBn7FiScUeLFWIZNpoAZ8iG85Km0/3K9xgqlQAXoQ+uEZBe4XplnzyCDvmEgbyNT8w==", 1063 - "funding": [ 1064 - "https://github.com/sponsors/dahlia" 1065 - ], 1066 - "license": "MIT", 1067 - "dependencies": { 1068 - "@optique/core": "0.6.11" 1069 - }, 1070 - "engines": { 1071 - "bun": ">=1.2.0", 1072 - "deno": ">=2.3.0", 1073 - "node": ">=20.0.0" 1074 - } 1075 - }, 1076 - "node_modules/@pkgr/core": { 1077 - "version": "0.1.2", 1078 - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", 1079 - "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", 1080 - "dev": true, 1081 - "license": "MIT", 1082 - "engines": { 1083 - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" 1084 - }, 1085 - "funding": { 1086 - "url": "https://opencollective.com/unts" 1087 - } 1088 - }, 1089 - "node_modules/@rtsao/scc": { 1090 - "version": "1.1.0", 1091 - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", 1092 - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", 1093 - "dev": true, 1094 - "license": "MIT" 1095 - }, 1096 - "node_modules/@standard-schema/spec": { 1097 - "version": "1.1.0", 1098 - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", 1099 - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", 1100 - "license": "MIT" 1101 - }, 1102 - "node_modules/@types/codemirror": { 1103 - "version": "5.60.8", 1104 - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", 1105 - "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", 1106 - "license": "MIT", 1107 - "dependencies": { 1108 - "@types/tern": "*" 1109 - } 1110 - }, 1111 - "node_modules/@types/eslint": { 1112 - "version": "8.56.2", 1113 - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", 1114 - "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", 1115 - "dev": true, 1116 - "license": "MIT", 1117 - "dependencies": { 1118 - "@types/estree": "*", 1119 - "@types/json-schema": "*" 1120 - } 1121 - }, 1122 - "node_modules/@types/estree": { 1123 - "version": "1.0.8", 1124 - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 1125 - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 1126 - "license": "MIT" 1127 - }, 1128 - "node_modules/@types/json-schema": { 1129 - "version": "7.0.15", 1130 - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 1131 - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 1132 - "dev": true, 1133 - "license": "MIT" 1134 - }, 1135 - "node_modules/@types/json5": { 1136 - "version": "0.0.29", 1137 - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", 1138 - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", 1139 - "dev": true, 1140 - "license": "MIT" 1141 - }, 1142 - "node_modules/@types/node": { 1143 - "version": "16.18.126", 1144 - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", 1145 - "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", 1146 - "dev": true, 1147 - "license": "MIT" 1148 - }, 1149 - "node_modules/@types/tern": { 1150 - "version": "0.23.9", 1151 - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", 1152 - "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", 1153 - "license": "MIT", 1154 - "dependencies": { 1155 - "@types/estree": "*" 1156 - } 1157 - }, 1158 - "node_modules/@typescript-eslint/eslint-plugin": { 1159 - "version": "8.35.1", 1160 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz", 1161 - "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==", 1162 - "dev": true, 1163 - "license": "MIT", 1164 - "dependencies": { 1165 - "@eslint-community/regexpp": "^4.10.0", 1166 - "@typescript-eslint/scope-manager": "8.35.1", 1167 - "@typescript-eslint/type-utils": "8.35.1", 1168 - "@typescript-eslint/utils": "8.35.1", 1169 - "@typescript-eslint/visitor-keys": "8.35.1", 1170 - "graphemer": "^1.4.0", 1171 - "ignore": "^7.0.0", 1172 - "natural-compare": "^1.4.0", 1173 - "ts-api-utils": "^2.1.0" 1174 - }, 1175 - "engines": { 1176 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1177 - }, 1178 - "funding": { 1179 - "type": "opencollective", 1180 - "url": "https://opencollective.com/typescript-eslint" 1181 - }, 1182 - "peerDependencies": { 1183 - "@typescript-eslint/parser": "^8.35.1", 1184 - "eslint": "^8.57.0 || ^9.0.0", 1185 - "typescript": ">=4.8.4 <5.9.0" 1186 - } 1187 - }, 1188 - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { 1189 - "version": "7.0.5", 1190 - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", 1191 - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", 1192 - "dev": true, 1193 - "license": "MIT", 1194 - "engines": { 1195 - "node": ">= 4" 1196 - } 1197 - }, 1198 - "node_modules/@typescript-eslint/parser": { 1199 - "version": "8.35.1", 1200 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz", 1201 - "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", 1202 - "dev": true, 1203 - "license": "MIT", 1204 - "peer": true, 1205 - "dependencies": { 1206 - "@typescript-eslint/scope-manager": "8.35.1", 1207 - "@typescript-eslint/types": "8.35.1", 1208 - "@typescript-eslint/typescript-estree": "8.35.1", 1209 - "@typescript-eslint/visitor-keys": "8.35.1", 1210 - "debug": "^4.3.4" 1211 - }, 1212 - "engines": { 1213 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1214 - }, 1215 - "funding": { 1216 - "type": "opencollective", 1217 - "url": "https://opencollective.com/typescript-eslint" 1218 - }, 1219 - "peerDependencies": { 1220 - "eslint": "^8.57.0 || ^9.0.0", 1221 - "typescript": ">=4.8.4 <5.9.0" 1222 - } 1223 - }, 1224 - "node_modules/@typescript-eslint/project-service": { 1225 - "version": "8.35.1", 1226 - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz", 1227 - "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==", 1228 - "dev": true, 1229 - "license": "MIT", 1230 - "dependencies": { 1231 - "@typescript-eslint/tsconfig-utils": "^8.35.1", 1232 - "@typescript-eslint/types": "^8.35.1", 1233 - "debug": "^4.3.4" 1234 - }, 1235 - "engines": { 1236 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1237 - }, 1238 - "funding": { 1239 - "type": "opencollective", 1240 - "url": "https://opencollective.com/typescript-eslint" 1241 - }, 1242 - "peerDependencies": { 1243 - "typescript": ">=4.8.4 <5.9.0" 1244 - } 1245 - }, 1246 - "node_modules/@typescript-eslint/scope-manager": { 1247 - "version": "8.35.1", 1248 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz", 1249 - "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==", 1250 - "dev": true, 1251 - "license": "MIT", 1252 - "dependencies": { 1253 - "@typescript-eslint/types": "8.35.1", 1254 - "@typescript-eslint/visitor-keys": "8.35.1" 1255 - }, 1256 - "engines": { 1257 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1258 - }, 1259 - "funding": { 1260 - "type": "opencollective", 1261 - "url": "https://opencollective.com/typescript-eslint" 1262 - } 1263 - }, 1264 - "node_modules/@typescript-eslint/tsconfig-utils": { 1265 - "version": "8.35.1", 1266 - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz", 1267 - "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==", 1268 - "dev": true, 1269 - "license": "MIT", 1270 - "engines": { 1271 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1272 - }, 1273 - "funding": { 1274 - "type": "opencollective", 1275 - "url": "https://opencollective.com/typescript-eslint" 1276 - }, 1277 - "peerDependencies": { 1278 - "typescript": ">=4.8.4 <5.9.0" 1279 - } 1280 - }, 1281 - "node_modules/@typescript-eslint/type-utils": { 1282 - "version": "8.35.1", 1283 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz", 1284 - "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==", 1285 - "dev": true, 1286 - "license": "MIT", 1287 - "dependencies": { 1288 - "@typescript-eslint/typescript-estree": "8.35.1", 1289 - "@typescript-eslint/utils": "8.35.1", 1290 - "debug": "^4.3.4", 1291 - "ts-api-utils": "^2.1.0" 1292 - }, 1293 - "engines": { 1294 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1295 - }, 1296 - "funding": { 1297 - "type": "opencollective", 1298 - "url": "https://opencollective.com/typescript-eslint" 1299 - }, 1300 - "peerDependencies": { 1301 - "eslint": "^8.57.0 || ^9.0.0", 1302 - "typescript": ">=4.8.4 <5.9.0" 1303 - } 1304 - }, 1305 - "node_modules/@typescript-eslint/types": { 1306 - "version": "8.35.1", 1307 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz", 1308 - "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==", 1309 - "dev": true, 1310 - "license": "MIT", 1311 - "engines": { 1312 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1313 - }, 1314 - "funding": { 1315 - "type": "opencollective", 1316 - "url": "https://opencollective.com/typescript-eslint" 1317 - } 1318 - }, 1319 - "node_modules/@typescript-eslint/typescript-estree": { 1320 - "version": "8.35.1", 1321 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz", 1322 - "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==", 1323 - "dev": true, 1324 - "license": "MIT", 1325 - "dependencies": { 1326 - "@typescript-eslint/project-service": "8.35.1", 1327 - "@typescript-eslint/tsconfig-utils": "8.35.1", 1328 - "@typescript-eslint/types": "8.35.1", 1329 - "@typescript-eslint/visitor-keys": "8.35.1", 1330 - "debug": "^4.3.4", 1331 - "fast-glob": "^3.3.2", 1332 - "is-glob": "^4.0.3", 1333 - "minimatch": "^9.0.4", 1334 - "semver": "^7.6.0", 1335 - "ts-api-utils": "^2.1.0" 1336 - }, 1337 - "engines": { 1338 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1339 - }, 1340 - "funding": { 1341 - "type": "opencollective", 1342 - "url": "https://opencollective.com/typescript-eslint" 1343 - }, 1344 - "peerDependencies": { 1345 - "typescript": ">=4.8.4 <5.9.0" 1346 - } 1347 - }, 1348 - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { 1349 - "version": "2.0.2", 1350 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 1351 - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 1352 - "dev": true, 1353 - "license": "MIT", 1354 - "dependencies": { 1355 - "balanced-match": "^1.0.0" 1356 - } 1357 - }, 1358 - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 1359 - "version": "9.0.5", 1360 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1361 - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1362 - "dev": true, 1363 - "license": "ISC", 1364 - "dependencies": { 1365 - "brace-expansion": "^2.0.1" 1366 - }, 1367 - "engines": { 1368 - "node": ">=16 || 14 >=14.17" 1369 - }, 1370 - "funding": { 1371 - "url": "https://github.com/sponsors/isaacs" 1372 - } 1373 - }, 1374 - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { 1375 - "version": "7.7.3", 1376 - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", 1377 - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 1378 - "dev": true, 1379 - "license": "ISC", 1380 - "bin": { 1381 - "semver": "bin/semver.js" 1382 - }, 1383 - "engines": { 1384 - "node": ">=10" 1385 - } 1386 - }, 1387 - "node_modules/@typescript-eslint/utils": { 1388 - "version": "8.35.1", 1389 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz", 1390 - "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==", 1391 - "dev": true, 1392 - "license": "MIT", 1393 - "dependencies": { 1394 - "@eslint-community/eslint-utils": "^4.7.0", 1395 - "@typescript-eslint/scope-manager": "8.35.1", 1396 - "@typescript-eslint/types": "8.35.1", 1397 - "@typescript-eslint/typescript-estree": "8.35.1" 1398 - }, 1399 - "engines": { 1400 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1401 - }, 1402 - "funding": { 1403 - "type": "opencollective", 1404 - "url": "https://opencollective.com/typescript-eslint" 1405 - }, 1406 - "peerDependencies": { 1407 - "eslint": "^8.57.0 || ^9.0.0", 1408 - "typescript": ">=4.8.4 <5.9.0" 1409 - } 1410 - }, 1411 - "node_modules/@typescript-eslint/visitor-keys": { 1412 - "version": "8.35.1", 1413 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz", 1414 - "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==", 1415 - "dev": true, 1416 - "license": "MIT", 1417 - "dependencies": { 1418 - "@typescript-eslint/types": "8.35.1", 1419 - "eslint-visitor-keys": "^4.2.1" 1420 - }, 1421 - "engines": { 1422 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1423 - }, 1424 - "funding": { 1425 - "type": "opencollective", 1426 - "url": "https://opencollective.com/typescript-eslint" 1427 - } 1428 - }, 1429 - "node_modules/acorn": { 1430 - "version": "8.15.0", 1431 - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", 1432 - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 1433 - "dev": true, 1434 - "license": "MIT", 1435 - "peer": true, 1436 - "bin": { 1437 - "acorn": "bin/acorn" 1438 - }, 1439 - "engines": { 1440 - "node": ">=0.4.0" 1441 - } 1442 - }, 1443 - "node_modules/acorn-jsx": { 1444 - "version": "5.3.2", 1445 - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1446 - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1447 - "dev": true, 1448 - "license": "MIT", 1449 - "peerDependencies": { 1450 - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1451 - } 1452 - }, 1453 - "node_modules/ajv": { 1454 - "version": "6.12.6", 1455 - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1456 - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1457 - "dev": true, 1458 - "license": "MIT", 1459 - "dependencies": { 1460 - "fast-deep-equal": "^3.1.1", 1461 - "fast-json-stable-stringify": "^2.0.0", 1462 - "json-schema-traverse": "^0.4.1", 1463 - "uri-js": "^4.2.2" 1464 - }, 1465 - "funding": { 1466 - "type": "github", 1467 - "url": "https://github.com/sponsors/epoberezkin" 1468 - } 1469 - }, 1470 - "node_modules/ansi-styles": { 1471 - "version": "4.3.0", 1472 - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1473 - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1474 - "dev": true, 1475 - "license": "MIT", 1476 - "dependencies": { 1477 - "color-convert": "^2.0.1" 1478 - }, 1479 - "engines": { 1480 - "node": ">=8" 1481 - }, 1482 - "funding": { 1483 - "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1484 - } 1485 - }, 1486 - "node_modules/argparse": { 1487 - "version": "2.0.1", 1488 - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1489 - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1490 - "dev": true, 1491 - "license": "Python-2.0" 1492 - }, 1493 - "node_modules/array-buffer-byte-length": { 1494 - "version": "1.0.2", 1495 - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", 1496 - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", 1497 - "dev": true, 1498 - "license": "MIT", 1499 - "dependencies": { 1500 - "call-bound": "^1.0.3", 1501 - "is-array-buffer": "^3.0.5" 1502 - }, 1503 - "engines": { 1504 - "node": ">= 0.4" 1505 - }, 1506 - "funding": { 1507 - "url": "https://github.com/sponsors/ljharb" 1508 - } 1509 - }, 1510 - "node_modules/array-includes": { 1511 - "version": "3.1.9", 1512 - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", 1513 - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", 1514 - "dev": true, 1515 - "license": "MIT", 1516 - "dependencies": { 1517 - "call-bind": "^1.0.8", 1518 - "call-bound": "^1.0.4", 1519 - "define-properties": "^1.2.1", 1520 - "es-abstract": "^1.24.0", 1521 - "es-object-atoms": "^1.1.1", 1522 - "get-intrinsic": "^1.3.0", 1523 - "is-string": "^1.1.1", 1524 - "math-intrinsics": "^1.1.0" 1525 - }, 1526 - "engines": { 1527 - "node": ">= 0.4" 1528 - }, 1529 - "funding": { 1530 - "url": "https://github.com/sponsors/ljharb" 1531 - } 1532 - }, 1533 - "node_modules/array.prototype.findlast": { 1534 - "version": "1.2.5", 1535 - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", 1536 - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", 1537 - "dev": true, 1538 - "license": "MIT", 1539 - "dependencies": { 1540 - "call-bind": "^1.0.7", 1541 - "define-properties": "^1.2.1", 1542 - "es-abstract": "^1.23.2", 1543 - "es-errors": "^1.3.0", 1544 - "es-object-atoms": "^1.0.0", 1545 - "es-shim-unscopables": "^1.0.2" 1546 - }, 1547 - "engines": { 1548 - "node": ">= 0.4" 1549 - }, 1550 - "funding": { 1551 - "url": "https://github.com/sponsors/ljharb" 1552 - } 1553 - }, 1554 - "node_modules/array.prototype.findlastindex": { 1555 - "version": "1.2.6", 1556 - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", 1557 - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", 1558 - "dev": true, 1559 - "license": "MIT", 1560 - "dependencies": { 1561 - "call-bind": "^1.0.8", 1562 - "call-bound": "^1.0.4", 1563 - "define-properties": "^1.2.1", 1564 - "es-abstract": "^1.23.9", 1565 - "es-errors": "^1.3.0", 1566 - "es-object-atoms": "^1.1.1", 1567 - "es-shim-unscopables": "^1.1.0" 1568 - }, 1569 - "engines": { 1570 - "node": ">= 0.4" 1571 - }, 1572 - "funding": { 1573 - "url": "https://github.com/sponsors/ljharb" 1574 - } 1575 - }, 1576 - "node_modules/array.prototype.flat": { 1577 - "version": "1.3.3", 1578 - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", 1579 - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", 1580 - "dev": true, 1581 - "license": "MIT", 1582 - "dependencies": { 1583 - "call-bind": "^1.0.8", 1584 - "define-properties": "^1.2.1", 1585 - "es-abstract": "^1.23.5", 1586 - "es-shim-unscopables": "^1.0.2" 1587 - }, 1588 - "engines": { 1589 - "node": ">= 0.4" 1590 - }, 1591 - "funding": { 1592 - "url": "https://github.com/sponsors/ljharb" 1593 - } 1594 - }, 1595 - "node_modules/array.prototype.flatmap": { 1596 - "version": "1.3.3", 1597 - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", 1598 - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", 1599 - "dev": true, 1600 - "license": "MIT", 1601 - "dependencies": { 1602 - "call-bind": "^1.0.8", 1603 - "define-properties": "^1.2.1", 1604 - "es-abstract": "^1.23.5", 1605 - "es-shim-unscopables": "^1.0.2" 1606 - }, 1607 - "engines": { 1608 - "node": ">= 0.4" 1609 - }, 1610 - "funding": { 1611 - "url": "https://github.com/sponsors/ljharb" 1612 - } 1613 - }, 1614 - "node_modules/array.prototype.tosorted": { 1615 - "version": "1.1.4", 1616 - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", 1617 - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", 1618 - "dev": true, 1619 - "license": "MIT", 1620 - "dependencies": { 1621 - "call-bind": "^1.0.7", 1622 - "define-properties": "^1.2.1", 1623 - "es-abstract": "^1.23.3", 1624 - "es-errors": "^1.3.0", 1625 - "es-shim-unscopables": "^1.0.2" 1626 - }, 1627 - "engines": { 1628 - "node": ">= 0.4" 1629 - } 1630 - }, 1631 - "node_modules/arraybuffer.prototype.slice": { 1632 - "version": "1.0.4", 1633 - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", 1634 - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", 1635 - "dev": true, 1636 - "license": "MIT", 1637 - "dependencies": { 1638 - "array-buffer-byte-length": "^1.0.1", 1639 - "call-bind": "^1.0.8", 1640 - "define-properties": "^1.2.1", 1641 - "es-abstract": "^1.23.5", 1642 - "es-errors": "^1.3.0", 1643 - "get-intrinsic": "^1.2.6", 1644 - "is-array-buffer": "^3.0.4" 1645 - }, 1646 - "engines": { 1647 - "node": ">= 0.4" 1648 - }, 1649 - "funding": { 1650 - "url": "https://github.com/sponsors/ljharb" 1651 - } 1652 - }, 1653 - "node_modules/async-function": { 1654 - "version": "1.0.0", 1655 - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", 1656 - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", 1657 - "dev": true, 1658 - "license": "MIT", 1659 - "engines": { 1660 - "node": ">= 0.4" 1661 - } 1662 - }, 1663 - "node_modules/available-typed-arrays": { 1664 - "version": "1.0.7", 1665 - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", 1666 - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", 1667 - "dev": true, 1668 - "license": "MIT", 1669 - "dependencies": { 1670 - "possible-typed-array-names": "^1.0.0" 1671 - }, 1672 - "engines": { 1673 - "node": ">= 0.4" 1674 - }, 1675 - "funding": { 1676 - "url": "https://github.com/sponsors/ljharb" 1677 - } 1678 - }, 1679 - "node_modules/balanced-match": { 1680 - "version": "1.0.2", 1681 - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1682 - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1683 - "dev": true, 1684 - "license": "MIT" 1685 - }, 1686 - "node_modules/brace-expansion": { 1687 - "version": "1.1.12", 1688 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", 1689 - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", 1690 - "dev": true, 1691 - "license": "MIT", 1692 - "dependencies": { 1693 - "balanced-match": "^1.0.0", 1694 - "concat-map": "0.0.1" 1695 - } 1696 - }, 1697 - "node_modules/braces": { 1698 - "version": "3.0.3", 1699 - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1700 - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1701 - "dev": true, 1702 - "license": "MIT", 1703 - "dependencies": { 1704 - "fill-range": "^7.1.1" 1705 - }, 1706 - "engines": { 1707 - "node": ">=8" 1708 - } 1709 - }, 1710 - "node_modules/call-bind": { 1711 - "version": "1.0.8", 1712 - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", 1713 - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", 1714 - "dev": true, 1715 - "license": "MIT", 1716 - "dependencies": { 1717 - "call-bind-apply-helpers": "^1.0.0", 1718 - "es-define-property": "^1.0.0", 1719 - "get-intrinsic": "^1.2.4", 1720 - "set-function-length": "^1.2.2" 1721 - }, 1722 - "engines": { 1723 - "node": ">= 0.4" 1724 - }, 1725 - "funding": { 1726 - "url": "https://github.com/sponsors/ljharb" 1727 - } 1728 - }, 1729 - "node_modules/call-bind-apply-helpers": { 1730 - "version": "1.0.2", 1731 - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 1732 - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 1733 - "dev": true, 1734 - "license": "MIT", 1735 - "dependencies": { 1736 - "es-errors": "^1.3.0", 1737 - "function-bind": "^1.1.2" 1738 - }, 1739 - "engines": { 1740 - "node": ">= 0.4" 1741 - } 1742 - }, 1743 - "node_modules/call-bound": { 1744 - "version": "1.0.4", 1745 - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 1746 - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 1747 - "dev": true, 1748 - "license": "MIT", 1749 - "dependencies": { 1750 - "call-bind-apply-helpers": "^1.0.2", 1751 - "get-intrinsic": "^1.3.0" 1752 - }, 1753 - "engines": { 1754 - "node": ">= 0.4" 1755 - }, 1756 - "funding": { 1757 - "url": "https://github.com/sponsors/ljharb" 1758 - } 1759 - }, 1760 - "node_modules/callsites": { 1761 - "version": "3.1.0", 1762 - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1763 - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1764 - "dev": true, 1765 - "license": "MIT", 1766 - "engines": { 1767 - "node": ">=6" 1768 - } 1769 - }, 1770 - "node_modules/chalk": { 1771 - "version": "4.1.2", 1772 - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1773 - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1774 - "dev": true, 1775 - "license": "MIT", 1776 - "dependencies": { 1777 - "ansi-styles": "^4.1.0", 1778 - "supports-color": "^7.1.0" 1779 - }, 1780 - "engines": { 1781 - "node": ">=10" 1782 - }, 1783 - "funding": { 1784 - "url": "https://github.com/chalk/chalk?sponsor=1" 1785 - } 1786 - }, 1787 - "node_modules/color-convert": { 1788 - "version": "2.0.1", 1789 - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1790 - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1791 - "dev": true, 1792 - "license": "MIT", 1793 - "dependencies": { 1794 - "color-name": "~1.1.4" 1795 - }, 1796 - "engines": { 1797 - "node": ">=7.0.0" 1798 - } 1799 - }, 1800 - "node_modules/color-name": { 1801 - "version": "1.1.4", 1802 - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1803 - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1804 - "dev": true, 1805 - "license": "MIT" 1806 - }, 1807 - "node_modules/concat-map": { 1808 - "version": "0.0.1", 1809 - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1810 - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1811 - "dev": true, 1812 - "license": "MIT" 1813 - }, 1814 - "node_modules/crelt": { 1815 - "version": "1.0.6", 1816 - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", 1817 - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", 1818 - "license": "MIT" 1819 - }, 1820 - "node_modules/cross-spawn": { 1821 - "version": "7.0.6", 1822 - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1823 - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1824 - "dev": true, 1825 - "license": "MIT", 1826 - "dependencies": { 1827 - "path-key": "^3.1.0", 1828 - "shebang-command": "^2.0.0", 1829 - "which": "^2.0.1" 1830 - }, 1831 - "engines": { 1832 - "node": ">= 8" 1833 - } 1834 - }, 1835 - "node_modules/data-view-buffer": { 1836 - "version": "1.0.2", 1837 - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", 1838 - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", 1839 - "dev": true, 1840 - "license": "MIT", 1841 - "dependencies": { 1842 - "call-bound": "^1.0.3", 1843 - "es-errors": "^1.3.0", 1844 - "is-data-view": "^1.0.2" 1845 - }, 1846 - "engines": { 1847 - "node": ">= 0.4" 1848 - }, 1849 - "funding": { 1850 - "url": "https://github.com/sponsors/ljharb" 1851 - } 1852 - }, 1853 - "node_modules/data-view-byte-length": { 1854 - "version": "1.0.2", 1855 - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", 1856 - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", 1857 - "dev": true, 1858 - "license": "MIT", 1859 - "dependencies": { 1860 - "call-bound": "^1.0.3", 1861 - "es-errors": "^1.3.0", 1862 - "is-data-view": "^1.0.2" 1863 - }, 1864 - "engines": { 1865 - "node": ">= 0.4" 1866 - }, 1867 - "funding": { 1868 - "url": "https://github.com/sponsors/inspect-js" 1869 - } 1870 - }, 1871 - "node_modules/data-view-byte-offset": { 1872 - "version": "1.0.1", 1873 - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", 1874 - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", 1875 - "dev": true, 1876 - "license": "MIT", 1877 - "dependencies": { 1878 - "call-bound": "^1.0.2", 1879 - "es-errors": "^1.3.0", 1880 - "is-data-view": "^1.0.1" 1881 - }, 1882 - "engines": { 1883 - "node": ">= 0.4" 1884 - }, 1885 - "funding": { 1886 - "url": "https://github.com/sponsors/ljharb" 1887 - } 1888 - }, 1889 - "node_modules/debug": { 1890 - "version": "4.4.3", 1891 - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 1892 - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 1893 - "dev": true, 1894 - "license": "MIT", 1895 - "dependencies": { 1896 - "ms": "^2.1.3" 1897 - }, 1898 - "engines": { 1899 - "node": ">=6.0" 1900 - }, 1901 - "peerDependenciesMeta": { 1902 - "supports-color": { 1903 - "optional": true 1904 - } 1905 - } 1906 - }, 1907 - "node_modules/deep-is": { 1908 - "version": "0.1.4", 1909 - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1910 - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1911 - "dev": true, 1912 - "license": "MIT" 1913 - }, 1914 - "node_modules/define-data-property": { 1915 - "version": "1.1.4", 1916 - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 1917 - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 1918 - "dev": true, 1919 - "license": "MIT", 1920 - "dependencies": { 1921 - "es-define-property": "^1.0.0", 1922 - "es-errors": "^1.3.0", 1923 - "gopd": "^1.0.1" 1924 - }, 1925 - "engines": { 1926 - "node": ">= 0.4" 1927 - }, 1928 - "funding": { 1929 - "url": "https://github.com/sponsors/ljharb" 1930 - } 1931 - }, 1932 - "node_modules/define-properties": { 1933 - "version": "1.2.1", 1934 - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 1935 - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 1936 - "dev": true, 1937 - "license": "MIT", 1938 - "dependencies": { 1939 - "define-data-property": "^1.0.1", 1940 - "has-property-descriptors": "^1.0.0", 1941 - "object-keys": "^1.1.1" 1942 - }, 1943 - "engines": { 1944 - "node": ">= 0.4" 1945 - }, 1946 - "funding": { 1947 - "url": "https://github.com/sponsors/ljharb" 1948 - } 1949 - }, 1950 - "node_modules/doctrine": { 1951 - "version": "2.1.0", 1952 - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 1953 - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 1954 - "dev": true, 1955 - "license": "Apache-2.0", 1956 - "dependencies": { 1957 - "esutils": "^2.0.2" 1958 - }, 1959 - "engines": { 1960 - "node": ">=0.10.0" 1961 - } 1962 - }, 1963 - "node_modules/dunder-proto": { 1964 - "version": "1.0.1", 1965 - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 1966 - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 1967 - "dev": true, 1968 - "license": "MIT", 1969 - "dependencies": { 1970 - "call-bind-apply-helpers": "^1.0.1", 1971 - "es-errors": "^1.3.0", 1972 - "gopd": "^1.2.0" 1973 - }, 1974 - "engines": { 1975 - "node": ">= 0.4" 1976 - } 1977 - }, 1978 - "node_modules/empathic": { 1979 - "version": "2.0.0", 1980 - "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", 1981 - "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", 1982 - "dev": true, 1983 - "license": "MIT", 1984 - "engines": { 1985 - "node": ">=14" 1986 - } 1987 - }, 1988 - "node_modules/enhanced-resolve": { 1989 - "version": "5.18.3", 1990 - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", 1991 - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", 1992 - "dev": true, 1993 - "license": "MIT", 1994 - "dependencies": { 1995 - "graceful-fs": "^4.2.4", 1996 - "tapable": "^2.2.0" 1997 - }, 1998 - "engines": { 1999 - "node": ">=10.13.0" 2000 - } 2001 - }, 2002 - "node_modules/es-abstract": { 2003 - "version": "1.24.0", 2004 - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", 2005 - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", 2006 - "dev": true, 2007 - "license": "MIT", 2008 - "dependencies": { 2009 - "array-buffer-byte-length": "^1.0.2", 2010 - "arraybuffer.prototype.slice": "^1.0.4", 2011 - "available-typed-arrays": "^1.0.7", 2012 - "call-bind": "^1.0.8", 2013 - "call-bound": "^1.0.4", 2014 - "data-view-buffer": "^1.0.2", 2015 - "data-view-byte-length": "^1.0.2", 2016 - "data-view-byte-offset": "^1.0.1", 2017 - "es-define-property": "^1.0.1", 2018 - "es-errors": "^1.3.0", 2019 - "es-object-atoms": "^1.1.1", 2020 - "es-set-tostringtag": "^2.1.0", 2021 - "es-to-primitive": "^1.3.0", 2022 - "function.prototype.name": "^1.1.8", 2023 - "get-intrinsic": "^1.3.0", 2024 - "get-proto": "^1.0.1", 2025 - "get-symbol-description": "^1.1.0", 2026 - "globalthis": "^1.0.4", 2027 - "gopd": "^1.2.0", 2028 - "has-property-descriptors": "^1.0.2", 2029 - "has-proto": "^1.2.0", 2030 - "has-symbols": "^1.1.0", 2031 - "hasown": "^2.0.2", 2032 - "internal-slot": "^1.1.0", 2033 - "is-array-buffer": "^3.0.5", 2034 - "is-callable": "^1.2.7", 2035 - "is-data-view": "^1.0.2", 2036 - "is-negative-zero": "^2.0.3", 2037 - "is-regex": "^1.2.1", 2038 - "is-set": "^2.0.3", 2039 - "is-shared-array-buffer": "^1.0.4", 2040 - "is-string": "^1.1.1", 2041 - "is-typed-array": "^1.1.15", 2042 - "is-weakref": "^1.1.1", 2043 - "math-intrinsics": "^1.1.0", 2044 - "object-inspect": "^1.13.4", 2045 - "object-keys": "^1.1.1", 2046 - "object.assign": "^4.1.7", 2047 - "own-keys": "^1.0.1", 2048 - "regexp.prototype.flags": "^1.5.4", 2049 - "safe-array-concat": "^1.1.3", 2050 - "safe-push-apply": "^1.0.0", 2051 - "safe-regex-test": "^1.1.0", 2052 - "set-proto": "^1.0.0", 2053 - "stop-iteration-iterator": "^1.1.0", 2054 - "string.prototype.trim": "^1.2.10", 2055 - "string.prototype.trimend": "^1.0.9", 2056 - "string.prototype.trimstart": "^1.0.8", 2057 - "typed-array-buffer": "^1.0.3", 2058 - "typed-array-byte-length": "^1.0.3", 2059 - "typed-array-byte-offset": "^1.0.4", 2060 - "typed-array-length": "^1.0.7", 2061 - "unbox-primitive": "^1.1.0", 2062 - "which-typed-array": "^1.1.19" 2063 - }, 2064 - "engines": { 2065 - "node": ">= 0.4" 2066 - }, 2067 - "funding": { 2068 - "url": "https://github.com/sponsors/ljharb" 2069 - } 2070 - }, 2071 - "node_modules/es-define-property": { 2072 - "version": "1.0.1", 2073 - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 2074 - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 2075 - "dev": true, 2076 - "license": "MIT", 2077 - "engines": { 2078 - "node": ">= 0.4" 2079 - } 2080 - }, 2081 - "node_modules/es-errors": { 2082 - "version": "1.3.0", 2083 - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 2084 - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 2085 - "dev": true, 2086 - "license": "MIT", 2087 - "engines": { 2088 - "node": ">= 0.4" 2089 - } 2090 - }, 2091 - "node_modules/es-iterator-helpers": { 2092 - "version": "1.2.1", 2093 - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", 2094 - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", 2095 - "dev": true, 2096 - "license": "MIT", 2097 - "dependencies": { 2098 - "call-bind": "^1.0.8", 2099 - "call-bound": "^1.0.3", 2100 - "define-properties": "^1.2.1", 2101 - "es-abstract": "^1.23.6", 2102 - "es-errors": "^1.3.0", 2103 - "es-set-tostringtag": "^2.0.3", 2104 - "function-bind": "^1.1.2", 2105 - "get-intrinsic": "^1.2.6", 2106 - "globalthis": "^1.0.4", 2107 - "gopd": "^1.2.0", 2108 - "has-property-descriptors": "^1.0.2", 2109 - "has-proto": "^1.2.0", 2110 - "has-symbols": "^1.1.0", 2111 - "internal-slot": "^1.1.0", 2112 - "iterator.prototype": "^1.1.4", 2113 - "safe-array-concat": "^1.1.3" 2114 - }, 2115 - "engines": { 2116 - "node": ">= 0.4" 2117 - } 2118 - }, 2119 - "node_modules/es-object-atoms": { 2120 - "version": "1.1.1", 2121 - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 2122 - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 2123 - "dev": true, 2124 - "license": "MIT", 2125 - "dependencies": { 2126 - "es-errors": "^1.3.0" 2127 - }, 2128 - "engines": { 2129 - "node": ">= 0.4" 2130 - } 2131 - }, 2132 - "node_modules/es-set-tostringtag": { 2133 - "version": "2.1.0", 2134 - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 2135 - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 2136 - "dev": true, 2137 - "license": "MIT", 2138 - "dependencies": { 2139 - "es-errors": "^1.3.0", 2140 - "get-intrinsic": "^1.2.6", 2141 - "has-tostringtag": "^1.0.2", 2142 - "hasown": "^2.0.2" 2143 - }, 2144 - "engines": { 2145 - "node": ">= 0.4" 2146 - } 2147 - }, 2148 - "node_modules/es-shim-unscopables": { 2149 - "version": "1.1.0", 2150 - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", 2151 - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", 2152 - "dev": true, 2153 - "license": "MIT", 2154 - "dependencies": { 2155 - "hasown": "^2.0.2" 2156 - }, 2157 - "engines": { 2158 - "node": ">= 0.4" 2159 - } 2160 - }, 2161 - "node_modules/es-to-primitive": { 2162 - "version": "1.3.0", 2163 - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", 2164 - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", 2165 - "dev": true, 2166 - "license": "MIT", 2167 - "dependencies": { 2168 - "is-callable": "^1.2.7", 2169 - "is-date-object": "^1.0.5", 2170 - "is-symbol": "^1.0.4" 2171 - }, 2172 - "engines": { 2173 - "node": ">= 0.4" 2174 - }, 2175 - "funding": { 2176 - "url": "https://github.com/sponsors/ljharb" 2177 - } 2178 - }, 2179 - "node_modules/esbuild": { 2180 - "version": "0.25.5", 2181 - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", 2182 - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", 2183 - "dev": true, 2184 - "hasInstallScript": true, 2185 - "license": "MIT", 2186 - "bin": { 2187 - "esbuild": "bin/esbuild" 2188 - }, 2189 - "engines": { 2190 - "node": ">=18" 2191 - }, 2192 - "optionalDependencies": { 2193 - "@esbuild/aix-ppc64": "0.25.5", 2194 - "@esbuild/android-arm": "0.25.5", 2195 - "@esbuild/android-arm64": "0.25.5", 2196 - "@esbuild/android-x64": "0.25.5", 2197 - "@esbuild/darwin-arm64": "0.25.5", 2198 - "@esbuild/darwin-x64": "0.25.5", 2199 - "@esbuild/freebsd-arm64": "0.25.5", 2200 - "@esbuild/freebsd-x64": "0.25.5", 2201 - "@esbuild/linux-arm": "0.25.5", 2202 - "@esbuild/linux-arm64": "0.25.5", 2203 - "@esbuild/linux-ia32": "0.25.5", 2204 - "@esbuild/linux-loong64": "0.25.5", 2205 - "@esbuild/linux-mips64el": "0.25.5", 2206 - "@esbuild/linux-ppc64": "0.25.5", 2207 - "@esbuild/linux-riscv64": "0.25.5", 2208 - "@esbuild/linux-s390x": "0.25.5", 2209 - "@esbuild/linux-x64": "0.25.5", 2210 - "@esbuild/netbsd-arm64": "0.25.5", 2211 - "@esbuild/netbsd-x64": "0.25.5", 2212 - "@esbuild/openbsd-arm64": "0.25.5", 2213 - "@esbuild/openbsd-x64": "0.25.5", 2214 - "@esbuild/sunos-x64": "0.25.5", 2215 - "@esbuild/win32-arm64": "0.25.5", 2216 - "@esbuild/win32-ia32": "0.25.5", 2217 - "@esbuild/win32-x64": "0.25.5" 2218 - } 2219 - }, 2220 - "node_modules/escape-string-regexp": { 2221 - "version": "4.0.0", 2222 - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 2223 - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 2224 - "dev": true, 2225 - "license": "MIT", 2226 - "engines": { 2227 - "node": ">=10" 2228 - }, 2229 - "funding": { 2230 - "url": "https://github.com/sponsors/sindresorhus" 2231 - } 2232 - }, 2233 - "node_modules/eslint": { 2234 - "version": "9.39.1", 2235 - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", 2236 - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", 2237 - "dev": true, 2238 - "license": "MIT", 2239 - "peer": true, 2240 - "dependencies": { 2241 - "@eslint-community/eslint-utils": "^4.8.0", 2242 - "@eslint-community/regexpp": "^4.12.1", 2243 - "@eslint/config-array": "^0.21.1", 2244 - "@eslint/config-helpers": "^0.4.2", 2245 - "@eslint/core": "^0.17.0", 2246 - "@eslint/eslintrc": "^3.3.1", 2247 - "@eslint/js": "9.39.1", 2248 - "@eslint/plugin-kit": "^0.4.1", 2249 - "@humanfs/node": "^0.16.6", 2250 - "@humanwhocodes/module-importer": "^1.0.1", 2251 - "@humanwhocodes/retry": "^0.4.2", 2252 - "@types/estree": "^1.0.6", 2253 - "ajv": "^6.12.4", 2254 - "chalk": "^4.0.0", 2255 - "cross-spawn": "^7.0.6", 2256 - "debug": "^4.3.2", 2257 - "escape-string-regexp": "^4.0.0", 2258 - "eslint-scope": "^8.4.0", 2259 - "eslint-visitor-keys": "^4.2.1", 2260 - "espree": "^10.4.0", 2261 - "esquery": "^1.5.0", 2262 - "esutils": "^2.0.2", 2263 - "fast-deep-equal": "^3.1.3", 2264 - "file-entry-cache": "^8.0.0", 2265 - "find-up": "^5.0.0", 2266 - "glob-parent": "^6.0.2", 2267 - "ignore": "^5.2.0", 2268 - "imurmurhash": "^0.1.4", 2269 - "is-glob": "^4.0.0", 2270 - "json-stable-stringify-without-jsonify": "^1.0.1", 2271 - "lodash.merge": "^4.6.2", 2272 - "minimatch": "^3.1.2", 2273 - "natural-compare": "^1.4.0", 2274 - "optionator": "^0.9.3" 2275 - }, 2276 - "bin": { 2277 - "eslint": "bin/eslint.js" 2278 - }, 2279 - "engines": { 2280 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2281 - }, 2282 - "funding": { 2283 - "url": "https://eslint.org/donate" 2284 - }, 2285 - "peerDependencies": { 2286 - "jiti": "*" 2287 - }, 2288 - "peerDependenciesMeta": { 2289 - "jiti": { 2290 - "optional": true 2291 - } 2292 - } 2293 - }, 2294 - "node_modules/eslint-compat-utils": { 2295 - "version": "0.5.1", 2296 - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", 2297 - "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", 2298 - "dev": true, 2299 - "license": "MIT", 2300 - "dependencies": { 2301 - "semver": "^7.5.4" 2302 - }, 2303 - "engines": { 2304 - "node": ">=12" 2305 - }, 2306 - "peerDependencies": { 2307 - "eslint": ">=6.0.0" 2308 - } 2309 - }, 2310 - "node_modules/eslint-compat-utils/node_modules/semver": { 2311 - "version": "7.7.3", 2312 - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", 2313 - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 2314 - "dev": true, 2315 - "license": "ISC", 2316 - "bin": { 2317 - "semver": "bin/semver.js" 2318 - }, 2319 - "engines": { 2320 - "node": ">=10" 2321 - } 2322 - }, 2323 - "node_modules/eslint-import-resolver-node": { 2324 - "version": "0.3.9", 2325 - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", 2326 - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", 2327 - "dev": true, 2328 - "license": "MIT", 2329 - "dependencies": { 2330 - "debug": "^3.2.7", 2331 - "is-core-module": "^2.13.0", 2332 - "resolve": "^1.22.4" 2333 - } 2334 - }, 2335 - "node_modules/eslint-import-resolver-node/node_modules/debug": { 2336 - "version": "3.2.7", 2337 - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 2338 - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 2339 - "dev": true, 2340 - "license": "MIT", 2341 - "dependencies": { 2342 - "ms": "^2.1.1" 2343 - } 2344 - }, 2345 - "node_modules/eslint-module-utils": { 2346 - "version": "2.12.1", 2347 - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", 2348 - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", 2349 - "dev": true, 2350 - "license": "MIT", 2351 - "dependencies": { 2352 - "debug": "^3.2.7" 2353 - }, 2354 - "engines": { 2355 - "node": ">=4" 2356 - }, 2357 - "peerDependenciesMeta": { 2358 - "eslint": { 2359 - "optional": true 2360 - } 2361 - } 2362 - }, 2363 - "node_modules/eslint-module-utils/node_modules/debug": { 2364 - "version": "3.2.7", 2365 - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 2366 - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 2367 - "dev": true, 2368 - "license": "MIT", 2369 - "dependencies": { 2370 - "ms": "^2.1.1" 2371 - } 2372 - }, 2373 - "node_modules/eslint-plugin-depend": { 2374 - "version": "1.3.1", 2375 - "resolved": "https://registry.npmjs.org/eslint-plugin-depend/-/eslint-plugin-depend-1.3.1.tgz", 2376 - "integrity": "sha512-1uo2rFAr9vzNrCYdp7IBZRB54LiyVxfaIso0R6/QV3t6Dax6DTbW/EV2Hktf0f4UtmGHK8UyzJWI382pwW04jw==", 2377 - "dev": true, 2378 - "license": "MIT", 2379 - "dependencies": { 2380 - "empathic": "^2.0.0", 2381 - "module-replacements": "^2.8.0", 2382 - "semver": "^7.6.3" 2383 - } 2384 - }, 2385 - "node_modules/eslint-plugin-depend/node_modules/semver": { 2386 - "version": "7.7.3", 2387 - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", 2388 - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 2389 - "dev": true, 2390 - "license": "ISC", 2391 - "bin": { 2392 - "semver": "bin/semver.js" 2393 - }, 2394 - "engines": { 2395 - "node": ">=10" 2396 - } 2397 - }, 2398 - "node_modules/eslint-plugin-es-x": { 2399 - "version": "7.8.0", 2400 - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", 2401 - "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", 2402 - "dev": true, 2403 - "funding": [ 2404 - "https://github.com/sponsors/ota-meshi", 2405 - "https://opencollective.com/eslint" 2406 - ], 2407 - "license": "MIT", 2408 - "dependencies": { 2409 - "@eslint-community/eslint-utils": "^4.1.2", 2410 - "@eslint-community/regexpp": "^4.11.0", 2411 - "eslint-compat-utils": "^0.5.1" 2412 - }, 2413 - "engines": { 2414 - "node": "^14.18.0 || >=16.0.0" 2415 - }, 2416 - "peerDependencies": { 2417 - "eslint": ">=8" 2418 - } 2419 - }, 2420 - "node_modules/eslint-plugin-import": { 2421 - "version": "2.32.0", 2422 - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", 2423 - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", 2424 - "dev": true, 2425 - "license": "MIT", 2426 - "dependencies": { 2427 - "@rtsao/scc": "^1.1.0", 2428 - "array-includes": "^3.1.9", 2429 - "array.prototype.findlastindex": "^1.2.6", 2430 - "array.prototype.flat": "^1.3.3", 2431 - "array.prototype.flatmap": "^1.3.3", 2432 - "debug": "^3.2.7", 2433 - "doctrine": "^2.1.0", 2434 - "eslint-import-resolver-node": "^0.3.9", 2435 - "eslint-module-utils": "^2.12.1", 2436 - "hasown": "^2.0.2", 2437 - "is-core-module": "^2.16.1", 2438 - "is-glob": "^4.0.3", 2439 - "minimatch": "^3.1.2", 2440 - "object.fromentries": "^2.0.8", 2441 - "object.groupby": "^1.0.3", 2442 - "object.values": "^1.2.1", 2443 - "semver": "^6.3.1", 2444 - "string.prototype.trimend": "^1.0.9", 2445 - "tsconfig-paths": "^3.15.0" 2446 - }, 2447 - "engines": { 2448 - "node": ">=4" 2449 - }, 2450 - "peerDependencies": { 2451 - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" 2452 - } 2453 - }, 2454 - "node_modules/eslint-plugin-import/node_modules/debug": { 2455 - "version": "3.2.7", 2456 - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 2457 - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 2458 - "dev": true, 2459 - "license": "MIT", 2460 - "dependencies": { 2461 - "ms": "^2.1.1" 2462 - } 2463 - }, 2464 - "node_modules/eslint-plugin-json-schema-validator": { 2465 - "version": "5.1.0", 2466 - "resolved": "https://registry.npmjs.org/eslint-plugin-json-schema-validator/-/eslint-plugin-json-schema-validator-5.1.0.tgz", 2467 - "integrity": "sha512-ZmVyxRIjm58oqe2kTuy90PpmZPrrKvOjRPXKzq8WCgRgAkidCgm5X8domL2KSfadZ3QFAmifMgGTcVNhZ5ez2g==", 2468 - "dev": true, 2469 - "license": "MIT", 2470 - "dependencies": { 2471 - "@eslint-community/eslint-utils": "^4.3.0", 2472 - "ajv": "^8.0.0", 2473 - "debug": "^4.3.1", 2474 - "eslint-compat-utils": "^0.5.0", 2475 - "json-schema-migrate": "^2.0.0", 2476 - "jsonc-eslint-parser": "^2.0.0", 2477 - "minimatch": "^8.0.0", 2478 - "synckit": "^0.9.0", 2479 - "toml-eslint-parser": "^0.9.0", 2480 - "tunnel-agent": "^0.6.0", 2481 - "yaml-eslint-parser": "^1.0.0" 2482 - }, 2483 - "engines": { 2484 - "node": "^14.18.0 || >=16.0.0" 2485 - }, 2486 - "funding": { 2487 - "url": "https://github.com/sponsors/ota-meshi" 2488 - }, 2489 - "peerDependencies": { 2490 - "eslint": ">=6.0.0" 2491 - } 2492 - }, 2493 - "node_modules/eslint-plugin-json-schema-validator/node_modules/ajv": { 2494 - "version": "8.17.1", 2495 - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", 2496 - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", 2497 - "dev": true, 2498 - "license": "MIT", 2499 - "dependencies": { 2500 - "fast-deep-equal": "^3.1.3", 2501 - "fast-uri": "^3.0.1", 2502 - "json-schema-traverse": "^1.0.0", 2503 - "require-from-string": "^2.0.2" 2504 - }, 2505 - "funding": { 2506 - "type": "github", 2507 - "url": "https://github.com/sponsors/epoberezkin" 2508 - } 2509 - }, 2510 - "node_modules/eslint-plugin-json-schema-validator/node_modules/brace-expansion": { 2511 - "version": "2.0.2", 2512 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 2513 - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 2514 - "dev": true, 2515 - "license": "MIT", 2516 - "dependencies": { 2517 - "balanced-match": "^1.0.0" 2518 - } 2519 - }, 2520 - "node_modules/eslint-plugin-json-schema-validator/node_modules/json-schema-traverse": { 2521 - "version": "1.0.0", 2522 - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 2523 - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 2524 - "dev": true, 2525 - "license": "MIT" 2526 - }, 2527 - "node_modules/eslint-plugin-json-schema-validator/node_modules/minimatch": { 2528 - "version": "8.0.4", 2529 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", 2530 - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", 2531 - "dev": true, 2532 - "license": "ISC", 2533 - "dependencies": { 2534 - "brace-expansion": "^2.0.1" 2535 - }, 2536 - "engines": { 2537 - "node": ">=16 || 14 >=14.17" 2538 - }, 2539 - "funding": { 2540 - "url": "https://github.com/sponsors/isaacs" 2541 - } 2542 - }, 2543 - "node_modules/eslint-plugin-n": { 2544 - "version": "17.10.3", 2545 - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.10.3.tgz", 2546 - "integrity": "sha512-ySZBfKe49nQZWR1yFaA0v/GsH6Fgp8ah6XV0WDz6CN8WO0ek4McMzb7A2xnf4DCYV43frjCygvb9f/wx7UUxRw==", 2547 - "dev": true, 2548 - "license": "MIT", 2549 - "dependencies": { 2550 - "@eslint-community/eslint-utils": "^4.4.0", 2551 - "enhanced-resolve": "^5.17.0", 2552 - "eslint-plugin-es-x": "^7.5.0", 2553 - "get-tsconfig": "^4.7.0", 2554 - "globals": "^15.8.0", 2555 - "ignore": "^5.2.4", 2556 - "minimatch": "^9.0.5", 2557 - "semver": "^7.5.3" 2558 - }, 2559 - "engines": { 2560 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2561 - }, 2562 - "funding": { 2563 - "url": "https://opencollective.com/eslint" 2564 - }, 2565 - "peerDependencies": { 2566 - "eslint": ">=8.23.0" 2567 - } 2568 - }, 2569 - "node_modules/eslint-plugin-n/node_modules/brace-expansion": { 2570 - "version": "2.0.2", 2571 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 2572 - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 2573 - "dev": true, 2574 - "license": "MIT", 2575 - "dependencies": { 2576 - "balanced-match": "^1.0.0" 2577 - } 2578 - }, 2579 - "node_modules/eslint-plugin-n/node_modules/globals": { 2580 - "version": "15.15.0", 2581 - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", 2582 - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", 2583 - "dev": true, 2584 - "license": "MIT", 2585 - "engines": { 2586 - "node": ">=18" 2587 - }, 2588 - "funding": { 2589 - "url": "https://github.com/sponsors/sindresorhus" 2590 - } 2591 - }, 2592 - "node_modules/eslint-plugin-n/node_modules/minimatch": { 2593 - "version": "9.0.5", 2594 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 2595 - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 2596 - "dev": true, 2597 - "license": "ISC", 2598 - "dependencies": { 2599 - "brace-expansion": "^2.0.1" 2600 - }, 2601 - "engines": { 2602 - "node": ">=16 || 14 >=14.17" 2603 - }, 2604 - "funding": { 2605 - "url": "https://github.com/sponsors/isaacs" 2606 - } 2607 - }, 2608 - "node_modules/eslint-plugin-n/node_modules/semver": { 2609 - "version": "7.7.3", 2610 - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", 2611 - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 2612 - "dev": true, 2613 - "license": "ISC", 2614 - "bin": { 2615 - "semver": "bin/semver.js" 2616 - }, 2617 - "engines": { 2618 - "node": ">=10" 2619 - } 2620 - }, 2621 - "node_modules/eslint-plugin-obsidianmd": { 2622 - "version": "0.1.9", 2623 - "resolved": "https://registry.npmjs.org/eslint-plugin-obsidianmd/-/eslint-plugin-obsidianmd-0.1.9.tgz", 2624 - "integrity": "sha512-/gyo5vky3Y7re4BtT/8MQbHU5Wes4o6VRqas3YmXE7aTCnMsdV0kfzV1GDXJN9Hrsc9UQPoeKUMiapKL0aGE4g==", 2625 - "dev": true, 2626 - "license": "MIT", 2627 - "dependencies": { 2628 - "@microsoft/eslint-plugin-sdl": "^1.1.0", 2629 - "@types/eslint": "8.56.2", 2630 - "@types/node": "20.12.12", 2631 - "eslint": ">=9.0.0 <10.0.0", 2632 - "eslint-plugin-depend": "1.3.1", 2633 - "eslint-plugin-import": "^2.31.0", 2634 - "eslint-plugin-json-schema-validator": "5.1.0", 2635 - "eslint-plugin-security": "2.1.1", 2636 - "globals": "14.0.0", 2637 - "obsidian": "1.8.7", 2638 - "typescript": "5.4.5" 2639 - }, 2640 - "bin": { 2641 - "eslint-plugin-obsidian": "dist/lib/index.js" 2642 - }, 2643 - "engines": { 2644 - "node": ">= 18" 2645 - }, 2646 - "peerDependencies": { 2647 - "@eslint/js": "^9.30.1", 2648 - "@eslint/json": "0.14.0", 2649 - "eslint": ">=9.0.0 <10.0.0", 2650 - "obsidian": "1.8.7", 2651 - "typescript-eslint": "^8.35.1" 2652 - } 2653 - }, 2654 - "node_modules/eslint-plugin-obsidianmd/node_modules/@types/node": { 2655 - "version": "20.12.12", 2656 - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", 2657 - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", 2658 - "dev": true, 2659 - "license": "MIT", 2660 - "dependencies": { 2661 - "undici-types": "~5.26.4" 2662 - } 2663 - }, 2664 - "node_modules/eslint-plugin-obsidianmd/node_modules/obsidian": { 2665 - "version": "1.8.7", 2666 - "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.8.7.tgz", 2667 - "integrity": "sha512-h4bWwNFAGRXlMlMAzdEiIM2ppTGlrh7uGOJS6w4gClrsjc+ei/3YAtU2VdFUlCiPuTHpY4aBpFJJW75S1Tl/JA==", 2668 - "dev": true, 2669 - "license": "MIT", 2670 - "dependencies": { 2671 - "@types/codemirror": "5.60.8", 2672 - "moment": "2.29.4" 2673 - }, 2674 - "peerDependencies": { 2675 - "@codemirror/state": "^6.0.0", 2676 - "@codemirror/view": "^6.0.0" 2677 - } 2678 - }, 2679 - "node_modules/eslint-plugin-obsidianmd/node_modules/typescript": { 2680 - "version": "5.4.5", 2681 - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", 2682 - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", 2683 - "dev": true, 2684 - "license": "Apache-2.0", 2685 - "bin": { 2686 - "tsc": "bin/tsc", 2687 - "tsserver": "bin/tsserver" 2688 - }, 2689 - "engines": { 2690 - "node": ">=14.17" 2691 - } 2692 - }, 2693 - "node_modules/eslint-plugin-react": { 2694 - "version": "7.37.3", 2695 - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", 2696 - "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", 2697 - "dev": true, 2698 - "license": "MIT", 2699 - "dependencies": { 2700 - "array-includes": "^3.1.8", 2701 - "array.prototype.findlast": "^1.2.5", 2702 - "array.prototype.flatmap": "^1.3.3", 2703 - "array.prototype.tosorted": "^1.1.4", 2704 - "doctrine": "^2.1.0", 2705 - "es-iterator-helpers": "^1.2.1", 2706 - "estraverse": "^5.3.0", 2707 - "hasown": "^2.0.2", 2708 - "jsx-ast-utils": "^2.4.1 || ^3.0.0", 2709 - "minimatch": "^3.1.2", 2710 - "object.entries": "^1.1.8", 2711 - "object.fromentries": "^2.0.8", 2712 - "object.values": "^1.2.1", 2713 - "prop-types": "^15.8.1", 2714 - "resolve": "^2.0.0-next.5", 2715 - "semver": "^6.3.1", 2716 - "string.prototype.matchall": "^4.0.12", 2717 - "string.prototype.repeat": "^1.0.0" 2718 - }, 2719 - "engines": { 2720 - "node": ">=4" 2721 - }, 2722 - "peerDependencies": { 2723 - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" 2724 - } 2725 - }, 2726 - "node_modules/eslint-plugin-react/node_modules/resolve": { 2727 - "version": "2.0.0-next.5", 2728 - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", 2729 - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", 2730 - "dev": true, 2731 - "license": "MIT", 2732 - "dependencies": { 2733 - "is-core-module": "^2.13.0", 2734 - "path-parse": "^1.0.7", 2735 - "supports-preserve-symlinks-flag": "^1.0.0" 2736 - }, 2737 - "bin": { 2738 - "resolve": "bin/resolve" 2739 - }, 2740 - "funding": { 2741 - "url": "https://github.com/sponsors/ljharb" 2742 - } 2743 - }, 2744 - "node_modules/eslint-plugin-security": { 2745 - "version": "2.1.1", 2746 - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-2.1.1.tgz", 2747 - "integrity": "sha512-7cspIGj7WTfR3EhaILzAPcfCo5R9FbeWvbgsPYWivSurTBKW88VQxtP3c4aWMG9Hz/GfJlJVdXEJ3c8LqS+u2w==", 2748 - "dev": true, 2749 - "license": "Apache-2.0", 2750 - "dependencies": { 2751 - "safe-regex": "^2.1.1" 2752 - } 2753 - }, 2754 - "node_modules/eslint-scope": { 2755 - "version": "8.4.0", 2756 - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", 2757 - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", 2758 - "dev": true, 2759 - "license": "BSD-2-Clause", 2760 - "dependencies": { 2761 - "esrecurse": "^4.3.0", 2762 - "estraverse": "^5.2.0" 2763 - }, 2764 - "engines": { 2765 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2766 - }, 2767 - "funding": { 2768 - "url": "https://opencollective.com/eslint" 2769 - } 2770 - }, 2771 - "node_modules/eslint-visitor-keys": { 2772 - "version": "4.2.1", 2773 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", 2774 - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", 2775 - "dev": true, 2776 - "license": "Apache-2.0", 2777 - "engines": { 2778 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2779 - }, 2780 - "funding": { 2781 - "url": "https://opencollective.com/eslint" 2782 - } 2783 - }, 2784 - "node_modules/eslint/node_modules/@eslint/js": { 2785 - "version": "9.39.1", 2786 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", 2787 - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", 2788 - "dev": true, 2789 - "license": "MIT", 2790 - "engines": { 2791 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2792 - }, 2793 - "funding": { 2794 - "url": "https://eslint.org/donate" 2795 - } 2796 - }, 2797 - "node_modules/esm-env": { 2798 - "version": "1.2.2", 2799 - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", 2800 - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", 2801 - "license": "MIT" 2802 - }, 2803 - "node_modules/espree": { 2804 - "version": "10.4.0", 2805 - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", 2806 - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", 2807 - "dev": true, 2808 - "license": "BSD-2-Clause", 2809 - "dependencies": { 2810 - "acorn": "^8.15.0", 2811 - "acorn-jsx": "^5.3.2", 2812 - "eslint-visitor-keys": "^4.2.1" 2813 - }, 2814 - "engines": { 2815 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2816 - }, 2817 - "funding": { 2818 - "url": "https://opencollective.com/eslint" 2819 - } 2820 - }, 2821 - "node_modules/esquery": { 2822 - "version": "1.6.0", 2823 - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 2824 - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 2825 - "dev": true, 2826 - "license": "BSD-3-Clause", 2827 - "dependencies": { 2828 - "estraverse": "^5.1.0" 2829 - }, 2830 - "engines": { 2831 - "node": ">=0.10" 2832 - } 2833 - }, 2834 - "node_modules/esrecurse": { 2835 - "version": "4.3.0", 2836 - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 2837 - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2838 - "dev": true, 2839 - "license": "BSD-2-Clause", 2840 - "dependencies": { 2841 - "estraverse": "^5.2.0" 2842 - }, 2843 - "engines": { 2844 - "node": ">=4.0" 2845 - } 2846 - }, 2847 - "node_modules/estraverse": { 2848 - "version": "5.3.0", 2849 - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2850 - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2851 - "dev": true, 2852 - "license": "BSD-2-Clause", 2853 - "engines": { 2854 - "node": ">=4.0" 2855 - } 2856 - }, 2857 - "node_modules/esutils": { 2858 - "version": "2.0.3", 2859 - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2860 - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2861 - "dev": true, 2862 - "license": "BSD-2-Clause", 2863 - "engines": { 2864 - "node": ">=0.10.0" 2865 - } 2866 - }, 2867 - "node_modules/fast-deep-equal": { 2868 - "version": "3.1.3", 2869 - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2870 - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2871 - "dev": true, 2872 - "license": "MIT" 2873 - }, 2874 - "node_modules/fast-glob": { 2875 - "version": "3.3.3", 2876 - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 2877 - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 2878 - "dev": true, 2879 - "license": "MIT", 2880 - "dependencies": { 2881 - "@nodelib/fs.stat": "^2.0.2", 2882 - "@nodelib/fs.walk": "^1.2.3", 2883 - "glob-parent": "^5.1.2", 2884 - "merge2": "^1.3.0", 2885 - "micromatch": "^4.0.8" 2886 - }, 2887 - "engines": { 2888 - "node": ">=8.6.0" 2889 - } 2890 - }, 2891 - "node_modules/fast-glob/node_modules/glob-parent": { 2892 - "version": "5.1.2", 2893 - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2894 - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2895 - "dev": true, 2896 - "license": "ISC", 2897 - "dependencies": { 2898 - "is-glob": "^4.0.1" 2899 - }, 2900 - "engines": { 2901 - "node": ">= 6" 2902 - } 2903 - }, 2904 - "node_modules/fast-json-stable-stringify": { 2905 - "version": "2.1.0", 2906 - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2907 - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2908 - "dev": true, 2909 - "license": "MIT" 2910 - }, 2911 - "node_modules/fast-levenshtein": { 2912 - "version": "2.0.6", 2913 - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2914 - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 2915 - "dev": true, 2916 - "license": "MIT" 2917 - }, 2918 - "node_modules/fast-uri": { 2919 - "version": "3.1.0", 2920 - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", 2921 - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", 2922 - "dev": true, 2923 - "funding": [ 2924 - { 2925 - "type": "github", 2926 - "url": "https://github.com/sponsors/fastify" 2927 - }, 2928 - { 2929 - "type": "opencollective", 2930 - "url": "https://opencollective.com/fastify" 2931 - } 2932 - ], 2933 - "license": "BSD-3-Clause" 2934 - }, 2935 - "node_modules/fastq": { 2936 - "version": "1.19.1", 2937 - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", 2938 - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 2939 - "dev": true, 2940 - "license": "ISC", 2941 - "dependencies": { 2942 - "reusify": "^1.0.4" 2943 - } 2944 - }, 2945 - "node_modules/file-entry-cache": { 2946 - "version": "8.0.0", 2947 - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 2948 - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 2949 - "dev": true, 2950 - "license": "MIT", 2951 - "dependencies": { 2952 - "flat-cache": "^4.0.0" 2953 - }, 2954 - "engines": { 2955 - "node": ">=16.0.0" 2956 - } 2957 - }, 2958 - "node_modules/fill-range": { 2959 - "version": "7.1.1", 2960 - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 2961 - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 2962 - "dev": true, 2963 - "license": "MIT", 2964 - "dependencies": { 2965 - "to-regex-range": "^5.0.1" 2966 - }, 2967 - "engines": { 2968 - "node": ">=8" 2969 - } 2970 - }, 2971 - "node_modules/find-up": { 2972 - "version": "5.0.0", 2973 - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2974 - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2975 - "dev": true, 2976 - "license": "MIT", 2977 - "dependencies": { 2978 - "locate-path": "^6.0.0", 2979 - "path-exists": "^4.0.0" 2980 - }, 2981 - "engines": { 2982 - "node": ">=10" 2983 - }, 2984 - "funding": { 2985 - "url": "https://github.com/sponsors/sindresorhus" 2986 - } 2987 - }, 2988 - "node_modules/flat-cache": { 2989 - "version": "4.0.1", 2990 - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 2991 - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 2992 - "dev": true, 2993 - "license": "MIT", 2994 - "dependencies": { 2995 - "flatted": "^3.2.9", 2996 - "keyv": "^4.5.4" 2997 - }, 2998 - "engines": { 2999 - "node": ">=16" 3000 - } 3001 - }, 3002 - "node_modules/flatted": { 3003 - "version": "3.3.3", 3004 - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 3005 - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 3006 - "dev": true, 3007 - "license": "ISC" 3008 - }, 3009 - "node_modules/for-each": { 3010 - "version": "0.3.5", 3011 - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", 3012 - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", 3013 - "dev": true, 3014 - "license": "MIT", 3015 - "dependencies": { 3016 - "is-callable": "^1.2.7" 3017 - }, 3018 - "engines": { 3019 - "node": ">= 0.4" 3020 - }, 3021 - "funding": { 3022 - "url": "https://github.com/sponsors/ljharb" 3023 - } 3024 - }, 3025 - "node_modules/function-bind": { 3026 - "version": "1.1.2", 3027 - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 3028 - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 3029 - "dev": true, 3030 - "license": "MIT", 3031 - "funding": { 3032 - "url": "https://github.com/sponsors/ljharb" 3033 - } 3034 - }, 3035 - "node_modules/function.prototype.name": { 3036 - "version": "1.1.8", 3037 - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", 3038 - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", 3039 - "dev": true, 3040 - "license": "MIT", 3041 - "dependencies": { 3042 - "call-bind": "^1.0.8", 3043 - "call-bound": "^1.0.3", 3044 - "define-properties": "^1.2.1", 3045 - "functions-have-names": "^1.2.3", 3046 - "hasown": "^2.0.2", 3047 - "is-callable": "^1.2.7" 3048 - }, 3049 - "engines": { 3050 - "node": ">= 0.4" 3051 - }, 3052 - "funding": { 3053 - "url": "https://github.com/sponsors/ljharb" 3054 - } 3055 - }, 3056 - "node_modules/functions-have-names": { 3057 - "version": "1.2.3", 3058 - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 3059 - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 3060 - "dev": true, 3061 - "license": "MIT", 3062 - "funding": { 3063 - "url": "https://github.com/sponsors/ljharb" 3064 - } 3065 - }, 3066 - "node_modules/generator-function": { 3067 - "version": "2.0.1", 3068 - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", 3069 - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", 3070 - "dev": true, 3071 - "license": "MIT", 3072 - "engines": { 3073 - "node": ">= 0.4" 3074 - } 3075 - }, 3076 - "node_modules/get-intrinsic": { 3077 - "version": "1.3.0", 3078 - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 3079 - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 3080 - "dev": true, 3081 - "license": "MIT", 3082 - "dependencies": { 3083 - "call-bind-apply-helpers": "^1.0.2", 3084 - "es-define-property": "^1.0.1", 3085 - "es-errors": "^1.3.0", 3086 - "es-object-atoms": "^1.1.1", 3087 - "function-bind": "^1.1.2", 3088 - "get-proto": "^1.0.1", 3089 - "gopd": "^1.2.0", 3090 - "has-symbols": "^1.1.0", 3091 - "hasown": "^2.0.2", 3092 - "math-intrinsics": "^1.1.0" 3093 - }, 3094 - "engines": { 3095 - "node": ">= 0.4" 3096 - }, 3097 - "funding": { 3098 - "url": "https://github.com/sponsors/ljharb" 3099 - } 3100 - }, 3101 - "node_modules/get-proto": { 3102 - "version": "1.0.1", 3103 - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 3104 - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 3105 - "dev": true, 3106 - "license": "MIT", 3107 - "dependencies": { 3108 - "dunder-proto": "^1.0.1", 3109 - "es-object-atoms": "^1.0.0" 3110 - }, 3111 - "engines": { 3112 - "node": ">= 0.4" 3113 - } 3114 - }, 3115 - "node_modules/get-symbol-description": { 3116 - "version": "1.1.0", 3117 - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", 3118 - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", 3119 - "dev": true, 3120 - "license": "MIT", 3121 - "dependencies": { 3122 - "call-bound": "^1.0.3", 3123 - "es-errors": "^1.3.0", 3124 - "get-intrinsic": "^1.2.6" 3125 - }, 3126 - "engines": { 3127 - "node": ">= 0.4" 3128 - }, 3129 - "funding": { 3130 - "url": "https://github.com/sponsors/ljharb" 3131 - } 3132 - }, 3133 - "node_modules/get-tsconfig": { 3134 - "version": "4.13.0", 3135 - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", 3136 - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", 3137 - "dev": true, 3138 - "license": "MIT", 3139 - "dependencies": { 3140 - "resolve-pkg-maps": "^1.0.0" 3141 - }, 3142 - "funding": { 3143 - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" 3144 - } 3145 - }, 3146 - "node_modules/glob-parent": { 3147 - "version": "6.0.2", 3148 - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 3149 - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 3150 - "dev": true, 3151 - "license": "ISC", 3152 - "dependencies": { 3153 - "is-glob": "^4.0.3" 3154 - }, 3155 - "engines": { 3156 - "node": ">=10.13.0" 3157 - } 3158 - }, 3159 - "node_modules/globals": { 3160 - "version": "14.0.0", 3161 - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 3162 - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 3163 - "dev": true, 3164 - "license": "MIT", 3165 - "engines": { 3166 - "node": ">=18" 3167 - }, 3168 - "funding": { 3169 - "url": "https://github.com/sponsors/sindresorhus" 3170 - } 3171 - }, 3172 - "node_modules/globalthis": { 3173 - "version": "1.0.4", 3174 - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", 3175 - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", 3176 - "dev": true, 3177 - "license": "MIT", 3178 - "dependencies": { 3179 - "define-properties": "^1.2.1", 3180 - "gopd": "^1.0.1" 3181 - }, 3182 - "engines": { 3183 - "node": ">= 0.4" 3184 - }, 3185 - "funding": { 3186 - "url": "https://github.com/sponsors/ljharb" 3187 - } 3188 - }, 3189 - "node_modules/gopd": { 3190 - "version": "1.2.0", 3191 - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 3192 - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 3193 - "dev": true, 3194 - "license": "MIT", 3195 - "engines": { 3196 - "node": ">= 0.4" 3197 - }, 3198 - "funding": { 3199 - "url": "https://github.com/sponsors/ljharb" 3200 - } 3201 - }, 3202 - "node_modules/graceful-fs": { 3203 - "version": "4.2.11", 3204 - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 3205 - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 3206 - "dev": true, 3207 - "license": "ISC" 3208 - }, 3209 - "node_modules/graphemer": { 3210 - "version": "1.4.0", 3211 - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 3212 - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 3213 - "dev": true, 3214 - "license": "MIT" 3215 - }, 3216 - "node_modules/has-bigints": { 3217 - "version": "1.1.0", 3218 - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", 3219 - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", 3220 - "dev": true, 3221 - "license": "MIT", 3222 - "engines": { 3223 - "node": ">= 0.4" 3224 - }, 3225 - "funding": { 3226 - "url": "https://github.com/sponsors/ljharb" 3227 - } 3228 - }, 3229 - "node_modules/has-flag": { 3230 - "version": "4.0.0", 3231 - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 3232 - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 3233 - "dev": true, 3234 - "license": "MIT", 3235 - "engines": { 3236 - "node": ">=8" 3237 - } 3238 - }, 3239 - "node_modules/has-property-descriptors": { 3240 - "version": "1.0.2", 3241 - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 3242 - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 3243 - "dev": true, 3244 - "license": "MIT", 3245 - "dependencies": { 3246 - "es-define-property": "^1.0.0" 3247 - }, 3248 - "funding": { 3249 - "url": "https://github.com/sponsors/ljharb" 3250 - } 3251 - }, 3252 - "node_modules/has-proto": { 3253 - "version": "1.2.0", 3254 - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", 3255 - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", 3256 - "dev": true, 3257 - "license": "MIT", 3258 - "dependencies": { 3259 - "dunder-proto": "^1.0.0" 3260 - }, 3261 - "engines": { 3262 - "node": ">= 0.4" 3263 - }, 3264 - "funding": { 3265 - "url": "https://github.com/sponsors/ljharb" 3266 - } 3267 - }, 3268 - "node_modules/has-symbols": { 3269 - "version": "1.1.0", 3270 - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 3271 - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 3272 - "dev": true, 3273 - "license": "MIT", 3274 - "engines": { 3275 - "node": ">= 0.4" 3276 - }, 3277 - "funding": { 3278 - "url": "https://github.com/sponsors/ljharb" 3279 - } 3280 - }, 3281 - "node_modules/has-tostringtag": { 3282 - "version": "1.0.2", 3283 - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 3284 - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 3285 - "dev": true, 3286 - "license": "MIT", 3287 - "dependencies": { 3288 - "has-symbols": "^1.0.3" 3289 - }, 3290 - "engines": { 3291 - "node": ">= 0.4" 3292 - }, 3293 - "funding": { 3294 - "url": "https://github.com/sponsors/ljharb" 3295 - } 3296 - }, 3297 - "node_modules/hasown": { 3298 - "version": "2.0.2", 3299 - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 3300 - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 3301 - "dev": true, 3302 - "license": "MIT", 3303 - "dependencies": { 3304 - "function-bind": "^1.1.2" 3305 - }, 3306 - "engines": { 3307 - "node": ">= 0.4" 3308 - } 3309 - }, 3310 - "node_modules/ignore": { 3311 - "version": "5.3.2", 3312 - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 3313 - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 3314 - "dev": true, 3315 - "license": "MIT", 3316 - "engines": { 3317 - "node": ">= 4" 3318 - } 3319 - }, 3320 - "node_modules/import-fresh": { 3321 - "version": "3.3.1", 3322 - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 3323 - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 3324 - "dev": true, 3325 - "license": "MIT", 3326 - "dependencies": { 3327 - "parent-module": "^1.0.0", 3328 - "resolve-from": "^4.0.0" 3329 - }, 3330 - "engines": { 3331 - "node": ">=6" 3332 - }, 3333 - "funding": { 3334 - "url": "https://github.com/sponsors/sindresorhus" 3335 - } 3336 - }, 3337 - "node_modules/imurmurhash": { 3338 - "version": "0.1.4", 3339 - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 3340 - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 3341 - "dev": true, 3342 - "license": "MIT", 3343 - "engines": { 3344 - "node": ">=0.8.19" 3345 - } 3346 - }, 3347 - "node_modules/internal-slot": { 3348 - "version": "1.1.0", 3349 - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", 3350 - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", 3351 - "dev": true, 3352 - "license": "MIT", 3353 - "dependencies": { 3354 - "es-errors": "^1.3.0", 3355 - "hasown": "^2.0.2", 3356 - "side-channel": "^1.1.0" 3357 - }, 3358 - "engines": { 3359 - "node": ">= 0.4" 3360 - } 3361 - }, 3362 - "node_modules/is-array-buffer": { 3363 - "version": "3.0.5", 3364 - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", 3365 - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", 3366 - "dev": true, 3367 - "license": "MIT", 3368 - "dependencies": { 3369 - "call-bind": "^1.0.8", 3370 - "call-bound": "^1.0.3", 3371 - "get-intrinsic": "^1.2.6" 3372 - }, 3373 - "engines": { 3374 - "node": ">= 0.4" 3375 - }, 3376 - "funding": { 3377 - "url": "https://github.com/sponsors/ljharb" 3378 - } 3379 - }, 3380 - "node_modules/is-async-function": { 3381 - "version": "2.1.1", 3382 - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", 3383 - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", 3384 - "dev": true, 3385 - "license": "MIT", 3386 - "dependencies": { 3387 - "async-function": "^1.0.0", 3388 - "call-bound": "^1.0.3", 3389 - "get-proto": "^1.0.1", 3390 - "has-tostringtag": "^1.0.2", 3391 - "safe-regex-test": "^1.1.0" 3392 - }, 3393 - "engines": { 3394 - "node": ">= 0.4" 3395 - }, 3396 - "funding": { 3397 - "url": "https://github.com/sponsors/ljharb" 3398 - } 3399 - }, 3400 - "node_modules/is-bigint": { 3401 - "version": "1.1.0", 3402 - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", 3403 - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", 3404 - "dev": true, 3405 - "license": "MIT", 3406 - "dependencies": { 3407 - "has-bigints": "^1.0.2" 3408 - }, 3409 - "engines": { 3410 - "node": ">= 0.4" 3411 - }, 3412 - "funding": { 3413 - "url": "https://github.com/sponsors/ljharb" 3414 - } 3415 - }, 3416 - "node_modules/is-boolean-object": { 3417 - "version": "1.2.2", 3418 - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", 3419 - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", 3420 - "dev": true, 3421 - "license": "MIT", 3422 - "dependencies": { 3423 - "call-bound": "^1.0.3", 3424 - "has-tostringtag": "^1.0.2" 3425 - }, 3426 - "engines": { 3427 - "node": ">= 0.4" 3428 - }, 3429 - "funding": { 3430 - "url": "https://github.com/sponsors/ljharb" 3431 - } 3432 - }, 3433 - "node_modules/is-callable": { 3434 - "version": "1.2.7", 3435 - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 3436 - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 3437 - "dev": true, 3438 - "license": "MIT", 3439 - "engines": { 3440 - "node": ">= 0.4" 3441 - }, 3442 - "funding": { 3443 - "url": "https://github.com/sponsors/ljharb" 3444 - } 3445 - }, 3446 - "node_modules/is-core-module": { 3447 - "version": "2.16.1", 3448 - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 3449 - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 3450 - "dev": true, 3451 - "license": "MIT", 3452 - "dependencies": { 3453 - "hasown": "^2.0.2" 3454 - }, 3455 - "engines": { 3456 - "node": ">= 0.4" 3457 - }, 3458 - "funding": { 3459 - "url": "https://github.com/sponsors/ljharb" 3460 - } 3461 - }, 3462 - "node_modules/is-data-view": { 3463 - "version": "1.0.2", 3464 - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", 3465 - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", 3466 - "dev": true, 3467 - "license": "MIT", 3468 - "dependencies": { 3469 - "call-bound": "^1.0.2", 3470 - "get-intrinsic": "^1.2.6", 3471 - "is-typed-array": "^1.1.13" 3472 - }, 3473 - "engines": { 3474 - "node": ">= 0.4" 3475 - }, 3476 - "funding": { 3477 - "url": "https://github.com/sponsors/ljharb" 3478 - } 3479 - }, 3480 - "node_modules/is-date-object": { 3481 - "version": "1.1.0", 3482 - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", 3483 - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", 3484 - "dev": true, 3485 - "license": "MIT", 3486 - "dependencies": { 3487 - "call-bound": "^1.0.2", 3488 - "has-tostringtag": "^1.0.2" 3489 - }, 3490 - "engines": { 3491 - "node": ">= 0.4" 3492 - }, 3493 - "funding": { 3494 - "url": "https://github.com/sponsors/ljharb" 3495 - } 3496 - }, 3497 - "node_modules/is-extglob": { 3498 - "version": "2.1.1", 3499 - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 3500 - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 3501 - "dev": true, 3502 - "license": "MIT", 3503 - "engines": { 3504 - "node": ">=0.10.0" 3505 - } 3506 - }, 3507 - "node_modules/is-finalizationregistry": { 3508 - "version": "1.1.1", 3509 - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", 3510 - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", 3511 - "dev": true, 3512 - "license": "MIT", 3513 - "dependencies": { 3514 - "call-bound": "^1.0.3" 3515 - }, 3516 - "engines": { 3517 - "node": ">= 0.4" 3518 - }, 3519 - "funding": { 3520 - "url": "https://github.com/sponsors/ljharb" 3521 - } 3522 - }, 3523 - "node_modules/is-generator-function": { 3524 - "version": "1.1.2", 3525 - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", 3526 - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", 3527 - "dev": true, 3528 - "license": "MIT", 3529 - "dependencies": { 3530 - "call-bound": "^1.0.4", 3531 - "generator-function": "^2.0.0", 3532 - "get-proto": "^1.0.1", 3533 - "has-tostringtag": "^1.0.2", 3534 - "safe-regex-test": "^1.1.0" 3535 - }, 3536 - "engines": { 3537 - "node": ">= 0.4" 3538 - }, 3539 - "funding": { 3540 - "url": "https://github.com/sponsors/ljharb" 3541 - } 3542 - }, 3543 - "node_modules/is-glob": { 3544 - "version": "4.0.3", 3545 - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 3546 - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 3547 - "dev": true, 3548 - "license": "MIT", 3549 - "dependencies": { 3550 - "is-extglob": "^2.1.1" 3551 - }, 3552 - "engines": { 3553 - "node": ">=0.10.0" 3554 - } 3555 - }, 3556 - "node_modules/is-map": { 3557 - "version": "2.0.3", 3558 - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", 3559 - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", 3560 - "dev": true, 3561 - "license": "MIT", 3562 - "engines": { 3563 - "node": ">= 0.4" 3564 - }, 3565 - "funding": { 3566 - "url": "https://github.com/sponsors/ljharb" 3567 - } 3568 - }, 3569 - "node_modules/is-negative-zero": { 3570 - "version": "2.0.3", 3571 - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", 3572 - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", 3573 - "dev": true, 3574 - "license": "MIT", 3575 - "engines": { 3576 - "node": ">= 0.4" 3577 - }, 3578 - "funding": { 3579 - "url": "https://github.com/sponsors/ljharb" 3580 - } 3581 - }, 3582 - "node_modules/is-number": { 3583 - "version": "7.0.0", 3584 - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 3585 - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 3586 - "dev": true, 3587 - "license": "MIT", 3588 - "engines": { 3589 - "node": ">=0.12.0" 3590 - } 3591 - }, 3592 - "node_modules/is-number-object": { 3593 - "version": "1.1.1", 3594 - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", 3595 - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", 3596 - "dev": true, 3597 - "license": "MIT", 3598 - "dependencies": { 3599 - "call-bound": "^1.0.3", 3600 - "has-tostringtag": "^1.0.2" 3601 - }, 3602 - "engines": { 3603 - "node": ">= 0.4" 3604 - }, 3605 - "funding": { 3606 - "url": "https://github.com/sponsors/ljharb" 3607 - } 3608 - }, 3609 - "node_modules/is-regex": { 3610 - "version": "1.2.1", 3611 - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", 3612 - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", 3613 - "dev": true, 3614 - "license": "MIT", 3615 - "dependencies": { 3616 - "call-bound": "^1.0.2", 3617 - "gopd": "^1.2.0", 3618 - "has-tostringtag": "^1.0.2", 3619 - "hasown": "^2.0.2" 3620 - }, 3621 - "engines": { 3622 - "node": ">= 0.4" 3623 - }, 3624 - "funding": { 3625 - "url": "https://github.com/sponsors/ljharb" 3626 - } 3627 - }, 3628 - "node_modules/is-set": { 3629 - "version": "2.0.3", 3630 - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", 3631 - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", 3632 - "dev": true, 3633 - "license": "MIT", 3634 - "engines": { 3635 - "node": ">= 0.4" 3636 - }, 3637 - "funding": { 3638 - "url": "https://github.com/sponsors/ljharb" 3639 - } 3640 - }, 3641 - "node_modules/is-shared-array-buffer": { 3642 - "version": "1.0.4", 3643 - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", 3644 - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", 3645 - "dev": true, 3646 - "license": "MIT", 3647 - "dependencies": { 3648 - "call-bound": "^1.0.3" 3649 - }, 3650 - "engines": { 3651 - "node": ">= 0.4" 3652 - }, 3653 - "funding": { 3654 - "url": "https://github.com/sponsors/ljharb" 3655 - } 3656 - }, 3657 - "node_modules/is-string": { 3658 - "version": "1.1.1", 3659 - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", 3660 - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", 3661 - "dev": true, 3662 - "license": "MIT", 3663 - "dependencies": { 3664 - "call-bound": "^1.0.3", 3665 - "has-tostringtag": "^1.0.2" 3666 - }, 3667 - "engines": { 3668 - "node": ">= 0.4" 3669 - }, 3670 - "funding": { 3671 - "url": "https://github.com/sponsors/ljharb" 3672 - } 3673 - }, 3674 - "node_modules/is-symbol": { 3675 - "version": "1.1.1", 3676 - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", 3677 - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", 3678 - "dev": true, 3679 - "license": "MIT", 3680 - "dependencies": { 3681 - "call-bound": "^1.0.2", 3682 - "has-symbols": "^1.1.0", 3683 - "safe-regex-test": "^1.1.0" 3684 - }, 3685 - "engines": { 3686 - "node": ">= 0.4" 3687 - }, 3688 - "funding": { 3689 - "url": "https://github.com/sponsors/ljharb" 3690 - } 3691 - }, 3692 - "node_modules/is-typed-array": { 3693 - "version": "1.1.15", 3694 - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", 3695 - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", 3696 - "dev": true, 3697 - "license": "MIT", 3698 - "dependencies": { 3699 - "which-typed-array": "^1.1.16" 3700 - }, 3701 - "engines": { 3702 - "node": ">= 0.4" 3703 - }, 3704 - "funding": { 3705 - "url": "https://github.com/sponsors/ljharb" 3706 - } 3707 - }, 3708 - "node_modules/is-weakmap": { 3709 - "version": "2.0.2", 3710 - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", 3711 - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", 3712 - "dev": true, 3713 - "license": "MIT", 3714 - "engines": { 3715 - "node": ">= 0.4" 3716 - }, 3717 - "funding": { 3718 - "url": "https://github.com/sponsors/ljharb" 3719 - } 3720 - }, 3721 - "node_modules/is-weakref": { 3722 - "version": "1.1.1", 3723 - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", 3724 - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", 3725 - "dev": true, 3726 - "license": "MIT", 3727 - "dependencies": { 3728 - "call-bound": "^1.0.3" 3729 - }, 3730 - "engines": { 3731 - "node": ">= 0.4" 3732 - }, 3733 - "funding": { 3734 - "url": "https://github.com/sponsors/ljharb" 3735 - } 3736 - }, 3737 - "node_modules/is-weakset": { 3738 - "version": "2.0.4", 3739 - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", 3740 - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", 3741 - "dev": true, 3742 - "license": "MIT", 3743 - "dependencies": { 3744 - "call-bound": "^1.0.3", 3745 - "get-intrinsic": "^1.2.6" 3746 - }, 3747 - "engines": { 3748 - "node": ">= 0.4" 3749 - }, 3750 - "funding": { 3751 - "url": "https://github.com/sponsors/ljharb" 3752 - } 3753 - }, 3754 - "node_modules/isarray": { 3755 - "version": "2.0.5", 3756 - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 3757 - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 3758 - "dev": true, 3759 - "license": "MIT" 3760 - }, 3761 - "node_modules/isexe": { 3762 - "version": "2.0.0", 3763 - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 3764 - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 3765 - "dev": true, 3766 - "license": "ISC" 3767 - }, 3768 - "node_modules/iterator.prototype": { 3769 - "version": "1.1.5", 3770 - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", 3771 - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", 3772 - "dev": true, 3773 - "license": "MIT", 3774 - "dependencies": { 3775 - "define-data-property": "^1.1.4", 3776 - "es-object-atoms": "^1.0.0", 3777 - "get-intrinsic": "^1.2.6", 3778 - "get-proto": "^1.0.0", 3779 - "has-symbols": "^1.1.0", 3780 - "set-function-name": "^2.0.2" 3781 - }, 3782 - "engines": { 3783 - "node": ">= 0.4" 3784 - } 3785 - }, 3786 - "node_modules/jiti": { 3787 - "version": "2.6.1", 3788 - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", 3789 - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", 3790 - "dev": true, 3791 - "license": "MIT", 3792 - "peer": true, 3793 - "bin": { 3794 - "jiti": "lib/jiti-cli.mjs" 3795 - } 3796 - }, 3797 - "node_modules/js-tokens": { 3798 - "version": "4.0.0", 3799 - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 3800 - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 3801 - "dev": true, 3802 - "license": "MIT" 3803 - }, 3804 - "node_modules/js-yaml": { 3805 - "version": "4.1.1", 3806 - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", 3807 - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", 3808 - "dev": true, 3809 - "license": "MIT", 3810 - "dependencies": { 3811 - "argparse": "^2.0.1" 3812 - }, 3813 - "bin": { 3814 - "js-yaml": "bin/js-yaml.js" 3815 - } 3816 - }, 3817 - "node_modules/json-buffer": { 3818 - "version": "3.0.1", 3819 - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 3820 - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 3821 - "dev": true, 3822 - "license": "MIT" 3823 - }, 3824 - "node_modules/json-schema-migrate": { 3825 - "version": "2.0.0", 3826 - "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", 3827 - "integrity": "sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ==", 3828 - "dev": true, 3829 - "license": "MIT", 3830 - "dependencies": { 3831 - "ajv": "^8.0.0" 3832 - } 3833 - }, 3834 - "node_modules/json-schema-migrate/node_modules/ajv": { 3835 - "version": "8.17.1", 3836 - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", 3837 - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", 3838 - "dev": true, 3839 - "license": "MIT", 3840 - "dependencies": { 3841 - "fast-deep-equal": "^3.1.3", 3842 - "fast-uri": "^3.0.1", 3843 - "json-schema-traverse": "^1.0.0", 3844 - "require-from-string": "^2.0.2" 3845 - }, 3846 - "funding": { 3847 - "type": "github", 3848 - "url": "https://github.com/sponsors/epoberezkin" 3849 - } 3850 - }, 3851 - "node_modules/json-schema-migrate/node_modules/json-schema-traverse": { 3852 - "version": "1.0.0", 3853 - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 3854 - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 3855 - "dev": true, 3856 - "license": "MIT" 3857 - }, 3858 - "node_modules/json-schema-traverse": { 3859 - "version": "0.4.1", 3860 - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 3861 - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 3862 - "dev": true, 3863 - "license": "MIT" 3864 - }, 3865 - "node_modules/json-stable-stringify-without-jsonify": { 3866 - "version": "1.0.1", 3867 - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 3868 - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 3869 - "dev": true, 3870 - "license": "MIT" 3871 - }, 3872 - "node_modules/json5": { 3873 - "version": "1.0.2", 3874 - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", 3875 - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", 3876 - "dev": true, 3877 - "license": "MIT", 3878 - "dependencies": { 3879 - "minimist": "^1.2.0" 3880 - }, 3881 - "bin": { 3882 - "json5": "lib/cli.js" 3883 - } 3884 - }, 3885 - "node_modules/jsonc-eslint-parser": { 3886 - "version": "2.4.1", 3887 - "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.1.tgz", 3888 - "integrity": "sha512-uuPNLJkKN8NXAlZlQ6kmUF9qO+T6Kyd7oV4+/7yy8Jz6+MZNyhPq8EdLpdfnPVzUC8qSf1b4j1azKaGnFsjmsw==", 3889 - "dev": true, 3890 - "license": "MIT", 3891 - "dependencies": { 3892 - "acorn": "^8.5.0", 3893 - "eslint-visitor-keys": "^3.0.0", 3894 - "espree": "^9.0.0", 3895 - "semver": "^7.3.5" 3896 - }, 3897 - "engines": { 3898 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3899 - }, 3900 - "funding": { 3901 - "url": "https://github.com/sponsors/ota-meshi" 3902 - } 3903 - }, 3904 - "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { 3905 - "version": "3.4.3", 3906 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 3907 - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 3908 - "dev": true, 3909 - "license": "Apache-2.0", 3910 - "engines": { 3911 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3912 - }, 3913 - "funding": { 3914 - "url": "https://opencollective.com/eslint" 3915 - } 3916 - }, 3917 - "node_modules/jsonc-eslint-parser/node_modules/espree": { 3918 - "version": "9.6.1", 3919 - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 3920 - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 3921 - "dev": true, 3922 - "license": "BSD-2-Clause", 3923 - "dependencies": { 3924 - "acorn": "^8.9.0", 3925 - "acorn-jsx": "^5.3.2", 3926 - "eslint-visitor-keys": "^3.4.1" 3927 - }, 3928 - "engines": { 3929 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 3930 - }, 3931 - "funding": { 3932 - "url": "https://opencollective.com/eslint" 3933 - } 3934 - }, 3935 - "node_modules/jsonc-eslint-parser/node_modules/semver": { 3936 - "version": "7.7.3", 3937 - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", 3938 - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 3939 - "dev": true, 3940 - "license": "ISC", 3941 - "bin": { 3942 - "semver": "bin/semver.js" 3943 - }, 3944 - "engines": { 3945 - "node": ">=10" 3946 - } 3947 - }, 3948 - "node_modules/jsx-ast-utils": { 3949 - "version": "3.3.5", 3950 - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", 3951 - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", 3952 - "dev": true, 3953 - "license": "MIT", 3954 - "dependencies": { 3955 - "array-includes": "^3.1.6", 3956 - "array.prototype.flat": "^1.3.1", 3957 - "object.assign": "^4.1.4", 3958 - "object.values": "^1.1.6" 3959 - }, 3960 - "engines": { 3961 - "node": ">=4.0" 3962 - } 3963 - }, 3964 - "node_modules/keyv": { 3965 - "version": "4.5.4", 3966 - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 3967 - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 3968 - "dev": true, 3969 - "license": "MIT", 3970 - "dependencies": { 3971 - "json-buffer": "3.0.1" 3972 - } 3973 - }, 3974 - "node_modules/levn": { 3975 - "version": "0.4.1", 3976 - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 3977 - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 3978 - "dev": true, 3979 - "license": "MIT", 3980 - "dependencies": { 3981 - "prelude-ls": "^1.2.1", 3982 - "type-check": "~0.4.0" 3983 - }, 3984 - "engines": { 3985 - "node": ">= 0.8.0" 3986 - } 3987 - }, 3988 - "node_modules/locate-path": { 3989 - "version": "6.0.0", 3990 - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 3991 - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 3992 - "dev": true, 3993 - "license": "MIT", 3994 - "dependencies": { 3995 - "p-locate": "^5.0.0" 3996 - }, 3997 - "engines": { 3998 - "node": ">=10" 3999 - }, 4000 - "funding": { 4001 - "url": "https://github.com/sponsors/sindresorhus" 4002 - } 4003 - }, 4004 - "node_modules/lodash.merge": { 4005 - "version": "4.6.2", 4006 - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 4007 - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 4008 - "dev": true, 4009 - "license": "MIT" 4010 - }, 4011 - "node_modules/loose-envify": { 4012 - "version": "1.4.0", 4013 - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 4014 - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 4015 - "dev": true, 4016 - "license": "MIT", 4017 - "dependencies": { 4018 - "js-tokens": "^3.0.0 || ^4.0.0" 4019 - }, 4020 - "bin": { 4021 - "loose-envify": "cli.js" 4022 - } 4023 - }, 4024 - "node_modules/math-intrinsics": { 4025 - "version": "1.1.0", 4026 - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 4027 - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 4028 - "dev": true, 4029 - "license": "MIT", 4030 - "engines": { 4031 - "node": ">= 0.4" 4032 - } 4033 - }, 4034 - "node_modules/merge2": { 4035 - "version": "1.4.1", 4036 - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 4037 - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 4038 - "dev": true, 4039 - "license": "MIT", 4040 - "engines": { 4041 - "node": ">= 8" 4042 - } 4043 - }, 4044 - "node_modules/micromatch": { 4045 - "version": "4.0.8", 4046 - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 4047 - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 4048 - "dev": true, 4049 - "license": "MIT", 4050 - "dependencies": { 4051 - "braces": "^3.0.3", 4052 - "picomatch": "^2.3.1" 4053 - }, 4054 - "engines": { 4055 - "node": ">=8.6" 4056 - } 4057 - }, 4058 - "node_modules/minimatch": { 4059 - "version": "3.1.2", 4060 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 4061 - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 4062 - "dev": true, 4063 - "license": "ISC", 4064 - "dependencies": { 4065 - "brace-expansion": "^1.1.7" 4066 - }, 4067 - "engines": { 4068 - "node": "*" 4069 - } 4070 - }, 4071 - "node_modules/minimist": { 4072 - "version": "1.2.8", 4073 - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 4074 - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 4075 - "dev": true, 4076 - "license": "MIT", 4077 - "funding": { 4078 - "url": "https://github.com/sponsors/ljharb" 4079 - } 4080 - }, 4081 - "node_modules/module-replacements": { 4082 - "version": "2.10.1", 4083 - "resolved": "https://registry.npmjs.org/module-replacements/-/module-replacements-2.10.1.tgz", 4084 - "integrity": "sha512-qkKuLpMHDqRSM676OPL7HUpCiiP3NSxgf8NNR1ga2h/iJLNKTsOSjMEwrcT85DMSti2vmOqxknOVBGWj6H6etQ==", 4085 - "dev": true, 4086 - "license": "MIT" 4087 - }, 4088 - "node_modules/moment": { 4089 - "version": "2.29.4", 4090 - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 4091 - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", 4092 - "license": "MIT", 4093 - "engines": { 4094 - "node": "*" 4095 - } 4096 - }, 4097 - "node_modules/ms": { 4098 - "version": "2.1.3", 4099 - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 4100 - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 4101 - "dev": true, 4102 - "license": "MIT" 4103 - }, 4104 - "node_modules/nanoid": { 4105 - "version": "5.1.6", 4106 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", 4107 - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", 4108 - "funding": [ 4109 - { 4110 - "type": "github", 4111 - "url": "https://github.com/sponsors/ai" 4112 - } 4113 - ], 4114 - "license": "MIT", 4115 - "bin": { 4116 - "nanoid": "bin/nanoid.js" 4117 - }, 4118 - "engines": { 4119 - "node": "^18 || >=20" 4120 - } 4121 - }, 4122 - "node_modules/natural-compare": { 4123 - "version": "1.4.0", 4124 - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 4125 - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 4126 - "dev": true, 4127 - "license": "MIT" 4128 - }, 4129 - "node_modules/object-assign": { 4130 - "version": "4.1.1", 4131 - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 4132 - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 4133 - "dev": true, 4134 - "license": "MIT", 4135 - "engines": { 4136 - "node": ">=0.10.0" 4137 - } 4138 - }, 4139 - "node_modules/object-inspect": { 4140 - "version": "1.13.4", 4141 - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 4142 - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 4143 - "dev": true, 4144 - "license": "MIT", 4145 - "engines": { 4146 - "node": ">= 0.4" 4147 - }, 4148 - "funding": { 4149 - "url": "https://github.com/sponsors/ljharb" 4150 - } 4151 - }, 4152 - "node_modules/object-keys": { 4153 - "version": "1.1.1", 4154 - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 4155 - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 4156 - "dev": true, 4157 - "license": "MIT", 4158 - "engines": { 4159 - "node": ">= 0.4" 4160 - } 4161 - }, 4162 - "node_modules/object.assign": { 4163 - "version": "4.1.7", 4164 - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", 4165 - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", 4166 - "dev": true, 4167 - "license": "MIT", 4168 - "dependencies": { 4169 - "call-bind": "^1.0.8", 4170 - "call-bound": "^1.0.3", 4171 - "define-properties": "^1.2.1", 4172 - "es-object-atoms": "^1.0.0", 4173 - "has-symbols": "^1.1.0", 4174 - "object-keys": "^1.1.1" 4175 - }, 4176 - "engines": { 4177 - "node": ">= 0.4" 4178 - }, 4179 - "funding": { 4180 - "url": "https://github.com/sponsors/ljharb" 4181 - } 4182 - }, 4183 - "node_modules/object.entries": { 4184 - "version": "1.1.9", 4185 - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", 4186 - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", 4187 - "dev": true, 4188 - "license": "MIT", 4189 - "dependencies": { 4190 - "call-bind": "^1.0.8", 4191 - "call-bound": "^1.0.4", 4192 - "define-properties": "^1.2.1", 4193 - "es-object-atoms": "^1.1.1" 4194 - }, 4195 - "engines": { 4196 - "node": ">= 0.4" 4197 - } 4198 - }, 4199 - "node_modules/object.fromentries": { 4200 - "version": "2.0.8", 4201 - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", 4202 - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", 4203 - "dev": true, 4204 - "license": "MIT", 4205 - "dependencies": { 4206 - "call-bind": "^1.0.7", 4207 - "define-properties": "^1.2.1", 4208 - "es-abstract": "^1.23.2", 4209 - "es-object-atoms": "^1.0.0" 4210 - }, 4211 - "engines": { 4212 - "node": ">= 0.4" 4213 - }, 4214 - "funding": { 4215 - "url": "https://github.com/sponsors/ljharb" 4216 - } 4217 - }, 4218 - "node_modules/object.groupby": { 4219 - "version": "1.0.3", 4220 - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", 4221 - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", 4222 - "dev": true, 4223 - "license": "MIT", 4224 - "dependencies": { 4225 - "call-bind": "^1.0.7", 4226 - "define-properties": "^1.2.1", 4227 - "es-abstract": "^1.23.2" 4228 - }, 4229 - "engines": { 4230 - "node": ">= 0.4" 4231 - } 4232 - }, 4233 - "node_modules/object.values": { 4234 - "version": "1.2.1", 4235 - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", 4236 - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", 4237 - "dev": true, 4238 - "license": "MIT", 4239 - "dependencies": { 4240 - "call-bind": "^1.0.8", 4241 - "call-bound": "^1.0.3", 4242 - "define-properties": "^1.2.1", 4243 - "es-object-atoms": "^1.0.0" 4244 - }, 4245 - "engines": { 4246 - "node": ">= 0.4" 4247 - }, 4248 - "funding": { 4249 - "url": "https://github.com/sponsors/ljharb" 4250 - } 4251 - }, 4252 - "node_modules/obsidian": { 4253 - "version": "1.10.3", 4254 - "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.10.3.tgz", 4255 - "integrity": "sha512-VP+ZSxNMG7y6Z+sU9WqLvJAskCfkFrTz2kFHWmmzis+C+4+ELjk/sazwcTHrHXNZlgCeo8YOlM6SOrAFCynNew==", 4256 - "license": "MIT", 4257 - "dependencies": { 4258 - "@types/codemirror": "5.60.8", 4259 - "moment": "2.29.4" 4260 - }, 4261 - "peerDependencies": { 4262 - "@codemirror/state": "6.5.0", 4263 - "@codemirror/view": "6.38.6" 4264 - } 4265 - }, 4266 - "node_modules/optionator": { 4267 - "version": "0.9.4", 4268 - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 4269 - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 4270 - "dev": true, 4271 - "license": "MIT", 4272 - "dependencies": { 4273 - "deep-is": "^0.1.3", 4274 - "fast-levenshtein": "^2.0.6", 4275 - "levn": "^0.4.1", 4276 - "prelude-ls": "^1.2.1", 4277 - "type-check": "^0.4.0", 4278 - "word-wrap": "^1.2.5" 4279 - }, 4280 - "engines": { 4281 - "node": ">= 0.8.0" 4282 - } 4283 - }, 4284 - "node_modules/own-keys": { 4285 - "version": "1.0.1", 4286 - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", 4287 - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", 4288 - "dev": true, 4289 - "license": "MIT", 4290 - "dependencies": { 4291 - "get-intrinsic": "^1.2.6", 4292 - "object-keys": "^1.1.1", 4293 - "safe-push-apply": "^1.0.0" 4294 - }, 4295 - "engines": { 4296 - "node": ">= 0.4" 4297 - }, 4298 - "funding": { 4299 - "url": "https://github.com/sponsors/ljharb" 4300 - } 4301 - }, 4302 - "node_modules/p-limit": { 4303 - "version": "3.1.0", 4304 - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 4305 - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 4306 - "dev": true, 4307 - "license": "MIT", 4308 - "dependencies": { 4309 - "yocto-queue": "^0.1.0" 4310 - }, 4311 - "engines": { 4312 - "node": ">=10" 4313 - }, 4314 - "funding": { 4315 - "url": "https://github.com/sponsors/sindresorhus" 4316 - } 4317 - }, 4318 - "node_modules/p-locate": { 4319 - "version": "5.0.0", 4320 - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 4321 - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 4322 - "dev": true, 4323 - "license": "MIT", 4324 - "dependencies": { 4325 - "p-limit": "^3.0.2" 4326 - }, 4327 - "engines": { 4328 - "node": ">=10" 4329 - }, 4330 - "funding": { 4331 - "url": "https://github.com/sponsors/sindresorhus" 4332 - } 4333 - }, 4334 - "node_modules/parent-module": { 4335 - "version": "1.0.1", 4336 - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 4337 - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 4338 - "dev": true, 4339 - "license": "MIT", 4340 - "dependencies": { 4341 - "callsites": "^3.0.0" 4342 - }, 4343 - "engines": { 4344 - "node": ">=6" 4345 - } 4346 - }, 4347 - "node_modules/path-exists": { 4348 - "version": "4.0.0", 4349 - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 4350 - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 4351 - "dev": true, 4352 - "license": "MIT", 4353 - "engines": { 4354 - "node": ">=8" 4355 - } 4356 - }, 4357 - "node_modules/path-key": { 4358 - "version": "3.1.1", 4359 - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 4360 - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 4361 - "dev": true, 4362 - "license": "MIT", 4363 - "engines": { 4364 - "node": ">=8" 4365 - } 4366 - }, 4367 - "node_modules/path-parse": { 4368 - "version": "1.0.7", 4369 - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 4370 - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 4371 - "dev": true, 4372 - "license": "MIT" 4373 - }, 4374 - "node_modules/picocolors": { 4375 - "version": "1.1.1", 4376 - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 4377 - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 4378 - "license": "ISC" 4379 - }, 4380 - "node_modules/picomatch": { 4381 - "version": "2.3.1", 4382 - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 4383 - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 4384 - "dev": true, 4385 - "license": "MIT", 4386 - "engines": { 4387 - "node": ">=8.6" 4388 - }, 4389 - "funding": { 4390 - "url": "https://github.com/sponsors/jonschlinkert" 4391 - } 4392 - }, 4393 - "node_modules/possible-typed-array-names": { 4394 - "version": "1.1.0", 4395 - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", 4396 - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", 4397 - "dev": true, 4398 - "license": "MIT", 4399 - "engines": { 4400 - "node": ">= 0.4" 4401 - } 4402 - }, 4403 - "node_modules/prelude-ls": { 4404 - "version": "1.2.1", 4405 - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 4406 - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 4407 - "dev": true, 4408 - "license": "MIT", 4409 - "engines": { 4410 - "node": ">= 0.8.0" 4411 - } 4412 - }, 4413 - "node_modules/prettier": { 4414 - "version": "3.8.1", 4415 - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", 4416 - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", 4417 - "license": "MIT", 4418 - "bin": { 4419 - "prettier": "bin/prettier.cjs" 4420 - }, 4421 - "engines": { 4422 - "node": ">=14" 4423 - }, 4424 - "funding": { 4425 - "url": "https://github.com/prettier/prettier?sponsor=1" 4426 - } 4427 - }, 4428 - "node_modules/prop-types": { 4429 - "version": "15.8.1", 4430 - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 4431 - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 4432 - "dev": true, 4433 - "license": "MIT", 4434 - "dependencies": { 4435 - "loose-envify": "^1.4.0", 4436 - "object-assign": "^4.1.1", 4437 - "react-is": "^16.13.1" 4438 - } 4439 - }, 4440 - "node_modules/punycode": { 4441 - "version": "2.3.1", 4442 - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 4443 - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 4444 - "dev": true, 4445 - "license": "MIT", 4446 - "engines": { 4447 - "node": ">=6" 4448 - } 4449 - }, 4450 - "node_modules/queue-microtask": { 4451 - "version": "1.2.3", 4452 - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 4453 - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 4454 - "dev": true, 4455 - "funding": [ 4456 - { 4457 - "type": "github", 4458 - "url": "https://github.com/sponsors/feross" 4459 - }, 4460 - { 4461 - "type": "patreon", 4462 - "url": "https://www.patreon.com/feross" 4463 - }, 4464 - { 4465 - "type": "consulting", 4466 - "url": "https://feross.org/support" 4467 - } 4468 - ], 4469 - "license": "MIT" 4470 - }, 4471 - "node_modules/react-is": { 4472 - "version": "16.13.1", 4473 - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 4474 - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 4475 - "dev": true, 4476 - "license": "MIT" 4477 - }, 4478 - "node_modules/reflect.getprototypeof": { 4479 - "version": "1.0.10", 4480 - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", 4481 - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", 4482 - "dev": true, 4483 - "license": "MIT", 4484 - "dependencies": { 4485 - "call-bind": "^1.0.8", 4486 - "define-properties": "^1.2.1", 4487 - "es-abstract": "^1.23.9", 4488 - "es-errors": "^1.3.0", 4489 - "es-object-atoms": "^1.0.0", 4490 - "get-intrinsic": "^1.2.7", 4491 - "get-proto": "^1.0.1", 4492 - "which-builtin-type": "^1.2.1" 4493 - }, 4494 - "engines": { 4495 - "node": ">= 0.4" 4496 - }, 4497 - "funding": { 4498 - "url": "https://github.com/sponsors/ljharb" 4499 - } 4500 - }, 4501 - "node_modules/regexp-tree": { 4502 - "version": "0.1.27", 4503 - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", 4504 - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", 4505 - "dev": true, 4506 - "license": "MIT", 4507 - "bin": { 4508 - "regexp-tree": "bin/regexp-tree" 4509 - } 4510 - }, 4511 - "node_modules/regexp.prototype.flags": { 4512 - "version": "1.5.4", 4513 - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", 4514 - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", 4515 - "dev": true, 4516 - "license": "MIT", 4517 - "dependencies": { 4518 - "call-bind": "^1.0.8", 4519 - "define-properties": "^1.2.1", 4520 - "es-errors": "^1.3.0", 4521 - "get-proto": "^1.0.1", 4522 - "gopd": "^1.2.0", 4523 - "set-function-name": "^2.0.2" 4524 - }, 4525 - "engines": { 4526 - "node": ">= 0.4" 4527 - }, 4528 - "funding": { 4529 - "url": "https://github.com/sponsors/ljharb" 4530 - } 4531 - }, 4532 - "node_modules/require-from-string": { 4533 - "version": "2.0.2", 4534 - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 4535 - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 4536 - "dev": true, 4537 - "license": "MIT", 4538 - "engines": { 4539 - "node": ">=0.10.0" 4540 - } 4541 - }, 4542 - "node_modules/resolve": { 4543 - "version": "1.22.11", 4544 - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", 4545 - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", 4546 - "dev": true, 4547 - "license": "MIT", 4548 - "dependencies": { 4549 - "is-core-module": "^2.16.1", 4550 - "path-parse": "^1.0.7", 4551 - "supports-preserve-symlinks-flag": "^1.0.0" 4552 - }, 4553 - "bin": { 4554 - "resolve": "bin/resolve" 4555 - }, 4556 - "engines": { 4557 - "node": ">= 0.4" 4558 - }, 4559 - "funding": { 4560 - "url": "https://github.com/sponsors/ljharb" 4561 - } 4562 - }, 4563 - "node_modules/resolve-from": { 4564 - "version": "4.0.0", 4565 - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 4566 - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 4567 - "dev": true, 4568 - "license": "MIT", 4569 - "engines": { 4570 - "node": ">=4" 4571 - } 4572 - }, 4573 - "node_modules/resolve-pkg-maps": { 4574 - "version": "1.0.0", 4575 - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", 4576 - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", 4577 - "dev": true, 4578 - "license": "MIT", 4579 - "funding": { 4580 - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" 4581 - } 4582 - }, 4583 - "node_modules/ret": { 4584 - "version": "0.1.15", 4585 - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 4586 - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", 4587 - "dev": true, 4588 - "license": "MIT", 4589 - "engines": { 4590 - "node": ">=0.12" 4591 - } 4592 - }, 4593 - "node_modules/reusify": { 4594 - "version": "1.1.0", 4595 - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 4596 - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 4597 - "dev": true, 4598 - "license": "MIT", 4599 - "engines": { 4600 - "iojs": ">=1.0.0", 4601 - "node": ">=0.10.0" 4602 - } 4603 - }, 4604 - "node_modules/run-parallel": { 4605 - "version": "1.2.0", 4606 - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 4607 - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 4608 - "dev": true, 4609 - "funding": [ 4610 - { 4611 - "type": "github", 4612 - "url": "https://github.com/sponsors/feross" 4613 - }, 4614 - { 4615 - "type": "patreon", 4616 - "url": "https://www.patreon.com/feross" 4617 - }, 4618 - { 4619 - "type": "consulting", 4620 - "url": "https://feross.org/support" 4621 - } 4622 - ], 4623 - "license": "MIT", 4624 - "dependencies": { 4625 - "queue-microtask": "^1.2.2" 4626 - } 4627 - }, 4628 - "node_modules/safe-array-concat": { 4629 - "version": "1.1.3", 4630 - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", 4631 - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", 4632 - "dev": true, 4633 - "license": "MIT", 4634 - "dependencies": { 4635 - "call-bind": "^1.0.8", 4636 - "call-bound": "^1.0.2", 4637 - "get-intrinsic": "^1.2.6", 4638 - "has-symbols": "^1.1.0", 4639 - "isarray": "^2.0.5" 4640 - }, 4641 - "engines": { 4642 - "node": ">=0.4" 4643 - }, 4644 - "funding": { 4645 - "url": "https://github.com/sponsors/ljharb" 4646 - } 4647 - }, 4648 - "node_modules/safe-buffer": { 4649 - "version": "5.2.1", 4650 - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 4651 - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 4652 - "dev": true, 4653 - "funding": [ 4654 - { 4655 - "type": "github", 4656 - "url": "https://github.com/sponsors/feross" 4657 - }, 4658 - { 4659 - "type": "patreon", 4660 - "url": "https://www.patreon.com/feross" 4661 - }, 4662 - { 4663 - "type": "consulting", 4664 - "url": "https://feross.org/support" 4665 - } 4666 - ], 4667 - "license": "MIT" 4668 - }, 4669 - "node_modules/safe-push-apply": { 4670 - "version": "1.0.0", 4671 - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", 4672 - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", 4673 - "dev": true, 4674 - "license": "MIT", 4675 - "dependencies": { 4676 - "es-errors": "^1.3.0", 4677 - "isarray": "^2.0.5" 4678 - }, 4679 - "engines": { 4680 - "node": ">= 0.4" 4681 - }, 4682 - "funding": { 4683 - "url": "https://github.com/sponsors/ljharb" 4684 - } 4685 - }, 4686 - "node_modules/safe-regex": { 4687 - "version": "2.1.1", 4688 - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", 4689 - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", 4690 - "dev": true, 4691 - "license": "MIT", 4692 - "dependencies": { 4693 - "regexp-tree": "~0.1.1" 4694 - } 4695 - }, 4696 - "node_modules/safe-regex-test": { 4697 - "version": "1.1.0", 4698 - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", 4699 - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", 4700 - "dev": true, 4701 - "license": "MIT", 4702 - "dependencies": { 4703 - "call-bound": "^1.0.2", 4704 - "es-errors": "^1.3.0", 4705 - "is-regex": "^1.2.1" 4706 - }, 4707 - "engines": { 4708 - "node": ">= 0.4" 4709 - }, 4710 - "funding": { 4711 - "url": "https://github.com/sponsors/ljharb" 4712 - } 4713 - }, 4714 - "node_modules/semver": { 4715 - "version": "6.3.1", 4716 - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 4717 - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 4718 - "dev": true, 4719 - "license": "ISC", 4720 - "bin": { 4721 - "semver": "bin/semver.js" 4722 - } 4723 - }, 4724 - "node_modules/set-function-length": { 4725 - "version": "1.2.2", 4726 - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 4727 - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 4728 - "dev": true, 4729 - "license": "MIT", 4730 - "dependencies": { 4731 - "define-data-property": "^1.1.4", 4732 - "es-errors": "^1.3.0", 4733 - "function-bind": "^1.1.2", 4734 - "get-intrinsic": "^1.2.4", 4735 - "gopd": "^1.0.1", 4736 - "has-property-descriptors": "^1.0.2" 4737 - }, 4738 - "engines": { 4739 - "node": ">= 0.4" 4740 - } 4741 - }, 4742 - "node_modules/set-function-name": { 4743 - "version": "2.0.2", 4744 - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", 4745 - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", 4746 - "dev": true, 4747 - "license": "MIT", 4748 - "dependencies": { 4749 - "define-data-property": "^1.1.4", 4750 - "es-errors": "^1.3.0", 4751 - "functions-have-names": "^1.2.3", 4752 - "has-property-descriptors": "^1.0.2" 4753 - }, 4754 - "engines": { 4755 - "node": ">= 0.4" 4756 - } 4757 - }, 4758 - "node_modules/set-proto": { 4759 - "version": "1.0.0", 4760 - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", 4761 - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", 4762 - "dev": true, 4763 - "license": "MIT", 4764 - "dependencies": { 4765 - "dunder-proto": "^1.0.1", 4766 - "es-errors": "^1.3.0", 4767 - "es-object-atoms": "^1.0.0" 4768 - }, 4769 - "engines": { 4770 - "node": ">= 0.4" 4771 - } 4772 - }, 4773 - "node_modules/shebang-command": { 4774 - "version": "2.0.0", 4775 - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 4776 - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 4777 - "dev": true, 4778 - "license": "MIT", 4779 - "dependencies": { 4780 - "shebang-regex": "^3.0.0" 4781 - }, 4782 - "engines": { 4783 - "node": ">=8" 4784 - } 4785 - }, 4786 - "node_modules/shebang-regex": { 4787 - "version": "3.0.0", 4788 - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 4789 - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 4790 - "dev": true, 4791 - "license": "MIT", 4792 - "engines": { 4793 - "node": ">=8" 4794 - } 4795 - }, 4796 - "node_modules/side-channel": { 4797 - "version": "1.1.0", 4798 - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 4799 - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 4800 - "dev": true, 4801 - "license": "MIT", 4802 - "dependencies": { 4803 - "es-errors": "^1.3.0", 4804 - "object-inspect": "^1.13.3", 4805 - "side-channel-list": "^1.0.0", 4806 - "side-channel-map": "^1.0.1", 4807 - "side-channel-weakmap": "^1.0.2" 4808 - }, 4809 - "engines": { 4810 - "node": ">= 0.4" 4811 - }, 4812 - "funding": { 4813 - "url": "https://github.com/sponsors/ljharb" 4814 - } 4815 - }, 4816 - "node_modules/side-channel-list": { 4817 - "version": "1.0.0", 4818 - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 4819 - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 4820 - "dev": true, 4821 - "license": "MIT", 4822 - "dependencies": { 4823 - "es-errors": "^1.3.0", 4824 - "object-inspect": "^1.13.3" 4825 - }, 4826 - "engines": { 4827 - "node": ">= 0.4" 4828 - }, 4829 - "funding": { 4830 - "url": "https://github.com/sponsors/ljharb" 4831 - } 4832 - }, 4833 - "node_modules/side-channel-map": { 4834 - "version": "1.0.1", 4835 - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 4836 - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 4837 - "dev": true, 4838 - "license": "MIT", 4839 - "dependencies": { 4840 - "call-bound": "^1.0.2", 4841 - "es-errors": "^1.3.0", 4842 - "get-intrinsic": "^1.2.5", 4843 - "object-inspect": "^1.13.3" 4844 - }, 4845 - "engines": { 4846 - "node": ">= 0.4" 4847 - }, 4848 - "funding": { 4849 - "url": "https://github.com/sponsors/ljharb" 4850 - } 4851 - }, 4852 - "node_modules/side-channel-weakmap": { 4853 - "version": "1.0.2", 4854 - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 4855 - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 4856 - "dev": true, 4857 - "license": "MIT", 4858 - "dependencies": { 4859 - "call-bound": "^1.0.2", 4860 - "es-errors": "^1.3.0", 4861 - "get-intrinsic": "^1.2.5", 4862 - "object-inspect": "^1.13.3", 4863 - "side-channel-map": "^1.0.1" 4864 - }, 4865 - "engines": { 4866 - "node": ">= 0.4" 4867 - }, 4868 - "funding": { 4869 - "url": "https://github.com/sponsors/ljharb" 4870 - } 4871 - }, 4872 - "node_modules/stop-iteration-iterator": { 4873 - "version": "1.1.0", 4874 - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", 4875 - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", 4876 - "dev": true, 4877 - "license": "MIT", 4878 - "dependencies": { 4879 - "es-errors": "^1.3.0", 4880 - "internal-slot": "^1.1.0" 4881 - }, 4882 - "engines": { 4883 - "node": ">= 0.4" 4884 - } 4885 - }, 4886 - "node_modules/string.prototype.matchall": { 4887 - "version": "4.0.12", 4888 - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", 4889 - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", 4890 - "dev": true, 4891 - "license": "MIT", 4892 - "dependencies": { 4893 - "call-bind": "^1.0.8", 4894 - "call-bound": "^1.0.3", 4895 - "define-properties": "^1.2.1", 4896 - "es-abstract": "^1.23.6", 4897 - "es-errors": "^1.3.0", 4898 - "es-object-atoms": "^1.0.0", 4899 - "get-intrinsic": "^1.2.6", 4900 - "gopd": "^1.2.0", 4901 - "has-symbols": "^1.1.0", 4902 - "internal-slot": "^1.1.0", 4903 - "regexp.prototype.flags": "^1.5.3", 4904 - "set-function-name": "^2.0.2", 4905 - "side-channel": "^1.1.0" 4906 - }, 4907 - "engines": { 4908 - "node": ">= 0.4" 4909 - }, 4910 - "funding": { 4911 - "url": "https://github.com/sponsors/ljharb" 4912 - } 4913 - }, 4914 - "node_modules/string.prototype.repeat": { 4915 - "version": "1.0.0", 4916 - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", 4917 - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", 4918 - "dev": true, 4919 - "license": "MIT", 4920 - "dependencies": { 4921 - "define-properties": "^1.1.3", 4922 - "es-abstract": "^1.17.5" 4923 - } 4924 - }, 4925 - "node_modules/string.prototype.trim": { 4926 - "version": "1.2.10", 4927 - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", 4928 - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", 4929 - "dev": true, 4930 - "license": "MIT", 4931 - "dependencies": { 4932 - "call-bind": "^1.0.8", 4933 - "call-bound": "^1.0.2", 4934 - "define-data-property": "^1.1.4", 4935 - "define-properties": "^1.2.1", 4936 - "es-abstract": "^1.23.5", 4937 - "es-object-atoms": "^1.0.0", 4938 - "has-property-descriptors": "^1.0.2" 4939 - }, 4940 - "engines": { 4941 - "node": ">= 0.4" 4942 - }, 4943 - "funding": { 4944 - "url": "https://github.com/sponsors/ljharb" 4945 - } 4946 - }, 4947 - "node_modules/string.prototype.trimend": { 4948 - "version": "1.0.9", 4949 - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", 4950 - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", 4951 - "dev": true, 4952 - "license": "MIT", 4953 - "dependencies": { 4954 - "call-bind": "^1.0.8", 4955 - "call-bound": "^1.0.2", 4956 - "define-properties": "^1.2.1", 4957 - "es-object-atoms": "^1.0.0" 4958 - }, 4959 - "engines": { 4960 - "node": ">= 0.4" 4961 - }, 4962 - "funding": { 4963 - "url": "https://github.com/sponsors/ljharb" 4964 - } 4965 - }, 4966 - "node_modules/string.prototype.trimstart": { 4967 - "version": "1.0.8", 4968 - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", 4969 - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", 4970 - "dev": true, 4971 - "license": "MIT", 4972 - "dependencies": { 4973 - "call-bind": "^1.0.7", 4974 - "define-properties": "^1.2.1", 4975 - "es-object-atoms": "^1.0.0" 4976 - }, 4977 - "engines": { 4978 - "node": ">= 0.4" 4979 - }, 4980 - "funding": { 4981 - "url": "https://github.com/sponsors/ljharb" 4982 - } 4983 - }, 4984 - "node_modules/strip-bom": { 4985 - "version": "3.0.0", 4986 - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 4987 - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", 4988 - "dev": true, 4989 - "license": "MIT", 4990 - "engines": { 4991 - "node": ">=4" 4992 - } 4993 - }, 4994 - "node_modules/strip-json-comments": { 4995 - "version": "3.1.1", 4996 - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 4997 - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 4998 - "dev": true, 4999 - "license": "MIT", 5000 - "engines": { 5001 - "node": ">=8" 5002 - }, 5003 - "funding": { 5004 - "url": "https://github.com/sponsors/sindresorhus" 5005 - } 5006 - }, 5007 - "node_modules/style-mod": { 5008 - "version": "4.1.3", 5009 - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", 5010 - "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", 5011 - "license": "MIT" 5012 - }, 5013 - "node_modules/supports-color": { 5014 - "version": "7.2.0", 5015 - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 5016 - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 5017 - "dev": true, 5018 - "license": "MIT", 5019 - "dependencies": { 5020 - "has-flag": "^4.0.0" 5021 - }, 5022 - "engines": { 5023 - "node": ">=8" 5024 - } 5025 - }, 5026 - "node_modules/supports-preserve-symlinks-flag": { 5027 - "version": "1.0.0", 5028 - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 5029 - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 5030 - "dev": true, 5031 - "license": "MIT", 5032 - "engines": { 5033 - "node": ">= 0.4" 5034 - }, 5035 - "funding": { 5036 - "url": "https://github.com/sponsors/ljharb" 5037 - } 5038 - }, 5039 - "node_modules/synckit": { 5040 - "version": "0.9.3", 5041 - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.3.tgz", 5042 - "integrity": "sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==", 5043 - "dev": true, 5044 - "license": "MIT", 5045 - "dependencies": { 5046 - "@pkgr/core": "^0.1.0", 5047 - "tslib": "^2.6.2" 5048 - }, 5049 - "engines": { 5050 - "node": "^14.18.0 || >=16.0.0" 5051 - }, 5052 - "funding": { 5053 - "url": "https://opencollective.com/unts" 5054 - } 5055 - }, 5056 - "node_modules/synckit/node_modules/tslib": { 5057 - "version": "2.8.1", 5058 - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 5059 - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 5060 - "dev": true, 5061 - "license": "0BSD" 5062 - }, 5063 - "node_modules/tapable": { 5064 - "version": "2.3.0", 5065 - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", 5066 - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", 5067 - "dev": true, 5068 - "license": "MIT", 5069 - "engines": { 5070 - "node": ">=6" 5071 - }, 5072 - "funding": { 5073 - "type": "opencollective", 5074 - "url": "https://opencollective.com/webpack" 5075 - } 5076 - }, 5077 - "node_modules/to-regex-range": { 5078 - "version": "5.0.1", 5079 - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 5080 - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 5081 - "dev": true, 5082 - "license": "MIT", 5083 - "dependencies": { 5084 - "is-number": "^7.0.0" 5085 - }, 5086 - "engines": { 5087 - "node": ">=8.0" 5088 - } 5089 - }, 5090 - "node_modules/toml-eslint-parser": { 5091 - "version": "0.9.3", 5092 - "resolved": "https://registry.npmjs.org/toml-eslint-parser/-/toml-eslint-parser-0.9.3.tgz", 5093 - "integrity": "sha512-moYoCvkNUAPCxSW9jmHmRElhm4tVJpHL8ItC/+uYD0EpPSFXbck7yREz9tNdJVTSpHVod8+HoipcpbQ0oE6gsw==", 5094 - "dev": true, 5095 - "license": "MIT", 5096 - "dependencies": { 5097 - "eslint-visitor-keys": "^3.0.0" 5098 - }, 5099 - "engines": { 5100 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 5101 - }, 5102 - "funding": { 5103 - "url": "https://github.com/sponsors/ota-meshi" 5104 - } 5105 - }, 5106 - "node_modules/toml-eslint-parser/node_modules/eslint-visitor-keys": { 5107 - "version": "3.4.3", 5108 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 5109 - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 5110 - "dev": true, 5111 - "license": "Apache-2.0", 5112 - "engines": { 5113 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 5114 - }, 5115 - "funding": { 5116 - "url": "https://opencollective.com/eslint" 5117 - } 5118 - }, 5119 - "node_modules/ts-api-utils": { 5120 - "version": "2.1.0", 5121 - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", 5122 - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", 5123 - "dev": true, 5124 - "license": "MIT", 5125 - "engines": { 5126 - "node": ">=18.12" 5127 - }, 5128 - "peerDependencies": { 5129 - "typescript": ">=4.8.4" 5130 - } 5131 - }, 5132 - "node_modules/tsconfig-paths": { 5133 - "version": "3.15.0", 5134 - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", 5135 - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", 5136 - "dev": true, 5137 - "license": "MIT", 5138 - "dependencies": { 5139 - "@types/json5": "^0.0.29", 5140 - "json5": "^1.0.2", 5141 - "minimist": "^1.2.6", 5142 - "strip-bom": "^3.0.0" 5143 - } 5144 - }, 5145 - "node_modules/tslib": { 5146 - "version": "2.4.0", 5147 - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 5148 - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", 5149 - "dev": true, 5150 - "license": "0BSD" 5151 - }, 5152 - "node_modules/tunnel-agent": { 5153 - "version": "0.6.0", 5154 - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 5155 - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 5156 - "dev": true, 5157 - "license": "Apache-2.0", 5158 - "dependencies": { 5159 - "safe-buffer": "^5.0.1" 5160 - }, 5161 - "engines": { 5162 - "node": "*" 5163 - } 5164 - }, 5165 - "node_modules/type-check": { 5166 - "version": "0.4.0", 5167 - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 5168 - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 5169 - "dev": true, 5170 - "license": "MIT", 5171 - "dependencies": { 5172 - "prelude-ls": "^1.2.1" 5173 - }, 5174 - "engines": { 5175 - "node": ">= 0.8.0" 5176 - } 5177 - }, 5178 - "node_modules/typed-array-buffer": { 5179 - "version": "1.0.3", 5180 - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", 5181 - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", 5182 - "dev": true, 5183 - "license": "MIT", 5184 - "dependencies": { 5185 - "call-bound": "^1.0.3", 5186 - "es-errors": "^1.3.0", 5187 - "is-typed-array": "^1.1.14" 5188 - }, 5189 - "engines": { 5190 - "node": ">= 0.4" 5191 - } 5192 - }, 5193 - "node_modules/typed-array-byte-length": { 5194 - "version": "1.0.3", 5195 - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", 5196 - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", 5197 - "dev": true, 5198 - "license": "MIT", 5199 - "dependencies": { 5200 - "call-bind": "^1.0.8", 5201 - "for-each": "^0.3.3", 5202 - "gopd": "^1.2.0", 5203 - "has-proto": "^1.2.0", 5204 - "is-typed-array": "^1.1.14" 5205 - }, 5206 - "engines": { 5207 - "node": ">= 0.4" 5208 - }, 5209 - "funding": { 5210 - "url": "https://github.com/sponsors/ljharb" 5211 - } 5212 - }, 5213 - "node_modules/typed-array-byte-offset": { 5214 - "version": "1.0.4", 5215 - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", 5216 - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", 5217 - "dev": true, 5218 - "license": "MIT", 5219 - "dependencies": { 5220 - "available-typed-arrays": "^1.0.7", 5221 - "call-bind": "^1.0.8", 5222 - "for-each": "^0.3.3", 5223 - "gopd": "^1.2.0", 5224 - "has-proto": "^1.2.0", 5225 - "is-typed-array": "^1.1.15", 5226 - "reflect.getprototypeof": "^1.0.9" 5227 - }, 5228 - "engines": { 5229 - "node": ">= 0.4" 5230 - }, 5231 - "funding": { 5232 - "url": "https://github.com/sponsors/ljharb" 5233 - } 5234 - }, 5235 - "node_modules/typed-array-length": { 5236 - "version": "1.0.7", 5237 - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", 5238 - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", 5239 - "dev": true, 5240 - "license": "MIT", 5241 - "dependencies": { 5242 - "call-bind": "^1.0.7", 5243 - "for-each": "^0.3.3", 5244 - "gopd": "^1.0.1", 5245 - "is-typed-array": "^1.1.13", 5246 - "possible-typed-array-names": "^1.0.0", 5247 - "reflect.getprototypeof": "^1.0.6" 5248 - }, 5249 - "engines": { 5250 - "node": ">= 0.4" 5251 - }, 5252 - "funding": { 5253 - "url": "https://github.com/sponsors/ljharb" 5254 - } 5255 - }, 5256 - "node_modules/typescript": { 5257 - "version": "5.8.3", 5258 - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 5259 - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 5260 - "dev": true, 5261 - "license": "Apache-2.0", 5262 - "peer": true, 5263 - "bin": { 5264 - "tsc": "bin/tsc", 5265 - "tsserver": "bin/tsserver" 5266 - }, 5267 - "engines": { 5268 - "node": ">=14.17" 5269 - } 5270 - }, 5271 - "node_modules/typescript-eslint": { 5272 - "version": "8.35.1", 5273 - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.1.tgz", 5274 - "integrity": "sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==", 5275 - "dev": true, 5276 - "license": "MIT", 5277 - "peer": true, 5278 - "dependencies": { 5279 - "@typescript-eslint/eslint-plugin": "8.35.1", 5280 - "@typescript-eslint/parser": "8.35.1", 5281 - "@typescript-eslint/utils": "8.35.1" 5282 - }, 5283 - "engines": { 5284 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 5285 - }, 5286 - "funding": { 5287 - "type": "opencollective", 5288 - "url": "https://opencollective.com/typescript-eslint" 5289 - }, 5290 - "peerDependencies": { 5291 - "eslint": "^8.57.0 || ^9.0.0", 5292 - "typescript": ">=4.8.4 <5.9.0" 5293 - } 5294 - }, 5295 - "node_modules/unbox-primitive": { 5296 - "version": "1.1.0", 5297 - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", 5298 - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", 5299 - "dev": true, 5300 - "license": "MIT", 5301 - "dependencies": { 5302 - "call-bound": "^1.0.3", 5303 - "has-bigints": "^1.0.2", 5304 - "has-symbols": "^1.1.0", 5305 - "which-boxed-primitive": "^1.1.1" 5306 - }, 5307 - "engines": { 5308 - "node": ">= 0.4" 5309 - }, 5310 - "funding": { 5311 - "url": "https://github.com/sponsors/ljharb" 5312 - } 5313 - }, 5314 - "node_modules/undici-types": { 5315 - "version": "5.26.5", 5316 - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 5317 - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 5318 - "dev": true, 5319 - "license": "MIT" 5320 - }, 5321 - "node_modules/unicode-segmenter": { 5322 - "version": "0.14.5", 5323 - "resolved": "https://registry.npmjs.org/unicode-segmenter/-/unicode-segmenter-0.14.5.tgz", 5324 - "integrity": "sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==", 5325 - "license": "MIT" 5326 - }, 5327 - "node_modules/uri-js": { 5328 - "version": "4.4.1", 5329 - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 5330 - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 5331 - "dev": true, 5332 - "license": "BSD-2-Clause", 5333 - "dependencies": { 5334 - "punycode": "^2.1.0" 5335 - } 5336 - }, 5337 - "node_modules/w3c-keyname": { 5338 - "version": "2.2.8", 5339 - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", 5340 - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", 5341 - "license": "MIT" 5342 - }, 5343 - "node_modules/which": { 5344 - "version": "2.0.2", 5345 - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 5346 - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 5347 - "dev": true, 5348 - "license": "ISC", 5349 - "dependencies": { 5350 - "isexe": "^2.0.0" 5351 - }, 5352 - "bin": { 5353 - "node-which": "bin/node-which" 5354 - }, 5355 - "engines": { 5356 - "node": ">= 8" 5357 - } 5358 - }, 5359 - "node_modules/which-boxed-primitive": { 5360 - "version": "1.1.1", 5361 - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", 5362 - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", 5363 - "dev": true, 5364 - "license": "MIT", 5365 - "dependencies": { 5366 - "is-bigint": "^1.1.0", 5367 - "is-boolean-object": "^1.2.1", 5368 - "is-number-object": "^1.1.1", 5369 - "is-string": "^1.1.1", 5370 - "is-symbol": "^1.1.1" 5371 - }, 5372 - "engines": { 5373 - "node": ">= 0.4" 5374 - }, 5375 - "funding": { 5376 - "url": "https://github.com/sponsors/ljharb" 5377 - } 5378 - }, 5379 - "node_modules/which-builtin-type": { 5380 - "version": "1.2.1", 5381 - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", 5382 - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", 5383 - "dev": true, 5384 - "license": "MIT", 5385 - "dependencies": { 5386 - "call-bound": "^1.0.2", 5387 - "function.prototype.name": "^1.1.6", 5388 - "has-tostringtag": "^1.0.2", 5389 - "is-async-function": "^2.0.0", 5390 - "is-date-object": "^1.1.0", 5391 - "is-finalizationregistry": "^1.1.0", 5392 - "is-generator-function": "^1.0.10", 5393 - "is-regex": "^1.2.1", 5394 - "is-weakref": "^1.0.2", 5395 - "isarray": "^2.0.5", 5396 - "which-boxed-primitive": "^1.1.0", 5397 - "which-collection": "^1.0.2", 5398 - "which-typed-array": "^1.1.16" 5399 - }, 5400 - "engines": { 5401 - "node": ">= 0.4" 5402 - }, 5403 - "funding": { 5404 - "url": "https://github.com/sponsors/ljharb" 5405 - } 5406 - }, 5407 - "node_modules/which-collection": { 5408 - "version": "1.0.2", 5409 - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", 5410 - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", 5411 - "dev": true, 5412 - "license": "MIT", 5413 - "dependencies": { 5414 - "is-map": "^2.0.3", 5415 - "is-set": "^2.0.3", 5416 - "is-weakmap": "^2.0.2", 5417 - "is-weakset": "^2.0.3" 5418 - }, 5419 - "engines": { 5420 - "node": ">= 0.4" 5421 - }, 5422 - "funding": { 5423 - "url": "https://github.com/sponsors/ljharb" 5424 - } 5425 - }, 5426 - "node_modules/which-typed-array": { 5427 - "version": "1.1.19", 5428 - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", 5429 - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", 5430 - "dev": true, 5431 - "license": "MIT", 5432 - "dependencies": { 5433 - "available-typed-arrays": "^1.0.7", 5434 - "call-bind": "^1.0.8", 5435 - "call-bound": "^1.0.4", 5436 - "for-each": "^0.3.5", 5437 - "get-proto": "^1.0.1", 5438 - "gopd": "^1.2.0", 5439 - "has-tostringtag": "^1.0.2" 5440 - }, 5441 - "engines": { 5442 - "node": ">= 0.4" 5443 - }, 5444 - "funding": { 5445 - "url": "https://github.com/sponsors/ljharb" 5446 - } 5447 - }, 5448 - "node_modules/word-wrap": { 5449 - "version": "1.2.5", 5450 - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 5451 - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 5452 - "dev": true, 5453 - "license": "MIT", 5454 - "engines": { 5455 - "node": ">=0.10.0" 5456 - } 5457 - }, 5458 - "node_modules/yaml": { 5459 - "version": "2.8.1", 5460 - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", 5461 - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", 5462 - "dev": true, 5463 - "license": "ISC", 5464 - "bin": { 5465 - "yaml": "bin.mjs" 5466 - }, 5467 - "engines": { 5468 - "node": ">= 14.6" 5469 - } 5470 - }, 5471 - "node_modules/yaml-eslint-parser": { 5472 - "version": "1.3.0", 5473 - "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz", 5474 - "integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==", 5475 - "dev": true, 5476 - "license": "MIT", 5477 - "dependencies": { 5478 - "eslint-visitor-keys": "^3.0.0", 5479 - "yaml": "^2.0.0" 5480 - }, 5481 - "engines": { 5482 - "node": "^14.17.0 || >=16.0.0" 5483 - }, 5484 - "funding": { 5485 - "url": "https://github.com/sponsors/ota-meshi" 5486 - } 5487 - }, 5488 - "node_modules/yaml-eslint-parser/node_modules/eslint-visitor-keys": { 5489 - "version": "3.4.3", 5490 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 5491 - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 5492 - "dev": true, 5493 - "license": "Apache-2.0", 5494 - "engines": { 5495 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 5496 - }, 5497 - "funding": { 5498 - "url": "https://opencollective.com/eslint" 5499 - } 5500 - }, 5501 - "node_modules/yocto-queue": { 5502 - "version": "0.1.0", 5503 - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 5504 - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 5505 - "dev": true, 5506 - "license": "MIT", 5507 - "engines": { 5508 - "node": ">=10" 5509 - }, 5510 - "funding": { 5511 - "url": "https://github.com/sponsors/sindresorhus" 5512 - } 5513 - } 5514 - } 5515 - }
-34
package.json
··· 1 - { 2 - "name": "obsidian-atmark", 3 - "version": "0.1.8", 4 - "description": "View and manage AT Protocol bookmarks.", 5 - "main": "main.js", 6 - "type": "module", 7 - "scripts": { 8 - "dev": "node esbuild.config.mjs", 9 - "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", 10 - "version": "node version-bump.mjs && git add manifest.json versions.json", 11 - "lint": "eslint ." 12 - }, 13 - "keywords": [], 14 - "license": "MIT", 15 - "devDependencies": { 16 - "@eslint/js": "9.30.1", 17 - "@types/node": "^16.11.6", 18 - "esbuild": "0.25.5", 19 - "eslint-plugin-obsidianmd": "0.1.9", 20 - "globals": "14.0.0", 21 - "jiti": "2.6.1", 22 - "tslib": "2.4.0", 23 - "typescript": "^5.8.3", 24 - "typescript-eslint": "8.35.1" 25 - }, 26 - "dependencies": { 27 - "@atcute/atproto": "^3.1.10", 28 - "@atcute/bluesky": "^3.2.15", 29 - "@atcute/client": "^4.2.1", 30 - "@atcute/lex-cli": "^2.5.2", 31 - "@atcute/oauth-browser-client": "^2.0.3", 32 - "obsidian": "latest" 33 - } 34 - }
preview-sidebar.png

This is a binary file and will not be displayed.

preview.png

This is a binary file and will not be displayed.

-21
src/auth.ts
··· 1 - import { Client, CredentialManager, simpleFetchHandler } from "@atcute/client"; 2 - 3 - const DEFAULT_SERVICE = "https://bsky.social"; 4 - 5 - export interface Credentials { 6 - identifier: string; 7 - password: string; 8 - serviceUrl?: string; 9 - } 10 - 11 - export async function createAuthenticatedClient(creds: Credentials): Promise<Client> { 12 - const service = creds.serviceUrl || DEFAULT_SERVICE; 13 - const manager = new CredentialManager({ service }); 14 - await manager.login(creds); 15 - return new Client({ handler: manager }); 16 - } 17 - 18 - export function createPublicClient(serviceUrl?: string): Client { 19 - const service = serviceUrl || DEFAULT_SERVICE; 20 - return new Client({ handler: simpleFetchHandler({ service }) }); 21 - }
-143
src/components/cardDetailModal.ts
··· 1 - import { Modal, Notice, setIcon } from "obsidian"; 2 - import type ATmarkPlugin from "../main"; 3 - import { createNoteCard, deleteRecord } from "../lib"; 4 - import type { ATmarkItem } from "../sources/types"; 5 - 6 - export class CardDetailModal extends Modal { 7 - plugin: ATmarkPlugin; 8 - item: ATmarkItem; 9 - onSuccess?: () => void; 10 - noteInput: HTMLTextAreaElement | null = null; 11 - 12 - constructor(plugin: ATmarkPlugin, item: ATmarkItem, onSuccess?: () => void) { 13 - super(plugin.app); 14 - this.plugin = plugin; 15 - this.item = item; 16 - this.onSuccess = onSuccess; 17 - } 18 - 19 - onOpen() { 20 - const { contentEl } = this; 21 - contentEl.empty(); 22 - contentEl.addClass("atmark-detail-modal"); 23 - 24 - const header = contentEl.createEl("div", { cls: "atmark-detail-header" }); 25 - const source = this.item.getSource(); 26 - header.createEl("span", { 27 - text: source, 28 - cls: `atmark-badge atmark-badge-source atmark-badge-${source}`, 29 - }); 30 - 31 - this.item.renderDetail(contentEl); 32 - 33 - // Render notes with delete buttons (semble-specific) 34 - if (this.item.canAddNotes() && this.item.getAttachedNotes) { 35 - this.renderNotesSection(contentEl); 36 - } 37 - 38 - // Add note form (only for items that support it) 39 - if (this.item.canAddNotes()) { 40 - this.renderAddNoteForm(contentEl); 41 - } 42 - 43 - const footer = contentEl.createEl("div", { cls: "atmark-detail-footer" }); 44 - footer.createEl("span", { 45 - text: `Created ${new Date(this.item.getCreatedAt()).toLocaleDateString()}`, 46 - cls: "atmark-detail-date", 47 - }); 48 - } 49 - 50 - private renderNotesSection(contentEl: HTMLElement) { 51 - const notes = this.item.getAttachedNotes?.(); 52 - if (!notes || notes.length === 0) return; 53 - 54 - const notesSection = contentEl.createEl("div", { cls: "atmark-semble-detail-notes-section" }); 55 - notesSection.createEl("h3", { text: "Notes", cls: "atmark-detail-section-title" }); 56 - 57 - for (const note of notes) { 58 - const noteEl = notesSection.createEl("div", { cls: "atmark-semble-detail-note" }); 59 - 60 - const noteContent = noteEl.createEl("div", { cls: "atmark-semble-detail-note-content" }); 61 - const noteIcon = noteContent.createEl("span", { cls: "atmark-semble-detail-note-icon" }); 62 - setIcon(noteIcon, "message-square"); 63 - noteContent.createEl("p", { text: note.text, cls: "atmark-semble-detail-note-text" }); 64 - 65 - const deleteBtn = noteEl.createEl("button", { cls: "atmark-semble-note-delete-btn" }); 66 - setIcon(deleteBtn, "trash-2"); 67 - deleteBtn.addEventListener("click", () => { 68 - void this.handleDeleteNote(note.uri); 69 - }); 70 - } 71 - } 72 - 73 - private renderAddNoteForm(contentEl: HTMLElement) { 74 - const formSection = contentEl.createEl("div", { cls: "atmark-semble-detail-add-note" }); 75 - formSection.createEl("h3", { text: "Add a note", cls: "atmark-detail-section-title" }); 76 - 77 - const form = formSection.createEl("div", { cls: "atmark-semble-add-note-form" }); 78 - 79 - this.noteInput = form.createEl("textarea", { 80 - cls: "atmark-textarea atmark-semble-note-input", 81 - attr: { placeholder: "Write a note about this item..." }, 82 - }); 83 - 84 - const addBtn = form.createEl("button", { text: "Add note", cls: "atmark-btn atmark-btn-primary" }); 85 - addBtn.addEventListener("click", () => { void this.handleAddNote(); }); 86 - } 87 - 88 - private async handleAddNote() { 89 - if (!this.plugin.client || !this.noteInput) return; 90 - 91 - const text = this.noteInput.value.trim(); 92 - if (!text) { 93 - new Notice("Please enter a note"); 94 - return; 95 - } 96 - 97 - try { 98 - await createNoteCard( 99 - this.plugin.client, 100 - this.plugin.settings.identifier, 101 - text, 102 - { uri: this.item.getUri(), cid: this.item.getCid() } 103 - ); 104 - 105 - new Notice("Note added"); 106 - this.close(); 107 - this.onSuccess?.(); 108 - } catch (err) { 109 - const message = err instanceof Error ? err.message : String(err); 110 - new Notice(`Failed to add note: ${message}`); 111 - } 112 - } 113 - 114 - private async handleDeleteNote(noteUri: string) { 115 - if (!this.plugin.client) return; 116 - 117 - const rkey = noteUri.split("/").pop(); 118 - if (!rkey) { 119 - new Notice("Invalid note uri"); 120 - return; 121 - } 122 - 123 - try { 124 - await deleteRecord( 125 - this.plugin.client, 126 - this.plugin.settings.identifier, 127 - "network.cosmik.card", 128 - rkey 129 - ); 130 - 131 - new Notice("Note deleted"); 132 - this.close(); 133 - this.onSuccess?.(); 134 - } catch (err) { 135 - const message = err instanceof Error ? err.message : String(err); 136 - new Notice(`Failed to delete note: ${message}`); 137 - } 138 - } 139 - 140 - onClose() { 141 - this.contentEl.empty(); 142 - } 143 - }
-103
src/components/createCollectionModal.ts
··· 1 - import { Modal, Notice } from "obsidian"; 2 - import type ATmarkPlugin from "../main"; 3 - import { createCollection } from "../lib"; 4 - 5 - export class CreateCollectionModal extends Modal { 6 - plugin: ATmarkPlugin; 7 - onSuccess?: () => void; 8 - 9 - constructor(plugin: ATmarkPlugin, onSuccess?: () => void) { 10 - super(plugin.app); 11 - this.plugin = plugin; 12 - this.onSuccess = onSuccess; 13 - } 14 - 15 - onOpen() { 16 - const { contentEl } = this; 17 - contentEl.empty(); 18 - contentEl.addClass("atmark-modal"); 19 - 20 - contentEl.createEl("h2", { text: "New collection" }); 21 - 22 - if (!this.plugin.client) { 23 - contentEl.createEl("p", { text: "Not connected." }); 24 - return; 25 - } 26 - 27 - const form = contentEl.createEl("form", { cls: "atmark-form" }); 28 - 29 - const nameGroup = form.createEl("div", { cls: "atmark-form-group" }); 30 - nameGroup.createEl("label", { text: "Name", attr: { for: "collection-name" } }); 31 - const nameInput = nameGroup.createEl("input", { 32 - type: "text", 33 - cls: "atmark-input", 34 - attr: { id: "collection-name", placeholder: "Collection name", required: "true" }, 35 - }); 36 - 37 - const descGroup = form.createEl("div", { cls: "atmark-form-group" }); 38 - descGroup.createEl("label", { text: "Description", attr: { for: "collection-desc" } }); 39 - const descInput = descGroup.createEl("textarea", { 40 - cls: "atmark-textarea", 41 - attr: { id: "collection-desc", placeholder: "Optional description", rows: "3" }, 42 - }); 43 - 44 - const actions = form.createEl("div", { cls: "atmark-modal-actions" }); 45 - 46 - const cancelBtn = actions.createEl("button", { 47 - text: "Cancel", 48 - cls: "atmark-btn atmark-btn-secondary", 49 - type: "button", 50 - }); 51 - cancelBtn.addEventListener("click", () => this.close()); 52 - 53 - const createBtn = actions.createEl("button", { 54 - text: "Create", 55 - cls: "atmark-btn atmark-btn-primary", 56 - type: "submit", 57 - }); 58 - 59 - form.addEventListener("submit", (e) => { 60 - e.preventDefault(); 61 - void this.handleSubmit(nameInput, descInput, createBtn); 62 - }); 63 - 64 - nameInput.focus(); 65 - } 66 - 67 - private async handleSubmit( 68 - nameInput: HTMLInputElement, 69 - descInput: HTMLTextAreaElement, 70 - createBtn: HTMLButtonElement 71 - ) { 72 - const name = nameInput.value.trim(); 73 - if (!name) { 74 - new Notice("Please enter a collection name"); 75 - return; 76 - } 77 - 78 - createBtn.disabled = true; 79 - createBtn.textContent = "Creating..."; 80 - 81 - try { 82 - await createCollection( 83 - this.plugin.client!, 84 - this.plugin.settings.identifier, 85 - name, 86 - descInput.value.trim() 87 - ); 88 - 89 - new Notice(`Created collection "${name}"`); 90 - this.close(); 91 - this.onSuccess?.(); 92 - } catch (err) { 93 - const message = err instanceof Error ? err.message : String(err); 94 - new Notice(`Failed to create collection: ${message}`); 95 - createBtn.disabled = false; 96 - createBtn.textContent = "Create"; 97 - } 98 - } 99 - 100 - onClose() { 101 - this.contentEl.empty(); 102 - } 103 - }
-113
src/components/createMarginCollectionModal.ts
··· 1 - import { Modal, Notice } from "obsidian"; 2 - import type ATmarkPlugin from "../main"; 3 - import { createMarginCollection } from "../lib"; 4 - 5 - export class CreateMarginCollectionModal extends Modal { 6 - plugin: ATmarkPlugin; 7 - onSuccess?: () => void; 8 - 9 - constructor(plugin: ATmarkPlugin, onSuccess?: () => void) { 10 - super(plugin.app); 11 - this.plugin = plugin; 12 - this.onSuccess = onSuccess; 13 - } 14 - 15 - onOpen() { 16 - const { contentEl } = this; 17 - contentEl.empty(); 18 - contentEl.addClass("atmark-modal"); 19 - 20 - contentEl.createEl("h2", { text: "New margin collection" }); 21 - 22 - if (!this.plugin.client) { 23 - // contentEl.createEl("p", { text: "Not Logged In. Please Login Using Settings." }); 24 - return; 25 - } 26 - 27 - const form = contentEl.createEl("form", { cls: "atmark-form" }); 28 - 29 - const nameGroup = form.createEl("div", { cls: "atmark-form-group" }); 30 - nameGroup.createEl("label", { text: "Name", attr: { for: "collection-name" } }); 31 - const nameInput = nameGroup.createEl("input", { 32 - type: "text", 33 - cls: "atmark-input", 34 - attr: { id: "collection-name", placeholder: "Collection name", required: "true" }, 35 - }); 36 - 37 - const iconGroup = form.createEl("div", { cls: "atmark-form-group" }); 38 - iconGroup.createEl("label", { text: "Icon (optional)", attr: { for: "collection-icon" } }); 39 - const iconInput = iconGroup.createEl("input", { 40 - type: "text", 41 - cls: "atmark-input", 42 - attr: { id: "collection-icon" }, 43 - }); 44 - 45 - const descGroup = form.createEl("div", { cls: "atmark-form-group" }); 46 - descGroup.createEl("label", { text: "Description", attr: { for: "collection-desc" } }); 47 - const descInput = descGroup.createEl("textarea", { 48 - cls: "atmark-textarea", 49 - attr: { id: "collection-desc", placeholder: "Optional description", rows: "3" }, 50 - }); 51 - 52 - const actions = form.createEl("div", { cls: "atmark-modal-actions" }); 53 - 54 - const cancelBtn = actions.createEl("button", { 55 - text: "Cancel", 56 - cls: "atmark-btn atmark-btn-secondary", 57 - type: "button", 58 - }); 59 - cancelBtn.addEventListener("click", () => this.close()); 60 - 61 - const createBtn = actions.createEl("button", { 62 - text: "Create", 63 - cls: "atmark-btn atmark-btn-primary", 64 - type: "submit", 65 - }); 66 - 67 - form.addEventListener("submit", (e) => { 68 - e.preventDefault(); 69 - void this.handleSubmit(nameInput, iconInput, descInput, createBtn); 70 - }); 71 - 72 - nameInput.focus(); 73 - } 74 - 75 - private async handleSubmit( 76 - nameInput: HTMLInputElement, 77 - iconInput: HTMLInputElement, 78 - descInput: HTMLTextAreaElement, 79 - createBtn: HTMLButtonElement 80 - ) { 81 - const name = nameInput.value.trim(); 82 - if (!name) { 83 - new Notice("Please enter a collection name"); 84 - return; 85 - } 86 - 87 - createBtn.disabled = true; 88 - createBtn.textContent = "Creating..."; 89 - 90 - try { 91 - await createMarginCollection( 92 - this.plugin.client!, 93 - this.plugin.settings.identifier, 94 - name, 95 - descInput.value.trim() || undefined, 96 - iconInput.value.trim() || undefined 97 - ); 98 - 99 - new Notice(`Created collection "${name}"`); 100 - this.close(); 101 - this.onSuccess?.(); 102 - } catch (err) { 103 - const message = err instanceof Error ? err.message : String(err); 104 - new Notice(`Failed to create collection: ${message}`); 105 - createBtn.disabled = false; 106 - createBtn.textContent = "Create"; 107 - } 108 - } 109 - 110 - onClose() { 111 - this.contentEl.empty(); 112 - } 113 - }
-94
src/components/createTagModal.ts
··· 1 - import { Modal, Notice } from "obsidian"; 2 - import type ATmarkPlugin from "../main"; 3 - import { createTag } from "../lib"; 4 - 5 - export class CreateTagModal extends Modal { 6 - plugin: ATmarkPlugin; 7 - onSuccess?: () => void; 8 - 9 - constructor(plugin: ATmarkPlugin, onSuccess?: () => void) { 10 - super(plugin.app); 11 - this.plugin = plugin; 12 - this.onSuccess = onSuccess; 13 - } 14 - 15 - onOpen() { 16 - const { contentEl } = this; 17 - contentEl.empty(); 18 - contentEl.addClass("atmark-modal"); 19 - 20 - contentEl.createEl("h2", { text: "New tag" }); 21 - 22 - if (!this.plugin.client) { 23 - contentEl.createEl("p", { text: "Not connected." }); 24 - return; 25 - } 26 - 27 - const form = contentEl.createEl("form", { cls: "atmark-form" }); 28 - 29 - const tagGroup = form.createEl("div", { cls: "atmark-form-group" }); 30 - tagGroup.createEl("label", { text: "Tag", attr: { for: "tag-value" } }); 31 - const tagInput = tagGroup.createEl("input", { 32 - type: "text", 33 - cls: "atmark-input", 34 - attr: { id: "tag-value", placeholder: "Tag name", required: "true" }, 35 - }); 36 - 37 - const actions = form.createEl("div", { cls: "atmark-modal-actions" }); 38 - 39 - const cancelBtn = actions.createEl("button", { 40 - text: "Cancel", 41 - cls: "atmark-btn atmark-btn-secondary", 42 - type: "button", 43 - }); 44 - cancelBtn.addEventListener("click", () => this.close()); 45 - 46 - const createBtn = actions.createEl("button", { 47 - text: "Create", 48 - cls: "atmark-btn atmark-btn-primary", 49 - type: "submit", 50 - }); 51 - 52 - form.addEventListener("submit", (e) => { 53 - e.preventDefault(); 54 - void this.handleSubmit(tagInput, createBtn); 55 - }); 56 - 57 - tagInput.focus(); 58 - } 59 - 60 - private async handleSubmit( 61 - tagInput: HTMLInputElement, 62 - createBtn: HTMLButtonElement 63 - ) { 64 - const value = tagInput.value.trim(); 65 - if (!value) { 66 - new Notice("Please enter a tag name"); 67 - return; 68 - } 69 - 70 - createBtn.disabled = true; 71 - createBtn.textContent = "Creating..."; 72 - 73 - try { 74 - await createTag( 75 - this.plugin.client!, 76 - this.plugin.settings.identifier, 77 - value 78 - ); 79 - 80 - new Notice(`Created tag "${value}"`); 81 - this.close(); 82 - this.onSuccess?.(); 83 - } catch (err) { 84 - const message = err instanceof Error ? err.message : String(err); 85 - new Notice(`Failed to create tag: ${message}`); 86 - createBtn.disabled = false; 87 - createBtn.textContent = "Create"; 88 - } 89 - } 90 - 91 - onClose() { 92 - this.contentEl.empty(); 93 - } 94 - }
-238
src/components/editBookmarkModal.ts
··· 1 - import { Modal, Notice } from "obsidian"; 2 - import type { Record } from "@atcute/atproto/types/repo/listRecords"; 3 - import type { Main as Bookmark } from "../lexicons/types/community/lexicon/bookmarks/bookmark"; 4 - import type ATmarkPlugin from "../main"; 5 - import { putRecord, deleteRecord, getBookmarks } from "../lib"; 6 - 7 - type BookmarkRecord = Record & { value: Bookmark }; 8 - 9 - interface TagState { 10 - tag: string; 11 - isSelected: boolean; 12 - } 13 - 14 - export class EditBookmarkModal extends Modal { 15 - plugin: ATmarkPlugin; 16 - record: BookmarkRecord; 17 - onSuccess?: () => void; 18 - tagStates: TagState[] = []; 19 - newTagInput: HTMLInputElement | null = null; 20 - 21 - constructor(plugin: ATmarkPlugin, record: BookmarkRecord, onSuccess?: () => void) { 22 - super(plugin.app); 23 - this.plugin = plugin; 24 - this.record = record; 25 - this.onSuccess = onSuccess; 26 - } 27 - 28 - async onOpen() { 29 - const { contentEl } = this; 30 - contentEl.empty(); 31 - contentEl.addClass("atmark-modal"); 32 - 33 - contentEl.createEl("h2", { text: "Edit bookmark" }); 34 - 35 - if (!this.plugin.client) { 36 - contentEl.createEl("p", { text: "Not connected." }); 37 - return; 38 - } 39 - 40 - const loading = contentEl.createEl("p", { text: "Loading..." }); 41 - 42 - try { 43 - const bookmarksResp = await getBookmarks(this.plugin.client, this.plugin.settings.identifier); 44 - loading.remove(); 45 - 46 - const bookmarks = (bookmarksResp.ok ? bookmarksResp.data.records : []) as unknown as BookmarkRecord[]; 47 - 48 - const allTags = new Set<string>(); 49 - for (const bookmark of bookmarks) { 50 - if (bookmark.value.tags) { 51 - for (const tag of bookmark.value.tags) { 52 - allTags.add(tag); 53 - } 54 - } 55 - } 56 - 57 - const currentTags = new Set(this.record.value.tags || []); 58 - this.tagStates = Array.from(allTags).sort().map(tag => ({ 59 - tag, 60 - isSelected: currentTags.has(tag), 61 - })); 62 - 63 - this.renderForm(contentEl); 64 - } catch (err) { 65 - loading.remove(); 66 - const message = err instanceof Error ? err.message : String(err); 67 - contentEl.createEl("p", { text: `Error: ${message}`, cls: "atmark-error" }); 68 - } 69 - } 70 - 71 - private renderForm(contentEl: HTMLElement) { 72 - const form = contentEl.createEl("div", { cls: "atmark-form" }); 73 - 74 - const tagsGroup = form.createEl("div", { cls: "atmark-form-group" }); 75 - tagsGroup.createEl("label", { text: "Tags" }); 76 - 77 - const tagsList = tagsGroup.createEl("div", { cls: "atmark-tag-list" }); 78 - for (const state of this.tagStates) { 79 - this.addTagChip(tagsList, state); 80 - } 81 - 82 - const newTagRow = tagsGroup.createEl("div", { cls: "atmark-tag-row" }); 83 - this.newTagInput = newTagRow.createEl("input", { 84 - type: "text", 85 - cls: "atmark-input", 86 - attr: { placeholder: "Add new tag..." } 87 - }); 88 - const addBtn = newTagRow.createEl("button", { 89 - text: "Add", 90 - cls: "atmark-btn atmark-btn-secondary", 91 - attr: { type: "button" } 92 - }); 93 - addBtn.addEventListener("click", () => { 94 - const value = this.newTagInput?.value.trim(); 95 - if (value && !this.tagStates.some(s => s.tag === value)) { 96 - const newState = { tag: value, isSelected: true }; 97 - this.tagStates.push(newState); 98 - this.addTagChip(tagsList, newState); 99 - if (this.newTagInput) this.newTagInput.value = ""; 100 - } 101 - }); 102 - 103 - const actions = contentEl.createEl("div", { cls: "atmark-modal-actions" }); 104 - 105 - const deleteBtn = actions.createEl("button", { 106 - text: "Delete", 107 - cls: "atmark-btn atmark-btn-danger" 108 - }); 109 - deleteBtn.addEventListener("click", () => { this.confirmDelete(contentEl); }); 110 - 111 - actions.createEl("div", { cls: "atmark-spacer" }); 112 - 113 - const cancelBtn = actions.createEl("button", { 114 - text: "Cancel", 115 - cls: "atmark-btn atmark-btn-secondary" 116 - }); 117 - cancelBtn.addEventListener("click", () => { this.close(); }); 118 - 119 - const saveBtn = actions.createEl("button", { 120 - text: "Save", 121 - cls: "atmark-btn atmark-btn-primary" 122 - }); 123 - saveBtn.addEventListener("click", () => { void this.saveChanges(); }); 124 - } 125 - 126 - private addTagChip(container: HTMLElement, state: TagState) { 127 - const item = container.createEl("label", { cls: "atmark-tag-item" }); 128 - const checkbox = item.createEl("input", { type: "checkbox" }); 129 - checkbox.checked = state.isSelected; 130 - checkbox.addEventListener("change", () => { 131 - state.isSelected = checkbox.checked; 132 - }); 133 - item.createEl("span", { text: state.tag }); 134 - } 135 - 136 - private confirmDelete(contentEl: HTMLElement) { 137 - contentEl.empty(); 138 - contentEl.createEl("h2", { text: "Delete bookmark" }); 139 - contentEl.createEl("p", { text: "Delete this bookmark?", cls: "atmark-warning-text" }); 140 - 141 - const actions = contentEl.createEl("div", { cls: "atmark-modal-actions" }); 142 - 143 - const cancelBtn = actions.createEl("button", { 144 - text: "Cancel", 145 - cls: "atmark-btn atmark-btn-secondary" 146 - }); 147 - cancelBtn.addEventListener("click", () => { 148 - void this.onOpen(); 149 - }); 150 - 151 - const confirmBtn = actions.createEl("button", { 152 - text: "Delete", 153 - cls: "atmark-btn atmark-btn-danger" 154 - }); 155 - confirmBtn.addEventListener("click", () => { void this.deleteBookmark(); }); 156 - } 157 - 158 - private async deleteBookmark() { 159 - if (!this.plugin.client) return; 160 - 161 - const { contentEl } = this; 162 - contentEl.empty(); 163 - contentEl.createEl("p", { text: "Deleting bookmark..." }); 164 - 165 - try { 166 - const rkey = this.record.uri.split("/").pop(); 167 - if (!rkey) { 168 - contentEl.empty(); 169 - contentEl.createEl("p", { text: "Invalid bookmark uri.", cls: "atmark-error" }); 170 - return; 171 - } 172 - 173 - await deleteRecord( 174 - this.plugin.client, 175 - this.plugin.settings.identifier, 176 - "community.lexicon.bookmarks.bookmark", 177 - rkey 178 - ); 179 - 180 - new Notice("Bookmark deleted"); 181 - this.close(); 182 - this.onSuccess?.(); 183 - } catch (err) { 184 - contentEl.empty(); 185 - const message = err instanceof Error ? err.message : String(err); 186 - contentEl.createEl("p", { text: `Failed to delete: ${message}`, cls: "atmark-error" }); 187 - } 188 - } 189 - 190 - private async saveChanges() { 191 - if (!this.plugin.client) return; 192 - 193 - const { contentEl } = this; 194 - contentEl.empty(); 195 - contentEl.createEl("p", { text: "Saving changes..." }); 196 - 197 - try { 198 - const selectedTags = this.tagStates.filter(s => s.isSelected).map(s => s.tag); 199 - const newTag = this.newTagInput?.value.trim(); 200 - if (newTag && !selectedTags.includes(newTag)) { 201 - selectedTags.push(newTag); 202 - } 203 - const tags = [...new Set(selectedTags)]; 204 - 205 - const rkey = this.record.uri.split("/").pop(); 206 - if (!rkey) { 207 - contentEl.empty(); 208 - contentEl.createEl("p", { text: "Invalid bookmark uri.", cls: "atmark-error" }); 209 - return; 210 - } 211 - 212 - const updatedRecord: Bookmark = { 213 - ...this.record.value, 214 - tags, 215 - }; 216 - 217 - await putRecord( 218 - this.plugin.client, 219 - this.plugin.settings.identifier, 220 - "community.lexicon.bookmarks.bookmark", 221 - rkey, 222 - updatedRecord 223 - ); 224 - 225 - new Notice("Tags updated"); 226 - this.close(); 227 - this.onSuccess?.(); 228 - } catch (err) { 229 - contentEl.empty(); 230 - const message = err instanceof Error ? err.message : String(err); 231 - contentEl.createEl("p", { text: `Failed to save: ${message}`, cls: "atmark-error" }); 232 - } 233 - } 234 - 235 - onClose() { 236 - this.contentEl.empty(); 237 - } 238 - }
-258
src/components/editCardModal.ts
··· 1 - import { Modal, Notice } from "obsidian"; 2 - import type ATmarkPlugin from "../main"; 3 - import { getCollections, getCollectionLinks, createCollectionLink, getRecord, deleteRecord } from "../lib"; 4 - import type { Main as Collection } from "../lexicons/types/network/cosmik/collection"; 5 - import type { Main as CollectionLink } from "../lexicons/types/network/cosmik/collectionLink"; 6 - 7 - interface CollectionRecord { 8 - uri: string; 9 - cid: string; 10 - value: Collection; 11 - } 12 - 13 - interface CollectionLinkRecord { 14 - uri: string; 15 - value: CollectionLink; 16 - } 17 - 18 - interface CollectionState { 19 - collection: CollectionRecord; 20 - isSelected: boolean; 21 - wasSelected: boolean; // Original state to track changes 22 - linkUri?: string; // URI of existing link (for deletion) 23 - } 24 - 25 - export class EditCardModal extends Modal { 26 - plugin: ATmarkPlugin; 27 - cardUri: string; 28 - cardCid: string; 29 - onSuccess?: () => void; 30 - collectionStates: CollectionState[] = []; 31 - 32 - constructor(plugin: ATmarkPlugin, cardUri: string, cardCid: string, onSuccess?: () => void) { 33 - super(plugin.app); 34 - this.plugin = plugin; 35 - this.cardUri = cardUri; 36 - this.cardCid = cardCid; 37 - this.onSuccess = onSuccess; 38 - } 39 - 40 - async onOpen() { 41 - const { contentEl } = this; 42 - contentEl.empty(); 43 - contentEl.addClass("atmark-modal"); 44 - 45 - contentEl.createEl("h2", { text: "Edit collections" }); 46 - 47 - if (!this.plugin.client) { 48 - contentEl.createEl("p", { text: "Not connected." }); 49 - return; 50 - } 51 - 52 - const loading = contentEl.createEl("p", { text: "Loading..." }); 53 - 54 - try { 55 - const [collectionsResp, linksResp] = await Promise.all([ 56 - getCollections(this.plugin.client, this.plugin.settings.identifier), 57 - getCollectionLinks(this.plugin.client, this.plugin.settings.identifier), 58 - ]); 59 - 60 - loading.remove(); 61 - 62 - if (!collectionsResp.ok) { 63 - contentEl.createEl("p", { text: "Failed to load collections.", cls: "atmark-error" }); 64 - return; 65 - } 66 - 67 - const collections = collectionsResp.data.records as unknown as CollectionRecord[]; 68 - const links = (linksResp.ok ? linksResp.data.records : []) as unknown as CollectionLinkRecord[]; 69 - 70 - if (collections.length === 0) { 71 - contentEl.createEl("p", { text: "No collections found. Create a collection first." }); 72 - return; 73 - } 74 - 75 - const cardLinks = links.filter(link => link.value.card.uri === this.cardUri); 76 - const linkedCollectionUris = new Map<string, string>(); 77 - for (const link of cardLinks) { 78 - linkedCollectionUris.set(link.value.collection.uri, link.uri); 79 - } 80 - 81 - this.collectionStates = collections.map(collection => ({ 82 - collection, 83 - isSelected: linkedCollectionUris.has(collection.uri), 84 - wasSelected: linkedCollectionUris.has(collection.uri), 85 - linkUri: linkedCollectionUris.get(collection.uri), 86 - })); 87 - 88 - this.renderCollectionList(contentEl); 89 - } catch (err) { 90 - loading.remove(); 91 - const message = err instanceof Error ? err.message : String(err); 92 - contentEl.createEl("p", { text: `Error: ${message}`, cls: "atmark-error" }); 93 - } 94 - } 95 - 96 - private renderCollectionList(contentEl: HTMLElement) { 97 - const list = contentEl.createEl("div", { cls: "atmark-collection-list" }); 98 - 99 - for (const state of this.collectionStates) { 100 - const item = list.createEl("label", { cls: "atmark-collection-item" }); 101 - 102 - const checkbox = item.createEl("input", { type: "checkbox", cls: "atmark-collection-checkbox" }); 103 - checkbox.checked = state.isSelected; 104 - checkbox.addEventListener("change", () => { 105 - state.isSelected = checkbox.checked; 106 - this.updateSaveButton(); 107 - }); 108 - 109 - const info = item.createEl("div", { cls: "atmark-collection-item-info" }); 110 - info.createEl("span", { text: state.collection.value.name, cls: "atmark-collection-item-name" }); 111 - if (state.collection.value.description) { 112 - info.createEl("span", { text: state.collection.value.description, cls: "atmark-collection-item-desc" }); 113 - } 114 - } 115 - 116 - const actions = contentEl.createEl("div", { cls: "atmark-modal-actions" }); 117 - 118 - const deleteBtn = actions.createEl("button", { text: "Delete", cls: "atmark-btn atmark-btn-danger" }); 119 - deleteBtn.addEventListener("click", () => { this.confirmDelete(contentEl); }); 120 - 121 - actions.createEl("div", { cls: "atmark-spacer" }); 122 - 123 - const cancelBtn = actions.createEl("button", { text: "Cancel", cls: "atmark-btn atmark-btn-secondary" }); 124 - cancelBtn.addEventListener("click", () => { this.close(); }); 125 - 126 - const saveBtn = actions.createEl("button", { text: "Save", cls: "atmark-btn atmark-btn-primary" }); 127 - saveBtn.id = "atmark-save-btn"; 128 - saveBtn.disabled = true; 129 - saveBtn.addEventListener("click", () => { void this.saveChanges(); }); 130 - } 131 - 132 - private confirmDelete(contentEl: HTMLElement) { 133 - contentEl.empty(); 134 - contentEl.createEl("h2", { text: "Delete card" }); 135 - contentEl.createEl("p", { text: "Delete this card?", cls: "atmark-warning-text" }); 136 - 137 - const actions = contentEl.createEl("div", { cls: "atmark-modal-actions" }); 138 - 139 - const cancelBtn = actions.createEl("button", { text: "Cancel", cls: "atmark-btn atmark-btn-secondary" }); 140 - cancelBtn.addEventListener("click", () => { 141 - void this.onOpen(); 142 - }); 143 - 144 - const confirmBtn = actions.createEl("button", { text: "Delete", cls: "atmark-btn atmark-btn-danger" }); 145 - confirmBtn.addEventListener("click", () => { void this.deleteCard(); }); 146 - } 147 - 148 - private async deleteCard() { 149 - if (!this.plugin.client) return; 150 - 151 - const { contentEl } = this; 152 - contentEl.empty(); 153 - contentEl.createEl("p", { text: "Deleting card..." }); 154 - 155 - try { 156 - const rkey = this.cardUri.split("/").pop(); 157 - if (!rkey) { 158 - contentEl.empty(); 159 - contentEl.createEl("p", { text: "Invalid card uri.", cls: "atmark-error" }); 160 - return; 161 - } 162 - 163 - await deleteRecord( 164 - this.plugin.client, 165 - this.plugin.settings.identifier, 166 - "network.cosmik.card", 167 - rkey 168 - ); 169 - 170 - new Notice("Card deleted"); 171 - this.close(); 172 - this.onSuccess?.(); 173 - } catch (err) { 174 - contentEl.empty(); 175 - const message = err instanceof Error ? err.message : String(err); 176 - contentEl.createEl("p", { text: `Failed to delete: ${message}`, cls: "atmark-error" }); 177 - } 178 - } 179 - 180 - private updateSaveButton() { 181 - const saveBtn = document.getElementById("atmark-save-btn") as HTMLButtonElement | null; 182 - if (!saveBtn) return; 183 - 184 - const hasChanges = this.collectionStates.some(s => s.isSelected !== s.wasSelected); 185 - saveBtn.disabled = !hasChanges; 186 - } 187 - 188 - private async saveChanges() { 189 - if (!this.plugin.client) return; 190 - 191 - const { contentEl } = this; 192 - contentEl.empty(); 193 - contentEl.createEl("p", { text: "Saving changes..." }); 194 - 195 - try { 196 - const toAdd = this.collectionStates.filter(s => s.isSelected && !s.wasSelected); 197 - const toRemove = this.collectionStates.filter(s => !s.isSelected && s.wasSelected); 198 - 199 - for (const state of toRemove) { 200 - if (state.linkUri) { 201 - const rkey = state.linkUri.split("/").pop(); 202 - if (rkey) { 203 - await deleteRecord( 204 - this.plugin.client, 205 - this.plugin.settings.identifier, 206 - "network.cosmik.collectionLink", 207 - rkey 208 - ); 209 - } 210 - } 211 - } 212 - 213 - for (const state of toAdd) { 214 - const collectionRkey = state.collection.uri.split("/").pop(); 215 - if (!collectionRkey) continue; 216 - 217 - const collectionResp = await getRecord( 218 - this.plugin.client, 219 - this.plugin.settings.identifier, 220 - "network.cosmik.collection", 221 - collectionRkey 222 - ); 223 - 224 - if (!collectionResp.ok || !collectionResp.data.cid) continue; 225 - 226 - await createCollectionLink( 227 - this.plugin.client, 228 - this.plugin.settings.identifier, 229 - this.cardUri, 230 - this.cardCid, 231 - state.collection.uri, 232 - String(collectionResp.data.cid) 233 - ); 234 - } 235 - 236 - const addedCount = toAdd.length; 237 - const removedCount = toRemove.length; 238 - const messages: string[] = []; 239 - if (addedCount > 0) messages.push(`Added to ${addedCount} collection${addedCount > 1 ? "s" : ""}`); 240 - if (removedCount > 0) messages.push(`Removed from ${removedCount} collection${removedCount > 1 ? "s" : ""}`); 241 - 242 - if (messages.length > 0) { 243 - new Notice(messages.join(". ")); 244 - } 245 - 246 - this.close(); 247 - this.onSuccess?.(); 248 - } catch (err) { 249 - contentEl.empty(); 250 - const message = err instanceof Error ? err.message : String(err); 251 - contentEl.createEl("p", { text: `Failed to save: ${message}`, cls: "atmark-error" }); 252 - } 253 - } 254 - 255 - onClose() { 256 - this.contentEl.empty(); 257 - } 258 - }
-331
src/components/editMarginBookmarkModal.ts
··· 1 - import { Modal, Notice } from "obsidian"; 2 - import type { Record } from "@atcute/atproto/types/repo/listRecords"; 3 - import type { Main as MarginBookmark } from "../lexicons/types/at/margin/bookmark"; 4 - import type { Main as MarginCollection } from "../lexicons/types/at/margin/collection"; 5 - import type { Main as MarginCollectionItem } from "../lexicons/types/at/margin/collectionItem"; 6 - import type ATmarkPlugin from "../main"; 7 - import { putRecord, deleteRecord, getMarginCollections, getMarginCollectionItems, createMarginCollectionItem, getMarginBookmarks } from "../lib"; 8 - 9 - type MarginBookmarkRecord = Record & { value: MarginBookmark }; 10 - type MarginCollectionRecord = Record & { value: MarginCollection }; 11 - type MarginCollectionItemRecord = Record & { value: MarginCollectionItem }; 12 - 13 - interface CollectionState { 14 - collection: MarginCollectionRecord; 15 - isSelected: boolean; 16 - wasSelected: boolean; 17 - linkUri?: string; 18 - } 19 - 20 - interface TagState { 21 - tag: string; 22 - isSelected: boolean; 23 - } 24 - 25 - export class EditMarginBookmarkModal extends Modal { 26 - plugin: ATmarkPlugin; 27 - record: MarginBookmarkRecord; 28 - onSuccess?: () => void; 29 - tagStates: TagState[] = []; 30 - newTagInput: HTMLInputElement | null = null; 31 - collectionStates: CollectionState[] = []; 32 - 33 - constructor(plugin: ATmarkPlugin, record: MarginBookmarkRecord, onSuccess?: () => void) { 34 - super(plugin.app); 35 - this.plugin = plugin; 36 - this.record = record; 37 - this.onSuccess = onSuccess; 38 - } 39 - 40 - async onOpen() { 41 - const { contentEl } = this; 42 - contentEl.empty(); 43 - contentEl.addClass("atmark-modal"); 44 - 45 - contentEl.createEl("h2", { text: "Edit margin bookmark" }); 46 - 47 - if (!this.plugin.client) { 48 - contentEl.createEl("p", { text: "Not connected." }); 49 - return; 50 - } 51 - 52 - const loading = contentEl.createEl("p", { text: "Loading..." }); 53 - 54 - try { 55 - const [collectionsResp, itemsResp, bookmarksResp] = await Promise.all([ 56 - getMarginCollections(this.plugin.client, this.plugin.settings.identifier), 57 - getMarginCollectionItems(this.plugin.client, this.plugin.settings.identifier), 58 - getMarginBookmarks(this.plugin.client, this.plugin.settings.identifier), 59 - ]); 60 - 61 - loading.remove(); 62 - 63 - const collections = (collectionsResp.ok ? collectionsResp.data.records : []) as unknown as MarginCollectionRecord[]; 64 - const items = (itemsResp.ok ? itemsResp.data.records : []) as unknown as MarginCollectionItemRecord[]; 65 - const bookmarks = (bookmarksResp.ok ? bookmarksResp.data.records : []) as unknown as MarginBookmarkRecord[]; 66 - 67 - const bookmarkLinks = items.filter(item => item.value.annotation === this.record.uri); 68 - const linkedCollectionUris = new Map<string, string>(); 69 - for (const link of bookmarkLinks) { 70 - linkedCollectionUris.set(link.value.collection, link.uri); 71 - } 72 - 73 - this.collectionStates = collections.map(collection => ({ 74 - collection, 75 - isSelected: linkedCollectionUris.has(collection.uri), 76 - wasSelected: linkedCollectionUris.has(collection.uri), 77 - linkUri: linkedCollectionUris.get(collection.uri), 78 - })); 79 - 80 - const allTags = new Set<string>(); 81 - for (const bookmark of bookmarks) { 82 - if (bookmark.value.tags) { 83 - for (const tag of bookmark.value.tags) { 84 - allTags.add(tag); 85 - } 86 - } 87 - } 88 - 89 - const currentTags = new Set(this.record.value.tags || []); 90 - this.tagStates = Array.from(allTags).sort().map(tag => ({ 91 - tag, 92 - isSelected: currentTags.has(tag), 93 - })); 94 - 95 - this.renderForm(contentEl); 96 - } catch (err) { 97 - loading.remove(); 98 - const message = err instanceof Error ? err.message : String(err); 99 - contentEl.createEl("p", { text: `Error: ${message}`, cls: "atmark-error" }); 100 - } 101 - } 102 - 103 - private renderForm(contentEl: HTMLElement) { 104 - const form = contentEl.createEl("div", { cls: "atmark-form" }); 105 - 106 - const tagsGroup = form.createEl("div", { cls: "atmark-form-group" }); 107 - tagsGroup.createEl("label", { text: "Tags" }); 108 - 109 - const tagsList = tagsGroup.createEl("div", { cls: "atmark-tag-list" }); 110 - for (const state of this.tagStates) { 111 - this.addTagChip(tagsList, state); 112 - } 113 - 114 - const newTagRow = tagsGroup.createEl("div", { cls: "atmark-tag-row" }); 115 - this.newTagInput = newTagRow.createEl("input", { 116 - type: "text", 117 - cls: "atmark-input", 118 - attr: { placeholder: "Add new tag..." } 119 - }); 120 - const addBtn = newTagRow.createEl("button", { 121 - text: "Add", 122 - cls: "atmark-btn atmark-btn-secondary", 123 - attr: { type: "button" } 124 - }); 125 - addBtn.addEventListener("click", () => { 126 - const value = this.newTagInput?.value.trim(); 127 - if (value && !this.tagStates.some(s => s.tag === value)) { 128 - const newState = { tag: value, isSelected: true }; 129 - this.tagStates.push(newState); 130 - this.addTagChip(tagsList, newState); 131 - if (this.newTagInput) this.newTagInput.value = ""; 132 - } 133 - }); 134 - 135 - if (this.collectionStates.length > 0) { 136 - const collectionsGroup = form.createEl("div", { cls: "atmark-form-group" }); 137 - collectionsGroup.createEl("label", { text: "Collections" }); 138 - 139 - const collectionsList = collectionsGroup.createEl("div", { cls: "atmark-collection-list" }); 140 - 141 - for (const state of this.collectionStates) { 142 - const item = collectionsList.createEl("label", { cls: "atmark-collection-item" }); 143 - 144 - const checkbox = item.createEl("input", { type: "checkbox", cls: "atmark-collection-checkbox" }); 145 - checkbox.checked = state.isSelected; 146 - checkbox.addEventListener("change", () => { 147 - state.isSelected = checkbox.checked; 148 - }); 149 - 150 - const info = item.createEl("div", { cls: "atmark-collection-item-info" }); 151 - info.createEl("span", { text: state.collection.value.name, cls: "atmark-collection-item-name" }); 152 - if (state.collection.value.description) { 153 - info.createEl("span", { text: state.collection.value.description, cls: "atmark-collection-item-desc" }); 154 - } 155 - } 156 - } 157 - 158 - const actions = contentEl.createEl("div", { cls: "atmark-modal-actions" }); 159 - 160 - const deleteBtn = actions.createEl("button", { 161 - text: "Delete", 162 - cls: "atmark-btn atmark-btn-danger" 163 - }); 164 - deleteBtn.addEventListener("click", () => { this.confirmDelete(contentEl); }); 165 - 166 - actions.createEl("div", { cls: "atmark-spacer" }); 167 - 168 - const cancelBtn = actions.createEl("button", { 169 - text: "Cancel", 170 - cls: "atmark-btn atmark-btn-secondary" 171 - }); 172 - cancelBtn.addEventListener("click", () => { this.close(); }); 173 - 174 - const saveBtn = actions.createEl("button", { 175 - text: "Save", 176 - cls: "atmark-btn atmark-btn-primary" 177 - }); 178 - saveBtn.addEventListener("click", () => { void this.saveChanges(); }); 179 - } 180 - 181 - private addTagChip(container: HTMLElement, state: TagState) { 182 - const item = container.createEl("label", { cls: "atmark-tag-item" }); 183 - const checkbox = item.createEl("input", { type: "checkbox" }); 184 - checkbox.checked = state.isSelected; 185 - checkbox.addEventListener("change", () => { 186 - state.isSelected = checkbox.checked; 187 - }); 188 - item.createEl("span", { text: state.tag }); 189 - } 190 - 191 - private confirmDelete(contentEl: HTMLElement) { 192 - contentEl.empty(); 193 - contentEl.createEl("h2", { text: "Delete bookmark" }); 194 - contentEl.createEl("p", { text: "Delete this bookmark?", cls: "atmark-warning-text" }); 195 - 196 - const actions = contentEl.createEl("div", { cls: "atmark-modal-actions" }); 197 - 198 - const cancelBtn = actions.createEl("button", { 199 - text: "Cancel", 200 - cls: "atmark-btn atmark-btn-secondary" 201 - }); 202 - cancelBtn.addEventListener("click", () => { 203 - void this.onOpen(); 204 - }); 205 - 206 - const confirmBtn = actions.createEl("button", { 207 - text: "Delete", 208 - cls: "atmark-btn atmark-btn-danger" 209 - }); 210 - confirmBtn.addEventListener("click", () => { void this.deleteBookmark(); }); 211 - } 212 - 213 - private async deleteBookmark() { 214 - if (!this.plugin.client) return; 215 - 216 - const { contentEl } = this; 217 - contentEl.empty(); 218 - contentEl.createEl("p", { text: "Deleting bookmark..." }); 219 - 220 - try { 221 - const rkey = this.record.uri.split("/").pop(); 222 - if (!rkey) { 223 - contentEl.empty(); 224 - contentEl.createEl("p", { text: "Invalid bookmark uri.", cls: "atmark-error" }); 225 - return; 226 - } 227 - 228 - await deleteRecord( 229 - this.plugin.client, 230 - this.plugin.settings.identifier, 231 - "at.margin.bookmark", 232 - rkey 233 - ); 234 - 235 - new Notice("Bookmark deleted"); 236 - this.close(); 237 - this.onSuccess?.(); 238 - } catch (err) { 239 - contentEl.empty(); 240 - const message = err instanceof Error ? err.message : String(err); 241 - contentEl.createEl("p", { text: `Failed to delete: ${message}`, cls: "atmark-error" }); 242 - } 243 - } 244 - 245 - private async saveChanges() { 246 - if (!this.plugin.client) return; 247 - 248 - const { contentEl } = this; 249 - contentEl.empty(); 250 - contentEl.createEl("p", { text: "Saving changes..." }); 251 - 252 - try { 253 - const selectedTags = this.tagStates.filter(s => s.isSelected).map(s => s.tag); 254 - const newTag = this.newTagInput?.value.trim(); 255 - if (newTag && !selectedTags.includes(newTag)) { 256 - selectedTags.push(newTag); 257 - } 258 - const tags = [...new Set(selectedTags)]; 259 - 260 - const rkey = this.record.uri.split("/").pop(); 261 - if (!rkey) { 262 - contentEl.empty(); 263 - contentEl.createEl("p", { text: "Invalid bookmark uri.", cls: "atmark-error" }); 264 - return; 265 - } 266 - 267 - const updatedRecord: MarginBookmark = { 268 - ...this.record.value, 269 - tags, 270 - }; 271 - 272 - await putRecord( 273 - this.plugin.client, 274 - this.plugin.settings.identifier, 275 - "at.margin.bookmark", 276 - rkey, 277 - updatedRecord 278 - ); 279 - 280 - const collectionsToAdd = this.collectionStates.filter(s => s.isSelected && !s.wasSelected); 281 - const collectionsToRemove = this.collectionStates.filter(s => !s.isSelected && s.wasSelected); 282 - 283 - for (const state of collectionsToRemove) { 284 - if (state.linkUri) { 285 - const linkRkey = state.linkUri.split("/").pop(); 286 - if (linkRkey) { 287 - await deleteRecord( 288 - this.plugin.client, 289 - this.plugin.settings.identifier, 290 - "at.margin.collectionItem", 291 - linkRkey 292 - ); 293 - } 294 - } 295 - } 296 - 297 - for (const state of collectionsToAdd) { 298 - await createMarginCollectionItem( 299 - this.plugin.client, 300 - this.plugin.settings.identifier, 301 - this.record.uri, 302 - state.collection.uri 303 - ); 304 - } 305 - 306 - const messages: string[] = []; 307 - if (tags.length !== (this.record.value.tags?.length || 0) || 308 - !tags.every(t => this.record.value.tags?.includes(t))) { 309 - messages.push("Tags updated"); 310 - } 311 - if (collectionsToAdd.length > 0) { 312 - messages.push(`Added to ${collectionsToAdd.length} collection${collectionsToAdd.length > 1 ? "s" : ""}`); 313 - } 314 - if (collectionsToRemove.length > 0) { 315 - messages.push(`Removed from ${collectionsToRemove.length} collection${collectionsToRemove.length > 1 ? "s" : ""}`); 316 - } 317 - 318 - new Notice(messages.length > 0 ? messages.join(". ") : "Saved"); 319 - this.close(); 320 - this.onSuccess?.(); 321 - } catch (err) { 322 - contentEl.empty(); 323 - const message = err instanceof Error ? err.message : String(err); 324 - contentEl.createEl("p", { text: `Failed to save: ${message}`, cls: "atmark-error" }); 325 - } 326 - } 327 - 328 - onClose() { 329 - this.contentEl.empty(); 330 - } 331 - }
-72
src/components/profileIcon.ts
··· 1 - import type { Client } from "@atcute/client"; 2 - import { getProfile } from "../lib"; 3 - 4 - export interface ProfileData { 5 - did: string; 6 - handle: string; 7 - displayName?: string; 8 - avatar?: string; 9 - } 10 - 11 - export async function fetchProfileData(client: Client, actor: string): Promise<ProfileData | null> { 12 - try { 13 - const resp = await getProfile(client, actor); 14 - if (!resp.ok) return null; 15 - 16 - return { 17 - did: resp.data.did, 18 - handle: resp.data.handle, 19 - displayName: resp.data.displayName, 20 - avatar: resp.data.avatar, 21 - }; 22 - } catch (e) { 23 - console.error("Failed to fetch profile:", e); 24 - return null; 25 - } 26 - } 27 - 28 - export function renderProfileIcon( 29 - container: HTMLElement, 30 - profile: ProfileData | null, 31 - onClick?: () => void 32 - ): HTMLElement { 33 - const wrapper = container.createEl("div", { cls: "atmark-profile-icon" }); 34 - 35 - if (!profile) { 36 - // Fallback when no profile data 37 - const placeholder = wrapper.createEl("div", { cls: "atmark-avatar-placeholder" }); 38 - placeholder.createEl("span", { text: "?" }); 39 - return wrapper; 40 - } 41 - 42 - const avatarBtn = wrapper.createEl("button", { cls: "atmark-avatar-btn" }); 43 - 44 - if (profile.avatar) { 45 - const img = avatarBtn.createEl("img", { cls: "atmark-avatar-img" }); 46 - img.src = profile.avatar; 47 - img.alt = profile.displayName || profile.handle; 48 - } else { 49 - // Fallback initials 50 - const initials = (profile.displayName || profile.handle) 51 - .split(" ") 52 - .map(w => w[0]) 53 - .slice(0, 2) 54 - .join("") 55 - .toUpperCase(); 56 - avatarBtn.createEl("span", { text: initials, cls: "atmark-avatar-initials" }); 57 - } 58 - 59 - const info = wrapper.createEl("div", { cls: "atmark-profile-info" }); 60 - 61 - if (profile.displayName) { 62 - info.createEl("span", { text: profile.displayName, cls: "atmark-profile-name" }); 63 - } 64 - 65 - info.createEl("span", { text: `@${profile.handle}`, cls: "atmark-profile-handle" }); 66 - 67 - if (onClick) { 68 - avatarBtn.addEventListener("click", onClick); 69 - } 70 - 71 - return wrapper; 72 - }
-2
src/env.d.ts
··· 1 - /// <reference types="@atcute/bluesky" /> 2 - /// <reference types="@atcute/atproto" />
-13
src/lexicons/index.ts
··· 1 - export * as AtMarginAnnotation from "./types/at/margin/annotation.js"; 2 - export * as AtMarginBookmark from "./types/at/margin/bookmark.js"; 3 - export * as AtMarginCollection from "./types/at/margin/collection.js"; 4 - export * as AtMarginCollectionItem from "./types/at/margin/collectionItem.js"; 5 - export * as AtMarginHighlight from "./types/at/margin/highlight.js"; 6 - export * as AtMarginLike from "./types/at/margin/like.js"; 7 - export * as AtMarginProfile from "./types/at/margin/profile.js"; 8 - export * as AtMarginReply from "./types/at/margin/reply.js"; 9 - export * as ComAtprotoRepoStrongRef from "./types/com/atproto/repo/strongRef.js"; 10 - export * as NetworkCosmikCard from "./types/network/cosmik/card.js"; 11 - export * as NetworkCosmikCollection from "./types/network/cosmik/collection.js"; 12 - export * as NetworkCosmikCollectionLink from "./types/network/cosmik/collectionLink.js"; 13 - export * as NetworkCosmikDefs from "./types/network/cosmik/defs.js";
-330
src/lexicons/types/at/margin/annotation.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - import type {} from "@atcute/lexicons/ambient"; 4 - 5 - const _bodySchema = /*#__PURE__*/ v.object({ 6 - $type: /*#__PURE__*/ v.optional( 7 - /*#__PURE__*/ v.literal("at.margin.annotation#body"), 8 - ), 9 - /** 10 - * MIME type of the body content 11 - * @default "text/plain" 12 - */ 13 - format: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string(), "text/plain"), 14 - /** 15 - * BCP47 language tag 16 - */ 17 - language: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 18 - /** 19 - * Reference to external body content 20 - */ 21 - uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 22 - /** 23 - * Text content of the annotation 24 - * @maxLength 10000 25 - * @maxGraphemes 3000 26 - */ 27 - value: /*#__PURE__*/ v.optional( 28 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 29 - /*#__PURE__*/ v.stringLength(0, 10000), 30 - /*#__PURE__*/ v.stringGraphemes(0, 3000), 31 - ]), 32 - ), 33 - }); 34 - const _cssSelectorSchema = /*#__PURE__*/ v.object({ 35 - $type: /*#__PURE__*/ v.optional( 36 - /*#__PURE__*/ v.literal("at.margin.annotation#cssSelector"), 37 - ), 38 - type: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("CssSelector")), 39 - /** 40 - * CSS selector string 41 - * @maxLength 2000 42 - */ 43 - value: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 44 - /*#__PURE__*/ v.stringLength(0, 2000), 45 - ]), 46 - }); 47 - const _fragmentSelectorSchema = /*#__PURE__*/ v.object({ 48 - $type: /*#__PURE__*/ v.optional( 49 - /*#__PURE__*/ v.literal("at.margin.annotation#fragmentSelector"), 50 - ), 51 - /** 52 - * Specification the fragment conforms to 53 - */ 54 - conformsTo: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 55 - type: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("FragmentSelector")), 56 - /** 57 - * Fragment identifier value 58 - * @maxLength 1000 59 - */ 60 - value: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 61 - /*#__PURE__*/ v.stringLength(0, 1000), 62 - ]), 63 - }); 64 - const _mainSchema = /*#__PURE__*/ v.record( 65 - /*#__PURE__*/ v.tidString(), 66 - /*#__PURE__*/ v.object({ 67 - $type: /*#__PURE__*/ v.literal("at.margin.annotation"), 68 - /** 69 - * The annotation content (text or reference) 70 - */ 71 - get body() { 72 - return /*#__PURE__*/ v.optional(bodySchema); 73 - }, 74 - createdAt: /*#__PURE__*/ v.datetimeString(), 75 - /** 76 - * W3C motivation for the annotation 77 - */ 78 - motivation: /*#__PURE__*/ v.optional( 79 - /*#__PURE__*/ v.string< 80 - | "assessing" 81 - | "bookmarking" 82 - | "commenting" 83 - | "describing" 84 - | "editing" 85 - | "highlighting" 86 - | "linking" 87 - | "questioning" 88 - | "replying" 89 - | "tagging" 90 - | (string & {}) 91 - >(), 92 - ), 93 - /** 94 - * Tags for categorization 95 - * @maxLength 10 96 - */ 97 - tags: /*#__PURE__*/ v.optional( 98 - /*#__PURE__*/ v.constrain( 99 - /*#__PURE__*/ v.array( 100 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 101 - /*#__PURE__*/ v.stringLength(0, 64), 102 - /*#__PURE__*/ v.stringGraphemes(0, 32), 103 - ]), 104 - ), 105 - [/*#__PURE__*/ v.arrayLength(0, 10)], 106 - ), 107 - ), 108 - /** 109 - * The resource being annotated with optional selector 110 - */ 111 - get target() { 112 - return targetSchema; 113 - }, 114 - }), 115 - ); 116 - const _rangeSelectorSchema = /*#__PURE__*/ v.object({ 117 - $type: /*#__PURE__*/ v.optional( 118 - /*#__PURE__*/ v.literal("at.margin.annotation#rangeSelector"), 119 - ), 120 - /** 121 - * Selector for range end 122 - */ 123 - get endSelector() { 124 - return /*#__PURE__*/ v.variant([ 125 - cssSelectorSchema, 126 - textPositionSelectorSchema, 127 - textQuoteSelectorSchema, 128 - xpathSelectorSchema, 129 - ]); 130 - }, 131 - /** 132 - * Selector for range start 133 - */ 134 - get startSelector() { 135 - return /*#__PURE__*/ v.variant([ 136 - cssSelectorSchema, 137 - textPositionSelectorSchema, 138 - textQuoteSelectorSchema, 139 - xpathSelectorSchema, 140 - ]); 141 - }, 142 - type: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("RangeSelector")), 143 - }); 144 - const _targetSchema = /*#__PURE__*/ v.object({ 145 - $type: /*#__PURE__*/ v.optional( 146 - /*#__PURE__*/ v.literal("at.margin.annotation#target"), 147 - ), 148 - /** 149 - * Selector to identify the specific segment 150 - */ 151 - get selector() { 152 - return /*#__PURE__*/ v.optional( 153 - /*#__PURE__*/ v.variant([ 154 - cssSelectorSchema, 155 - fragmentSelectorSchema, 156 - rangeSelectorSchema, 157 - textPositionSelectorSchema, 158 - textQuoteSelectorSchema, 159 - xpathSelectorSchema, 160 - ]), 161 - ); 162 - }, 163 - /** 164 - * The URL being annotated 165 - */ 166 - source: /*#__PURE__*/ v.genericUriString(), 167 - /** 168 - * SHA256 hash of normalized URL for indexing 169 - */ 170 - sourceHash: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 171 - /** 172 - * State of the resource at annotation time 173 - */ 174 - get state() { 175 - return /*#__PURE__*/ v.optional(timeStateSchema); 176 - }, 177 - /** 178 - * Page title at time of annotation 179 - * @maxLength 500 180 - */ 181 - title: /*#__PURE__*/ v.optional( 182 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 183 - /*#__PURE__*/ v.stringLength(0, 500), 184 - ]), 185 - ), 186 - }); 187 - const _textPositionSelectorSchema = /*#__PURE__*/ v.object({ 188 - $type: /*#__PURE__*/ v.optional( 189 - /*#__PURE__*/ v.literal("at.margin.annotation#textPositionSelector"), 190 - ), 191 - /** 192 - * Ending character position (exclusive) 193 - * @minimum 0 194 - */ 195 - end: /*#__PURE__*/ v.integer(), 196 - /** 197 - * Starting character position (0-indexed, inclusive) 198 - * @minimum 0 199 - */ 200 - start: /*#__PURE__*/ v.integer(), 201 - type: /*#__PURE__*/ v.optional( 202 - /*#__PURE__*/ v.literal("TextPositionSelector"), 203 - ), 204 - }); 205 - const _textQuoteSelectorSchema = /*#__PURE__*/ v.object({ 206 - $type: /*#__PURE__*/ v.optional( 207 - /*#__PURE__*/ v.literal("at.margin.annotation#textQuoteSelector"), 208 - ), 209 - /** 210 - * The exact text to match 211 - * @maxLength 5000 212 - * @maxGraphemes 1500 213 - */ 214 - exact: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 215 - /*#__PURE__*/ v.stringLength(0, 5000), 216 - /*#__PURE__*/ v.stringGraphemes(0, 1500), 217 - ]), 218 - /** 219 - * Text immediately before the selection 220 - * @maxLength 500 221 - * @maxGraphemes 150 222 - */ 223 - prefix: /*#__PURE__*/ v.optional( 224 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 225 - /*#__PURE__*/ v.stringLength(0, 500), 226 - /*#__PURE__*/ v.stringGraphemes(0, 150), 227 - ]), 228 - ), 229 - /** 230 - * Text immediately after the selection 231 - * @maxLength 500 232 - * @maxGraphemes 150 233 - */ 234 - suffix: /*#__PURE__*/ v.optional( 235 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 236 - /*#__PURE__*/ v.stringLength(0, 500), 237 - /*#__PURE__*/ v.stringGraphemes(0, 150), 238 - ]), 239 - ), 240 - type: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("TextQuoteSelector")), 241 - }); 242 - const _timeStateSchema = /*#__PURE__*/ v.object({ 243 - $type: /*#__PURE__*/ v.optional( 244 - /*#__PURE__*/ v.literal("at.margin.annotation#timeState"), 245 - ), 246 - /** 247 - * URL to cached/archived version 248 - */ 249 - cached: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 250 - /** 251 - * When the source was accessed 252 - */ 253 - sourceDate: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 254 - }); 255 - const _xpathSelectorSchema = /*#__PURE__*/ v.object({ 256 - $type: /*#__PURE__*/ v.optional( 257 - /*#__PURE__*/ v.literal("at.margin.annotation#xpathSelector"), 258 - ), 259 - type: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("XPathSelector")), 260 - /** 261 - * XPath expression 262 - * @maxLength 2000 263 - */ 264 - value: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 265 - /*#__PURE__*/ v.stringLength(0, 2000), 266 - ]), 267 - }); 268 - 269 - type body$schematype = typeof _bodySchema; 270 - type cssSelector$schematype = typeof _cssSelectorSchema; 271 - type fragmentSelector$schematype = typeof _fragmentSelectorSchema; 272 - type main$schematype = typeof _mainSchema; 273 - type rangeSelector$schematype = typeof _rangeSelectorSchema; 274 - type target$schematype = typeof _targetSchema; 275 - type textPositionSelector$schematype = typeof _textPositionSelectorSchema; 276 - type textQuoteSelector$schematype = typeof _textQuoteSelectorSchema; 277 - type timeState$schematype = typeof _timeStateSchema; 278 - type xpathSelector$schematype = typeof _xpathSelectorSchema; 279 - 280 - export interface bodySchema extends body$schematype {} 281 - export interface cssSelectorSchema extends cssSelector$schematype {} 282 - export interface fragmentSelectorSchema extends fragmentSelector$schematype {} 283 - export interface mainSchema extends main$schematype {} 284 - export interface rangeSelectorSchema extends rangeSelector$schematype {} 285 - export interface targetSchema extends target$schematype {} 286 - export interface textPositionSelectorSchema extends textPositionSelector$schematype {} 287 - export interface textQuoteSelectorSchema extends textQuoteSelector$schematype {} 288 - export interface timeStateSchema extends timeState$schematype {} 289 - export interface xpathSelectorSchema extends xpathSelector$schematype {} 290 - 291 - export const bodySchema = _bodySchema as bodySchema; 292 - export const cssSelectorSchema = _cssSelectorSchema as cssSelectorSchema; 293 - export const fragmentSelectorSchema = 294 - _fragmentSelectorSchema as fragmentSelectorSchema; 295 - export const mainSchema = _mainSchema as mainSchema; 296 - export const rangeSelectorSchema = _rangeSelectorSchema as rangeSelectorSchema; 297 - export const targetSchema = _targetSchema as targetSchema; 298 - export const textPositionSelectorSchema = 299 - _textPositionSelectorSchema as textPositionSelectorSchema; 300 - export const textQuoteSelectorSchema = 301 - _textQuoteSelectorSchema as textQuoteSelectorSchema; 302 - export const timeStateSchema = _timeStateSchema as timeStateSchema; 303 - export const xpathSelectorSchema = _xpathSelectorSchema as xpathSelectorSchema; 304 - 305 - export interface Body extends v.InferInput<typeof bodySchema> {} 306 - export interface CssSelector extends v.InferInput<typeof cssSelectorSchema> {} 307 - export interface FragmentSelector extends v.InferInput< 308 - typeof fragmentSelectorSchema 309 - > {} 310 - export interface Main extends v.InferInput<typeof mainSchema> {} 311 - export interface RangeSelector extends v.InferInput< 312 - typeof rangeSelectorSchema 313 - > {} 314 - export interface Target extends v.InferInput<typeof targetSchema> {} 315 - export interface TextPositionSelector extends v.InferInput< 316 - typeof textPositionSelectorSchema 317 - > {} 318 - export interface TextQuoteSelector extends v.InferInput< 319 - typeof textQuoteSelectorSchema 320 - > {} 321 - export interface TimeState extends v.InferInput<typeof timeStateSchema> {} 322 - export interface XpathSelector extends v.InferInput< 323 - typeof xpathSelectorSchema 324 - > {} 325 - 326 - declare module "@atcute/lexicons/ambient" { 327 - interface Records { 328 - "at.margin.annotation": mainSchema; 329 - } 330 - }
-68
src/lexicons/types/at/margin/bookmark.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - import type {} from "@atcute/lexicons/ambient"; 4 - 5 - const _mainSchema = /*#__PURE__*/ v.record( 6 - /*#__PURE__*/ v.tidString(), 7 - /*#__PURE__*/ v.object({ 8 - $type: /*#__PURE__*/ v.literal("at.margin.bookmark"), 9 - createdAt: /*#__PURE__*/ v.datetimeString(), 10 - /** 11 - * Optional description/note 12 - * @maxLength 1000 13 - * @maxGraphemes 300 14 - */ 15 - description: /*#__PURE__*/ v.optional( 16 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 - /*#__PURE__*/ v.stringLength(0, 1000), 18 - /*#__PURE__*/ v.stringGraphemes(0, 300), 19 - ]), 20 - ), 21 - /** 22 - * The bookmarked URL 23 - */ 24 - source: /*#__PURE__*/ v.genericUriString(), 25 - /** 26 - * SHA256 hash of normalized URL for indexing 27 - */ 28 - sourceHash: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 29 - /** 30 - * Tags for categorization 31 - * @maxLength 10 32 - */ 33 - tags: /*#__PURE__*/ v.optional( 34 - /*#__PURE__*/ v.constrain( 35 - /*#__PURE__*/ v.array( 36 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 37 - /*#__PURE__*/ v.stringLength(0, 64), 38 - /*#__PURE__*/ v.stringGraphemes(0, 32), 39 - ]), 40 - ), 41 - [/*#__PURE__*/ v.arrayLength(0, 10)], 42 - ), 43 - ), 44 - /** 45 - * Page title 46 - * @maxLength 500 47 - */ 48 - title: /*#__PURE__*/ v.optional( 49 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 50 - /*#__PURE__*/ v.stringLength(0, 500), 51 - ]), 52 - ), 53 - }), 54 - ); 55 - 56 - type main$schematype = typeof _mainSchema; 57 - 58 - export interface mainSchema extends main$schematype {} 59 - 60 - export const mainSchema = _mainSchema as mainSchema; 61 - 62 - export interface Main extends v.InferInput<typeof mainSchema> {} 63 - 64 - declare module "@atcute/lexicons/ambient" { 65 - interface Records { 66 - "at.margin.bookmark": mainSchema; 67 - } 68 - }
-56
src/lexicons/types/at/margin/collection.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - import type {} from "@atcute/lexicons/ambient"; 4 - 5 - const _mainSchema = /*#__PURE__*/ v.record( 6 - /*#__PURE__*/ v.tidString(), 7 - /*#__PURE__*/ v.object({ 8 - $type: /*#__PURE__*/ v.literal("at.margin.collection"), 9 - createdAt: /*#__PURE__*/ v.datetimeString(), 10 - /** 11 - * Collection description 12 - * @maxLength 500 13 - * @maxGraphemes 150 14 - */ 15 - description: /*#__PURE__*/ v.optional( 16 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 17 - /*#__PURE__*/ v.stringLength(0, 500), 18 - /*#__PURE__*/ v.stringGraphemes(0, 150), 19 - ]), 20 - ), 21 - /** 22 - * Emoji icon or icon identifier for the collection 23 - * @maxLength 100 24 - * @maxGraphemes 100 25 - */ 26 - icon: /*#__PURE__*/ v.optional( 27 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 28 - /*#__PURE__*/ v.stringLength(0, 100), 29 - /*#__PURE__*/ v.stringGraphemes(0, 100), 30 - ]), 31 - ), 32 - /** 33 - * Collection name 34 - * @maxLength 100 35 - * @maxGraphemes 50 36 - */ 37 - name: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 38 - /*#__PURE__*/ v.stringLength(0, 100), 39 - /*#__PURE__*/ v.stringGraphemes(0, 50), 40 - ]), 41 - }), 42 - ); 43 - 44 - type main$schematype = typeof _mainSchema; 45 - 46 - export interface mainSchema extends main$schematype {} 47 - 48 - export const mainSchema = _mainSchema as mainSchema; 49 - 50 - export interface Main extends v.InferInput<typeof mainSchema> {} 51 - 52 - declare module "@atcute/lexicons/ambient" { 53 - interface Records { 54 - "at.margin.collection": mainSchema; 55 - } 56 - }
-38
src/lexicons/types/at/margin/collectionItem.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - import type {} from "@atcute/lexicons/ambient"; 4 - 5 - const _mainSchema = /*#__PURE__*/ v.record( 6 - /*#__PURE__*/ v.tidString(), 7 - /*#__PURE__*/ v.object({ 8 - $type: /*#__PURE__*/ v.literal("at.margin.collectionItem"), 9 - /** 10 - * AT URI of the annotation, highlight, or bookmark 11 - */ 12 - annotation: /*#__PURE__*/ v.resourceUriString(), 13 - /** 14 - * AT URI of the collection 15 - */ 16 - collection: /*#__PURE__*/ v.resourceUriString(), 17 - createdAt: /*#__PURE__*/ v.datetimeString(), 18 - /** 19 - * Sort order within the collection 20 - * @minimum 0 21 - */ 22 - position: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), 23 - }), 24 - ); 25 - 26 - type main$schematype = typeof _mainSchema; 27 - 28 - export interface mainSchema extends main$schematype {} 29 - 30 - export const mainSchema = _mainSchema as mainSchema; 31 - 32 - export interface Main extends v.InferInput<typeof mainSchema> {} 33 - 34 - declare module "@atcute/lexicons/ambient" { 35 - interface Records { 36 - "at.margin.collectionItem": mainSchema; 37 - } 38 - }
-56
src/lexicons/types/at/margin/highlight.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - import type {} from "@atcute/lexicons/ambient"; 4 - import * as AtMarginAnnotation from "./annotation.js"; 5 - 6 - const _mainSchema = /*#__PURE__*/ v.record( 7 - /*#__PURE__*/ v.tidString(), 8 - /*#__PURE__*/ v.object({ 9 - $type: /*#__PURE__*/ v.literal("at.margin.highlight"), 10 - /** 11 - * Highlight color (hex or named) 12 - * @maxLength 20 13 - */ 14 - color: /*#__PURE__*/ v.optional( 15 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 16 - /*#__PURE__*/ v.stringLength(0, 20), 17 - ]), 18 - ), 19 - createdAt: /*#__PURE__*/ v.datetimeString(), 20 - /** 21 - * Tags for categorization 22 - * @maxLength 10 23 - */ 24 - tags: /*#__PURE__*/ v.optional( 25 - /*#__PURE__*/ v.constrain( 26 - /*#__PURE__*/ v.array( 27 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 28 - /*#__PURE__*/ v.stringLength(0, 64), 29 - /*#__PURE__*/ v.stringGraphemes(0, 32), 30 - ]), 31 - ), 32 - [/*#__PURE__*/ v.arrayLength(0, 10)], 33 - ), 34 - ), 35 - /** 36 - * The resource and segment being highlighted 37 - */ 38 - get target() { 39 - return AtMarginAnnotation.targetSchema; 40 - }, 41 - }), 42 - ); 43 - 44 - type main$schematype = typeof _mainSchema; 45 - 46 - export interface mainSchema extends main$schematype {} 47 - 48 - export const mainSchema = _mainSchema as mainSchema; 49 - 50 - export interface Main extends v.InferInput<typeof mainSchema> {} 51 - 52 - declare module "@atcute/lexicons/ambient" { 53 - interface Records { 54 - "at.margin.highlight": mainSchema; 55 - } 56 - }
-42
src/lexicons/types/at/margin/like.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - import type {} from "@atcute/lexicons/ambient"; 4 - 5 - const _mainSchema = /*#__PURE__*/ v.record( 6 - /*#__PURE__*/ v.tidString(), 7 - /*#__PURE__*/ v.object({ 8 - $type: /*#__PURE__*/ v.literal("at.margin.like"), 9 - createdAt: /*#__PURE__*/ v.datetimeString(), 10 - /** 11 - * Reference to the annotation or reply being liked 12 - */ 13 - get subject() { 14 - return subjectRefSchema; 15 - }, 16 - }), 17 - ); 18 - const _subjectRefSchema = /*#__PURE__*/ v.object({ 19 - $type: /*#__PURE__*/ v.optional( 20 - /*#__PURE__*/ v.literal("at.margin.like#subjectRef"), 21 - ), 22 - cid: /*#__PURE__*/ v.cidString(), 23 - uri: /*#__PURE__*/ v.resourceUriString(), 24 - }); 25 - 26 - type main$schematype = typeof _mainSchema; 27 - type subjectRef$schematype = typeof _subjectRefSchema; 28 - 29 - export interface mainSchema extends main$schematype {} 30 - export interface subjectRefSchema extends subjectRef$schematype {} 31 - 32 - export const mainSchema = _mainSchema as mainSchema; 33 - export const subjectRefSchema = _subjectRefSchema as subjectRefSchema; 34 - 35 - export interface Main extends v.InferInput<typeof mainSchema> {} 36 - export interface SubjectRef extends v.InferInput<typeof subjectRefSchema> {} 37 - 38 - declare module "@atcute/lexicons/ambient" { 39 - interface Records { 40 - "at.margin.like": mainSchema; 41 - } 42 - }
-57
src/lexicons/types/at/margin/profile.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - import type {} from "@atcute/lexicons/ambient"; 4 - 5 - const _mainSchema = /*#__PURE__*/ v.record( 6 - /*#__PURE__*/ v.literal("self"), 7 - /*#__PURE__*/ v.object({ 8 - $type: /*#__PURE__*/ v.literal("at.margin.profile"), 9 - /** 10 - * User biography or description. 11 - * @maxLength 5000 12 - */ 13 - bio: /*#__PURE__*/ v.optional( 14 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 15 - /*#__PURE__*/ v.stringLength(0, 5000), 16 - ]), 17 - ), 18 - createdAt: /*#__PURE__*/ v.datetimeString(), 19 - /** 20 - * List of other relevant links (e.g. GitHub, Bluesky, etc). 21 - * @maxLength 20 22 - */ 23 - links: /*#__PURE__*/ v.optional( 24 - /*#__PURE__*/ v.constrain( 25 - /*#__PURE__*/ v.array( 26 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 27 - /*#__PURE__*/ v.stringLength(0, 1000), 28 - ]), 29 - ), 30 - [/*#__PURE__*/ v.arrayLength(0, 20)], 31 - ), 32 - ), 33 - /** 34 - * User website URL. 35 - * @maxLength 1000 36 - */ 37 - website: /*#__PURE__*/ v.optional( 38 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 39 - /*#__PURE__*/ v.stringLength(0, 1000), 40 - ]), 41 - ), 42 - }), 43 - ); 44 - 45 - type main$schematype = typeof _mainSchema; 46 - 47 - export interface mainSchema extends main$schematype {} 48 - 49 - export const mainSchema = _mainSchema as mainSchema; 50 - 51 - export interface Main extends v.InferInput<typeof mainSchema> {} 52 - 53 - declare module "@atcute/lexicons/ambient" { 54 - interface Records { 55 - "at.margin.profile": mainSchema; 56 - } 57 - }
-62
src/lexicons/types/at/margin/reply.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - import type {} from "@atcute/lexicons/ambient"; 4 - 5 - const _mainSchema = /*#__PURE__*/ v.record( 6 - /*#__PURE__*/ v.tidString(), 7 - /*#__PURE__*/ v.object({ 8 - $type: /*#__PURE__*/ v.literal("at.margin.reply"), 9 - createdAt: /*#__PURE__*/ v.datetimeString(), 10 - /** 11 - * MIME type of the text content 12 - * @default "text/plain" 13 - */ 14 - format: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string(), "text/plain"), 15 - /** 16 - * Reference to the parent annotation or reply 17 - */ 18 - get parent() { 19 - return replyRefSchema; 20 - }, 21 - /** 22 - * Reference to the root annotation of the thread 23 - */ 24 - get root() { 25 - return replyRefSchema; 26 - }, 27 - /** 28 - * Reply text content 29 - * @maxLength 10000 30 - * @maxGraphemes 3000 31 - */ 32 - text: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 33 - /*#__PURE__*/ v.stringLength(0, 10000), 34 - /*#__PURE__*/ v.stringGraphemes(0, 3000), 35 - ]), 36 - }), 37 - ); 38 - const _replyRefSchema = /*#__PURE__*/ v.object({ 39 - $type: /*#__PURE__*/ v.optional( 40 - /*#__PURE__*/ v.literal("at.margin.reply#replyRef"), 41 - ), 42 - cid: /*#__PURE__*/ v.cidString(), 43 - uri: /*#__PURE__*/ v.resourceUriString(), 44 - }); 45 - 46 - type main$schematype = typeof _mainSchema; 47 - type replyRef$schematype = typeof _replyRefSchema; 48 - 49 - export interface mainSchema extends main$schematype {} 50 - export interface replyRefSchema extends replyRef$schematype {} 51 - 52 - export const mainSchema = _mainSchema as mainSchema; 53 - export const replyRefSchema = _replyRefSchema as replyRefSchema; 54 - 55 - export interface Main extends v.InferInput<typeof mainSchema> {} 56 - export interface ReplyRef extends v.InferInput<typeof replyRefSchema> {} 57 - 58 - declare module "@atcute/lexicons/ambient" { 59 - interface Records { 60 - "at.margin.reply": mainSchema; 61 - } 62 - }
-18
src/lexicons/types/com/atproto/repo/strongRef.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - 4 - const _mainSchema = /*#__PURE__*/ v.object({ 5 - $type: /*#__PURE__*/ v.optional( 6 - /*#__PURE__*/ v.literal("com.atproto.repo.strongRef"), 7 - ), 8 - cid: /*#__PURE__*/ v.cidString(), 9 - uri: /*#__PURE__*/ v.resourceUriString(), 10 - }); 11 - 12 - type main$schematype = typeof _mainSchema; 13 - 14 - export interface mainSchema extends main$schematype {} 15 - 16 - export const mainSchema = _mainSchema as mainSchema; 17 - 18 - export interface Main extends v.InferInput<typeof mainSchema> {}
-19
src/lexicons/types/community/lexicon/bookmarks/bookmark.ts
··· 1 - /** 2 - * community.lexicon.bookmarks.bookmark 3 - */ 4 - 5 - export interface Main { 6 - $type?: "community.lexicon.bookmarks.bookmark"; 7 - subject: string; 8 - title?: string; 9 - description?: string; 10 - tags?: string[]; 11 - enriched?: { 12 - title?: string; 13 - description?: string; 14 - image?: string; 15 - thumb?: string; 16 - siteName?: string; 17 - }; 18 - createdAt: string; 19 - }
-146
src/lexicons/types/network/cosmik/card.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - import type {} from "@atcute/lexicons/ambient"; 4 - import * as ComAtprotoRepoStrongRef from "../../com/atproto/repo/strongRef.js"; 5 - import * as NetworkCosmikDefs from "./defs.js"; 6 - 7 - const _mainSchema = /*#__PURE__*/ v.record( 8 - /*#__PURE__*/ v.tidString(), 9 - /*#__PURE__*/ v.object({ 10 - $type: /*#__PURE__*/ v.literal("network.cosmik.card"), 11 - /** 12 - * The specific content of the card, determined by the card type. 13 - */ 14 - get content() { 15 - return /*#__PURE__*/ v.variant([noteContentSchema, urlContentSchema]); 16 - }, 17 - /** 18 - * Timestamp when this card was created (usually set by PDS). 19 - */ 20 - createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 21 - /** 22 - * Optional strong reference to the original card (for NOTE cards). 23 - */ 24 - get originalCard() { 25 - return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 26 - }, 27 - /** 28 - * Optional strong reference to a parent card (for NOTE cards). 29 - */ 30 - get parentCard() { 31 - return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 32 - }, 33 - /** 34 - * Optional provenance information for this card. 35 - */ 36 - get provenance() { 37 - return /*#__PURE__*/ v.optional(NetworkCosmikDefs.provenanceSchema); 38 - }, 39 - /** 40 - * The type of card 41 - */ 42 - type: /*#__PURE__*/ v.string<"NOTE" | "URL" | (string & {})>(), 43 - /** 44 - * Optional URL associated with the card. Required for URL cards, optional for NOTE cards. 45 - */ 46 - url: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 47 - }), 48 - ); 49 - const _noteContentSchema = /*#__PURE__*/ v.object({ 50 - $type: /*#__PURE__*/ v.optional( 51 - /*#__PURE__*/ v.literal("network.cosmik.card#noteContent"), 52 - ), 53 - /** 54 - * The note text content 55 - * @maxLength 10000 56 - */ 57 - text: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 58 - /*#__PURE__*/ v.stringLength(0, 10000), 59 - ]), 60 - }); 61 - const _urlContentSchema = /*#__PURE__*/ v.object({ 62 - $type: /*#__PURE__*/ v.optional( 63 - /*#__PURE__*/ v.literal("network.cosmik.card#urlContent"), 64 - ), 65 - /** 66 - * Optional metadata about the URL 67 - */ 68 - get metadata() { 69 - return /*#__PURE__*/ v.optional(urlMetadataSchema); 70 - }, 71 - /** 72 - * The URL being saved 73 - */ 74 - url: /*#__PURE__*/ v.genericUriString(), 75 - }); 76 - const _urlMetadataSchema = /*#__PURE__*/ v.object({ 77 - $type: /*#__PURE__*/ v.optional( 78 - /*#__PURE__*/ v.literal("network.cosmik.card#urlMetadata"), 79 - ), 80 - /** 81 - * Author of the content 82 - */ 83 - author: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 84 - /** 85 - * Description of the page 86 - */ 87 - description: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 88 - /** 89 - * Digital Object Identifier (DOI) for academic content 90 - */ 91 - doi: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 92 - /** 93 - * URL of a representative image 94 - */ 95 - imageUrl: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), 96 - /** 97 - * International Standard Book Number (ISBN) for books 98 - */ 99 - isbn: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 100 - /** 101 - * When the content was published 102 - */ 103 - publishedDate: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 104 - /** 105 - * When the metadata was retrieved 106 - */ 107 - retrievedAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 108 - /** 109 - * Name of the site 110 - */ 111 - siteName: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 112 - /** 113 - * Title of the page 114 - */ 115 - title: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 116 - /** 117 - * Type of content (e.g., 'video', 'article') 118 - */ 119 - type: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), 120 - }); 121 - 122 - type main$schematype = typeof _mainSchema; 123 - type noteContent$schematype = typeof _noteContentSchema; 124 - type urlContent$schematype = typeof _urlContentSchema; 125 - type urlMetadata$schematype = typeof _urlMetadataSchema; 126 - 127 - export interface mainSchema extends main$schematype {} 128 - export interface noteContentSchema extends noteContent$schematype {} 129 - export interface urlContentSchema extends urlContent$schematype {} 130 - export interface urlMetadataSchema extends urlMetadata$schematype {} 131 - 132 - export const mainSchema = _mainSchema as mainSchema; 133 - export const noteContentSchema = _noteContentSchema as noteContentSchema; 134 - export const urlContentSchema = _urlContentSchema as urlContentSchema; 135 - export const urlMetadataSchema = _urlMetadataSchema as urlMetadataSchema; 136 - 137 - export interface Main extends v.InferInput<typeof mainSchema> {} 138 - export interface NoteContent extends v.InferInput<typeof noteContentSchema> {} 139 - export interface UrlContent extends v.InferInput<typeof urlContentSchema> {} 140 - export interface UrlMetadata extends v.InferInput<typeof urlMetadataSchema> {} 141 - 142 - declare module "@atcute/lexicons/ambient" { 143 - interface Records { 144 - "network.cosmik.card": mainSchema; 145 - } 146 - }
-58
src/lexicons/types/network/cosmik/collection.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - import type {} from "@atcute/lexicons/ambient"; 4 - 5 - const _mainSchema = /*#__PURE__*/ v.record( 6 - /*#__PURE__*/ v.tidString(), 7 - /*#__PURE__*/ v.object({ 8 - $type: /*#__PURE__*/ v.literal("network.cosmik.collection"), 9 - /** 10 - * Access control for the collection 11 - */ 12 - accessType: /*#__PURE__*/ v.string<"CLOSED" | "OPEN" | (string & {})>(), 13 - /** 14 - * List of collaborator DIDs who can add cards to closed collections 15 - */ 16 - collaborators: /*#__PURE__*/ v.optional( 17 - /*#__PURE__*/ v.array(/*#__PURE__*/ v.string()), 18 - ), 19 - /** 20 - * Timestamp when this collection was created (usually set by PDS). 21 - */ 22 - createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 23 - /** 24 - * Description of the collection 25 - * @maxLength 500 26 - */ 27 - description: /*#__PURE__*/ v.optional( 28 - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 29 - /*#__PURE__*/ v.stringLength(0, 500), 30 - ]), 31 - ), 32 - /** 33 - * Name of the collection 34 - * @maxLength 100 35 - */ 36 - name: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 37 - /*#__PURE__*/ v.stringLength(0, 100), 38 - ]), 39 - /** 40 - * Timestamp when this collection was last updated. 41 - */ 42 - updatedAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 43 - }), 44 - ); 45 - 46 - type main$schematype = typeof _mainSchema; 47 - 48 - export interface mainSchema extends main$schematype {} 49 - 50 - export const mainSchema = _mainSchema as mainSchema; 51 - 52 - export interface Main extends v.InferInput<typeof mainSchema> {} 53 - 54 - declare module "@atcute/lexicons/ambient" { 55 - interface Records { 56 - "network.cosmik.collection": mainSchema; 57 - } 58 - }
-62
src/lexicons/types/network/cosmik/collectionLink.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - import type {} from "@atcute/lexicons/ambient"; 4 - import * as ComAtprotoRepoStrongRef from "../../com/atproto/repo/strongRef.js"; 5 - import * as NetworkCosmikDefs from "./defs.js"; 6 - 7 - const _mainSchema = /*#__PURE__*/ v.record( 8 - /*#__PURE__*/ v.tidString(), 9 - /*#__PURE__*/ v.object({ 10 - $type: /*#__PURE__*/ v.literal("network.cosmik.collectionLink"), 11 - /** 12 - * Timestamp when the card was added to the collection. 13 - */ 14 - addedAt: /*#__PURE__*/ v.datetimeString(), 15 - /** 16 - * DID of the user who added the card to the collection 17 - */ 18 - addedBy: /*#__PURE__*/ v.string(), 19 - /** 20 - * Strong reference to the card record in the users library. 21 - */ 22 - get card() { 23 - return ComAtprotoRepoStrongRef.mainSchema; 24 - }, 25 - /** 26 - * Strong reference to the collection record. 27 - */ 28 - get collection() { 29 - return ComAtprotoRepoStrongRef.mainSchema; 30 - }, 31 - /** 32 - * Timestamp when this link record was created (usually set by PDS). 33 - */ 34 - createdAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 35 - /** 36 - * Strong reference to the original card record (may be in another library). 37 - */ 38 - get originalCard() { 39 - return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 40 - }, 41 - /** 42 - * Optional provenance information for this link. 43 - */ 44 - get provenance() { 45 - return /*#__PURE__*/ v.optional(NetworkCosmikDefs.provenanceSchema); 46 - }, 47 - }), 48 - ); 49 - 50 - type main$schematype = typeof _mainSchema; 51 - 52 - export interface mainSchema extends main$schematype {} 53 - 54 - export const mainSchema = _mainSchema as mainSchema; 55 - 56 - export interface Main extends v.InferInput<typeof mainSchema> {} 57 - 58 - declare module "@atcute/lexicons/ambient" { 59 - interface Records { 60 - "network.cosmik.collectionLink": mainSchema; 61 - } 62 - }
-23
src/lexicons/types/network/cosmik/defs.ts
··· 1 - import type {} from "@atcute/lexicons"; 2 - import * as v from "@atcute/lexicons/validations"; 3 - import * as ComAtprotoRepoStrongRef from "../../com/atproto/repo/strongRef.js"; 4 - 5 - const _provenanceSchema = /*#__PURE__*/ v.object({ 6 - $type: /*#__PURE__*/ v.optional( 7 - /*#__PURE__*/ v.literal("network.cosmik.defs#provenance"), 8 - ), 9 - /** 10 - * Strong reference to the card that led to this record. 11 - */ 12 - get via() { 13 - return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema); 14 - }, 15 - }); 16 - 17 - type provenance$schematype = typeof _provenanceSchema; 18 - 19 - export interface provenanceSchema extends provenance$schematype {} 20 - 21 - export const provenanceSchema = _provenanceSchema as provenanceSchema; 22 - 23 - export interface Provenance extends v.InferInput<typeof provenanceSchema> {}
-22
src/lib.ts
··· 1 - export { getRecord, deleteRecord, putRecord, getProfile } from "./lib/atproto"; 2 - 3 - export { 4 - getSembleCollections as getCollections, 5 - createSembleCollection as createCollection, 6 - getSembleCards as getCards, 7 - createSembleNote as createNoteCard, 8 - createSembleUrlCard as createUrlCard, 9 - getSembleCollectionLinks as getCollectionLinks, 10 - createSembleCollectionLink as createCollectionLink, 11 - } from "./lib/cosmik"; 12 - 13 - export { getBookmarks, createBookmark, getTags, createTag } from "./lib/bookmarks"; 14 - 15 - export { 16 - getMarginBookmarks, 17 - createMarginBookmark, 18 - getMarginCollections, 19 - getMarginCollectionItems, 20 - createMarginCollection, 21 - createMarginCollectionItem, 22 - } from "./lib/margin";
-39
src/lib/atproto.ts
··· 1 - import type { Client } from "@atcute/client"; 2 - import type { ActorIdentifier, Nsid } from "@atcute/lexicons"; 3 - 4 - export async function getRecord(client: Client, repo: string, collection: string, rkey: string) { 5 - return await client.get("com.atproto.repo.getRecord", { 6 - params: { 7 - repo: repo as ActorIdentifier, 8 - collection: collection as Nsid, 9 - rkey, 10 - }, 11 - }); 12 - } 13 - 14 - export async function deleteRecord(client: Client, repo: string, collection: string, rkey: string) { 15 - return await client.post("com.atproto.repo.deleteRecord", { 16 - input: { 17 - repo: repo as ActorIdentifier, 18 - collection: collection as Nsid, 19 - rkey, 20 - }, 21 - }); 22 - } 23 - 24 - export async function putRecord<T = unknown>(client: Client, repo: string, collection: string, rkey: string, record: T) { 25 - return await client.post("com.atproto.repo.putRecord", { 26 - input: { 27 - repo: repo as ActorIdentifier, 28 - collection: collection as Nsid, 29 - rkey, 30 - record: record as unknown as { [key: string]: unknown }, 31 - }, 32 - }); 33 - } 34 - 35 - export async function getProfile(client: Client, actor: string) { 36 - return await client.get("app.bsky.actor.getProfile", { 37 - params: { actor: actor as ActorIdentifier }, 38 - }); 39 - }
-60
src/lib/bookmarks.ts
··· 1 - import type { Client } from "@atcute/client"; 2 - import type { ActorIdentifier, Nsid } from "@atcute/lexicons"; 3 - 4 - export async function getBookmarks(client: Client, repo: string) { 5 - return await client.get("com.atproto.repo.listRecords", { 6 - params: { 7 - repo: repo as ActorIdentifier, 8 - collection: "community.lexicon.bookmarks.bookmark" as Nsid, 9 - limit: 100, 10 - }, 11 - }); 12 - } 13 - 14 - export async function createBookmark( 15 - client: Client, 16 - repo: string, 17 - subject: string, 18 - title?: string, 19 - description?: string, 20 - tags?: string[] 21 - ) { 22 - return await client.post("com.atproto.repo.createRecord", { 23 - input: { 24 - repo: repo as ActorIdentifier, 25 - collection: "community.lexicon.bookmarks.bookmark" as Nsid, 26 - record: { 27 - $type: "community.lexicon.bookmarks.bookmark", 28 - subject, 29 - title, 30 - description, 31 - tags, 32 - createdAt: new Date().toISOString(), 33 - }, 34 - }, 35 - }); 36 - } 37 - 38 - export async function getTags(client: Client, repo: string) { 39 - return await client.get("com.atproto.repo.listRecords", { 40 - params: { 41 - repo: repo as ActorIdentifier, 42 - collection: "com.kipclip.tag" as Nsid, 43 - limit: 100, 44 - }, 45 - }); 46 - } 47 - 48 - export async function createTag(client: Client, repo: string, value: string) { 49 - return await client.post("com.atproto.repo.createRecord", { 50 - input: { 51 - repo: repo as ActorIdentifier, 52 - collection: "com.kipclip.tag" as Nsid, 53 - record: { 54 - $type: "com.kipclip.tag", 55 - value, 56 - createdAt: new Date().toISOString(), 57 - }, 58 - }, 59 - }); 60 - }
-124
src/lib/cosmik.ts
··· 1 - import type { Client } from "@atcute/client"; 2 - import type { ActorIdentifier, Nsid } from "@atcute/lexicons"; 3 - 4 - export async function getSembleCollections(client: Client, repo: string) { 5 - return await client.get("com.atproto.repo.listRecords", { 6 - params: { 7 - repo: repo as ActorIdentifier, 8 - collection: "network.cosmik.collection" as Nsid, 9 - limit: 100, 10 - }, 11 - }); 12 - } 13 - 14 - export async function createSembleCollection(client: Client, repo: string, name: string, description: string) { 15 - return await client.post("com.atproto.repo.createRecord", { 16 - input: { 17 - repo: repo as ActorIdentifier, 18 - collection: "network.cosmik.collection" as Nsid, 19 - validate: false, 20 - record: { 21 - $type: "network.cosmik.collection", 22 - name, 23 - description, 24 - accessType: "CLOSED", 25 - createdAt: new Date().toISOString(), 26 - }, 27 - }, 28 - }); 29 - } 30 - 31 - export async function getSembleCards(client: Client, repo: string) { 32 - return await client.get("com.atproto.repo.listRecords", { 33 - params: { 34 - repo: repo as ActorIdentifier, 35 - collection: "network.cosmik.card" as Nsid, 36 - limit: 100, 37 - }, 38 - }); 39 - } 40 - 41 - export async function createSembleNote(client: Client, repo: string, text: string, parentCard?: { uri: string; cid: string }) { 42 - return await client.post("com.atproto.repo.createRecord", { 43 - input: { 44 - repo: repo as ActorIdentifier, 45 - collection: "network.cosmik.card" as Nsid, 46 - record: { 47 - $type: "network.cosmik.card", 48 - type: "NOTE", 49 - content: { 50 - $type: "network.cosmik.card#noteContent", 51 - text, 52 - }, 53 - // Only set parentCard as per Semble documentation 54 - parentCard: parentCard ? { uri: parentCard.uri, cid: parentCard.cid } : undefined, 55 - createdAt: new Date().toISOString(), 56 - }, 57 - }, 58 - }); 59 - } 60 - 61 - export async function createSembleUrlCard(client: Client, repo: string, url: string, metadata?: { 62 - title?: string; 63 - description?: string; 64 - imageUrl?: string; 65 - siteName?: string; 66 - }) { 67 - return await client.post("com.atproto.repo.createRecord", { 68 - input: { 69 - repo: repo as ActorIdentifier, 70 - collection: "network.cosmik.card" as Nsid, 71 - record: { 72 - $type: "network.cosmik.card", 73 - type: "URL", 74 - url, 75 - content: { 76 - $type: "network.cosmik.card#urlContent", 77 - url, 78 - metadata: metadata ? { $type: "network.cosmik.card#urlMetadata", ...metadata } : undefined, 79 - }, 80 - createdAt: new Date().toISOString(), 81 - }, 82 - }, 83 - }); 84 - } 85 - 86 - export async function getSembleCollectionLinks(client: Client, repo: string) { 87 - return await client.get("com.atproto.repo.listRecords", { 88 - params: { 89 - repo: repo as ActorIdentifier, 90 - collection: "network.cosmik.collectionLink" as Nsid, 91 - limit: 100, 92 - }, 93 - }); 94 - } 95 - 96 - export async function createSembleCollectionLink( 97 - client: Client, 98 - repo: string, 99 - cardUri: string, 100 - cardCid: string, 101 - collectionUri: string, 102 - collectionCid: string 103 - ) { 104 - return await client.post("com.atproto.repo.createRecord", { 105 - input: { 106 - repo: repo as ActorIdentifier, 107 - collection: "network.cosmik.collectionLink" as Nsid, 108 - record: { 109 - $type: "network.cosmik.collectionLink", 110 - card: { 111 - uri: cardUri, 112 - cid: cardCid, 113 - }, 114 - collection: { 115 - uri: collectionUri, 116 - cid: collectionCid, 117 - }, 118 - addedAt: new Date().toISOString(), 119 - addedBy: repo, 120 - createdAt: new Date().toISOString(), 121 - }, 122 - }, 123 - }); 124 - }
-100
src/lib/margin.ts
··· 1 - import type { Client } from "@atcute/client"; 2 - import type { ActorIdentifier, Nsid } from "@atcute/lexicons"; 3 - 4 - export async function getMarginBookmarks(client: Client, repo: string) { 5 - return await client.get("com.atproto.repo.listRecords", { 6 - params: { 7 - repo: repo as ActorIdentifier, 8 - collection: "at.margin.bookmark" as Nsid, 9 - limit: 100, 10 - }, 11 - }); 12 - } 13 - 14 - export async function createMarginBookmark( 15 - client: Client, 16 - repo: string, 17 - source: string, 18 - title?: string, 19 - description?: string, 20 - tags?: string[] 21 - ) { 22 - return await client.post("com.atproto.repo.createRecord", { 23 - input: { 24 - repo: repo as ActorIdentifier, 25 - collection: "at.margin.bookmark" as Nsid, 26 - record: { 27 - $type: "at.margin.bookmark", 28 - source, 29 - title, 30 - description, 31 - tags, 32 - createdAt: new Date().toISOString(), 33 - }, 34 - }, 35 - }); 36 - } 37 - 38 - export async function getMarginCollections(client: Client, repo: string) { 39 - return await client.get("com.atproto.repo.listRecords", { 40 - params: { 41 - repo: repo as ActorIdentifier, 42 - collection: "at.margin.collection" as Nsid, 43 - limit: 100, 44 - }, 45 - }); 46 - } 47 - 48 - export async function getMarginCollectionItems(client: Client, repo: string) { 49 - return await client.get("com.atproto.repo.listRecords", { 50 - params: { 51 - repo: repo as ActorIdentifier, 52 - collection: "at.margin.collectionItem" as Nsid, 53 - limit: 100, 54 - }, 55 - }); 56 - } 57 - 58 - export async function createMarginCollection( 59 - client: Client, 60 - repo: string, 61 - name: string, 62 - description?: string, 63 - icon?: string 64 - ) { 65 - return await client.post("com.atproto.repo.createRecord", { 66 - input: { 67 - repo: repo as ActorIdentifier, 68 - collection: "at.margin.collection" as Nsid, 69 - record: { 70 - $type: "at.margin.collection", 71 - name, 72 - description, 73 - icon, 74 - createdAt: new Date().toISOString(), 75 - }, 76 - }, 77 - }); 78 - } 79 - 80 - export async function createMarginCollectionItem( 81 - client: Client, 82 - repo: string, 83 - annotationUri: string, 84 - collectionUri: string, 85 - position?: number 86 - ) { 87 - return await client.post("com.atproto.repo.createRecord", { 88 - input: { 89 - repo: repo as ActorIdentifier, 90 - collection: "at.margin.collectionItem" as Nsid, 91 - record: { 92 - $type: "at.margin.collectionItem", 93 - annotation: annotationUri, 94 - collection: collectionUri, 95 - position, 96 - createdAt: new Date().toISOString(), 97 - }, 98 - }, 99 - }); 100 - }
-89
src/main.ts
··· 1 - import { Notice, Plugin, WorkspaceLeaf } from "obsidian"; 2 - import type { Client } from "@atcute/client"; 3 - import { DEFAULT_SETTINGS, AtProtoSettings, SettingTab } from "./settings"; 4 - import { createAuthenticatedClient} from "./auth"; 5 - import { ATmarkView, VIEW_TYPE_ATMARK } from "./views/atmark"; 6 - 7 - export default class ATmarkPlugin extends Plugin { 8 - settings: AtProtoSettings = DEFAULT_SETTINGS; 9 - client: Client | null = null; 10 - 11 - async onload() { 12 - await this.loadSettings(); 13 - 14 - this.registerView(VIEW_TYPE_ATMARK, (leaf) => { 15 - return new ATmarkView(leaf, this); 16 - }); 17 - 18 - this.addRibbonIcon("layers", "Atmark", () => { 19 - void this.activateView(VIEW_TYPE_ATMARK); 20 - }); 21 - 22 - this.addCommand({ 23 - id: "view", 24 - name: "Open view", 25 - callback: () => { void this.activateView(VIEW_TYPE_ATMARK); }, 26 - }); 27 - 28 - this.addSettingTab(new SettingTab(this.app, this)); 29 - } 30 - 31 - 32 - private async initClient() { 33 - const { identifier, appPassword, serviceUrl } = this.settings; 34 - if (identifier && appPassword) { 35 - try { 36 - this.client = await createAuthenticatedClient({ identifier, password: appPassword, serviceUrl }); 37 - new Notice("Connected"); 38 - } catch (err) { 39 - const message = err instanceof Error ? err.message : String(err); 40 - console.error("Failed to login:", message); 41 - } 42 - } 43 - } 44 - 45 - async refreshClient() { 46 - await this.initClient(); 47 - } 48 - 49 - 50 - async activateView(v: string) { 51 - const { workspace } = this.app; 52 - if (!this.client) { 53 - await this.initClient(); 54 - } 55 - if (!this.client) { 56 - new Notice("Failed to login. Check your credentials in plugin settings."); 57 - return; 58 - } 59 - 60 - let leaf: WorkspaceLeaf | null = null; 61 - const leaves = workspace.getLeavesOfType(v); 62 - 63 - if (leaves.length > 0) { 64 - // A leaf with our view already exists, use that 65 - leaf = leaves[0] as WorkspaceLeaf; 66 - void workspace.revealLeaf(leaf); 67 - return; 68 - } 69 - 70 - // Our view could not be found in the workspace, create a new leaf 71 - leaf = workspace.getMostRecentLeaf() 72 - await leaf?.setViewState({ type: v, active: true }); 73 - 74 - // "Reveal" the leaf in case it is in a collapsed sidebar 75 - if (leaf) { 76 - void workspace.revealLeaf(leaf); 77 - } 78 - } 79 - 80 - async loadSettings() { 81 - this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData() as Partial<AtProtoSettings>); 82 - } 83 - 84 - async saveSettings() { 85 - await this.saveData(this.settings); 86 - } 87 - 88 - onunload() { } 89 - }
-72
src/settings.ts
··· 1 - import { App, PluginSettingTab, Setting } from "obsidian"; 2 - import type ATmarkPlugin from "./main"; 3 - 4 - export interface AtProtoSettings { 5 - identifier: string; 6 - appPassword: string; 7 - serviceUrl: string; 8 - } 9 - 10 - export const DEFAULT_SETTINGS: AtProtoSettings = { 11 - identifier: "", 12 - appPassword: "", 13 - serviceUrl: "", 14 - }; 15 - 16 - export class SettingTab extends PluginSettingTab { 17 - plugin: ATmarkPlugin; 18 - 19 - constructor(app: App, plugin: ATmarkPlugin) { 20 - super(app, plugin); 21 - this.plugin = plugin; 22 - } 23 - 24 - display(): void { 25 - const { containerEl } = this; 26 - containerEl.empty(); 27 - 28 - new Setting(containerEl) 29 - .setName("Handle") 30 - .setDesc("Your bluesky handle or identifier (e.g., user.bsky.social)") 31 - // .setDesc("user.bsky.social") 32 - .addText((text) => 33 - text 34 - .setValue(this.plugin.settings.identifier) 35 - .onChange(async (value) => { 36 - this.plugin.settings.identifier = value; 37 - await this.plugin.saveSettings(); 38 - }) 39 - ); 40 - 41 - new Setting(containerEl) 42 - .setName("App password") 43 - .setDesc("Create one at https://bsky.app/settings/app-passwords") 44 - .addText((text) => { 45 - text.inputEl.type = "password"; 46 - text 47 - .setValue(this.plugin.settings.appPassword) 48 - .onChange(async (value) => { 49 - this.plugin.settings.appPassword = value; 50 - await this.plugin.saveSettings(); 51 - }); 52 - }); 53 - 54 - new Setting(containerEl) 55 - .setName("Auth service") 56 - // This contains the acronym "PDS", a term used for AT Protocol 57 - // as well as URL, an acronym 58 - // eslint-disable-next-line obsidianmd/ui/sentence-case 59 - .setDesc("PDS or PDS entryway URL (leave empty to use bsky.social service) ") 60 - .addText((text) => 61 - text 62 - // This is a URL and should not be sentence-cased 63 - // eslint-disable-next-line obsidianmd/ui/sentence-case 64 - .setPlaceholder("https://bsky.social") 65 - .setValue(this.plugin.settings.serviceUrl) 66 - .onChange(async (value) => { 67 - this.plugin.settings.serviceUrl = value; 68 - await this.plugin.saveSettings(); 69 - }) 70 - ); 71 - } 72 - }
-233
src/sources/bookmark.ts
··· 1 - import type { Client } from "@atcute/client"; 2 - import type { Record } from "@atcute/atproto/types/repo/listRecords"; 3 - import { setIcon } from "obsidian"; 4 - import type ATmarkPlugin from "../main"; 5 - import { getBookmarks } from "../lib"; 6 - import type { ATmarkItem, DataSource, SourceFilter } from "./types"; 7 - import { EditBookmarkModal } from "../components/editBookmarkModal"; 8 - import { CreateTagModal } from "../components/createTagModal"; 9 - import type { Main as Bookmark } from "../lexicons/types/community/lexicon/bookmarks/bookmark"; 10 - 11 - type BookmarkRecord = Record & { value: Bookmark }; 12 - 13 - class BookmarkItem implements ATmarkItem { 14 - private record: BookmarkRecord; 15 - private plugin: ATmarkPlugin; 16 - 17 - constructor(record: BookmarkRecord, plugin: ATmarkPlugin) { 18 - this.record = record; 19 - this.plugin = plugin; 20 - } 21 - 22 - getUri(): string { 23 - return this.record.uri; 24 - } 25 - 26 - getCid(): string { 27 - return this.record.cid; 28 - } 29 - 30 - getCreatedAt(): string { 31 - return this.record.value.createdAt; 32 - } 33 - 34 - getSource(): "bookmark" { 35 - return "bookmark"; 36 - } 37 - 38 - canAddNotes(): boolean { 39 - return false; 40 - } 41 - 42 - canEdit(): boolean { 43 - return true; 44 - } 45 - 46 - openEditModal(onSuccess?: () => void): void { 47 - new EditBookmarkModal(this.plugin, this.record, onSuccess).open(); 48 - } 49 - 50 - render(container: HTMLElement): void { 51 - const el = container.createEl("div", { cls: "atmark-item-content" }); 52 - const bookmark = this.record.value; 53 - const enriched = bookmark.enriched; 54 - 55 - if (bookmark.tags && bookmark.tags.length > 0) { 56 - const tagsContainer = el.createEl("div", { cls: "atmark-item-tags" }); 57 - for (const tag of bookmark.tags) { 58 - tagsContainer.createEl("span", { text: tag, cls: "atmark-tag" }); 59 - } 60 - } 61 - 62 - const title = enriched?.title || bookmark.title; 63 - if (title) { 64 - el.createEl("div", { text: title, cls: "atmark-item-title" }); 65 - } 66 - 67 - const imageUrl = enriched?.image || enriched?.thumb; 68 - if (imageUrl) { 69 - const img = el.createEl("img", { cls: "atmark-item-image" }); 70 - img.src = imageUrl; 71 - img.alt = title || "Image"; 72 - } 73 - 74 - const description = enriched?.description || bookmark.description; 75 - if (description) { 76 - const desc = description.length > 200 77 - ? description.slice(0, 200) + "โ€ฆ" 78 - : description; 79 - el.createEl("p", { text: desc, cls: "atmark-item-desc" }); 80 - } 81 - 82 - if (enriched?.siteName) { 83 - el.createEl("span", { text: enriched.siteName, cls: "atmark-item-site" }); 84 - } 85 - 86 - const link = el.createEl("a", { 87 - text: bookmark.subject, 88 - href: bookmark.subject, 89 - cls: "atmark-item-url", 90 - }); 91 - link.setAttr("target", "_blank"); 92 - } 93 - 94 - renderDetail(container: HTMLElement): void { 95 - const body = container.createEl("div", { cls: "atmark-detail-body" }); 96 - const bookmark = this.record.value; 97 - const enriched = bookmark.enriched; 98 - 99 - const title = enriched?.title || bookmark.title; 100 - if (title) { 101 - body.createEl("h2", { text: title, cls: "atmark-detail-title" }); 102 - } 103 - 104 - const imageUrl = enriched?.image || enriched?.thumb; 105 - if (imageUrl) { 106 - const img = body.createEl("img", { cls: "atmark-detail-image" }); 107 - img.src = imageUrl; 108 - img.alt = title || "Image"; 109 - } 110 - 111 - const description = enriched?.description || bookmark.description; 112 - if (description) { 113 - body.createEl("p", { text: description, cls: "atmark-detail-description" }); 114 - } 115 - 116 - if (enriched?.siteName) { 117 - const metaGrid = body.createEl("div", { cls: "atmark-detail-meta" }); 118 - const item = metaGrid.createEl("div", { cls: "atmark-detail-meta-item" }); 119 - item.createEl("span", { text: "Site", cls: "atmark-detail-meta-label" }); 120 - item.createEl("span", { text: enriched.siteName, cls: "atmark-detail-meta-value" }); 121 - } 122 - 123 - const linkWrapper = body.createEl("div", { cls: "atmark-detail-link-wrapper" }); 124 - const link = linkWrapper.createEl("a", { 125 - text: bookmark.subject, 126 - href: bookmark.subject, 127 - cls: "atmark-detail-link", 128 - }); 129 - link.setAttr("target", "_blank"); 130 - 131 - if (bookmark.tags && bookmark.tags.length > 0) { 132 - const tagsSection = container.createEl("div", { cls: "atmark-item-tags-section" }); 133 - tagsSection.createEl("h3", { text: "Tags", cls: "atmark-detail-section-title" }); 134 - const tagsContainer = tagsSection.createEl("div", { cls: "atmark-item-tags" }); 135 - for (const tag of bookmark.tags) { 136 - tagsContainer.createEl("span", { text: tag, cls: "atmark-tag" }); 137 - } 138 - } 139 - } 140 - 141 - getTags() { 142 - return this.record.value.tags || []; 143 - } 144 - 145 - getRecord() { 146 - return this.record; 147 - } 148 - } 149 - 150 - export class BookmarkSource implements DataSource { 151 - readonly name = "bookmark" as const; 152 - private client: Client; 153 - private repo: string; 154 - 155 - constructor(client: Client, repo: string) { 156 - this.client = client; 157 - this.repo = repo; 158 - } 159 - 160 - async fetchItems(filters: SourceFilter[], plugin: ATmarkPlugin): Promise<ATmarkItem[]> { 161 - const bookmarksResp = await getBookmarks(this.client, this.repo); 162 - if (!bookmarksResp.ok) return []; 163 - 164 - let bookmarks = bookmarksResp.data.records as BookmarkRecord[]; 165 - 166 - const tagFilter = filters.find(f => f.type === "bookmarkTag"); 167 - if (tagFilter && tagFilter.value) { 168 - bookmarks = bookmarks.filter((record: BookmarkRecord) => 169 - record.value.tags?.includes(tagFilter.value) 170 - ); 171 - } 172 - 173 - return bookmarks.map((record: BookmarkRecord) => new BookmarkItem(record, plugin)); 174 - } 175 - 176 - async getAvailableFilters(): Promise<SourceFilter[]> { 177 - const bookmarksResp = await getBookmarks(this.client, this.repo); 178 - if (!bookmarksResp.ok) return []; 179 - 180 - const tagSet = new Set<string>(); 181 - const records = bookmarksResp.data.records as BookmarkRecord[]; 182 - for (const record of records) { 183 - if (record.value.tags) { 184 - for (const tag of record.value.tags) { 185 - tagSet.add(tag); 186 - } 187 - } 188 - } 189 - 190 - return Array.from(tagSet).map(tag => ({ 191 - type: "bookmarkTag", 192 - value: tag, 193 - label: tag, 194 - })); 195 - } 196 - 197 - renderFilterUI(container: HTMLElement, activeFilters: Map<string, SourceFilter>, onChange: () => void, plugin: ATmarkPlugin): void { 198 - const section = container.createEl("div", { cls: "atmark-filter-section" }); 199 - 200 - const titleRow = section.createEl("div", { cls: "atmark-filter-title-row" }); 201 - titleRow.createEl("h3", { text: "Tags", cls: "atmark-filter-title" }); 202 - 203 - const createBtn = titleRow.createEl("button", { cls: "atmark-filter-create-btn" }); 204 - setIcon(createBtn, "plus"); 205 - createBtn.addEventListener("click", () => { 206 - new CreateTagModal(plugin, onChange).open(); 207 - }); 208 - 209 - const chips = section.createEl("div", { cls: "atmark-filter-chips" }); 210 - 211 - const allChip = chips.createEl("button", { 212 - text: "All", 213 - cls: `atmark-chip ${!activeFilters.has("bookmarkTag") ? "atmark-chip-active" : ""}`, 214 - }); 215 - allChip.addEventListener("click", () => { 216 - activeFilters.delete("bookmarkTag"); 217 - onChange(); 218 - }); 219 - 220 - void this.getAvailableFilters().then(tags => { 221 - for (const tag of tags) { 222 - const chip = chips.createEl("button", { 223 - text: tag.label, 224 - cls: `atmark-chip ${activeFilters.get("bookmarkTag")?.value === tag.value ? "atmark-chip-active" : ""}`, 225 - }); 226 - chip.addEventListener("click", () => { 227 - activeFilters.set("bookmarkTag", tag); 228 - onChange(); 229 - }); 230 - } 231 - }); 232 - } 233 - }
-304
src/sources/margin.ts
··· 1 - import type { Client } from "@atcute/client"; 2 - import type { Record } from "@atcute/atproto/types/repo/listRecords"; 3 - import { setIcon } from "obsidian"; 4 - import type ATmarkPlugin from "../main"; 5 - import { getMarginBookmarks, getMarginCollections, getMarginCollectionItems } from "../lib"; 6 - import type { ATmarkItem, DataSource, SourceFilter } from "./types"; 7 - import type { Main as MarginBookmark } from "../lexicons/types/at/margin/bookmark"; 8 - import type { Main as MarginCollection } from "../lexicons/types/at/margin/collection"; 9 - import type { Main as MarginCollectionItem } from "../lexicons/types/at/margin/collectionItem"; 10 - import { EditMarginBookmarkModal } from "../components/editMarginBookmarkModal"; 11 - import { CreateMarginCollectionModal } from "../components/createMarginCollectionModal"; 12 - 13 - type MarginBookmarkRecord = Record & { value: MarginBookmark }; 14 - type MarginCollectionRecord = Record & { value: MarginCollection }; 15 - type MarginCollectionItemRecord = Record & { value: MarginCollectionItem }; 16 - 17 - class MarginItem implements ATmarkItem { 18 - private record: MarginBookmarkRecord; 19 - private plugin: ATmarkPlugin; 20 - private collections: Array<{ uri: string; name: string }>; 21 - 22 - constructor(record: MarginBookmarkRecord, collections: Array<{ uri: string; name: string }>, plugin: ATmarkPlugin) { 23 - this.record = record; 24 - this.collections = collections; 25 - this.plugin = plugin; 26 - } 27 - 28 - getUri(): string { 29 - return this.record.uri; 30 - } 31 - 32 - getCid(): string { 33 - return this.record.cid; 34 - } 35 - 36 - getCreatedAt(): string { 37 - return this.record.value.createdAt; 38 - } 39 - 40 - getSource(): "margin" { 41 - return "margin"; 42 - } 43 - 44 - canAddNotes(): boolean { 45 - return false; 46 - } 47 - 48 - canEdit(): boolean { 49 - return true; 50 - } 51 - 52 - openEditModal(onSuccess?: () => void): void { 53 - new EditMarginBookmarkModal(this.plugin, this.record, onSuccess).open(); 54 - } 55 - 56 - render(container: HTMLElement): void { 57 - const el = container.createEl("div", { cls: "atmark-item-content" }); 58 - const bookmark = this.record.value; 59 - 60 - if (this.collections.length > 0) { 61 - const collectionsContainer = el.createEl("div", { cls: "atmark-item-collections" }); 62 - for (const collection of this.collections) { 63 - collectionsContainer.createEl("span", { text: collection.name, cls: "atmark-collection" }); 64 - } 65 - } 66 - 67 - if (bookmark.tags && bookmark.tags.length > 0) { 68 - const tagsContainer = el.createEl("div", { cls: "atmark-item-tags" }); 69 - for (const tag of bookmark.tags) { 70 - tagsContainer.createEl("span", { text: tag, cls: "atmark-tag" }); 71 - } 72 - } 73 - 74 - if (bookmark.title) { 75 - el.createEl("div", { text: bookmark.title, cls: "atmark-item-title" }); 76 - } 77 - 78 - if (bookmark.description) { 79 - const desc = bookmark.description.length > 200 80 - ? bookmark.description.slice(0, 200) + "โ€ฆ" 81 - : bookmark.description; 82 - el.createEl("p", { text: desc, cls: "atmark-item-desc" }); 83 - } 84 - 85 - const link = el.createEl("a", { 86 - text: bookmark.source, 87 - href: bookmark.source, 88 - cls: "atmark-item-url", 89 - }); 90 - link.setAttr("target", "_blank"); 91 - } 92 - 93 - renderDetail(container: HTMLElement): void { 94 - const body = container.createEl("div", { cls: "atmark-detail-body" }); 95 - const bookmark = this.record.value; 96 - 97 - if (bookmark.title) { 98 - body.createEl("h2", { text: bookmark.title, cls: "atmark-detail-title" }); 99 - } 100 - 101 - if (bookmark.description) { 102 - body.createEl("p", { text: bookmark.description, cls: "atmark-detail-description" }); 103 - } 104 - 105 - const linkWrapper = body.createEl("div", { cls: "atmark-detail-link-wrapper" }); 106 - const link = linkWrapper.createEl("a", { 107 - text: bookmark.source, 108 - href: bookmark.source, 109 - cls: "atmark-detail-link", 110 - }); 111 - link.setAttr("target", "_blank"); 112 - 113 - if (this.collections.length > 0) { 114 - const collectionsSection = container.createEl("div", { cls: "atmark-item-collections-section" }); 115 - collectionsSection.createEl("h3", { text: "Collections", cls: "atmark-detail-section-title" }); 116 - const collectionsContainer = collectionsSection.createEl("div", { cls: "atmark-item-collections" }); 117 - for (const collection of this.collections) { 118 - collectionsContainer.createEl("span", { text: collection.name, cls: "atmark-collection" }); 119 - } 120 - } 121 - 122 - if (bookmark.tags && bookmark.tags.length > 0) { 123 - const tagsSection = container.createEl("div", { cls: "atmark-item-tags-section" }); 124 - tagsSection.createEl("h3", { text: "Tags", cls: "atmark-detail-section-title" }); 125 - const tagsContainer = tagsSection.createEl("div", { cls: "atmark-item-tags" }); 126 - for (const tag of bookmark.tags) { 127 - tagsContainer.createEl("span", { text: tag, cls: "atmark-tag" }); 128 - } 129 - } 130 - } 131 - 132 - getTags() { 133 - return this.record.value.tags || []; 134 - } 135 - 136 - getRecord() { 137 - return this.record; 138 - } 139 - } 140 - 141 - export class MarginSource implements DataSource { 142 - readonly name = "margin" as const; 143 - private client: Client; 144 - private repo: string; 145 - 146 - constructor(client: Client, repo: string) { 147 - this.client = client; 148 - this.repo = repo; 149 - } 150 - 151 - async fetchItems(filters: SourceFilter[], plugin: ATmarkPlugin): Promise<ATmarkItem[]> { 152 - const bookmarksResp = await getMarginBookmarks(this.client, this.repo); 153 - if (!bookmarksResp.ok) return []; 154 - 155 - let bookmarks = bookmarksResp.data.records as MarginBookmarkRecord[]; 156 - 157 - // Build collections map (bookmark URI -> collection info) 158 - const collectionsMap = new Map<string, Array<{ uri: string; name: string }>>(); 159 - const collectionsResp = await getMarginCollections(this.client, this.repo); 160 - const itemsResp = await getMarginCollectionItems(this.client, this.repo); 161 - 162 - if (collectionsResp.ok && itemsResp.ok) { 163 - const collections = collectionsResp.data.records as MarginCollectionRecord[]; 164 - const collectionNameMap = new Map<string, string>(); 165 - for (const collection of collections) { 166 - collectionNameMap.set(collection.uri, collection.value.name); 167 - } 168 - 169 - const items = itemsResp.data.records as MarginCollectionItemRecord[]; 170 - for (const item of items) { 171 - const bookmarkUri = item.value.annotation; 172 - const collectionUri = item.value.collection; 173 - const collectionName = collectionNameMap.get(collectionUri); 174 - 175 - if (collectionName) { 176 - const existing = collectionsMap.get(bookmarkUri) || []; 177 - existing.push({ uri: collectionUri, name: collectionName }); 178 - collectionsMap.set(bookmarkUri, existing); 179 - } 180 - } 181 - } 182 - 183 - const collectionFilter = filters.find(f => f.type === "marginCollection"); 184 - if (collectionFilter && collectionFilter.value) { 185 - if (itemsResp.ok) { 186 - const items = itemsResp.data.records as MarginCollectionItemRecord[]; 187 - const filteredItems = items.filter((item: MarginCollectionItemRecord) => 188 - item.value.collection === collectionFilter.value 189 - ); 190 - const bookmarkUris = new Set(filteredItems.map((item: MarginCollectionItemRecord) => item.value.annotation)); 191 - bookmarks = bookmarks.filter((bookmark: MarginBookmarkRecord) => bookmarkUris.has(bookmark.uri)); 192 - } 193 - } 194 - 195 - const tagFilter = filters.find(f => f.type === "marginTag"); 196 - if (tagFilter && tagFilter.value) { 197 - bookmarks = bookmarks.filter((record: MarginBookmarkRecord) => 198 - record.value.tags?.includes(tagFilter.value) 199 - ); 200 - } 201 - 202 - return bookmarks.map((record: MarginBookmarkRecord) => 203 - new MarginItem(record, collectionsMap.get(record.uri) || [], plugin) 204 - ); 205 - } 206 - 207 - async getAvailableFilters(): Promise<SourceFilter[]> { 208 - const filters: SourceFilter[] = []; 209 - 210 - const collectionsResp = await getMarginCollections(this.client, this.repo); 211 - if (collectionsResp.ok) { 212 - const collections = collectionsResp.data.records as MarginCollectionRecord[]; 213 - filters.push(...collections.map((c: MarginCollectionRecord) => ({ 214 - type: "marginCollection", 215 - value: c.uri, 216 - label: c.value.name, 217 - }))); 218 - } 219 - 220 - const bookmarksResp = await getMarginBookmarks(this.client, this.repo); 221 - if (bookmarksResp.ok) { 222 - const tagSet = new Set<string>(); 223 - const records = bookmarksResp.data.records as MarginBookmarkRecord[]; 224 - for (const record of records) { 225 - if (record.value.tags) { 226 - for (const tag of record.value.tags) { 227 - tagSet.add(tag); 228 - } 229 - } 230 - } 231 - filters.push(...Array.from(tagSet).map(tag => ({ 232 - type: "marginTag", 233 - value: tag, 234 - label: tag, 235 - }))); 236 - } 237 - 238 - return filters; 239 - } 240 - 241 - renderFilterUI(container: HTMLElement, activeFilters: Map<string, SourceFilter>, onChange: () => void, plugin: ATmarkPlugin): void { 242 - const collectionsSection = container.createEl("div", { cls: "atmark-filter-section" }); 243 - 244 - const collectionsTitleRow = collectionsSection.createEl("div", { cls: "atmark-filter-title-row" }); 245 - collectionsTitleRow.createEl("h3", { text: "Collections", cls: "atmark-filter-title" }); 246 - 247 - const createCollectionBtn = collectionsTitleRow.createEl("button", { cls: "atmark-filter-create-btn" }); 248 - setIcon(createCollectionBtn, "plus"); 249 - createCollectionBtn.addEventListener("click", () => { 250 - new CreateMarginCollectionModal(plugin, onChange).open(); 251 - }); 252 - 253 - const collectionsChips = collectionsSection.createEl("div", { cls: "atmark-filter-chips" }); 254 - 255 - const allCollectionsChip = collectionsChips.createEl("button", { 256 - text: "All", 257 - cls: `atmark-chip ${!activeFilters.has("marginCollection") ? "atmark-chip-active" : ""}`, 258 - }); 259 - allCollectionsChip.addEventListener("click", () => { 260 - activeFilters.delete("marginCollection"); 261 - onChange(); 262 - }); 263 - 264 - const tagsSection = container.createEl("div", { cls: "atmark-filter-section" }); 265 - 266 - const tagsTitleRow = tagsSection.createEl("div", { cls: "atmark-filter-title-row" }); 267 - tagsTitleRow.createEl("h3", { text: "Tags", cls: "atmark-filter-title" }); 268 - 269 - const tagsChips = tagsSection.createEl("div", { cls: "atmark-filter-chips" }); 270 - 271 - const allTagsChip = tagsChips.createEl("button", { 272 - text: "All", 273 - cls: `atmark-chip ${!activeFilters.has("marginTag") ? "atmark-chip-active" : ""}`, 274 - }); 275 - allTagsChip.addEventListener("click", () => { 276 - activeFilters.delete("marginTag"); 277 - onChange(); 278 - }); 279 - 280 - void this.getAvailableFilters().then(filters => { 281 - for (const filter of filters) { 282 - if (filter.type === "marginCollection") { 283 - const chip = collectionsChips.createEl("button", { 284 - text: filter.label, 285 - cls: `atmark-chip ${activeFilters.get("marginCollection")?.value === filter.value ? "atmark-chip-active" : ""}`, 286 - }); 287 - chip.addEventListener("click", () => { 288 - activeFilters.set("marginCollection", filter); 289 - onChange(); 290 - }); 291 - } else if (filter.type === "marginTag") { 292 - const chip = tagsChips.createEl("button", { 293 - text: filter.label, 294 - cls: `atmark-chip ${activeFilters.get("marginTag")?.value === filter.value ? "atmark-chip-active" : ""}`, 295 - }); 296 - chip.addEventListener("click", () => { 297 - activeFilters.set("marginTag", filter); 298 - onChange(); 299 - }); 300 - } 301 - } 302 - }); 303 - } 304 - }
-256
src/sources/semble.ts
··· 1 - import type { Client } from "@atcute/client"; 2 - import type { Record } from "@atcute/atproto/types/repo/listRecords"; 3 - import { setIcon } from "obsidian"; 4 - import type ATmarkPlugin from "../main"; 5 - import { getCards, getCollections, getCollectionLinks } from "../lib"; 6 - import type { Main as Card, NoteContent, UrlContent } from "../lexicons/types/network/cosmik/card"; 7 - import type { Main as Collection } from "../lexicons/types/network/cosmik/collection"; 8 - import type { Main as CollectionLink } from "../lexicons/types/network/cosmik/collectionLink"; 9 - import type { ATmarkItem, DataSource, SourceFilter } from "./types"; 10 - import { EditCardModal } from "../components/editCardModal"; 11 - import { CreateCollectionModal } from "../components/createCollectionModal"; 12 - 13 - type CardRecord = Record & { value: Card }; 14 - type CollectionRecord = Record & { value: Collection }; 15 - type CollectionLinkRecord = Record & { value: CollectionLink }; 16 - 17 - class SembleItem implements ATmarkItem { 18 - private record: CardRecord; 19 - private attachedNotes: Array<{ uri: string; text: string }>; 20 - private plugin: ATmarkPlugin; 21 - 22 - constructor(record: CardRecord, attachedNotes: Array<{ uri: string; text: string }>, plugin: ATmarkPlugin) { 23 - this.record = record; 24 - this.attachedNotes = attachedNotes; 25 - this.plugin = plugin; 26 - } 27 - 28 - getUri(): string { 29 - return this.record.uri; 30 - } 31 - 32 - getCid(): string { 33 - return this.record.cid; 34 - } 35 - 36 - getCreatedAt(): string { 37 - return this.record.value.createdAt || new Date().toISOString(); 38 - } 39 - 40 - getSource(): "semble" { 41 - return "semble"; 42 - } 43 - 44 - canAddNotes(): boolean { 45 - return true; 46 - } 47 - 48 - canEdit(): boolean { 49 - return true; 50 - } 51 - 52 - openEditModal(onSuccess?: () => void): void { 53 - new EditCardModal(this.plugin, this.record.uri, this.record.cid, onSuccess).open(); 54 - } 55 - 56 - render(container: HTMLElement): void { 57 - const el = container.createEl("div", { cls: "atmark-item-content" }); 58 - 59 - const card = this.record.value; 60 - 61 - if (card.type === "NOTE") { 62 - const content = card.content as NoteContent; 63 - el.createEl("p", { text: content.text, cls: "atmark-semble-card-text" }); 64 - } else if (card.type === "URL") { 65 - const content = card.content as UrlContent; 66 - const meta = content.metadata; 67 - 68 - if (meta?.title) { 69 - el.createEl("div", { text: meta.title, cls: "atmark-item-title" }); 70 - } 71 - 72 - if (meta?.imageUrl) { 73 - const img = el.createEl("img", { cls: "atmark-item-image" }); 74 - img.src = meta.imageUrl; 75 - img.alt = meta.title || "Image"; 76 - } 77 - 78 - if (meta?.description) { 79 - const desc = meta.description.length > 200 80 - ? meta.description.slice(0, 200) + "โ€ฆ" 81 - : meta.description; 82 - el.createEl("p", { text: desc, cls: "atmark-item-desc" }); 83 - } 84 - 85 - if (meta?.siteName) { 86 - el.createEl("span", { text: meta.siteName, cls: "atmark-item-site" }); 87 - } 88 - 89 - const link = el.createEl("a", { 90 - text: content.url, 91 - href: content.url, 92 - cls: "atmark-item-url", 93 - }); 94 - link.setAttr("target", "_blank"); 95 - } 96 - } 97 - 98 - renderDetail(container: HTMLElement): void { 99 - const body = container.createEl("div", { cls: "atmark-detail-body" }); 100 - const card = this.record.value; 101 - 102 - if (card.type === "NOTE") { 103 - const content = card.content as NoteContent; 104 - body.createEl("p", { text: content.text, cls: "atmark-semble-detail-text" }); 105 - } else if (card.type === "URL") { 106 - const content = card.content as UrlContent; 107 - const meta = content.metadata; 108 - 109 - if (meta?.title) { 110 - body.createEl("h2", { text: meta.title, cls: "atmark-detail-title" }); 111 - } 112 - 113 - if (meta?.imageUrl) { 114 - const img = body.createEl("img", { cls: "atmark-detail-image" }); 115 - img.src = meta.imageUrl; 116 - img.alt = meta.title || "Image"; 117 - } 118 - 119 - if (meta?.description) { 120 - body.createEl("p", { text: meta.description, cls: "atmark-detail-description" }); 121 - } 122 - 123 - if (meta?.siteName) { 124 - const metaGrid = body.createEl("div", { cls: "atmark-detail-meta" }); 125 - const item = metaGrid.createEl("div", { cls: "atmark-detail-meta-item" }); 126 - item.createEl("span", { text: "Site", cls: "atmark-detail-meta-label" }); 127 - item.createEl("span", { text: meta.siteName, cls: "atmark-detail-meta-value" }); 128 - } 129 - 130 - const linkWrapper = body.createEl("div", { cls: "atmark-detail-link-wrapper" }); 131 - const link = linkWrapper.createEl("a", { 132 - text: content.url, 133 - href: content.url, 134 - cls: "atmark-detail-link", 135 - }); 136 - link.setAttr("target", "_blank"); 137 - } 138 - 139 - } 140 - 141 - getAttachedNotes() { 142 - return this.attachedNotes; 143 - } 144 - 145 - getRecord() { 146 - return this.record; 147 - } 148 - } 149 - 150 - export class SembleSource implements DataSource { 151 - readonly name = "semble" as const; 152 - private client: Client; 153 - private repo: string; 154 - 155 - constructor(client: Client, repo: string) { 156 - this.client = client; 157 - this.repo = repo; 158 - } 159 - 160 - async fetchItems(filters: SourceFilter[], plugin: ATmarkPlugin): Promise<ATmarkItem[]> { 161 - const cardsResp = await getCards(this.client, this.repo); 162 - if (!cardsResp.ok) return []; 163 - 164 - const allSembleCards = cardsResp.data.records as CardRecord[]; 165 - 166 - const notesMap = new Map<string, Array<{ uri: string; text: string }>>(); 167 - for (const record of allSembleCards) { 168 - if (record.value.type === "NOTE") { 169 - const parentUri = record.value.parentCard?.uri; 170 - if (parentUri) { 171 - const noteContent = record.value.content as NoteContent; 172 - const existing = notesMap.get(parentUri) || []; 173 - existing.push({ uri: record.uri, text: noteContent.text }); 174 - notesMap.set(parentUri, existing); 175 - } 176 - } 177 - } 178 - 179 - // Filter out NOTE cards that are attached to other cards 180 - let sembleCards = allSembleCards.filter((record: CardRecord) => { 181 - if (record.value.type === "NOTE") { 182 - const hasParent = record.value.parentCard?.uri; 183 - return !hasParent; 184 - } 185 - return true; 186 - }); 187 - 188 - const collectionFilter = filters.find(f => f.type === "sembleCollection"); 189 - if (collectionFilter && collectionFilter.value) { 190 - const linksResp = await getCollectionLinks(this.client, this.repo); 191 - if (linksResp.ok) { 192 - const links = linksResp.data.records as CollectionLinkRecord[]; 193 - const filteredLinks = links.filter((link: CollectionLinkRecord) => 194 - link.value.collection.uri === collectionFilter.value 195 - ); 196 - const cardUris = new Set(filteredLinks.map((link: CollectionLinkRecord) => link.value.card.uri)); 197 - sembleCards = sembleCards.filter((card: CardRecord) => cardUris.has(card.uri)); 198 - } 199 - } 200 - 201 - return sembleCards.map((record: CardRecord) => 202 - new SembleItem(record, notesMap.get(record.uri) || [], plugin) 203 - ); 204 - } 205 - 206 - async getAvailableFilters(): Promise<SourceFilter[]> { 207 - const collectionsResp = await getCollections(this.client, this.repo); 208 - if (!collectionsResp.ok) return []; 209 - 210 - const collections = collectionsResp.data.records as CollectionRecord[]; 211 - return collections.map((c: CollectionRecord) => ({ 212 - type: "sembleCollection", 213 - value: c.uri, 214 - label: c.value.name, 215 - })); 216 - } 217 - 218 - renderFilterUI(container: HTMLElement, activeFilters: Map<string, SourceFilter>, onChange: () => void, plugin: ATmarkPlugin): void { 219 - const section = container.createEl("div", { cls: "atmark-filter-section" }); 220 - 221 - const titleRow = section.createEl("div", { cls: "atmark-filter-title-row" }); 222 - titleRow.createEl("h3", { text: "Semble collections", cls: "atmark-filter-title" }); 223 - 224 - const createBtn = titleRow.createEl("button", { cls: "atmark-filter-create-btn" }); 225 - setIcon(createBtn, "plus"); 226 - createBtn.addEventListener("click", () => { 227 - new CreateCollectionModal(plugin, onChange).open(); 228 - }); 229 - 230 - const chips = section.createEl("div", { cls: "atmark-filter-chips" }); 231 - 232 - const allChip = chips.createEl("button", { 233 - text: "All", 234 - cls: `atmark-chip ${!activeFilters.has("sembleCollection") ? "atmark-chip-active" : ""}`, 235 - }); 236 - allChip.addEventListener("click", () => { 237 - activeFilters.delete("sembleCollection"); 238 - onChange(); 239 - }); 240 - 241 - // Get collections synchronously - note: this is a limitation 242 - // In a real app, we'd want to cache these or handle async properly 243 - void this.getAvailableFilters().then(collections => { 244 - for (const collection of collections) { 245 - const chip = chips.createEl("button", { 246 - text: collection.label, 247 - cls: `atmark-chip ${activeFilters.get("sembleCollection")?.value === collection.value ? "atmark-chip-active" : ""}`, 248 - }); 249 - chip.addEventListener("click", () => { 250 - activeFilters.set("sembleCollection", collection); 251 - onChange(); 252 - }); 253 - } 254 - }); 255 - } 256 - }
-27
src/sources/types.ts
··· 1 - import type ATmarkPlugin from "../main"; 2 - 3 - export interface ATmarkItem { 4 - render(container: HTMLElement): void; 5 - renderDetail(container: HTMLElement): void; 6 - canAddNotes(): boolean; 7 - canEdit(): boolean; 8 - openEditModal(onSuccess?: () => void): void; 9 - getUri(): string; 10 - getCid(): string; 11 - getCreatedAt(): string; 12 - getSource(): "semble" | "bookmark" | "margin"; 13 - getAttachedNotes?(): Array<{ uri: string; text: string }>; 14 - } 15 - 16 - export interface SourceFilter { 17 - type: string; 18 - value: string; 19 - label?: string; 20 - } 21 - 22 - export interface DataSource { 23 - readonly name: "semble" | "bookmark" | "margin"; 24 - fetchItems(filters: SourceFilter[], plugin: ATmarkPlugin): Promise<ATmarkItem[]>; 25 - getAvailableFilters(): Promise<SourceFilter[]>; 26 - renderFilterUI(container: HTMLElement, activeFilters: Map<string, SourceFilter>, onChange: () => void, plugin: ATmarkPlugin): void; 27 - }
-209
src/views/atmark.ts
··· 1 - import { ItemView, WorkspaceLeaf, setIcon } from "obsidian"; 2 - import type ATmarkPlugin from "../main"; 3 - import { CardDetailModal } from "../components/cardDetailModal"; 4 - import type { ATmarkItem, DataSource, SourceFilter } from "../sources/types"; 5 - import { SembleSource } from "../sources/semble"; 6 - import { BookmarkSource } from "../sources/bookmark"; 7 - import { MarginSource } from "../sources/margin"; 8 - 9 - export const VIEW_TYPE_ATMARK = "atmark-view"; 10 - 11 - type SourceType = "semble" | "bookmark" | "margin"; 12 - 13 - export class ATmarkView extends ItemView { 14 - plugin: ATmarkPlugin; 15 - activeSource: SourceType = "semble"; 16 - sources: Map<SourceType, { source: DataSource; filters: Map<string, SourceFilter> }> = new Map(); 17 - 18 - constructor(leaf: WorkspaceLeaf, plugin: ATmarkPlugin) { 19 - super(leaf); 20 - this.plugin = plugin; 21 - 22 - this.initSources(); 23 - 24 - } 25 - 26 - initSources() { 27 - if (this.plugin.client) { 28 - const repo = this.plugin.settings.identifier; 29 - this.sources.set("semble", { 30 - source: new SembleSource(this.plugin.client, repo), 31 - filters: new Map() 32 - }); 33 - this.sources.set("bookmark", { 34 - source: new BookmarkSource(this.plugin.client, repo), 35 - filters: new Map() 36 - }); 37 - this.sources.set("margin", { 38 - source: new MarginSource(this.plugin.client, repo), 39 - filters: new Map() 40 - }); 41 - } 42 - 43 - } 44 - 45 - getViewType() { 46 - return VIEW_TYPE_ATMARK; 47 - } 48 - 49 - getDisplayText() { 50 - // This is the name of the plugin, which contains the acronym "AT" 51 - // eslint-disable-next-line obsidianmd/ui/sentence-case 52 - return "ATmark"; 53 - } 54 - 55 - getIcon() { 56 - return "layers"; 57 - } 58 - 59 - async onOpen() { 60 - await this.render(); 61 - } 62 - 63 - async fetchItems(): Promise<ATmarkItem[]> { 64 - if (!this.plugin.client) return []; 65 - 66 - const sourceData = this.sources.get(this.activeSource); 67 - if (!sourceData) return []; 68 - 69 - const filters = Array.from(sourceData.filters.values()); 70 - return await sourceData.source.fetchItems(filters, this.plugin); 71 - } 72 - 73 - async render() { 74 - const container = this.contentEl; 75 - container.empty(); 76 - container.addClass("atmark-view"); 77 - 78 - if (!this.plugin.client) { 79 - await this.plugin.refreshClient(); 80 - if (!this.plugin.client) { 81 - container.createEl("p", { text: "Not logged in, check your credentials in settings." }); 82 - return; 83 - } 84 - this.initSources(); 85 - } 86 - this.renderHeader(container); 87 - 88 - const loading = container.createEl("p", { text: "Loading..." }); 89 - 90 - try { 91 - const items = await this.fetchItems(); 92 - loading.remove(); 93 - 94 - 95 - if (items.length === 0) { 96 - container.createEl("p", { text: "No items found." }); 97 - return; 98 - } 99 - 100 - const grid = container.createEl("div", { cls: "atmark-grid" }); 101 - for (const item of items) { 102 - try { 103 - this.renderItem(grid, item); 104 - } catch (err) { 105 - const message = err instanceof Error ? err.message : String(err); 106 - console.error(`Failed to render item ${item.getUri()}: ${message}`); 107 - } 108 - } 109 - } catch (err) { 110 - loading.remove(); 111 - const message = err instanceof Error ? err.message : String(err); 112 - container.createEl("p", { text: `Failed to load: ${message}`, cls: "atmark-error" }); 113 - } 114 - } 115 - 116 - private renderHeader(container: HTMLElement) { 117 - const header = container.createEl("div", { cls: "atmark-header" }); 118 - 119 - const sourceSelector = header.createEl("div", { cls: "atmark-source-selector" }); 120 - const sources: SourceType[] = ["semble", "margin", "bookmark"]; 121 - 122 - for (const source of sources) { 123 - const label = sourceSelector.createEl("label", { cls: "atmark-source-option" }); 124 - 125 - const radio = label.createEl("input", { 126 - type: "radio", 127 - cls: "atmark-source-radio", 128 - }); 129 - radio.name = "atmark-source"; 130 - radio.checked = this.activeSource === source; 131 - radio.addEventListener("change", () => { 132 - this.activeSource = source; 133 - void this.render(); 134 - }); 135 - 136 - label.createEl("span", { 137 - text: source.charAt(0).toUpperCase() + source.slice(1), 138 - cls: "atmark-source-text", 139 - }); 140 - } 141 - 142 - const filtersContainer = container.createEl("div", { cls: "atmark-filters" }); 143 - const sourceData = this.sources.get(this.activeSource); 144 - if (sourceData) { 145 - sourceData.source.renderFilterUI( 146 - filtersContainer, 147 - sourceData.filters, 148 - () => void this.render(), 149 - this.plugin 150 - ); 151 - } 152 - } 153 - 154 - private renderItem(container: HTMLElement, item: ATmarkItem) { 155 - const el = container.createEl("div", { cls: "atmark-item" }); 156 - 157 - el.addEventListener("click", (e) => { 158 - // Don't open detail if clicking the edit button 159 - if ((e.target as HTMLElement).closest(".atmark-item-edit-btn")) { 160 - return; 161 - } 162 - new CardDetailModal(this.plugin, item, () => { 163 - void this.render(); 164 - }).open(); 165 - }); 166 - 167 - const header = el.createEl("div", { cls: "atmark-item-header" }); 168 - const source = item.getSource(); 169 - header.createEl("span", { 170 - text: source, 171 - cls: `atmark-badge atmark-badge-${source}`, 172 - }); 173 - 174 - if (item.canEdit()) { 175 - const editBtn = header.createEl("button", { 176 - cls: "atmark-item-edit-btn", 177 - }); 178 - setIcon(editBtn, "more-vertical"); 179 - editBtn.addEventListener("click", (e) => { 180 - e.stopPropagation(); 181 - item.openEditModal(() => { 182 - void this.render(); 183 - }); 184 - }); 185 - } 186 - 187 - item.render(el); 188 - 189 - const footer = el.createEl("div", { cls: "atmark-item-footer" }); 190 - footer.createEl("span", { 191 - text: new Date(item.getCreatedAt()).toLocaleDateString(), 192 - cls: "atmark-date", 193 - }); 194 - 195 - // Show note indicator for items with attached notes (semble cards) 196 - const notes = item.getAttachedNotes?.(); 197 - if (notes && notes.length > 0) { 198 - const noteIndicator = footer.createEl("div", { cls: "atmark-note-indicator" }); 199 - const icon = noteIndicator.createEl("span", { cls: "atmark-note-icon" }); 200 - setIcon(icon, "message-square"); 201 - noteIndicator.createEl("span", { 202 - text: `${notes.length} note${notes.length > 1 ? 's' : ''}`, 203 - cls: "atmark-note-count" 204 - }); 205 - } 206 - } 207 - 208 - async onClose() { } 209 - }
-1014
styles.css
··· 1 - /* ATmark View */ 2 - .atmark-view { 3 - padding: 20px; 4 - } 5 - 6 - .atmark-header { 7 - margin-bottom: 24px; 8 - padding-bottom: 16px; 9 - border-bottom: 1px solid var(--background-modifier-border); 10 - } 11 - 12 - .atmark-source-selector { 13 - display: flex; 14 - align-items: center; 15 - justify-content: center; 16 - gap: 0; 17 - margin-bottom: 12px; 18 - border-bottom: 1px solid var(--background-modifier-border); 19 - position: relative; 20 - } 21 - 22 - .atmark-source-option { 23 - display: flex; 24 - align-items: center; 25 - justify-content: center; 26 - gap: 4px; 27 - padding: 10px 20px; 28 - cursor: pointer; 29 - user-select: none; 30 - border: none; 31 - background: transparent; 32 - transition: all 0.15s ease; 33 - position: relative; 34 - margin-bottom: -1px; 35 - } 36 - 37 - .atmark-source-option::after { 38 - content: ""; 39 - position: absolute; 40 - bottom: 0; 41 - left: 0; 42 - right: 0; 43 - height: 2px; 44 - background: transparent; 45 - transition: background 0.15s ease; 46 - } 47 - 48 - .atmark-source-option:hover { 49 - background: var(--background-modifier-hover); 50 - } 51 - 52 - .atmark-source-option:has(input:checked)::after { 53 - background: var(--interactive-accent); 54 - } 55 - 56 - .atmark-source-option:has(input:checked) .atmark-source-text { 57 - color: var(--interactive-accent); 58 - font-weight: var(--font-semibold); 59 - } 60 - 61 - .atmark-source-radio { 62 - display: none; 63 - } 64 - 65 - .atmark-source-text { 66 - font-size: var(--font-ui-small); 67 - font-weight: var(--font-medium); 68 - color: var(--text-muted); 69 - } 70 - 71 - .atmark-filters { 72 - display: flex; 73 - flex-direction: column; 74 - gap: 16px; 75 - margin-bottom: 16px; 76 - } 77 - 78 - .atmark-filter-section { 79 - display: flex; 80 - flex-direction: column; 81 - gap: 6px; 82 - } 83 - 84 - .atmark-filter-title-row { 85 - display: flex; 86 - align-items: center; 87 - gap: 6px; 88 - margin-bottom: 2px; 89 - } 90 - 91 - .atmark-filter-title { 92 - margin: 0; 93 - font-size: var(--font-smallest); 94 - font-weight: var(--font-semibold); 95 - color: var(--text-faint); 96 - text-transform: uppercase; 97 - letter-spacing: 0.05em; 98 - } 99 - 100 - .atmark-filter-create-btn { 101 - display: flex; 102 - align-items: center; 103 - justify-content: center; 104 - width: 18px; 105 - height: 18px; 106 - padding: 0; 107 - background: transparent; 108 - border: none; 109 - border-radius: var(--radius-s); 110 - cursor: pointer; 111 - color: var(--text-faint); 112 - transition: all 0.15s ease; 113 - opacity: 0.7; 114 - } 115 - 116 - .atmark-filter-create-btn:hover { 117 - background: var(--background-modifier-hover); 118 - color: var(--interactive-accent); 119 - opacity: 1; 120 - } 121 - 122 - .atmark-filter-create-btn svg { 123 - width: 12px; 124 - height: 12px; 125 - } 126 - 127 - .atmark-filter-chips { 128 - display: flex; 129 - flex-wrap: wrap; 130 - gap: 6px; 131 - align-items: center; 132 - } 133 - 134 - .atmark-chip { 135 - padding: 3px 10px; 136 - border-radius: var(--radius-m); 137 - border: none; 138 - background: var(--background-modifier-border); 139 - color: var(--text-muted); 140 - font-size: var(--font-smallest); 141 - font-weight: var(--font-medium); 142 - cursor: pointer; 143 - transition: all 0.12s ease; 144 - white-space: nowrap; 145 - } 146 - 147 - .atmark-chip:hover { 148 - background: var(--background-modifier-border-hover); 149 - color: var(--text-normal); 150 - transform: translateY(-1px); 151 - } 152 - 153 - .atmark-chip-active { 154 - background: var(--interactive-accent); 155 - color: var(--text-on-accent); 156 - font-weight: var(--font-semibold); 157 - } 158 - 159 - .atmark-chip-active:hover { 160 - background: var(--interactive-accent-hover); 161 - transform: translateY(-1px); 162 - } 163 - 164 - .atmark-grid { 165 - display: grid; 166 - grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); 167 - gap: 16px; 168 - padding: 8px 0; 169 - } 170 - 171 - .atmark-item { 172 - background: var(--background-secondary); 173 - border: 1px solid var(--background-modifier-border); 174 - border-radius: var(--radius-m); 175 - padding: 16px; 176 - display: flex; 177 - flex-direction: column; 178 - transition: box-shadow 0.15s ease, border-color 0.15s ease; 179 - cursor: pointer; 180 - } 181 - 182 - .atmark-item:hover { 183 - box-shadow: var(--shadow-s); 184 - border-color: var(--background-modifier-border-hover); 185 - } 186 - 187 - .atmark-item-header { 188 - display: flex; 189 - justify-content: space-between; 190 - align-items: flex-start; 191 - gap: 8px; 192 - } 193 - 194 - .atmark-item-edit-btn { 195 - display: flex; 196 - align-items: center; 197 - justify-content: center; 198 - width: 24px; 199 - height: 24px; 200 - padding: 0; 201 - margin-left: auto; 202 - background: transparent; 203 - border: none; 204 - border-radius: var(--radius-s); 205 - cursor: pointer; 206 - color: var(--text-faint); 207 - opacity: 0.6; 208 - transition: all 0.15s ease; 209 - } 210 - 211 - .atmark-item:hover .atmark-item-edit-btn { 212 - opacity: 1; 213 - } 214 - 215 - .atmark-item-edit-btn:hover { 216 - background: var(--background-modifier-hover); 217 - color: var(--text-normal); 218 - opacity: 1; 219 - } 220 - 221 - .atmark-item-edit-btn svg { 222 - width: 14px; 223 - height: 14px; 224 - } 225 - 226 - .atmark-badge { 227 - font-size: 10px; 228 - padding: 3px 8px; 229 - border-radius: 12px; 230 - text-transform: capitalize; 231 - font-weight: var(--font-normal); 232 - flex-shrink: 0; 233 - letter-spacing: 0.3px; 234 - } 235 - 236 - .atmark-badge-semble { 237 - background: color-mix(in srgb, var(--color-orange) 15%, transparent); 238 - color: var(--color-orange); 239 - border: 1px solid color-mix(in srgb, var(--color-orange) 30%, transparent); 240 - } 241 - 242 - .atmark-badge-bookmark { 243 - background: color-mix(in srgb, var(--color-cyan) 15%, transparent); 244 - color: var(--color-cyan); 245 - border: 1px solid color-mix(in srgb, var(--color-cyan) 30%, transparent); 246 - } 247 - 248 - .atmark-badge-margin { 249 - background: color-mix(in srgb, var(--color-purple) 15%, transparent); 250 - color: var(--color-purple); 251 - border: 1px solid color-mix(in srgb, var(--color-purple) 30%, transparent); 252 - } 253 - 254 - .atmark-item-footer { 255 - display: flex; 256 - justify-content: space-between; 257 - font-size: var(--font-smallest); 258 - color: var(--text-faint); 259 - margin-top: auto; 260 - padding-top: 8px; 261 - border-top: 1px solid var(--background-modifier-border); 262 - } 263 - 264 - .atmark-date { 265 - font-size: var(--font-smallest); 266 - color: var(--text-faint); 267 - } 268 - 269 - .atmark-error { 270 - color: var(--text-error); 271 - } 272 - 273 - 274 - /* Item Content (shared between sources) */ 275 - .atmark-item-content { 276 - display: flex; 277 - flex-direction: column; 278 - gap: 12px; 279 - } 280 - 281 - .atmark-item-title { 282 - font-weight: var(--font-semibold); 283 - font-size: 1em; 284 - color: var(--text-normal); 285 - display: -webkit-box; 286 - -webkit-line-clamp: 2; 287 - -webkit-box-orient: vertical; 288 - overflow: hidden; 289 - line-height: 1.4; 290 - margin-bottom: 4px; 291 - } 292 - 293 - .atmark-item-image { 294 - width: 100%; 295 - max-height: 120px; 296 - object-fit: cover; 297 - border-radius: var(--radius-s); 298 - } 299 - 300 - .atmark-item-desc { 301 - color: var(--text-muted); 302 - font-size: var(--font-small); 303 - margin: 0; 304 - display: -webkit-box; 305 - -webkit-line-clamp: 2; 306 - -webkit-box-orient: vertical; 307 - overflow: hidden; 308 - line-height: 1.5; 309 - } 310 - 311 - .atmark-item-site { 312 - font-size: var(--font-smallest); 313 - color: var(--text-faint); 314 - margin-bottom: 2px; 315 - } 316 - 317 - .atmark-item-url { 318 - font-size: var(--font-smallest); 319 - color: var(--text-accent); 320 - text-decoration: none; 321 - word-break: break-all; 322 - display: -webkit-box; 323 - -webkit-line-clamp: 1; 324 - -webkit-box-orient: vertical; 325 - overflow: hidden; 326 - } 327 - 328 - .atmark-item-url:hover { 329 - text-decoration: underline; 330 - } 331 - 332 - .atmark-item-tags { 333 - display: flex; 334 - flex-wrap: wrap; 335 - gap: 6px; 336 - margin-bottom: 8px; 337 - } 338 - 339 - .atmark-tag { 340 - font-size: var(--font-smallest); 341 - padding: 2px 8px; 342 - border-radius: var(--radius-s); 343 - background: var(--background-modifier-border); 344 - color: var(--text-muted); 345 - border: 1px solid var(--background-modifier-border-hover); 346 - } 347 - 348 - .atmark-item-collections { 349 - display: flex; 350 - flex-wrap: wrap; 351 - gap: 6px; 352 - margin-bottom: 8px; 353 - } 354 - 355 - .atmark-collection { 356 - font-size: var(--font-smallest); 357 - padding: 2px 8px; 358 - border-radius: var(--radius-s); 359 - background: color-mix(in srgb, var(--color-purple) 10%, transparent); 360 - color: var(--color-purple); 361 - border: 1px solid color-mix(in srgb, var(--color-purple) 30%, transparent); 362 - } 363 - 364 - .atmark-item-collections-section { 365 - margin-top: 20px; 366 - padding-top: 20px; 367 - border-top: 1px solid var(--background-modifier-border); 368 - } 369 - 370 - .atmark-item-tags-section { 371 - margin-top: 20px; 372 - padding-top: 20px; 373 - border-top: 1px solid var(--background-modifier-border); 374 - } 375 - 376 - /* Note indicator for cards with attached notes */ 377 - .atmark-note-indicator { 378 - display: flex; 379 - align-items: center; 380 - gap: 4px; 381 - font-size: var(--font-smallest); 382 - color: var(--text-muted); 383 - } 384 - 385 - .atmark-note-icon { 386 - display: flex; 387 - align-items: center; 388 - color: var(--text-muted); 389 - } 390 - 391 - .atmark-note-icon svg { 392 - width: 12px; 393 - height: 12px; 394 - } 395 - 396 - .atmark-note-count { 397 - font-size: var(--font-smallest); 398 - } 399 - 400 - /* Detail Modal (shared between sources) */ 401 - .atmark-detail-body { 402 - display: flex; 403 - flex-direction: column; 404 - gap: 16px; 405 - } 406 - 407 - .atmark-detail-title { 408 - margin: 0; 409 - font-size: var(--h2-size); 410 - font-weight: var(--font-semibold); 411 - color: var(--text-normal); 412 - line-height: 1.3; 413 - } 414 - 415 - .atmark-detail-image { 416 - max-width: 100%; 417 - max-height: 200px; 418 - object-fit: contain; 419 - border-radius: var(--radius-m); 420 - } 421 - 422 - .atmark-detail-description { 423 - margin: 0; 424 - color: var(--text-normal); 425 - line-height: var(--line-height-normal); 426 - } 427 - 428 - .atmark-detail-meta { 429 - display: grid; 430 - grid-template-columns: repeat(2, 1fr); 431 - gap: 12px; 432 - padding: 16px; 433 - background: var(--background-secondary); 434 - border-radius: var(--radius-m); 435 - } 436 - 437 - .atmark-detail-meta-item { 438 - display: flex; 439 - flex-direction: column; 440 - gap: 2px; 441 - } 442 - 443 - .atmark-detail-meta-label { 444 - font-size: var(--font-smallest); 445 - color: var(--text-faint); 446 - text-transform: uppercase; 447 - letter-spacing: 0.5px; 448 - } 449 - 450 - .atmark-detail-meta-value { 451 - font-size: var(--font-small); 452 - color: var(--text-normal); 453 - } 454 - 455 - .atmark-detail-link-wrapper { 456 - padding-top: 8px; 457 - } 458 - 459 - .atmark-detail-link { 460 - font-size: var(--font-small); 461 - color: var(--text-accent); 462 - text-decoration: none; 463 - word-break: break-all; 464 - } 465 - 466 - .atmark-detail-link:hover { 467 - text-decoration: underline; 468 - } 469 - 470 - .atmark-detail-section-title { 471 - margin: 0 0 12px 0; 472 - font-size: var(--font-small); 473 - font-weight: var(--font-semibold); 474 - color: var(--text-muted); 475 - text-transform: uppercase; 476 - letter-spacing: 0.5px; 477 - } 478 - 479 - /* Modals and Forms (shared) */ 480 - .atmark-modal { 481 - padding: 16px; 482 - } 483 - 484 - .atmark-modal h2 { 485 - margin: 0 0 16px 0; 486 - font-size: var(--h2-size); 487 - font-weight: var(--font-semibold); 488 - color: var(--text-normal); 489 - } 490 - 491 - .atmark-form { 492 - display: flex; 493 - flex-direction: column; 494 - gap: 16px; 495 - } 496 - 497 - .atmark-form-group { 498 - display: flex; 499 - flex-direction: column; 500 - gap: 6px; 501 - } 502 - 503 - .atmark-form-group label { 504 - font-size: var(--font-small); 505 - font-weight: var(--font-medium); 506 - color: var(--text-normal); 507 - } 508 - 509 - .atmark-input, 510 - .atmark-textarea { 511 - padding: 8px 12px; 512 - background: var(--background-primary); 513 - border: 1px solid var(--background-modifier-border); 514 - border-radius: var(--radius-s); 515 - color: var(--text-normal); 516 - font-size: var(--font-ui-medium); 517 - font-family: inherit; 518 - transition: border-color 0.15s ease; 519 - } 520 - 521 - .atmark-input:focus, 522 - .atmark-textarea:focus { 523 - outline: none; 524 - border-color: var(--interactive-accent); 525 - box-shadow: 0 0 0 2px var(--background-modifier-border-focus); 526 - } 527 - 528 - .atmark-input::placeholder, 529 - .atmark-textarea::placeholder { 530 - color: var(--text-faint); 531 - } 532 - 533 - .atmark-textarea { 534 - resize: vertical; 535 - min-height: 60px; 536 - } 537 - 538 - .atmark-modal-actions { 539 - display: flex; 540 - align-items: center; 541 - gap: 8px; 542 - padding-top: 16px; 543 - border-top: 1px solid var(--background-modifier-border); 544 - } 545 - 546 - .atmark-spacer { 547 - flex: 1; 548 - } 549 - 550 - .atmark-btn { 551 - padding: 8px 16px; 552 - border-radius: var(--radius-s); 553 - font-size: var(--font-small); 554 - font-weight: var(--font-medium); 555 - cursor: pointer; 556 - transition: all 0.15s ease; 557 - } 558 - 559 - .atmark-btn:disabled { 560 - opacity: 0.5; 561 - cursor: not-allowed; 562 - } 563 - 564 - .atmark-btn-secondary { 565 - background: var(--background-secondary); 566 - border: 1px solid var(--background-modifier-border); 567 - color: var(--text-normal); 568 - } 569 - 570 - .atmark-btn-secondary:hover:not(:disabled) { 571 - background: var(--background-modifier-hover); 572 - } 573 - 574 - .atmark-btn-primary { 575 - background: var(--interactive-accent); 576 - border: 1px solid var(--interactive-accent); 577 - color: var(--text-on-accent); 578 - } 579 - 580 - .atmark-btn-primary:hover:not(:disabled) { 581 - background: var(--interactive-accent-hover); 582 - } 583 - 584 - .atmark-btn-danger { 585 - background: color-mix(in srgb, var(--color-red) 15%, transparent); 586 - border: none; 587 - color: var(--color-red); 588 - } 589 - 590 - .atmark-btn-danger:hover:not(:disabled) { 591 - background: color-mix(in srgb, var(--color-red) 25%, transparent); 592 - } 593 - 594 - .atmark-warning-text { 595 - color: var(--text-muted); 596 - margin-bottom: 16px; 597 - } 598 - 599 - .atmark-tags-container { 600 - display: flex; 601 - flex-direction: column; 602 - gap: 8px; 603 - margin-bottom: 8px; 604 - } 605 - 606 - .atmark-tag-row { 607 - display: flex; 608 - align-items: center; 609 - gap: 8px; 610 - } 611 - 612 - .atmark-tag-row .atmark-input { 613 - flex: 1; 614 - } 615 - 616 - .atmark-tag-remove-btn { 617 - width: 32px; 618 - height: 32px; 619 - padding: 0; 620 - font-size: 20px; 621 - line-height: 1; 622 - flex-shrink: 0; 623 - } 624 - 625 - 626 - .atmark-collection-list { 627 - display: flex; 628 - flex-direction: column; 629 - gap: 8px; 630 - max-height: 200px; 631 - overflow-y: auto; 632 - } 633 - 634 - .atmark-collection-item { 635 - display: flex; 636 - align-items: center; 637 - gap: 12px; 638 - padding: 10px 12px; 639 - background: var(--background-secondary); 640 - border: 1px solid var(--background-modifier-border); 641 - border-radius: var(--radius-m); 642 - cursor: pointer; 643 - transition: all 0.15s ease; 644 - } 645 - 646 - .atmark-collection-item:hover { 647 - background: var(--background-modifier-hover); 648 - border-color: var(--background-modifier-border-hover); 649 - } 650 - 651 - .atmark-collection-checkbox { 652 - width: 18px; 653 - height: 18px; 654 - margin: 0; 655 - cursor: pointer; 656 - accent-color: var(--interactive-accent); 657 - } 658 - 659 - .atmark-collection-item-info { 660 - display: flex; 661 - flex-direction: column; 662 - gap: 2px; 663 - flex: 1; 664 - } 665 - 666 - .atmark-collection-item-name { 667 - font-weight: var(--font-medium); 668 - color: var(--text-normal); 669 - } 670 - 671 - .atmark-collection-item-desc { 672 - font-size: var(--font-small); 673 - color: var(--text-muted); 674 - } 675 - 676 - .atmark-tag-list { 677 - display: flex; 678 - flex-wrap: wrap; 679 - gap: 6px; 680 - margin-bottom: 8px; 681 - } 682 - 683 - .atmark-tag-item { 684 - display: flex; 685 - align-items: center; 686 - padding: 4px 12px; 687 - background: var(--background-modifier-border); 688 - border-radius: var(--radius-m); 689 - cursor: pointer; 690 - transition: all 0.15s ease; 691 - font-size: var(--font-small); 692 - color: var(--text-muted); 693 - } 694 - 695 - .atmark-tag-item:hover { 696 - background: var(--background-modifier-border-hover); 697 - color: var(--text-normal); 698 - } 699 - 700 - .atmark-tag-item:has(input:checked) { 701 - background: var(--interactive-accent); 702 - color: var(--text-on-accent); 703 - } 704 - 705 - .atmark-tag-item input { 706 - display: none; 707 - } 708 - 709 - /* Semble-specific styles (for NOTE cards and attached notes) */ 710 - .atmark-semble-card-note { 711 - margin: 0; 712 - padding: 8px 12px; 713 - background: var(--background-primary); 714 - border-left: 3px solid var(--color-accent); 715 - border-radius: var(--radius-s); 716 - font-size: var(--font-small); 717 - font-style: italic; 718 - color: var(--text-muted); 719 - white-space: pre-wrap; 720 - line-height: var(--line-height-normal); 721 - } 722 - 723 - .atmark-semble-card-text { 724 - margin: 0; 725 - line-height: 1.5; 726 - color: var(--text-normal); 727 - display: -webkit-box; 728 - -webkit-line-clamp: 5; 729 - -webkit-box-orient: vertical; 730 - overflow: hidden; 731 - } 732 - 733 - .atmark-semble-detail-text { 734 - margin: 0; 735 - white-space: pre-wrap; 736 - line-height: var(--line-height-normal); 737 - color: var(--text-normal); 738 - font-size: 1.1em; 739 - } 740 - 741 - .atmark-semble-detail-notes-section { 742 - margin-top: 20px; 743 - padding-top: 20px; 744 - border-top: 1px solid var(--background-modifier-border); 745 - } 746 - 747 - .atmark-semble-detail-note { 748 - display: flex; 749 - align-items: flex-start; 750 - justify-content: space-between; 751 - gap: 12px; 752 - padding: 12px 16px; 753 - background: var(--background-secondary); 754 - border-left: 3px solid var(--color-accent); 755 - border-radius: var(--radius-s); 756 - margin-bottom: 8px; 757 - } 758 - 759 - .atmark-semble-detail-note-content { 760 - display: flex; 761 - gap: 12px; 762 - flex: 1; 763 - min-width: 0; 764 - } 765 - 766 - .atmark-semble-detail-note-icon { 767 - flex-shrink: 0; 768 - color: var(--color-accent); 769 - } 770 - 771 - .atmark-semble-detail-note-icon svg { 772 - width: 16px; 773 - height: 16px; 774 - } 775 - 776 - .atmark-semble-detail-note-text { 777 - margin: 0; 778 - color: var(--text-normal); 779 - line-height: var(--line-height-normal); 780 - white-space: pre-wrap; 781 - } 782 - 783 - /* Card type badges */ 784 - .atmark-semble-badge-note { 785 - background: var(--color-accent); 786 - color: var(--text-on-accent); 787 - } 788 - 789 - .atmark-semble-badge-url { 790 - background: color-mix(in srgb, var(--color-purple) 80%, var(--background-primary)); 791 - color: var(--text-on-accent); 792 - } 793 - 794 - .atmark-badge-source { 795 - font-size: var(--font-smallest); 796 - opacity: 0.8; 797 - } 798 - 799 - .atmark-semble-badge-semble { 800 - background: color-mix(in srgb, var(--color-green) 80%, var(--background-primary)); 801 - color: var(--text-on-accent); 802 - } 803 - 804 - /* Profile Icon */ 805 - .atmark-profile-icon { 806 - display: flex; 807 - align-items: center; 808 - gap: 6px; 809 - padding: 10px 12px; 810 - margin-bottom: -1px; 811 - margin-left: auto; 812 - position: absolute; 813 - right: 0; 814 - background: transparent; 815 - transition: background 0.15s ease; 816 - } 817 - 818 - .atmark-profile-icon:hover { 819 - background: var(--background-modifier-hover); 820 - } 821 - 822 - .atmark-avatar-btn { 823 - display: flex; 824 - align-items: center; 825 - justify-content: center; 826 - width: 24px; 827 - height: 24px; 828 - padding: 0; 829 - background: var(--background-secondary); 830 - border: 1px solid var(--background-modifier-border); 831 - border-radius: 50%; 832 - cursor: pointer; 833 - overflow: hidden; 834 - transition: opacity 0.15s ease; 835 - } 836 - 837 - .atmark-avatar-btn:hover { 838 - opacity: 0.8; 839 - } 840 - 841 - .atmark-avatar-img { 842 - width: 100%; 843 - height: 100%; 844 - object-fit: cover; 845 - border-radius: 50%; 846 - } 847 - 848 - .atmark-avatar-initials { 849 - font-size: var(--font-smallest); 850 - font-weight: var(--font-semibold); 851 - color: var(--text-muted); 852 - } 853 - 854 - .atmark-avatar-placeholder { 855 - display: flex; 856 - align-items: center; 857 - justify-content: center; 858 - width: 24px; 859 - height: 24px; 860 - background: var(--background-secondary); 861 - border: 1px solid var(--background-modifier-border); 862 - border-radius: 50%; 863 - color: var(--text-faint); 864 - font-size: var(--font-smallest); 865 - } 866 - 867 - .atmark-profile-info { 868 - display: flex; 869 - flex-direction: column; 870 - align-items: flex-end; 871 - gap: 1px; 872 - } 873 - 874 - .atmark-profile-name { 875 - font-size: var(--font-ui-small); 876 - font-weight: var(--font-medium); 877 - color: var(--text-muted); 878 - line-height: 1.2; 879 - } 880 - 881 - .atmark-profile-handle { 882 - font-size: var(--font-smallest); 883 - color: var(--text-faint); 884 - line-height: 1.2; 885 - } 886 - 887 - /* Generic Card Detail Modal (used for all sources) */ 888 - .atmark-detail-modal { 889 - padding: 20px; 890 - max-width: 600px; 891 - } 892 - 893 - .atmark-detail-header { 894 - margin-bottom: 16px; 895 - } 896 - 897 - .atmark-detail-footer { 898 - margin-top: 20px; 899 - padding-top: 16px; 900 - border-top: 1px solid var(--background-modifier-border); 901 - } 902 - 903 - .atmark-detail-date { 904 - font-size: var(--font-small); 905 - color: var(--text-faint); 906 - } 907 - 908 - /* Semble-specific Add Note Form */ 909 - .atmark-semble-detail-add-note { 910 - margin-top: 20px; 911 - padding-top: 20px; 912 - border-top: 1px solid var(--background-modifier-border); 913 - } 914 - 915 - .atmark-semble-add-note-form { 916 - display: flex; 917 - flex-direction: column; 918 - gap: 12px; 919 - } 920 - 921 - .atmark-semble-note-input { 922 - min-height: 80px; 923 - resize: vertical; 924 - } 925 - 926 - .atmark-semble-note-delete-btn { 927 - display: flex; 928 - align-items: center; 929 - justify-content: center; 930 - width: 28px; 931 - height: 28px; 932 - padding: 0; 933 - flex-shrink: 0; 934 - background: transparent; 935 - border: none; 936 - border-radius: var(--radius-s); 937 - cursor: pointer; 938 - color: var(--text-faint); 939 - opacity: 0.6; 940 - transition: all 0.15s ease; 941 - } 942 - 943 - .atmark-semble-note-delete-btn:hover { 944 - background: color-mix(in srgb, var(--color-red) 15%, transparent); 945 - color: var(--color-red); 946 - opacity: 1; 947 - } 948 - 949 - .atmark-semble-note-delete-btn svg { 950 - width: 14px; 951 - height: 14px; 952 - } 953 - 954 - /* Responsive styles */ 955 - @media (max-width: 600px) { 956 - .atmark-view { 957 - padding: 12px; 958 - } 959 - 960 - .atmark-header { 961 - margin-bottom: 16px; 962 - padding-bottom: 12px; 963 - } 964 - 965 - .atmark-profile-icon { 966 - display: none; 967 - } 968 - 969 - .atmark-source-option { 970 - padding: 8px 16px; 971 - font-size: var(--font-ui-small); 972 - } 973 - 974 - .atmark-source-text { 975 - font-size: var(--font-ui-small); 976 - } 977 - 978 - .atmark-source-selector { 979 - justify-content: center; 980 - } 981 - 982 - .atmark-grid { 983 - grid-template-columns: 1fr; 984 - gap: 12px; 985 - } 986 - 987 - .atmark-filter-section { 988 - margin-bottom: 12px; 989 - } 990 - } 991 - 992 - /* Hide profile in narrow sidebar widths (but not mobile) */ 993 - @media (max-width: 400px) { 994 - .atmark-profile-icon { 995 - display: none; 996 - } 997 - } 998 - 999 - .is-mobile .atmark-profile-icon { 1000 - display: none; 1001 - } 1002 - 1003 - .is-mobile .atmark-source-option { 1004 - padding: 8px 16px; 1005 - font-size: var(--font-ui-small); 1006 - } 1007 - 1008 - .is-mobile .atmark-source-text { 1009 - font-size: var(--font-ui-small); 1010 - } 1011 - 1012 - .is-mobile .atmark-source-selector { 1013 - justify-content: center; 1014 - }
-30
tsconfig.json
··· 1 - { 2 - "compilerOptions": { 3 - "baseUrl": "src", 4 - "inlineSourceMap": true, 5 - "inlineSources": true, 6 - "module": "ESNext", 7 - "target": "ES6", 8 - "allowJs": true, 9 - "noImplicitAny": true, 10 - "noImplicitThis": true, 11 - "noImplicitReturns": true, 12 - "moduleResolution": "bundler", 13 - "importHelpers": true, 14 - "noUncheckedIndexedAccess": true, 15 - "isolatedModules": true, 16 - "strictNullChecks": true, 17 - "strictBindCallApply": true, 18 - "allowSyntheticDefaultImports": true, 19 - "useUnknownInCatchVariables": true, 20 - "lib": [ 21 - "DOM", 22 - "ES5", 23 - "ES6", 24 - "ES7" 25 - ] 26 - }, 27 - "include": [ 28 - "src/**/*.ts" 29 - ] 30 - }
-17
version-bump.mjs
··· 1 - import { readFileSync, writeFileSync } from "fs"; 2 - 3 - const targetVersion = process.env.npm_package_version; 4 - 5 - // read minAppVersion from manifest.json and bump version to target version 6 - const manifest = JSON.parse(readFileSync("manifest.json", "utf8")); 7 - const { minAppVersion } = manifest; 8 - manifest.version = targetVersion; 9 - writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t")); 10 - 11 - // update versions.json with target version and minAppVersion from manifest.json 12 - // but only if the target version is not already in versions.json 13 - const versions = JSON.parse(readFileSync('versions.json', 'utf8')); 14 - if (!Object.values(versions).includes(minAppVersion)) { 15 - versions[targetVersion] = minAppVersion; 16 - writeFileSync('versions.json', JSON.stringify(versions, null, '\t')); 17 - }
-3
versions.json
··· 1 - { 2 - "1.0.0": "0.15.0" 3 - }