AT protocol bookmarking platforms in obsidian

Compare changes

Choose any two refs to compare.

+2 -12088
-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
-5
LICENSE
··· 1 - Copyright (C) 2020-2025 by Dynalist Inc. 2 - 3 - Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. 4 - 5 - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+2 -32
README.md
··· 1 - # ATmark 1 + # ATmark (archived) 2 2 3 3 Obsidian plugin for AT Protocol bookmarking platforms. 4 4 5 - ## Supported platforms 6 - 7 - - **Semble** (`network.cosmik.*`) - Collections and cards 8 - - **Bookmarks** (`community.lexicon.bookmarks.*`) - Community bookmarks lexicon with tag filtering (supports kipclip tags) 9 - - **margin.at** (`at.margin.*`) - Bookmarks with collections and tags support 10 - 11 - ## Installation 12 - 13 - Install via [BRAT](https://github.com/TfTHacker/obsidian42-brat): 14 - 15 - 1. Install the BRAT plugin from Community Plugins 16 - 2. Open BRAT settings 17 - 3. Click "Add Beta plugin" 18 - 4. Enter the GitHub URL: `https://github.com/treethought/obsidian-atmark` 19 - 5. Enable the plugin in Community Plugins 20 - 21 - ## Getting Started 22 - 23 - ### Authentication 24 - 25 - 1. Open Settings > ATmark 26 - 2. Enter your AT Protocol handle or DID 27 - 3. Create an app password in your AT Protocol client (Bluesky: Settings > Privacy and security > App passwords) 28 - 4. Enter the app password in the plugin settings 29 - 5. Save settings 30 - 31 - The plugin will automatically connect using your credentials. 32 - 33 - ### Opening the View 34 - 35 - Open the command palette (Ctrl/Cmd + P) and search for "ATmark: Open view". The view will show your bookmarks from all supported platforms. 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.3", 5 - "minAppVersion": "0.15.0", 6 - "description": "Obsidian plugin for AT Protocol bookmark platforms", 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.3", 4 - "description": "Obsidian plugin for AT Protocol bookmark platforms", 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": "0-BSD", 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 - }
-18
src/auth.ts
··· 1 - import { Client, CredentialManager, simpleFetchHandler } from "@atcute/client"; 2 - 3 - const DEFAULT_PDS = "https://bsky.social"; 4 - 5 - export interface Credentials { 6 - identifier: string; 7 - password: string; 8 - } 9 - 10 - export async function createAuthenticatedClient(creds: Credentials): Promise<Client> { 11 - const manager = new CredentialManager({ service: DEFAULT_PDS }); 12 - await manager.login(creds); 13 - return new Client({ handler: manager }); 14 - } 15 - 16 - export function createPublicClient(): Client { 17 - return new Client({ handler: simpleFetchHandler({ service: DEFAULT_PDS }) }); 18 - }
-147
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("semble-detail-modal"); 23 - 24 - // Header with source badge 25 - const header = contentEl.createEl("div", { cls: "semble-detail-header" }); 26 - const source = this.item.getSource(); 27 - header.createEl("span", { 28 - text: source, 29 - cls: `semble-badge semble-badge-source semble-badge-${source}`, 30 - }); 31 - 32 - // Render item detail content 33 - this.item.renderDetail(contentEl); 34 - 35 - // Render notes with delete buttons (semble-specific) 36 - if (this.item.canAddNotes() && this.item.getAttachedNotes) { 37 - this.renderNotesSection(contentEl); 38 - } 39 - 40 - // Add note form (only for items that support it) 41 - if (this.item.canAddNotes()) { 42 - this.renderAddNoteForm(contentEl); 43 - } 44 - 45 - // Footer with date 46 - const footer = contentEl.createEl("div", { cls: "semble-detail-footer" }); 47 - footer.createEl("span", { 48 - text: `Created ${new Date(this.item.getCreatedAt()).toLocaleDateString()}`, 49 - cls: "semble-detail-date", 50 - }); 51 - } 52 - 53 - private renderNotesSection(contentEl: HTMLElement) { 54 - const notes = this.item.getAttachedNotes?.(); 55 - if (!notes || notes.length === 0) return; 56 - 57 - const notesSection = contentEl.createEl("div", { cls: "semble-detail-notes-section" }); 58 - notesSection.createEl("h3", { text: "Notes", cls: "atmark-detail-section-title" }); 59 - 60 - for (const note of notes) { 61 - const noteEl = notesSection.createEl("div", { cls: "semble-detail-note" }); 62 - 63 - const noteContent = noteEl.createEl("div", { cls: "semble-detail-note-content" }); 64 - const noteIcon = noteContent.createEl("span", { cls: "semble-detail-note-icon" }); 65 - setIcon(noteIcon, "message-square"); 66 - noteContent.createEl("p", { text: note.text, cls: "semble-detail-note-text" }); 67 - 68 - // Delete button 69 - const deleteBtn = noteEl.createEl("button", { cls: "semble-note-delete-btn" }); 70 - setIcon(deleteBtn, "trash-2"); 71 - deleteBtn.addEventListener("click", () => { 72 - void this.handleDeleteNote(note.uri); 73 - }); 74 - } 75 - } 76 - 77 - private renderAddNoteForm(contentEl: HTMLElement) { 78 - const formSection = contentEl.createEl("div", { cls: "semble-detail-add-note" }); 79 - formSection.createEl("h3", { text: "Add a note", cls: "atmark-detail-section-title" }); 80 - 81 - const form = formSection.createEl("div", { cls: "semble-add-note-form" }); 82 - 83 - this.noteInput = form.createEl("textarea", { 84 - cls: "atmark-textarea semble-note-input", 85 - attr: { placeholder: "Write a note about this item..." }, 86 - }); 87 - 88 - const addBtn = form.createEl("button", { text: "Add note", cls: "atmark-btn atmark-btn-primary" }); 89 - addBtn.addEventListener("click", () => { void this.handleAddNote(); }); 90 - } 91 - 92 - private async handleAddNote() { 93 - if (!this.plugin.client || !this.noteInput) return; 94 - 95 - const text = this.noteInput.value.trim(); 96 - if (!text) { 97 - new Notice("Please enter a note"); 98 - return; 99 - } 100 - 101 - try { 102 - await createNoteCard( 103 - this.plugin.client, 104 - this.plugin.settings.identifier, 105 - text, 106 - { uri: this.item.getUri(), cid: this.item.getCid() } 107 - ); 108 - 109 - new Notice("Note added"); 110 - this.close(); 111 - this.onSuccess?.(); 112 - } catch (err) { 113 - const message = err instanceof Error ? err.message : String(err); 114 - new Notice(`Failed to add note: ${message}`); 115 - } 116 - } 117 - 118 - private async handleDeleteNote(noteUri: string) { 119 - if (!this.plugin.client) return; 120 - 121 - const rkey = noteUri.split("/").pop(); 122 - if (!rkey) { 123 - new Notice("Invalid note uri"); 124 - return; 125 - } 126 - 127 - try { 128 - await deleteRecord( 129 - this.plugin.client, 130 - this.plugin.settings.identifier, 131 - "network.cosmik.card", 132 - rkey 133 - ); 134 - 135 - new Notice("Note deleted"); 136 - this.close(); 137 - this.onSuccess?.(); 138 - } catch (err) { 139 - const message = err instanceof Error ? err.message : String(err); 140 - new Notice(`Failed to delete note: ${message}`); 141 - } 142 - } 143 - 144 - onClose() { 145 - this.contentEl.empty(); 146 - } 147 - }
-107
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("semble-collection-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: "semble-form" }); 28 - 29 - // Name field 30 - const nameGroup = form.createEl("div", { cls: "semble-form-group" }); 31 - nameGroup.createEl("label", { text: "Name", attr: { for: "collection-name" } }); 32 - const nameInput = nameGroup.createEl("input", { 33 - type: "text", 34 - cls: "semble-input", 35 - attr: { id: "collection-name", placeholder: "Collection name", required: "true" }, 36 - }); 37 - 38 - // Description field 39 - const descGroup = form.createEl("div", { cls: "semble-form-group" }); 40 - descGroup.createEl("label", { text: "Description", attr: { for: "collection-desc" } }); 41 - const descInput = descGroup.createEl("textarea", { 42 - cls: "semble-textarea", 43 - attr: { id: "collection-desc", placeholder: "Optional description", rows: "3" }, 44 - }); 45 - 46 - // Action buttons 47 - const actions = form.createEl("div", { cls: "semble-modal-actions" }); 48 - 49 - const cancelBtn = actions.createEl("button", { 50 - text: "Cancel", 51 - cls: "semble-btn semble-btn-secondary", 52 - type: "button", 53 - }); 54 - cancelBtn.addEventListener("click", () => this.close()); 55 - 56 - const createBtn = actions.createEl("button", { 57 - text: "Create", 58 - cls: "semble-btn semble-btn-primary", 59 - type: "submit", 60 - }); 61 - 62 - form.addEventListener("submit", (e) => { 63 - e.preventDefault(); 64 - void this.handleSubmit(nameInput, descInput, createBtn); 65 - }); 66 - 67 - // Focus name input 68 - nameInput.focus(); 69 - } 70 - 71 - private async handleSubmit( 72 - nameInput: HTMLInputElement, 73 - descInput: HTMLTextAreaElement, 74 - createBtn: HTMLButtonElement 75 - ) { 76 - const name = nameInput.value.trim(); 77 - if (!name) { 78 - new Notice("Please enter a collection name"); 79 - return; 80 - } 81 - 82 - createBtn.disabled = true; 83 - createBtn.textContent = "Creating..."; 84 - 85 - try { 86 - await createCollection( 87 - this.plugin.client!, 88 - this.plugin.settings.identifier, 89 - name, 90 - descInput.value.trim() 91 - ); 92 - 93 - new Notice(`Created collection "${name}"`); 94 - this.close(); 95 - this.onSuccess?.(); 96 - } catch (err) { 97 - const message = err instanceof Error ? err.message : String(err); 98 - new Notice(`Failed to create collection: ${message}`); 99 - createBtn.disabled = false; 100 - createBtn.textContent = "Create"; 101 - } 102 - } 103 - 104 - onClose() { 105 - this.contentEl.empty(); 106 - } 107 - }
-118
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 - // Name field 30 - const nameGroup = form.createEl("div", { cls: "atmark-form-group" }); 31 - nameGroup.createEl("label", { text: "Name", attr: { for: "collection-name" } }); 32 - const nameInput = nameGroup.createEl("input", { 33 - type: "text", 34 - cls: "atmark-input", 35 - attr: { id: "collection-name", placeholder: "Collection name", required: "true" }, 36 - }); 37 - 38 - // Icon field 39 - const iconGroup = form.createEl("div", { cls: "atmark-form-group" }); 40 - iconGroup.createEl("label", { text: "Icon (optional)", attr: { for: "collection-icon" } }); 41 - const iconInput = iconGroup.createEl("input", { 42 - type: "text", 43 - cls: "atmark-input", 44 - attr: { id: "collection-icon" }, 45 - }); 46 - 47 - // Description field 48 - const descGroup = form.createEl("div", { cls: "atmark-form-group" }); 49 - descGroup.createEl("label", { text: "Description", attr: { for: "collection-desc" } }); 50 - const descInput = descGroup.createEl("textarea", { 51 - cls: "atmark-textarea", 52 - attr: { id: "collection-desc", placeholder: "Optional description", rows: "3" }, 53 - }); 54 - 55 - // Action buttons 56 - const actions = form.createEl("div", { cls: "atmark-modal-actions" }); 57 - 58 - const cancelBtn = actions.createEl("button", { 59 - text: "Cancel", 60 - cls: "atmark-btn atmark-btn-secondary", 61 - type: "button", 62 - }); 63 - cancelBtn.addEventListener("click", () => this.close()); 64 - 65 - const createBtn = actions.createEl("button", { 66 - text: "Create", 67 - cls: "atmark-btn atmark-btn-primary", 68 - type: "submit", 69 - }); 70 - 71 - form.addEventListener("submit", (e) => { 72 - e.preventDefault(); 73 - void this.handleSubmit(nameInput, iconInput, descInput, createBtn); 74 - }); 75 - 76 - // Focus name input 77 - nameInput.focus(); 78 - } 79 - 80 - private async handleSubmit( 81 - nameInput: HTMLInputElement, 82 - iconInput: HTMLInputElement, 83 - descInput: HTMLTextAreaElement, 84 - createBtn: HTMLButtonElement 85 - ) { 86 - const name = nameInput.value.trim(); 87 - if (!name) { 88 - new Notice("Please enter a collection name"); 89 - return; 90 - } 91 - 92 - createBtn.disabled = true; 93 - createBtn.textContent = "Creating..."; 94 - 95 - try { 96 - await createMarginCollection( 97 - this.plugin.client!, 98 - this.plugin.settings.identifier, 99 - name, 100 - descInput.value.trim() || undefined, 101 - iconInput.value.trim() || undefined 102 - ); 103 - 104 - new Notice(`Created collection "${name}"`); 105 - this.close(); 106 - this.onSuccess?.(); 107 - } catch (err) { 108 - const message = err instanceof Error ? err.message : String(err); 109 - new Notice(`Failed to create collection: ${message}`); 110 - createBtn.disabled = false; 111 - createBtn.textContent = "Create"; 112 - } 113 - } 114 - 115 - onClose() { 116 - this.contentEl.empty(); 117 - } 118 - }
-97
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 - // Tag value field 30 - const tagGroup = form.createEl("div", { cls: "atmark-form-group" }); 31 - tagGroup.createEl("label", { text: "Tag", attr: { for: "tag-value" } }); 32 - const tagInput = tagGroup.createEl("input", { 33 - type: "text", 34 - cls: "atmark-input", 35 - attr: { id: "tag-value", placeholder: "Tag name", required: "true" }, 36 - }); 37 - 38 - // Action buttons 39 - const actions = form.createEl("div", { cls: "atmark-modal-actions" }); 40 - 41 - const cancelBtn = actions.createEl("button", { 42 - text: "Cancel", 43 - cls: "atmark-btn atmark-btn-secondary", 44 - type: "button", 45 - }); 46 - cancelBtn.addEventListener("click", () => this.close()); 47 - 48 - const createBtn = actions.createEl("button", { 49 - text: "Create", 50 - cls: "atmark-btn atmark-btn-primary", 51 - type: "submit", 52 - }); 53 - 54 - form.addEventListener("submit", (e) => { 55 - e.preventDefault(); 56 - void this.handleSubmit(tagInput, createBtn); 57 - }); 58 - 59 - // Focus tag input 60 - tagInput.focus(); 61 - } 62 - 63 - private async handleSubmit( 64 - tagInput: HTMLInputElement, 65 - createBtn: HTMLButtonElement 66 - ) { 67 - const value = tagInput.value.trim(); 68 - if (!value) { 69 - new Notice("Please enter a tag name"); 70 - return; 71 - } 72 - 73 - createBtn.disabled = true; 74 - createBtn.textContent = "Creating..."; 75 - 76 - try { 77 - await createTag( 78 - this.plugin.client!, 79 - this.plugin.settings.identifier, 80 - value 81 - ); 82 - 83 - new Notice(`Created tag "${value}"`); 84 - this.close(); 85 - this.onSuccess?.(); 86 - } catch (err) { 87 - const message = err instanceof Error ? err.message : String(err); 88 - new Notice(`Failed to create tag: ${message}`); 89 - createBtn.disabled = false; 90 - createBtn.textContent = "Create"; 91 - } 92 - } 93 - 94 - onClose() { 95 - this.contentEl.empty(); 96 - } 97 - }
-211
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 } from "../lib"; 6 - 7 - type BookmarkRecord = Record & { value: Bookmark }; 8 - 9 - export class EditBookmarkModal extends Modal { 10 - plugin: ATmarkPlugin; 11 - record: BookmarkRecord; 12 - onSuccess?: () => void; 13 - tagInputs: HTMLInputElement[] = []; 14 - 15 - constructor(plugin: ATmarkPlugin, record: BookmarkRecord, onSuccess?: () => void) { 16 - super(plugin.app); 17 - this.plugin = plugin; 18 - this.record = record; 19 - this.onSuccess = onSuccess; 20 - } 21 - 22 - onOpen() { 23 - const { contentEl } = this; 24 - contentEl.empty(); 25 - contentEl.addClass("atmark-modal"); 26 - 27 - contentEl.createEl("h2", { text: "Edit bookmark tags" }); 28 - 29 - if (!this.plugin.client) { 30 - contentEl.createEl("p", { text: "Not connected." }); 31 - return; 32 - } 33 - 34 - const existingTags = this.record.value.tags || []; 35 - 36 - const form = contentEl.createEl("div", { cls: "atmark-form" }); 37 - 38 - // Tags section 39 - const tagsGroup = form.createEl("div", { cls: "atmark-form-group" }); 40 - tagsGroup.createEl("label", { text: "Tags" }); 41 - 42 - const tagsContainer = tagsGroup.createEl("div", { cls: "atmark-tags-container" }); 43 - 44 - // Render existing tags 45 - for (const tag of existingTags) { 46 - this.addTagInput(tagsContainer, tag); 47 - } 48 - 49 - // Add empty input for new tag 50 - this.addTagInput(tagsContainer, ""); 51 - 52 - // Add tag button 53 - const addTagBtn = tagsGroup.createEl("button", { 54 - text: "Add tag", 55 - cls: "atmark-btn atmark-btn-secondary" 56 - }); 57 - addTagBtn.addEventListener("click", (e) => { 58 - e.preventDefault(); 59 - this.addTagInput(tagsContainer, ""); 60 - }); 61 - 62 - // Action buttons 63 - const actions = contentEl.createEl("div", { cls: "atmark-modal-actions" }); 64 - 65 - const deleteBtn = actions.createEl("button", { 66 - text: "Delete", 67 - cls: "atmark-btn atmark-btn-danger" 68 - }); 69 - deleteBtn.addEventListener("click", () => { this.confirmDelete(contentEl); }); 70 - 71 - actions.createEl("div", { cls: "atmark-spacer" }); 72 - 73 - const cancelBtn = actions.createEl("button", { 74 - text: "Cancel", 75 - cls: "atmark-btn atmark-btn-secondary" 76 - }); 77 - cancelBtn.addEventListener("click", () => { this.close(); }); 78 - 79 - const saveBtn = actions.createEl("button", { 80 - text: "Save", 81 - cls: "atmark-btn atmark-btn-primary" 82 - }); 83 - saveBtn.addEventListener("click", () => { void this.saveChanges(); }); 84 - } 85 - 86 - private addTagInput(container: HTMLElement, value: string) { 87 - const tagRow = container.createEl("div", { cls: "atmark-tag-row" }); 88 - 89 - const input = tagRow.createEl("input", { 90 - type: "text", 91 - cls: "atmark-input", 92 - value, 93 - attr: { placeholder: "Enter tag..." } 94 - }); 95 - this.tagInputs.push(input); 96 - 97 - const removeBtn = tagRow.createEl("button", { 98 - text: "ร—", 99 - cls: "atmark-btn atmark-btn-secondary atmark-tag-remove-btn" 100 - }); 101 - removeBtn.addEventListener("click", (e) => { 102 - e.preventDefault(); 103 - tagRow.remove(); 104 - this.tagInputs = this.tagInputs.filter(i => i !== input); 105 - }); 106 - } 107 - 108 - private confirmDelete(contentEl: HTMLElement) { 109 - contentEl.empty(); 110 - contentEl.createEl("h2", { text: "Delete bookmark" }); 111 - contentEl.createEl("p", { text: "Delete this bookmark?", cls: "atmark-warning-text" }); 112 - 113 - const actions = contentEl.createEl("div", { cls: "atmark-modal-actions" }); 114 - 115 - const cancelBtn = actions.createEl("button", { 116 - text: "Cancel", 117 - cls: "atmark-btn atmark-btn-secondary" 118 - }); 119 - cancelBtn.addEventListener("click", () => { 120 - void this.onOpen(); 121 - }); 122 - 123 - const confirmBtn = actions.createEl("button", { 124 - text: "Delete", 125 - cls: "atmark-btn atmark-btn-danger" 126 - }); 127 - confirmBtn.addEventListener("click", () => { void this.deleteBookmark(); }); 128 - } 129 - 130 - private async deleteBookmark() { 131 - if (!this.plugin.client) return; 132 - 133 - const { contentEl } = this; 134 - contentEl.empty(); 135 - contentEl.createEl("p", { text: "Deleting bookmark..." }); 136 - 137 - try { 138 - const rkey = this.record.uri.split("/").pop(); 139 - if (!rkey) { 140 - contentEl.empty(); 141 - contentEl.createEl("p", { text: "Invalid bookmark uri.", cls: "atmark-error" }); 142 - return; 143 - } 144 - 145 - await deleteRecord( 146 - this.plugin.client, 147 - this.plugin.settings.identifier, 148 - "community.lexicon.bookmarks.bookmark", 149 - rkey 150 - ); 151 - 152 - new Notice("Bookmark deleted"); 153 - this.close(); 154 - this.onSuccess?.(); 155 - } catch (err) { 156 - contentEl.empty(); 157 - const message = err instanceof Error ? err.message : String(err); 158 - contentEl.createEl("p", { text: `Failed to delete: ${message}`, cls: "atmark-error" }); 159 - } 160 - } 161 - 162 - private async saveChanges() { 163 - if (!this.plugin.client) return; 164 - 165 - const { contentEl } = this; 166 - contentEl.empty(); 167 - contentEl.createEl("p", { text: "Saving changes..." }); 168 - 169 - try { 170 - // Get non-empty unique tags 171 - const tags = [...new Set( 172 - this.tagInputs 173 - .map(input => input.value.trim()) 174 - .filter(tag => tag.length > 0) 175 - )]; 176 - 177 - const rkey = this.record.uri.split("/").pop(); 178 - if (!rkey) { 179 - contentEl.empty(); 180 - contentEl.createEl("p", { text: "Invalid bookmark uri.", cls: "atmark-error" }); 181 - return; 182 - } 183 - 184 - // Update the record with new tags 185 - const updatedRecord: Bookmark = { 186 - ...this.record.value, 187 - tags, 188 - }; 189 - 190 - await putRecord( 191 - this.plugin.client, 192 - this.plugin.settings.identifier, 193 - "community.lexicon.bookmarks.bookmark", 194 - rkey, 195 - updatedRecord 196 - ); 197 - 198 - new Notice("Tags updated"); 199 - this.close(); 200 - this.onSuccess?.(); 201 - } catch (err) { 202 - contentEl.empty(); 203 - const message = err instanceof Error ? err.message : String(err); 204 - contentEl.createEl("p", { text: `Failed to save: ${message}`, cls: "atmark-error" }); 205 - } 206 - } 207 - 208 - onClose() { 209 - this.contentEl.empty(); 210 - } 211 - }
-266
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("semble-collection-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 - // Fetch collections and existing links in parallel 56 - const [collectionsResp, linksResp] = await Promise.all([ 57 - getCollections(this.plugin.client, this.plugin.settings.identifier), 58 - getCollectionLinks(this.plugin.client, this.plugin.settings.identifier), 59 - ]); 60 - 61 - loading.remove(); 62 - 63 - if (!collectionsResp.ok) { 64 - contentEl.createEl("p", { text: "Failed to load collections.", cls: "semble-error" }); 65 - return; 66 - } 67 - 68 - const collections = collectionsResp.data.records as unknown as CollectionRecord[]; 69 - const links = (linksResp.ok ? linksResp.data.records : []) as unknown as CollectionLinkRecord[]; 70 - 71 - if (collections.length === 0) { 72 - contentEl.createEl("p", { text: "No collections found. Create a collection first." }); 73 - return; 74 - } 75 - 76 - // Find which collections this card is already in 77 - const cardLinks = links.filter(link => link.value.card.uri === this.cardUri); 78 - const linkedCollectionUris = new Map<string, string>(); 79 - for (const link of cardLinks) { 80 - linkedCollectionUris.set(link.value.collection.uri, link.uri); 81 - } 82 - 83 - // Build collection states 84 - this.collectionStates = collections.map(collection => ({ 85 - collection, 86 - isSelected: linkedCollectionUris.has(collection.uri), 87 - wasSelected: linkedCollectionUris.has(collection.uri), 88 - linkUri: linkedCollectionUris.get(collection.uri), 89 - })); 90 - 91 - this.renderCollectionList(contentEl); 92 - } catch (err) { 93 - loading.remove(); 94 - const message = err instanceof Error ? err.message : String(err); 95 - contentEl.createEl("p", { text: `Error: ${message}`, cls: "semble-error" }); 96 - } 97 - } 98 - 99 - private renderCollectionList(contentEl: HTMLElement) { 100 - const list = contentEl.createEl("div", { cls: "semble-collection-list" }); 101 - 102 - for (const state of this.collectionStates) { 103 - const item = list.createEl("label", { cls: "semble-collection-item" }); 104 - 105 - const checkbox = item.createEl("input", { type: "checkbox", cls: "semble-collection-checkbox" }); 106 - checkbox.checked = state.isSelected; 107 - checkbox.addEventListener("change", () => { 108 - state.isSelected = checkbox.checked; 109 - this.updateSaveButton(); 110 - }); 111 - 112 - const info = item.createEl("div", { cls: "semble-collection-item-info" }); 113 - info.createEl("span", { text: state.collection.value.name, cls: "semble-collection-item-name" }); 114 - if (state.collection.value.description) { 115 - info.createEl("span", { text: state.collection.value.description, cls: "semble-collection-item-desc" }); 116 - } 117 - } 118 - 119 - // Action buttons 120 - const actions = contentEl.createEl("div", { cls: "semble-modal-actions" }); 121 - 122 - const deleteBtn = actions.createEl("button", { text: "Delete", cls: "semble-btn semble-btn-danger" }); 123 - deleteBtn.addEventListener("click", () => { this.confirmDelete(contentEl); }); 124 - 125 - actions.createEl("div", { cls: "semble-spacer" }); 126 - 127 - const cancelBtn = actions.createEl("button", { text: "Cancel", cls: "semble-btn semble-btn-secondary" }); 128 - cancelBtn.addEventListener("click", () => { this.close(); }); 129 - 130 - const saveBtn = actions.createEl("button", { text: "Save", cls: "semble-btn semble-btn-primary" }); 131 - saveBtn.id = "semble-save-btn"; 132 - saveBtn.disabled = true; 133 - saveBtn.addEventListener("click", () => { void this.saveChanges(); }); 134 - } 135 - 136 - private confirmDelete(contentEl: HTMLElement) { 137 - contentEl.empty(); 138 - contentEl.createEl("h2", { text: "Delete card" }); 139 - contentEl.createEl("p", { text: "Delete this card?", cls: "semble-warning-text" }); 140 - 141 - const actions = contentEl.createEl("div", { cls: "semble-modal-actions" }); 142 - 143 - const cancelBtn = actions.createEl("button", { text: "Cancel", cls: "semble-btn semble-btn-secondary" }); 144 - cancelBtn.addEventListener("click", () => { 145 - // Re-render the modal 146 - void this.onOpen(); 147 - }); 148 - 149 - const confirmBtn = actions.createEl("button", { text: "Delete", cls: "semble-btn semble-btn-danger" }); 150 - confirmBtn.addEventListener("click", () => { void this.deleteCard(); }); 151 - } 152 - 153 - private async deleteCard() { 154 - if (!this.plugin.client) return; 155 - 156 - const { contentEl } = this; 157 - contentEl.empty(); 158 - contentEl.createEl("p", { text: "Deleting card..." }); 159 - 160 - try { 161 - const rkey = this.cardUri.split("/").pop(); 162 - if (!rkey) { 163 - contentEl.empty(); 164 - contentEl.createEl("p", { text: "Invalid card uri.", cls: "semble-error" }); 165 - return; 166 - } 167 - 168 - await deleteRecord( 169 - this.plugin.client, 170 - this.plugin.settings.identifier, 171 - "network.cosmik.card", 172 - rkey 173 - ); 174 - 175 - new Notice("Card deleted"); 176 - this.close(); 177 - this.onSuccess?.(); 178 - } catch (err) { 179 - contentEl.empty(); 180 - const message = err instanceof Error ? err.message : String(err); 181 - contentEl.createEl("p", { text: `Failed to delete: ${message}`, cls: "semble-error" }); 182 - } 183 - } 184 - 185 - private updateSaveButton() { 186 - const saveBtn = document.getElementById("semble-save-btn") as HTMLButtonElement | null; 187 - if (!saveBtn) return; 188 - 189 - // Check if any changes were made 190 - const hasChanges = this.collectionStates.some(s => s.isSelected !== s.wasSelected); 191 - saveBtn.disabled = !hasChanges; 192 - } 193 - 194 - private async saveChanges() { 195 - if (!this.plugin.client) return; 196 - 197 - const { contentEl } = this; 198 - contentEl.empty(); 199 - contentEl.createEl("p", { text: "Saving changes..." }); 200 - 201 - try { 202 - const toAdd = this.collectionStates.filter(s => s.isSelected && !s.wasSelected); 203 - const toRemove = this.collectionStates.filter(s => !s.isSelected && s.wasSelected); 204 - 205 - // Process removals 206 - for (const state of toRemove) { 207 - if (state.linkUri) { 208 - const rkey = state.linkUri.split("/").pop(); 209 - if (rkey) { 210 - await deleteRecord( 211 - this.plugin.client, 212 - this.plugin.settings.identifier, 213 - "network.cosmik.collectionLink", 214 - rkey 215 - ); 216 - } 217 - } 218 - } 219 - 220 - // Process additions 221 - for (const state of toAdd) { 222 - const collectionRkey = state.collection.uri.split("/").pop(); 223 - if (!collectionRkey) continue; 224 - 225 - const collectionResp = await getRecord( 226 - this.plugin.client, 227 - this.plugin.settings.identifier, 228 - "network.cosmik.collection", 229 - collectionRkey 230 - ); 231 - 232 - if (!collectionResp.ok || !collectionResp.data.cid) continue; 233 - 234 - await createCollectionLink( 235 - this.plugin.client, 236 - this.plugin.settings.identifier, 237 - this.cardUri, 238 - this.cardCid, 239 - state.collection.uri, 240 - String(collectionResp.data.cid) 241 - ); 242 - } 243 - 244 - const addedCount = toAdd.length; 245 - const removedCount = toRemove.length; 246 - const messages: string[] = []; 247 - if (addedCount > 0) messages.push(`Added to ${addedCount} collection${addedCount > 1 ? "s" : ""}`); 248 - if (removedCount > 0) messages.push(`Removed from ${removedCount} collection${removedCount > 1 ? "s" : ""}`); 249 - 250 - if (messages.length > 0) { 251 - new Notice(messages.join(". ")); 252 - } 253 - 254 - this.close(); 255 - this.onSuccess?.(); 256 - } catch (err) { 257 - contentEl.empty(); 258 - const message = err instanceof Error ? err.message : String(err); 259 - contentEl.createEl("p", { text: `Failed to save: ${message}`, cls: "semble-error" }); 260 - } 261 - } 262 - 263 - onClose() { 264 - this.contentEl.empty(); 265 - } 266 - }
-211
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 ATmarkPlugin from "../main"; 5 - import { putRecord, deleteRecord } from "../lib"; 6 - 7 - type MarginBookmarkRecord = Record & { value: MarginBookmark }; 8 - 9 - export class EditMarginBookmarkModal extends Modal { 10 - plugin: ATmarkPlugin; 11 - record: MarginBookmarkRecord; 12 - onSuccess?: () => void; 13 - tagInputs: HTMLInputElement[] = []; 14 - 15 - constructor(plugin: ATmarkPlugin, record: MarginBookmarkRecord, onSuccess?: () => void) { 16 - super(plugin.app); 17 - this.plugin = plugin; 18 - this.record = record; 19 - this.onSuccess = onSuccess; 20 - } 21 - 22 - onOpen() { 23 - const { contentEl } = this; 24 - contentEl.empty(); 25 - contentEl.addClass("atmark-modal"); 26 - 27 - contentEl.createEl("h2", { text: "Edit margin bookmark" }); 28 - 29 - if (!this.plugin.client) { 30 - contentEl.createEl("p", { text: "Not connected." }); 31 - return; 32 - } 33 - 34 - const existingTags = this.record.value.tags || []; 35 - 36 - const form = contentEl.createEl("div", { cls: "atmark-form" }); 37 - 38 - // Tags section 39 - const tagsGroup = form.createEl("div", { cls: "atmark-form-group" }); 40 - tagsGroup.createEl("label", { text: "Tags" }); 41 - 42 - const tagsContainer = tagsGroup.createEl("div", { cls: "atmark-tags-container" }); 43 - 44 - // Render existing tags 45 - for (const tag of existingTags) { 46 - this.addTagInput(tagsContainer, tag); 47 - } 48 - 49 - // Add empty input for new tag 50 - this.addTagInput(tagsContainer, ""); 51 - 52 - // Add tag button 53 - const addTagBtn = tagsGroup.createEl("button", { 54 - text: "Add tag", 55 - cls: "atmark-btn atmark-btn-secondary" 56 - }); 57 - addTagBtn.addEventListener("click", (e) => { 58 - e.preventDefault(); 59 - this.addTagInput(tagsContainer, ""); 60 - }); 61 - 62 - // Action buttons 63 - const actions = contentEl.createEl("div", { cls: "atmark-modal-actions" }); 64 - 65 - const deleteBtn = actions.createEl("button", { 66 - text: "Delete", 67 - cls: "atmark-btn atmark-btn-danger" 68 - }); 69 - deleteBtn.addEventListener("click", () => { this.confirmDelete(contentEl); }); 70 - 71 - actions.createEl("div", { cls: "atmark-spacer" }); 72 - 73 - const cancelBtn = actions.createEl("button", { 74 - text: "Cancel", 75 - cls: "atmark-btn atmark-btn-secondary" 76 - }); 77 - cancelBtn.addEventListener("click", () => { this.close(); }); 78 - 79 - const saveBtn = actions.createEl("button", { 80 - text: "Save", 81 - cls: "atmark-btn atmark-btn-primary" 82 - }); 83 - saveBtn.addEventListener("click", () => { void this.saveChanges(); }); 84 - } 85 - 86 - private addTagInput(container: HTMLElement, value: string) { 87 - const tagRow = container.createEl("div", { cls: "atmark-tag-row" }); 88 - 89 - const input = tagRow.createEl("input", { 90 - type: "text", 91 - cls: "atmark-input", 92 - value, 93 - attr: { placeholder: "Enter tag..." } 94 - }); 95 - this.tagInputs.push(input); 96 - 97 - const removeBtn = tagRow.createEl("button", { 98 - text: "ร—", 99 - cls: "atmark-btn atmark-btn-secondary atmark-tag-remove-btn" 100 - }); 101 - removeBtn.addEventListener("click", (e) => { 102 - e.preventDefault(); 103 - tagRow.remove(); 104 - this.tagInputs = this.tagInputs.filter(i => i !== input); 105 - }); 106 - } 107 - 108 - private confirmDelete(contentEl: HTMLElement) { 109 - contentEl.empty(); 110 - contentEl.createEl("h2", { text: "Delete bookmark" }); 111 - contentEl.createEl("p", { text: "Delete this bookmark?", cls: "atmark-warning-text" }); 112 - 113 - const actions = contentEl.createEl("div", { cls: "atmark-modal-actions" }); 114 - 115 - const cancelBtn = actions.createEl("button", { 116 - text: "Cancel", 117 - cls: "atmark-btn atmark-btn-secondary" 118 - }); 119 - cancelBtn.addEventListener("click", () => { 120 - void this.onOpen(); 121 - }); 122 - 123 - const confirmBtn = actions.createEl("button", { 124 - text: "Delete", 125 - cls: "atmark-btn atmark-btn-danger" 126 - }); 127 - confirmBtn.addEventListener("click", () => { void this.deleteBookmark(); }); 128 - } 129 - 130 - private async deleteBookmark() { 131 - if (!this.plugin.client) return; 132 - 133 - const { contentEl } = this; 134 - contentEl.empty(); 135 - contentEl.createEl("p", { text: "Deleting bookmark..." }); 136 - 137 - try { 138 - const rkey = this.record.uri.split("/").pop(); 139 - if (!rkey) { 140 - contentEl.empty(); 141 - contentEl.createEl("p", { text: "Invalid bookmark uri.", cls: "atmark-error" }); 142 - return; 143 - } 144 - 145 - await deleteRecord( 146 - this.plugin.client, 147 - this.plugin.settings.identifier, 148 - "at.margin.bookmark", 149 - rkey 150 - ); 151 - 152 - new Notice("Bookmark deleted"); 153 - this.close(); 154 - this.onSuccess?.(); 155 - } catch (err) { 156 - contentEl.empty(); 157 - const message = err instanceof Error ? err.message : String(err); 158 - contentEl.createEl("p", { text: `Failed to delete: ${message}`, cls: "atmark-error" }); 159 - } 160 - } 161 - 162 - private async saveChanges() { 163 - if (!this.plugin.client) return; 164 - 165 - const { contentEl } = this; 166 - contentEl.empty(); 167 - contentEl.createEl("p", { text: "Saving changes..." }); 168 - 169 - try { 170 - // Get non-empty unique tags 171 - const tags = [...new Set( 172 - this.tagInputs 173 - .map(input => input.value.trim()) 174 - .filter(tag => tag.length > 0) 175 - )]; 176 - 177 - const rkey = this.record.uri.split("/").pop(); 178 - if (!rkey) { 179 - contentEl.empty(); 180 - contentEl.createEl("p", { text: "Invalid bookmark uri.", cls: "atmark-error" }); 181 - return; 182 - } 183 - 184 - // Update the record with new tags 185 - const updatedRecord: MarginBookmark = { 186 - ...this.record.value, 187 - tags, 188 - }; 189 - 190 - await putRecord( 191 - this.plugin.client, 192 - this.plugin.settings.identifier, 193 - "at.margin.bookmark", 194 - rkey, 195 - updatedRecord 196 - ); 197 - 198 - new Notice("Tags updated"); 199 - this.close(); 200 - this.onSuccess?.(); 201 - } catch (err) { 202 - contentEl.empty(); 203 - const message = err instanceof Error ? err.message : String(err); 204 - contentEl.createEl("p", { text: `Failed to save: ${message}`, cls: "atmark-error" }); 205 - } 206 - } 207 - 208 - onClose() { 209 - this.contentEl.empty(); 210 - } 211 - }
-74
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: "semble-profile-icon" }); 34 - 35 - if (!profile) { 36 - // Fallback when no profile data 37 - const placeholder = wrapper.createEl("div", { cls: "semble-avatar-placeholder" }); 38 - placeholder.createEl("span", { text: "?" }); 39 - return wrapper; 40 - } 41 - 42 - // Avatar button 43 - const avatarBtn = wrapper.createEl("button", { cls: "semble-avatar-btn" }); 44 - 45 - if (profile.avatar) { 46 - const img = avatarBtn.createEl("img", { cls: "semble-avatar-img" }); 47 - img.src = profile.avatar; 48 - img.alt = profile.displayName || profile.handle; 49 - } else { 50 - // Fallback initials 51 - const initials = (profile.displayName || profile.handle) 52 - .split(" ") 53 - .map(w => w[0]) 54 - .slice(0, 2) 55 - .join("") 56 - .toUpperCase(); 57 - avatarBtn.createEl("span", { text: initials, cls: "semble-avatar-initials" }); 58 - } 59 - 60 - // User info (display name and handle) 61 - const info = wrapper.createEl("div", { cls: "semble-profile-info" }); 62 - 63 - if (profile.displayName) { 64 - info.createEl("span", { text: profile.displayName, cls: "semble-profile-name" }); 65 - } 66 - 67 - info.createEl("span", { text: `@${profile.handle}`, cls: "semble-profile-handle" }); 68 - 69 - if (onClick) { 70 - avatarBtn.addEventListener("click", onClick); 71 - } 72 - 73 - return wrapper; 74 - }
-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> {}
-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 - }
-78
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 - }
-21
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 - } from "./lib/margin";
-116
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, createPublicClient } from "./auth"; 5 - import { getProfile } from "./lib"; 6 - import { ATmarkView, VIEW_TYPE_ATMARK } from "views/atmark"; 7 - import type { ProfileData } from "components/profileIcon"; 8 - 9 - export default class ATmarkPlugin extends Plugin { 10 - settings: AtProtoSettings = DEFAULT_SETTINGS; 11 - client: Client | null = null; 12 - profile: ProfileData | null = null; 13 - 14 - async onload() { 15 - await this.loadSettings(); 16 - await this.initClient(); 17 - 18 - this.registerView(VIEW_TYPE_ATMARK, (leaf) => { 19 - return new ATmarkView(leaf, this); 20 - }); 21 - 22 - // eslint-disable-next-line obsidianmd/ui/sentence-case 23 - this.addRibbonIcon("layers", "Open ATmark", () => { 24 - void this.activateView(VIEW_TYPE_ATMARK); 25 - }); 26 - 27 - this.addCommand({ 28 - id: "view", 29 - name: "Open view", 30 - callback: () => { void this.activateView(VIEW_TYPE_ATMARK); }, 31 - }); 32 - 33 - this.addSettingTab(new SettingTab(this.app, this)); 34 - } 35 - 36 - 37 - private async initClient() { 38 - const { identifier, appPassword } = this.settings; 39 - if (identifier && appPassword) { 40 - try { 41 - this.client = await createAuthenticatedClient({ identifier, password: appPassword }); 42 - await this.fetchProfile(); 43 - new Notice("Connected"); 44 - } catch (err) { 45 - const message = err instanceof Error ? err.message : String(err); 46 - new Notice(`Auth failed: ${message}`); 47 - this.client = createPublicClient(); 48 - this.profile = null; 49 - } 50 - } else { 51 - this.client = createPublicClient(); 52 - this.profile = null; 53 - } 54 - } 55 - 56 - private async fetchProfile() { 57 - if (!this.client || !this.settings.identifier) { 58 - this.profile = null; 59 - return; 60 - } 61 - try { 62 - const resp = await getProfile(this.client, this.settings.identifier); 63 - if (resp.ok) { 64 - this.profile = { 65 - did: resp.data.did, 66 - handle: resp.data.handle, 67 - displayName: resp.data.displayName, 68 - avatar: resp.data.avatar, 69 - }; 70 - } else { 71 - this.profile = null; 72 - } 73 - } catch (e) { 74 - console.error("Failed to fetch profile:", e); 75 - this.profile = null; 76 - } 77 - } 78 - 79 - async refreshClient() { 80 - await this.initClient(); 81 - } 82 - 83 - 84 - async activateView(v: string) { 85 - const { workspace } = this.app; 86 - 87 - let leaf: WorkspaceLeaf | null = null; 88 - const leaves = workspace.getLeavesOfType(v); 89 - 90 - if (leaves.length > 0) { 91 - // A leaf with our view already exists, use that 92 - leaf = leaves[0] as WorkspaceLeaf; 93 - void workspace.revealLeaf(leaf); 94 - return; 95 - } 96 - 97 - // Our view could not be found in the workspace, create a new leaf 98 - leaf = workspace.getMostRecentLeaf() 99 - await leaf?.setViewState({ type: v, active: true }); 100 - 101 - // "Reveal" the leaf in case it is in a collapsed sidebar 102 - if (leaf) { 103 - void workspace.revealLeaf(leaf); 104 - } 105 - } 106 - 107 - async loadSettings() { 108 - this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData() as Partial<AtProtoSettings>); 109 - } 110 - 111 - async saveSettings() { 112 - await this.saveData(this.settings); 113 - } 114 - 115 - onunload() { } 116 - }
-57
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 - } 8 - 9 - export const DEFAULT_SETTINGS: AtProtoSettings = { 10 - identifier: "", 11 - appPassword: "", 12 - }; 13 - 14 - export class SettingTab extends PluginSettingTab { 15 - plugin: ATmarkPlugin; 16 - 17 - constructor(app: App, plugin: ATmarkPlugin) { 18 - super(app, plugin); 19 - this.plugin = plugin; 20 - } 21 - 22 - display(): void { 23 - const { containerEl } = this; 24 - containerEl.empty(); 25 - 26 - new Setting(containerEl) 27 - // eslint-disable-next-line obsidianmd/ui/sentence-case 28 - .setName("Handle or DID") 29 - .setDesc("Your handle or did (e.g., user.bsky.social)") 30 - .addText((text) => 31 - text 32 - // eslint-disable-next-line obsidianmd/ui/sentence-case 33 - .setPlaceholder("user.bsky.social") 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 - // eslint-disable-next-line obsidianmd/ui/sentence-case 44 - .setDesc("Create one at Settings โ†’ Privacy and security โ†’ App passwords") 45 - .addText((text) => { 46 - text.inputEl.type = "password"; 47 - text 48 - // eslint-disable-next-line obsidianmd/ui/sentence-case 49 - .setPlaceholder("xxxx-xxxx-xxxx-xxxx") 50 - .setValue(this.plugin.settings.appPassword) 51 - .onChange(async (value) => { 52 - this.plugin.settings.appPassword = value; 53 - await this.plugin.saveSettings(); 54 - }); 55 - }); 56 - } 57 - }
-239
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 - // Display tags 56 - if (bookmark.tags && bookmark.tags.length > 0) { 57 - const tagsContainer = el.createEl("div", { cls: "atmark-item-tags" }); 58 - for (const tag of bookmark.tags) { 59 - tagsContainer.createEl("span", { text: tag, cls: "atmark-tag" }); 60 - } 61 - } 62 - 63 - const title = enriched?.title || bookmark.title; 64 - if (title) { 65 - el.createEl("div", { text: title, cls: "atmark-item-title" }); 66 - } 67 - 68 - const imageUrl = enriched?.image || enriched?.thumb; 69 - if (imageUrl) { 70 - const img = el.createEl("img", { cls: "atmark-item-image" }); 71 - img.src = imageUrl; 72 - img.alt = title || "Image"; 73 - } 74 - 75 - const description = enriched?.description || bookmark.description; 76 - if (description) { 77 - const desc = description.length > 200 78 - ? description.slice(0, 200) + "โ€ฆ" 79 - : description; 80 - el.createEl("p", { text: desc, cls: "atmark-item-desc" }); 81 - } 82 - 83 - if (enriched?.siteName) { 84 - el.createEl("span", { text: enriched.siteName, cls: "atmark-item-site" }); 85 - } 86 - 87 - const link = el.createEl("a", { 88 - text: bookmark.subject, 89 - href: bookmark.subject, 90 - cls: "atmark-item-url", 91 - }); 92 - link.setAttr("target", "_blank"); 93 - } 94 - 95 - renderDetail(container: HTMLElement): void { 96 - const body = container.createEl("div", { cls: "atmark-detail-body" }); 97 - const bookmark = this.record.value; 98 - const enriched = bookmark.enriched; 99 - 100 - const title = enriched?.title || bookmark.title; 101 - if (title) { 102 - body.createEl("h2", { text: title, cls: "atmark-detail-title" }); 103 - } 104 - 105 - const imageUrl = enriched?.image || enriched?.thumb; 106 - if (imageUrl) { 107 - const img = body.createEl("img", { cls: "atmark-detail-image" }); 108 - img.src = imageUrl; 109 - img.alt = title || "Image"; 110 - } 111 - 112 - const description = enriched?.description || bookmark.description; 113 - if (description) { 114 - body.createEl("p", { text: description, cls: "atmark-detail-description" }); 115 - } 116 - 117 - if (enriched?.siteName) { 118 - const metaGrid = body.createEl("div", { cls: "atmark-detail-meta" }); 119 - const item = metaGrid.createEl("div", { cls: "atmark-detail-meta-item" }); 120 - item.createEl("span", { text: "Site", cls: "atmark-detail-meta-label" }); 121 - item.createEl("span", { text: enriched.siteName, cls: "atmark-detail-meta-value" }); 122 - } 123 - 124 - const linkWrapper = body.createEl("div", { cls: "atmark-detail-link-wrapper" }); 125 - const link = linkWrapper.createEl("a", { 126 - text: bookmark.subject, 127 - href: bookmark.subject, 128 - cls: "atmark-detail-link", 129 - }); 130 - link.setAttr("target", "_blank"); 131 - 132 - // Tags section 133 - if (bookmark.tags && bookmark.tags.length > 0) { 134 - const tagsSection = container.createEl("div", { cls: "atmark-item-tags-section" }); 135 - tagsSection.createEl("h3", { text: "Tags", cls: "atmark-detail-section-title" }); 136 - const tagsContainer = tagsSection.createEl("div", { cls: "atmark-item-tags" }); 137 - for (const tag of bookmark.tags) { 138 - tagsContainer.createEl("span", { text: tag, cls: "atmark-tag" }); 139 - } 140 - } 141 - } 142 - 143 - getTags() { 144 - return this.record.value.tags || []; 145 - } 146 - 147 - getRecord() { 148 - return this.record; 149 - } 150 - } 151 - 152 - export class BookmarkSource implements DataSource { 153 - readonly name = "bookmark" as const; 154 - private client: Client; 155 - private repo: string; 156 - 157 - constructor(client: Client, repo: string) { 158 - this.client = client; 159 - this.repo = repo; 160 - } 161 - 162 - async fetchItems(filters: SourceFilter[], plugin: ATmarkPlugin): Promise<ATmarkItem[]> { 163 - const bookmarksResp = await getBookmarks(this.client, this.repo); 164 - if (!bookmarksResp.ok) return []; 165 - 166 - let bookmarks = bookmarksResp.data.records as BookmarkRecord[]; 167 - 168 - // Apply tag filter if specified 169 - const tagFilter = filters.find(f => f.type === "bookmarkTag"); 170 - if (tagFilter && tagFilter.value) { 171 - bookmarks = bookmarks.filter((record: BookmarkRecord) => 172 - record.value.tags?.includes(tagFilter.value) 173 - ); 174 - } 175 - 176 - return bookmarks.map((record: BookmarkRecord) => new BookmarkItem(record, plugin)); 177 - } 178 - 179 - async getAvailableFilters(): Promise<SourceFilter[]> { 180 - const bookmarksResp = await getBookmarks(this.client, this.repo); 181 - if (!bookmarksResp.ok) return []; 182 - 183 - // Extract unique tags 184 - const tagSet = new Set<string>(); 185 - const records = bookmarksResp.data.records as BookmarkRecord[]; 186 - for (const record of records) { 187 - if (record.value.tags) { 188 - for (const tag of record.value.tags) { 189 - tagSet.add(tag); 190 - } 191 - } 192 - } 193 - 194 - return Array.from(tagSet).map(tag => ({ 195 - type: "bookmarkTag", 196 - value: tag, 197 - label: tag, 198 - })); 199 - } 200 - 201 - renderFilterUI(container: HTMLElement, activeFilters: Map<string, SourceFilter>, onChange: () => void, plugin: ATmarkPlugin): void { 202 - const section = container.createEl("div", { cls: "atmark-filter-section" }); 203 - 204 - const titleRow = section.createEl("div", { cls: "atmark-filter-title-row" }); 205 - titleRow.createEl("h3", { text: "Tags", cls: "atmark-filter-title" }); 206 - 207 - const createBtn = titleRow.createEl("button", { cls: "atmark-filter-create-btn" }); 208 - setIcon(createBtn, "plus"); 209 - createBtn.addEventListener("click", () => { 210 - new CreateTagModal(plugin, onChange).open(); 211 - }); 212 - 213 - const chips = section.createEl("div", { cls: "atmark-filter-chips" }); 214 - 215 - // All chip 216 - const allChip = chips.createEl("button", { 217 - text: "All", 218 - cls: `atmark-chip ${!activeFilters.has("bookmarkTag") ? "atmark-chip-active" : ""}`, 219 - }); 220 - allChip.addEventListener("click", () => { 221 - activeFilters.delete("bookmarkTag"); 222 - onChange(); 223 - }); 224 - 225 - // Get tags and render chips 226 - void this.getAvailableFilters().then(tags => { 227 - for (const tag of tags) { 228 - const chip = chips.createEl("button", { 229 - text: tag.label, 230 - cls: `atmark-chip ${activeFilters.get("bookmarkTag")?.value === tag.value ? "atmark-chip-active" : ""}`, 231 - }); 232 - chip.addEventListener("click", () => { 233 - activeFilters.set("bookmarkTag", tag); 234 - onChange(); 235 - }); 236 - } 237 - }); 238 - } 239 - }
-317
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 - // Display collections 61 - if (this.collections.length > 0) { 62 - const collectionsContainer = el.createEl("div", { cls: "atmark-item-collections" }); 63 - for (const collection of this.collections) { 64 - collectionsContainer.createEl("span", { text: collection.name, cls: "atmark-collection" }); 65 - } 66 - } 67 - 68 - // Display tags 69 - if (bookmark.tags && bookmark.tags.length > 0) { 70 - const tagsContainer = el.createEl("div", { cls: "atmark-item-tags" }); 71 - for (const tag of bookmark.tags) { 72 - tagsContainer.createEl("span", { text: tag, cls: "atmark-tag" }); 73 - } 74 - } 75 - 76 - if (bookmark.title) { 77 - el.createEl("div", { text: bookmark.title, cls: "atmark-item-title" }); 78 - } 79 - 80 - if (bookmark.description) { 81 - const desc = bookmark.description.length > 200 82 - ? bookmark.description.slice(0, 200) + "โ€ฆ" 83 - : bookmark.description; 84 - el.createEl("p", { text: desc, cls: "atmark-item-desc" }); 85 - } 86 - 87 - const link = el.createEl("a", { 88 - text: bookmark.source, 89 - href: bookmark.source, 90 - cls: "atmark-item-url", 91 - }); 92 - link.setAttr("target", "_blank"); 93 - } 94 - 95 - renderDetail(container: HTMLElement): void { 96 - const body = container.createEl("div", { cls: "atmark-detail-body" }); 97 - const bookmark = this.record.value; 98 - 99 - if (bookmark.title) { 100 - body.createEl("h2", { text: bookmark.title, cls: "atmark-detail-title" }); 101 - } 102 - 103 - if (bookmark.description) { 104 - body.createEl("p", { text: bookmark.description, cls: "atmark-detail-description" }); 105 - } 106 - 107 - const linkWrapper = body.createEl("div", { cls: "atmark-detail-link-wrapper" }); 108 - const link = linkWrapper.createEl("a", { 109 - text: bookmark.source, 110 - href: bookmark.source, 111 - cls: "atmark-detail-link", 112 - }); 113 - link.setAttr("target", "_blank"); 114 - 115 - // Collections section 116 - if (this.collections.length > 0) { 117 - const collectionsSection = container.createEl("div", { cls: "atmark-item-collections-section" }); 118 - collectionsSection.createEl("h3", { text: "Collections", cls: "atmark-detail-section-title" }); 119 - const collectionsContainer = collectionsSection.createEl("div", { cls: "atmark-item-collections" }); 120 - for (const collection of this.collections) { 121 - collectionsContainer.createEl("span", { text: collection.name, cls: "atmark-collection" }); 122 - } 123 - } 124 - 125 - // Tags section 126 - if (bookmark.tags && bookmark.tags.length > 0) { 127 - const tagsSection = container.createEl("div", { cls: "atmark-item-tags-section" }); 128 - tagsSection.createEl("h3", { text: "Tags", cls: "atmark-detail-section-title" }); 129 - const tagsContainer = tagsSection.createEl("div", { cls: "atmark-item-tags" }); 130 - for (const tag of bookmark.tags) { 131 - tagsContainer.createEl("span", { text: tag, cls: "atmark-tag" }); 132 - } 133 - } 134 - } 135 - 136 - getTags() { 137 - return this.record.value.tags || []; 138 - } 139 - 140 - getRecord() { 141 - return this.record; 142 - } 143 - } 144 - 145 - export class MarginSource implements DataSource { 146 - readonly name = "margin" as const; 147 - private client: Client; 148 - private repo: string; 149 - 150 - constructor(client: Client, repo: string) { 151 - this.client = client; 152 - this.repo = repo; 153 - } 154 - 155 - async fetchItems(filters: SourceFilter[], plugin: ATmarkPlugin): Promise<ATmarkItem[]> { 156 - const bookmarksResp = await getMarginBookmarks(this.client, this.repo); 157 - if (!bookmarksResp.ok) return []; 158 - 159 - let bookmarks = bookmarksResp.data.records as MarginBookmarkRecord[]; 160 - 161 - // Build collections map (bookmark URI -> collection info) 162 - const collectionsMap = new Map<string, Array<{ uri: string; name: string }>>(); 163 - const collectionsResp = await getMarginCollections(this.client, this.repo); 164 - const itemsResp = await getMarginCollectionItems(this.client, this.repo); 165 - 166 - if (collectionsResp.ok && itemsResp.ok) { 167 - const collections = collectionsResp.data.records as MarginCollectionRecord[]; 168 - const collectionNameMap = new Map<string, string>(); 169 - for (const collection of collections) { 170 - collectionNameMap.set(collection.uri, collection.value.name); 171 - } 172 - 173 - const items = itemsResp.data.records as MarginCollectionItemRecord[]; 174 - for (const item of items) { 175 - const bookmarkUri = item.value.annotation; 176 - const collectionUri = item.value.collection; 177 - const collectionName = collectionNameMap.get(collectionUri); 178 - 179 - if (collectionName) { 180 - const existing = collectionsMap.get(bookmarkUri) || []; 181 - existing.push({ uri: collectionUri, name: collectionName }); 182 - collectionsMap.set(bookmarkUri, existing); 183 - } 184 - } 185 - } 186 - 187 - // Apply collection filter if specified 188 - const collectionFilter = filters.find(f => f.type === "marginCollection"); 189 - if (collectionFilter && collectionFilter.value) { 190 - if (itemsResp.ok) { 191 - const items = itemsResp.data.records as MarginCollectionItemRecord[]; 192 - const filteredItems = items.filter((item: MarginCollectionItemRecord) => 193 - item.value.collection === collectionFilter.value 194 - ); 195 - const bookmarkUris = new Set(filteredItems.map((item: MarginCollectionItemRecord) => item.value.annotation)); 196 - bookmarks = bookmarks.filter((bookmark: MarginBookmarkRecord) => bookmarkUris.has(bookmark.uri)); 197 - } 198 - } 199 - 200 - // Apply tag filter if specified 201 - const tagFilter = filters.find(f => f.type === "marginTag"); 202 - if (tagFilter && tagFilter.value) { 203 - bookmarks = bookmarks.filter((record: MarginBookmarkRecord) => 204 - record.value.tags?.includes(tagFilter.value) 205 - ); 206 - } 207 - 208 - return bookmarks.map((record: MarginBookmarkRecord) => 209 - new MarginItem(record, collectionsMap.get(record.uri) || [], plugin) 210 - ); 211 - } 212 - 213 - async getAvailableFilters(): Promise<SourceFilter[]> { 214 - const filters: SourceFilter[] = []; 215 - 216 - // Get collections 217 - const collectionsResp = await getMarginCollections(this.client, this.repo); 218 - if (collectionsResp.ok) { 219 - const collections = collectionsResp.data.records as MarginCollectionRecord[]; 220 - filters.push(...collections.map((c: MarginCollectionRecord) => ({ 221 - type: "marginCollection", 222 - value: c.uri, 223 - label: c.value.name, 224 - }))); 225 - } 226 - 227 - // Get tags 228 - const bookmarksResp = await getMarginBookmarks(this.client, this.repo); 229 - if (bookmarksResp.ok) { 230 - const tagSet = new Set<string>(); 231 - const records = bookmarksResp.data.records as MarginBookmarkRecord[]; 232 - for (const record of records) { 233 - if (record.value.tags) { 234 - for (const tag of record.value.tags) { 235 - tagSet.add(tag); 236 - } 237 - } 238 - } 239 - filters.push(...Array.from(tagSet).map(tag => ({ 240 - type: "marginTag", 241 - value: tag, 242 - label: tag, 243 - }))); 244 - } 245 - 246 - return filters; 247 - } 248 - 249 - renderFilterUI(container: HTMLElement, activeFilters: Map<string, SourceFilter>, onChange: () => void, plugin: ATmarkPlugin): void { 250 - // Collections section 251 - const collectionsSection = container.createEl("div", { cls: "atmark-filter-section" }); 252 - 253 - const collectionsTitleRow = collectionsSection.createEl("div", { cls: "atmark-filter-title-row" }); 254 - collectionsTitleRow.createEl("h3", { text: "Collections", cls: "atmark-filter-title" }); 255 - 256 - const createCollectionBtn = collectionsTitleRow.createEl("button", { cls: "atmark-filter-create-btn" }); 257 - setIcon(createCollectionBtn, "plus"); 258 - createCollectionBtn.addEventListener("click", () => { 259 - new CreateMarginCollectionModal(plugin, onChange).open(); 260 - }); 261 - 262 - const collectionsChips = collectionsSection.createEl("div", { cls: "atmark-filter-chips" }); 263 - 264 - // All collections chip 265 - const allCollectionsChip = collectionsChips.createEl("button", { 266 - text: "All", 267 - cls: `atmark-chip ${!activeFilters.has("marginCollection") ? "atmark-chip-active" : ""}`, 268 - }); 269 - allCollectionsChip.addEventListener("click", () => { 270 - activeFilters.delete("marginCollection"); 271 - onChange(); 272 - }); 273 - 274 - // Tags section 275 - const tagsSection = container.createEl("div", { cls: "atmark-filter-section" }); 276 - 277 - const tagsTitleRow = tagsSection.createEl("div", { cls: "atmark-filter-title-row" }); 278 - tagsTitleRow.createEl("h3", { text: "Tags", cls: "atmark-filter-title" }); 279 - 280 - const tagsChips = tagsSection.createEl("div", { cls: "atmark-filter-chips" }); 281 - 282 - // All tags chip 283 - const allTagsChip = tagsChips.createEl("button", { 284 - text: "All", 285 - cls: `atmark-chip ${!activeFilters.has("marginTag") ? "atmark-chip-active" : ""}`, 286 - }); 287 - allTagsChip.addEventListener("click", () => { 288 - activeFilters.delete("marginTag"); 289 - onChange(); 290 - }); 291 - 292 - // Get filters and render chips 293 - void this.getAvailableFilters().then(filters => { 294 - for (const filter of filters) { 295 - if (filter.type === "marginCollection") { 296 - const chip = collectionsChips.createEl("button", { 297 - text: filter.label, 298 - cls: `atmark-chip ${activeFilters.get("marginCollection")?.value === filter.value ? "atmark-chip-active" : ""}`, 299 - }); 300 - chip.addEventListener("click", () => { 301 - activeFilters.set("marginCollection", filter); 302 - onChange(); 303 - }); 304 - } else if (filter.type === "marginTag") { 305 - const chip = tagsChips.createEl("button", { 306 - text: filter.label, 307 - cls: `atmark-chip ${activeFilters.get("marginTag")?.value === filter.value ? "atmark-chip-active" : ""}`, 308 - }); 309 - chip.addEventListener("click", () => { 310 - activeFilters.set("marginTag", filter); 311 - onChange(); 312 - }); 313 - } 314 - } 315 - }); 316 - } 317 - }
-260
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: "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: "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 - // Build notes map 167 - const notesMap = new Map<string, Array<{ uri: string; text: string }>>(); 168 - for (const record of allSembleCards) { 169 - if (record.value.type === "NOTE") { 170 - const parentUri = record.value.parentCard?.uri; 171 - if (parentUri) { 172 - const noteContent = record.value.content as NoteContent; 173 - const existing = notesMap.get(parentUri) || []; 174 - existing.push({ uri: record.uri, text: noteContent.text }); 175 - notesMap.set(parentUri, existing); 176 - } 177 - } 178 - } 179 - 180 - // Filter out NOTE cards that are attached to other cards 181 - let sembleCards = allSembleCards.filter((record: CardRecord) => { 182 - if (record.value.type === "NOTE") { 183 - const hasParent = record.value.parentCard?.uri; 184 - return !hasParent; 185 - } 186 - return true; 187 - }); 188 - 189 - // Apply collection filter if specified 190 - const collectionFilter = filters.find(f => f.type === "sembleCollection"); 191 - if (collectionFilter && collectionFilter.value) { 192 - const linksResp = await getCollectionLinks(this.client, this.repo); 193 - if (linksResp.ok) { 194 - const links = linksResp.data.records as CollectionLinkRecord[]; 195 - const filteredLinks = links.filter((link: CollectionLinkRecord) => 196 - link.value.collection.uri === collectionFilter.value 197 - ); 198 - const cardUris = new Set(filteredLinks.map((link: CollectionLinkRecord) => link.value.card.uri)); 199 - sembleCards = sembleCards.filter((card: CardRecord) => cardUris.has(card.uri)); 200 - } 201 - } 202 - 203 - // Create SembleItem objects 204 - return sembleCards.map((record: CardRecord) => 205 - new SembleItem(record, notesMap.get(record.uri) || [], plugin) 206 - ); 207 - } 208 - 209 - async getAvailableFilters(): Promise<SourceFilter[]> { 210 - const collectionsResp = await getCollections(this.client, this.repo); 211 - if (!collectionsResp.ok) return []; 212 - 213 - const collections = collectionsResp.data.records as CollectionRecord[]; 214 - return collections.map((c: CollectionRecord) => ({ 215 - type: "sembleCollection", 216 - value: c.uri, 217 - label: c.value.name, 218 - })); 219 - } 220 - 221 - renderFilterUI(container: HTMLElement, activeFilters: Map<string, SourceFilter>, onChange: () => void, plugin: ATmarkPlugin): void { 222 - const section = container.createEl("div", { cls: "atmark-filter-section" }); 223 - 224 - const titleRow = section.createEl("div", { cls: "atmark-filter-title-row" }); 225 - titleRow.createEl("h3", { text: "Semble collections", cls: "atmark-filter-title" }); 226 - 227 - const createBtn = titleRow.createEl("button", { cls: "atmark-filter-create-btn" }); 228 - setIcon(createBtn, "plus"); 229 - createBtn.addEventListener("click", () => { 230 - new CreateCollectionModal(plugin, onChange).open(); 231 - }); 232 - 233 - const chips = section.createEl("div", { cls: "atmark-filter-chips" }); 234 - 235 - // All chip 236 - const allChip = chips.createEl("button", { 237 - text: "All", 238 - cls: `atmark-chip ${!activeFilters.has("sembleCollection") ? "atmark-chip-active" : ""}`, 239 - }); 240 - allChip.addEventListener("click", () => { 241 - activeFilters.delete("sembleCollection"); 242 - onChange(); 243 - }); 244 - 245 - // Get collections synchronously - note: this is a limitation 246 - // In a real app, we'd want to cache these or handle async properly 247 - void this.getAvailableFilters().then(collections => { 248 - for (const collection of collections) { 249 - const chip = chips.createEl("button", { 250 - text: collection.label, 251 - cls: `atmark-chip ${activeFilters.get("sembleCollection")?.value === collection.value ? "atmark-chip-active" : ""}`, 252 - }); 253 - chip.addEventListener("click", () => { 254 - activeFilters.set("sembleCollection", collection); 255 - onChange(); 256 - }); 257 - } 258 - }); 259 - } 260 - }
-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 - }
-212
src/views/atmark.ts
··· 1 - /* eslint-disable @typescript-eslint/no-explicit-any */ 2 - /* eslint-disable @typescript-eslint/no-unsafe-member-access */ 3 - /* eslint-disable @typescript-eslint/no-unsafe-return */ 4 - /* eslint-disable @typescript-eslint/no-unsafe-call */ 5 - import { ItemView, WorkspaceLeaf, setIcon } from "obsidian"; 6 - import type ATmarkPlugin from "../main"; 7 - import { renderProfileIcon } from "../components/profileIcon"; 8 - import { CardDetailModal } from "../components/cardDetailModal"; 9 - import type { ATmarkItem } from "../sources/types"; 10 - import { SembleSource } from "../sources/semble"; 11 - import { BookmarkSource } from "../sources/bookmark"; 12 - import { MarginSource } from "../sources/margin"; 13 - 14 - export const VIEW_TYPE_ATMARK = "atmark-view"; 15 - 16 - type SourceType = "semble" | "bookmark" | "margin"; 17 - 18 - export class ATmarkView extends ItemView { 19 - plugin: ATmarkPlugin; 20 - activeSource: SourceType = "semble"; 21 - sources: Map<SourceType, { source: any; filters: Map<string, any> }> = new Map(); 22 - 23 - constructor(leaf: WorkspaceLeaf, plugin: ATmarkPlugin) { 24 - super(leaf); 25 - this.plugin = plugin; 26 - 27 - // Initialize sources 28 - if (this.plugin.client) { 29 - const repo = this.plugin.settings.identifier; 30 - this.sources.set("semble", { 31 - source: new SembleSource(this.plugin.client, repo), 32 - filters: new Map() 33 - }); 34 - this.sources.set("bookmark", { 35 - source: new BookmarkSource(this.plugin.client, repo), 36 - filters: new Map() 37 - }); 38 - this.sources.set("margin", { 39 - source: new MarginSource(this.plugin.client, repo), 40 - filters: new Map() 41 - }); 42 - } 43 - } 44 - 45 - getViewType() { 46 - return VIEW_TYPE_ATMARK; 47 - } 48 - 49 - getDisplayText() { 50 - // eslint-disable-next-line obsidianmd/ui/sentence-case 51 - return "ATmark"; 52 - } 53 - 54 - getIcon() { 55 - return "layers"; 56 - } 57 - 58 - async onOpen() { 59 - await this.render(); 60 - } 61 - 62 - async fetchItems(): Promise<ATmarkItem[]> { 63 - if (!this.plugin.client) return []; 64 - 65 - const sourceData = this.sources.get(this.activeSource); 66 - if (!sourceData) return []; 67 - 68 - const filters = Array.from(sourceData.filters.values()); 69 - return await sourceData.source.fetchItems(filters, this.plugin); 70 - } 71 - 72 - async render() { 73 - const container = this.contentEl; 74 - container.empty(); 75 - container.addClass("atmark-view"); 76 - 77 - if (!this.plugin.client) { 78 - container.createEl("p", { text: "Not connected." }); 79 - return; 80 - } 81 - 82 - const loading = container.createEl("p", { text: "Loading..." }); 83 - 84 - try { 85 - const items = await this.fetchItems(); 86 - loading.remove(); 87 - 88 - this.renderHeader(container); 89 - 90 - if (items.length === 0) { 91 - container.createEl("p", { text: "No items found." }); 92 - return; 93 - } 94 - 95 - const grid = container.createEl("div", { cls: "atmark-grid" }); 96 - for (const item of items) { 97 - try { 98 - this.renderItem(grid, item); 99 - } catch (err) { 100 - const message = err instanceof Error ? err.message : String(err); 101 - console.error(`Failed to render item ${item.getUri()}: ${message}`); 102 - } 103 - } 104 - } catch (err) { 105 - loading.remove(); 106 - const message = err instanceof Error ? err.message : String(err); 107 - container.createEl("p", { text: `Failed to load: ${message}`, cls: "atmark-error" }); 108 - } 109 - } 110 - 111 - private renderHeader(container: HTMLElement) { 112 - const header = container.createEl("div", { cls: "atmark-header" }); 113 - const nav = header.createEl("div", { cls: "atmark-nav" }); 114 - 115 - // eslint-disable-next-line obsidianmd/ui/sentence-case 116 - nav.createEl("h1", { text: "ATmark", cls: "atmark-title" }); 117 - 118 - renderProfileIcon(nav, this.plugin.profile); 119 - 120 - const sourceSelector = header.createEl("div", { cls: "atmark-source-selector" }); 121 - const sources: SourceType[] = ["semble", "bookmark", "margin"]; 122 - 123 - for (const source of sources) { 124 - const label = sourceSelector.createEl("label", { cls: "atmark-source-option" }); 125 - 126 - const radio = label.createEl("input", { 127 - type: "radio", 128 - cls: "atmark-source-radio", 129 - }); 130 - radio.name = "atmark-source"; 131 - radio.checked = this.activeSource === source; 132 - radio.addEventListener("change", () => { 133 - this.activeSource = source; 134 - void this.render(); 135 - }); 136 - 137 - label.createEl("span", { 138 - text: source.charAt(0).toUpperCase() + source.slice(1), 139 - cls: "atmark-source-text", 140 - }); 141 - } 142 - 143 - // Let the active source render its filters 144 - const filtersContainer = container.createEl("div", { cls: "atmark-filters" }); 145 - const sourceData = this.sources.get(this.activeSource); 146 - if (sourceData) { 147 - sourceData.source.renderFilterUI( 148 - filtersContainer, 149 - sourceData.filters, 150 - () => void this.render(), 151 - this.plugin 152 - ); 153 - } 154 - } 155 - 156 - private renderItem(container: HTMLElement, item: ATmarkItem) { 157 - const el = container.createEl("div", { cls: "atmark-item" }); 158 - 159 - el.addEventListener("click", (e) => { 160 - // Don't open detail if clicking the edit button 161 - if ((e.target as HTMLElement).closest(".atmark-item-edit-btn")) { 162 - return; 163 - } 164 - new CardDetailModal(this.plugin, item, () => { 165 - void this.render(); 166 - }).open(); 167 - }); 168 - 169 - const header = el.createEl("div", { cls: "atmark-item-header" }); 170 - const source = item.getSource(); 171 - header.createEl("span", { 172 - text: source, 173 - cls: `atmark-badge atmark-badge-${source}`, 174 - }); 175 - 176 - // Add edit button if item supports it 177 - if (item.canEdit()) { 178 - const editBtn = header.createEl("button", { 179 - cls: "atmark-item-edit-btn", 180 - }); 181 - setIcon(editBtn, "more-vertical"); 182 - editBtn.addEventListener("click", (e) => { 183 - e.stopPropagation(); 184 - item.openEditModal(() => { 185 - void this.render(); 186 - }); 187 - }); 188 - } 189 - 190 - item.render(el); 191 - 192 - const footer = el.createEl("div", { cls: "atmark-item-footer" }); 193 - footer.createEl("span", { 194 - text: new Date(item.getCreatedAt()).toLocaleDateString(), 195 - cls: "atmark-date", 196 - }); 197 - 198 - // Show note indicator for items with attached notes (semble cards) 199 - const notes = item.getAttachedNotes?.(); 200 - if (notes && notes.length > 0) { 201 - const noteIndicator = footer.createEl("div", { cls: "atmark-note-indicator" }); 202 - const icon = noteIndicator.createEl("span", { cls: "atmark-note-icon" }); 203 - setIcon(icon, "message-square"); 204 - noteIndicator.createEl("span", { 205 - text: `${notes.length} note${notes.length > 1 ? 's' : ''}`, 206 - cls: "atmark-note-count" 207 - }); 208 - } 209 - } 210 - 211 - async onClose() { } 212 - }
-1239
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-nav { 13 - display: flex; 14 - align-items: center; 15 - justify-content: space-between; 16 - margin-bottom: 12px; 17 - gap: 10px; 18 - } 19 - 20 - .atmark-title { 21 - margin: 0; 22 - font-size: var(--h1-size); 23 - font-weight: var(--font-bold); 24 - color: var(--text-accent); 25 - flex-shrink: 1; 26 - min-width: 0; 27 - } 28 - 29 - .atmark-source-selector { 30 - display: flex; 31 - align-items: center; 32 - justify-content: center; 33 - gap: 6px; 34 - margin-bottom: 12px; 35 - flex-wrap: wrap; 36 - } 37 - 38 - .atmark-source-option { 39 - display: flex; 40 - align-items: center; 41 - justify-content: center; 42 - gap: 4px; 43 - padding: 4px 12px; 44 - cursor: pointer; 45 - user-select: none; 46 - border-radius: var(--radius-s); 47 - border: 1px solid var(--background-modifier-border); 48 - background: var(--background-secondary); 49 - transition: all 0.15s ease; 50 - font-size: var(--font-smaller); 51 - } 52 - 53 - .atmark-source-option:hover { 54 - background: var(--background-modifier-hover); 55 - border-color: var(--background-modifier-border-hover); 56 - } 57 - 58 - .atmark-source-option:has(input:checked) { 59 - background: var(--interactive-accent); 60 - border-color: var(--interactive-accent); 61 - } 62 - 63 - .atmark-source-option:has(input:checked) .atmark-source-text { 64 - color: var(--text-on-accent); 65 - } 66 - 67 - .atmark-source-radio { 68 - display: none; 69 - } 70 - 71 - .atmark-source-text { 72 - font-size: var(--font-smaller); 73 - font-weight: var(--font-medium); 74 - color: var(--text-normal); 75 - } 76 - 77 - .atmark-filters { 78 - display: flex; 79 - flex-direction: column; 80 - gap: 16px; 81 - margin-bottom: 16px; 82 - } 83 - 84 - .atmark-filter-section { 85 - display: flex; 86 - flex-direction: column; 87 - gap: 6px; 88 - } 89 - 90 - .atmark-filter-title-row { 91 - display: flex; 92 - align-items: center; 93 - gap: 6px; 94 - margin-bottom: 2px; 95 - } 96 - 97 - .atmark-filter-title { 98 - margin: 0; 99 - font-size: var(--font-smallest); 100 - font-weight: var(--font-semibold); 101 - color: var(--text-faint); 102 - text-transform: uppercase; 103 - letter-spacing: 0.05em; 104 - } 105 - 106 - .atmark-filter-create-btn { 107 - display: flex; 108 - align-items: center; 109 - justify-content: center; 110 - width: 18px; 111 - height: 18px; 112 - padding: 0; 113 - background: transparent; 114 - border: none; 115 - border-radius: var(--radius-s); 116 - cursor: pointer; 117 - color: var(--text-faint); 118 - transition: all 0.15s ease; 119 - opacity: 0.7; 120 - } 121 - 122 - .atmark-filter-create-btn:hover { 123 - background: var(--background-modifier-hover); 124 - color: var(--interactive-accent); 125 - opacity: 1; 126 - } 127 - 128 - .atmark-filter-create-btn svg { 129 - width: 12px; 130 - height: 12px; 131 - } 132 - 133 - .atmark-filter-chips { 134 - display: flex; 135 - flex-wrap: wrap; 136 - gap: 6px; 137 - align-items: center; 138 - } 139 - 140 - .atmark-chip { 141 - padding: 3px 10px; 142 - border-radius: var(--radius-m); 143 - border: none; 144 - background: var(--background-modifier-border); 145 - color: var(--text-muted); 146 - font-size: var(--font-smallest); 147 - font-weight: var(--font-medium); 148 - cursor: pointer; 149 - transition: all 0.12s ease; 150 - white-space: nowrap; 151 - } 152 - 153 - .atmark-chip:hover { 154 - background: var(--background-modifier-border-hover); 155 - color: var(--text-normal); 156 - transform: translateY(-1px); 157 - } 158 - 159 - .atmark-chip-active { 160 - background: var(--interactive-accent); 161 - color: var(--text-on-accent); 162 - font-weight: var(--font-semibold); 163 - } 164 - 165 - .atmark-chip-active:hover { 166 - background: var(--interactive-accent-hover); 167 - transform: translateY(-1px); 168 - } 169 - 170 - .atmark-grid { 171 - display: grid; 172 - grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); 173 - gap: 16px; 174 - padding: 8px 0; 175 - } 176 - 177 - .atmark-item { 178 - background: var(--background-secondary); 179 - border: 1px solid var(--background-modifier-border); 180 - border-radius: var(--radius-m); 181 - padding: 16px; 182 - display: flex; 183 - flex-direction: column; 184 - transition: box-shadow 0.15s ease, border-color 0.15s ease; 185 - cursor: pointer; 186 - } 187 - 188 - .atmark-item:hover { 189 - box-shadow: var(--shadow-s); 190 - border-color: var(--background-modifier-border-hover); 191 - } 192 - 193 - .atmark-item-header { 194 - display: flex; 195 - justify-content: space-between; 196 - align-items: flex-start; 197 - gap: 8px; 198 - } 199 - 200 - .atmark-item-edit-btn { 201 - display: flex; 202 - align-items: center; 203 - justify-content: center; 204 - width: 24px; 205 - height: 24px; 206 - padding: 0; 207 - margin-left: auto; 208 - background: transparent; 209 - border: none; 210 - border-radius: var(--radius-s); 211 - cursor: pointer; 212 - color: var(--text-faint); 213 - opacity: 0.6; 214 - transition: all 0.15s ease; 215 - } 216 - 217 - .atmark-item:hover .atmark-item-edit-btn { 218 - opacity: 1; 219 - } 220 - 221 - .atmark-item-edit-btn:hover { 222 - background: var(--background-modifier-hover); 223 - color: var(--text-normal); 224 - opacity: 1; 225 - } 226 - 227 - .atmark-item-edit-btn svg { 228 - width: 14px; 229 - height: 14px; 230 - } 231 - 232 - .atmark-badge { 233 - font-size: 10px; 234 - padding: 3px 8px; 235 - border-radius: 12px; 236 - text-transform: capitalize; 237 - font-weight: var(--font-normal); 238 - flex-shrink: 0; 239 - letter-spacing: 0.3px; 240 - } 241 - 242 - .atmark-badge-semble { 243 - background: rgba(255, 87, 34, 0.15); 244 - color: rgb(255, 120, 70); 245 - border: 1px solid rgba(255, 87, 34, 0.3); 246 - } 247 - 248 - .atmark-badge-bookmark { 249 - background: rgba(3, 169, 244, 0.15); 250 - color: rgb(3, 169, 244); 251 - border: 1px solid rgba(3, 169, 244, 0.3); 252 - } 253 - 254 - .atmark-badge-margin { 255 - background: rgba(156, 39, 176, 0.15); 256 - color: rgb(186, 104, 200); 257 - border: 1px solid rgba(156, 39, 176, 0.3); 258 - } 259 - 260 - .atmark-item-footer { 261 - display: flex; 262 - justify-content: space-between; 263 - font-size: var(--font-smallest); 264 - color: var(--text-faint); 265 - margin-top: auto; 266 - padding-top: 8px; 267 - border-top: 1px solid var(--background-modifier-border); 268 - } 269 - 270 - .atmark-date { 271 - font-size: var(--font-smallest); 272 - color: var(--text-faint); 273 - } 274 - 275 - .atmark-error { 276 - color: var(--text-error); 277 - } 278 - 279 - 280 - /* Item Content (shared between sources) */ 281 - .atmark-item-content { 282 - display: flex; 283 - flex-direction: column; 284 - gap: 12px; 285 - } 286 - 287 - .atmark-item-title { 288 - font-weight: var(--font-semibold); 289 - font-size: 1em; 290 - color: var(--text-normal); 291 - display: -webkit-box; 292 - -webkit-line-clamp: 2; 293 - -webkit-box-orient: vertical; 294 - overflow: hidden; 295 - line-height: 1.4; 296 - margin-bottom: 4px; 297 - } 298 - 299 - .atmark-item-image { 300 - width: 100%; 301 - max-height: 120px; 302 - object-fit: cover; 303 - border-radius: var(--radius-s); 304 - } 305 - 306 - .atmark-item-desc { 307 - color: var(--text-muted); 308 - font-size: var(--font-small); 309 - margin: 0; 310 - display: -webkit-box; 311 - -webkit-line-clamp: 2; 312 - -webkit-box-orient: vertical; 313 - overflow: hidden; 314 - line-height: 1.5; 315 - } 316 - 317 - .atmark-item-site { 318 - font-size: var(--font-smallest); 319 - color: var(--text-faint); 320 - margin-bottom: 2px; 321 - } 322 - 323 - .atmark-item-url { 324 - font-size: var(--font-smallest); 325 - color: var(--text-accent); 326 - text-decoration: none; 327 - word-break: break-all; 328 - display: -webkit-box; 329 - -webkit-line-clamp: 1; 330 - -webkit-box-orient: vertical; 331 - overflow: hidden; 332 - } 333 - 334 - .atmark-item-url:hover { 335 - text-decoration: underline; 336 - } 337 - 338 - .atmark-item-tags { 339 - display: flex; 340 - flex-wrap: wrap; 341 - gap: 6px; 342 - margin-bottom: 8px; 343 - } 344 - 345 - .atmark-tag { 346 - font-size: var(--font-smallest); 347 - padding: 2px 8px; 348 - border-radius: var(--radius-s); 349 - background: var(--background-modifier-border); 350 - color: var(--text-muted); 351 - border: 1px solid var(--background-modifier-border-hover); 352 - } 353 - 354 - .atmark-item-collections { 355 - display: flex; 356 - flex-wrap: wrap; 357 - gap: 6px; 358 - margin-bottom: 8px; 359 - } 360 - 361 - .atmark-collection { 362 - font-size: var(--font-smallest); 363 - padding: 2px 8px; 364 - border-radius: var(--radius-s); 365 - background: rgba(156, 39, 176, 0.1); 366 - color: rgb(186, 104, 200); 367 - border: 1px solid rgba(156, 39, 176, 0.3); 368 - } 369 - 370 - .atmark-item-collections-section { 371 - margin-top: 20px; 372 - padding-top: 20px; 373 - border-top: 1px solid var(--background-modifier-border); 374 - } 375 - 376 - .atmark-item-tags-section { 377 - margin-top: 20px; 378 - padding-top: 20px; 379 - border-top: 1px solid var(--background-modifier-border); 380 - } 381 - 382 - /* Note indicator for cards with attached notes */ 383 - .atmark-note-indicator { 384 - display: flex; 385 - align-items: center; 386 - gap: 4px; 387 - font-size: var(--font-smallest); 388 - color: var(--text-muted); 389 - } 390 - 391 - .atmark-note-icon { 392 - display: flex; 393 - align-items: center; 394 - color: var(--text-muted); 395 - } 396 - 397 - .atmark-note-icon svg { 398 - width: 12px; 399 - height: 12px; 400 - } 401 - 402 - .atmark-note-count { 403 - font-size: var(--font-smallest); 404 - } 405 - 406 - /* Detail Modal (shared between sources) */ 407 - .atmark-detail-body { 408 - display: flex; 409 - flex-direction: column; 410 - gap: 16px; 411 - } 412 - 413 - .atmark-detail-title { 414 - margin: 0; 415 - font-size: var(--h2-size); 416 - font-weight: var(--font-semibold); 417 - color: var(--text-normal); 418 - line-height: 1.3; 419 - } 420 - 421 - .atmark-detail-image { 422 - max-width: 100%; 423 - max-height: 200px; 424 - object-fit: contain; 425 - border-radius: var(--radius-m); 426 - } 427 - 428 - .atmark-detail-description { 429 - margin: 0; 430 - color: var(--text-normal); 431 - line-height: var(--line-height-normal); 432 - } 433 - 434 - .atmark-detail-meta { 435 - display: grid; 436 - grid-template-columns: repeat(2, 1fr); 437 - gap: 12px; 438 - padding: 16px; 439 - background: var(--background-secondary); 440 - border-radius: var(--radius-m); 441 - } 442 - 443 - .atmark-detail-meta-item { 444 - display: flex; 445 - flex-direction: column; 446 - gap: 2px; 447 - } 448 - 449 - .atmark-detail-meta-label { 450 - font-size: var(--font-smallest); 451 - color: var(--text-faint); 452 - text-transform: uppercase; 453 - letter-spacing: 0.5px; 454 - } 455 - 456 - .atmark-detail-meta-value { 457 - font-size: var(--font-small); 458 - color: var(--text-normal); 459 - } 460 - 461 - .atmark-detail-link-wrapper { 462 - padding-top: 8px; 463 - } 464 - 465 - .atmark-detail-link { 466 - font-size: var(--font-small); 467 - color: var(--text-accent); 468 - text-decoration: none; 469 - word-break: break-all; 470 - } 471 - 472 - .atmark-detail-link:hover { 473 - text-decoration: underline; 474 - } 475 - 476 - .atmark-detail-section-title { 477 - margin: 0 0 12px 0; 478 - font-size: var(--font-small); 479 - font-weight: var(--font-semibold); 480 - color: var(--text-muted); 481 - text-transform: uppercase; 482 - letter-spacing: 0.5px; 483 - } 484 - 485 - /* Modals and Forms (shared) */ 486 - .atmark-modal { 487 - padding: 16px; 488 - } 489 - 490 - .atmark-modal h2 { 491 - margin: 0 0 16px 0; 492 - font-size: var(--h2-size); 493 - font-weight: var(--font-semibold); 494 - color: var(--text-normal); 495 - } 496 - 497 - .atmark-form { 498 - display: flex; 499 - flex-direction: column; 500 - gap: 16px; 501 - } 502 - 503 - .atmark-form-group { 504 - display: flex; 505 - flex-direction: column; 506 - gap: 6px; 507 - } 508 - 509 - .atmark-form-group label { 510 - font-size: var(--font-small); 511 - font-weight: var(--font-medium); 512 - color: var(--text-normal); 513 - } 514 - 515 - .atmark-input, 516 - .atmark-textarea { 517 - padding: 8px 12px; 518 - background: var(--background-primary); 519 - border: 1px solid var(--background-modifier-border); 520 - border-radius: var(--radius-s); 521 - color: var(--text-normal); 522 - font-size: var(--font-ui-medium); 523 - font-family: inherit; 524 - transition: border-color 0.15s ease; 525 - } 526 - 527 - .atmark-input:focus, 528 - .atmark-textarea:focus { 529 - outline: none; 530 - border-color: var(--interactive-accent); 531 - box-shadow: 0 0 0 2px var(--background-modifier-border-focus); 532 - } 533 - 534 - .atmark-input::placeholder, 535 - .atmark-textarea::placeholder { 536 - color: var(--text-faint); 537 - } 538 - 539 - .atmark-textarea { 540 - resize: vertical; 541 - min-height: 60px; 542 - } 543 - 544 - .atmark-modal-actions { 545 - display: flex; 546 - align-items: center; 547 - gap: 8px; 548 - padding-top: 16px; 549 - border-top: 1px solid var(--background-modifier-border); 550 - } 551 - 552 - .atmark-spacer { 553 - flex: 1; 554 - } 555 - 556 - .atmark-btn { 557 - padding: 8px 16px; 558 - border-radius: var(--radius-s); 559 - font-size: var(--font-small); 560 - font-weight: var(--font-medium); 561 - cursor: pointer; 562 - transition: all 0.15s ease; 563 - } 564 - 565 - .atmark-btn:disabled { 566 - opacity: 0.5; 567 - cursor: not-allowed; 568 - } 569 - 570 - .atmark-btn-secondary { 571 - background: var(--background-secondary); 572 - border: 1px solid var(--background-modifier-border); 573 - color: var(--text-normal); 574 - } 575 - 576 - .atmark-btn-secondary:hover:not(:disabled) { 577 - background: var(--background-modifier-hover); 578 - } 579 - 580 - .atmark-btn-primary { 581 - background: var(--interactive-accent); 582 - border: 1px solid var(--interactive-accent); 583 - color: var(--text-on-accent); 584 - } 585 - 586 - .atmark-btn-primary:hover:not(:disabled) { 587 - background: var(--interactive-accent-hover); 588 - } 589 - 590 - .atmark-btn-danger { 591 - background: color-mix(in srgb, var(--color-red) 15%, transparent); 592 - border: none; 593 - color: var(--color-red); 594 - } 595 - 596 - .atmark-btn-danger:hover:not(:disabled) { 597 - background: color-mix(in srgb, var(--color-red) 25%, transparent); 598 - } 599 - 600 - .atmark-warning-text { 601 - color: var(--text-muted); 602 - margin-bottom: 16px; 603 - } 604 - 605 - .atmark-tags-container { 606 - display: flex; 607 - flex-direction: column; 608 - gap: 8px; 609 - margin-bottom: 8px; 610 - } 611 - 612 - .atmark-tag-row { 613 - display: flex; 614 - align-items: center; 615 - gap: 8px; 616 - } 617 - 618 - .atmark-tag-row .atmark-input { 619 - flex: 1; 620 - } 621 - 622 - .atmark-tag-remove-btn { 623 - width: 32px; 624 - height: 32px; 625 - padding: 0; 626 - font-size: 20px; 627 - line-height: 1; 628 - flex-shrink: 0; 629 - } 630 - 631 - /* Semble-specific styles (for NOTE cards and attached notes) */ 632 - .semble-card-note { 633 - margin: 0; 634 - padding: 8px 12px; 635 - background: var(--background-primary); 636 - border-left: 3px solid var(--color-blue); 637 - border-radius: var(--radius-s); 638 - font-size: var(--font-small); 639 - font-style: italic; 640 - color: var(--text-muted); 641 - white-space: pre-wrap; 642 - line-height: var(--line-height-normal); 643 - } 644 - 645 - .semble-card-text { 646 - margin: 0; 647 - line-height: 1.5; 648 - color: var(--text-normal); 649 - display: -webkit-box; 650 - -webkit-line-clamp: 5; 651 - -webkit-box-orient: vertical; 652 - overflow: hidden; 653 - } 654 - 655 - .semble-detail-text { 656 - margin: 0; 657 - white-space: pre-wrap; 658 - line-height: var(--line-height-normal); 659 - color: var(--text-normal); 660 - font-size: 1.1em; 661 - } 662 - 663 - .semble-detail-notes-section { 664 - margin-top: 20px; 665 - padding-top: 20px; 666 - border-top: 1px solid var(--background-modifier-border); 667 - } 668 - 669 - .semble-detail-note { 670 - display: flex; 671 - align-items: flex-start; 672 - justify-content: space-between; 673 - gap: 12px; 674 - padding: 12px 16px; 675 - background: var(--background-secondary); 676 - border-left: 3px solid var(--color-blue); 677 - border-radius: var(--radius-s); 678 - margin-bottom: 8px; 679 - } 680 - 681 - .semble-detail-note-content { 682 - display: flex; 683 - gap: 12px; 684 - flex: 1; 685 - min-width: 0; 686 - } 687 - 688 - .semble-detail-note-icon { 689 - flex-shrink: 0; 690 - color: var(--color-blue); 691 - } 692 - 693 - .semble-detail-note-icon svg { 694 - width: 16px; 695 - height: 16px; 696 - } 697 - 698 - .semble-detail-note-text { 699 - margin: 0; 700 - color: var(--text-normal); 701 - line-height: var(--line-height-normal); 702 - white-space: pre-wrap; 703 - } 704 - 705 - /* Legacy Semble classes (backwards compatibility - will be removed in future) */ 706 - .semble-card-grid { 707 - display: grid; 708 - grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); 709 - gap: 16px; 710 - padding: 8px 0; 711 - } 712 - 713 - .semble-card { 714 - background: var(--background-secondary); 715 - border: 1px solid var(--background-modifier-border); 716 - border-radius: var(--radius-m); 717 - padding: 16px; 718 - display: flex; 719 - flex-direction: column; 720 - gap: 8px; 721 - transition: box-shadow 0.15s ease, border-color 0.15s ease; 722 - cursor: pointer; 723 - } 724 - 725 - .semble-card:hover { 726 - box-shadow: var(--shadow-s); 727 - border-color: var(--background-modifier-border-hover); 728 - } 729 - 730 - .semble-card-header { 731 - display: flex; 732 - justify-content: space-between; 733 - align-items: flex-start; 734 - gap: 8px; 735 - } 736 - 737 - .semble-badge { 738 - font-size: var(--font-smallest); 739 - padding: 2px 8px; 740 - border-radius: var(--radius-s); 741 - text-transform: uppercase; 742 - font-weight: var(--font-medium); 743 - flex-shrink: 0; 744 - } 745 - 746 - .semble-badge-open { 747 - background: var(--color-green); 748 - color: var(--text-on-accent); 749 - } 750 - 751 - .semble-badge-closed { 752 - background: var(--color-orange); 753 - color: var(--text-on-accent); 754 - } 755 - 756 - /* Card type badges */ 757 - .semble-badge-note { 758 - background: var(--color-blue); 759 - color: var(--text-on-accent); 760 - } 761 - 762 - .semble-badge-url { 763 - background: var(--color-purple); 764 - color: var(--text-on-accent); 765 - } 766 - 767 - .semble-badge-source { 768 - font-size: var(--font-smallest); 769 - opacity: 0.8; 770 - } 771 - 772 - .semble-badge-semble { 773 - background: var(--color-green); 774 - color: var(--text-on-accent); 775 - } 776 - 777 - /* Semble-specific page components */ 778 - .semble-page-header { 779 - margin-bottom: 16px; 780 - padding-bottom: 16px; 781 - border-top: 1px solid var(--background-modifier-border); 782 - } 783 - 784 - .semble-nav-row { 785 - display: flex; 786 - align-items: center; 787 - gap: 12px; 788 - margin-bottom: 8px; 789 - } 790 - 791 - .semble-brand { 792 - font-size: var(--font-small); 793 - font-weight: var(--font-semibold); 794 - color: var(--text-accent); 795 - text-transform: uppercase; 796 - letter-spacing: 0.5px; 797 - } 798 - 799 - .semble-page-title { 800 - margin: 0; 801 - font-size: var(--h1-size); 802 - font-weight: var(--font-bold); 803 - color: var(--text-normal); 804 - } 805 - 806 - .semble-back-btn { 807 - display: flex; 808 - align-items: center; 809 - justify-content: center; 810 - width: 32px; 811 - height: 32px; 812 - padding: 0; 813 - background: transparent; 814 - border: 1px solid var(--background-modifier-border); 815 - border-radius: var(--radius-s); 816 - cursor: pointer; 817 - color: var(--text-muted); 818 - } 819 - 820 - .semble-back-btn:hover { 821 - background: var(--background-modifier-hover); 822 - color: var(--text-normal); 823 - } 824 - 825 - /* Semble-specific Profile Icon */ 826 - .semble-profile-icon { 827 - display: flex; 828 - align-items: center; 829 - gap: 10px; 830 - margin-left: auto; 831 - } 832 - 833 - .semble-avatar-btn { 834 - display: flex; 835 - align-items: center; 836 - justify-content: center; 837 - width: 36px; 838 - height: 36px; 839 - padding: 0; 840 - background: var(--background-secondary); 841 - border: 2px solid var(--background-modifier-border); 842 - border-radius: var(--radius-full); 843 - cursor: pointer; 844 - overflow: hidden; 845 - transition: opacity 0.15s ease; 846 - } 847 - 848 - .semble-avatar-btn:hover { 849 - opacity: 0.8; 850 - } 851 - 852 - .semble-avatar-img { 853 - width: 100%; 854 - height: 100%; 855 - object-fit: cover; 856 - border-radius: var(--radius-full); 857 - } 858 - 859 - .semble-avatar-initials { 860 - font-size: var(--font-small); 861 - font-weight: var(--font-semibold); 862 - color: var(--text-muted); 863 - } 864 - 865 - .semble-avatar-placeholder { 866 - display: flex; 867 - align-items: center; 868 - justify-content: center; 869 - width: 36px; 870 - height: 36px; 871 - background: var(--background-secondary); 872 - border: 2px solid var(--background-modifier-border); 873 - border-radius: var(--radius-full); 874 - color: var(--text-faint); 875 - font-size: var(--font-small); 876 - } 877 - 878 - .semble-profile-info { 879 - display: flex; 880 - flex-direction: column; 881 - align-items: flex-end; 882 - gap: 2px; 883 - } 884 - 885 - .semble-profile-name { 886 - font-size: var(--font-small); 887 - font-weight: var(--font-semibold); 888 - color: var(--text-normal); 889 - line-height: 1.2; 890 - } 891 - 892 - .semble-profile-handle { 893 - font-size: var(--font-smallest); 894 - color: var(--text-muted); 895 - line-height: 1.2; 896 - } 897 - 898 - /* Semble-specific Collection UI */ 899 - .semble-collection-modal { 900 - padding: 16px; 901 - } 902 - 903 - .semble-collection-modal h2 { 904 - margin: 0 0 16px 0; 905 - font-size: var(--h2-size); 906 - font-weight: var(--font-semibold); 907 - color: var(--text-normal); 908 - } 909 - 910 - .semble-collection-list { 911 - display: flex; 912 - flex-direction: column; 913 - gap: 8px; 914 - max-height: 300px; 915 - overflow-y: auto; 916 - margin-bottom: 16px; 917 - } 918 - 919 - .semble-collection-item { 920 - display: flex; 921 - align-items: center; 922 - gap: 12px; 923 - padding: 12px 16px; 924 - background: var(--background-secondary); 925 - border: 1px solid var(--background-modifier-border); 926 - border-radius: var(--radius-m); 927 - cursor: pointer; 928 - transition: all 0.15s ease; 929 - } 930 - 931 - .semble-collection-item:hover { 932 - background: var(--background-modifier-hover); 933 - border-color: var(--background-modifier-border-hover); 934 - } 935 - 936 - .semble-collection-checkbox { 937 - width: 18px; 938 - height: 18px; 939 - margin: 0; 940 - cursor: pointer; 941 - accent-color: var(--interactive-accent); 942 - } 943 - 944 - .semble-collection-item-info { 945 - display: flex; 946 - flex-direction: column; 947 - gap: 2px; 948 - flex: 1; 949 - } 950 - 951 - .semble-collection-item-name { 952 - font-weight: var(--font-semibold); 953 - color: var(--text-normal); 954 - } 955 - 956 - .semble-collection-item-desc { 957 - font-size: var(--font-small); 958 - color: var(--text-muted); 959 - } 960 - 961 - /* Semble-specific Toolbar */ 962 - .semble-toolbar { 963 - display: flex; 964 - align-items: center; 965 - gap: 8px; 966 - margin-bottom: 16px; 967 - } 968 - 969 - .semble-create-btn { 970 - display: inline-flex; 971 - align-items: center; 972 - gap: 6px; 973 - padding: 6px 12px; 974 - background: var(--interactive-accent); 975 - border: none; 976 - border-radius: var(--radius-s); 977 - color: var(--text-on-accent); 978 - font-size: var(--font-small); 979 - font-weight: var(--font-medium); 980 - cursor: pointer; 981 - transition: all 0.15s ease; 982 - } 983 - 984 - .semble-create-btn:hover { 985 - background: var(--interactive-accent-hover); 986 - } 987 - 988 - .semble-create-btn svg { 989 - width: 14px; 990 - height: 14px; 991 - } 992 - 993 - .semble-toolbar-btn { 994 - display: inline-flex; 995 - align-items: center; 996 - gap: 6px; 997 - padding: 6px 12px; 998 - background: var(--background-secondary); 999 - border: 1px solid var(--background-modifier-border); 1000 - border-radius: var(--radius-s); 1001 - color: var(--text-normal); 1002 - font-size: var(--font-small); 1003 - font-weight: var(--font-medium); 1004 - cursor: pointer; 1005 - transition: all 0.15s ease; 1006 - } 1007 - 1008 - .semble-toolbar-btn:hover { 1009 - background: var(--background-modifier-hover); 1010 - border-color: var(--background-modifier-border-hover); 1011 - } 1012 - 1013 - .semble-toolbar-btn svg { 1014 - width: 14px; 1015 - height: 14px; 1016 - } 1017 - 1018 - /* Semble-specific Card Detail Modal */ 1019 - .semble-detail-modal { 1020 - padding: 20px; 1021 - max-width: 600px; 1022 - } 1023 - 1024 - .semble-detail-header { 1025 - margin-bottom: 16px; 1026 - } 1027 - 1028 - .semble-detail-footer { 1029 - margin-top: 20px; 1030 - padding-top: 16px; 1031 - border-top: 1px solid var(--background-modifier-border); 1032 - } 1033 - 1034 - .semble-detail-date { 1035 - font-size: var(--font-small); 1036 - color: var(--text-faint); 1037 - } 1038 - 1039 - .semble-detail-section-title { 1040 - margin: 0 0 12px 0; 1041 - font-size: var(--font-small); 1042 - font-weight: var(--font-semibold); 1043 - color: var(--text-muted); 1044 - text-transform: uppercase; 1045 - letter-spacing: 0.5px; 1046 - } 1047 - 1048 - /* Semble-specific Add Note Form */ 1049 - .semble-detail-add-note { 1050 - margin-top: 20px; 1051 - padding-top: 20px; 1052 - border-top: 1px solid var(--background-modifier-border); 1053 - } 1054 - 1055 - .semble-add-note-form { 1056 - display: flex; 1057 - flex-direction: column; 1058 - gap: 12px; 1059 - } 1060 - 1061 - .semble-note-input { 1062 - min-height: 80px; 1063 - resize: vertical; 1064 - } 1065 - 1066 - .semble-note-delete-btn { 1067 - display: flex; 1068 - align-items: center; 1069 - justify-content: center; 1070 - width: 28px; 1071 - height: 28px; 1072 - padding: 0; 1073 - flex-shrink: 0; 1074 - background: transparent; 1075 - border: none; 1076 - border-radius: var(--radius-s); 1077 - cursor: pointer; 1078 - color: var(--text-faint); 1079 - opacity: 0.6; 1080 - transition: all 0.15s ease; 1081 - } 1082 - 1083 - .semble-note-delete-btn:hover { 1084 - background: color-mix(in srgb, var(--color-red) 15%, transparent); 1085 - color: var(--color-red); 1086 - opacity: 1; 1087 - } 1088 - 1089 - .semble-note-delete-btn svg { 1090 - width: 14px; 1091 - height: 14px; 1092 - } 1093 - 1094 - /* Semble-specific legacy classes that need to be migrated to atmark-* */ 1095 - .semble-modal-actions { 1096 - display: flex; 1097 - align-items: center; 1098 - gap: 8px; 1099 - padding-top: 16px; 1100 - border-top: 1px solid var(--background-modifier-border); 1101 - } 1102 - 1103 - .semble-spacer { 1104 - flex: 1; 1105 - } 1106 - 1107 - .semble-btn { 1108 - padding: 8px 16px; 1109 - border-radius: var(--radius-s); 1110 - font-size: var(--font-small); 1111 - font-weight: var(--font-medium); 1112 - cursor: pointer; 1113 - transition: all 0.15s ease; 1114 - } 1115 - 1116 - .semble-btn:disabled { 1117 - opacity: 0.5; 1118 - cursor: not-allowed; 1119 - } 1120 - 1121 - .semble-btn-secondary { 1122 - background: var(--background-secondary); 1123 - border: 1px solid var(--background-modifier-border); 1124 - color: var(--text-normal); 1125 - } 1126 - 1127 - .semble-btn-secondary:hover:not(:disabled) { 1128 - background: var(--background-modifier-hover); 1129 - } 1130 - 1131 - .semble-btn-primary { 1132 - background: var(--interactive-accent); 1133 - border: 1px solid var(--interactive-accent); 1134 - color: var(--text-on-accent); 1135 - } 1136 - 1137 - .semble-btn-primary:hover:not(:disabled) { 1138 - background: var(--interactive-accent-hover); 1139 - } 1140 - 1141 - .semble-btn-danger { 1142 - background: color-mix(in srgb, var(--color-red) 15%, transparent); 1143 - border: none; 1144 - color: var(--color-red); 1145 - } 1146 - 1147 - .semble-btn-danger:hover:not(:disabled) { 1148 - background: color-mix(in srgb, var(--color-red) 25%, transparent); 1149 - } 1150 - 1151 - .semble-warning-text { 1152 - color: var(--text-muted); 1153 - margin-bottom: 16px; 1154 - } 1155 - 1156 - .semble-form { 1157 - display: flex; 1158 - flex-direction: column; 1159 - gap: 16px; 1160 - } 1161 - 1162 - .semble-form-group { 1163 - display: flex; 1164 - flex-direction: column; 1165 - gap: 6px; 1166 - } 1167 - 1168 - .semble-form-group label { 1169 - font-size: var(--font-small); 1170 - font-weight: var(--font-medium); 1171 - color: var(--text-normal); 1172 - } 1173 - 1174 - .semble-input, 1175 - .semble-textarea { 1176 - padding: 8px 12px; 1177 - background: var(--background-primary); 1178 - border: 1px solid var(--background-modifier-border); 1179 - border-radius: var(--radius-s); 1180 - color: var(--text-normal); 1181 - font-size: var(--font-ui-medium); 1182 - font-family: inherit; 1183 - transition: border-color 0.15s ease; 1184 - } 1185 - 1186 - .semble-input:focus, 1187 - .semble-textarea:focus { 1188 - outline: none; 1189 - border-color: var(--interactive-accent); 1190 - box-shadow: 0 0 0 2px var(--background-modifier-border-focus); 1191 - } 1192 - 1193 - .semble-input::placeholder, 1194 - .semble-textarea::placeholder { 1195 - color: var(--text-faint); 1196 - } 1197 - 1198 - .semble-textarea { 1199 - resize: vertical; 1200 - min-height: 60px; 1201 - } 1202 - 1203 - .semble-error { 1204 - color: var(--text-error); 1205 - } 1206 - 1207 - /* Responsive styles for mobile and narrow views */ 1208 - @media (max-width: 600px) { 1209 - .atmark-view { 1210 - padding: 12px; 1211 - } 1212 - 1213 - .atmark-header { 1214 - margin-bottom: 16px; 1215 - padding-bottom: 12px; 1216 - } 1217 - 1218 - .atmark-title { 1219 - font-size: var(--font-ui-medium); 1220 - } 1221 - 1222 - .atmark-source-option { 1223 - padding: 3px 10px; 1224 - font-size: var(--font-smallest); 1225 - } 1226 - 1227 - .atmark-source-text { 1228 - font-size: var(--font-smallest); 1229 - } 1230 - 1231 - .atmark-grid { 1232 - grid-template-columns: 1fr; 1233 - gap: 12px; 1234 - } 1235 - 1236 - .atmark-filter-section { 1237 - margin-bottom: 12px; 1238 - } 1239 - }
-31
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 - "types": ["@atcute/bluesky", "@atcute/atproto", "node"], 21 - "lib": [ 22 - "DOM", 23 - "ES5", 24 - "ES6", 25 - "ES7" 26 - ] 27 - }, 28 - "include": [ 29 - "src/**/*.ts" 30 - ] 31 - }
-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 - }