diff --git a/bun.lock b/bun.lock index 8a28be8358..483319e5e1 100644 --- a/bun.lock +++ b/bun.lock @@ -6,12 +6,22 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95675c4", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@ab459aa", "@appwrite.io/pink-icons": "0.25.0", - "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@c1feb89", + "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@50c5f13", "@appwrite.io/pink-legacy": "^1.0.3", "@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@dd7e01c", + "@codemirror/autocomplete": "^6.19.0", + "@codemirror/commands": "^6.9.0", + "@codemirror/lang-javascript": "^6.2.4", + "@codemirror/lang-json": "^6.0.2", + "@codemirror/language": "^6.11.3", + "@codemirror/lint": "^6.9.0", + "@codemirror/search": "^6.5.11", + "@codemirror/state": "^6.5.2", + "@codemirror/view": "^6.38.6", "@faker-js/faker": "^9.9.0", + "@lezer/highlight": "^1.2.1", "@plausible-analytics/tracker": "^0.4.4", "@popperjs/core": "^2.11.8", "@sentry/sveltekit": "^8.38.0", @@ -20,11 +30,13 @@ "@threlte/extras": "^9.7.1", "ai": "^6.0.67", "analytics": "^0.8.16", + "codemirror-json5": "^1.0.3", "cron-parser": "^4.9.0", "dayjs": "^1.11.13", "deep-equal": "^2.2.3", "echarts": "^5.6.0", "ignore": "^6.0.2", + "json5": "^2.2.3", "nanoid": "^5.1.5", "nanotar": "^0.1.1", "pretty-bytes": "^6.1.1", @@ -36,6 +48,7 @@ "devDependencies": { "@eslint/compat": "^1.3.1", "@eslint/js": "^9.31.0", + "@lezer/common": "^1.5.0", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.5", "@playwright/test": "^1.55.1", @@ -107,11 +120,11 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@95675c4", { "dependencies": { "bignumber.js": "9.0.0", "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@ab459aa", { "dependencies": { "bignumber.js": "9.0.0", "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], - "@appwrite.io/pink-icons-svelte": ["@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@c1feb89", { "peerDependencies": { "svelte": "^4.0.0" } }], + "@appwrite.io/pink-icons-svelte": ["@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@50c5f13", { "peerDependencies": { "svelte": "^4.0.0" } }], "@appwrite.io/pink-legacy": ["@appwrite.io/pink-legacy@1.0.3", "", { "dependencies": { "@appwrite.io/pink-icons": "1.0.0", "the-new-css-reset": "^1.11.2" } }, "sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ=="], @@ -153,6 +166,24 @@ "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], + "@codemirror/autocomplete": ["@codemirror/autocomplete@6.20.0", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0" } }, "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg=="], + + "@codemirror/commands": ["@codemirror/commands@6.10.1", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.4.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } }, "sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q=="], + + "@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], + + "@codemirror/lang-json": ["@codemirror/lang-json@6.0.2", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@lezer/json": "^1.0.0" } }, "sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ=="], + + "@codemirror/language": ["@codemirror/language@6.12.1", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", "@lezer/common": "^1.5.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0", "style-mod": "^4.0.0" } }, "sha512-Fa6xkSiuGKc8XC8Cn96T+TQHYj4ZZ7RdFmXA3i9xe/3hLHfwPZdM+dqfX0Cp0zQklBKhVD8Yzc8LS45rkqcwpQ=="], + + "@codemirror/lint": ["@codemirror/lint@6.9.3", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.35.0", "crelt": "^1.0.5" } }, "sha512-y3YkYhdnhjDBAe0VIA0c4wVoFOvnp8CnAvfLqi0TqotIv92wIlAAP7HELOpLBsKwjAX6W92rSflA6an/2zBvXw=="], + + "@codemirror/search": ["@codemirror/search@6.6.0", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.37.0", "crelt": "^1.0.5" } }, "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw=="], + + "@codemirror/state": ["@codemirror/state@6.5.4", "", { "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "sha512-8y7xqG/hpB53l25CIoit9/ngxdfoG+fx+V3SHBrinnhOtLvKHRyAJJuHzkWrR4YXXLX8eXBsejgAAxHUOdW1yw=="], + + "@codemirror/view": ["@codemirror/view@6.39.12", "", { "dependencies": { "@codemirror/state": "^6.5.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-f+/VsHVn/kOA9lltk/GFzuYwVVAKmOnNjxbrhkk3tPHntFqjWeI2TbIXx006YkBkqC10wZ4NsnWXCQiFPeAISQ=="], + "@csstools/color-helpers": ["@csstools/color-helpers@5.1.0", "", {}, "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA=="], "@csstools/css-calc": ["@csstools/css-calc@2.1.4", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ=="], @@ -219,6 +250,18 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + "@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="], + + "@lezer/highlight": ["@lezer/highlight@1.2.3", "", { "dependencies": { "@lezer/common": "^1.3.0" } }, "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g=="], + + "@lezer/javascript": ["@lezer/javascript@1.5.4", "", { "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.1.3", "@lezer/lr": "^1.3.0" } }, "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA=="], + + "@lezer/json": ["@lezer/json@1.0.3", "", { "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0" } }, "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ=="], + + "@lezer/lr": ["@lezer/lr@1.4.8", "", { "dependencies": { "@lezer/common": "^1.0.0" } }, "sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA=="], + + "@marijn/find-cluster-break": ["@marijn/find-cluster-break@1.0.2", "", {}, "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g=="], + "@melt-ui/pp": ["@melt-ui/pp@0.3.2", "", { "dependencies": { "estree-walker": "^3.0.3", "magic-string": "^0.30.5" }, "peerDependencies": { "@melt-ui/svelte": ">= 0.29.0", "svelte": "^3.55.0 || ^4.0.0 || ^5.0.0-next.1" } }, "sha512-xKkPvaIAFinklLXcQOpwZ8YSpqAFxykjWf8Y/fSJQwsixV/0rcFs07hJ49hJjPy5vItvw5Qa0uOjzFUbXzBypQ=="], "@melt-ui/svelte": ["@melt-ui/svelte@0.86.6", "", { "dependencies": { "@floating-ui/core": "^1.3.1", "@floating-ui/dom": "^1.4.5", "@internationalized/date": "^3.5.0", "dequal": "^2.0.3", "focus-trap": "^7.5.2", "nanoid": "^5.0.4" }, "peerDependencies": { "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0-next.118" } }, "sha512-Jer+M7DgIwT5IHfTayb4Iw/fkkxWNmC/mqn/nMh9JrbPbkxmyabfLQnhJ+JDn5HK77f84j34lubO3iqFtYAfMg=="], @@ -647,6 +690,8 @@ "code-red": ["code-red@1.0.4", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@types/estree": "^1.0.1", "acorn": "^8.10.0", "estree-walker": "^3.0.3", "periscopic": "^3.1.0" } }, "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw=="], + "codemirror-json5": ["codemirror-json5@1.0.3", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/common": "^1.0.0", "@lezer/highlight": "^1.0.0", "json5": "^2.2.1", "lezer-json5": "^2.0.2" } }, "sha512-HmmoYO2huQxoaoG5ARKjqQc9mz7/qmNPvMbISVfIE2Gk1+4vZQg9X3G6g49MYM5IK00Ol3aijd7OKrySuOkA7Q=="], + "color": ["color@5.0.3", "", { "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" } }, "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA=="], "color-convert": ["color-convert@3.1.3", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg=="], @@ -665,6 +710,8 @@ "cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="], + "crelt": ["crelt@1.0.6", "", {}, "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="], + "cron-parser": ["cron-parser@4.9.0", "", { "dependencies": { "luxon": "^3.2.1" } }, "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -1019,6 +1066,8 @@ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + "lezer-json5": ["lezer-json5@2.0.2", "", { "dependencies": { "@lezer/lr": "^1.0.0" } }, "sha512-NRmtBlKW/f8mA7xatKq8IUOq045t8GVHI4kZXrUtYYUdiVeGiO6zKGAV7/nUAnf5q+rYTY+SWX/gvQdFXMjNxQ=="], + "lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="], "lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="], @@ -1313,6 +1362,8 @@ "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="], + "style-mod": ["style-mod@4.1.3", "", {}, "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ=="], + "style-value-types": ["style-value-types@5.1.2", "", { "dependencies": { "hey-listen": "^1.0.8", "tslib": "2.4.0" } }, "sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -1433,6 +1484,8 @@ "vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], + "w3c-keyname": ["w3c-keyname@2.2.8", "", {}, "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="], + "w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="], "webgl-sdf-generator": ["webgl-sdf-generator@1.1.1", "", {}, "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA=="], diff --git a/eslint.config.js b/eslint.config.js index 841ddf3525..8bf40b8212 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -36,7 +36,7 @@ export default ts.config( // TODO: @itznotabug, this requires a big refactor! 'svelte/no-navigation-without-resolve': 'warn', 'svelte/prefer-svelte-reactivity': 'warn', - 'svelte/prefer-writable-derived': 'warn' + 'svelte/prefer-writable-derived': 'off' } }, { diff --git a/package.json b/package.json index 604624d1d7..879ee14998 100644 --- a/package.json +++ b/package.json @@ -20,12 +20,22 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95675c4", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@ab459aa", "@appwrite.io/pink-icons": "0.25.0", - "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@c1feb89", + "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@50c5f13", "@appwrite.io/pink-legacy": "^1.0.3", "@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@dd7e01c", + "@codemirror/autocomplete": "^6.19.0", + "@codemirror/commands": "^6.9.0", + "@codemirror/lang-javascript": "^6.2.4", + "@codemirror/lang-json": "^6.0.2", + "@codemirror/language": "^6.11.3", + "@codemirror/lint": "^6.9.0", + "@codemirror/search": "^6.5.11", + "@codemirror/state": "^6.5.2", + "@codemirror/view": "^6.38.6", "@faker-js/faker": "^9.9.0", + "@lezer/highlight": "^1.2.1", "@plausible-analytics/tracker": "^0.4.4", "@popperjs/core": "^2.11.8", "@sentry/sveltekit": "^8.38.0", @@ -34,11 +44,13 @@ "@threlte/extras": "^9.7.1", "ai": "^6.0.67", "analytics": "^0.8.16", + "codemirror-json5": "^1.0.3", "cron-parser": "^4.9.0", "dayjs": "^1.11.13", "deep-equal": "^2.2.3", "echarts": "^5.6.0", "ignore": "^6.0.2", + "json5": "^2.2.3", "nanoid": "^5.1.5", "nanotar": "^0.1.1", "pretty-bytes": "^6.1.1", @@ -50,6 +62,7 @@ "devDependencies": { "@eslint/compat": "^1.3.1", "@eslint/js": "^9.31.0", + "@lezer/common": "^1.5.0", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.5", "@playwright/test": "^1.55.1", diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts index 305bf33d95..89fd944754 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -156,6 +156,7 @@ export enum Click { DatabaseDatabaseDelete = 'click_database_delete', DatabaseImportCsv = 'click_database_import_csv', DatabaseExportCsv = 'click_database_export_csv', + DatabaseImportJson = 'click_database_import_json', DomainCreateClick = 'click_domain_create', DomainDeleteClick = 'click_domain_delete', DomainRetryDomainVerificationClick = 'click_domain_retry_domain_verification', @@ -282,6 +283,7 @@ export enum Submit { DatabaseUpdateName = 'submit_database_update_name', DatabaseImportCsv = 'submit_database_import_csv', DatabaseExportCsv = 'submit_database_export_csv', + DatabaseImportJSON = 'submit_database_import_json', DatabaseBackupDelete = 'submit_database_backup_delete', DatabaseBackupPolicyCreate = 'submit_database_backup_policy_create', @@ -295,6 +297,11 @@ export enum Submit { RowUpdate = 'submit_row_update', RowUpdatePermissions = 'submit_row_update_permissions', + DocumentCreate = 'submit_document_create', + DocumentDelete = 'submit_document_delete', + DocumentUpdate = 'submit_document_update', + DocumentUpdatePermissions = 'submit_document_update_permissions', + IndexCreate = 'submit_index_create', IndexDelete = 'submit_index_delete', @@ -306,6 +313,14 @@ export enum Submit { TableUpdateEnabled = 'submit_table_update_enabled', TableUpdateDisplayNames = 'submit_table_update_display_names', + CollectionCreate = 'submit_collection_create', + CollectionDelete = 'submit_collection_delete', + CollectionUpdateName = 'submit_collection_update_name', + CollectionUpdatePermissions = 'submit_collection_update_permissions', + CollectionUpdateSecurity = 'submit_collection_update_security', + CollectionUpdateEnabled = 'submit_collection_update_enabled', + CollectionUpdateDisplayNames = 'submit_collection_update_display_names', + FunctionCreate = 'submit_function_create', FunctionDelete = 'submit_function_delete', FunctionUpdateName = 'submit_function_update_name', diff --git a/src/lib/commandCenter/commands.ts b/src/lib/commandCenter/commands.ts index e4f3837184..7c8cfd15e9 100644 --- a/src/lib/commandCenter/commands.ts +++ b/src/lib/commandCenter/commands.ts @@ -29,9 +29,11 @@ const groups = [ 'migrations', 'users', 'tables', + 'collections', 'columns', 'indexes', 'rows', + 'documents', 'teams', 'security', 'buckets', @@ -102,8 +104,19 @@ const commandsEnabled = derived(disabledMap, ($disabledMap) => { export function isTargetInputLike(element: EventTarget | null) { if (!(element instanceof HTMLElement)) return false; + return !!element.closest( - 'input,textarea,select,[contenteditable],[role="combobox"],[role="textbox"],[role="searchbox"],[data-command-center-ignore]' + [ + 'input', + 'textarea', + 'select', + '[contenteditable]', + '[role="combobox"]', + '[role="textbox"]', + '[role="searchbox"]', + '[data-command-center-ignore]', + '.cm-editor' + ].join(',') ); } diff --git a/src/lib/components/columnSelector.svelte b/src/lib/components/columnSelector.svelte index 506735df38..9bb6c23c07 100644 --- a/src/lib/components/columnSelector.svelte +++ b/src/lib/components/columnSelector.svelte @@ -10,8 +10,10 @@ Layout, Popover, Selector, - Typography + Typography, + Icon } from '@appwrite.io/pink-svelte'; + import { IconPlus } from '@appwrite.io/pink-icons-svelte'; import { Button } from '$lib/elements/forms'; let { @@ -21,7 +23,8 @@ allowNoColumns = false, showAnyway = false, children, - onPreferencesUpdated = null + onPreferencesUpdated = null, + onCustomOptionClick = null }: { columns: Writable; isCustomTable?: boolean; @@ -30,6 +33,7 @@ showAnyway?: boolean; children: Snippet<[toggle: () => void, selectedColumnsNumber: number]>; onPreferencesUpdated?: () => void; + onCustomOptionClick?: () => void; } = $props(); let search = $state(''); @@ -115,7 +119,7 @@ cols.map((col) => col.exclude ? col - : filteredColumns.some((fc) => fc.id === col.id) + : filteredColumns.some((fc) => fc.id === col.id && !col.disable) ? { ...col, hide: false } : col ) @@ -126,7 +130,9 @@ function deselectAll() { columns.update((cols) => { const realColumns = cols.filter((col) => !col.exclude && !col.isAction); - const filtered = filteredColumns.filter((col) => !col.exclude && !col.isAction); + const filtered = filteredColumns.filter( + (col) => !col.exclude && !col.isAction && !col.disable + ); if (filtered.length === 0) return cols; @@ -187,7 +193,7 @@ {@const placement = isNewStyle ? 'bottom-start' : 'bottom-end'} {@render children(toggle, selectedColumnsNumber)} - +
{#if isNewStyle && showActions} @@ -231,7 +237,8 @@ on:click={() => toggleColumn(column)} disabled={allowNoColumns ? false - : visibleRealColumns.length <= 1 && !column.hide}> + : (visibleRealColumns.length <= 1 && !column.hide) || + column.disable}> + + {#if onCustomOptionClick && isCustomTable} + + + + + {/if}
diff --git a/src/lib/components/csvImportBox.svelte b/src/lib/components/csvImportBox.svelte index e8a6e167ed..6069ac4c41 100644 --- a/src/lib/components/csvImportBox.svelte +++ b/src/lib/components/csvImportBox.svelte @@ -14,7 +14,7 @@ // re-render the key for sheet UI. import { hash } from '$lib/helpers/string'; - import { spreadsheetRenderKey } from '$routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/store'; + import { spreadsheetRenderKey } from '$database/store'; import { Link } from '$lib/elements'; type CsvImportError = { diff --git a/src/lib/components/customId.svelte b/src/lib/components/customId.svelte index 66a56c2d8c..559f6a0fec 100644 --- a/src/lib/components/customId.svelte +++ b/src/lib/components/customId.svelte @@ -12,7 +12,9 @@ id = $bindable(null), autofocus = true, isProject = false, - required = true + required = true, + syncFrom = undefined, + disabled = false }: { show: boolean; name: string; @@ -20,8 +22,29 @@ autofocus?: boolean; isProject?: boolean; required?: boolean; + disabled?: boolean; + syncFrom?: string | undefined; } = $props(); + let touchedId = $state(false); + + function toIdFormat(str: string): string { + return str + .toLowerCase() + .replace(/[^a-z0-9\-_. ]+/g, '') + .replace(/ /g, '_') + .replace(/^-+/, '') + .replace(/\.+$/, '') + .replace(/_{2,}/g, '_') + .slice(0, 36); // max length + } + + function handleInput() { + if (!touchedId) { + touchedId = true; + } + } + $effect(() => { if (!show) { id = null; @@ -37,6 +60,21 @@ trackEvent(Click.ShowCustomIdClick); } }); + + $effect(() => { + if (syncFrom && !touchedId) { + const newId = toIdFormat(syncFrom); + if (id !== newId) { + id = newId; + } + } + }); + + $effect(() => { + if (!show) { + touchedId = false; + } + }); {#if show} @@ -61,9 +99,9 @@ {#if isProject} - + {:else} - + {/if} diff --git a/src/lib/components/filters/content.svelte b/src/lib/components/filters/content.svelte index c4a83c8216..20f50a417e 100644 --- a/src/lib/components/filters/content.svelte +++ b/src/lib/components/filters/content.svelte @@ -25,7 +25,8 @@ columnId = $bindable(null), arrayValues = $bindable([]), operatorKey = $bindable(null), - singleCondition = false + singleCondition = false, + schema = true }: { // We cast to any to not cause type errors in the input components /* eslint @typescript-eslint/no-explicit-any: 'off' */ @@ -36,11 +37,40 @@ arrayValues?: string[]; operatorKey?: string | null; singleCondition?: boolean; + schema?: boolean; } = $props(); - let columnsArray = $derived($columns); - let column = $derived(columnsArray.find((c) => c.id === columnId)); - let operatorsForColumn = $derived.by(() => { + const systemFieldColumns: Record = { + $id: { id: '$id', title: '$id', type: 'string' }, + $createdAt: { id: '$createdAt', title: '$createdAt', type: 'datetime' }, + $updatedAt: { id: '$updatedAt', title: '$updatedAt', type: 'datetime' } + }; + + const columnsArray = $derived($columns); + const isCustomAttribute = $derived( + !schema && + columnId && + !systemFieldColumns[columnId] && + !columnsArray.find((c) => c.id === columnId) + ); + const column = $derived.by(() => { + if (!schema && columnId) { + if (systemFieldColumns[columnId]) { + return systemFieldColumns[columnId]; + } + const existingColumn = columnsArray.find((c) => c.id === columnId); + if (!existingColumn) { + return { id: columnId, title: columnId, type: 'string' } as Column; + } + return existingColumn; + } + return columnsArray.find((c) => c.id === columnId); + }); + + const operatorsForColumn = $derived.by(() => { + if (!schema && (!column || isCustomAttribute)) { + return Object.entries(operators).map(([k]) => ({ label: k, value: k })); + } if (!column?.type) return []; return Object.entries(operators) .filter(([, v]) => v.types.includes(column.type)) @@ -104,16 +134,46 @@ const dispatch = createEventDispatcher<{ clear: void; apply: { applied: number } }>(); + function coerceValueByOperatorType(value: any, operatorTypes: string[]): any { + if (typeof value !== 'string' || !value) return value; + + if (operatorTypes.includes('integer') || operatorTypes.includes('double')) { + const numValue = Number(value); + if (!isNaN(numValue) && value.trim() !== '') { + return numValue; + } + } else if (operatorTypes.includes('boolean')) { + const lowerValue = value.toLowerCase().trim(); + if (lowerValue === 'true' || lowerValue === '1') { + return true; + } else if (lowerValue === 'false' || lowerValue === '0') { + return false; + } + } + + return value; + } + function addFilterAndReset() { + const columnsWithVirtual = + column && !columnsArray.find((c) => c.id === columnId) + ? [...columnsArray, column] + : columnsArray; + // For distance operators, pass the distance as a separate parameter if (isDistanceOperator && distanceValue !== null && value !== null) { - addFilter(columnsArray, columnId, operatorKey, value, arrayValues, distanceValue); + addFilter(columnsWithVirtual, columnId, operatorKey, value, arrayValues, distanceValue); } else { - const preparedValue = - column?.type === 'datetime' && typeof value === 'string' && value - ? new Date(value).toISOString() - : value; - addFilter(columnsArray, columnId, operatorKey, preparedValue, arrayValues); + let preparedValue = value; + + if (column?.type === 'datetime' && typeof value === 'string' && value) { + preparedValue = new Date(value).toISOString(); + } else if (!schema) { + const operatorTypes = operator?.types || []; + preparedValue = coerceValueByOperatorType(value, operatorTypes); + } + + addFilter(columnsWithVirtual, columnId, operatorKey, preparedValue, arrayValues); } columnId = null; @@ -135,19 +195,23 @@ addFilterAndReset(); }}> - + {#if schema} + + {:else} + + {/if} - {#if column && operator && !operator?.hideInput} + {#if (column || (!schema && columnId)) && operator && !operator?.hideInput} {#if column?.array} {#if column.format === 'enum'} - {#if column.format === 'enum'} + {#if column?.format === 'enum'} - {:else if column.type === 'integer' || column.type === 'double'} + {:else if column?.type === 'integer' || column?.type === 'double'} - {:else if column.type === 'boolean'} + {:else if column?.type === 'boolean'} - {:else if column.type === 'datetime'} + {:else if column?.type === 'datetime'} {#key value} {/key} - {:else if column.type === 'point' || column.type === 'linestring' || column.type === 'polygon'} + {:else if column?.type === 'point' || column?.type === 'linestring' || column?.type === 'polygon'} { diff --git a/src/lib/components/filters/filters.svelte b/src/lib/components/filters/filters.svelte index 4b504a705d..6a9e7d359b 100644 --- a/src/lib/components/filters/filters.svelte +++ b/src/lib/components/filters/filters.svelte @@ -28,6 +28,7 @@ export let enableApply = false; export let quickFilters = false; export let analyticsSource = ''; + export let schema = true; let displayQuickFilters = quickFilters; const dispatch = createEventDispatcher(); @@ -186,6 +187,7 @@ bind:distanceValue bind:arrayValues {columns} + {schema} {singleCondition} on:apply={afterApply} on:clear={() => (filtersAppliedCount = 0)} /> @@ -243,6 +245,7 @@ {:else} + {#key value} @@ -107,7 +125,7 @@ style:overflow="hidden" style:word-break="break-all" use:truncateText> - + {@render children()} diff --git a/src/lib/components/modal.svelte b/src/lib/components/modal.svelte index 8181338f81..0626393404 100644 --- a/src/lib/components/modal.svelte +++ b/src/lib/components/modal.svelte @@ -30,27 +30,29 @@
- - - {#if error} -
- { - error = null; - }}> - {error} - -
- {/if} - - - - - - -
+
+ + + {#if error} +
+ { + error = null; + }}> + {error} + +
+ {/if} + + + + + + +
+
diff --git a/src/lib/components/sortButton.svelte b/src/lib/components/sortButton.svelte index d202cf664b..bb24a2bb24 100644 --- a/src/lib/components/sortButton.svelte +++ b/src/lib/components/sortButton.svelte @@ -5,10 +5,10 @@
-