A social knowledge tool for researchers built on ATProto

Merge pull request #37 from cosmik-network/fix/remove-card-from-collection-error

refactor: update remove card from collection endpoint to use query pa…

authored by

Wesley Finck and committed by
GitHub
0fb996b7 9540d5ec

+797 -203
+127 -120
eslint.config.mjs
··· 1 // For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format 2 - import storybook from "eslint-plugin-storybook"; 3 4 import js from '@eslint/js'; 5 import prettierPlugin from 'eslint-plugin-prettier'; 6 import tseslint from '@typescript-eslint/eslint-plugin'; 7 import tsparser from '@typescript-eslint/parser'; 8 9 - export default [js.configs.recommended, { 10 - ignores: [ 11 - 'src/webapp/**', 12 - 'dist/**', 13 - 'node_modules/**', 14 - 'src/modules/atproto/infrastructure/lexicon/**', 15 - ], 16 - }, { 17 - files: ['**/*.js'], 18 - languageOptions: { 19 - ecmaVersion: 2022, 20 - sourceType: 'script', 21 - globals: { 22 - console: 'readonly', 23 - process: 'readonly', 24 - Buffer: 'readonly', 25 - __dirname: 'readonly', 26 - __filename: 'readonly', 27 - module: 'readonly', 28 - require: 'readonly', 29 - exports: 'readonly', 30 - global: 'readonly', 31 - setTimeout: 'readonly', 32 }, 33 }, 34 - plugins: { 35 - prettier: prettierPlugin, 36 }, 37 - rules: { 38 - 'prettier/prettier': 'error', 39 - 'no-unused-vars': 'warn', 40 - 'no-console': 'warn', 41 - }, 42 - }, { 43 - files: ['**/*.ts'], 44 - plugins: { 45 - '@typescript-eslint': tseslint, 46 - prettier: prettierPlugin, 47 - }, 48 - languageOptions: { 49 - parser: tsparser, 50 - ecmaVersion: 2022, 51 - sourceType: 'module', 52 - globals: { 53 - console: 'readonly', 54 - process: 'readonly', 55 - Buffer: 'readonly', 56 - __dirname: 'readonly', 57 - __filename: 'readonly', 58 - module: 'readonly', 59 - require: 'readonly', 60 - exports: 'readonly', 61 - global: 'readonly', 62 - fetch: 'readonly', 63 - // Jest globals 64 - describe: 'readonly', 65 - test: 'readonly', 66 - it: 'readonly', 67 - expect: 'readonly', 68 - beforeAll: 'readonly', 69 - beforeEach: 'readonly', 70 - afterAll: 'readonly', 71 - afterEach: 'readonly', 72 - jest: 'readonly', 73 - URLSearchParams: 'readonly', 74 - setTimeout: 'readonly', 75 - NodeJS: 'readonly', 76 - clearTimeout: 'readonly', 77 - setImmediate: 'readonly', 78 }, 79 - }, 80 - rules: { 81 - 'prettier/prettier': 'error', 82 - 'no-unused-vars': 'off', // Turn off base rule 83 - '@typescript-eslint/no-unused-vars': 'warn', 84 - 'no-console': 'warn', 85 - }, 86 - }, { 87 - files: ['**/*.test.ts', '**/*.spec.ts'], 88 - languageOptions: { 89 - parser: tsparser, 90 - ecmaVersion: 2022, 91 - sourceType: 'module', 92 - globals: { 93 - console: 'readonly', 94 - process: 'readonly', 95 - Buffer: 'readonly', 96 - __dirname: 'readonly', 97 - __filename: 'readonly', 98 - module: 'readonly', 99 - require: 'readonly', 100 - exports: 'readonly', 101 - global: 'readonly', 102 - fetch: 'readonly', 103 - // Jest globals 104 - describe: 'readonly', 105 - test: 'readonly', 106 - it: 'readonly', 107 - expect: 'readonly', 108 - beforeAll: 'readonly', 109 - beforeEach: 'readonly', 110 - afterAll: 'readonly', 111 - afterEach: 'readonly', 112 - jest: 'readonly', 113 - // Browser globals for e2e tests using Playwright 114 - document: 'readonly', 115 - window: 'readonly', 116 - navigator: 'readonly', 117 - location: 'readonly', 118 - setTimeout: 'readonly', 119 - NodeJS: 'readonly', 120 - clearTimeout: 'readonly', 121 }, 122 }, 123 - plugins: { 124 - '@typescript-eslint': tseslint, 125 - prettier: prettierPlugin, 126 - }, 127 - rules: { 128 - 'prettier/prettier': 'error', 129 - 'no-unused-vars': 'off', 130 - '@typescript-eslint/no-unused-vars': 'warn', 131 - 'no-console': 'warn', 132 - }, 133 - }, ...storybook.configs["flat/recommended"]];
··· 1 // For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format 2 + import storybook from 'eslint-plugin-storybook'; 3 4 import js from '@eslint/js'; 5 import prettierPlugin from 'eslint-plugin-prettier'; 6 import tseslint from '@typescript-eslint/eslint-plugin'; 7 import tsparser from '@typescript-eslint/parser'; 8 9 + export default [ 10 + js.configs.recommended, 11 + { 12 + ignores: [ 13 + 'src/webapp/**', 14 + 'dist/**', 15 + 'node_modules/**', 16 + 'src/modules/atproto/infrastructure/lexicon/**', 17 + ], 18 + }, 19 + { 20 + files: ['**/*.js'], 21 + languageOptions: { 22 + ecmaVersion: 2022, 23 + sourceType: 'script', 24 + globals: { 25 + console: 'readonly', 26 + process: 'readonly', 27 + Buffer: 'readonly', 28 + __dirname: 'readonly', 29 + __filename: 'readonly', 30 + module: 'readonly', 31 + require: 'readonly', 32 + exports: 'readonly', 33 + global: 'readonly', 34 + setTimeout: 'readonly', 35 + }, 36 + }, 37 + plugins: { 38 + prettier: prettierPlugin, 39 + }, 40 + rules: { 41 + 'prettier/prettier': 'error', 42 + 'no-unused-vars': 'warn', 43 + 'no-console': 'warn', 44 }, 45 }, 46 + { 47 + files: ['**/*.ts'], 48 + plugins: { 49 + '@typescript-eslint': tseslint, 50 + prettier: prettierPlugin, 51 + }, 52 + languageOptions: { 53 + parser: tsparser, 54 + ecmaVersion: 2022, 55 + sourceType: 'module', 56 + globals: { 57 + console: 'readonly', 58 + process: 'readonly', 59 + Buffer: 'readonly', 60 + __dirname: 'readonly', 61 + __filename: 'readonly', 62 + module: 'readonly', 63 + require: 'readonly', 64 + exports: 'readonly', 65 + global: 'readonly', 66 + fetch: 'readonly', 67 + // Jest globals 68 + describe: 'readonly', 69 + test: 'readonly', 70 + it: 'readonly', 71 + expect: 'readonly', 72 + beforeAll: 'readonly', 73 + beforeEach: 'readonly', 74 + afterAll: 'readonly', 75 + afterEach: 'readonly', 76 + jest: 'readonly', 77 + URLSearchParams: 'readonly', 78 + setTimeout: 'readonly', 79 + NodeJS: 'readonly', 80 + clearTimeout: 'readonly', 81 + setImmediate: 'readonly', 82 + }, 83 + }, 84 + rules: { 85 + 'prettier/prettier': 'error', 86 + 'no-unused-vars': 'off', // Turn off base rule 87 + '@typescript-eslint/no-unused-vars': 'warn', 88 + 'no-console': 'warn', 89 + }, 90 }, 91 + { 92 + files: ['**/*.test.ts', '**/*.spec.ts'], 93 + languageOptions: { 94 + parser: tsparser, 95 + ecmaVersion: 2022, 96 + sourceType: 'module', 97 + globals: { 98 + console: 'readonly', 99 + process: 'readonly', 100 + Buffer: 'readonly', 101 + __dirname: 'readonly', 102 + __filename: 'readonly', 103 + module: 'readonly', 104 + require: 'readonly', 105 + exports: 'readonly', 106 + global: 'readonly', 107 + fetch: 'readonly', 108 + // Jest globals 109 + describe: 'readonly', 110 + test: 'readonly', 111 + it: 'readonly', 112 + expect: 'readonly', 113 + beforeAll: 'readonly', 114 + beforeEach: 'readonly', 115 + afterAll: 'readonly', 116 + afterEach: 'readonly', 117 + jest: 'readonly', 118 + // Browser globals for e2e tests using Playwright 119 + document: 'readonly', 120 + window: 'readonly', 121 + navigator: 'readonly', 122 + location: 'readonly', 123 + setTimeout: 'readonly', 124 + NodeJS: 'readonly', 125 + clearTimeout: 'readonly', 126 + }, 127 + }, 128 + plugins: { 129 + '@typescript-eslint': tseslint, 130 + prettier: prettierPlugin, 131 }, 132 + rules: { 133 + 'prettier/prettier': 'error', 134 + 'no-unused-vars': 'off', 135 + '@typescript-eslint/no-unused-vars': 'warn', 136 + 'no-console': 'warn', 137 }, 138 }, 139 + ...storybook.configs['flat/recommended'], 140 + ];
+587
package-lock.json
··· 48 "eslint": "^9.31.0", 49 "eslint-config-prettier": "^10.1.5", 50 "eslint-plugin-prettier": "^5.5.1", 51 "jest": "^29.7.0", 52 "jsdom": "^26.1.0", 53 "pg": "^8.14.1", ··· 60 "tsup": "^8.4.0", 61 "typescript": "^5.8.3" 62 } 63 }, 64 "node_modules/@ampproject/remapping": { 65 "version": "2.3.0", ··· 1444 }, 1445 "peerDependencies": { 1446 "@babel/core": "^7.0.0-0" 1447 } 1448 }, 1449 "node_modules/@babel/template": { ··· 4152 "@sinonjs/commons": "^3.0.0" 4153 } 4154 }, 4155 "node_modules/@testcontainers/postgresql": { 4156 "version": "11.0.3", 4157 "resolved": "https://registry.npmjs.org/@testcontainers/postgresql/-/postgresql-11.0.3.tgz", ··· 4170 "testcontainers": "^11.4.0" 4171 } 4172 }, 4173 "node_modules/@ts-morph/common": { 4174 "version": "0.25.0", 4175 "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.25.0.tgz", ··· 4204 "funding": { 4205 "url": "https://github.com/sponsors/isaacs" 4206 } 4207 }, 4208 "node_modules/@types/babel__core": { 4209 "version": "7.20.5", ··· 4256 "@types/node": "*" 4257 } 4258 }, 4259 "node_modules/@types/connect": { 4260 "version": "3.4.38", 4261 "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", ··· 4279 "dependencies": { 4280 "@types/node": "*" 4281 } 4282 }, 4283 "node_modules/@types/docker-modem": { 4284 "version": "3.0.6", ··· 4826 "url": "https://opencollective.com/typescript-eslint" 4827 } 4828 }, 4829 "node_modules/abort-controller": { 4830 "version": "3.0.0", 4831 "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", ··· 5061 "sprintf-js": "~1.0.2" 5062 } 5063 }, 5064 "node_modules/array-flatten": { 5065 "version": "1.1.1", 5066 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", ··· 5081 "safer-buffer": "~2.1.0" 5082 } 5083 }, 5084 "node_modules/async": { 5085 "version": "3.2.6", 5086 "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", ··· 5332 "dev": true, 5333 "dependencies": { 5334 "tweetnacl": "^0.14.3" 5335 } 5336 }, 5337 "node_modules/bl": { ··· 5710 "cborg": "cli.js" 5711 } 5712 }, 5713 "node_modules/chalk": { 5714 "version": "4.1.2", 5715 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", ··· 5741 "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 5742 "dev": true 5743 }, 5744 "node_modules/chokidar": { 5745 "version": "4.0.3", 5746 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", ··· 6129 "node": ">= 8" 6130 } 6131 }, 6132 "node_modules/cssstyle": { 6133 "version": "4.6.0", 6134 "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", ··· 6191 } 6192 } 6193 }, 6194 "node_modules/deep-is": { 6195 "version": "0.1.4", 6196 "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", ··· 6204 "dev": true, 6205 "engines": { 6206 "node": ">=0.10.0" 6207 } 6208 }, 6209 "node_modules/delayed-stream": { ··· 6231 "node": ">= 0.8" 6232 } 6233 }, 6234 "node_modules/destroy": { 6235 "version": "1.2.0", 6236 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", ··· 6399 "bin": { 6400 "uuid": "dist/bin/uuid" 6401 } 6402 }, 6403 "node_modules/dotenv": { 6404 "version": "16.6.1", ··· 6902 } 6903 } 6904 }, 6905 "node_modules/eslint-scope": { 6906 "version": "8.4.0", 6907 "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", ··· 7051 "node": ">=4.0" 7052 } 7053 }, 7054 "node_modules/esutils": { 7055 "version": "2.0.3", 7056 "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", ··· 7910 "node": ">=0.8.19" 7911 } 7912 }, 7913 "node_modules/inflight": { 7914 "version": "1.0.6", 7915 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", ··· 8004 "url": "https://github.com/sponsors/ljharb" 8005 } 8006 }, 8007 "node_modules/is-extglob": { 8008 "version": "2.1.1", 8009 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", ··· 8075 "url": "https://github.com/sponsors/sindresorhus" 8076 } 8077 }, 8078 "node_modules/isarray": { 8079 "version": "1.0.0", 8080 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", ··· 9156 "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", 9157 "dev": true 9158 }, 9159 "node_modules/lru-cache": { 9160 "version": "10.4.3", 9161 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", ··· 9167 "integrity": "sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==", 9168 "engines": { 9169 "node": ">=12" 9170 } 9171 }, 9172 "node_modules/magic-string": { ··· 9321 "dev": true, 9322 "engines": { 9323 "node": ">=6" 9324 } 9325 }, 9326 "node_modules/minimatch": { ··· 9596 "url": "https://github.com/sponsors/sindresorhus" 9597 } 9598 }, 9599 "node_modules/optionator": { 9600 "version": "0.9.4", 9601 "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", ··· 9857 "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 9858 "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 9859 "dev": true 9860 }, 9861 "node_modules/pg": { 9862 "version": "8.16.3", ··· 10513 "node": ">= 12.13.0" 10514 } 10515 }, 10516 "node_modules/redis-errors": { 10517 "version": "1.2.0", 10518 "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", ··· 11074 "node": ">= 0.8" 11075 } 11076 }, 11077 "node_modules/streamx": { 11078 "version": "2.22.1", 11079 "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", ··· 11178 "dev": true, 11179 "engines": { 11180 "node": ">=6" 11181 } 11182 }, 11183 "node_modules/strip-json-comments": { ··· 11463 "real-require": "^0.2.0" 11464 } 11465 }, 11466 "node_modules/tinyexec": { 11467 "version": "0.3.2", 11468 "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", ··· 11509 }, 11510 "funding": { 11511 "url": "https://github.com/sponsors/jonschlinkert" 11512 } 11513 }, 11514 "node_modules/tlds": {
··· 48 "eslint": "^9.31.0", 49 "eslint-config-prettier": "^10.1.5", 50 "eslint-plugin-prettier": "^5.5.1", 51 + "eslint-plugin-storybook": "^9.1.2", 52 "jest": "^29.7.0", 53 "jsdom": "^26.1.0", 54 "pg": "^8.14.1", ··· 61 "tsup": "^8.4.0", 62 "typescript": "^5.8.3" 63 } 64 + }, 65 + "node_modules/@adobe/css-tools": { 66 + "version": "4.4.4", 67 + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", 68 + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", 69 + "dev": true, 70 + "peer": true 71 }, 72 "node_modules/@ampproject/remapping": { 73 "version": "2.3.0", ··· 1452 }, 1453 "peerDependencies": { 1454 "@babel/core": "^7.0.0-0" 1455 + } 1456 + }, 1457 + "node_modules/@babel/runtime": { 1458 + "version": "7.28.4", 1459 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", 1460 + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", 1461 + "dev": true, 1462 + "peer": true, 1463 + "engines": { 1464 + "node": ">=6.9.0" 1465 } 1466 }, 1467 "node_modules/@babel/template": { ··· 4170 "@sinonjs/commons": "^3.0.0" 4171 } 4172 }, 4173 + "node_modules/@storybook/global": { 4174 + "version": "5.0.0", 4175 + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", 4176 + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", 4177 + "dev": true, 4178 + "peer": true 4179 + }, 4180 "node_modules/@testcontainers/postgresql": { 4181 "version": "11.0.3", 4182 "resolved": "https://registry.npmjs.org/@testcontainers/postgresql/-/postgresql-11.0.3.tgz", ··· 4195 "testcontainers": "^11.4.0" 4196 } 4197 }, 4198 + "node_modules/@testing-library/dom": { 4199 + "version": "10.4.1", 4200 + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", 4201 + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", 4202 + "dev": true, 4203 + "peer": true, 4204 + "dependencies": { 4205 + "@babel/code-frame": "^7.10.4", 4206 + "@babel/runtime": "^7.12.5", 4207 + "@types/aria-query": "^5.0.1", 4208 + "aria-query": "5.3.0", 4209 + "dom-accessibility-api": "^0.5.9", 4210 + "lz-string": "^1.5.0", 4211 + "picocolors": "1.1.1", 4212 + "pretty-format": "^27.0.2" 4213 + }, 4214 + "engines": { 4215 + "node": ">=18" 4216 + } 4217 + }, 4218 + "node_modules/@testing-library/dom/node_modules/ansi-styles": { 4219 + "version": "5.2.0", 4220 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 4221 + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 4222 + "dev": true, 4223 + "peer": true, 4224 + "engines": { 4225 + "node": ">=10" 4226 + }, 4227 + "funding": { 4228 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 4229 + } 4230 + }, 4231 + "node_modules/@testing-library/dom/node_modules/pretty-format": { 4232 + "version": "27.5.1", 4233 + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", 4234 + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", 4235 + "dev": true, 4236 + "peer": true, 4237 + "dependencies": { 4238 + "ansi-regex": "^5.0.1", 4239 + "ansi-styles": "^5.0.0", 4240 + "react-is": "^17.0.1" 4241 + }, 4242 + "engines": { 4243 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" 4244 + } 4245 + }, 4246 + "node_modules/@testing-library/dom/node_modules/react-is": { 4247 + "version": "17.0.2", 4248 + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", 4249 + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", 4250 + "dev": true, 4251 + "peer": true 4252 + }, 4253 + "node_modules/@testing-library/jest-dom": { 4254 + "version": "6.8.0", 4255 + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.8.0.tgz", 4256 + "integrity": "sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==", 4257 + "dev": true, 4258 + "peer": true, 4259 + "dependencies": { 4260 + "@adobe/css-tools": "^4.4.0", 4261 + "aria-query": "^5.0.0", 4262 + "css.escape": "^1.5.1", 4263 + "dom-accessibility-api": "^0.6.3", 4264 + "picocolors": "^1.1.1", 4265 + "redent": "^3.0.0" 4266 + }, 4267 + "engines": { 4268 + "node": ">=14", 4269 + "npm": ">=6", 4270 + "yarn": ">=1" 4271 + } 4272 + }, 4273 + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { 4274 + "version": "0.6.3", 4275 + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", 4276 + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", 4277 + "dev": true, 4278 + "peer": true 4279 + }, 4280 + "node_modules/@testing-library/user-event": { 4281 + "version": "14.6.1", 4282 + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", 4283 + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", 4284 + "dev": true, 4285 + "peer": true, 4286 + "engines": { 4287 + "node": ">=12", 4288 + "npm": ">=6" 4289 + }, 4290 + "peerDependencies": { 4291 + "@testing-library/dom": ">=7.21.4" 4292 + } 4293 + }, 4294 "node_modules/@ts-morph/common": { 4295 "version": "0.25.0", 4296 "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.25.0.tgz", ··· 4325 "funding": { 4326 "url": "https://github.com/sponsors/isaacs" 4327 } 4328 + }, 4329 + "node_modules/@types/aria-query": { 4330 + "version": "5.0.4", 4331 + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", 4332 + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", 4333 + "dev": true, 4334 + "peer": true 4335 }, 4336 "node_modules/@types/babel__core": { 4337 "version": "7.20.5", ··· 4384 "@types/node": "*" 4385 } 4386 }, 4387 + "node_modules/@types/chai": { 4388 + "version": "5.2.2", 4389 + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", 4390 + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", 4391 + "dev": true, 4392 + "peer": true, 4393 + "dependencies": { 4394 + "@types/deep-eql": "*" 4395 + } 4396 + }, 4397 "node_modules/@types/connect": { 4398 "version": "3.4.38", 4399 "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", ··· 4417 "dependencies": { 4418 "@types/node": "*" 4419 } 4420 + }, 4421 + "node_modules/@types/deep-eql": { 4422 + "version": "4.0.2", 4423 + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", 4424 + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", 4425 + "dev": true, 4426 + "peer": true 4427 }, 4428 "node_modules/@types/docker-modem": { 4429 "version": "3.0.6", ··· 4971 "url": "https://opencollective.com/typescript-eslint" 4972 } 4973 }, 4974 + "node_modules/@vitest/expect": { 4975 + "version": "3.2.4", 4976 + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", 4977 + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", 4978 + "dev": true, 4979 + "peer": true, 4980 + "dependencies": { 4981 + "@types/chai": "^5.2.2", 4982 + "@vitest/spy": "3.2.4", 4983 + "@vitest/utils": "3.2.4", 4984 + "chai": "^5.2.0", 4985 + "tinyrainbow": "^2.0.0" 4986 + }, 4987 + "funding": { 4988 + "url": "https://opencollective.com/vitest" 4989 + } 4990 + }, 4991 + "node_modules/@vitest/mocker": { 4992 + "version": "3.2.4", 4993 + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", 4994 + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", 4995 + "dev": true, 4996 + "peer": true, 4997 + "dependencies": { 4998 + "@vitest/spy": "3.2.4", 4999 + "estree-walker": "^3.0.3", 5000 + "magic-string": "^0.30.17" 5001 + }, 5002 + "funding": { 5003 + "url": "https://opencollective.com/vitest" 5004 + }, 5005 + "peerDependencies": { 5006 + "msw": "^2.4.9", 5007 + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" 5008 + }, 5009 + "peerDependenciesMeta": { 5010 + "msw": { 5011 + "optional": true 5012 + }, 5013 + "vite": { 5014 + "optional": true 5015 + } 5016 + } 5017 + }, 5018 + "node_modules/@vitest/pretty-format": { 5019 + "version": "3.2.4", 5020 + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", 5021 + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", 5022 + "dev": true, 5023 + "peer": true, 5024 + "dependencies": { 5025 + "tinyrainbow": "^2.0.0" 5026 + }, 5027 + "funding": { 5028 + "url": "https://opencollective.com/vitest" 5029 + } 5030 + }, 5031 + "node_modules/@vitest/spy": { 5032 + "version": "3.2.4", 5033 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", 5034 + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", 5035 + "dev": true, 5036 + "peer": true, 5037 + "dependencies": { 5038 + "tinyspy": "^4.0.3" 5039 + }, 5040 + "funding": { 5041 + "url": "https://opencollective.com/vitest" 5042 + } 5043 + }, 5044 + "node_modules/@vitest/utils": { 5045 + "version": "3.2.4", 5046 + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", 5047 + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", 5048 + "dev": true, 5049 + "peer": true, 5050 + "dependencies": { 5051 + "@vitest/pretty-format": "3.2.4", 5052 + "loupe": "^3.1.4", 5053 + "tinyrainbow": "^2.0.0" 5054 + }, 5055 + "funding": { 5056 + "url": "https://opencollective.com/vitest" 5057 + } 5058 + }, 5059 "node_modules/abort-controller": { 5060 "version": "3.0.0", 5061 "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", ··· 5291 "sprintf-js": "~1.0.2" 5292 } 5293 }, 5294 + "node_modules/aria-query": { 5295 + "version": "5.3.0", 5296 + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", 5297 + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", 5298 + "dev": true, 5299 + "peer": true, 5300 + "dependencies": { 5301 + "dequal": "^2.0.3" 5302 + } 5303 + }, 5304 "node_modules/array-flatten": { 5305 "version": "1.1.1", 5306 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", ··· 5321 "safer-buffer": "~2.1.0" 5322 } 5323 }, 5324 + "node_modules/assertion-error": { 5325 + "version": "2.0.1", 5326 + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 5327 + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 5328 + "dev": true, 5329 + "peer": true, 5330 + "engines": { 5331 + "node": ">=12" 5332 + } 5333 + }, 5334 + "node_modules/ast-types": { 5335 + "version": "0.16.1", 5336 + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", 5337 + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", 5338 + "dev": true, 5339 + "peer": true, 5340 + "dependencies": { 5341 + "tslib": "^2.0.1" 5342 + }, 5343 + "engines": { 5344 + "node": ">=4" 5345 + } 5346 + }, 5347 "node_modules/async": { 5348 "version": "3.2.6", 5349 "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", ··· 5595 "dev": true, 5596 "dependencies": { 5597 "tweetnacl": "^0.14.3" 5598 + } 5599 + }, 5600 + "node_modules/better-opn": { 5601 + "version": "3.0.2", 5602 + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", 5603 + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", 5604 + "dev": true, 5605 + "peer": true, 5606 + "dependencies": { 5607 + "open": "^8.0.4" 5608 + }, 5609 + "engines": { 5610 + "node": ">=12.0.0" 5611 } 5612 }, 5613 "node_modules/bl": { ··· 5986 "cborg": "cli.js" 5987 } 5988 }, 5989 + "node_modules/chai": { 5990 + "version": "5.3.3", 5991 + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", 5992 + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", 5993 + "dev": true, 5994 + "peer": true, 5995 + "dependencies": { 5996 + "assertion-error": "^2.0.1", 5997 + "check-error": "^2.1.1", 5998 + "deep-eql": "^5.0.1", 5999 + "loupe": "^3.1.0", 6000 + "pathval": "^2.0.0" 6001 + }, 6002 + "engines": { 6003 + "node": ">=18" 6004 + } 6005 + }, 6006 "node_modules/chalk": { 6007 "version": "4.1.2", 6008 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", ··· 6034 "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 6035 "dev": true 6036 }, 6037 + "node_modules/check-error": { 6038 + "version": "2.1.1", 6039 + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", 6040 + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", 6041 + "dev": true, 6042 + "peer": true, 6043 + "engines": { 6044 + "node": ">= 16" 6045 + } 6046 + }, 6047 "node_modules/chokidar": { 6048 "version": "4.0.3", 6049 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", ··· 6432 "node": ">= 8" 6433 } 6434 }, 6435 + "node_modules/css.escape": { 6436 + "version": "1.5.1", 6437 + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", 6438 + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", 6439 + "dev": true, 6440 + "peer": true 6441 + }, 6442 "node_modules/cssstyle": { 6443 "version": "4.6.0", 6444 "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", ··· 6501 } 6502 } 6503 }, 6504 + "node_modules/deep-eql": { 6505 + "version": "5.0.2", 6506 + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", 6507 + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", 6508 + "dev": true, 6509 + "peer": true, 6510 + "engines": { 6511 + "node": ">=6" 6512 + } 6513 + }, 6514 "node_modules/deep-is": { 6515 "version": "0.1.4", 6516 "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", ··· 6524 "dev": true, 6525 "engines": { 6526 "node": ">=0.10.0" 6527 + } 6528 + }, 6529 + "node_modules/define-lazy-prop": { 6530 + "version": "2.0.0", 6531 + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", 6532 + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", 6533 + "dev": true, 6534 + "peer": true, 6535 + "engines": { 6536 + "node": ">=8" 6537 } 6538 }, 6539 "node_modules/delayed-stream": { ··· 6561 "node": ">= 0.8" 6562 } 6563 }, 6564 + "node_modules/dequal": { 6565 + "version": "2.0.3", 6566 + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 6567 + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 6568 + "dev": true, 6569 + "peer": true, 6570 + "engines": { 6571 + "node": ">=6" 6572 + } 6573 + }, 6574 "node_modules/destroy": { 6575 "version": "1.2.0", 6576 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", ··· 6739 "bin": { 6740 "uuid": "dist/bin/uuid" 6741 } 6742 + }, 6743 + "node_modules/dom-accessibility-api": { 6744 + "version": "0.5.16", 6745 + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", 6746 + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", 6747 + "dev": true, 6748 + "peer": true 6749 }, 6750 "node_modules/dotenv": { 6751 "version": "16.6.1", ··· 7249 } 7250 } 7251 }, 7252 + "node_modules/eslint-plugin-storybook": { 7253 + "version": "9.1.4", 7254 + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-9.1.4.tgz", 7255 + "integrity": "sha512-IiIqGFo524PDELajyDLMtceikHpDUKBF6QlH5oJECy+xV3e0DHJkcuyokwxWveb1yg7tHfTLimCKNix2ftRETg==", 7256 + "dev": true, 7257 + "dependencies": { 7258 + "@typescript-eslint/utils": "^8.8.1" 7259 + }, 7260 + "engines": { 7261 + "node": ">=20.0.0" 7262 + }, 7263 + "peerDependencies": { 7264 + "eslint": ">=8", 7265 + "storybook": "^9.1.4" 7266 + } 7267 + }, 7268 "node_modules/eslint-scope": { 7269 "version": "8.4.0", 7270 "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", ··· 7414 "node": ">=4.0" 7415 } 7416 }, 7417 + "node_modules/estree-walker": { 7418 + "version": "3.0.3", 7419 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 7420 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 7421 + "dev": true, 7422 + "peer": true, 7423 + "dependencies": { 7424 + "@types/estree": "^1.0.0" 7425 + } 7426 + }, 7427 "node_modules/esutils": { 7428 "version": "2.0.3", 7429 "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", ··· 8283 "node": ">=0.8.19" 8284 } 8285 }, 8286 + "node_modules/indent-string": { 8287 + "version": "4.0.0", 8288 + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 8289 + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 8290 + "dev": true, 8291 + "peer": true, 8292 + "engines": { 8293 + "node": ">=8" 8294 + } 8295 + }, 8296 "node_modules/inflight": { 8297 "version": "1.0.6", 8298 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", ··· 8387 "url": "https://github.com/sponsors/ljharb" 8388 } 8389 }, 8390 + "node_modules/is-docker": { 8391 + "version": "2.2.1", 8392 + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", 8393 + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", 8394 + "dev": true, 8395 + "peer": true, 8396 + "bin": { 8397 + "is-docker": "cli.js" 8398 + }, 8399 + "engines": { 8400 + "node": ">=8" 8401 + }, 8402 + "funding": { 8403 + "url": "https://github.com/sponsors/sindresorhus" 8404 + } 8405 + }, 8406 "node_modules/is-extglob": { 8407 "version": "2.1.1", 8408 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", ··· 8474 "url": "https://github.com/sponsors/sindresorhus" 8475 } 8476 }, 8477 + "node_modules/is-wsl": { 8478 + "version": "2.2.0", 8479 + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 8480 + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 8481 + "dev": true, 8482 + "peer": true, 8483 + "dependencies": { 8484 + "is-docker": "^2.0.0" 8485 + }, 8486 + "engines": { 8487 + "node": ">=8" 8488 + } 8489 + }, 8490 "node_modules/isarray": { 8491 "version": "1.0.0", 8492 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", ··· 9568 "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", 9569 "dev": true 9570 }, 9571 + "node_modules/loupe": { 9572 + "version": "3.2.1", 9573 + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", 9574 + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", 9575 + "dev": true, 9576 + "peer": true 9577 + }, 9578 "node_modules/lru-cache": { 9579 "version": "10.4.3", 9580 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", ··· 9586 "integrity": "sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==", 9587 "engines": { 9588 "node": ">=12" 9589 + } 9590 + }, 9591 + "node_modules/lz-string": { 9592 + "version": "1.5.0", 9593 + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", 9594 + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", 9595 + "dev": true, 9596 + "peer": true, 9597 + "bin": { 9598 + "lz-string": "bin/bin.js" 9599 } 9600 }, 9601 "node_modules/magic-string": { ··· 9750 "dev": true, 9751 "engines": { 9752 "node": ">=6" 9753 + } 9754 + }, 9755 + "node_modules/min-indent": { 9756 + "version": "1.0.1", 9757 + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", 9758 + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", 9759 + "dev": true, 9760 + "peer": true, 9761 + "engines": { 9762 + "node": ">=4" 9763 } 9764 }, 9765 "node_modules/minimatch": { ··· 10035 "url": "https://github.com/sponsors/sindresorhus" 10036 } 10037 }, 10038 + "node_modules/open": { 10039 + "version": "8.4.2", 10040 + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", 10041 + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", 10042 + "dev": true, 10043 + "peer": true, 10044 + "dependencies": { 10045 + "define-lazy-prop": "^2.0.0", 10046 + "is-docker": "^2.1.1", 10047 + "is-wsl": "^2.2.0" 10048 + }, 10049 + "engines": { 10050 + "node": ">=12" 10051 + }, 10052 + "funding": { 10053 + "url": "https://github.com/sponsors/sindresorhus" 10054 + } 10055 + }, 10056 "node_modules/optionator": { 10057 "version": "0.9.4", 10058 "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", ··· 10314 "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 10315 "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 10316 "dev": true 10317 + }, 10318 + "node_modules/pathval": { 10319 + "version": "2.0.1", 10320 + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", 10321 + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", 10322 + "dev": true, 10323 + "peer": true, 10324 + "engines": { 10325 + "node": ">= 14.16" 10326 + } 10327 }, 10328 "node_modules/pg": { 10329 "version": "8.16.3", ··· 10980 "node": ">= 12.13.0" 10981 } 10982 }, 10983 + "node_modules/recast": { 10984 + "version": "0.23.11", 10985 + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", 10986 + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", 10987 + "dev": true, 10988 + "peer": true, 10989 + "dependencies": { 10990 + "ast-types": "^0.16.1", 10991 + "esprima": "~4.0.0", 10992 + "source-map": "~0.6.1", 10993 + "tiny-invariant": "^1.3.3", 10994 + "tslib": "^2.0.1" 10995 + }, 10996 + "engines": { 10997 + "node": ">= 4" 10998 + } 10999 + }, 11000 + "node_modules/redent": { 11001 + "version": "3.0.0", 11002 + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", 11003 + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", 11004 + "dev": true, 11005 + "peer": true, 11006 + "dependencies": { 11007 + "indent-string": "^4.0.0", 11008 + "strip-indent": "^3.0.0" 11009 + }, 11010 + "engines": { 11011 + "node": ">=8" 11012 + } 11013 + }, 11014 "node_modules/redis-errors": { 11015 "version": "1.2.0", 11016 "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", ··· 11572 "node": ">= 0.8" 11573 } 11574 }, 11575 + "node_modules/storybook": { 11576 + "version": "9.1.4", 11577 + "resolved": "https://registry.npmjs.org/storybook/-/storybook-9.1.4.tgz", 11578 + "integrity": "sha512-xMMUKQzAbVJlDUNbCyZ67fJSnomGv+SQw5PDcRWwhYvU72cwhBvGf/UYXi/ylSzMaUHudhOmmn1lZH88lcShsg==", 11579 + "dev": true, 11580 + "peer": true, 11581 + "dependencies": { 11582 + "@storybook/global": "^5.0.0", 11583 + "@testing-library/jest-dom": "^6.6.3", 11584 + "@testing-library/user-event": "^14.6.1", 11585 + "@vitest/expect": "3.2.4", 11586 + "@vitest/mocker": "3.2.4", 11587 + "@vitest/spy": "3.2.4", 11588 + "better-opn": "^3.0.2", 11589 + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", 11590 + "esbuild-register": "^3.5.0", 11591 + "recast": "^0.23.5", 11592 + "semver": "^7.6.2", 11593 + "ws": "^8.18.0" 11594 + }, 11595 + "bin": { 11596 + "storybook": "bin/index.cjs" 11597 + }, 11598 + "funding": { 11599 + "type": "opencollective", 11600 + "url": "https://opencollective.com/storybook" 11601 + }, 11602 + "peerDependencies": { 11603 + "prettier": "^2 || ^3" 11604 + }, 11605 + "peerDependenciesMeta": { 11606 + "prettier": { 11607 + "optional": true 11608 + } 11609 + } 11610 + }, 11611 + "node_modules/storybook/node_modules/semver": { 11612 + "version": "7.7.2", 11613 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", 11614 + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 11615 + "dev": true, 11616 + "peer": true, 11617 + "bin": { 11618 + "semver": "bin/semver.js" 11619 + }, 11620 + "engines": { 11621 + "node": ">=10" 11622 + } 11623 + }, 11624 "node_modules/streamx": { 11625 "version": "2.22.1", 11626 "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", ··· 11725 "dev": true, 11726 "engines": { 11727 "node": ">=6" 11728 + } 11729 + }, 11730 + "node_modules/strip-indent": { 11731 + "version": "3.0.0", 11732 + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", 11733 + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", 11734 + "dev": true, 11735 + "peer": true, 11736 + "dependencies": { 11737 + "min-indent": "^1.0.0" 11738 + }, 11739 + "engines": { 11740 + "node": ">=8" 11741 } 11742 }, 11743 "node_modules/strip-json-comments": { ··· 12023 "real-require": "^0.2.0" 12024 } 12025 }, 12026 + "node_modules/tiny-invariant": { 12027 + "version": "1.3.3", 12028 + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", 12029 + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", 12030 + "dev": true, 12031 + "peer": true 12032 + }, 12033 "node_modules/tinyexec": { 12034 "version": "0.3.2", 12035 "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", ··· 12076 }, 12077 "funding": { 12078 "url": "https://github.com/sponsors/jonschlinkert" 12079 + } 12080 + }, 12081 + "node_modules/tinyrainbow": { 12082 + "version": "2.0.0", 12083 + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", 12084 + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", 12085 + "dev": true, 12086 + "peer": true, 12087 + "engines": { 12088 + "node": ">=14.0.0" 12089 + } 12090 + }, 12091 + "node_modules/tinyspy": { 12092 + "version": "4.0.3", 12093 + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", 12094 + "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", 12095 + "dev": true, 12096 + "peer": true, 12097 + "engines": { 12098 + "node": ">=14.0.0" 12099 } 12100 }, 12101 "node_modules/tlds": {
+1
package.json
··· 89 "eslint": "^9.31.0", 90 "eslint-config-prettier": "^10.1.5", 91 "eslint-plugin-prettier": "^5.5.1", 92 "jest": "^29.7.0", 93 "jsdom": "^26.1.0", 94 "pg": "^8.14.1",
··· 89 "eslint": "^9.31.0", 90 "eslint-config-prettier": "^10.1.5", 91 "eslint-plugin-prettier": "^5.5.1", 92 + "eslint-plugin-storybook": "^9.1.2", 93 "jest": "^29.7.0", 94 "jsdom": "^26.1.0", 95 "pg": "^8.14.1",
+14 -3
src/modules/cards/infrastructure/http/controllers/RemoveCardFromCollectionController.ts
··· 13 async executeImpl(req: AuthenticatedRequest, res: Response): Promise<any> { 14 try { 15 const { cardId } = req.params; 16 - const { collectionIds } = req.body; 17 const curatorId = req.did; 18 19 if (!curatorId) { ··· 24 return this.badRequest(res, 'Card ID is required'); 25 } 26 27 - if (!collectionIds || !Array.isArray(collectionIds)) { 28 - return this.badRequest(res, 'Collection IDs array is required'); 29 } 30 31 const result = await this.removeCardFromCollectionUseCase.execute({
··· 13 async executeImpl(req: AuthenticatedRequest, res: Response): Promise<any> { 14 try { 15 const { cardId } = req.params; 16 + const { collectionIds: collectionIdsParam } = req.query; 17 const curatorId = req.did; 18 19 if (!curatorId) { ··· 24 return this.badRequest(res, 'Card ID is required'); 25 } 26 27 + if (!collectionIdsParam || typeof collectionIdsParam !== 'string') { 28 + return this.badRequest( 29 + res, 30 + 'Collection IDs query parameter is required', 31 + ); 32 + } 33 + 34 + const collectionIds = collectionIdsParam 35 + .split(',') 36 + .filter((id) => id.trim() !== ''); 37 + 38 + if (collectionIds.length === 0) { 39 + return this.badRequest(res, 'At least one collection ID is required'); 40 } 41 42 const result = await this.removeCardFromCollectionUseCase.execute({
+2 -2
src/webapp/.storybook/vitest.setup.ts
··· 1 - import * as a11yAddonAnnotations from "@storybook/addon-a11y/preview"; 2 import { setProjectAnnotations } from '@storybook/nextjs-vite'; 3 import * as projectAnnotations from './preview'; 4 5 // This is an important step to apply the right configuration when testing your stories. 6 // More info at: https://storybook.js.org/docs/api/portable-stories/portable-stories-vitest#setprojectannotations 7 - setProjectAnnotations([a11yAddonAnnotations, projectAnnotations]);
··· 1 + import * as a11yAddonAnnotations from '@storybook/addon-a11y/preview'; 2 import { setProjectAnnotations } from '@storybook/nextjs-vite'; 3 import * as projectAnnotations from './preview'; 4 5 // This is an important step to apply the right configuration when testing your stories. 6 // More info at: https://storybook.js.org/docs/api/portable-stories/portable-stories-vitest#setprojectannotations 7 + setProjectAnnotations([a11yAddonAnnotations, projectAnnotations]);
+2 -4
src/webapp/api-client/clients/CardClient.ts
··· 69 async removeCardFromCollection( 70 request: RemoveCardFromCollectionRequest, 71 ): Promise<RemoveCardFromCollectionResponse> { 72 return this.request<RemoveCardFromCollectionResponse>( 73 'DELETE', 74 - `/api/cards/${request.cardId}/collections`, 75 - { 76 - collectionIds: request.collectionIds, 77 - }, 78 ); 79 } 80 }
··· 69 async removeCardFromCollection( 70 request: RemoveCardFromCollectionRequest, 71 ): Promise<RemoveCardFromCollectionResponse> { 72 + const collectionIdsParam = request.collectionIds.join(','); 73 return this.request<RemoveCardFromCollectionResponse>( 74 'DELETE', 75 + `/api/cards/${request.cardId}/collections?collectionIds=${encodeURIComponent(collectionIdsParam)}`, 76 ); 77 } 78 }
+61 -53
src/webapp/app/login/page.tsx
··· 17 import { IoMdHelpCircleOutline } from 'react-icons/io'; 18 import SembleLogo from '@/assets/semble-logo.svg'; 19 import { useAuth } from '@/hooks/useAuth'; 20 - import { useRouter } from 'next/navigation'; 21 22 - export default function Page() { 23 const { isAuthenticated, isLoading } = useAuth(); 24 const [isRedirecting, setIsRedirecting] = useState(false); 25 const router = useRouter(); 26 27 useEffect(() => { 28 - if (isAuthenticated) { 29 setIsRedirecting(true); 30 31 // redirect after 1 second ··· 55 } 56 57 return ( 58 - <Suspense> 59 - <Stack gap="xl" maw={300}> 60 - <Stack gap={'xs'}> 61 - <Image 62 - src={SembleLogo.src} 63 - alt="Semble logo" 64 - w={48} 65 - h={64.5} 66 - mx={'auto'} 67 - /> 68 - <Title order={1} ta="center"> 69 - Welcome back 70 - </Title> 71 - </Stack> 72 - <LoginForm /> 73 - <Stack align="center" gap={0}> 74 - <Text fw={500} c={'stone'}> 75 - {"Don't have an account? "} 76 - <Anchor href="/signup" fw={500}> 77 - Sign up 78 - </Anchor> 79 - </Text> 80 - <Popover withArrow shadow="md"> 81 - <PopoverTarget> 82 - <Button 83 - variant="white" 84 - size="md" 85 fw={500} 86 - fs={'italic'} 87 - c={'stone'} 88 - rightSection={<IoMdHelpCircleOutline size={22} />} 89 > 90 - How your Cosmik Network account works 91 - </Button> 92 - </PopoverTarget> 93 - <PopoverDropdown> 94 - <Text fw={500} ta="center" maw={380}> 95 - When you sign up today, you’ll create a Bluesky account. In near 96 - future, your account will be seamlessly migrated to our{' '} 97 - <Anchor 98 - href="https://cosmik.network" 99 - target="_blank" 100 - fw={500} 101 - c={'blue'} 102 - > 103 - Cosmik Network 104 - </Anchor> 105 - . 106 - </Text> 107 - </PopoverDropdown> 108 - </Popover> 109 - </Stack> 110 </Stack> 111 </Suspense> 112 ); 113 }
··· 17 import { IoMdHelpCircleOutline } from 'react-icons/io'; 18 import SembleLogo from '@/assets/semble-logo.svg'; 19 import { useAuth } from '@/hooks/useAuth'; 20 + import { useRouter, useSearchParams } from 'next/navigation'; 21 22 + function InnerPage() { 23 const { isAuthenticated, isLoading } = useAuth(); 24 const [isRedirecting, setIsRedirecting] = useState(false); 25 const router = useRouter(); 26 + const searchParams = useSearchParams(); 27 + const isExtensionLogin = searchParams.get('extension-login') === 'true'; 28 29 useEffect(() => { 30 + if (isAuthenticated && !isExtensionLogin) { 31 setIsRedirecting(true); 32 33 // redirect after 1 second ··· 57 } 58 59 return ( 60 + <Stack gap="xl" maw={300}> 61 + <Stack gap={'xs'}> 62 + <Image 63 + src={SembleLogo.src} 64 + alt="Semble logo" 65 + w={48} 66 + h={64.5} 67 + mx={'auto'} 68 + /> 69 + <Title order={1} ta="center"> 70 + Welcome back 71 + </Title> 72 + </Stack> 73 + <LoginForm /> 74 + <Stack align="center" gap={0}> 75 + <Text fw={500} c={'stone'}> 76 + {"Don't have an account? "} 77 + <Anchor href="/signup" fw={500}> 78 + Sign up 79 + </Anchor> 80 + </Text> 81 + <Popover withArrow shadow="md"> 82 + <PopoverTarget> 83 + <Button 84 + variant="white" 85 + size="md" 86 + fw={500} 87 + fs={'italic'} 88 + c={'stone'} 89 + rightSection={<IoMdHelpCircleOutline size={22} />} 90 + > 91 + How your Cosmik Network account works 92 + </Button> 93 + </PopoverTarget> 94 + <PopoverDropdown> 95 + <Text fw={500} ta="center" maw={380}> 96 + When you sign up today, you’ll create a Bluesky account. In near 97 + future, your account will be seamlessly migrated to our{' '} 98 + <Anchor 99 + href="https://cosmik.network" 100 + target="_blank" 101 fw={500} 102 + c={'blue'} 103 > 104 + Cosmik Network 105 + </Anchor> 106 + . 107 + </Text> 108 + </PopoverDropdown> 109 + </Popover> 110 </Stack> 111 + </Stack> 112 + ); 113 + } 114 + 115 + export default function Page() { 116 + return ( 117 + <Suspense> 118 + <InnerPage /> 119 </Suspense> 120 ); 121 }
+1 -1
src/webapp/components/AddToCollectionModal.tsx
··· 143 </Text> 144 )} 145 146 - <Group gap={"xs"} grow> 147 <Button 148 onClick={handleSubmit} 149 disabled={submitting || selectedCollectionIds.length === 0}
··· 143 </Text> 144 )} 145 146 + <Group gap={'xs'} grow> 147 <Button 148 onClick={handleSubmit} 149 disabled={submitting || selectedCollectionIds.length === 0}
+1 -1
src/webapp/features/collections/components/collectionSelector/Skeleton.CollectionSelector.tsx
··· 2 3 export default function CollectionSelectorSkeleton() { 4 return ( 5 - <Stack gap={"xs"}> 6 <Skeleton w={'100%'} h={50} /> 7 <Skeleton w={'100%'} h={50} /> 8 <Skeleton w={'100%'} h={50} />
··· 2 3 export default function CollectionSelectorSkeleton() { 4 return ( 5 + <Stack gap={'xs'}> 6 <Skeleton w={'100%'} h={50} /> 7 <Skeleton w={'100%'} h={50} /> 8 <Skeleton w={'100%'} h={50} />
-17
src/webapp/package-lock.json
··· 38 "autoprefixer": "^10.4.16", 39 "eslint": "^8.55.0", 40 "eslint-config-next": "15.4.1", 41 - "eslint-plugin-storybook": "^9.1.2", 42 "plasmo": "^0.90.5", 43 "postcss": "^8.5.6", 44 "postcss-preset-mantine": "^1.18.0", ··· 10386 "dev": true, 10387 "bin": { 10388 "semver": "bin/semver.js" 10389 - } 10390 - }, 10391 - "node_modules/eslint-plugin-storybook": { 10392 - "version": "9.1.2", 10393 - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-9.1.2.tgz", 10394 - "integrity": "sha512-EQa/kChrYrekxv36q3pvW57anqxMlAP4EdPXEDyA/EDrCQJaaTbWEdsMnVZtD744RjPP0M5wzaUjHbMhNooAwQ==", 10395 - "dev": true, 10396 - "dependencies": { 10397 - "@typescript-eslint/utils": "^8.8.1" 10398 - }, 10399 - "engines": { 10400 - "node": ">=20.0.0" 10401 - }, 10402 - "peerDependencies": { 10403 - "eslint": ">=8", 10404 - "storybook": "^9.1.2" 10405 } 10406 }, 10407 "node_modules/eslint-scope": {
··· 38 "autoprefixer": "^10.4.16", 39 "eslint": "^8.55.0", 40 "eslint-config-next": "15.4.1", 41 "plasmo": "^0.90.5", 42 "postcss": "^8.5.6", 43 "postcss-preset-mantine": "^1.18.0", ··· 10385 "dev": true, 10386 "bin": { 10387 "semver": "bin/semver.js" 10388 } 10389 }, 10390 "node_modules/eslint-scope": {
-1
src/webapp/package.json
··· 54 "autoprefixer": "^10.4.16", 55 "eslint": "^8.55.0", 56 "eslint-config-next": "15.4.1", 57 - "eslint-plugin-storybook": "^9.1.2", 58 "plasmo": "^0.90.5", 59 "postcss": "^8.5.6", 60 "postcss-preset-mantine": "^1.18.0",
··· 54 "autoprefixer": "^10.4.16", 55 "eslint": "^8.55.0", 56 "eslint-config-next": "15.4.1", 57 "plasmo": "^0.90.5", 58 "postcss": "^8.5.6", 59 "postcss-preset-mantine": "^1.18.0",
+1 -1
src/webapp/vitest.shims.d.ts
··· 1 - /// <reference types="@vitest/browser/providers/playwright" />
··· 1 + /// <reference types="@vitest/browser/providers/playwright" />