diff --git a/.vscode/settings.json b/.vscode/settings.json index 23d438596..55fd6b624 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,7 +13,7 @@ "editor.wordBasedSuggestions": "off" }, "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "dbaeumer.vscode-eslint", "editor.formatOnSave": true }, "[json]": { @@ -30,7 +30,7 @@ "tailwindCSS.lint.suggestCanonicalClasses": "ignore" }, "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "dbaeumer.vscode-eslint", "editor.formatOnSave": true }, "cSpell.words": ["immich"], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b407b19e2..7345af52e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -740,6 +740,12 @@ importers: eslint-config-prettier: specifier: ^10.1.8 version: 10.1.8(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1)) + eslint-import-resolver-typescript: + specifier: ^4.4.5 + version: 4.4.5(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1))(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1) + eslint-plugin-import-x: + specifier: ^4.17.1 + version: 4.17.1(@typescript-eslint/utils@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1) eslint-plugin-prettier: specifier: ^5.1.3 version: 5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1)))(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(prettier@3.9.6) @@ -758,9 +764,6 @@ importers: prettier: specifier: ^3.7.4 version: 3.9.6 - prettier-plugin-organize-imports: - specifier: ^4.0.0 - version: 4.3.0(@typescript/typescript6@6.0.2)(prettier@3.9.6) sql-formatter: specifier: ^15.0.0 version: 15.8.2 @@ -784,10 +787,10 @@ importers: version: 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1) unplugin-swc: specifier: ^1.4.5 - version: 1.5.11(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(rolldown@1.2.5)(rollup@4.62.0)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.108.4(@swc/core@1.16.1(@swc/helpers@0.5.23))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(esbuild@0.28.2)(html-minifier-terser@7.2.0)(lightningcss@1.33.0)(postcss@8.5.26)(uglify-js@3.19.3)) + version: 1.5.11(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(rolldown@1.2.5)(rollup@4.62.0)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.108.4(@swc/core@1.16.1(@swc/helpers@0.5.23))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(esbuild@0.28.2)(html-minifier-terser@7.2.0)(lightningcss@1.33.0)(postcss@8.5.26)(uglify-js@3.19.3)) vitest: specifier: ^4.0.0 - version: 4.1.11(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/coverage-v8@4.1.11)(happy-dom@20.11.8)(jsdom@26.1.0(canvas@3.2.3)(supports-color@8.1.1))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 4.1.11(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/coverage-v8@4.1.11)(happy-dom@20.11.8)(jsdom@26.1.0(canvas@3.2.3)(supports-color@8.1.1))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0)) web: dependencies: @@ -2329,9 +2332,18 @@ packages: resolution: {integrity: sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==} engines: {node: '>=20.0'} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.1': resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@esbuild/aix-ppc64@0.19.12': resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} @@ -3568,6 +3580,13 @@ packages: '@namnode/store@0.1.0': resolution: {integrity: sha512-4NGTldxKcmY0UuZ7OEkvCjs8ZEoeYB6M2UwMu74pdLiFMKxXbj9HdNk1Qn213bxX1O7bY5h+PLh5DZsTURZkYA==} + '@napi-rs/wasm-runtime@1.2.3': + resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 + '@nestjs/bull-shared@12.0.0': resolution: {integrity: sha512-OShKmwIt00oK2DIqKP4mjh9C2RQsoHPZbBsQwbnETPmK/+Ld1xyYQa1WOrYKKA8qoSzZJvxQaA6/4sV5SfAIyA==} peerDependencies: @@ -5070,6 +5089,9 @@ packages: '@turf/invariant@7.3.5': resolution: {integrity: sha512-ZVIvsBvjr8lO7WxC5zYNjRsjSDvyGvWkJMjuWaJjTU8x+1tmfNnw3gDX/TI2Sit83gcRYLYkNo23lB/udqx/Hg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/accepts@1.3.7': resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} @@ -5696,6 +5718,126 @@ packages: '@ungap/structured-clone@1.3.3': resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.12.2': + resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.12.2': + resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.12.2': + resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.12.2': + resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} + cpu: [arm64] + os: [openharmony] + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==} + cpu: [x64] + os: [win32] + '@upsetjs/venn.js@2.0.0': resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} @@ -5985,6 +6127,10 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -5998,6 +6144,14 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -6022,6 +6176,10 @@ packages: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + async-lock@1.4.1: resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} @@ -6047,6 +6205,10 @@ packages: peerDependencies: postcss: ^8.1.0 + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -6598,6 +6760,10 @@ packages: resolution: {integrity: sha512-uiqLcOiVDJtBP8WGkZHEP+FZIhTzP1dxvn59EfoYUi9gqupjrBWVQkO2atDrbnKPwLeotFYDsuNb26uBMqB+hw==} engines: {node: '>= 6'} + comment-parser@1.4.9: + resolution: {integrity: sha512-+2AvZKjJaNq9GQljm3tr0utwrig5BL+jgJGvz5rDpGKNIp+ojcRXWUwBbh/sGIi1QCprR6PsKFakub+w1v+4hQ==} + engines: {node: '>= 12.0.0'} + common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} @@ -7075,6 +7241,18 @@ packages: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dayjs@1.11.21: resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} @@ -7097,6 +7275,14 @@ packages: supports-color: optional: true + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -7425,6 +7611,14 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -7444,6 +7638,14 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} + engines: {node: '>= 0.4'} + es-toolkit@1.49.0: resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} @@ -7514,6 +7716,31 @@ packages: peerDependencies: eslint: '>=7.0.0' + eslint-import-context@0.1.9: + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + + eslint-import-resolver-node@0.3.10: + resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} + + eslint-import-resolver-typescript@4.4.5: + resolution: {integrity: sha512-nbE5XLph6TLtGYcu/U6e6ZVXyKBhbDWK5cLGk76eJ7NdZpwf1P9EFkpt1Z01mNZNrrilsAYWKH6zUkL4reoXbw==} + engines: {node: ^16.17.0 || >=18.6.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + eslint-plugin-better-tailwindcss@4.7.0: resolution: {integrity: sha512-lrdlVW4pzLPj/zX5HRqMhKPesGijDfRhnSRJMlNcsrCyJHsndmHCLKTiRNa1eREUZ6G3D3QjdLc+G4tlfGrmkw==} engines: {node: ^20.19.0 || ^22.12.0 || >=23.0.0} @@ -7533,6 +7760,19 @@ packages: peerDependencies: eslint: ^9.0.0 || ^10.0.0 + eslint-plugin-import-x@4.17.1: + resolution: {integrity: sha512-4cdstYkKCyjumM2Q9NSI03K8D2a9F4Ssz33K2lv2hQa4KmR9jPLwk3uWGtNvclfqBrPGfGuMBwsGMbe6dMRbfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/utils': ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + eslint-import-resolver-node: '*' + peerDependenciesMeta: + '@typescript-eslint/utils': + optional: true + eslint-import-resolver-node: + optional: true + eslint-plugin-prettier@5.5.6: resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -7893,6 +8133,10 @@ packages: debug: optional: true + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -7976,6 +8220,13 @@ packages: resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} engines: {node: '>=18'} + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + fuse.js@7.5.0: resolution: {integrity: sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow==} engines: {node: '>=10'} @@ -7985,6 +8236,10 @@ packages: engines: {node: '>=10'} deprecated: This package is no longer supported. + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + generic-pool@3.9.0: resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} engines: {node: '>= 4'} @@ -8035,6 +8290,10 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + get-tsconfig@4.14.3: resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} @@ -8094,6 +8353,10 @@ packages: resolution: {integrity: sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==} engines: {node: '>=18'} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} @@ -8144,6 +8407,10 @@ packages: resolution: {integrity: sha512-TeAoM8pTDKNVcP5z3MptRTb7UH9q126GrjTFOgormgA19tmT30JTiIxb1CVXs7xljpItypUp/yHSPFD4QRHMsQ==} engines: {node: '>=20.0.0'} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -8151,6 +8418,10 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -8469,6 +8740,10 @@ packages: resolution: {integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==} engines: {node: '>=12.0.0'} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -8503,13 +8778,29 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} @@ -8518,6 +8809,13 @@ packages: resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} engines: {node: '>=18.20'} + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true @@ -8526,6 +8824,14 @@ packages: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -8539,6 +8845,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} @@ -8547,10 +8857,18 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -8583,6 +8901,14 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + is-network-error@1.3.2: resolution: {integrity: sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==} engines: {node: '>=16'} @@ -8591,6 +8917,10 @@ packages: resolution: {integrity: sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -8635,10 +8965,22 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + is-regexp@1.0.0: resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} engines: {node: '>=0.10.0'} + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + is-standalone-pwa@0.1.1: resolution: {integrity: sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==} @@ -8646,6 +8988,18 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -8661,6 +9015,18 @@ packages: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -8679,6 +9045,9 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -9728,6 +10097,11 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -9823,6 +10197,10 @@ packages: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} + engines: {node: '>= 0.4'} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -9932,6 +10310,10 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + obliterator@2.0.5: resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} @@ -9999,6 +10381,10 @@ packages: resolution: {integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==} engines: {node: '>=20'} + own-keys@1.0.2: + resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} + engines: {node: '>= 0.4'} + p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} @@ -10283,6 +10669,10 @@ packages: points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss-attribute-case-insensitive@7.0.1: resolution: {integrity: sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==} engines: {node: '>=18'} @@ -11070,6 +11460,10 @@ packages: reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + regenerate-unicode-properties@10.2.2: resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} engines: {node: '>=4'} @@ -11077,6 +11471,10 @@ packages: regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + regexpu-core@6.4.0: resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} @@ -11187,6 +11585,11 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} + engines: {node: '>= 0.4'} + hasBin: true + responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} @@ -11291,12 +11694,24 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -11396,6 +11811,14 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -11577,6 +12000,10 @@ packages: resolution: {integrity: sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==} engines: {node: '>=10.16.0'} + stable-hash-x@0.2.0: + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -11605,6 +12032,10 @@ packages: resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} engines: {node: '>=18'} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + stream-source@0.3.5: resolution: {integrity: sha512-ZuEDP9sgjiAwUVoDModftG0JtYiLUV8K4ljYD1VyUMRWtbVf92474o4kuuul43iZ8t/hRuiDAx1dIJSvirrK/g==} @@ -11631,6 +12062,18 @@ packages: resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} engines: {node: '>=20'} + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -12202,6 +12645,22 @@ packages: type@2.7.3: resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} + engines: {node: '>= 0.4'} + typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -12249,6 +12708,10 @@ packages: resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -12372,6 +12835,9 @@ packages: webpack: optional: true + unrs-resolver@1.12.2: + resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -12709,9 +13175,25 @@ packages: when-exit@2.1.5: resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} + engines: {node: '>= 0.4'} + which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -15238,11 +15720,27 @@ snapshots: - uglify-js - webpack-cli + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.11.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.19.12': optional: true @@ -16273,6 +16771,13 @@ snapshots: '@namnode/store@0.1.0': {} + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.3 + optional: true + '@nestjs/bull-shared@12.0.0(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1)': dependencies: '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1) @@ -17654,6 +18159,11 @@ snapshots: '@types/geojson': 7946.0.16 tslib: 2.8.1 + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + '@types/accepts@1.3.7': dependencies: '@types/node': 24.13.3 @@ -18402,6 +18912,76 @@ snapshots: '@ungap/structured-clone@1.3.3': {} + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + optional: true + + '@unrs/resolver-binding-android-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.12.2': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + optional: true + '@upsetjs/venn.js@2.0.0': optionalDependencies: d3-selection: 3.0.0 @@ -18423,7 +19003,7 @@ snapshots: obug: 2.1.4 std-env: 4.2.0 tinyrainbow: 3.1.1 - vitest: 4.1.11(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/coverage-v8@4.1.11)(happy-dom@20.11.8)(jsdom@26.1.0(canvas@3.2.3)(supports-color@8.1.1))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0)) + vitest: 4.1.11(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/coverage-v8@4.1.11)(happy-dom@20.11.8)(jsdom@26.1.0(canvas@3.2.3)(supports-color@8.1.1))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0)) '@vitest/expect@4.1.11': dependencies: @@ -18434,6 +19014,14 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.1 + '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 4.1.11 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0) + '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.11 @@ -18738,6 +19326,12 @@ snapshots: aria-query@5.3.2: {} + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + optional: true + array-flatten@1.1.1: {} array-source@0.0.4: {} @@ -18746,6 +19340,25 @@ snapshots: array-union@2.1.0: {} + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + optional: true + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + optional: true + asap@2.0.6: {} asn1@0.2.6: @@ -18772,6 +19385,9 @@ snapshots: astring@1.9.0: {} + async-function@1.0.0: + optional: true + async-lock@1.4.1: {} async@0.2.10: {} @@ -18798,6 +19414,11 @@ snapshots: postcss: 8.5.26 postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + optional: true + axobject-query@4.1.0: {} b4a@1.8.1: {} @@ -19336,6 +19957,8 @@ snapshots: array-timsort: 1.0.3 esprima: 4.0.1 + comment-parser@1.4.9: {} + common-path-prefix@3.0.0: {} component-emitter@1.3.1: {} @@ -19870,6 +20493,27 @@ snapshots: whatwg-url: 14.2.0 optional: true + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + optional: true + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + optional: true + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + optional: true + dayjs@1.11.21: {} debounce-fn@6.0.0: @@ -19886,6 +20530,13 @@ snapshots: optionalDependencies: supports-color: 8.1.1 + debug@3.2.7(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + optional: true + debug@4.3.7(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -20212,6 +20863,72 @@ snapshots: dependencies: is-arrayish: 0.2.1 + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + optional: true + + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.2 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.8 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.22 + optional: true + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -20229,6 +20946,21 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.4 + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.4 + optional: true + + es-to-primitive@1.3.4: + dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + optional: true + es-toolkit@1.49.0: {} es-toolkit@1.51.0: {} @@ -20376,6 +21108,37 @@ snapshots: dependencies: eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) + eslint-import-context@0.1.9(unrs-resolver@1.12.2): + dependencies: + get-tsconfig: 4.14.3 + stable-hash-x: 0.2.0 + optionalDependencies: + unrs-resolver: 1.12.2 + + eslint-import-resolver-node@0.3.10(supports-color@8.1.1): + dependencies: + debug: 3.2.7(supports-color@8.1.1) + is-core-module: 2.16.2 + resolve: 2.0.0-next.7 + transitivePeerDependencies: + - supports-color + optional: true + + eslint-import-resolver-typescript@4.4.5(eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1))(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1): + dependencies: + debug: 4.4.3(supports-color@8.1.1) + eslint: 10.9.1(jiti@1.21.7)(supports-color@8.1.1) + eslint-import-context: 0.1.9(unrs-resolver@1.12.2) + get-tsconfig: 4.14.3 + is-bun-module: 2.0.0 + stable-hash-x: 0.2.0 + tinyglobby: 0.2.17 + unrs-resolver: 1.12.2 + optionalDependencies: + eslint-plugin-import-x: 4.17.1(@typescript-eslint/utils@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + eslint-plugin-better-tailwindcss@4.7.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(tailwindcss@4.3.3): dependencies: '@eslint/css-tree': 4.0.5 @@ -20404,6 +21167,24 @@ snapshots: lodash.memoize: 4.1.2 semver: 7.8.5 + eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1): + dependencies: + '@typescript-eslint/types': 8.68.0 + comment-parser: 1.4.9 + debug: 4.4.3(supports-color@8.1.1) + eslint: 10.9.1(jiti@1.21.7)(supports-color@8.1.1) + eslint-import-context: 0.1.9(unrs-resolver@1.12.2) + is-glob: 4.0.3 + minimatch: 10.2.6 + semver: 7.8.5 + stable-hash-x: 0.2.0 + unrs-resolver: 1.12.2 + optionalDependencies: + '@typescript-eslint/utils': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(supports-color@8.1.1) + eslint-import-resolver-node: 0.3.10(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + eslint-plugin-prettier@5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1)))(eslint@10.9.1(jiti@1.21.7)(supports-color@8.1.1))(prettier@3.9.6): dependencies: eslint: 10.9.1(jiti@1.21.7)(supports-color@8.1.1) @@ -20971,6 +21752,11 @@ snapshots: optionalDependencies: debug: 4.4.3(supports-color@8.1.1) + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + optional: true + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -21056,6 +21842,22 @@ snapshots: function-timeout@1.0.2: {} + function.prototype.name@1.2.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + es-define-property: 1.0.1 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 + is-callable: 1.2.7 + is-document.all: 1.0.0 + optional: true + + functions-have-names@1.2.3: + optional: true + fuse.js@7.5.0: {} gauge@3.0.2: @@ -21070,6 +21872,9 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 + generator-function@2.0.1: + optional: true + generic-pool@3.9.0: {} gensync@1.0.0-beta.2: {} @@ -21119,6 +21924,13 @@ snapshots: get-stream@6.0.1: {} + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + optional: true + get-tsconfig@4.14.3: dependencies: resolve-pkg-maps: 1.0.0 @@ -21178,6 +21990,12 @@ snapshots: globals@17.11.0: {} + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + globalyzer@0.1.0: {} globby@11.1.0: @@ -21251,12 +22069,20 @@ snapshots: - bufferutil - utf-8-validate + has-bigints@1.1.0: + optional: true + has-flag@4.0.0: {} has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + optional: true + has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -21713,6 +22539,13 @@ snapshots: transitivePeerDependencies: - '@types/node' + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.4 + side-channel: 1.1.1 + optional: true + internmap@1.0.1: {} internmap@2.0.3: {} @@ -21756,18 +22589,52 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + optional: true + is-arrayish@0.2.1: {} + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + optional: true + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + optional: true + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + optional: true + is-buffer@2.0.5: {} is-builtin-module@5.0.0: dependencies: builtin-modules: 5.2.0 + is-bun-module@2.0.0: + dependencies: + semver: 7.8.5 + + is-callable@1.2.7: + optional: true + is-ci@3.0.1: dependencies: ci-info: 3.9.0 @@ -21776,18 +22643,50 @@ snapshots: dependencies: hasown: 2.0.4 + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + optional: true + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + optional: true + is-decimal@2.0.1: {} is-docker@2.2.1: {} is-docker@3.0.0: {} + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + optional: true + is-extendable@0.1.1: {} is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + optional: true + is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + optional: true + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -21814,10 +22713,22 @@ snapshots: is-interactive@2.0.0: {} + is-map@2.0.3: + optional: true + + is-negative-zero@2.0.3: + optional: true + is-network-error@1.3.2: {} is-npm@6.1.0: {} + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + optional: true + is-number@7.0.0: {} is-obj@1.0.1: {} @@ -21847,12 +22758,46 @@ snapshots: dependencies: '@types/estree': 1.0.9 + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + optional: true + is-regexp@1.0.0: {} + is-set@2.0.3: + optional: true + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + optional: true + is-standalone-pwa@0.1.1: {} is-stream@2.0.1: {} + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + optional: true + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + optional: true + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.22 + optional: true + is-typedarray@1.0.0: {} is-unicode-supported@0.1.0: {} @@ -21861,6 +22806,20 @@ snapshots: is-unicode-supported@2.1.0: {} + is-weakmap@2.0.2: + optional: true + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + optional: true + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + optional: true + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -21875,6 +22834,9 @@ snapshots: isarray@1.0.0: {} + isarray@2.0.5: + optional: true + isexe@2.0.0: {} isexe@4.0.0: {} @@ -23176,6 +24138,8 @@ snapshots: napi-build-utils@2.0.0: optional: true + napi-postinstall@0.3.4: {} + natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {} @@ -23270,6 +24234,14 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 + node-exports-info@1.6.2: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -23369,6 +24341,14 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 + object.entries@1.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + optional: true + obliterator@2.0.5: {} obuf@1.1.2: {} @@ -23474,6 +24454,14 @@ snapshots: stdin-discarder: 0.3.2 string-width: 8.2.2 + own-keys@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + optional: true + p-cancelable@3.0.0: {} p-event@6.0.1: @@ -23749,6 +24737,9 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 + possible-typed-array-names@1.1.0: + optional: true + postcss-attribute-case-insensitive@7.0.1(postcss@8.5.26): dependencies: postcss: 8.5.26 @@ -24610,12 +25601,34 @@ snapshots: reflect-metadata@0.2.2: {} + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + optional: true + regenerate-unicode-properties@10.2.2: dependencies: regenerate: 1.4.2 regenerate@1.4.2: {} + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + optional: true + regexpu-core@6.4.0: dependencies: regenerate: 1.4.2 @@ -24775,6 +25788,16 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@2.0.0-next.7: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + node-exports-info: 1.6.2 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + optional: true + responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 @@ -24920,10 +25943,32 @@ snapshots: dependencies: mri: 1.2.0 + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + optional: true + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + optional: true + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + optional: true + safer-buffer@2.1.2: {} sanitize-filename@1.6.4: @@ -25079,6 +26124,21 @@ snapshots: gopd: 1.2.0 has-property-descriptors: 1.0.2 + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + optional: true + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + optional: true + setprototypeof@1.2.0: {} shallow-clone@3.0.1: @@ -25332,6 +26392,8 @@ snapshots: cpu-features: 0.0.10 nan: 2.28.0 + stable-hash-x@0.2.0: {} + stackback@0.0.2: {} standard-as-callback@2.1.0: {} @@ -25348,6 +26410,12 @@ snapshots: stdin-discarder@0.3.2: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + optional: true + stream-source@0.3.5: {} streamsearch@1.1.0: {} @@ -25384,6 +26452,33 @@ snapshots: get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 + string.prototype.trim@1.2.11: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 + optional: true + + string.prototype.trimend@1.0.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + optional: true + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + optional: true + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -26032,6 +27127,43 @@ snapshots: type@2.7.3: {} + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + optional: true + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + optional: true + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + optional: true + + typed-array-length@1.0.8: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + optional: true + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 @@ -26104,6 +27236,14 @@ snapshots: uint8array-extras@1.5.0: {} + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + optional: true + undici-types@5.26.5: {} undici-types@7.18.2: {} @@ -26201,12 +27341,12 @@ snapshots: unpipe@1.0.0: {} - unplugin-swc@1.5.11(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(rolldown@1.2.5)(rollup@4.62.0)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.108.4(@swc/core@1.16.1(@swc/helpers@0.5.23))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(esbuild@0.28.2)(html-minifier-terser@7.2.0)(lightningcss@1.33.0)(postcss@8.5.26)(uglify-js@3.19.3)): + unplugin-swc@1.5.11(@swc/core@1.16.1(@swc/helpers@0.5.23))(esbuild@0.28.2)(rolldown@1.2.5)(rollup@4.62.0)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.108.4(@swc/core@1.16.1(@swc/helpers@0.5.23))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(esbuild@0.28.2)(html-minifier-terser@7.2.0)(lightningcss@1.33.0)(postcss@8.5.26)(uglify-js@3.19.3)): dependencies: '@rollup/pluginutils': 5.4.0(rollup@4.62.0) '@swc/core': 1.16.1(@swc/helpers@0.5.23) load-tsconfig: 0.2.5 - unplugin: 3.3.0(esbuild@0.28.2)(rolldown@1.2.5)(rollup@4.62.0)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.108.4(@swc/core@1.16.1(@swc/helpers@0.5.23))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(esbuild@0.28.2)(html-minifier-terser@7.2.0)(lightningcss@1.33.0)(postcss@8.5.26)(uglify-js@3.19.3)) + unplugin: 3.3.0(esbuild@0.28.2)(rolldown@1.2.5)(rollup@4.62.0)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.108.4(@swc/core@1.16.1(@swc/helpers@0.5.23))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(esbuild@0.28.2)(html-minifier-terser@7.2.0)(lightningcss@1.33.0)(postcss@8.5.26)(uglify-js@3.19.3)) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -26218,7 +27358,7 @@ snapshots: - vite - webpack - unplugin@3.3.0(esbuild@0.28.2)(rolldown@1.2.5)(rollup@4.62.0)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.108.4(@swc/core@1.16.1(@swc/helpers@0.5.23))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(esbuild@0.28.2)(html-minifier-terser@7.2.0)(lightningcss@1.33.0)(postcss@8.5.26)(uglify-js@3.19.3)): + unplugin@3.3.0(esbuild@0.28.2)(rolldown@1.2.5)(rollup@4.62.0)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0))(webpack@5.108.4(@swc/core@1.16.1(@swc/helpers@0.5.23))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(esbuild@0.28.2)(html-minifier-terser@7.2.0)(lightningcss@1.33.0)(postcss@8.5.26)(uglify-js@3.19.3)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.7 @@ -26227,9 +27367,36 @@ snapshots: esbuild: 0.28.2 rolldown: 1.2.5 rollup: 4.62.0 - vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0) + vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0) webpack: 5.108.4(@swc/core@1.16.1(@swc/helpers@0.5.23))(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(esbuild@0.28.2)(html-minifier-terser@7.2.0)(lightningcss@1.33.0)(postcss@8.5.26)(uglify-js@3.19.3) + unrs-resolver@1.12.2: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.12.2 + '@unrs/resolver-binding-android-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-x64': 1.12.2 + '@unrs/resolver-binding-freebsd-x64': 1.12.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.12.2 + '@unrs/resolver-binding-linux-loong64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-loong64-musl': 1.12.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.12.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-musl': 1.12.2 + '@unrs/resolver-binding-openharmony-arm64': 1.12.2 + '@unrs/resolver-binding-wasm32-wasi': 1.12.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 + update-browserslist-db@1.2.3(browserslist@4.28.6): dependencies: browserslist: 4.28.6 @@ -26349,6 +27516,23 @@ snapshots: - '@types/node' - rollup + vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0): + dependencies: + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.26 + rolldown: 1.2.5 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 24.13.3 + esbuild: 0.28.2 + fsevents: 2.3.3 + jiti: 1.21.7 + sass: 1.102.0 + terser: 5.49.0 + tsx: 4.23.12 + yaml: 2.9.0 + vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 @@ -26374,6 +27558,37 @@ snapshots: dependencies: vitest: 4.1.11(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/coverage-v8@4.1.11)(happy-dom@20.11.8)(jsdom@26.1.0(canvas@3.2.3)(supports-color@8.1.1))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0)) + vitest@4.1.11(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/coverage-v8@4.1.11)(happy-dom@20.11.8)(jsdom@26.1.0(canvas@3.2.3)(supports-color@8.1.1))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.11 + '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.11 + '@vitest/runner': 4.1.11 + '@vitest/snapshot': 4.1.11 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.4 + pathe: 2.0.3 + picomatch: 4.0.7 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.1 + vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@1.21.7)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@opentelemetry/api': 1.9.1 + '@types/node': 24.13.3 + '@vitest/coverage-v8': 4.1.11(vitest@4.1.11) + happy-dom: 20.11.8 + jsdom: 26.1.0(canvas@3.2.3)(supports-color@8.1.1) + transitivePeerDependencies: + - msw + vitest@4.1.11(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/coverage-v8@4.1.11)(happy-dom@20.11.8)(jsdom@26.1.0(canvas@3.2.3)(supports-color@8.1.1))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.102.0)(terser@5.49.0)(tsx@4.23.12)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.11 @@ -26633,8 +27848,53 @@ snapshots: when-exit@2.1.5: {} + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + optional: true + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.2.0 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.22 + optional: true + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + optional: true + which-module@2.0.1: {} + which-typed-array@1.1.22: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + optional: true + which@1.3.1: dependencies: isexe: 2.0.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0bb98ad9f..8ee0e396a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -27,6 +27,7 @@ allowBuilds: '@tailwindcss/oxide': true core-js-pure: false postman-code-generators: false + unrs-resolver: false overrides: canvas: 3.2.3 sharp: ^0.35.3 diff --git a/server/.prettierrc b/server/.prettierrc index b0daf15ef..7cebf3813 100644 --- a/server/.prettierrc +++ b/server/.prettierrc @@ -2,7 +2,5 @@ "singleQuote": true, "trailingComma": "all", "printWidth": 120, - "semi": true, - "organizeImportsSkipDestructiveCodeActions": true, - "plugins": ["prettier-plugin-organize-imports"] + "semi": true } diff --git a/server/eslint.config.mjs b/server/eslint.config.mjs index 241d8fd53..e65812a72 100644 --- a/server/eslint.config.mjs +++ b/server/eslint.config.mjs @@ -1,14 +1,17 @@ import js from '@eslint/js'; +import { importX } from 'eslint-plugin-import-x'; import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; import eslintPluginUnicorn from 'eslint-plugin-unicorn'; +import { defineConfig } from 'eslint/config'; import globals from 'globals'; import typescriptEslint from 'typescript-eslint'; -export default typescriptEslint.config([ +export default defineConfig([ eslintPluginUnicorn.configs.recommended, - eslintPluginPrettierRecommended, js.configs.recommended, typescriptEslint.configs.recommended, + importX.flatConfigs.recommended, + importX.flatConfigs.typescript, { ignores: ['eslint.config.mjs'], }, @@ -70,9 +73,19 @@ export default typescriptEslint.config([ 'require-await': 'off', '@typescript-eslint/require-await': 'error', curly: 2, - 'prettier/prettier': 0, 'object-shorthand': ['error', 'always'], eqeqeq: 'error', + 'import-x/no-named-as-default': 'off', + 'import-x/order': [ + 'error', + { + groups: [['builtin', 'external'], 'index', ['parent', 'sibling', 'type']], + alphabetize: { order: 'asc' }, + named: true, + }, + ], + 'import-x/newline-after-import': 'error', + 'import-x/no-empty-named-blocks': 'error', 'no-restricted-imports': [ 'error', @@ -95,4 +108,5 @@ export default typescriptEslint.config([ ], }, }, + eslintPluginPrettierRecommended, ]); diff --git a/server/package.json b/server/package.json index 39342edc4..fb432ecaf 100644 --- a/server/package.json +++ b/server/package.json @@ -154,13 +154,14 @@ "@vitest/coverage-v8": "^4.0.0", "eslint": "^10.0.0", "eslint-config-prettier": "^10.1.8", + "eslint-import-resolver-typescript": "^4.4.5", + "eslint-plugin-import-x": "^4.17.1", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-unicorn": "^73.0.0", "globals": "^17.0.0", "mock-fs": "^5.2.0", "pngjs": "^7.0.0", "prettier": "^3.7.4", - "prettier-plugin-organize-imports": "^4.0.0", "sql-formatter": "^15.0.0", "supertest": "^7.1.0", "tailwindcss": "^3.4.0", diff --git a/server/src/app.module.ts b/server/src/app.module.ts index b933dcbbc..83bf21108 100644 --- a/server/src/app.module.ts +++ b/server/src/app.module.ts @@ -29,7 +29,7 @@ import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { ProcessRepository } from 'src/repositories/process.repository.js'; import { StorageRepository } from 'src/repositories/storage.repository.js'; import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository.js'; -import { teardownTelemetry, TelemetryRepository } from 'src/repositories/telemetry.repository.js'; +import { TelemetryRepository, teardownTelemetry } from 'src/repositories/telemetry.repository.js'; import { UserRepository } from 'src/repositories/user.repository.js'; import { WebsocketRepository } from 'src/repositories/websocket.repository.js'; import { AuthService } from 'src/services/auth.service.js'; diff --git a/server/src/controllers/activity.controller.spec.ts b/server/src/controllers/activity.controller.spec.ts index 83ec4c697..bf8025fe5 100644 --- a/server/src/controllers/activity.controller.spec.ts +++ b/server/src/controllers/activity.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { ActivityController } from 'src/controllers/activity.controller.js'; import { ActivityService } from 'src/services/activity.service.js'; -import request from 'supertest'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/activity.controller.ts b/server/src/controllers/activity.controller.ts index 1098200f9..e91c6798b 100644 --- a/server/src/controllers/activity.controller.ts +++ b/server/src/controllers/activity.controller.ts @@ -1,6 +1,7 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Query, Res } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import type { Response } from 'express'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { ActivityCreateDto, @@ -9,7 +10,6 @@ import { ActivitySearchDto, ActivityStatisticsResponseDto, } from 'src/dtos/activity.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated } from 'src/middleware/auth.guard.js'; import { ActivityService } from 'src/services/activity.service.js'; diff --git a/server/src/controllers/album.controller.spec.ts b/server/src/controllers/album.controller.spec.ts index da85c3c9e..580965ebe 100644 --- a/server/src/controllers/album.controller.spec.ts +++ b/server/src/controllers/album.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { AlbumController } from 'src/controllers/album.controller.js'; import { AlbumService } from 'src/services/album.service.js'; -import request from 'supertest'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/album.controller.ts b/server/src/controllers/album.controller.ts index 70ebc13a1..407666da9 100644 --- a/server/src/controllers/album.controller.ts +++ b/server/src/controllers/album.controller.ts @@ -1,20 +1,20 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Patch, Post, Put, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { AddUsersDto, AlbumResponseDto, - AlbumsAddAssetsDto, - AlbumsAddAssetsResponseDto, AlbumStatisticsResponseDto, AlbumUserParamDto, + AlbumsAddAssetsDto, + AlbumsAddAssetsResponseDto, CreateAlbumDto, GetAlbumsDto, UpdateAlbumDto, UpdateAlbumUserDto, } from 'src/dtos/album.dto.js'; import { BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { MapMarkerResponseDto } from 'src/dtos/map.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated } from 'src/middleware/auth.guard.js'; diff --git a/server/src/controllers/api-key.controller.spec.ts b/server/src/controllers/api-key.controller.spec.ts index d6a54370c..5a3447bf9 100644 --- a/server/src/controllers/api-key.controller.spec.ts +++ b/server/src/controllers/api-key.controller.spec.ts @@ -1,7 +1,7 @@ +import request from 'supertest'; import { ApiKeyController } from 'src/controllers/api-key.controller.js'; import { Permission } from 'src/enum.js'; import { ApiKeyService } from 'src/services/api-key.service.js'; -import request from 'supertest'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/api-key.controller.ts b/server/src/controllers/api-key.controller.ts index fb5be4ec5..7c81104ac 100644 --- a/server/src/controllers/api-key.controller.ts +++ b/server/src/controllers/api-key.controller.ts @@ -1,8 +1,8 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Patch, Post, Put } from '@nestjs/common'; import { ApiExcludeEndpoint, ApiTags } from '@nestjs/swagger'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { ApiKeyCreateDto, ApiKeyCreateResponseDto, ApiKeyResponseDto, ApiKeyUpdateDto } from 'src/dtos/api-key.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated } from 'src/middleware/auth.guard.js'; import { ApiKeyService } from 'src/services/api-key.service.js'; diff --git a/server/src/controllers/app.controller.spec.ts b/server/src/controllers/app.controller.spec.ts index bc659f897..5307c28dc 100644 --- a/server/src/controllers/app.controller.spec.ts +++ b/server/src/controllers/app.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { AppController } from 'src/controllers/app.controller.js'; import { SystemConfigService } from 'src/services/system-config.service.js'; -import request from 'supertest'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; describe(AppController.name, () => { diff --git a/server/src/controllers/asset-file.controller.ts b/server/src/controllers/asset-file.controller.ts index f73ac7d0e..c36148cdf 100644 --- a/server/src/controllers/asset-file.controller.ts +++ b/server/src/controllers/asset-file.controller.ts @@ -1,9 +1,9 @@ import { Controller, Delete, Get, HttpCode, HttpStatus, Next, Param, Query, Res } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import type { NextFunction, Response } from 'express'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { AssetFileResponseDto, AssetFileSearchDto } from 'src/dtos/asset-file.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated, FileResponse } from 'src/middleware/auth.guard.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; diff --git a/server/src/controllers/asset-media.controller.spec.ts b/server/src/controllers/asset-media.controller.spec.ts index 9887d4490..8c6304d22 100644 --- a/server/src/controllers/asset-media.controller.spec.ts +++ b/server/src/controllers/asset-media.controller.spec.ts @@ -1,11 +1,11 @@ +import request from 'supertest'; import { AssetMediaController } from 'src/controllers/asset-media.controller.js'; import { AssetMediaStatus } from 'src/dtos/asset-media-response.dto.js'; import { AssetMetadataKey } from 'src/enum.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { AssetMediaService } from 'src/services/asset-media.service.js'; -import request from 'supertest'; import { factory } from 'test/small.factory.js'; -import { automock, ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; +import { ControllerContext, automock, controllerSetup, mockBaseService } from 'test/utils.js'; const makeUploadDto = (options?: { omit: string }): Record => { const dto: Record = { diff --git a/server/src/controllers/asset-media.controller.ts b/server/src/controllers/asset-media.controller.ts index 1646c867e..8ea527e45 100644 --- a/server/src/controllers/asset-media.controller.ts +++ b/server/src/controllers/asset-media.controller.ts @@ -16,6 +16,7 @@ import { } from '@nestjs/common'; import { ApiBody, ApiConsumes, ApiHeader, ApiResponse, ApiTags } from '@nestjs/swagger'; import { type NextFunction, type Request, type Response } from 'express'; +import type { UploadFiles } from 'src/types.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { AssetBulkUploadCheckResponseDto, @@ -36,7 +37,6 @@ import { Auth, Authenticated, FileResponse } from 'src/middleware/auth.guard.js' import { FileUploadInterceptor, getFiles } from 'src/middleware/file-upload.interceptor.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { AssetMediaService } from 'src/services/asset-media.service.js'; -import type { UploadFiles } from 'src/types.js'; import { ImmichFileResponse, sendFile } from 'src/utils/file.js'; import { FileNotEmptyValidator, UUIDParamDto } from 'src/validation.js'; diff --git a/server/src/controllers/asset.controller.spec.ts b/server/src/controllers/asset.controller.spec.ts index d95025385..c6160f8f5 100644 --- a/server/src/controllers/asset.controller.spec.ts +++ b/server/src/controllers/asset.controller.spec.ts @@ -1,7 +1,7 @@ +import request from 'supertest'; import { AssetController } from 'src/controllers/asset.controller.js'; import { AssetMetadataKey } from 'src/enum.js'; import { AssetService } from 'src/services/asset.service.js'; -import request from 'supertest'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/asset.controller.ts b/server/src/controllers/asset.controller.ts index 93e89983c..5816de020 100644 --- a/server/src/controllers/asset.controller.ts +++ b/server/src/controllers/asset.controller.ts @@ -1,5 +1,6 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Patch, Post, Put, Query } from '@nestjs/common'; import { ApiExcludeEndpoint, ApiTags } from '@nestjs/swagger'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { AssetResponseDto } from 'src/dtos/asset-response.dto.js'; import { @@ -17,7 +18,6 @@ import { AssetStatsResponseDto, UpdateAssetDto, } from 'src/dtos/asset.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { AssetEditsCreateDto, AssetEditsResponseDto } from 'src/dtos/editing.dto.js'; import { AssetOcrResponseDto } from 'src/dtos/ocr.dto.js'; import { ApiTag, Permission, RouteKey } from 'src/enum.js'; diff --git a/server/src/controllers/auth-admin.controller.ts b/server/src/controllers/auth-admin.controller.ts index 49895b93a..22ad233cc 100644 --- a/server/src/controllers/auth-admin.controller.ts +++ b/server/src/controllers/auth-admin.controller.ts @@ -1,7 +1,7 @@ import { Controller, HttpCode, HttpStatus, Post } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated } from 'src/middleware/auth.guard.js'; import { AuthAdminService } from 'src/services/auth-admin.service.js'; diff --git a/server/src/controllers/auth.controller.spec.ts b/server/src/controllers/auth.controller.spec.ts index c110e703c..ce9e008e7 100644 --- a/server/src/controllers/auth.controller.spec.ts +++ b/server/src/controllers/auth.controller.spec.ts @@ -1,10 +1,10 @@ import { BadRequestException } from '@nestjs/common'; +import request from 'supertest'; import { AuthController } from 'src/controllers/auth.controller.js'; import { LoginResponseDto } from 'src/dtos/auth.dto.js'; import { AuthService } from 'src/services/auth.service.js'; -import request from 'supertest'; -import { mediumFactory } from 'test/medium.factory.js'; import { errorDto } from 'test/medium/responses.js'; +import { mediumFactory } from 'test/medium.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; describe(AuthController.name, () => { diff --git a/server/src/controllers/cluster-group.controller.ts b/server/src/controllers/cluster-group.controller.ts index c26d8ff67..d72598cc1 100644 --- a/server/src/controllers/cluster-group.controller.ts +++ b/server/src/controllers/cluster-group.controller.ts @@ -1,8 +1,8 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put, Res } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import type { Response } from 'express'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { ClusterGroupRequestCreateDto, ClusterGroupRequestResponseDto } from 'src/dtos/cluster-group.dto.js'; import { UserResponseDto } from 'src/dtos/user.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; diff --git a/server/src/controllers/config.controller.spec.ts b/server/src/controllers/config.controller.spec.ts index c1e0cb3b5..edf6873a9 100644 --- a/server/src/controllers/config.controller.spec.ts +++ b/server/src/controllers/config.controller.spec.ts @@ -1,10 +1,10 @@ import { cloneDeep } from 'lodash-es'; +import request from 'supertest'; import { ConfigAdminController } from 'src/controllers/config-admin.controller.js'; import { ConfigPublicController } from 'src/controllers/config-public.controller.js'; import { ConfigUserController } from 'src/controllers/config-user.controller.js'; import { defaults, mapPublicConfig, mapUserConfig } from 'src/dtos/config.dto.js'; import { SystemConfigService } from 'src/services/system-config.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/database-backup.controller.spec.ts b/server/src/controllers/database-backup.controller.spec.ts index 1901ce98b..c4311fbfd 100644 --- a/server/src/controllers/database-backup.controller.spec.ts +++ b/server/src/controllers/database-backup.controller.spec.ts @@ -1,10 +1,10 @@ import { BadRequestException } from '@nestjs/common'; +import request from 'supertest'; import { DatabaseBackupController } from 'src/controllers/database-backup.controller.js'; import { DatabaseBackupService } from 'src/services/database-backup.service.js'; import { MaintenanceService } from 'src/services/maintenance.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; -import { automock, ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; +import { ControllerContext, automock, controllerSetup, mockBaseService } from 'test/utils.js'; describe(DatabaseBackupController.name, () => { let ctx: ControllerContext; diff --git a/server/src/controllers/database-backup.controller.ts b/server/src/controllers/database-backup.controller.ts index 83aba5502..b8ef61fb3 100644 --- a/server/src/controllers/database-backup.controller.ts +++ b/server/src/controllers/database-backup.controller.ts @@ -2,6 +2,7 @@ import { Body, Controller, Delete, Get, Next, Param, Post, Res, UploadedFile, Us import { FileInterceptor } from '@nestjs/platform-express'; import { ApiBody, ApiConsumes, ApiTags } from '@nestjs/swagger'; import type { NextFunction, Response } from 'express'; +import type { LoginDetails } from 'src/services/auth.service.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { DatabaseBackupDeleteDto, @@ -11,7 +12,6 @@ import { import { ApiTag, ImmichCookie, Permission } from 'src/enum.js'; import { Authenticated, FileResponse, GetLoginDetails } from 'src/middleware/auth.guard.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; -import type { LoginDetails } from 'src/services/auth.service.js'; import { DatabaseBackupService } from 'src/services/database-backup.service.js'; import { MaintenanceService } from 'src/services/maintenance.service.js'; import { sendFile } from 'src/utils/file.js'; diff --git a/server/src/controllers/download.controller.spec.ts b/server/src/controllers/download.controller.spec.ts index b56ac2607..7b8280881 100644 --- a/server/src/controllers/download.controller.spec.ts +++ b/server/src/controllers/download.controller.spec.ts @@ -1,7 +1,7 @@ import { Readable } from 'node:stream'; +import request from 'supertest'; import { DownloadController } from 'src/controllers/download.controller.js'; import { DownloadService } from 'src/services/download.service.js'; -import request from 'supertest'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/download.controller.ts b/server/src/controllers/download.controller.ts index 2066247eb..803cb634e 100644 --- a/server/src/controllers/download.controller.ts +++ b/server/src/controllers/download.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, HttpCode, HttpStatus, Post, StreamableFile } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { DownloadArchiveDto, DownloadInfoDto, DownloadResponseDto } from 'src/dtos/download.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated, FileResponse } from 'src/middleware/auth.guard.js'; diff --git a/server/src/controllers/duplicate.controller.spec.ts b/server/src/controllers/duplicate.controller.spec.ts index b1dd6e5f6..78fff2b2a 100644 --- a/server/src/controllers/duplicate.controller.spec.ts +++ b/server/src/controllers/duplicate.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { DuplicateController } from 'src/controllers/duplicate.controller.js'; import { DuplicateService } from 'src/services/duplicate.service.js'; -import request from 'supertest'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/duplicate.controller.ts b/server/src/controllers/duplicate.controller.ts index 0ecede242..3cb147f5f 100644 --- a/server/src/controllers/duplicate.controller.ts +++ b/server/src/controllers/duplicate.controller.ts @@ -1,8 +1,8 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { DuplicateResolveDto, DuplicateResponseDto } from 'src/dtos/duplicate.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated } from 'src/middleware/auth.guard.js'; diff --git a/server/src/controllers/face.controller.ts b/server/src/controllers/face.controller.ts index 2865d338a..a5f8076f1 100644 --- a/server/src/controllers/face.controller.ts +++ b/server/src/controllers/face.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { AssetFaceCreateDto, AssetFaceDeleteDto, diff --git a/server/src/controllers/integrity-admin.controller.ts b/server/src/controllers/integrity-admin.controller.ts index 856130ad6..52bc91779 100644 --- a/server/src/controllers/integrity-admin.controller.ts +++ b/server/src/controllers/integrity-admin.controller.ts @@ -1,8 +1,8 @@ import { Controller, Delete, Get, HttpCode, HttpStatus, Next, Param, Query, Res } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import type { NextFunction, Response } from 'express'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { IntegrityGetReportDto, IntegrityReportResponseDto, diff --git a/server/src/controllers/job.controller.spec.ts b/server/src/controllers/job.controller.spec.ts index 133231e5d..df1af0211 100644 --- a/server/src/controllers/job.controller.spec.ts +++ b/server/src/controllers/job.controller.spec.ts @@ -1,7 +1,7 @@ +import request from 'supertest'; import { JobController } from 'src/controllers/job.controller.js'; import { JobService } from 'src/services/job.service.js'; import { QueueService } from 'src/services/queue.service.js'; -import request from 'supertest'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; describe(JobController.name, () => { diff --git a/server/src/controllers/job.controller.ts b/server/src/controllers/job.controller.ts index 870f80f77..afd2ae6a7 100644 --- a/server/src/controllers/job.controller.ts +++ b/server/src/controllers/job.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, Get, HttpCode, HttpStatus, Param, Post, Put } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { JobCreateDto } from 'src/dtos/job.dto.js'; import { QueueResponseLegacyDto, QueuesResponseLegacyDto } from 'src/dtos/queue-legacy.dto.js'; import { QueueCommandDto, QueueNameParamDto } from 'src/dtos/queue.dto.js'; diff --git a/server/src/controllers/library.controller.spec.ts b/server/src/controllers/library.controller.spec.ts index 706d03bbd..d2ed7667c 100644 --- a/server/src/controllers/library.controller.spec.ts +++ b/server/src/controllers/library.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { LibraryController } from 'src/controllers/library.controller.js'; import { LibraryService } from 'src/services/library.service.js'; -import request from 'supertest'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/maintenance.controller.spec.ts b/server/src/controllers/maintenance.controller.spec.ts index 19b1b5a1f..cb1323b6c 100644 --- a/server/src/controllers/maintenance.controller.spec.ts +++ b/server/src/controllers/maintenance.controller.spec.ts @@ -1,7 +1,7 @@ +import request from 'supertest'; import { MaintenanceController } from 'src/controllers/maintenance.controller.js'; import { MaintenanceAction } from 'src/enum.js'; import { MaintenanceService } from 'src/services/maintenance.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/maintenance.controller.ts b/server/src/controllers/maintenance.controller.ts index 9715f396d..bd38fc0b6 100644 --- a/server/src/controllers/maintenance.controller.ts +++ b/server/src/controllers/maintenance.controller.ts @@ -1,8 +1,9 @@ import { BadRequestException, Body, Controller, Get, Post, Res } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import type { Response } from 'express'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import type { LoginDetails } from 'src/services/auth.service.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { MaintenanceAuthDto, MaintenanceDetectInstallResponseDto, @@ -12,7 +13,6 @@ import { } from 'src/dtos/maintenance.dto.js'; import { ApiTag, ImmichCookie, MaintenanceAction, Permission } from 'src/enum.js'; import { Auth, Authenticated, GetLoginDetails } from 'src/middleware/auth.guard.js'; -import type { LoginDetails } from 'src/services/auth.service.js'; import { MaintenanceService } from 'src/services/maintenance.service.js'; import { respondWithCookie } from 'src/utils/response.js'; diff --git a/server/src/controllers/map.controller.spec.ts b/server/src/controllers/map.controller.spec.ts index 7e4ea05a5..00a944c26 100644 --- a/server/src/controllers/map.controller.spec.ts +++ b/server/src/controllers/map.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { MapController } from 'src/controllers/map.controller.js'; import { MapService } from 'src/services/map.service.js'; -import request from 'supertest'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/map.controller.ts b/server/src/controllers/map.controller.ts index 8cb9d4bb6..7d881179c 100644 --- a/server/src/controllers/map.controller.ts +++ b/server/src/controllers/map.controller.ts @@ -1,7 +1,7 @@ import { Controller, Get, HttpCode, HttpStatus, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { MapMarkerDto, MapMarkerResponseDto, diff --git a/server/src/controllers/memory.controller.spec.ts b/server/src/controllers/memory.controller.spec.ts index d35b46dcf..a42b539fd 100644 --- a/server/src/controllers/memory.controller.spec.ts +++ b/server/src/controllers/memory.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { MemoryController } from 'src/controllers/memory.controller.js'; import { MemoryService } from 'src/services/memory.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/memory.controller.ts b/server/src/controllers/memory.controller.ts index 236896b9b..e19a30461 100644 --- a/server/src/controllers/memory.controller.ts +++ b/server/src/controllers/memory.controller.ts @@ -1,8 +1,8 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Patch, Post, Put, Query } from '@nestjs/common'; import { ApiExcludeEndpoint, ApiTags } from '@nestjs/swagger'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { MemoryCreateDto, MemoryResponseDto, diff --git a/server/src/controllers/notification-admin.controller.spec.ts b/server/src/controllers/notification-admin.controller.spec.ts index 99796592b..dd71439bd 100644 --- a/server/src/controllers/notification-admin.controller.spec.ts +++ b/server/src/controllers/notification-admin.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { NotificationAdminController } from 'src/controllers/notification-admin.controller.js'; import { NotificationAdminService } from 'src/services/notification-admin.service.js'; -import request from 'supertest'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/notification-admin.controller.ts b/server/src/controllers/notification-admin.controller.ts index a3f512659..bc1de5268 100644 --- a/server/src/controllers/notification-admin.controller.ts +++ b/server/src/controllers/notification-admin.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, HttpCode, HttpStatus, Param, Post } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { SystemConfigSmtpDto } from 'src/dtos/config.dto.js'; import { NotificationCreateDto, diff --git a/server/src/controllers/notification.controller.spec.ts b/server/src/controllers/notification.controller.spec.ts index ebd4e01ba..d677617ac 100644 --- a/server/src/controllers/notification.controller.spec.ts +++ b/server/src/controllers/notification.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { NotificationController } from 'src/controllers/notification.controller.js'; import { NotificationService } from 'src/services/notification.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/notification.controller.ts b/server/src/controllers/notification.controller.ts index 053ef70e4..0d0122f83 100644 --- a/server/src/controllers/notification.controller.ts +++ b/server/src/controllers/notification.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Put, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { NotificationDeleteAllDto, NotificationDto, diff --git a/server/src/controllers/oauth.controller.spec.ts b/server/src/controllers/oauth.controller.spec.ts index b03aca443..59aed3458 100644 --- a/server/src/controllers/oauth.controller.spec.ts +++ b/server/src/controllers/oauth.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { OAuthController } from 'src/controllers/oauth.controller.js'; import { AuthService } from 'src/services/auth.service.js'; -import request from 'supertest'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/partner.controller.spec.ts b/server/src/controllers/partner.controller.spec.ts index 8e0b7b19d..b6216cdaa 100644 --- a/server/src/controllers/partner.controller.spec.ts +++ b/server/src/controllers/partner.controller.spec.ts @@ -1,9 +1,9 @@ +import request from 'supertest'; import { PartnerController } from 'src/controllers/partner.controller.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { PartnerService } from 'src/services/partner.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; -import { automock, ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; +import { ControllerContext, automock, controllerSetup, mockBaseService } from 'test/utils.js'; describe(PartnerController.name, () => { let ctx: ControllerContext; diff --git a/server/src/controllers/partner.controller.ts b/server/src/controllers/partner.controller.ts index ffef961ec..bc4e8c122 100644 --- a/server/src/controllers/partner.controller.ts +++ b/server/src/controllers/partner.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { PartnerCreateDto, PartnerResponseDto, PartnerSearchDto, PartnerUpdateDto } from 'src/dtos/partner.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated } from 'src/middleware/auth.guard.js'; diff --git a/server/src/controllers/person.controller.spec.ts b/server/src/controllers/person.controller.spec.ts index 986f4f11c..34cc811fb 100644 --- a/server/src/controllers/person.controller.spec.ts +++ b/server/src/controllers/person.controller.spec.ts @@ -1,10 +1,10 @@ +import request from 'supertest'; import { PersonController } from 'src/controllers/person.controller.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { PersonService } from 'src/services/person.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { factory } from 'test/small.factory.js'; -import { automock, ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; +import { ControllerContext, automock, controllerSetup, mockBaseService } from 'test/utils.js'; describe(PersonController.name, () => { let ctx: ControllerContext; diff --git a/server/src/controllers/person.controller.ts b/server/src/controllers/person.controller.ts index 3878747f1..c9980486b 100644 --- a/server/src/controllers/person.controller.ts +++ b/server/src/controllers/person.controller.ts @@ -15,9 +15,9 @@ import { } from '@nestjs/common'; import { ApiExcludeEndpoint, ApiTags } from '@nestjs/swagger'; import type { NextFunction, Response } from 'express'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { AssetFaceUpdateDto, MergePersonDto, diff --git a/server/src/controllers/plugin.controller.spec.ts b/server/src/controllers/plugin.controller.spec.ts index 1f5b63567..b657e30d6 100644 --- a/server/src/controllers/plugin.controller.spec.ts +++ b/server/src/controllers/plugin.controller.spec.ts @@ -1,9 +1,9 @@ +import request from 'supertest'; import { PluginController } from 'src/controllers/plugin.controller.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { PluginService } from 'src/services/plugin.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; -import { automock, ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; +import { ControllerContext, automock, controllerSetup, mockBaseService } from 'test/utils.js'; describe(PluginController.name, () => { let ctx: ControllerContext; diff --git a/server/src/controllers/queue.controller.ts b/server/src/controllers/queue.controller.ts index ff0293c50..cfea006a2 100644 --- a/server/src/controllers/queue.controller.ts +++ b/server/src/controllers/queue.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Put, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { QueueDeleteDto, QueueJobResponseDto, diff --git a/server/src/controllers/search.controller.spec.ts b/server/src/controllers/search.controller.spec.ts index a94d25555..f8d37e912 100644 --- a/server/src/controllers/search.controller.spec.ts +++ b/server/src/controllers/search.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { SearchController } from 'src/controllers/search.controller.js'; import { SearchService } from 'src/services/search.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/search.controller.ts b/server/src/controllers/search.controller.ts index 766874d2c..1a8039189 100644 --- a/server/src/controllers/search.controller.ts +++ b/server/src/controllers/search.controller.ts @@ -1,8 +1,8 @@ import { Body, Controller, Get, HttpCode, HttpStatus, Post, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { AssetResponseDto } from 'src/dtos/asset-response.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { PersonResponseDto } from 'src/dtos/person.dto.js'; import { LargeAssetSearchDto, diff --git a/server/src/controllers/session.controller.ts b/server/src/controllers/session.controller.ts index bc4a00126..ae3e24a11 100644 --- a/server/src/controllers/session.controller.ts +++ b/server/src/controllers/session.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Patch, Post, Put } from '@nestjs/common'; import { ApiExcludeEndpoint, ApiTags } from '@nestjs/swagger'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { SessionCreateDto, SessionCreateResponseDto, diff --git a/server/src/controllers/shared-link.controller.spec.ts b/server/src/controllers/shared-link.controller.spec.ts index 84711811a..336bf9137 100644 --- a/server/src/controllers/shared-link.controller.spec.ts +++ b/server/src/controllers/shared-link.controller.spec.ts @@ -1,7 +1,7 @@ +import request from 'supertest'; import { SharedLinkController } from 'src/controllers/shared-link.controller.js'; import { Permission, SharedLinkType } from 'src/enum.js'; import { SharedLinkService } from 'src/services/shared-link.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { factory, newUuid } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/shared-link.controller.ts b/server/src/controllers/shared-link.controller.ts index ee59042fc..a48afdb64 100644 --- a/server/src/controllers/shared-link.controller.ts +++ b/server/src/controllers/shared-link.controller.ts @@ -15,10 +15,11 @@ import { } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import type { Request, Response } from 'express'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; +import type { LoginDetails } from 'src/services/auth.service.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { AssetIdsResponseDto } from 'src/dtos/asset-ids.response.dto.js'; import { AssetIdsDto } from 'src/dtos/asset.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { SharedLinkCreateDto, SharedLinkEditDto, @@ -29,7 +30,6 @@ import { import { ApiTag, ImmichCookie, Permission } from 'src/enum.js'; import { Auth, Authenticated, GetLoginDetails } from 'src/middleware/auth.guard.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; -import type { LoginDetails } from 'src/services/auth.service.js'; import { SharedLinkService } from 'src/services/shared-link.service.js'; import { respondWithCookie } from 'src/utils/response.js'; import { UUIDParamDto } from 'src/validation.js'; diff --git a/server/src/controllers/stack.controller.spec.ts b/server/src/controllers/stack.controller.spec.ts index 46fbbb57a..6ae0be940 100644 --- a/server/src/controllers/stack.controller.spec.ts +++ b/server/src/controllers/stack.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { StackController } from 'src/controllers/stack.controller.js'; import { StackService } from 'src/services/stack.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/stack.controller.ts b/server/src/controllers/stack.controller.ts index 55bbdac8b..334934e0c 100644 --- a/server/src/controllers/stack.controller.ts +++ b/server/src/controllers/stack.controller.ts @@ -1,8 +1,8 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Patch, Post, Put, Query } from '@nestjs/common'; import { ApiExcludeEndpoint, ApiTags } from '@nestjs/swagger'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { BulkIdsDto } from 'src/dtos/asset-ids.response.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { StackCreateDto, StackResponseDto, StackSearchDto, StackUpdateDto } from 'src/dtos/stack.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated } from 'src/middleware/auth.guard.js'; diff --git a/server/src/controllers/sync.controller.spec.ts b/server/src/controllers/sync.controller.spec.ts index 191877980..505468193 100644 --- a/server/src/controllers/sync.controller.spec.ts +++ b/server/src/controllers/sync.controller.spec.ts @@ -1,7 +1,7 @@ +import request from 'supertest'; import { SyncController } from 'src/controllers/sync.controller.js'; import { GlobalExceptionFilter } from 'src/middleware/global-exception.filter.js'; import { SyncService } from 'src/services/sync.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/sync.controller.ts b/server/src/controllers/sync.controller.ts index 922d48f7b..7ff5cfbf6 100644 --- a/server/src/controllers/sync.controller.ts +++ b/server/src/controllers/sync.controller.ts @@ -1,8 +1,8 @@ import { Body, Controller, Delete, Get, Header, HttpCode, HttpStatus, Post, Req, Res } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import type { Request, Response } from 'express'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { SyncAckDeleteDto, SyncAckDto, SyncAckSetDto, SyncStreamDto } from 'src/dtos/sync.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated } from 'src/middleware/auth.guard.js'; diff --git a/server/src/controllers/system-config.controller.spec.ts b/server/src/controllers/system-config.controller.spec.ts index 72f6bdb38..26e7533cc 100644 --- a/server/src/controllers/system-config.controller.spec.ts +++ b/server/src/controllers/system-config.controller.spec.ts @@ -1,9 +1,9 @@ import { cloneDeep } from 'lodash-es'; +import request from 'supertest'; import { SystemConfigController } from 'src/controllers/system-config.controller.js'; import { defaults } from 'src/dtos/config.dto.js'; import { StorageTemplateService } from 'src/services/storage-template.service.js'; import { SystemConfigService } from 'src/services/system-config.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/system-metadata.controller.spec.ts b/server/src/controllers/system-metadata.controller.spec.ts index 0d021d0f0..617476ebb 100644 --- a/server/src/controllers/system-metadata.controller.spec.ts +++ b/server/src/controllers/system-metadata.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { SystemMetadataController } from 'src/controllers/system-metadata.controller.js'; import { SystemMetadataService } from 'src/services/system-metadata.service.js'; -import request from 'supertest'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; describe(SystemMetadataController.name, () => { diff --git a/server/src/controllers/tag.controller.spec.ts b/server/src/controllers/tag.controller.spec.ts index cfcda8e99..e3820ff14 100644 --- a/server/src/controllers/tag.controller.spec.ts +++ b/server/src/controllers/tag.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { TagController } from 'src/controllers/tag.controller.js'; import { TagService } from 'src/services/tag.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/tag.controller.ts b/server/src/controllers/tag.controller.ts index b56375c98..7fd8069f2 100644 --- a/server/src/controllers/tag.controller.ts +++ b/server/src/controllers/tag.controller.ts @@ -1,8 +1,8 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Patch, Post, Put } from '@nestjs/common'; import { ApiExcludeEndpoint, ApiTags } from '@nestjs/swagger'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { TagBulkAssetsDto, TagBulkAssetsResponseDto, diff --git a/server/src/controllers/timeline.controller.spec.ts b/server/src/controllers/timeline.controller.spec.ts index 18ff964d4..9d2b4f663 100644 --- a/server/src/controllers/timeline.controller.spec.ts +++ b/server/src/controllers/timeline.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { TimelineController } from 'src/controllers/timeline.controller.js'; import { TimelineService } from 'src/services/timeline.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/timeline.controller.ts b/server/src/controllers/timeline.controller.ts index a3c140275..ddcef5f29 100644 --- a/server/src/controllers/timeline.controller.ts +++ b/server/src/controllers/timeline.controller.ts @@ -1,7 +1,7 @@ import { Controller, Get, Header, Query } from '@nestjs/common'; import { ApiOkResponse, ApiTags } from '@nestjs/swagger'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { TimeBucketAssetDto, TimeBucketAssetResponseDto, TimeBucketDto } from 'src/dtos/time-bucket.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated } from 'src/middleware/auth.guard.js'; diff --git a/server/src/controllers/trash.controller.spec.ts b/server/src/controllers/trash.controller.spec.ts index dfbec3aae..749ae1969 100644 --- a/server/src/controllers/trash.controller.spec.ts +++ b/server/src/controllers/trash.controller.spec.ts @@ -1,6 +1,6 @@ +import request from 'supertest'; import { TrashController } from 'src/controllers/trash.controller.js'; import { TrashService } from 'src/services/trash.service.js'; -import request from 'supertest'; import { factory } from 'test/small.factory.js'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; diff --git a/server/src/controllers/trash.controller.ts b/server/src/controllers/trash.controller.ts index e2c97aa6e..c745fa0a3 100644 --- a/server/src/controllers/trash.controller.ts +++ b/server/src/controllers/trash.controller.ts @@ -1,8 +1,8 @@ import { Body, Controller, HttpCode, HttpStatus, Post } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { BulkIdsDto } from 'src/dtos/asset-ids.response.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { TrashResponseDto } from 'src/dtos/trash.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated } from 'src/middleware/auth.guard.js'; diff --git a/server/src/controllers/user-admin.controller.spec.ts b/server/src/controllers/user-admin.controller.spec.ts index 721e4bb08..adc9d1877 100644 --- a/server/src/controllers/user-admin.controller.spec.ts +++ b/server/src/controllers/user-admin.controller.spec.ts @@ -1,11 +1,11 @@ +import request from 'supertest'; import { UserAdminController } from 'src/controllers/user-admin.controller.js'; import { UserAdminCreateDto } from 'src/dtos/user.dto.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { UserAdminService } from 'src/services/user-admin.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; import { factory } from 'test/small.factory.js'; -import { automock, ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; +import { ControllerContext, automock, controllerSetup, mockBaseService } from 'test/utils.js'; describe(UserAdminController.name, () => { let ctx: ControllerContext; diff --git a/server/src/controllers/user-admin.controller.ts b/server/src/controllers/user-admin.controller.ts index 867dd22a1..8011f31c5 100644 --- a/server/src/controllers/user-admin.controller.ts +++ b/server/src/controllers/user-admin.controller.ts @@ -1,8 +1,8 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Patch, Post, Put, Query } from '@nestjs/common'; import { ApiExcludeEndpoint, ApiTags } from '@nestjs/swagger'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { AssetStatsDto, AssetStatsResponseDto } from 'src/dtos/asset.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { CalendarHeatmapDto, CalendarHeatmapResponseDto } from 'src/dtos/calendar-heatmap.dto.js'; import { SessionResponseDto } from 'src/dtos/session.dto.js'; import { UserPreferencesResponseDto, UserPreferencesUpdateDto } from 'src/dtos/user-preferences.dto.js'; diff --git a/server/src/controllers/user.controller.spec.ts b/server/src/controllers/user.controller.spec.ts index 33ec36cf2..fca29a3b9 100644 --- a/server/src/controllers/user.controller.spec.ts +++ b/server/src/controllers/user.controller.spec.ts @@ -1,9 +1,9 @@ +import request from 'supertest'; import { UserController } from 'src/controllers/user.controller.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { UserService } from 'src/services/user.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; -import { automock, ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; +import { ControllerContext, automock, controllerSetup, mockBaseService } from 'test/utils.js'; describe(UserController.name, () => { let ctx: ControllerContext; diff --git a/server/src/controllers/user.controller.ts b/server/src/controllers/user.controller.ts index d26034aef..61e07fb27 100644 --- a/server/src/controllers/user.controller.ts +++ b/server/src/controllers/user.controller.ts @@ -17,8 +17,8 @@ import { } from '@nestjs/common'; import { ApiBody, ApiConsumes, ApiExcludeEndpoint, ApiTags } from '@nestjs/swagger'; import type { NextFunction, Response } from 'express'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { CalendarHeatmapDto, CalendarHeatmapResponseDto } from 'src/dtos/calendar-heatmap.dto.js'; import { LicenseKeyDto, LicenseResponseDto } from 'src/dtos/license.dto.js'; import { OnboardingDto, OnboardingResponseDto } from 'src/dtos/onboarding.dto.js'; diff --git a/server/src/controllers/video-stream.controller.ts b/server/src/controllers/video-stream.controller.ts index c4066044f..42a52230b 100644 --- a/server/src/controllers/video-stream.controller.ts +++ b/server/src/controllers/video-stream.controller.ts @@ -1,10 +1,10 @@ import { Controller, Delete, Get, Header, Headers, HttpCode, HttpStatus, Next, Param, Res } from '@nestjs/common'; import { ApiProduces, ApiTags } from '@nestjs/swagger'; -import type { NextFunction, Response } from 'express'; import { ZodValidationException } from 'nestjs-zod'; +import type { NextFunction, Response } from 'express'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { HLS_PLAYLIST_CONTENT_TYPE } from 'src/constants.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { HlsPlaylistHeaderDto, HlsSegmentHeaderDto, diff --git a/server/src/controllers/view.controller.ts b/server/src/controllers/view.controller.ts index 292c3691a..9ee6ba434 100644 --- a/server/src/controllers/view.controller.ts +++ b/server/src/controllers/view.controller.ts @@ -1,8 +1,8 @@ import { Controller, Get, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { AssetResponseDto } from 'src/dtos/asset-response.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { ApiTag, Permission } from 'src/enum.js'; import { Auth, Authenticated } from 'src/middleware/auth.guard.js'; import { ViewService } from 'src/services/view.service.js'; diff --git a/server/src/controllers/workflow.controller.spec.ts b/server/src/controllers/workflow.controller.spec.ts index e5ab30198..3ac58ae01 100644 --- a/server/src/controllers/workflow.controller.spec.ts +++ b/server/src/controllers/workflow.controller.spec.ts @@ -1,10 +1,10 @@ import { WorkflowTrigger } from '@immich/plugin-sdk'; +import request from 'supertest'; import { WorkflowController } from 'src/controllers/workflow.controller.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { WorkflowService } from 'src/services/workflow.service.js'; -import request from 'supertest'; import { errorDto } from 'test/medium/responses.js'; -import { automock, ControllerContext, controllerSetup, mockBaseService } from 'test/utils.js'; +import { ControllerContext, automock, controllerSetup, mockBaseService } from 'test/utils.js'; describe(WorkflowController.name, () => { let ctx: ControllerContext; diff --git a/server/src/controllers/workflow.controller.ts b/server/src/controllers/workflow.controller.ts index d79b07440..5bf21912f 100644 --- a/server/src/controllers/workflow.controller.ts +++ b/server/src/controllers/workflow.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Patch, Post, Put, Query } from '@nestjs/common'; import { ApiExcludeEndpoint, ApiTags } from '@nestjs/swagger'; -import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import type { AuthDto } from 'src/dtos/auth.dto.js'; +import { Endpoint, HistoryBuilder } from 'src/decorators.js'; import { WorkflowCreateDto, WorkflowGetLogsDto, diff --git a/server/src/cores/storage.core.spec.ts b/server/src/cores/storage.core.spec.ts index 12ce60d0c..c5e6ad3f4 100644 --- a/server/src/cores/storage.core.spec.ts +++ b/server/src/cores/storage.core.spec.ts @@ -1,5 +1,5 @@ -import { StorageCore } from 'src/cores/storage.core.js'; import { vitest } from 'vitest'; +import { StorageCore } from 'src/cores/storage.core.js'; vitest.mock('src/constants', () => ({ IWorker: 'IWorker', diff --git a/server/src/cores/storage.core.ts b/server/src/cores/storage.core.ts index 405e56416..fa9d21a06 100644 --- a/server/src/cores/storage.core.ts +++ b/server/src/cores/storage.core.ts @@ -1,4 +1,5 @@ import { dirname, join, resolve } from 'node:path'; +import type { VideoInterfaces } from 'src/types.js'; import { StorageAsset } from 'src/database.js'; import { AssetFileType, @@ -18,7 +19,6 @@ import { MoveRepository } from 'src/repositories/move.repository.js'; import { PersonRepository } from 'src/repositories/person.repository.js'; import { StorageRepository } from 'src/repositories/storage.repository.js'; import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository.js'; -import type { VideoInterfaces } from 'src/types.js'; import { getAssetFile } from 'src/utils/asset.util.js'; import { getConfig } from 'src/utils/config.js'; diff --git a/server/src/database.ts b/server/src/database.ts index 5b207c7b4..47a713cc3 100644 --- a/server/src/database.ts +++ b/server/src/database.ts @@ -1,4 +1,5 @@ import { Selectable, ShallowDehydrateObject } from 'kysely'; +import type { UserMetadataItem } from 'src/types.js'; import { MapAsset } from 'src/dtos/asset-response.dto.js'; import { AlbumUserRole, @@ -17,7 +18,6 @@ import { AlbumTable } from 'src/schema/tables/album.table.js'; import { AssetExifTable } from 'src/schema/tables/asset-exif.table.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; import { PluginTable } from 'src/schema/tables/plugin.table.js'; -import type { UserMetadataItem } from 'src/types.js'; export type AuthUser = { id: string; diff --git a/server/src/dtos/activity.dto.ts b/server/src/dtos/activity.dto.ts index f7eb63e09..29063a4d5 100644 --- a/server/src/dtos/activity.dto.ts +++ b/server/src/dtos/activity.dto.ts @@ -1,8 +1,8 @@ import { createZodDto } from 'nestjs-zod'; -import { Activity } from 'src/database.js'; -import { mapUser, UserResponseSchema } from 'src/dtos/user.dto.js'; -import { isoDatetimeToDate } from 'src/validation.js'; import z from 'zod'; +import { Activity } from 'src/database.js'; +import { UserResponseSchema, mapUser } from 'src/dtos/user.dto.js'; +import { isoDatetimeToDate } from 'src/validation.js'; export enum ReactionLevel { ALBUM = 'album', diff --git a/server/src/dtos/album.dto.ts b/server/src/dtos/album.dto.ts index 16024c44f..f8efd7626 100644 --- a/server/src/dtos/album.dto.ts +++ b/server/src/dtos/album.dto.ts @@ -1,15 +1,15 @@ import { ShallowDehydrateObject } from 'kysely'; import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; +import type { MaybeDehydrated } from 'src/types.js'; import { AlbumUser, AuthSharedLink } from 'src/database.js'; import { HistoryBuilder } from 'src/decorators.js'; import { BulkIdErrorReasonSchema } from 'src/dtos/asset-ids.response.dto.js'; import { MapAsset } from 'src/dtos/asset-response.dto.js'; import { UserResponseSchema, mapUser } from 'src/dtos/user.dto.js'; import { AlbumUserRole, AlbumUserRoleSchema, AssetOrder, AssetOrderSchema } from 'src/enum.js'; -import type { MaybeDehydrated } from 'src/types.js'; import { asDateTimeString } from 'src/utils/date.js'; import { stringToBool } from 'src/validation.js'; -import z from 'zod'; const AlbumUserAddSchema = z .object({ diff --git a/server/src/dtos/api-key.dto.ts b/server/src/dtos/api-key.dto.ts index fbd7857a3..7d5c69a12 100644 --- a/server/src/dtos/api-key.dto.ts +++ b/server/src/dtos/api-key.dto.ts @@ -1,8 +1,8 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { HistoryBuilder } from 'src/decorators.js'; import { Permission } from 'src/enum.js'; import { isoDatetimeToDate } from 'src/validation.js'; -import z from 'zod'; const PermissionSchema = z.enum(Permission).describe('List of permissions').meta({ id: 'Permission' }); diff --git a/server/src/dtos/asset-file.dto.ts b/server/src/dtos/asset-file.dto.ts index 0384eb34c..ec54fbc6b 100644 --- a/server/src/dtos/asset-file.dto.ts +++ b/server/src/dtos/asset-file.dto.ts @@ -1,9 +1,9 @@ import { Selectable } from 'kysely'; import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { AssetFileTypeSchema } from 'src/enum.js'; import { AssetFileTable } from 'src/schema/tables/asset-file.table.js'; import { isoDatetimeToDate, stringToBool } from 'src/validation.js'; -import z from 'zod'; const AssetFileSearchSchema = z .object({ diff --git a/server/src/dtos/asset-media.dto.ts b/server/src/dtos/asset-media.dto.ts index 584337f2d..d4eb397be 100644 --- a/server/src/dtos/asset-media.dto.ts +++ b/server/src/dtos/asset-media.dto.ts @@ -1,9 +1,9 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { HistoryBuilder } from 'src/decorators.js'; import { AssetMetadataUpsertItemSchema } from 'src/dtos/asset.dto.js'; import { ApiCustomExtension, AssetVisibilitySchema } from 'src/enum.js'; -import { isoDatetimeToDate, JsonParsed, stringToBool } from 'src/validation.js'; -import z from 'zod'; +import { JsonParsed, isoDatetimeToDate, stringToBool } from 'src/validation.js'; export enum AssetMediaSize { Original = 'original', diff --git a/server/src/dtos/asset-response.dto.ts b/server/src/dtos/asset-response.dto.ts index 2750ceb44..78cb6eb2a 100644 --- a/server/src/dtos/asset-response.dto.ts +++ b/server/src/dtos/asset-response.dto.ts @@ -1,5 +1,7 @@ import { Selectable, ShallowDehydrateObject } from 'kysely'; import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; +import type { MaybeDehydrated } from 'src/types.js'; import { AssetFace, AssetFile, Exif, Stack, Tag, User } from 'src/database.js'; import { HistoryBuilder } from 'src/decorators.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; @@ -16,11 +18,9 @@ import { AssetVisibilitySchema, ChecksumAlgorithm, } from 'src/enum.js'; -import type { MaybeDehydrated } from 'src/types.js'; import { hexOrBufferToBase64 } from 'src/utils/bytes.js'; import { asDateTimeString } from 'src/utils/date.js'; import { mimeTypes } from 'src/utils/mime-types.js'; -import z from 'zod'; const SanitizedAssetResponseSchema = z .object({ diff --git a/server/src/dtos/asset.dto.ts b/server/src/dtos/asset.dto.ts index 1c01ba640..bcdb19372 100644 --- a/server/src/dtos/asset.dto.ts +++ b/server/src/dtos/asset.dto.ts @@ -1,10 +1,10 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { HistoryBuilder } from 'src/decorators.js'; import { BulkIdsSchema } from 'src/dtos/asset-ids.response.dto.js'; import { AssetType, AssetVisibilitySchema } from 'src/enum.js'; import { AssetStats } from 'src/repositories/asset.repository.js'; import { IsNotSiblingOf, isoDatetimeToDate, latitudeSchema, longitudeSchema, stringToBool } from 'src/validation.js'; -import z from 'zod'; const UpdateAssetBaseSchema = z .object({ diff --git a/server/src/dtos/auth.dto.ts b/server/src/dtos/auth.dto.ts index 44d15d30c..14fb7ef8e 100644 --- a/server/src/dtos/auth.dto.ts +++ b/server/src/dtos/auth.dto.ts @@ -1,9 +1,9 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; +import type { UserMetadataItem } from 'src/types.js'; import { AuthApiKey, AuthSession, AuthSharedLink, AuthUser, UserAdmin } from 'src/database.js'; import { ImmichCookie, UserMetadataKey } from 'src/enum.js'; -import type { UserMetadataItem } from 'src/types.js'; import { toEmail } from 'src/validation.js'; -import z from 'zod'; export type CookieResponse = { isSecure: boolean; diff --git a/server/src/dtos/bbox.dto.ts b/server/src/dtos/bbox.dto.ts index 22459675e..a0dd2e041 100644 --- a/server/src/dtos/bbox.dto.ts +++ b/server/src/dtos/bbox.dto.ts @@ -1,5 +1,5 @@ -import { latitudeSchema, longitudeSchema } from 'src/validation.js'; import z from 'zod'; +import { latitudeSchema, longitudeSchema } from 'src/validation.js'; export const BBoxSchema = z .object({ diff --git a/server/src/dtos/calendar-heatmap.dto.ts b/server/src/dtos/calendar-heatmap.dto.ts index 21e2fcb7b..8522dd471 100644 --- a/server/src/dtos/calendar-heatmap.dto.ts +++ b/server/src/dtos/calendar-heatmap.dto.ts @@ -1,7 +1,7 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { CalendarHeatmapType } from 'src/enum.js'; import { isoDateToDate } from 'src/validation.js'; -import z from 'zod'; const CalendarHeatmapTypeSchema = z .enum(CalendarHeatmapType) diff --git a/server/src/dtos/cluster-group.dto.ts b/server/src/dtos/cluster-group.dto.ts index 32c542d2e..b6e3eeadc 100644 --- a/server/src/dtos/cluster-group.dto.ts +++ b/server/src/dtos/cluster-group.dto.ts @@ -1,8 +1,8 @@ import { Selectable } from 'kysely'; import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { ClusterGroupRequestTable } from 'src/schema/tables/cluster-group-request.table.js'; import { isoDatetimeToDate } from 'src/validation.js'; -import z from 'zod'; const ClusterGroupRequestCreateSchema = z .object({ diff --git a/server/src/dtos/config.dto.spec.ts b/server/src/dtos/config.dto.spec.ts index 5e7b610c7..931f10026 100644 --- a/server/src/dtos/config.dto.spec.ts +++ b/server/src/dtos/config.dto.spec.ts @@ -1,13 +1,13 @@ +import z from 'zod'; import { AdminConfigDto, + PublicConfigDto, + UserConfigDto, defaults, mapPublicConfig, mapUserConfig, - PublicConfigDto, - UserConfigDto, } from 'src/dtos/config.dto.js'; import { getKeysDeep } from 'src/utils/misc.js'; -import z from 'zod'; const PUBLIC_PROPERTIES = [ 'oauth.autoLaunch', diff --git a/server/src/dtos/config.dto.ts b/server/src/dtos/config.dto.ts index a3c235b7e..feaa27108 100644 --- a/server/src/dtos/config.dto.ts +++ b/server/src/dtos/config.dto.ts @@ -1,14 +1,16 @@ import { CronExpression } from '@nestjs/schedule'; import { validateCronExpression } from 'cron'; import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; +import type { DeepPartial } from 'src/types.js'; import { AudioCodec, AudioCodecSchema, + CQMode, + CQModeSchema, Colorspace, ColorspaceSchema, ConfigVisibility, - CQMode, - CQModeSchema, HlsVideoResolution, HlsVideoResolutionSchema, ImageFormat, @@ -30,8 +32,6 @@ import { VideoContainer, VideoContainerSchema, } from 'src/enum.js'; -import type { DeepPartial } from 'src/types.js'; -import z from 'zod'; const { Admin, User, Public } = ConfigVisibility; diff --git a/server/src/dtos/duplicate.dto.ts b/server/src/dtos/duplicate.dto.ts index e52081673..84909b8e7 100644 --- a/server/src/dtos/duplicate.dto.ts +++ b/server/src/dtos/duplicate.dto.ts @@ -1,6 +1,6 @@ import { createZodDto } from 'nestjs-zod'; -import { AssetResponseSchema } from 'src/dtos/asset-response.dto.js'; import z from 'zod'; +import { AssetResponseSchema } from 'src/dtos/asset-response.dto.js'; const DuplicateResponseSchema = z .object({ diff --git a/server/src/dtos/env.dto.ts b/server/src/dtos/env.dto.ts index 38c192996..71658a6bf 100644 --- a/server/src/dtos/env.dto.ts +++ b/server/src/dtos/env.dto.ts @@ -1,6 +1,6 @@ +import z from 'zod'; import { ImmichEnvironmentSchema, LogFormatSchema, LogLevelSchema } from 'src/enum.js'; import { IsIPRange } from 'src/validation.js'; -import z from 'zod'; // TODO import from sql-tools once the swagger plugin supports external enums enum DatabaseSslMode { diff --git a/server/src/dtos/exif.dto.ts b/server/src/dtos/exif.dto.ts index 216235cf2..84ae4556e 100644 --- a/server/src/dtos/exif.dto.ts +++ b/server/src/dtos/exif.dto.ts @@ -1,8 +1,8 @@ import { createZodDto } from 'nestjs-zod'; -import { Exif } from 'src/database.js'; -import type { MaybeDehydrated } from 'src/types.js'; -import { asDateTimeString } from 'src/utils/date.js'; import z from 'zod'; +import type { MaybeDehydrated } from 'src/types.js'; +import { Exif } from 'src/database.js'; +import { asDateTimeString } from 'src/utils/date.js'; export const ExifResponseSchema = z .object({ diff --git a/server/src/dtos/integrity.dto.ts b/server/src/dtos/integrity.dto.ts index e2b9c5526..df616370f 100644 --- a/server/src/dtos/integrity.dto.ts +++ b/server/src/dtos/integrity.dto.ts @@ -1,6 +1,6 @@ import { createZodDto } from 'nestjs-zod'; -import { IntegrityReport, IntegrityReportSchema } from 'src/enum.js'; import z from 'zod'; +import { IntegrityReport, IntegrityReportSchema } from 'src/enum.js'; const IntegrityReportSummaryResponseSchema = z .object({ diff --git a/server/src/dtos/job.dto.ts b/server/src/dtos/job.dto.ts index 05f98f56f..493821814 100644 --- a/server/src/dtos/job.dto.ts +++ b/server/src/dtos/job.dto.ts @@ -1,6 +1,6 @@ import { createZodDto } from 'nestjs-zod'; -import { ManualJobNameSchema } from 'src/enum.js'; import z from 'zod'; +import { ManualJobNameSchema } from 'src/enum.js'; const JobCreateSchema = z .object({ diff --git a/server/src/dtos/library.dto.ts b/server/src/dtos/library.dto.ts index f649c40ba..0aa4a03d3 100644 --- a/server/src/dtos/library.dto.ts +++ b/server/src/dtos/library.dto.ts @@ -1,7 +1,7 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { Library } from 'src/database.js'; import { isoDatetimeToDate } from 'src/validation.js'; -import z from 'zod'; const stringArrayMax128 = z .array(z.string()) diff --git a/server/src/dtos/maintenance.dto.ts b/server/src/dtos/maintenance.dto.ts index da83c0b1f..3b9ffc9b7 100644 --- a/server/src/dtos/maintenance.dto.ts +++ b/server/src/dtos/maintenance.dto.ts @@ -1,6 +1,6 @@ import { createZodDto } from 'nestjs-zod'; -import { MaintenanceAction, MaintenanceActionSchema, StorageFolderSchema } from 'src/enum.js'; import z from 'zod'; +import { MaintenanceAction, MaintenanceActionSchema, StorageFolderSchema } from 'src/enum.js'; const SetMaintenanceModeSchema = z .object({ diff --git a/server/src/dtos/map.dto.ts b/server/src/dtos/map.dto.ts index 47f10cfa7..edde868c2 100644 --- a/server/src/dtos/map.dto.ts +++ b/server/src/dtos/map.dto.ts @@ -1,6 +1,6 @@ import { createZodDto } from 'nestjs-zod'; -import { isoDatetimeToDate, latitudeSchema, longitudeSchema, stringToBool } from 'src/validation.js'; import z from 'zod'; +import { isoDatetimeToDate, latitudeSchema, longitudeSchema, stringToBool } from 'src/validation.js'; const MapReverseGeocodeSchema = z .object({ diff --git a/server/src/dtos/memory.dto.ts b/server/src/dtos/memory.dto.ts index 9bfa6ab45..544afd3e5 100644 --- a/server/src/dtos/memory.dto.ts +++ b/server/src/dtos/memory.dto.ts @@ -1,11 +1,11 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { Memory } from 'src/database.js'; import { HistoryBuilder } from 'src/decorators.js'; import { AssetResponseSchema, mapAsset } from 'src/dtos/asset-response.dto.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { AssetOrderWithRandomSchema, MemoryType, MemoryTypeSchema } from 'src/enum.js'; -import { isoDatetimeToDate, isoDateToDate, nonEmptyPartial, stringToBool } from 'src/validation.js'; -import z from 'zod'; +import { isoDateToDate, isoDatetimeToDate, nonEmptyPartial, stringToBool } from 'src/validation.js'; const MemorySearchSchema = z .object({ diff --git a/server/src/dtos/notification.dto.ts b/server/src/dtos/notification.dto.ts index bdf0e8495..825a5fd2d 100644 --- a/server/src/dtos/notification.dto.ts +++ b/server/src/dtos/notification.dto.ts @@ -1,7 +1,7 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { NotificationLevel, NotificationLevelSchema, NotificationType, NotificationTypeSchema } from 'src/enum.js'; import { isoDatetimeToDate, stringToBool } from 'src/validation.js'; -import z from 'zod'; const TestEmailResponseSchema = z .object({ diff --git a/server/src/dtos/partner.dto.ts b/server/src/dtos/partner.dto.ts index c415b1264..1647d140c 100644 --- a/server/src/dtos/partner.dto.ts +++ b/server/src/dtos/partner.dto.ts @@ -1,7 +1,7 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { UserResponseSchema } from 'src/dtos/user.dto.js'; import { PartnerDirection } from 'src/repositories/partner.repository.js'; -import z from 'zod'; const PartnerDirectionSchema = z.enum(PartnerDirection).describe('Partner direction').meta({ id: 'PartnerDirection' }); diff --git a/server/src/dtos/person.dto.ts b/server/src/dtos/person.dto.ts index 149cbe23b..5a175f22d 100644 --- a/server/src/dtos/person.dto.ts +++ b/server/src/dtos/person.dto.ts @@ -1,16 +1,16 @@ import { Selectable } from 'kysely'; import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; +import type { ImageDimensions, MaybeDehydrated } from 'src/types.js'; import { AssetFace, Person } from 'src/database.js'; import { HistoryBuilder } from 'src/decorators.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { AssetEditActionItem } from 'src/dtos/editing.dto.js'; import { SourceTypeSchema } from 'src/enum.js'; import { AssetFaceTable } from 'src/schema/tables/asset-face.table.js'; -import type { ImageDimensions, MaybeDehydrated } from 'src/types.js'; import { asDateString, asDateTimeString } from 'src/utils/date.js'; import { transformFaceBoundingBox } from 'src/utils/transform.js'; import { hexColor, stringToBool } from 'src/validation.js'; -import z from 'zod'; const PersonCreateSchema = z .object({ diff --git a/server/src/dtos/plugin-manifest.dto.ts b/server/src/dtos/plugin-manifest.dto.ts index e0dbab52d..daf81b9a4 100644 --- a/server/src/dtos/plugin-manifest.dto.ts +++ b/server/src/dtos/plugin-manifest.dto.ts @@ -1,7 +1,7 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { JsonSchemaSchema } from 'src/dtos/json-schema.dto.js'; import { WorkflowTriggerSchema, WorkflowTypeSchema } from 'src/enum.js'; -import z from 'zod'; const pluginNameRegex = /^[a-z0-9-]+[a-z0-9]$/; const semverRegex = diff --git a/server/src/dtos/plugin.dto.ts b/server/src/dtos/plugin.dto.ts index 9a06ad834..0e4b1399a 100644 --- a/server/src/dtos/plugin.dto.ts +++ b/server/src/dtos/plugin.dto.ts @@ -1,9 +1,9 @@ import { WorkflowTrigger } from '@immich/plugin-sdk'; import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { JsonSchemaDto } from 'src/dtos/json-schema.dto.js'; import { WorkflowTriggerSchema, WorkflowType, WorkflowTypeSchema } from 'src/enum.js'; import { asPluginKey } from 'src/utils/workflow.js'; -import z from 'zod'; const PluginSearchSchema = z .object({ diff --git a/server/src/dtos/queue-legacy.dto.ts b/server/src/dtos/queue-legacy.dto.ts index ca2136580..d6d05e95c 100644 --- a/server/src/dtos/queue-legacy.dto.ts +++ b/server/src/dtos/queue-legacy.dto.ts @@ -1,7 +1,7 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { QueueResponseDto, QueueStatisticsSchema } from 'src/dtos/queue.dto.js'; import { QueueName } from 'src/enum.js'; -import z from 'zod'; const QueueStatusLegacySchema = z .object({ diff --git a/server/src/dtos/queue.dto.ts b/server/src/dtos/queue.dto.ts index 6ab871814..7013899fb 100644 --- a/server/src/dtos/queue.dto.ts +++ b/server/src/dtos/queue.dto.ts @@ -1,7 +1,7 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { HistoryBuilder } from 'src/decorators.js'; import { JobNameSchema, QueueCommandSchema, QueueJobStatusSchema, QueueNameSchema } from 'src/enum.js'; -import z from 'zod'; const QueueNameParamSchema = z .object({ diff --git a/server/src/dtos/search.dto.ts b/server/src/dtos/search.dto.ts index a7c85587b..be39fd24a 100644 --- a/server/src/dtos/search.dto.ts +++ b/server/src/dtos/search.dto.ts @@ -1,4 +1,5 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { Place } from 'src/database.js'; import { HistoryBuilder } from 'src/decorators.js'; import { AlbumResponseSchema } from 'src/dtos/album.dto.js'; @@ -12,7 +13,6 @@ import { SearchOrderFieldSchema, } from 'src/enum.js'; import { isoDatetimeToDate, nonEmptyPartial, stringToBool } from 'src/validation.js'; -import z from 'zod'; const ADDED_V3_2 = new HistoryBuilder().added('v3.2.0').getExtensions(); diff --git a/server/src/dtos/server.dto.ts b/server/src/dtos/server.dto.ts index 2f8144dcd..286d096c2 100644 --- a/server/src/dtos/server.dto.ts +++ b/server/src/dtos/server.dto.ts @@ -1,8 +1,8 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import type { SemVer } from 'semver'; import { ExtraModel, HistoryBuilder } from 'src/decorators.js'; import { isoDatetimeToDate } from 'src/validation.js'; -import z from 'zod'; const ServerPingResponseSchema = z .object({ diff --git a/server/src/dtos/session.dto.ts b/server/src/dtos/session.dto.ts index d4a5f23dc..c77f5e7dc 100644 --- a/server/src/dtos/session.dto.ts +++ b/server/src/dtos/session.dto.ts @@ -1,6 +1,6 @@ import { createZodDto } from 'nestjs-zod'; -import { Session } from 'src/database.js'; import z from 'zod'; +import { Session } from 'src/database.js'; const SessionCreateSchema = z .object({ diff --git a/server/src/dtos/shared-link.dto.ts b/server/src/dtos/shared-link.dto.ts index cb3281f8f..9e35b4ac6 100644 --- a/server/src/dtos/shared-link.dto.ts +++ b/server/src/dtos/shared-link.dto.ts @@ -1,11 +1,11 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { SharedLink } from 'src/database.js'; import { HistoryBuilder } from 'src/decorators.js'; import { AlbumResponseSchema, mapAlbum } from 'src/dtos/album.dto.js'; import { AssetResponseSchema, mapAsset } from 'src/dtos/asset-response.dto.js'; import { SharedLinkType, SharedLinkTypeSchema } from 'src/enum.js'; import { isoDatetimeToDate } from 'src/validation.js'; -import z from 'zod'; const SharedLinkSearchSchema = z .object({ diff --git a/server/src/dtos/stack.dto.ts b/server/src/dtos/stack.dto.ts index 01ced378c..bfa9da4fa 100644 --- a/server/src/dtos/stack.dto.ts +++ b/server/src/dtos/stack.dto.ts @@ -1,8 +1,8 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { Stack } from 'src/database.js'; import { AssetResponseSchema, mapAsset } from 'src/dtos/asset-response.dto.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; -import z from 'zod'; const StackSearchSchema = z .object({ diff --git a/server/src/dtos/streaming.dto.ts b/server/src/dtos/streaming.dto.ts index 2b94b2335..0de7ec7ba 100644 --- a/server/src/dtos/streaming.dto.ts +++ b/server/src/dtos/streaming.dto.ts @@ -1,6 +1,6 @@ import { createZodDto } from 'nestjs-zod'; -import { ImmichHeader } from 'src/enum.js'; import z from 'zod'; +import { ImmichHeader } from 'src/enum.js'; const HlsSessionParamSchema = z.object({ id: z.uuidv4(), diff --git a/server/src/dtos/sync.dto.ts b/server/src/dtos/sync.dto.ts index 9dfe13ca5..3f3f65e86 100644 --- a/server/src/dtos/sync.dto.ts +++ b/server/src/dtos/sync.dto.ts @@ -1,4 +1,5 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { ExtraModel } from 'src/decorators.js'; import { AssetEditActionSchema } from 'src/dtos/editing.dto.js'; import { @@ -15,7 +16,6 @@ import { UserMetadataKeySchema, } from 'src/enum.js'; import { isoDatetimeToDate } from 'src/validation.js'; -import z from 'zod'; const SyncUserV1Schema = z .object({ diff --git a/server/src/dtos/tag.dto.ts b/server/src/dtos/tag.dto.ts index 19e01abd1..5e8941ad7 100644 --- a/server/src/dtos/tag.dto.ts +++ b/server/src/dtos/tag.dto.ts @@ -1,9 +1,9 @@ import { createZodDto } from 'nestjs-zod'; -import { Tag } from 'src/database.js'; +import z from 'zod'; import type { MaybeDehydrated } from 'src/types.js'; +import { Tag } from 'src/database.js'; import { asDateTimeString } from 'src/utils/date.js'; import { hexColor } from 'src/validation.js'; -import z from 'zod'; const TagCreateSchema = z .object({ diff --git a/server/src/dtos/time-bucket.dto.ts b/server/src/dtos/time-bucket.dto.ts index 8399d81f4..d60fddf9c 100644 --- a/server/src/dtos/time-bucket.dto.ts +++ b/server/src/dtos/time-bucket.dto.ts @@ -1,8 +1,8 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { BBoxSchema } from 'src/dtos/bbox.dto.js'; import { AssetOrderBySchema, AssetOrderSchema, AssetVisibilitySchema } from 'src/enum.js'; import { stringToBool } from 'src/validation.js'; -import z from 'zod'; const TimeBucketQueryBaseSchema = z .object({ diff --git a/server/src/dtos/user-preferences.dto.ts b/server/src/dtos/user-preferences.dto.ts index b9ae3d1ac..57dd33d04 100644 --- a/server/src/dtos/user-preferences.dto.ts +++ b/server/src/dtos/user-preferences.dto.ts @@ -1,7 +1,7 @@ import { createZodDto } from 'nestjs-zod'; -import { AssetOrderSchema, UserAvatarColorSchema } from 'src/enum.js'; -import type { UserPreferences } from 'src/types.js'; import z from 'zod'; +import type { UserPreferences } from 'src/types.js'; +import { AssetOrderSchema, UserAvatarColorSchema } from 'src/enum.js'; const AlbumsUpdateSchema = z .object({ diff --git a/server/src/dtos/user-profile.dto.ts b/server/src/dtos/user-profile.dto.ts index 7465b1c4c..9f5e809fe 100644 --- a/server/src/dtos/user-profile.dto.ts +++ b/server/src/dtos/user-profile.dto.ts @@ -1,8 +1,8 @@ import { ApiProperty } from '@nestjs/swagger'; import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; import { UploadFieldName } from 'src/dtos/asset-media.dto.js'; import { isoDatetimeToDate } from 'src/validation.js'; -import z from 'zod'; export class CreateProfileImageDto { @ApiProperty({ type: 'string', format: 'binary', description: 'Profile image file' }) diff --git a/server/src/dtos/user.dto.ts b/server/src/dtos/user.dto.ts index 673bd233b..e8af4da80 100644 --- a/server/src/dtos/user.dto.ts +++ b/server/src/dtos/user.dto.ts @@ -1,12 +1,12 @@ import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; +import type { MaybeDehydrated, UserMetadataItem } from 'src/types.js'; import { User, UserAdmin } from 'src/database.js'; import { HistoryBuilder } from 'src/decorators.js'; import { pinCodeRegex } from 'src/dtos/auth.dto.js'; import { UserAvatarColor, UserAvatarColorSchema, UserMetadataKey, UserStatusSchema } from 'src/enum.js'; -import type { MaybeDehydrated, UserMetadataItem } from 'src/types.js'; import { asDateTimeString } from 'src/utils/date.js'; import { isoDatetimeToDate, sanitizeFilename, stringToBool, toEmail } from 'src/validation.js'; -import z from 'zod'; export const UserUpdateMeSchema = z .object({ diff --git a/server/src/dtos/workflow.dto.ts b/server/src/dtos/workflow.dto.ts index 064883fb7..85431b3cb 100644 --- a/server/src/dtos/workflow.dto.ts +++ b/server/src/dtos/workflow.dto.ts @@ -1,8 +1,8 @@ -import type { WorkflowStepConfig, WorkflowTrigger } from '@immich/plugin-sdk'; import { createZodDto } from 'nestjs-zod'; +import z from 'zod'; +import type { WorkflowStepConfig, WorkflowTrigger } from '@immich/plugin-sdk'; import { WorkflowResultSchema, WorkflowTriggerSchema, WorkflowTypeSchema } from 'src/enum.js'; import { isoDatetimeToDate } from 'src/validation.js'; -import z from 'zod'; const WorkflowTriggerResponseSchema = z .object({ diff --git a/server/src/maintenance/maintenance-websocket.repository.ts b/server/src/maintenance/maintenance-websocket.repository.ts index 836c808e0..3e3e707e1 100644 --- a/server/src/maintenance/maintenance-websocket.repository.ts +++ b/server/src/maintenance/maintenance-websocket.repository.ts @@ -7,9 +7,9 @@ import { WebSocketServer, } from '@nestjs/websockets'; import { Server, Socket } from 'socket.io'; +import type { AppRestartEvent, ArgsOf } from 'src/repositories/event.repository.js'; import { MaintenanceAuthDto, MaintenanceStatusResponseDto } from 'src/dtos/maintenance.dto.js'; import { AppRepository } from 'src/repositories/app.repository.js'; -import type { AppRestartEvent, ArgsOf } from 'src/repositories/event.repository.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; interface ServerEventMap { diff --git a/server/src/maintenance/maintenance-worker.controller.ts b/server/src/maintenance/maintenance-worker.controller.ts index c1cd84c2b..ac814812f 100644 --- a/server/src/maintenance/maintenance-worker.controller.ts +++ b/server/src/maintenance/maintenance-worker.controller.ts @@ -13,6 +13,10 @@ import { } from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; import type { NextFunction, Request, Response } from 'express'; +import type { DatabaseBackupController as _DatabaseBackupController } from 'src/controllers/database-backup.controller.js'; +import type { ServerController as _ServerController } from 'src/controllers/server.controller.js'; +import type { LoginDetails } from 'src/services/auth.service.js'; +import { DatabaseBackupDeleteDto, DatabaseBackupListResponseDto } from 'src/dtos/database-backup.dto.js'; import { MaintenanceAuthDto, MaintenanceDetectInstallResponseDto, @@ -26,16 +30,11 @@ import { MaintenanceRoute } from 'src/maintenance/maintenance-auth.guard.js'; import { MaintenanceWorkerService } from 'src/maintenance/maintenance-worker.service.js'; import { GetLoginDetails } from 'src/middleware/auth.guard.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; -import type { LoginDetails } from 'src/services/auth.service.js'; +import { DatabaseBackupService } from 'src/services/database-backup.service.js'; import { sendFile } from 'src/utils/file.js'; import { respondWithCookie } from 'src/utils/response.js'; import { FilenameParamDto } from 'src/validation.js'; -import type { DatabaseBackupController as _DatabaseBackupController } from 'src/controllers/database-backup.controller.js'; -import type { ServerController as _ServerController } from 'src/controllers/server.controller.js'; -import { DatabaseBackupDeleteDto, DatabaseBackupListResponseDto } from 'src/dtos/database-backup.dto.js'; -import { DatabaseBackupService } from 'src/services/database-backup.service.js'; - @Controller() export class MaintenanceWorkerController { constructor( diff --git a/server/src/maintenance/maintenance-worker.service.spec.ts b/server/src/maintenance/maintenance-worker.service.spec.ts index 4c58080fb..e814aafb2 100644 --- a/server/src/maintenance/maintenance-worker.service.spec.ts +++ b/server/src/maintenance/maintenance-worker.service.spec.ts @@ -5,7 +5,7 @@ import { MaintenanceHealthRepository } from 'src/maintenance/maintenance-health. import { MaintenanceWebsocketRepository } from 'src/maintenance/maintenance-websocket.repository.js'; import { MaintenanceWorkerService } from 'src/maintenance/maintenance-worker.service.js'; import { DatabaseBackupService } from 'src/services/database-backup.service.js'; -import { automock, AutoMocked, getMocks, ServiceMocks } from 'test/utils.js'; +import { AutoMocked, ServiceMocks, automock, getMocks } from 'test/utils.js'; describe(MaintenanceWorkerService.name, () => { let sut: MaintenanceWorkerService; diff --git a/server/src/maintenance/maintenance-worker.service.ts b/server/src/maintenance/maintenance-worker.service.ts index edcf45d01..e92afacaa 100644 --- a/server/src/maintenance/maintenance-worker.service.ts +++ b/server/src/maintenance/maintenance-worker.service.ts @@ -4,6 +4,7 @@ import { NextFunction, Request, Response } from 'express'; import { jwtVerify } from 'jose'; import { readFileSync } from 'node:fs'; import { IncomingHttpHeaders } from 'node:http'; +import type { MaintenanceModeState } from 'src/types.js'; import { serverVersion } from 'src/constants.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { @@ -28,7 +29,6 @@ import { type BaseService as _BaseService } from 'src/services/base.service.js'; import { DatabaseBackupService } from 'src/services/database-backup.service.js'; import { type ServerService as _ServerService } from 'src/services/server.service.js'; import { type VersionService as _VersionService } from 'src/services/version.service.js'; -import type { MaintenanceModeState } from 'src/types.js'; import { getConfig } from 'src/utils/config.js'; import { createMaintenanceLoginUrl, detectPriorInstall } from 'src/utils/maintenance.js'; import { getExternalDomain } from 'src/utils/misc.js'; diff --git a/server/src/middleware/auth.guard.spec.ts b/server/src/middleware/auth.guard.spec.ts index abf52a5c1..f5d9c90f3 100644 --- a/server/src/middleware/auth.guard.spec.ts +++ b/server/src/middleware/auth.guard.spec.ts @@ -1,10 +1,10 @@ import { ExecutionContext } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; -import { Authenticated, AuthGuard } from 'src/middleware/auth.guard.js'; +import { AuthGuard, Authenticated } from 'src/middleware/auth.guard.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { AuthService } from 'src/services/auth.service.js'; import { mockEnvData } from 'test/repositories/config.repository.mock.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; class TestController { @Authenticated({ public: true, setup: true }) diff --git a/server/src/middleware/file-upload.interceptor.ts b/server/src/middleware/file-upload.interceptor.ts index 5c8a3d8d5..74f2e79d8 100644 --- a/server/src/middleware/file-upload.interceptor.ts +++ b/server/src/middleware/file-upload.interceptor.ts @@ -8,13 +8,13 @@ import { createHash, randomUUID } from 'node:crypto'; import { join } from 'node:path'; import { pipeline } from 'node:stream'; import { Observable } from 'rxjs'; +import type { ImmichFile, UploadFile, UploadFiles } from 'src/types.js'; import { UploadFieldName } from 'src/dtos/asset-media.dto.js'; import { RouteKey } from 'src/enum.js'; import { AuthRequest } from 'src/middleware/auth.guard.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { StorageRepository } from 'src/repositories/storage.repository.js'; import { AssetMediaService } from 'src/services/asset-media.service.js'; -import type { ImmichFile, UploadFile, UploadFiles } from 'src/types.js'; import { asUploadRequest, mapToUploadFile } from 'src/utils/asset.util.js'; export function getFile(files: UploadFiles, property: 'assetData' | 'sidecarData') { diff --git a/server/src/middleware/global-exception.filter.ts b/server/src/middleware/global-exception.filter.ts index 3d5376845..49dfda330 100644 --- a/server/src/middleware/global-exception.filter.ts +++ b/server/src/middleware/global-exception.filter.ts @@ -2,10 +2,10 @@ import { ArgumentsHost, Catch, ExceptionFilter } from '@nestjs/common'; import { Request, Response } from 'express'; import { ClsService } from 'nestjs-cls'; import { ZodSerializationException, ZodValidationException } from 'nestjs-zod'; +import { ZodError } from 'zod'; import { ImmichHeader } from 'src/enum.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { isHttpException, onRouteError } from 'src/utils/logger.js'; -import { ZodError } from 'zod'; @Catch() export class GlobalExceptionFilter implements ExceptionFilter { diff --git a/server/src/repositories/album-user.repository.ts b/server/src/repositories/album-user.repository.ts index 7d6b84d26..b9aee4604 100644 --- a/server/src/repositories/album-user.repository.ts +++ b/server/src/repositories/album-user.repository.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import type { Insertable, Kysely, Updateable } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; +import type { Insertable, Kysely, Updateable } from 'kysely'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { AlbumUserRole } from 'src/enum.js'; import { DB } from 'src/schema/index.js'; diff --git a/server/src/repositories/album.repository.ts b/server/src/repositories/album.repository.ts index 722dfa849..aad1230cb 100644 --- a/server/src/repositories/album.repository.ts +++ b/server/src/repositories/album.repository.ts @@ -6,8 +6,8 @@ import { type NotNull, type Selectable, type ShallowDehydrateObject, - sql, type Updateable, + sql, } from 'kysely'; import { jsonArrayFrom, jsonObjectFrom } from 'kysely/helpers/postgres'; import { InjectKysely } from 'nestjs-kysely'; diff --git a/server/src/repositories/api-key.repository.ts b/server/src/repositories/api-key.repository.ts index 7db2e7dd7..bf5aff54d 100644 --- a/server/src/repositories/api-key.repository.ts +++ b/server/src/repositories/api-key.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; -import type { Insertable, Kysely, Updateable } from 'kysely'; import { jsonObjectFrom } from 'kysely/helpers/postgres'; import { InjectKysely } from 'nestjs-kysely'; +import type { Insertable, Kysely, Updateable } from 'kysely'; import { columns } from 'src/database.js'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { DB } from 'src/schema/index.js'; diff --git a/server/src/repositories/asset-edit.repository.ts b/server/src/repositories/asset-edit.repository.ts index dd612b1ad..8afacc363 100644 --- a/server/src/repositories/asset-edit.repository.ts +++ b/server/src/repositories/asset-edit.repository.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import type { Kysely } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; +import type { Kysely } from 'kysely'; import { columns } from 'src/database.js'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { AssetEditActionItem, AssetEditActionItemResponseDto } from 'src/dtos/editing.dto.js'; diff --git a/server/src/repositories/asset-file.repository.ts b/server/src/repositories/asset-file.repository.ts index b96096c4d..153ea43fd 100644 --- a/server/src/repositories/asset-file.repository.ts +++ b/server/src/repositories/asset-file.repository.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import type { Kysely } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; +import type { Kysely } from 'kysely'; import { AssetFileSearchDto } from 'src/dtos/asset-file.dto.js'; import { DB } from 'src/schema/index.js'; diff --git a/server/src/repositories/asset.repository.ts b/server/src/repositories/asset.repository.ts index a980fd168..255eb6d43 100644 --- a/server/src/repositories/asset.repository.ts +++ b/server/src/repositories/asset.repository.ts @@ -4,19 +4,19 @@ import { type Insertable, type Kysely, type NotNull, - type Selectable, type SelectQueryBuilder, + type Selectable, type ShallowDehydrateObject, - sql, - type Updateable, UpdateResult, + type Updateable, + sql, } from 'kysely'; import { jsonArrayFrom } from 'kysely/helpers/postgres'; import { isEmpty, isUndefined, omitBy } from 'lodash-es'; import { InjectKysely } from 'nestjs-kysely'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; import { LockableProperty, Stack } from 'src/database.js'; import { Chunked, ChunkedArray, DummyValue, GenerateSql } from 'src/decorators.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { AssetFileType, AssetOrder, diff --git a/server/src/repositories/config.repository.spec.ts b/server/src/repositories/config.repository.spec.ts index 84a45291b..caa82be9f 100644 --- a/server/src/repositories/config.repository.spec.ts +++ b/server/src/repositories/config.repository.spec.ts @@ -1,5 +1,5 @@ import { ImmichTelemetry } from 'src/enum.js'; -import { clearEnvCache, ConfigRepository } from 'src/repositories/config.repository.js'; +import { ConfigRepository, clearEnvCache } from 'src/repositories/config.repository.js'; const getEnv = () => { clearEnvCache(); diff --git a/server/src/repositories/config.repository.ts b/server/src/repositories/config.repository.ts index 8b1460b21..7c8c7b70e 100644 --- a/server/src/repositories/config.repository.ts +++ b/server/src/repositories/config.repository.ts @@ -9,7 +9,8 @@ import { CLS_ID, ClsModuleOptions } from 'nestjs-cls'; import { OpenTelemetryModuleOptions } from 'nestjs-otel/lib/interfaces/index.js'; import { readFileSync } from 'node:fs'; import { join } from 'node:path'; -import { citiesFile, IWorker } from 'src/constants.js'; +import type { VectorExtension } from 'src/types.js'; +import { IWorker, citiesFile } from 'src/constants.js'; import { Telemetry } from 'src/decorators.js'; import { EnvSchema } from 'src/dtos/env.dto.js'; import { @@ -22,7 +23,6 @@ import { LogLevel, QueueName, } from 'src/enum.js'; -import type { VectorExtension } from 'src/types.js'; import { setDifference } from 'src/utils/set.js'; export interface EnvData { diff --git a/server/src/repositories/crypto.repository.ts b/server/src/repositories/crypto.repository.ts index 9b093f6d7..771b069aa 100644 --- a/server/src/repositories/crypto.repository.ts +++ b/server/src/repositories/crypto.repository.ts @@ -60,10 +60,12 @@ export class CryptoRepository { } signJwt(payload: string | object | Buffer, secret: string, options?: jwt.SignOptions): string { + // eslint-disable-next-line import-x/no-named-as-default-member return jwt.sign(payload, secret, { algorithm: 'HS256', ...options }); } verifyJwt(token: string, secret: string): T { + // eslint-disable-next-line import-x/no-named-as-default-member return jwt.verify(token, secret, { algorithms: ['HS256'] }) as T; } } diff --git a/server/src/repositories/database.repository.ts b/server/src/repositories/database.repository.ts index 653fd333e..cb39b0240 100644 --- a/server/src/repositories/database.repository.ts +++ b/server/src/repositories/database.repository.ts @@ -6,27 +6,29 @@ import { FileMigrationProvider, Migrator } from 'kysely/migration'; import { InjectKysely } from 'nestjs-kysely'; import { readdir } from 'node:fs/promises'; import { join } from 'node:path'; -import semver from 'semver'; +import { diff } from 'semver'; +import z from 'zod'; +import type { ExtensionVersion, VectorExtension } from 'src/types.js'; import { EXTENSION_NAMES, POSTGRES_VERSION_RANGE, - serverVersion, + VECTORCHORD_LIST_SLACK_FACTOR, + VECTORCHORD_VERSION_RANGE, VECTOR_EXTENSIONS, VECTOR_INDEX_TABLES, VECTOR_VERSION_RANGE, - VECTORCHORD_LIST_SLACK_FACTOR, - VECTORCHORD_VERSION_RANGE, + serverVersion, } from 'src/constants.js'; import { GenerateSql } from 'src/decorators.js'; import { DatabaseExtension, DatabaseLock, VectorIndex } from 'src/enum.js'; import { ConfigRepository } from 'src/repositories/config.repository.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { immich_uuid_v7 } from 'src/schema/functions.js'; +// eslint-disable-next-line import-x/no-duplicates import 'src/schema/index.js'; // make sure all schema definitions are imported for schemaFromCode +// eslint-disable-next-line import-x/no-duplicates import { DB } from 'src/schema/index.js'; -import type { ExtensionVersion, VectorExtension } from 'src/types.js'; import { vectorIndexQuery } from 'src/utils/database.js'; -import z from 'zod'; export let cachedVectorExtension: VectorExtension | undefined; export async function getVectorExtension(runner: Kysely): Promise { @@ -134,7 +136,7 @@ export class DatabaseRepository { } targetVersion ??= availableVersion; - if (!semver.diff(installedVersion, targetVersion)) { + if (!diff(installedVersion, targetVersion)) { return; } diff --git a/server/src/repositories/email.repository.ts b/server/src/repositories/email.repository.ts index 85a439dc4..580476fdd 100644 --- a/server/src/repositories/email.repository.ts +++ b/server/src/repositories/email.repository.ts @@ -1,13 +1,13 @@ import { Injectable } from '@nestjs/common'; import { render } from '@react-email/render'; import { createTransport } from 'nodemailer'; -import React from 'react'; +import React, { createElement } from 'react'; +import type { EmailImageAttachment } from 'src/types.js'; import { AlbumInviteEmail } from 'src/emails/album-invite.email.js'; import { AlbumUpdateEmail } from 'src/emails/album-update.email.js'; import { TestEmail } from 'src/emails/test.email.js'; import { WelcomeEmail } from 'src/emails/welcome.email.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; -import type { EmailImageAttachment } from 'src/types.js'; export type SendEmailOptions = { from: string; @@ -140,19 +140,19 @@ export class EmailRepository { private render({ template, data, customTemplate }: EmailRenderRequest): React.FunctionComponentElement { switch (template) { case EmailTemplate.TEST_EMAIL: { - return React.createElement(TestEmail, { ...data, customTemplate }); + return createElement(TestEmail, { ...data, customTemplate }); } case EmailTemplate.WELCOME: { - return React.createElement(WelcomeEmail, { ...data, customTemplate }); + return createElement(WelcomeEmail, { ...data, customTemplate }); } case EmailTemplate.ALBUM_INVITE: { - return React.createElement(AlbumInviteEmail, { ...data, customTemplate }); + return createElement(AlbumInviteEmail, { ...data, customTemplate }); } case EmailTemplate.ALBUM_UPDATE: { - return React.createElement(AlbumUpdateEmail, { ...data, customTemplate }); + return createElement(AlbumUpdateEmail, { ...data, customTemplate }); } } } diff --git a/server/src/repositories/event.repository.ts b/server/src/repositories/event.repository.ts index a54ed9d93..302f6ca4d 100644 --- a/server/src/repositories/event.repository.ts +++ b/server/src/repositories/event.repository.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ModuleRef, Reflector } from '@nestjs/core'; import { orderBy } from 'lodash-es'; import { Socket } from 'socket.io'; +import type { JobItem, JobSource, UploadFile } from 'src/types.js'; import { Asset } from 'src/database.js'; import { EventConfig } from 'src/decorators.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; @@ -9,7 +10,6 @@ import { SystemConfig } from 'src/dtos/config.dto.js'; import { ImmichWorker, JobStatus, MetadataKey, QueueName, UserAvatarColor, UserStatus } from 'src/enum.js'; import { ConfigRepository } from 'src/repositories/config.repository.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; -import type { JobItem, JobSource, UploadFile } from 'src/types.js'; type EmitHandlers = Partial<{ [T in EmitEvent]: Array> }>; diff --git a/server/src/repositories/job.repository.ts b/server/src/repositories/job.repository.ts index e38a584ca..77bb30840 100644 --- a/server/src/repositories/job.repository.ts +++ b/server/src/repositories/job.repository.ts @@ -3,14 +3,14 @@ import { Injectable } from '@nestjs/common'; import { ModuleRef, Reflector } from '@nestjs/core'; import { JobsOptions, Queue, Worker } from 'bullmq'; import { setTimeout } from 'node:timers/promises'; +import type { JobCounts, JobItem, JobOf } from 'src/types.js'; import { JobConfig } from 'src/decorators.js'; import { QueueJobResponseDto, QueueJobSearchDto } from 'src/dtos/queue.dto.js'; import { ImmichWorker, JobName, JobStatus, MetadataKey, QueueCleanType, QueueJobStatus, QueueName } from 'src/enum.js'; import { ConfigRepository } from 'src/repositories/config.repository.js'; import { EventRepository } from 'src/repositories/event.repository.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; -import type { JobCounts, JobItem, JobOf } from 'src/types.js'; -import { getKeyByValue, getMethodNames, ImmichStartupError } from 'src/utils/misc.js'; +import { ImmichStartupError, getKeyByValue, getMethodNames } from 'src/utils/misc.js'; type JobMapItem = { jobName: JobName; diff --git a/server/src/repositories/library.repository.ts b/server/src/repositories/library.repository.ts index 9597e1dd4..fa3adf84c 100644 --- a/server/src/repositories/library.repository.ts +++ b/server/src/repositories/library.repository.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { type Insertable, type Kysely, sql, type Updateable } from 'kysely'; +import { type Insertable, type Kysely, type Updateable, sql } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { LibraryStatsResponseDto } from 'src/dtos/library.dto.js'; diff --git a/server/src/repositories/logging.repository.spec.ts b/server/src/repositories/logging.repository.spec.ts index e2365b675..6064768f9 100644 --- a/server/src/repositories/logging.repository.spec.ts +++ b/server/src/repositories/logging.repository.spec.ts @@ -1,9 +1,9 @@ import { ClsService } from 'nestjs-cls'; +import { Mocked } from 'vitest'; import { ImmichWorker } from 'src/enum.js'; import { ConfigRepository } from 'src/repositories/config.repository.js'; import { LoggingRepository, MyConsoleLogger } from 'src/repositories/logging.repository.js'; import { newConfigRepositoryMock } from 'test/repositories/config.repository.mock.js'; -import { Mocked } from 'vitest'; describe(LoggingRepository.name, () => { let sut: LoggingRepository; diff --git a/server/src/repositories/map.repository.ts b/server/src/repositories/map.repository.ts index 6f7ea6ad1..3f9d2c0d2 100644 --- a/server/src/repositories/map.repository.ts +++ b/server/src/repositories/map.repository.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; import isoCountries from 'i18n-iso-countries'; -import { type Expression, type Insertable, type Kysely, type NotNull, sql, type SqlBool } from 'kysely'; +import { type Expression, type Insertable, type Kysely, type NotNull, type SqlBool, sql } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; import { createReadStream, existsSync } from 'node:fs'; import { readFile } from 'node:fs/promises'; @@ -166,6 +166,7 @@ export class MapRepository { this.logger.verboseFn(() => `Raw: ${JSON.stringify(response, null, 2)}`); const { countryCode, name: city, admin1Name } = response; + // eslint-disable-next-line import-x/no-named-as-default-member const country = isoCountries.getName(countryCode, 'en') ?? null; const state = admin1Name; @@ -194,6 +195,7 @@ export class MapRepository { this.logger.verboseFn(() => `Raw: ${JSON.stringify(ne_response, ['id', 'admin', 'admin_a3', 'type'], 2)}`); const { admin_a3 } = ne_response; + // eslint-disable-next-line import-x/no-named-as-default-member const country = isoCountries.getName(admin_a3, 'en') ?? null; const state = null; const city = null; diff --git a/server/src/repositories/media.repository.ts b/server/src/repositories/media.repository.ts index 228736aa7..f65f80c00 100644 --- a/server/src/repositories/media.repository.ts +++ b/server/src/repositories/media.repository.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { ExifDateTime, exiftool, WriteTags } from 'exiftool-vendored'; +import { ExifDateTime, WriteTags, exiftool } from 'exiftool-vendored'; import ffmpeg, { FfprobeData, FfprobeStream } from 'fluent-ffmpeg'; import { camelCase, upperFirst } from 'lodash-es'; import { Duration } from 'luxon'; @@ -7,24 +7,6 @@ import { spawn } from 'node:child_process'; import fs from 'node:fs/promises'; import { Writable } from 'node:stream'; import sharp, { Sharp } from 'sharp'; -import { ORIENTATION_TO_SHARP_ROTATION } from 'src/constants.js'; -import { Exif } from 'src/database.js'; -import { AssetEditActionItem } from 'src/dtos/editing.dto.js'; -import { - AacProfile, - Av1Profile, - ColorMatrix, - ColorPrimaries, - Colorspace, - ColorTransfer, - DvProfile, - DvSignalCompatibility, - H264Profile, - HevcProfile, - LogLevel, - RawExtractedFormat, -} from 'src/enum.js'; -import { LoggingRepository } from 'src/repositories/logging.repository.js'; import type { DecodeToBufferOptions, GenerateThumbhashOptions, @@ -35,11 +17,30 @@ import type { VideoInfo, VideoPacketInfo, } from 'src/types.js'; +import { ORIENTATION_TO_SHARP_ROTATION } from 'src/constants.js'; +import { Exif } from 'src/database.js'; +import { AssetEditActionItem } from 'src/dtos/editing.dto.js'; +import { + AacProfile, + Av1Profile, + ColorMatrix, + ColorPrimaries, + ColorTransfer, + Colorspace, + DvProfile, + DvSignalCompatibility, + H264Profile, + HevcProfile, + LogLevel, + RawExtractedFormat, +} from 'src/enum.js'; +import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { handlePromiseError } from 'src/utils/misc.js'; import { createAffineMatrix } from 'src/utils/transform.js'; const probe = (input: string, options: string[]): Promise => new Promise((resolve, reject) => + // eslint-disable-next-line import-x/no-named-as-default-member ffmpeg.ffprobe(input, options, (error, data) => (error ? reject(error) : resolve(data))), ); @@ -63,7 +64,9 @@ export type ExtractResult = { export class MediaRepository { constructor(private logger: LoggingRepository) { this.logger.setContext(MediaRepository.name); + // eslint-disable-next-line import-x/no-named-as-default-member sharp.concurrency(0); + // eslint-disable-next-line import-x/no-named-as-default-member sharp.cache({ files: 0 }); } diff --git a/server/src/repositories/memory.repository.ts b/server/src/repositories/memory.repository.ts index a350bef3d..0a81434e1 100644 --- a/server/src/repositories/memory.repository.ts +++ b/server/src/repositories/memory.repository.ts @@ -1,14 +1,14 @@ import { Injectable } from '@nestjs/common'; -import { type Insertable, type Kysely, type OrderByDirection, sql, type Updateable } from 'kysely'; +import { type Insertable, type Kysely, type OrderByDirection, type Updateable, sql } from 'kysely'; import { jsonArrayFrom } from 'kysely/helpers/postgres'; import { DateTime } from 'luxon'; import { InjectKysely } from 'nestjs-kysely'; +import type { IBulkAsset } from 'src/types.js'; import { Chunked, ChunkedSet, DummyValue, GenerateSql } from 'src/decorators.js'; import { MemorySearchDto } from 'src/dtos/memory.dto.js'; import { AssetOrderWithRandom, AssetVisibility } from 'src/enum.js'; import { DB } from 'src/schema/index.js'; import { MemoryTable } from 'src/schema/tables/memory.table.js'; -import type { IBulkAsset } from 'src/types.js'; @Injectable() export class MemoryRepository implements IBulkAsset { diff --git a/server/src/repositories/metadata.repository.ts b/server/src/repositories/metadata.repository.ts index 96daa4415..d55139e83 100644 --- a/server/src/repositories/metadata.repository.ts +++ b/server/src/repositories/metadata.repository.ts @@ -90,6 +90,7 @@ export class MetadataRepository { useMWG: true, numericTags: [...DefaultReadTaskOptions.numericTags, 'FocalLength', 'FileSize', 'Rotation'], /* eslint unicorn/no-array-callback-reference: off, unicorn/no-array-method-this-argument: off */ + // eslint-disable-next-line import-x/no-named-as-default-member geoTz: (lat, lon) => geotz.find(lat, lon)[0], geolocation: true, readArgs: [ diff --git a/server/src/repositories/move.repository.ts b/server/src/repositories/move.repository.ts index 9e35dd24d..30ab796a4 100644 --- a/server/src/repositories/move.repository.ts +++ b/server/src/repositories/move.repository.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { type Insertable, type Kysely, sql, type Updateable } from 'kysely'; +import { type Insertable, type Kysely, type Updateable, sql } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { AssetPathType, type PathType } from 'src/enum.js'; diff --git a/server/src/repositories/notification.repository.ts b/server/src/repositories/notification.repository.ts index a9818516e..2b3e8b06a 100644 --- a/server/src/repositories/notification.repository.ts +++ b/server/src/repositories/notification.repository.ts @@ -1,6 +1,6 @@ -import type { Insertable, Kysely, Updateable } from 'kysely'; import { DateTime } from 'luxon'; import { InjectKysely } from 'nestjs-kysely'; +import type { Insertable, Kysely, Updateable } from 'kysely'; import { columns } from 'src/database.js'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { NotificationSearchDto } from 'src/dtos/notification.dto.js'; diff --git a/server/src/repositories/oauth.repository.ts b/server/src/repositories/oauth.repository.ts index e7f1c2c26..d5bab1d0a 100644 --- a/server/src/repositories/oauth.repository.ts +++ b/server/src/repositories/oauth.repository.ts @@ -1,19 +1,19 @@ import { Injectable, InternalServerErrorException } from '@nestjs/common'; -import { createRemoteJWKSet, jwtVerify, JWTVerifyGetKey } from 'jose'; +import { JWTVerifyGetKey, createRemoteJWKSet, jwtVerify } from 'jose'; import { + ClientSecretBasic, + ClientSecretPost, + None, + type UserInfoResponse, allowInsecureRequests as allowInsecureRequestsExecute, authorizationCodeGrant, buildAuthorizationUrl, calculatePKCECodeChallenge, - ClientSecretBasic, - ClientSecretPost, discovery, fetchUserInfo, - None, randomPKCECodeVerifier, randomState, skipSubjectCheck, - type UserInfoResponse, } from 'openid-client'; import { OAuthTokenEndpointAuthMethod } from 'src/enum.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; diff --git a/server/src/repositories/partner.repository.ts b/server/src/repositories/partner.repository.ts index 30127ef9f..c6c88c01f 100644 --- a/server/src/repositories/partner.repository.ts +++ b/server/src/repositories/partner.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; -import type { ExpressionBuilder, Insertable, Kysely, NotNull, Updateable } from 'kysely'; import { jsonObjectFrom } from 'kysely/helpers/postgres'; import { InjectKysely } from 'nestjs-kysely'; +import type { ExpressionBuilder, Insertable, Kysely, NotNull, Updateable } from 'kysely'; import { columns } from 'src/database.js'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { DB } from 'src/schema/index.js'; diff --git a/server/src/repositories/person.repository.ts b/server/src/repositories/person.repository.ts index 7dee6b450..67c0b85be 100644 --- a/server/src/repositories/person.repository.ts +++ b/server/src/repositories/person.repository.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { type ExpressionBuilder, type Insertable, type Kysely, sql, type Updateable } from 'kysely'; +import { type ExpressionBuilder, type Insertable, type Kysely, type Updateable, sql } from 'kysely'; import { jsonObjectFrom } from 'kysely/helpers/postgres'; import { InjectKysely } from 'nestjs-kysely'; import { AssetFace } from 'src/database.js'; @@ -11,7 +11,7 @@ import { FaceSearchTable } from 'src/schema/tables/face-search.table.js'; import { PersonGroupTable } from 'src/schema/tables/person-group.table.js'; import { PersonTable } from 'src/schema/tables/person.table.js'; import { asUuid, dummy, inSharedAlbum, removeUndefinedKeys, withFilePath } from 'src/utils/database.js'; -import { paginationHelper, type PaginationOptions } from 'src/utils/pagination.js'; +import { type PaginationOptions, paginationHelper } from 'src/utils/pagination.js'; export interface PersonSearchOptions { withHidden: boolean; diff --git a/server/src/repositories/plugin.repository.ts b/server/src/repositories/plugin.repository.ts index b3bedf1cb..db359be9f 100644 --- a/server/src/repositories/plugin.repository.ts +++ b/server/src/repositories/plugin.repository.ts @@ -1,9 +1,9 @@ import { CallContext, Plugin as ExtismPlugin, newPlugin } from '@extism/extism'; import { Injectable } from '@nestjs/common'; -import { createPool, Pool } from 'generic-pool'; -import type { Insertable, Kysely } from 'kysely'; +import { Pool, createPool } from 'generic-pool'; import { jsonArrayFrom } from 'kysely/helpers/postgres'; import { InjectKysely } from 'nestjs-kysely'; +import type { Insertable, Kysely } from 'kysely'; import { columns } from 'src/database.js'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { PluginMethodSearchDto, PluginSearchDto } from 'src/dtos/plugin.dto.js'; diff --git a/server/src/repositories/process.repository.ts b/server/src/repositories/process.repository.ts index c9a793a62..433bbc015 100644 --- a/server/src/repositories/process.repository.ts +++ b/server/src/repositories/process.repository.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { fork, spawn, SpawnOptionsWithoutStdio } from 'node:child_process'; +import { SpawnOptionsWithoutStdio, fork, spawn } from 'node:child_process'; import { Duplex } from 'node:stream'; @Injectable() diff --git a/server/src/repositories/search.repository.ts b/server/src/repositories/search.repository.ts index 9ec789cad..18b84bfbd 100644 --- a/server/src/repositories/search.repository.ts +++ b/server/src/repositories/search.repository.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { type Kysely, type OrderByDirection, type Selectable, type ShallowDehydrateObject, sql } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; +import z from 'zod'; import { columns } from 'src/database.js'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { MapAsset } from 'src/dtos/asset-response.dto.js'; @@ -20,8 +21,7 @@ import { withExifInner, withSearchOrder, } from 'src/utils/database.js'; -import { paginationHelper, type PaginationOptions } from 'src/utils/pagination.js'; -import z from 'zod'; +import { type PaginationOptions, paginationHelper } from 'src/utils/pagination.js'; export interface SearchAssetIdOptions { checksum?: Buffer; diff --git a/server/src/repositories/server-info.repository.ts b/server/src/repositories/server-info.repository.ts index 1e841918f..0b7f1caf6 100644 --- a/server/src/repositories/server-info.repository.ts +++ b/server/src/repositories/server-info.repository.ts @@ -119,6 +119,7 @@ export class ServerInfoRepository { exiftool.version(), ]); + // eslint-disable-next-line import-x/no-named-as-default-member const libvipsVersion = getLockfileVersion('libvips', lockfile) || sharp.versions.vips; this.buildVersions = { diff --git a/server/src/repositories/session.repository.ts b/server/src/repositories/session.repository.ts index 6425a2115..277892fcc 100644 --- a/server/src/repositories/session.repository.ts +++ b/server/src/repositories/session.repository.ts @@ -1,8 +1,8 @@ import { Injectable } from '@nestjs/common'; -import type { Insertable, Kysely, Updateable } from 'kysely'; import { jsonObjectFrom } from 'kysely/helpers/postgres'; import { DateTime } from 'luxon'; import { InjectKysely } from 'nestjs-kysely'; +import type { Insertable, Kysely, Updateable } from 'kysely'; import { columns } from 'src/database.js'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { DB } from 'src/schema/index.js'; diff --git a/server/src/repositories/shared-link-asset.repository.ts b/server/src/repositories/shared-link-asset.repository.ts index 445ff3014..a86a3ae24 100644 --- a/server/src/repositories/shared-link-asset.repository.ts +++ b/server/src/repositories/shared-link-asset.repository.ts @@ -1,5 +1,5 @@ -import type { Kysely } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; +import type { Kysely } from 'kysely'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { DB } from 'src/schema/index.js'; diff --git a/server/src/repositories/shared-link.repository.ts b/server/src/repositories/shared-link.repository.ts index fb28257ef..71e53a304 100644 --- a/server/src/repositories/shared-link.repository.ts +++ b/server/src/repositories/shared-link.repository.ts @@ -5,8 +5,8 @@ import { type Kysely, type Selectable, type ShallowDehydrateObject, - sql, type Updateable, + sql, } from 'kysely'; import { jsonArrayFrom, jsonObjectFrom } from 'kysely/helpers/postgres'; import { omit } from 'lodash-es'; diff --git a/server/src/repositories/stack.repository.ts b/server/src/repositories/stack.repository.ts index d374d226a..7bb834c5c 100644 --- a/server/src/repositories/stack.repository.ts +++ b/server/src/repositories/stack.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; -import type { ExpressionBuilder, Insertable, Kysely, Updateable } from 'kysely'; import { jsonArrayFrom } from 'kysely/helpers/postgres'; import { InjectKysely } from 'nestjs-kysely'; +import type { ExpressionBuilder, Insertable, Kysely, Updateable } from 'kysely'; import { columns } from 'src/database.js'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { DB } from 'src/schema/index.js'; diff --git a/server/src/repositories/storage.repository.spec.ts b/server/src/repositories/storage.repository.spec.ts index 38dcafcc7..aca530835 100644 --- a/server/src/repositories/storage.repository.spec.ts +++ b/server/src/repositories/storage.repository.spec.ts @@ -188,6 +188,7 @@ describe(StorageRepository.name, () => { }); afterEach(() => { + // eslint-disable-next-line import-x/no-named-as-default-member mockfs.restore(); }); diff --git a/server/src/repositories/storage.repository.ts b/server/src/repositories/storage.repository.ts index 74648b154..ba53f35bd 100644 --- a/server/src/repositories/storage.repository.ts +++ b/server/src/repositories/storage.repository.ts @@ -1,15 +1,15 @@ import { Injectable } from '@nestjs/common'; import archiver from 'archiver'; -import chokidar, { ChokidarOptions } from 'chokidar'; +import { ChokidarOptions, watch as chokidarWatch } from 'chokidar'; import fastGlob from 'fast-glob'; import { + Dirent, + ReadOptionsWithBuffer, constants, createReadStream, createWriteStream, - Dirent, existsSync, mkdirSync, - ReadOptionsWithBuffer, watch, } from 'node:fs'; import fs from 'node:fs/promises'; @@ -227,6 +227,7 @@ export class StorageRepository { const globbedPaths = pathsToCrawl.map((path) => this.asGlob(path)); + // eslint-disable-next-line import-x/no-named-as-default-member return fastGlob.glob(globbedPaths, { absolute: true, caseSensitiveMatch: false, @@ -245,6 +246,7 @@ export class StorageRepository { const globbedPaths = pathsToCrawl.map((path) => this.asGlob(path)); + // eslint-disable-next-line import-x/no-named-as-default-member const stream = fastGlob.globStream(globbedPaths, { absolute: true, caseSensitiveMatch: false, @@ -268,7 +270,7 @@ export class StorageRepository { } watch(paths: string[], options: ChokidarOptions, events: Partial) { - const watcher = chokidar.watch(paths, options); + const watcher = chokidarWatch(paths, options); watcher.on('ready', () => events.onReady?.()); watcher.on('add', (path) => events.onAdd?.(path)); @@ -282,6 +284,7 @@ export class StorageRepository { watchDir = watch; // Native fs.watch without chokidar overhead private asGlob(pathToCrawl: string): string { + // eslint-disable-next-line import-x/no-named-as-default-member const escapedPath = fastGlob .escapePath(pathToCrawl) .replaceAll('"', '["]') diff --git a/server/src/repositories/sync.repository.ts b/server/src/repositories/sync.repository.ts index 77ea76a7c..09be860c5 100644 --- a/server/src/repositories/sync.repository.ts +++ b/server/src/repositories/sync.repository.ts @@ -1,10 +1,10 @@ import { Injectable } from '@nestjs/common'; import { type Kysely, sql } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; +import type { SyncAck } from 'src/types.js'; import { columns } from 'src/database.js'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { DB } from 'src/schema/index.js'; -import type { SyncAck } from 'src/types.js'; export type SyncBackfillOptions = { nowId: string; diff --git a/server/src/repositories/system-metadata.repository.ts b/server/src/repositories/system-metadata.repository.ts index 8398ad888..65de14e9e 100644 --- a/server/src/repositories/system-metadata.repository.ts +++ b/server/src/repositories/system-metadata.repository.ts @@ -1,11 +1,11 @@ import { Injectable } from '@nestjs/common'; -import type { Insertable, Kysely } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; import { readFile } from 'node:fs/promises'; +import type { Insertable, Kysely } from 'kysely'; +import type { SystemMetadata } from 'src/types.js'; import { GenerateSql } from 'src/decorators.js'; import { DB } from 'src/schema/index.js'; import { SystemMetadataTable } from 'src/schema/tables/system-metadata.table.js'; -import type { SystemMetadata } from 'src/types.js'; type Upsert = Insertable; diff --git a/server/src/repositories/tag.repository.ts b/server/src/repositories/tag.repository.ts index d6fbceae4..204dab973 100644 --- a/server/src/repositories/tag.repository.ts +++ b/server/src/repositories/tag.repository.ts @@ -1,12 +1,13 @@ import { Injectable } from '@nestjs/common'; -import type { Insertable, InsertQueryBuilder, Kysely, QueryCreator, Selectable, Updateable } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; +import type { InsertQueryBuilder, Insertable, Kysely, QueryCreator, Selectable, Updateable } from 'kysely'; import { columns } from 'src/database.js'; import { Chunked, ChunkedSet, DummyValue, GenerateSql } from 'src/decorators.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { DB } from 'src/schema/index.js'; import { TagAssetTable } from 'src/schema/tables/tag-asset.table.js'; import { TagTable } from 'src/schema/tables/tag.table.js'; + @Injectable() export class TagRepository { constructor( diff --git a/server/src/repositories/trash.repository.ts b/server/src/repositories/trash.repository.ts index 1b554c893..1a4a0efb7 100644 --- a/server/src/repositories/trash.repository.ts +++ b/server/src/repositories/trash.repository.ts @@ -1,5 +1,5 @@ -import type { Kysely } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; +import type { Kysely } from 'kysely'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { AssetStatus } from 'src/enum.js'; import { DB } from 'src/schema/index.js'; diff --git a/server/src/repositories/user.repository.ts b/server/src/repositories/user.repository.ts index 110cf04d5..5d692f82d 100644 --- a/server/src/repositories/user.repository.ts +++ b/server/src/repositories/user.repository.ts @@ -1,14 +1,14 @@ import { Injectable } from '@nestjs/common'; -import { type ExpressionBuilder, type Insertable, type Kysely, sql, type Updateable } from 'kysely'; +import { type ExpressionBuilder, type Insertable, type Kysely, type Updateable, sql } from 'kysely'; import { jsonArrayFrom } from 'kysely/helpers/postgres'; import { DateTime } from 'luxon'; import { InjectKysely } from 'nestjs-kysely'; +import type { UserMetadata, UserMetadataItem } from 'src/types.js'; import { columns } from 'src/database.js'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { AssetType, AssetVisibility, UserStatus } from 'src/enum.js'; import { DB } from 'src/schema/index.js'; import { UserTable } from 'src/schema/tables/user.table.js'; -import type { UserMetadata, UserMetadataItem } from 'src/types.js'; import { asUuid } from 'src/utils/database.js'; export interface UserListFilter { diff --git a/server/src/repositories/version-history.repository.ts b/server/src/repositories/version-history.repository.ts index a2b08580f..398c20014 100644 --- a/server/src/repositories/version-history.repository.ts +++ b/server/src/repositories/version-history.repository.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import type { Insertable, Kysely } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; +import type { Insertable, Kysely } from 'kysely'; import { GenerateSql } from 'src/decorators.js'; import { DB } from 'src/schema/index.js'; import { VersionHistoryTable } from 'src/schema/tables/version-history.table.js'; diff --git a/server/src/repositories/video-stream.repository.ts b/server/src/repositories/video-stream.repository.ts index 1681562ea..0b3776eee 100644 --- a/server/src/repositories/video-stream.repository.ts +++ b/server/src/repositories/video-stream.repository.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import type { Insertable, Kysely } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; +import type { Insertable, Kysely } from 'kysely'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { DB } from 'src/schema/index.js'; import { diff --git a/server/src/repositories/view-repository.ts b/server/src/repositories/view-repository.ts index 711e85ad3..dd5b353c6 100644 --- a/server/src/repositories/view-repository.ts +++ b/server/src/repositories/view-repository.ts @@ -1,5 +1,5 @@ -import type { Kysely } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; +import type { Kysely } from 'kysely'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { AssetVisibility } from 'src/enum.js'; import { DB } from 'src/schema/index.js'; diff --git a/server/src/repositories/workflow.repository.ts b/server/src/repositories/workflow.repository.ts index ff0e777a3..920e19bba 100644 --- a/server/src/repositories/workflow.repository.ts +++ b/server/src/repositories/workflow.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; -import type { Insertable, Kysely, Updateable } from 'kysely'; import { jsonArrayFrom, jsonObjectFrom } from 'kysely/helpers/postgres'; import { InjectKysely } from 'nestjs-kysely'; +import type { Insertable, Kysely, Updateable } from 'kysely'; import { columns } from 'src/database.js'; import { DummyValue, GenerateSql } from 'src/decorators.js'; import { WorkflowGetLogsDto, WorkflowSearchDto } from 'src/dtos/workflow.dto.js'; diff --git a/server/src/schema/tables/activity.table.ts b/server/src/schema/tables/activity.table.ts index 24c0f32d8..dd3e9ec96 100644 --- a/server/src/schema/tables/activity.table.ts +++ b/server/src/schema/tables/activity.table.ts @@ -11,7 +11,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { AlbumAssetTable } from 'src/schema/tables/album-asset.table.js'; import { AlbumTable } from 'src/schema/tables/album.table.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; diff --git a/server/src/schema/tables/album-asset.table.ts b/server/src/schema/tables/album-asset.table.ts index 6d0b35411..26a1a0bcb 100644 --- a/server/src/schema/tables/album-asset.table.ts +++ b/server/src/schema/tables/album-asset.table.ts @@ -7,7 +7,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { album_asset_delete_audit } from 'src/schema/functions.js'; import { AlbumTable } from 'src/schema/tables/album.table.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; diff --git a/server/src/schema/tables/album-user.table.ts b/server/src/schema/tables/album-user.table.ts index 510fdbf61..b53de78cc 100644 --- a/server/src/schema/tables/album-user.table.ts +++ b/server/src/schema/tables/album-user.table.ts @@ -10,7 +10,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { CreateIdColumn, UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { CreateIdColumn, UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { AlbumUserRole } from 'src/enum.js'; import { album_user_role_enum } from 'src/schema/enums.js'; import { album_user_after_insert, album_user_delete, album_user_delete_audit } from 'src/schema/functions.js'; diff --git a/server/src/schema/tables/album.table.ts b/server/src/schema/tables/album.table.ts index bc7592b0f..d74bda72c 100644 --- a/server/src/schema/tables/album.table.ts +++ b/server/src/schema/tables/album.table.ts @@ -9,7 +9,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { AssetOrder } from 'src/enum.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; diff --git a/server/src/schema/tables/api-key.table.ts b/server/src/schema/tables/api-key.table.ts index ccc2f0889..ce6441490 100644 --- a/server/src/schema/tables/api-key.table.ts +++ b/server/src/schema/tables/api-key.table.ts @@ -8,7 +8,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { Permission } from 'src/enum.js'; import { UserTable } from 'src/schema/tables/user.table.js'; diff --git a/server/src/schema/tables/asset-edit.table.ts b/server/src/schema/tables/asset-edit.table.ts index d7315f8b0..f9f2d91fc 100644 --- a/server/src/schema/tables/asset-edit.table.ts +++ b/server/src/schema/tables/asset-edit.table.ts @@ -10,7 +10,7 @@ import { Unique, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { AssetEditAction, type AssetEditParameters } from 'src/dtos/editing.dto.js'; import { asset_edit_audit, asset_edit_delete, asset_edit_insert } from 'src/schema/functions.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; diff --git a/server/src/schema/tables/asset-exif.table.ts b/server/src/schema/tables/asset-exif.table.ts index f5c4546ef..5e34f8436 100644 --- a/server/src/schema/tables/asset-exif.table.ts +++ b/server/src/schema/tables/asset-exif.table.ts @@ -9,7 +9,7 @@ import { UpdateDateColumn, } from '@immich/sql-tools'; import { LockableProperty } from 'src/database.js'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; @Table('asset_exif') diff --git a/server/src/schema/tables/asset-face.table.ts b/server/src/schema/tables/asset-face.table.ts index 69213dc1f..85437a129 100644 --- a/server/src/schema/tables/asset-face.table.ts +++ b/server/src/schema/tables/asset-face.table.ts @@ -10,7 +10,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { SourceType } from 'src/enum.js'; import { asset_face_source_type } from 'src/schema/enums.js'; import { asset_face_audit } from 'src/schema/functions.js'; diff --git a/server/src/schema/tables/asset-file.table.ts b/server/src/schema/tables/asset-file.table.ts index bd234c406..67bcb789d 100644 --- a/server/src/schema/tables/asset-file.table.ts +++ b/server/src/schema/tables/asset-file.table.ts @@ -9,7 +9,7 @@ import { Unique, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { AssetFileType } from 'src/enum.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; diff --git a/server/src/schema/tables/asset-metadata.table.ts b/server/src/schema/tables/asset-metadata.table.ts index 3747bd648..dce78537b 100644 --- a/server/src/schema/tables/asset-metadata.table.ts +++ b/server/src/schema/tables/asset-metadata.table.ts @@ -8,7 +8,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { AssetMetadataKey } from 'src/enum.js'; import { asset_metadata_audit } from 'src/schema/functions.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; diff --git a/server/src/schema/tables/asset-ocr.table.ts b/server/src/schema/tables/asset-ocr.table.ts index 6a9200aa0..315491ec4 100644 --- a/server/src/schema/tables/asset-ocr.table.ts +++ b/server/src/schema/tables/asset-ocr.table.ts @@ -8,7 +8,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { asset_ocr_delete_audit } from 'src/schema/functions.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; diff --git a/server/src/schema/tables/asset.table.ts b/server/src/schema/tables/asset.table.ts index 0d009c1f9..9053aec48 100644 --- a/server/src/schema/tables/asset.table.ts +++ b/server/src/schema/tables/asset.table.ts @@ -11,7 +11,7 @@ import { type Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { AssetStatus, AssetType, AssetVisibility, ChecksumAlgorithm } from 'src/enum.js'; import { asset_checksum_algorithm_enum, asset_visibility_enum, assets_status_enum } from 'src/schema/enums.js'; import { asset_delete_audit } from 'src/schema/functions.js'; diff --git a/server/src/schema/tables/cluster-group.table.ts b/server/src/schema/tables/cluster-group.table.ts index c7d3f79b8..bef09a687 100644 --- a/server/src/schema/tables/cluster-group.table.ts +++ b/server/src/schema/tables/cluster-group.table.ts @@ -7,7 +7,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; @Table('cluster_group') @UpdatedAtTrigger('cluster_group_updatedAt') diff --git a/server/src/schema/tables/library.table.ts b/server/src/schema/tables/library.table.ts index 94d6a9ebd..0a6515f39 100644 --- a/server/src/schema/tables/library.table.ts +++ b/server/src/schema/tables/library.table.ts @@ -9,7 +9,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { UserTable } from 'src/schema/tables/user.table.js'; @Table('library') diff --git a/server/src/schema/tables/memory-asset.table.ts b/server/src/schema/tables/memory-asset.table.ts index 407cb739e..0ec07ce7f 100644 --- a/server/src/schema/tables/memory-asset.table.ts +++ b/server/src/schema/tables/memory-asset.table.ts @@ -7,7 +7,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { memory_asset_delete_audit } from 'src/schema/functions.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; import { MemoryTable } from 'src/schema/tables/memory.table.js'; diff --git a/server/src/schema/tables/memory.table.ts b/server/src/schema/tables/memory.table.ts index ab2595004..4d52edab1 100644 --- a/server/src/schema/tables/memory.table.ts +++ b/server/src/schema/tables/memory.table.ts @@ -10,7 +10,7 @@ import { type Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { MemoryType } from 'src/enum.js'; import { memory_delete_audit } from 'src/schema/functions.js'; import { UserTable } from 'src/schema/tables/user.table.js'; diff --git a/server/src/schema/tables/notification.table.ts b/server/src/schema/tables/notification.table.ts index 62dbbf41f..2fb07d0af 100644 --- a/server/src/schema/tables/notification.table.ts +++ b/server/src/schema/tables/notification.table.ts @@ -9,7 +9,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { NotificationLevel, NotificationType } from 'src/enum.js'; import { UserTable } from 'src/schema/tables/user.table.js'; diff --git a/server/src/schema/tables/partner.table.ts b/server/src/schema/tables/partner.table.ts index 264344dda..d59be9945 100644 --- a/server/src/schema/tables/partner.table.ts +++ b/server/src/schema/tables/partner.table.ts @@ -8,7 +8,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { CreateIdColumn, UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { CreateIdColumn, UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { partner_delete_audit } from 'src/schema/functions.js'; import { UserTable } from 'src/schema/tables/user.table.js'; diff --git a/server/src/schema/tables/person-group.table.ts b/server/src/schema/tables/person-group.table.ts index 30d0ca419..9009dc528 100644 --- a/server/src/schema/tables/person-group.table.ts +++ b/server/src/schema/tables/person-group.table.ts @@ -8,7 +8,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { CreateIdColumn, UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { CreateIdColumn, UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { person_group_delete_audit } from 'src/schema/functions.js'; import { ClusterGroupTable } from 'src/schema/tables/cluster-group.table.js'; diff --git a/server/src/schema/tables/person.table.ts b/server/src/schema/tables/person.table.ts index 84c6e190f..d51e20bc3 100644 --- a/server/src/schema/tables/person.table.ts +++ b/server/src/schema/tables/person.table.ts @@ -10,7 +10,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { person_delete_audit } from 'src/schema/functions.js'; import { AssetFaceTable } from 'src/schema/tables/asset-face.table.js'; import { PersonGroupTable } from 'src/schema/tables/person-group.table.js'; diff --git a/server/src/schema/tables/session.table.ts b/server/src/schema/tables/session.table.ts index 1c37d2ece..c866a870b 100644 --- a/server/src/schema/tables/session.table.ts +++ b/server/src/schema/tables/session.table.ts @@ -8,7 +8,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { UserTable } from 'src/schema/tables/user.table.js'; @Table({ name: 'session' }) diff --git a/server/src/schema/tables/stack.table.ts b/server/src/schema/tables/stack.table.ts index 27a73bf90..a38b0350d 100644 --- a/server/src/schema/tables/stack.table.ts +++ b/server/src/schema/tables/stack.table.ts @@ -8,7 +8,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { stack_delete_audit } from 'src/schema/functions.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; import { UserTable } from 'src/schema/tables/user.table.js'; diff --git a/server/src/schema/tables/sync-checkpoint.table.ts b/server/src/schema/tables/sync-checkpoint.table.ts index a62b930d6..dabb58032 100644 --- a/server/src/schema/tables/sync-checkpoint.table.ts +++ b/server/src/schema/tables/sync-checkpoint.table.ts @@ -8,7 +8,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { SyncEntityType } from 'src/enum.js'; import { SessionTable } from 'src/schema/tables/session.table.js'; diff --git a/server/src/schema/tables/system-metadata.table.ts b/server/src/schema/tables/system-metadata.table.ts index 50fa9be9b..1d955ff36 100644 --- a/server/src/schema/tables/system-metadata.table.ts +++ b/server/src/schema/tables/system-metadata.table.ts @@ -1,6 +1,6 @@ import { Column, PrimaryColumn, Table } from '@immich/sql-tools'; -import { SystemMetadataKey } from 'src/enum.js'; import type { SystemMetadata } from 'src/types.js'; +import { SystemMetadataKey } from 'src/enum.js'; @Table('system_metadata') export class SystemMetadataTable { diff --git a/server/src/schema/tables/tag.table.ts b/server/src/schema/tables/tag.table.ts index 05dc68d3d..5230888c1 100644 --- a/server/src/schema/tables/tag.table.ts +++ b/server/src/schema/tables/tag.table.ts @@ -9,7 +9,7 @@ import { Unique, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { UserTable } from 'src/schema/tables/user.table.js'; @Table('tag') diff --git a/server/src/schema/tables/user-metadata.table.ts b/server/src/schema/tables/user-metadata.table.ts index bdbb3f0ce..360b9f05d 100644 --- a/server/src/schema/tables/user-metadata.table.ts +++ b/server/src/schema/tables/user-metadata.table.ts @@ -8,11 +8,11 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import type { UserMetadata, UserMetadataItem } from 'src/types.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { UserMetadataKey } from 'src/enum.js'; import { user_metadata_audit } from 'src/schema/functions.js'; import { UserTable } from 'src/schema/tables/user.table.js'; -import type { UserMetadata, UserMetadataItem } from 'src/types.js'; @UpdatedAtTrigger('user_metadata_updated_at') @Table('user_metadata') diff --git a/server/src/schema/tables/user.table.ts b/server/src/schema/tables/user.table.ts index 1dfa224e5..5851f7ad7 100644 --- a/server/src/schema/tables/user.table.ts +++ b/server/src/schema/tables/user.table.ts @@ -12,7 +12,7 @@ import { UpdateDateColumn, } from '@immich/sql-tools'; import { ColumnType } from 'kysely'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { UserAvatarColor, UserStatus } from 'src/enum.js'; import { user_delete_audit } from 'src/schema/functions.js'; import { ClusterGroupTable } from 'src/schema/tables/cluster-group.table.js'; diff --git a/server/src/schema/tables/workflow-step.table.ts b/server/src/schema/tables/workflow-step.table.ts index 8d7696da1..6cb274dce 100644 --- a/server/src/schema/tables/workflow-step.table.ts +++ b/server/src/schema/tables/workflow-step.table.ts @@ -1,5 +1,5 @@ import { WorkflowStepConfig } from '@immich/plugin-sdk'; -import { Column, ForeignKeyColumn, PrimaryGeneratedColumn, Table, type Generated } from '@immich/sql-tools'; +import { Column, ForeignKeyColumn, type Generated, PrimaryGeneratedColumn, Table } from '@immich/sql-tools'; import { PluginMethodTable } from 'src/schema/tables/plugin-method.table.js'; import { WorkflowTable } from 'src/schema/tables/workflow.table.js'; diff --git a/server/src/schema/tables/workflow.table.ts b/server/src/schema/tables/workflow.table.ts index 0ab2cb27c..f27f63ef8 100644 --- a/server/src/schema/tables/workflow.table.ts +++ b/server/src/schema/tables/workflow.table.ts @@ -9,7 +9,7 @@ import { Timestamp, UpdateDateColumn, } from '@immich/sql-tools'; -import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators.js'; +import { UpdateIdColumn, UpdatedAtTrigger } from 'src/decorators.js'; import { UserTable } from 'src/schema/tables/user.table.js'; @Table('workflow') diff --git a/server/src/services/activity.service.spec.ts b/server/src/services/activity.service.spec.ts index af1cc3e22..879eb52ab 100644 --- a/server/src/services/activity.service.spec.ts +++ b/server/src/services/activity.service.spec.ts @@ -5,7 +5,7 @@ import { ActivityFactory } from 'test/factories/activity.factory.js'; import { AuthFactory } from 'test/factories/auth.factory.js'; import { getForActivity } from 'test/mappers.js'; import { newUuid, newUuids } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(ActivityService.name, () => { let sut: ActivityService; diff --git a/server/src/services/activity.service.ts b/server/src/services/activity.service.ts index 60bba48bd..d3beb6993 100644 --- a/server/src/services/activity.service.ts +++ b/server/src/services/activity.service.ts @@ -6,10 +6,10 @@ import { ActivityResponseDto, ActivitySearchDto, ActivityStatisticsResponseDto, - mapActivity, MaybeDuplicate, ReactionLevel, ReactionType, + mapActivity, } from 'src/dtos/activity.dto.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { Permission } from 'src/enum.js'; diff --git a/server/src/services/album.service.spec.ts b/server/src/services/album.service.spec.ts index 2a5930c86..1f7662be4 100644 --- a/server/src/services/album.service.spec.ts +++ b/server/src/services/album.service.spec.ts @@ -10,7 +10,7 @@ import { UserFactory } from 'test/factories/user.factory.js'; import { authStub } from 'test/fixtures/auth.stub.js'; import { getForAlbum } from 'test/mappers.js'; import { newUuid } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(AlbumService.name, () => { let sut: AlbumService; diff --git a/server/src/services/album.service.ts b/server/src/services/album.service.ts index 42e82e8a1..3dfa0525a 100644 --- a/server/src/services/album.service.ts +++ b/server/src/services/album.service.ts @@ -2,14 +2,14 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { AddUsersDto, AlbumResponseDto, + AlbumStatisticsResponseDto, AlbumsAddAssetsDto, AlbumsAddAssetsResponseDto, - AlbumStatisticsResponseDto, CreateAlbumDto, GetAlbumsDto, - mapAlbum, UpdateAlbumDto, UpdateAlbumUserDto, + mapAlbum, } from 'src/dtos/album.dto.js'; import { BulkIdErrorReason, BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; diff --git a/server/src/services/api-key.service.spec.ts b/server/src/services/api-key.service.spec.ts index b12f9e5cf..d6ca00b53 100644 --- a/server/src/services/api-key.service.spec.ts +++ b/server/src/services/api-key.service.spec.ts @@ -5,7 +5,7 @@ import { ApiKeyFactory } from 'test/factories/api-key.factory.js'; import { AuthFactory } from 'test/factories/auth.factory.js'; import { SessionFactory } from 'test/factories/session.factory.js'; import { newUuid } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(ApiKeyService.name, () => { let sut: ApiKeyService; diff --git a/server/src/services/asset-file.service.ts b/server/src/services/asset-file.service.ts index 853b1983b..805a505b1 100644 --- a/server/src/services/asset-file.service.ts +++ b/server/src/services/asset-file.service.ts @@ -3,7 +3,7 @@ import { AssetFileResponseDto, AssetFileSearchDto, mapAssetFile } from 'src/dtos import { AuthDto } from 'src/dtos/auth.dto.js'; import { AssetFileType, CacheControl, JobName, Permission } from 'src/enum.js'; import { BaseService } from 'src/services/base.service.js'; -import { getFilenameExtension, getFileNameWithoutExtension, ImmichFileResponse } from 'src/utils/file.js'; +import { ImmichFileResponse, getFileNameWithoutExtension, getFilenameExtension } from 'src/utils/file.js'; import { mimeTypes } from 'src/utils/mime-types.js'; import { findOrFail } from 'src/utils/misc.js'; diff --git a/server/src/services/asset-media.service.spec.ts b/server/src/services/asset-media.service.spec.ts index 0751cef21..b31619e42 100644 --- a/server/src/services/asset-media.service.spec.ts +++ b/server/src/services/asset-media.service.spec.ts @@ -4,6 +4,7 @@ import { NotFoundException, UnauthorizedException, } from '@nestjs/common'; +import type { UploadBody } from 'src/types.js'; import { AssetFile } from 'src/database.js'; import { AssetMediaStatus, AssetRejectReason, AssetUploadAction } from 'src/dtos/asset-media-response.dto.js'; import { AssetMediaCreateDto, AssetMediaSize, UploadFieldName } from 'src/dtos/asset-media.dto.js'; @@ -12,7 +13,6 @@ import { AssetEditAction } from 'src/dtos/editing.dto.js'; import { AssetFileType, AssetType, AssetVisibility, CacheControl, JobName } from 'src/enum.js'; import { AuthRequest } from 'src/middleware/auth.guard.js'; import { AssetMediaService } from 'src/services/asset-media.service.js'; -import type { UploadBody } from 'src/types.js'; import { ASSET_CHECKSUM_CONSTRAINT } from 'src/utils/database.js'; import { ImmichFileResponse } from 'src/utils/file.js'; import { AssetFileFactory } from 'test/factories/asset-file.factory.js'; @@ -22,7 +22,7 @@ import { authStub } from 'test/fixtures/auth.stub.js'; import { fileStub } from 'test/fixtures/file.stub.js'; import { userStub } from 'test/fixtures/user.stub.js'; import { getForAsset } from 'test/mappers.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; const file1 = Buffer.from('d2947b871a706081be194569951b7db246907957', 'hex'); diff --git a/server/src/services/asset-media.service.ts b/server/src/services/asset-media.service.ts index ec75fcb6a..b12161e61 100644 --- a/server/src/services/asset-media.service.ts +++ b/server/src/services/asset-media.service.ts @@ -1,5 +1,6 @@ import { BadRequestException, Injectable, InternalServerErrorException, NotFoundException } from '@nestjs/common'; import sanitize from 'sanitize-filename'; +import type { UploadFile, UploadRequest } from 'src/types.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { Asset, AuthSharedLink } from 'src/database.js'; import { @@ -29,11 +30,10 @@ import { } from 'src/enum.js'; import { AuthRequest } from 'src/middleware/auth.guard.js'; import { BaseService } from 'src/services/base.service.js'; -import type { UploadFile, UploadRequest } from 'src/types.js'; import { requireUploadAccess } from 'src/utils/access.js'; import { asUploadRequest, onBeforeLink } from 'src/utils/asset.util.js'; import { isAssetChecksumConstraint } from 'src/utils/database.js'; -import { getFilenameExtension, getFileNameWithoutExtension, ImmichFileResponse } from 'src/utils/file.js'; +import { ImmichFileResponse, getFileNameWithoutExtension, getFilenameExtension } from 'src/utils/file.js'; import { mimeTypes } from 'src/utils/mime-types.js'; import { fromChecksum } from 'src/utils/request.js'; diff --git a/server/src/services/asset.service.spec.ts b/server/src/services/asset.service.spec.ts index 2bca1fec9..4e40a0935 100755 --- a/server/src/services/asset.service.spec.ts +++ b/server/src/services/asset.service.spec.ts @@ -18,7 +18,7 @@ import { AuthFactory } from 'test/factories/auth.factory.js'; import { authStub } from 'test/fixtures/auth.stub.js'; import { getForAsset, getForAssetDeletion } from 'test/mappers.js'; import { factory, newUuid } from 'test/small.factory.js'; -import { makeStream, newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, makeStream, newTestService } from 'test/utils.js'; const stats: AssetStats = { [AssetType.Image]: 10, diff --git a/server/src/services/asset.service.ts b/server/src/services/asset.service.ts index 44525955d..ef1e02dd9 100644 --- a/server/src/services/asset.service.ts +++ b/server/src/services/asset.service.ts @@ -2,6 +2,8 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { isUndefined, omitBy } from 'lodash-es'; import { DateTime, Duration } from 'luxon'; import type { AssetFile } from 'src/database.js'; +import type { AuthDto } from 'src/dtos/auth.dto.js'; +import type { JobItem, JobOf } from 'src/types.js'; import { OnJob } from 'src/decorators.js'; import { AssetResponseDto, SanitizedAssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto.js'; import { @@ -19,7 +21,6 @@ import { UpdateAssetDto, mapStats, } from 'src/dtos/asset.dto.js'; -import type { AuthDto } from 'src/dtos/auth.dto.js'; import { AssetEditAction, type AssetEditActionItem, @@ -38,7 +39,6 @@ import { QueueName, } from 'src/enum.js'; import { BaseService } from 'src/services/base.service.js'; -import type { JobItem, JobOf } from 'src/types.js'; import { requireElevatedPermission } from 'src/utils/access.js'; import { getAssetFiles, diff --git a/server/src/services/auth.service.spec.ts b/server/src/services/auth.service.spec.ts index 1181d73ca..ed8f1c1b3 100644 --- a/server/src/services/auth.service.spec.ts +++ b/server/src/services/auth.service.spec.ts @@ -1,11 +1,11 @@ import { BadRequestException, ForbiddenException, UnauthorizedException } from '@nestjs/common'; import { DateTime } from 'luxon'; +import type { UserMetadataItem } from 'src/types.js'; import { SALT_ROUNDS } from 'src/constants.js'; import { UserAdmin } from 'src/database.js'; import { AuthDto, SignUpDto } from 'src/dtos/auth.dto.js'; import { AuthType, Permission } from 'src/enum.js'; import { AuthService } from 'src/services/auth.service.js'; -import type { UserMetadataItem } from 'src/types.js'; import { ApiKeyFactory } from 'test/factories/api-key.factory.js'; import { AuthFactory } from 'test/factories/auth.factory.js'; import { OAuthProfileFactory } from 'test/factories/oauth-profile.factory.js'; @@ -15,7 +15,7 @@ import { sharedLinkStub } from 'test/fixtures/shared-link.stub.js'; import { systemConfigStub } from 'test/fixtures/system-config.stub.js'; import { userStub } from 'test/fixtures/user.stub.js'; import { newUuid } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; const email = 'test@immich.com'; const loginDetails = { diff --git a/server/src/services/auth.service.ts b/server/src/services/auth.service.ts index 76f4e700d..1259b0f35 100644 --- a/server/src/services/auth.service.ts +++ b/server/src/services/auth.service.ts @@ -28,6 +28,7 @@ import { isGranted } from 'src/utils/access.js'; import { HumanReadableSize } from 'src/utils/bytes.js'; import { generateProfileImage } from 'src/utils/profile-image.js'; import { getUserAgentDetails } from 'src/utils/request.js'; + export interface LoginDetails { isSecure: boolean; clientIp: string; diff --git a/server/src/services/base.service.ts b/server/src/services/base.service.ts index a5fa25a1b..1dc1f6a6a 100644 --- a/server/src/services/base.service.ts +++ b/server/src/services/base.service.ts @@ -1,6 +1,7 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { Insertable } from 'kysely'; import sanitize from 'sanitize-filename'; +import type { ClassConstructor } from 'src/types.js'; import { SALT_ROUNDS } from 'src/constants.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { UserAdmin } from 'src/database.js'; @@ -61,7 +62,6 @@ import { ViewRepository } from 'src/repositories/view-repository.js'; import { WebsocketRepository } from 'src/repositories/websocket.repository.js'; import { WorkflowRepository } from 'src/repositories/workflow.repository.js'; import { UserTable } from 'src/schema/tables/user.table.js'; -import type { ClassConstructor } from 'src/types.js'; import { AccessRequest, checkAccess, requireAccess } from 'src/utils/access.js'; import { getConfig, updateConfig } from 'src/utils/config.js'; diff --git a/server/src/services/cli.service.spec.ts b/server/src/services/cli.service.spec.ts index af5322ec4..4f948a4bc 100644 --- a/server/src/services/cli.service.spec.ts +++ b/server/src/services/cli.service.spec.ts @@ -1,9 +1,9 @@ import { jwtVerify } from 'jose'; +import { describe, it } from 'vitest'; import { MaintenanceAction, SystemMetadataKey } from 'src/enum.js'; import { CliService } from 'src/services/cli.service.js'; import { UserFactory } from 'test/factories/user.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; -import { describe, it } from 'vitest'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(CliService.name, () => { let sut: CliService; diff --git a/server/src/services/cluster-group.service.ts b/server/src/services/cluster-group.service.ts index a66c6cbf7..cd3e78bb9 100644 --- a/server/src/services/cluster-group.service.ts +++ b/server/src/services/cluster-group.service.ts @@ -6,7 +6,7 @@ import { ClusterGroupRequestResponseDto, mapClusterGroupRequest, } from 'src/dtos/cluster-group.dto.js'; -import { mapUser, UserResponseDto } from 'src/dtos/user.dto.js'; +import { UserResponseDto, mapUser } from 'src/dtos/user.dto.js'; import { JobName, Permission } from 'src/enum.js'; import { BaseService } from 'src/services/base.service.js'; import { findOrFail } from 'src/utils/misc.js'; diff --git a/server/src/services/database-backup.service.spec.ts b/server/src/services/database-backup.service.spec.ts index d300914e9..9778f984a 100644 --- a/server/src/services/database-backup.service.spec.ts +++ b/server/src/services/database-backup.service.spec.ts @@ -2,12 +2,12 @@ import { BadRequestException } from '@nestjs/common'; import { DateTime } from 'luxon'; import { Duplex, PassThrough, Readable } from 'node:stream'; import { StorageCore } from 'src/cores/storage.core.js'; -import { defaults, SystemConfig } from 'src/dtos/config.dto.js'; +import { SystemConfig, defaults } from 'src/dtos/config.dto.js'; import { ImmichWorker, JobStatus, StorageFolder } from 'src/enum.js'; import { MaintenanceHealthRepository } from 'src/maintenance/maintenance-health.repository.js'; import { DatabaseBackupService } from 'src/services/database-backup.service.js'; import { systemConfigStub } from 'test/fixtures/system-config.stub.js'; -import { automock, AutoMocked, getMocks, mockDuplex, mockSpawn, ServiceMocks } from 'test/utils.js'; +import { AutoMocked, ServiceMocks, automock, getMocks, mockDuplex, mockSpawn } from 'test/utils.js'; describe(DatabaseBackupService.name, () => { let sut: DatabaseBackupService; diff --git a/server/src/services/database-backup.service.ts b/server/src/services/database-backup.service.ts index f513b6e6b..2a62afbe5 100644 --- a/server/src/services/database-backup.service.ts +++ b/server/src/services/database-backup.service.ts @@ -4,7 +4,8 @@ import { DateTime } from 'luxon'; import path, { basename } from 'node:path'; import { Duplex, PassThrough, Readable, Writable } from 'node:stream'; import { pipeline } from 'node:stream/promises'; -import semver from 'semver'; +import { coerce, satisfies } from 'semver'; +import type { ArgOf } from 'src/repositories/event.repository.js'; import { serverVersion } from 'src/constants.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { OnEvent, OnJob } from 'src/decorators.js'; @@ -14,7 +15,6 @@ import { MaintenanceHealthRepository } from 'src/maintenance/maintenance-health. import { ConfigRepository } from 'src/repositories/config.repository.js'; import { CronRepository } from 'src/repositories/cron.repository.js'; import { DatabaseRepository } from 'src/repositories/database.repository.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { JobRepository } from 'src/repositories/job.repository.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { ProcessRepository } from 'src/repositories/process.repository.js'; @@ -23,11 +23,11 @@ import { SystemMetadataRepository } from 'src/repositories/system-metadata.repos import { UserRepository } from 'src/repositories/user.repository.js'; import { getConfig } from 'src/utils/config.js'; import { + UnsupportedPostgresError, findDatabaseBackupVersion, isFailedDatabaseBackupName, isValidDatabaseBackupName, isValidDatabaseRoutineBackupName, - UnsupportedPostgresError, } from 'src/utils/database-backups.js'; import { ImmichFileResponse } from 'src/utils/file.js'; import { handlePromiseError } from 'src/utils/misc.js'; @@ -124,7 +124,7 @@ export class DatabaseBackupService { const isUrlConnection = databaseConfig.connectionType === 'url'; const databaseVersion = await this.databaseRepository.getPostgresVersion(); - const databaseSemver = semver.coerce(databaseVersion); + const databaseSemver = coerce(databaseVersion); const databaseMajorVersion = databaseSemver?.major; const args: string[] = []; @@ -209,7 +209,7 @@ export class DatabaseBackupService { } } - if (!databaseMajorVersion || !databaseSemver || !semver.satisfies(databaseSemver, '>=14.0.0 <19.0.0')) { + if (!databaseMajorVersion || !databaseSemver || !satisfies(databaseSemver, '>=14.0.0 <19.0.0')) { this.logger.error(`Database Restore Failure: Unsupported PostgreSQL version: ${databaseVersion}`); throw new UnsupportedPostgresError(databaseVersion); } @@ -375,7 +375,7 @@ export class DatabaseBackupService { let isPgClusterDump = false; const version = findDatabaseBackupVersion(filename); - if (version && semver.satisfies(version, '<= 2.4')) { + if (version && satisfies(version, '<= 2.4')) { isPgClusterDump = true; } diff --git a/server/src/services/database.service.spec.ts b/server/src/services/database.service.spec.ts index 15f3992e0..29f24aac3 100644 --- a/server/src/services/database.service.spec.ts +++ b/server/src/services/database.service.spec.ts @@ -1,9 +1,9 @@ +import type { VectorExtension } from 'src/types.js'; import { EXTENSION_NAMES } from 'src/constants.js'; import { DatabaseExtension, VectorIndex } from 'src/enum.js'; import { DatabaseService } from 'src/services/database.service.js'; -import type { VectorExtension } from 'src/types.js'; import { envData, mockEnvData } from 'test/repositories/config.repository.mock.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(DatabaseService.name, () => { let sut: DatabaseService; diff --git a/server/src/services/database.service.ts b/server/src/services/database.service.ts index d13d130f8..1d061a45c 100644 --- a/server/src/services/database.service.ts +++ b/server/src/services/database.service.ts @@ -1,10 +1,10 @@ import { Injectable } from '@nestjs/common'; -import semver from 'semver'; -import { ErrorMessages, EXTENSION_NAMES, VECTOR_EXTENSIONS } from 'src/constants.js'; +import { coerce, eq, gt, lt, satisfies } from 'semver'; +import type { VectorExtension } from 'src/types.js'; +import { EXTENSION_NAMES, ErrorMessages, VECTOR_EXTENSIONS } from 'src/constants.js'; import { OnEvent } from 'src/decorators.js'; import { BootstrapEventPriority, DatabaseExtension, DatabaseLock, VectorIndex } from 'src/enum.js'; import { BaseService } from 'src/services/base.service.js'; -import type { VectorExtension } from 'src/types.js'; type CreateFailedArgs = { name: string; extension: string }; type UpdateFailedArgs = { name: string; extension: string; availableVersion: string }; @@ -56,9 +56,9 @@ export class DatabaseService extends BaseService { @OnEvent({ name: 'AppBootstrap', priority: BootstrapEventPriority.DatabaseService }) async onBootstrap() { const version = await this.databaseRepository.getPostgresVersion(); - const current = semver.coerce(version); + const current = coerce(version); const postgresRange = this.databaseRepository.getPostgresVersionRange(); - if (!current || !semver.satisfies(current, postgresRange)) { + if (!current || !satisfies(current, postgresRange)) { throw new Error( `Invalid PostgreSQL version. Found ${version}, but needed ${postgresRange}. Please use a supported version.`, ); @@ -75,11 +75,11 @@ export class DatabaseService extends BaseService { throw new Error(messages.notInstalled(name)); } - if ([availableVersion, installedVersion].some((version) => version && semver.eq(version, '0.0.0'))) { + if ([availableVersion, installedVersion].some((version) => version && eq(version, '0.0.0'))) { throw new Error(messages.nightlyVersion({ name, extension, version: '0.0.0' })); } - if (!semver.satisfies(availableVersion, extensionRange)) { + if (!satisfies(availableVersion, extensionRange)) { throw new Error(messages.outOfRange({ name, extension, version: availableVersion, range: extensionRange })); } @@ -87,11 +87,11 @@ export class DatabaseService extends BaseService { await this.createExtension(extension); } - if (installedVersion && semver.gt(availableVersion, installedVersion)) { + if (installedVersion && gt(availableVersion, installedVersion)) { await this.updateExtension(extension, availableVersion); - } else if (installedVersion && !semver.satisfies(installedVersion, extensionRange)) { + } else if (installedVersion && !satisfies(installedVersion, extensionRange)) { throw new Error(messages.outOfRange({ name, extension, version: installedVersion, range: extensionRange })); - } else if (installedVersion && semver.lt(availableVersion, installedVersion)) { + } else if (installedVersion && lt(availableVersion, installedVersion)) { throw new Error(messages.invalidDowngrade({ name, extension, availableVersion, installedVersion })); } diff --git a/server/src/services/download.service.spec.ts b/server/src/services/download.service.spec.ts index cb4d850d9..5c30bb169 100644 --- a/server/src/services/download.service.spec.ts +++ b/server/src/services/download.service.spec.ts @@ -1,11 +1,11 @@ import { BadRequestException } from '@nestjs/common'; import { Readable } from 'node:stream'; +import { vitest } from 'vitest'; import { DownloadResponseDto } from 'src/dtos/download.dto.js'; import { DownloadService } from 'src/services/download.service.js'; import { AssetFactory } from 'test/factories/asset.factory.js'; import { authStub } from 'test/fixtures/auth.stub.js'; -import { makeStream, newTestService, ServiceMocks } from 'test/utils.js'; -import { vitest } from 'vitest'; +import { ServiceMocks, makeStream, newTestService } from 'test/utils.js'; const downloadResponse: DownloadResponseDto = { totalSize: 105_000, diff --git a/server/src/services/duplicate.service.spec.ts b/server/src/services/duplicate.service.spec.ts index 305ac4715..b41f3a07e 100644 --- a/server/src/services/duplicate.service.spec.ts +++ b/server/src/services/duplicate.service.spec.ts @@ -1,4 +1,5 @@ import { BadRequestException } from '@nestjs/common'; +import { beforeEach, describe, expect, it, vitest } from 'vitest'; import { BulkIdErrorReason } from 'src/dtos/asset-ids.response.dto.js'; import { MapAsset } from 'src/dtos/asset-response.dto.js'; import { AssetType, AssetVisibility, JobName, JobStatus } from 'src/enum.js'; @@ -7,8 +8,7 @@ import { AssetFactory } from 'test/factories/asset.factory.js'; import { authStub } from 'test/fixtures/auth.stub.js'; import { getForDuplicate } from 'test/mappers.js'; import { newUuid } from 'test/small.factory.js'; -import { makeStream, newTestService, ServiceMocks } from 'test/utils.js'; -import { beforeEach, describe, expect, it, vitest } from 'vitest'; +import { ServiceMocks, makeStream, newTestService } from 'test/utils.js'; vitest.useFakeTimers(); diff --git a/server/src/services/duplicate.service.ts b/server/src/services/duplicate.service.ts index dc882fcab..7bcb371dd 100644 --- a/server/src/services/duplicate.service.ts +++ b/server/src/services/duplicate.service.ts @@ -1,4 +1,5 @@ import { Injectable } from '@nestjs/common'; +import type { JobOf } from 'src/types.js'; import { OnJob } from 'src/decorators.js'; import { BulkIdErrorReason, BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto.js'; import { MapAsset, mapAsset } from 'src/dtos/asset-response.dto.js'; @@ -7,7 +8,6 @@ import { DuplicateResolveDto, DuplicateResolveGroupDto, DuplicateResponseDto } f import { AssetStatus, AssetVisibility, JobName, JobStatus, Permission, QueueName } from 'src/enum.js'; import { AssetDuplicateResult } from 'src/repositories/search.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { JobOf } from 'src/types.js'; import { suggestDuplicateKeepAssetIds } from 'src/utils/duplicate.js'; import { batched, isDuplicateDetectionEnabled } from 'src/utils/misc.js'; diff --git a/server/src/services/hls.service.spec.ts b/server/src/services/hls.service.spec.ts index 27cc368fd..f0ac7fcb6 100644 --- a/server/src/services/hls.service.spec.ts +++ b/server/src/services/hls.service.spec.ts @@ -3,7 +3,7 @@ import { HlsVideoResolution, VideoCodec } from 'src/enum.js'; import { HlsService } from 'src/services/hls.service.js'; import { eiffelTower, train, waterfall } from 'test/fixtures/media.stub.js'; import { factory } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; // EXTINF values come from FFmpeg's playlist to enforce an exact match const eiffelExpectedMediaPlaylist = `#EXTM3U diff --git a/server/src/services/hls.service.ts b/server/src/services/hls.service.ts index 21bfc9212..b84d5ec2a 100644 --- a/server/src/services/hls.service.ts +++ b/server/src/services/hls.service.ts @@ -1,15 +1,15 @@ import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; import { constants } from 'node:fs'; import { join } from 'node:path'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { VideoPacketInfo, VideoStreamInfo } from 'src/types.js'; import { HLS_SEGMENT_DURATION, HLS_SEGMENT_FILENAME_REGEX, HLS_VARIANTS, HLS_VERSION } from 'src/constants.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { OnEvent } from 'src/decorators.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { ConfigFFmpegDto } from 'src/dtos/config.dto.js'; import { CacheControl, ImmichWorker, Permission } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { VideoPacketInfo, VideoStreamInfo } from 'src/types.js'; import { PendingEvents } from 'src/utils/event.js'; import { ImmichFileResponse } from 'src/utils/file.js'; import { getCodecString, getOutputSize } from 'src/utils/media.js'; diff --git a/server/src/services/integrity.service.spec.ts b/server/src/services/integrity.service.spec.ts index 2d386a39c..1144b1d0f 100644 --- a/server/src/services/integrity.service.spec.ts +++ b/server/src/services/integrity.service.spec.ts @@ -1,5 +1,5 @@ import { IntegrityService } from 'src/services/integrity.service.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(IntegrityService.name, () => { let sut: IntegrityService; diff --git a/server/src/services/integrity.service.ts b/server/src/services/integrity.service.ts index d1abb9fa9..4ead01aac 100644 --- a/server/src/services/integrity.service.ts +++ b/server/src/services/integrity.service.ts @@ -3,6 +3,16 @@ import { createHash } from 'node:crypto'; import { basename } from 'node:path'; import { Readable, Writable } from 'node:stream'; import { pipeline } from 'node:stream/promises'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { + IIntegrityDeleteReportTypeJob, + IIntegrityDeleteReportsJob, + IIntegrityJob, + IIntegrityMissingFilesJob, + IIntegrityPathWithChecksumJob, + IIntegrityPathWithReportJob, + IIntegrityUntrackedFilesJob, +} from 'src/types.js'; import { JOBS_LIBRARY_PAGINATION_SIZE } from 'src/constants.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { OnEvent, OnJob } from 'src/decorators.js'; @@ -23,17 +33,7 @@ import { StorageFolder, SystemMetadataKey, } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { - IIntegrityDeleteReportsJob, - IIntegrityDeleteReportTypeJob, - IIntegrityJob, - IIntegrityMissingFilesJob, - IIntegrityPathWithChecksumJob, - IIntegrityPathWithReportJob, - IIntegrityUntrackedFilesJob, -} from 'src/types.js'; import { ImmichFileResponse } from 'src/utils/file.js'; import { batched, handlePromiseError } from 'src/utils/misc.js'; diff --git a/server/src/services/job.service.spec.ts b/server/src/services/job.service.spec.ts index 44d418e40..baaf97cac 100644 --- a/server/src/services/job.service.spec.ts +++ b/server/src/services/job.service.spec.ts @@ -1,9 +1,9 @@ +import type { JobItem } from 'src/types.js'; import { AssetType, ImmichWorker, JobName, JobStatus, QueueName } from 'src/enum.js'; import { JobService } from 'src/services/job.service.js'; -import type { JobItem } from 'src/types.js'; import { AssetFactory } from 'test/factories/asset.factory.js'; import { newUuid } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(JobService.name, () => { let sut: JobService; diff --git a/server/src/services/job.service.ts b/server/src/services/job.service.ts index e89f5a721..97f604af0 100644 --- a/server/src/services/job.service.ts +++ b/server/src/services/job.service.ts @@ -1,11 +1,11 @@ import { BadRequestException, Injectable } from '@nestjs/common'; +import type { JobItem } from 'src/types.js'; import { OnEvent } from 'src/decorators.js'; import { mapAsset } from 'src/dtos/asset-response.dto.js'; import { JobCreateDto } from 'src/dtos/job.dto.js'; import { AssetType, AssetVisibility, IntegrityReport, JobName, JobStatus, ManualJobName } from 'src/enum.js'; import { ArgsOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { JobItem } from 'src/types.js'; import { hexOrBufferToBase64 } from 'src/utils/bytes.js'; const asJobItem = (dto: JobCreateDto): JobItem => { diff --git a/server/src/services/library.service.spec.ts b/server/src/services/library.service.spec.ts index 42452c165..83b1a123f 100644 --- a/server/src/services/library.service.spec.ts +++ b/server/src/services/library.service.spec.ts @@ -1,18 +1,18 @@ import { BadRequestException } from '@nestjs/common'; import { Stats } from 'node:fs'; +import { vitest } from 'vitest'; +import type { ILibraryBulkIdsJob, ILibraryFileJob } from 'src/types.js'; import { JOBS_LIBRARY_PAGINATION_SIZE } from 'src/constants.js'; -import { defaults, SystemConfig } from 'src/dtos/config.dto.js'; +import { SystemConfig, defaults } from 'src/dtos/config.dto.js'; import { mapLibrary } from 'src/dtos/library.dto.js'; import { AssetType, CronJob, ImmichWorker, JobName, JobStatus } from 'src/enum.js'; import { LibraryService } from 'src/services/library.service.js'; -import type { ILibraryBulkIdsJob, ILibraryFileJob } from 'src/types.js'; import { AssetFactory } from 'test/factories/asset.factory.js'; import { authStub } from 'test/fixtures/auth.stub.js'; import { systemConfigStub } from 'test/fixtures/system-config.stub.js'; import { makeMockWatcher } from 'test/repositories/storage.repository.mock.js'; import { factory, newDate, newUuid } from 'test/small.factory.js'; -import { makeStream, newTestService, ServiceMocks } from 'test/utils.js'; -import { vitest } from 'vitest'; +import { ServiceMocks, makeStream, newTestService } from 'test/utils.js'; async function* mockWalk() { // eslint-disable-next-line unicorn/no-useless-promise-resolve-reject diff --git a/server/src/services/library.service.ts b/server/src/services/library.service.ts index 2d090f186..87ba09af6 100644 --- a/server/src/services/library.service.ts +++ b/server/src/services/library.service.ts @@ -4,6 +4,8 @@ import { R_OK } from 'node:constants'; import { Stats } from 'node:fs'; import path, { isAbsolute, parse } from 'node:path'; import picomatch from 'picomatch'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { JobOf } from 'src/types.js'; import { JOBS_LIBRARY_PAGINATION_SIZE } from 'src/constants.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { OnEvent, OnJob } from 'src/decorators.js'; @@ -11,11 +13,11 @@ import { CreateLibraryDto, LibraryResponseDto, LibraryStatsResponseDto, - mapLibrary, UpdateLibraryDto, ValidateLibraryDto, ValidateLibraryImportPathResponseDto, ValidateLibraryResponseDto, + mapLibrary, } from 'src/dtos/library.dto.js'; import { AssetStatus, @@ -28,11 +30,9 @@ import { JobStatus, QueueName, } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { AssetSyncResult } from 'src/repositories/library.repository.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; import { BaseService } from 'src/services/base.service.js'; -import type { JobOf } from 'src/types.js'; import { mimeTypes } from 'src/utils/mime-types.js'; import { batched, findOrFail, handlePromiseError } from 'src/utils/misc.js'; diff --git a/server/src/services/maintenance.service.spec.ts b/server/src/services/maintenance.service.spec.ts index d71d2ae98..d00881377 100644 --- a/server/src/services/maintenance.service.spec.ts +++ b/server/src/services/maintenance.service.spec.ts @@ -1,6 +1,6 @@ import { MaintenanceAction, SystemMetadataKey } from 'src/enum.js'; import { MaintenanceService } from 'src/services/maintenance.service.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(MaintenanceService.name, () => { let sut: MaintenanceService; diff --git a/server/src/services/maintenance.service.ts b/server/src/services/maintenance.service.ts index 6c1c5681a..fbdd3d4f6 100644 --- a/server/src/services/maintenance.service.ts +++ b/server/src/services/maintenance.service.ts @@ -1,4 +1,6 @@ import { Injectable } from '@nestjs/common'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { MaintenanceModeState } from 'src/types.js'; import { OnEvent } from 'src/decorators.js'; import { MaintenanceAuthDto, @@ -7,9 +9,7 @@ import { SetMaintenanceModeDto, } from 'src/dtos/maintenance.dto.js'; import { MaintenanceAction, SystemMetadataKey } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { MaintenanceModeState } from 'src/types.js'; import { createMaintenanceLoginUrl, detectPriorInstall, diff --git a/server/src/services/map.service.spec.ts b/server/src/services/map.service.spec.ts index c8f724994..3a80f2613 100644 --- a/server/src/services/map.service.spec.ts +++ b/server/src/services/map.service.spec.ts @@ -5,7 +5,7 @@ import { AuthFactory } from 'test/factories/auth.factory.js'; import { PartnerFactory } from 'test/factories/partner.factory.js'; import { userStub } from 'test/fixtures/user.stub.js'; import { getForPartner } from 'test/mappers.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(MapService.name, () => { let sut: MapService; diff --git a/server/src/services/media.service.spec.ts b/server/src/services/media.service.spec.ts index 0280956fc..c54933130 100644 --- a/server/src/services/media.service.spec.ts +++ b/server/src/services/media.service.spec.ts @@ -1,5 +1,6 @@ import { ShallowDehydrateObject } from 'kysely'; import { OutputInfo } from 'sharp'; +import type { AudioStreamInfo, JobCounts, RawImageInfo, VideoFormat, VideoStreamInfo } from 'src/types.js'; import { Exif } from 'src/database.js'; import { SystemConfig } from 'src/dtos/config.dto.js'; import { AssetEditAction } from 'src/dtos/editing.dto.js'; @@ -21,7 +22,6 @@ import { VideoCodec, } from 'src/enum.js'; import { MediaService } from 'src/services/media.service.js'; -import type { AudioStreamInfo, JobCounts, RawImageInfo, VideoFormat, VideoStreamInfo } from 'src/types.js'; import { AssetFaceFactory } from 'test/factories/asset-face.factory.js'; import { AssetFactory } from 'test/factories/asset.factory.js'; import { PersonFactory } from 'test/factories/person.factory.js'; @@ -30,7 +30,7 @@ import { personThumbnailStub } from 'test/fixtures/person.stub.js'; import { systemConfigStub } from 'test/fixtures/system-config.stub.js'; import { getForGenerateThumbnail } from 'test/mappers.js'; import { factory, newUuid } from 'test/small.factory.js'; -import { makeStream, newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, makeStream, newTestService } from 'test/utils.js'; const fullsizeBuffer = Buffer.from('embedded image data'); const rawBuffer = Buffer.from('raw image data'); diff --git a/server/src/services/media.service.ts b/server/src/services/media.service.ts index f3fc8454d..5ee672666 100644 --- a/server/src/services/media.service.ts +++ b/server/src/services/media.service.ts @@ -1,4 +1,15 @@ import { Injectable } from '@nestjs/common'; +import type { + AudioStreamInfo, + DecodeToBufferOptions, + GenerateThumbnailOptions, + ImageDimensions, + JobItem, + JobOf, + VideoFormat, + VideoInterfaces, + VideoStreamInfo, +} from 'src/types.js'; import { FACE_THUMBNAIL_SIZE } from 'src/constants.js'; import { ImagePathOptions, StorageCore, ThumbnailPathEntity } from 'src/cores/storage.core.js'; import { AssetFile } from 'src/database.js'; @@ -27,17 +38,6 @@ import { import { AssetJobRepository } from 'src/repositories/asset-job.repository.js'; import { BoundingBox } from 'src/repositories/machine-learning.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { - AudioStreamInfo, - DecodeToBufferOptions, - GenerateThumbnailOptions, - ImageDimensions, - JobItem, - JobOf, - VideoFormat, - VideoInterfaces, - VideoStreamInfo, -} from 'src/types.js'; import { getAssetFile, getDimensions } from 'src/utils/asset.util.js'; import { checkFaceVisibility, checkOcrVisibility } from 'src/utils/editor.js'; import { BaseConfig, ThumbnailConfig } from 'src/utils/media.js'; diff --git a/server/src/services/memory.service.spec.ts b/server/src/services/memory.service.spec.ts index 7a63487e0..3ffa0b386 100644 --- a/server/src/services/memory.service.spec.ts +++ b/server/src/services/memory.service.spec.ts @@ -1,11 +1,11 @@ import { BadRequestException } from '@nestjs/common'; -import { MemoryService } from 'src/services/memory.service.js'; import type { OnThisDayData } from 'src/types.js'; +import { MemoryService } from 'src/services/memory.service.js'; import { AssetFactory } from 'test/factories/asset.factory.js'; import { MemoryFactory } from 'test/factories/memory.factory.js'; import { getForMemory } from 'test/mappers.js'; import { factory, newUuid, newUuids } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(MemoryService.name, () => { let sut: MemoryService; diff --git a/server/src/services/metadata.service.spec.ts b/server/src/services/metadata.service.spec.ts index 7963d4d04..f8a280742 100644 --- a/server/src/services/metadata.service.spec.ts +++ b/server/src/services/metadata.service.spec.ts @@ -15,7 +15,7 @@ import { SourceType, } from 'src/enum.js'; import { ImmichTags } from 'src/repositories/metadata.repository.js'; -import { firstDateTime, MetadataService } from 'src/services/metadata.service.js'; +import { MetadataService, firstDateTime } from 'src/services/metadata.service.js'; import { AssetFactory } from 'test/factories/asset.factory.js'; import { PersonGroupFactory } from 'test/factories/person-group.factory.js'; import { PersonFactory } from 'test/factories/person.factory.js'; @@ -23,7 +23,7 @@ import { videoInfoStub } from 'test/fixtures/media.stub.js'; import { tagStub } from 'test/fixtures/tag.stub.js'; import { getForMetadataExtraction, getForSidecarWrite } from 'test/mappers.js'; import { factory } from 'test/small.factory.js'; -import { makeStream, newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, makeStream, newTestService } from 'test/utils.js'; const forSidecarJob = ( asset: { diff --git a/server/src/services/metadata.service.ts b/server/src/services/metadata.service.ts index 6d129c029..b1cd9e736 100644 --- a/server/src/services/metadata.service.ts +++ b/server/src/services/metadata.service.ts @@ -6,6 +6,8 @@ import { DateTime, Duration } from 'luxon'; import { Stats } from 'node:fs'; import { constants } from 'node:fs/promises'; import { join, parse } from 'node:path'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { JobOf } from 'src/types.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { Asset, AssetFile } from 'src/database.js'; import { OnEvent, OnJob } from 'src/decorators.js'; @@ -22,14 +24,12 @@ import { QueueName, SourceType, } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { ReverseGeocodeResult } from 'src/repositories/map.repository.js'; import { ImmichTags } from 'src/repositories/metadata.repository.js'; import { AssetExifTable } from 'src/schema/tables/asset-exif.table.js'; import { AssetFaceTable } from 'src/schema/tables/asset-face.table.js'; import { PersonTable } from 'src/schema/tables/person.table.js'; import { BaseService } from 'src/services/base.service.js'; -import type { JobOf } from 'src/types.js'; import { getAssetFiles } from 'src/utils/asset.util.js'; import { isAssetChecksumConstraint } from 'src/utils/database.js'; import { mergeTimeZone } from 'src/utils/date.js'; diff --git a/server/src/services/notification-admin.service.spec.ts b/server/src/services/notification-admin.service.spec.ts index eb4b0ca20..2ffe700f6 100644 --- a/server/src/services/notification-admin.service.spec.ts +++ b/server/src/services/notification-admin.service.spec.ts @@ -1,8 +1,8 @@ -import { defaults, SystemConfig } from 'src/dtos/config.dto.js'; +import { SystemConfig, defaults } from 'src/dtos/config.dto.js'; import { EmailTemplate } from 'src/repositories/email.repository.js'; import { NotificationService } from 'src/services/notification.service.js'; import { userStub } from 'test/fixtures/user.stub.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; const smtpTransport = Object.freeze({ ...defaults, diff --git a/server/src/services/notification-admin.service.ts b/server/src/services/notification-admin.service.ts index af4596cfd..55ee18abc 100644 --- a/server/src/services/notification-admin.service.ts +++ b/server/src/services/notification-admin.service.ts @@ -1,7 +1,7 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { SystemConfigSmtpDto } from 'src/dtos/config.dto.js'; -import { mapNotification, NotificationCreateDto } from 'src/dtos/notification.dto.js'; +import { NotificationCreateDto, mapNotification } from 'src/dtos/notification.dto.js'; import { NotificationLevel, NotificationType } from 'src/enum.js'; import { EmailTemplate } from 'src/repositories/email.repository.js'; import { BaseService } from 'src/services/base.service.js'; diff --git a/server/src/services/notification.service.spec.ts b/server/src/services/notification.service.spec.ts index d3f945572..03193d1b8 100644 --- a/server/src/services/notification.service.spec.ts +++ b/server/src/services/notification.service.spec.ts @@ -1,4 +1,4 @@ -import { AdminConfigDto, defaults, SystemConfig } from 'src/dtos/config.dto.js'; +import { AdminConfigDto, SystemConfig, defaults } from 'src/dtos/config.dto.js'; import { AssetFileType, JobName, JobStatus, UserMetadataKey } from 'src/enum.js'; import { NotificationService } from 'src/services/notification.service.js'; import { AlbumFactory } from 'test/factories/album.factory.js'; @@ -9,7 +9,7 @@ import { notificationStub } from 'test/fixtures/notification.stub.js'; import { userStub } from 'test/fixtures/user.stub.js'; import { getForAlbum } from 'test/mappers.js'; import { newUuid } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; const configs = { smtpDisabled: Object.freeze({ diff --git a/server/src/services/notification.service.ts b/server/src/services/notification.service.ts index ffd8da64a..6e4e7b0b9 100644 --- a/server/src/services/notification.service.ts +++ b/server/src/services/notification.service.ts @@ -1,16 +1,18 @@ import { BadRequestException, Injectable } from '@nestjs/common'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { EmailImageAttachment, JobOf } from 'src/types.js'; import { OnEvent, OnJob } from 'src/decorators.js'; import { MapAlbumDto } from 'src/dtos/album.dto.js'; import { mapAsset } from 'src/dtos/asset-response.dto.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { SystemConfigSmtpDto } from 'src/dtos/config.dto.js'; import { - mapNotification, NotificationDeleteAllDto, NotificationDto, NotificationSearchDto, NotificationUpdateAllDto, NotificationUpdateDto, + mapNotification, } from 'src/dtos/notification.dto.js'; import { AssetFileType, @@ -22,9 +24,7 @@ import { QueueName, } from 'src/enum.js'; import { EmailTemplate } from 'src/repositories/email.repository.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { EmailImageAttachment, JobOf } from 'src/types.js'; import { getFilenameExtension } from 'src/utils/file.js'; import { getExternalDomain } from 'src/utils/misc.js'; import { isEqualObject } from 'src/utils/object.js'; diff --git a/server/src/services/ocr.service.spec.ts b/server/src/services/ocr.service.spec.ts index 38481148f..9e6ff9a05 100644 --- a/server/src/services/ocr.service.spec.ts +++ b/server/src/services/ocr.service.spec.ts @@ -2,7 +2,7 @@ import { AssetFileType, AssetVisibility, ImmichWorker, JobName, JobStatus } from import { OcrService } from 'src/services/ocr.service.js'; import { AssetFactory } from 'test/factories/asset.factory.js'; import { systemConfigStub } from 'test/fixtures/system-config.stub.js'; -import { makeStream, newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, makeStream, newTestService } from 'test/utils.js'; describe(OcrService.name, () => { let sut: OcrService; diff --git a/server/src/services/ocr.service.ts b/server/src/services/ocr.service.ts index f8f54afc0..c91524e56 100644 --- a/server/src/services/ocr.service.ts +++ b/server/src/services/ocr.service.ts @@ -1,10 +1,10 @@ import { Injectable } from '@nestjs/common'; +import type { JobOf } from 'src/types.js'; import { OnJob } from 'src/decorators.js'; import { AssetVisibility, JobName, JobStatus, QueueName } from 'src/enum.js'; import { OCR } from 'src/repositories/machine-learning.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { JobOf } from 'src/types.js'; import { tokenizeForSearch } from 'src/utils/database.js'; import { batched, isOcrEnabled } from 'src/utils/misc.js'; diff --git a/server/src/services/partner.service.spec.ts b/server/src/services/partner.service.spec.ts index 13682e89d..5cb25fc5b 100644 --- a/server/src/services/partner.service.spec.ts +++ b/server/src/services/partner.service.spec.ts @@ -5,7 +5,7 @@ import { AuthFactory } from 'test/factories/auth.factory.js'; import { PartnerFactory } from 'test/factories/partner.factory.js'; import { UserFactory } from 'test/factories/user.factory.js'; import { getForPartner } from 'test/mappers.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(PartnerService.name, () => { let sut: PartnerService; diff --git a/server/src/services/person.service.spec.ts b/server/src/services/person.service.spec.ts index 8f81a9e6f..09021ff57 100644 --- a/server/src/services/person.service.spec.ts +++ b/server/src/services/person.service.spec.ts @@ -21,7 +21,7 @@ import { getForFacialRecognitionJob, } from 'test/mappers.js'; import { newDate, newUuid } from 'test/small.factory.js'; -import { makeStream, newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, makeStream, newTestService } from 'test/utils.js'; describe(PersonService.name, () => { let sut: PersonService; diff --git a/server/src/services/person.service.ts b/server/src/services/person.service.ts index 7b2bf516f..6e0b61ff9 100644 --- a/server/src/services/person.service.ts +++ b/server/src/services/person.service.ts @@ -1,5 +1,6 @@ import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; import { Insertable, Selectable, Updateable } from 'kysely'; +import type { JobItem, JobOf } from 'src/types.js'; import { Person } from 'src/database.js'; import { Chunked, OnJob } from 'src/decorators.js'; import { BulkIdErrorReason, BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto.js'; @@ -10,8 +11,6 @@ import { AssetFaceResponseDto, AssetFaceUpdateDto, FaceDto, - mapFaces, - mapPerson, MergePersonDto, PeopleResponseDto, PeopleUpdateDto, @@ -20,6 +19,8 @@ import { PersonSearchDto, PersonStatisticsResponseDto, PersonUpdateDto, + mapFaces, + mapPerson, } from 'src/dtos/person.dto.js'; import { AssetVisibility, @@ -40,7 +41,6 @@ import { AssetFaceTable } from 'src/schema/tables/asset-face.table.js'; import { FaceSearchTable } from 'src/schema/tables/face-search.table.js'; import { PersonTable } from 'src/schema/tables/person.table.js'; import { BaseService } from 'src/services/base.service.js'; -import type { JobItem, JobOf } from 'src/types.js'; import { getDimensions } from 'src/utils/asset.util.js'; import { ImmichFileResponse } from 'src/utils/file.js'; import { mimeTypes } from 'src/utils/mime-types.js'; diff --git a/server/src/services/plugin.service.ts b/server/src/services/plugin.service.ts index 78075f2e0..1c654737d 100644 --- a/server/src/services/plugin.service.ts +++ b/server/src/services/plugin.service.ts @@ -1,13 +1,13 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { - mapMethod, - mapPlugin, - mapTemplate, PluginMethodResponseDto, PluginMethodSearchDto, PluginResponseDto, PluginSearchDto, PluginTemplateResponseDto, + mapMethod, + mapPlugin, + mapTemplate, } from 'src/dtos/plugin.dto.js'; import { BaseService } from 'src/services/base.service.js'; import { isMethodCompatible } from 'src/utils/workflow.js'; diff --git a/server/src/services/queue.service.spec.ts b/server/src/services/queue.service.spec.ts index 331c22201..2d7b420cd 100644 --- a/server/src/services/queue.service.spec.ts +++ b/server/src/services/queue.service.spec.ts @@ -1,9 +1,9 @@ import { BadRequestException } from '@nestjs/common'; -import { defaults, SystemConfig } from 'src/dtos/config.dto.js'; +import { SystemConfig, defaults } from 'src/dtos/config.dto.js'; import { ImmichWorker, JobName, QueueCommand, QueueName } from 'src/enum.js'; import { QueueService } from 'src/services/queue.service.js'; import { factory } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(QueueService.name, () => { let sut: QueueService; diff --git a/server/src/services/queue.service.ts b/server/src/services/queue.service.ts index 794cac97c..ce8389532 100644 --- a/server/src/services/queue.service.ts +++ b/server/src/services/queue.service.ts @@ -1,12 +1,14 @@ import { BadRequestException, Injectable } from '@nestjs/common'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { ConcurrentQueueName, JobItem } from 'src/types.js'; import { OnEvent } from 'src/decorators.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { SystemConfig } from 'src/dtos/config.dto.js'; import { - mapQueueLegacy, - mapQueuesLegacy, QueueResponseLegacyDto, QueuesResponseLegacyDto, + mapQueueLegacy, + mapQueuesLegacy, } from 'src/dtos/queue-legacy.dto.js'; import { QueueCommandDto, @@ -26,9 +28,7 @@ import { QueueCommand, QueueName, } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { ConcurrentQueueName, JobItem } from 'src/types.js'; import { handlePromiseError } from 'src/utils/misc.js'; const asNightlyTasksCron = (config: SystemConfig) => { diff --git a/server/src/services/search.service.spec.ts b/server/src/services/search.service.spec.ts index 3fd665046..5fb88f864 100644 --- a/server/src/services/search.service.spec.ts +++ b/server/src/services/search.service.spec.ts @@ -1,4 +1,5 @@ import { BadRequestException, UnauthorizedException } from '@nestjs/common'; +import { beforeEach, vitest } from 'vitest'; import { mapAsset } from 'src/dtos/asset-response.dto.js'; import { SearchSuggestionType } from 'src/dtos/search.dto.js'; import { AssetVisibility } from 'src/enum.js'; @@ -8,8 +9,7 @@ import { AuthFactory } from 'test/factories/auth.factory.js'; import { authStub } from 'test/fixtures/auth.stub.js'; import { getForAsset } from 'test/mappers.js'; import { newUuid } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; -import { beforeEach, vitest } from 'vitest'; +import { ServiceMocks, newTestService } from 'test/utils.js'; vitest.useFakeTimers(); diff --git a/server/src/services/search.service.ts b/server/src/services/search.service.ts index 7f73d0886..6c8f484fe 100644 --- a/server/src/services/search.service.ts +++ b/server/src/services/search.service.ts @@ -3,12 +3,9 @@ import { LRUMap } from 'mnemonist'; import { AssetMapOptions, AssetResponseDto, MapAsset, mapAsset } from 'src/dtos/asset-response.dto.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { SystemConfig } from 'src/dtos/config.dto.js'; -import { mapPerson, PersonResponseDto } from 'src/dtos/person.dto.js'; +import { PersonResponseDto, mapPerson } from 'src/dtos/person.dto.js'; import { - isFullyAlbumConfined, - isNewShapeRequest, LargeAssetSearchDto, - mapPlaces, MetadataSearchDto, PlacesResponseDto, RandomSearchDto, @@ -21,6 +18,9 @@ import { SearchSuggestionType, SmartSearchDto, StatisticsSearchDto, + isFullyAlbumConfined, + isNewShapeRequest, + mapPlaces, } from 'src/dtos/search.dto.js'; import { AssetOrder, AssetVisibility, Permission } from 'src/enum.js'; import { AssetSearchScope } from 'src/repositories/search.repository.js'; diff --git a/server/src/services/server.service.spec.ts b/server/src/services/server.service.spec.ts index cecac3718..00a6653dd 100644 --- a/server/src/services/server.service.spec.ts +++ b/server/src/services/server.service.spec.ts @@ -1,7 +1,7 @@ import { SystemMetadataKey } from 'src/enum.js'; import { ServerService } from 'src/services/server.service.js'; import { mockEnvData } from 'test/repositories/config.repository.mock.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(ServerService.name, () => { let sut: ServerService; diff --git a/server/src/services/session.service.spec.ts b/server/src/services/session.service.spec.ts index 22ec53cba..5730621ff 100644 --- a/server/src/services/session.service.spec.ts +++ b/server/src/services/session.service.spec.ts @@ -3,7 +3,7 @@ import { SessionService } from 'src/services/session.service.js'; import { AuthFactory } from 'test/factories/auth.factory.js'; import { SessionFactory } from 'test/factories/session.factory.js'; import { authStub } from 'test/fixtures/auth.stub.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe('SessionService', () => { let sut: SessionService; diff --git a/server/src/services/session.service.ts b/server/src/services/session.service.ts index e1ebec9d8..c1a6642fa 100644 --- a/server/src/services/session.service.ts +++ b/server/src/services/session.service.ts @@ -1,5 +1,6 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { DateTime } from 'luxon'; +import type { ArgOf } from 'src/repositories/event.repository.js'; import { OnEvent, OnJob } from 'src/decorators.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { @@ -10,7 +11,6 @@ import { mapSession, } from 'src/dtos/session.dto.js'; import { JobName, JobStatus, Permission, QueueName } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; @Injectable() diff --git a/server/src/services/shared-link.service.spec.ts b/server/src/services/shared-link.service.spec.ts index 33e587993..c32a2294e 100644 --- a/server/src/services/shared-link.service.spec.ts +++ b/server/src/services/shared-link.service.spec.ts @@ -10,7 +10,7 @@ import { authStub } from 'test/fixtures/auth.stub.js'; import { sharedLinkStub } from 'test/fixtures/shared-link.stub.js'; import { getForSharedLink } from 'test/mappers.js'; import { factory } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(SharedLinkService.name, () => { let sut: SharedLinkService; diff --git a/server/src/services/shared-link.service.ts b/server/src/services/shared-link.service.ts index 599cf34f3..8a5206093 100644 --- a/server/src/services/shared-link.service.ts +++ b/server/src/services/shared-link.service.ts @@ -4,16 +4,16 @@ import { AssetIdErrorReason, AssetIdsResponseDto } from 'src/dtos/asset-ids.resp import { AssetIdsDto } from 'src/dtos/asset.dto.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { - mapSharedLink, SharedLinkCreateDto, SharedLinkEditDto, SharedLinkLoginDto, SharedLinkResponseDto, SharedLinkSearchDto, + mapSharedLink, } from 'src/dtos/shared-link.dto.js'; import { Permission, SharedLinkType } from 'src/enum.js'; import { BaseService } from 'src/services/base.service.js'; -import { findOrFail, getExternalDomain, OpenGraphTags } from 'src/utils/misc.js'; +import { OpenGraphTags, findOrFail, getExternalDomain } from 'src/utils/misc.js'; @Injectable() export class SharedLinkService extends BaseService { diff --git a/server/src/services/smart-info.service.spec.ts b/server/src/services/smart-info.service.spec.ts index c97d0c1da..f7a12598e 100644 --- a/server/src/services/smart-info.service.spec.ts +++ b/server/src/services/smart-info.service.spec.ts @@ -4,7 +4,7 @@ import { SmartInfoService } from 'src/services/smart-info.service.js'; import { getCLIPModelInfo } from 'src/utils/misc.js'; import { AssetFactory } from 'test/factories/asset.factory.js'; import { systemConfigStub } from 'test/fixtures/system-config.stub.js'; -import { makeStream, newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, makeStream, newTestService } from 'test/utils.js'; describe(SmartInfoService.name, () => { let sut: SmartInfoService; diff --git a/server/src/services/smart-info.service.ts b/server/src/services/smart-info.service.ts index 50914faa0..7c5641288 100644 --- a/server/src/services/smart-info.service.ts +++ b/server/src/services/smart-info.service.ts @@ -1,11 +1,11 @@ import { Injectable } from '@nestjs/common'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { JobOf } from 'src/types.js'; +import { OnEvent, OnJob } from 'src/decorators.js'; import { SystemConfig } from 'src/dtos/config.dto.js'; -import { OnEvent, OnJob } from 'src/decorators.js'; import { AssetVisibility, DatabaseLock, ImmichWorker, JobName, JobStatus, QueueName } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { JobOf } from 'src/types.js'; import { batched, getCLIPModelInfo, isSmartSearchEnabled } from 'src/utils/misc.js'; @Injectable() diff --git a/server/src/services/stack.service.spec.ts b/server/src/services/stack.service.spec.ts index b9b4beefe..d76e0df7f 100644 --- a/server/src/services/stack.service.spec.ts +++ b/server/src/services/stack.service.spec.ts @@ -6,7 +6,7 @@ import { StackFactory } from 'test/factories/stack.factory.js'; import { authStub } from 'test/fixtures/auth.stub.js'; import { getForStack } from 'test/mappers.js'; import { newUuid } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(StackService.name, () => { let sut: StackService; diff --git a/server/src/services/storage-template.service.spec.ts b/server/src/services/storage-template.service.spec.ts index 752815c02..072a18c88 100644 --- a/server/src/services/storage-template.service.spec.ts +++ b/server/src/services/storage-template.service.spec.ts @@ -1,5 +1,5 @@ import { Stats } from 'node:fs'; -import { defaults, SystemConfig } from 'src/dtos/config.dto.js'; +import { SystemConfig, defaults } from 'src/dtos/config.dto.js'; import { AssetPathType, AssetType, JobStatus } from 'src/enum.js'; import { StorageTemplateService } from 'src/services/storage-template.service.js'; import { AlbumFactory } from 'test/factories/album.factory.js'; @@ -7,7 +7,7 @@ import { AssetFactory } from 'test/factories/asset.factory.js'; import { UserFactory } from 'test/factories/user.factory.js'; import { userStub } from 'test/fixtures/user.stub.js'; import { getForAlbum, getForStorageTemplate } from 'test/mappers.js'; -import { makeStream, newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, makeStream, newTestService } from 'test/utils.js'; const motionAsset = AssetFactory.from({ type: AssetType.Video }).exif().build(); const stillAsset = AssetFactory.from({ livePhotoVideoId: motionAsset.id }).exif().build(); diff --git a/server/src/services/storage-template.service.ts b/server/src/services/storage-template.service.ts index 8cd5515a9..aa72f1347 100644 --- a/server/src/services/storage-template.service.ts +++ b/server/src/services/storage-template.service.ts @@ -3,6 +3,8 @@ import handlebar from 'handlebars'; import { DateTime } from 'luxon'; import path from 'node:path'; import sanitize from 'sanitize-filename'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { JobOf, StorageAsset } from 'src/types.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { OnEvent, OnJob } from 'src/decorators.js'; import { ConfigTemplateStorageOptionDto } from 'src/dtos/config.dto.js'; @@ -16,9 +18,7 @@ import { QueueName, StorageFolder, } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { JobOf, StorageAsset } from 'src/types.js'; import { getAssetFile } from 'src/utils/asset.util.js'; import { getFilenameExtension, getLivePhotoMotionFilename } from 'src/utils/file.js'; diff --git a/server/src/services/storage.service.spec.ts b/server/src/services/storage.service.spec.ts index 0ccc02e08..21a0b92e8 100644 --- a/server/src/services/storage.service.spec.ts +++ b/server/src/services/storage.service.spec.ts @@ -2,7 +2,7 @@ import { SystemMetadataKey } from 'src/enum.js'; import { StorageService } from 'src/services/storage.service.js'; import { ImmichStartupError } from 'src/utils/misc.js'; import { mockEnvData } from 'test/repositories/config.repository.mock.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(StorageService.name, () => { let sut: StorageService; diff --git a/server/src/services/storage.service.ts b/server/src/services/storage.service.ts index 58bc6fe9b..cb189a59d 100644 --- a/server/src/services/storage.service.ts +++ b/server/src/services/storage.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@nestjs/common'; import { join } from 'node:path'; +import type { JobOf, SystemFlags } from 'src/types.js'; import { ErrorMessages } from 'src/constants.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { OnEvent, OnJob } from 'src/decorators.js'; @@ -13,7 +14,6 @@ import { SystemMetadataKey, } from 'src/enum.js'; import { BaseService } from 'src/services/base.service.js'; -import type { JobOf, SystemFlags } from 'src/types.js'; import { ImmichStartupError } from 'src/utils/misc.js'; const docsMessage = `Please see https://docs.immich.app/administration/system-integrity#folder-checks for more information.`; diff --git a/server/src/services/sync.service.ts b/server/src/services/sync.service.ts index 28a50350e..d72d79b7d 100644 --- a/server/src/services/sync.service.ts +++ b/server/src/services/sync.service.ts @@ -2,24 +2,24 @@ import { BadRequestException, ForbiddenException, Injectable } from '@nestjs/com import { Insertable } from 'kysely'; import { DateTime, Duration } from 'luxon'; import { Writable } from 'node:stream'; +import type { SyncAck } from 'src/types.js'; import { OnJob } from 'src/decorators.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { SyncAckDeleteDto, SyncAckSetDto, - syncAlbumV2ToV1, SyncAssetV2, SyncItem, SyncStreamDto, + syncAlbumV2ToV1, } from 'src/dtos/sync.dto.js'; import { JobName, QueueName, SyncEntityType, SyncRequestType } from 'src/enum.js'; import { SyncQueryOptions } from 'src/repositories/sync.repository.js'; import { SessionSyncCheckpointTable } from 'src/schema/tables/sync-checkpoint.table.js'; import { BaseService } from 'src/services/base.service.js'; -import type { SyncAck } from 'src/types.js'; import { hexOrBufferToBase64 } from 'src/utils/bytes.js'; import { ClientDisconnectedError, waitForDrain } from 'src/utils/response.js'; -import { fromAck, serialize, SerializeOptions, toAck } from 'src/utils/sync.js'; +import { SerializeOptions, fromAck, serialize, toAck } from 'src/utils/sync.js'; type CheckpointMap = Partial>; type AssetLike = Omit & { diff --git a/server/src/services/system-config.service.spec.ts b/server/src/services/system-config.service.spec.ts index 9bd1c676a..6735f8215 100644 --- a/server/src/services/system-config.service.spec.ts +++ b/server/src/services/system-config.service.spec.ts @@ -1,9 +1,10 @@ import { BadRequestException } from '@nestjs/common'; -import { defaults, SystemConfig } from 'src/dtos/config.dto.js'; +import type { DeepPartial } from 'src/types.js'; +import { SystemConfig, defaults } from 'src/dtos/config.dto.js'; import { AudioCodec, - Colorspace, CQMode, + Colorspace, HlsVideoResolution, ImageFormat, LogLevel, @@ -17,9 +18,8 @@ import { VideoContainer, } from 'src/enum.js'; import { SystemConfigService } from 'src/services/system-config.service.js'; -import type { DeepPartial } from 'src/types.js'; import { mockEnvData } from 'test/repositories/config.repository.mock.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; const partialConfig = { ffmpeg: { crf: 30 }, diff --git a/server/src/services/system-config.service.ts b/server/src/services/system-config.service.ts index fbc2bea12..08f94086e 100644 --- a/server/src/services/system-config.service.ts +++ b/server/src/services/system-config.service.ts @@ -1,17 +1,17 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { isEqual } from 'lodash-es'; +import type { ArgOf } from 'src/repositories/event.repository.js'; import { OnEvent } from 'src/decorators.js'; import { AdminConfigDto, + PublicConfigDto, + UserConfigDto, defaults, mapAdminConfig, mapPublicConfig, mapUserConfig, - PublicConfigDto, - UserConfigDto, } from 'src/dtos/config.dto.js'; import { BootstrapEventPriority } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; import { clearConfigCache } from 'src/utils/config.js'; import { toPlainObject } from 'src/utils/object.js'; diff --git a/server/src/services/system-metadata.service.spec.ts b/server/src/services/system-metadata.service.spec.ts index 60deba198..e38fb7aad 100644 --- a/server/src/services/system-metadata.service.spec.ts +++ b/server/src/services/system-metadata.service.spec.ts @@ -1,6 +1,6 @@ import { SystemMetadataKey } from 'src/enum.js'; import { SystemMetadataService } from 'src/services/system-metadata.service.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(SystemMetadataService.name, () => { let sut: SystemMetadataService; diff --git a/server/src/services/tag.service.spec.ts b/server/src/services/tag.service.spec.ts index 82b50fdfc..f6fcf4b16 100644 --- a/server/src/services/tag.service.spec.ts +++ b/server/src/services/tag.service.spec.ts @@ -4,7 +4,7 @@ import { JobStatus } from 'src/enum.js'; import { TagService } from 'src/services/tag.service.js'; import { authStub } from 'test/fixtures/auth.stub.js'; import { tagResponseStub, tagStub } from 'test/fixtures/tag.stub.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(TagService.name, () => { let sut: TagService; diff --git a/server/src/services/telemetry.service.ts b/server/src/services/telemetry.service.ts index 2339c05a0..666cb5215 100644 --- a/server/src/services/telemetry.service.ts +++ b/server/src/services/telemetry.service.ts @@ -1,7 +1,7 @@ import { snakeCase } from 'lodash-es'; +import type { ArgOf, ArgsOf } from 'src/repositories/event.repository.js'; import { OnEvent } from 'src/decorators.js'; import { ImmichWorker, JobStatus } from 'src/enum.js'; -import type { ArgOf, ArgsOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; export class TelemetryService extends BaseService { diff --git a/server/src/services/timeline.service.spec.ts b/server/src/services/timeline.service.spec.ts index c668b9baf..47080e8a2 100644 --- a/server/src/services/timeline.service.spec.ts +++ b/server/src/services/timeline.service.spec.ts @@ -2,7 +2,7 @@ import { BadRequestException } from '@nestjs/common'; import { AssetVisibility } from 'src/enum.js'; import { TimelineService } from 'src/services/timeline.service.js'; import { authStub } from 'test/fixtures/auth.stub.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(TimelineService.name, () => { let sut: TimelineService; diff --git a/server/src/services/transcoding.service.spec.ts b/server/src/services/transcoding.service.spec.ts index 58649aa3a..c4dd79d14 100644 --- a/server/src/services/transcoding.service.spec.ts +++ b/server/src/services/transcoding.service.spec.ts @@ -1,3 +1,4 @@ +import { vi } from 'vitest'; import { HLS_BACKPRESSURE_PAUSE_SEGMENTS, HLS_BACKPRESSURE_RESUME_SEGMENTS, @@ -8,8 +9,7 @@ import { import { TranscodingService } from 'src/services/transcoding.service.js'; import { VIDEO_STREAM_SESSION_PK_CONSTRAINT } from 'src/utils/database.js'; import { eiffelTower, train, waterfall } from 'test/fixtures/media.stub.js'; -import { mockSpawn, newTestService, ServiceMocks } from 'test/utils.js'; -import { vi } from 'vitest'; +import { ServiceMocks, mockSpawn, newTestService } from 'test/utils.js'; describe(TranscodingService.name, () => { let sut: TranscodingService; diff --git a/server/src/services/transcoding.service.ts b/server/src/services/transcoding.service.ts index a4235fb61..07a86e9c2 100644 --- a/server/src/services/transcoding.service.ts +++ b/server/src/services/transcoding.service.ts @@ -1,6 +1,8 @@ import { Injectable } from '@nestjs/common'; import { ChildProcess } from 'node:child_process'; import { join } from 'node:path'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { VideoInterfaces } from 'src/types.js'; import { HLS_BACKPRESSURE_PAUSE_SEGMENTS, HLS_BACKPRESSURE_RESUME_SEGMENTS, @@ -15,9 +17,7 @@ import { import { StorageCore } from 'src/cores/storage.core.js'; import { OnEvent, OnJob } from 'src/decorators.js'; import { DatabaseLock, ImmichWorker, JobName, QueueName, TranscodeTarget } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { VideoInterfaces } from 'src/types.js'; import { isVideoStreamSessionPkConstraint } from 'src/utils/database.js'; import { BaseConfig } from 'src/utils/media.js'; diff --git a/server/src/services/trash.service.spec.ts b/server/src/services/trash.service.spec.ts index 3da7cd6ec..8f942f8ef 100644 --- a/server/src/services/trash.service.spec.ts +++ b/server/src/services/trash.service.spec.ts @@ -2,7 +2,7 @@ import { BadRequestException } from '@nestjs/common'; import { JobName, JobStatus } from 'src/enum.js'; import { TrashService } from 'src/services/trash.service.js'; import { authStub } from 'test/fixtures/auth.stub.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; async function* makeAssetIdStream(count: number): AsyncIterableIterator<{ id: string }> { for (let i = 0; i < count; i++) { diff --git a/server/src/services/user-admin.service.spec.ts b/server/src/services/user-admin.service.spec.ts index d4ae774a6..87bae7f95 100644 --- a/server/src/services/user-admin.service.spec.ts +++ b/server/src/services/user-admin.service.spec.ts @@ -1,4 +1,5 @@ import { BadRequestException, ForbiddenException } from '@nestjs/common'; +import { describe } from 'vitest'; import { mapUserAdmin } from 'src/dtos/user.dto.js'; import { JobName, UserStatus } from 'src/enum.js'; import { UserAdminService } from 'src/services/user-admin.service.js'; @@ -6,8 +7,7 @@ import { AuthFactory } from 'test/factories/auth.factory.js'; import { UserFactory } from 'test/factories/user.factory.js'; import { authStub } from 'test/fixtures/auth.stub.js'; import { userStub } from 'test/fixtures/user.stub.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; -import { describe } from 'vitest'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(UserAdminService.name, () => { let sut: UserAdminService; diff --git a/server/src/services/user.service.spec.ts b/server/src/services/user.service.spec.ts index d50574d21..4e56ddc12 100644 --- a/server/src/services/user.service.spec.ts +++ b/server/src/services/user.service.spec.ts @@ -8,7 +8,7 @@ import { UserFactory } from 'test/factories/user.factory.js'; import { authStub } from 'test/fixtures/auth.stub.js'; import { systemConfigStub } from 'test/fixtures/system-config.stub.js'; import { userStub } from 'test/fixtures/user.stub.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; const makeDeletedAt = (daysAgo: number) => { const deletedAt = new Date(); diff --git a/server/src/services/user.service.ts b/server/src/services/user.service.ts index 510c3cdc2..29116e8b1 100644 --- a/server/src/services/user.service.ts +++ b/server/src/services/user.service.ts @@ -1,6 +1,8 @@ import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; import { Updateable } from 'kysely'; import { DateTime } from 'luxon'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { JobOf, UserMetadataItem } from 'src/types.js'; import { SALT_ROUNDS } from 'src/constants.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { OnEvent, OnJob } from 'src/decorators.js'; @@ -12,12 +14,10 @@ import { UserPreferencesResponseDto, UserPreferencesUpdateDto, mapPreferences } import { CreateProfileImageResponseDto } from 'src/dtos/user-profile.dto.js'; import { UserAdminResponseDto, UserResponseDto, UserUpdateMeDto, mapUser, mapUserAdmin } from 'src/dtos/user.dto.js'; import { CacheControl, JobName, JobStatus, QueueName, StorageFolder, UserMetadataKey } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { UserFindOptions } from 'src/repositories/user.repository.js'; import { UserTable } from 'src/schema/tables/user.table.js'; import { BaseService } from 'src/services/base.service.js'; import { getCalendarHeatmap } from 'src/services/shared/user-methods.js'; -import type { JobOf, UserMetadataItem } from 'src/types.js'; import { ImmichFileResponse } from 'src/utils/file.js'; import { mimeTypes } from 'src/utils/mime-types.js'; import { findOrFail } from 'src/utils/misc.js'; diff --git a/server/src/services/version.service.spec.ts b/server/src/services/version.service.spec.ts index 8435d1097..00aadf2e2 100644 --- a/server/src/services/version.service.spec.ts +++ b/server/src/services/version.service.spec.ts @@ -3,7 +3,7 @@ import { defaults } from 'src/dtos/config.dto.js'; import { CronJob, JobName, JobStatus, ReleaseChannel, SystemMetadataKey } from 'src/enum.js'; import { VersionService } from 'src/services/version.service.js'; import { factory } from 'test/small.factory.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; const mockVersionResponse = (version: string) => ({ version, diff --git a/server/src/services/version.service.ts b/server/src/services/version.service.ts index bf3deac84..a0d0974a6 100644 --- a/server/src/services/version.service.ts +++ b/server/src/services/version.service.ts @@ -1,6 +1,8 @@ import { Injectable } from '@nestjs/common'; import { DateTime } from 'luxon'; -import semver, { SemVer } from 'semver'; +import { SemVer, diff, intersects, lt } from 'semver'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { VersionCheckMetadata } from 'src/types.js'; import { serverVersion } from 'src/constants.js'; import { OnEvent, OnJob } from 'src/decorators.js'; import { ReleaseEventV1, ReleaseType, ServerVersionResponseDto } from 'src/dtos/server.dto.js'; @@ -14,9 +16,7 @@ import { ReleaseChannel, SystemMetadataKey, } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { BaseService } from 'src/services/base.service.js'; -import type { VersionCheckMetadata } from 'src/types.js'; import { handlePromiseError } from 'src/utils/misc.js'; const asNotification = ( @@ -25,13 +25,13 @@ const asNotification = ( ): ReleaseEventV1 => { return { // can't use gt because it's broken for release candidates F https://github.com/npm/node-semver/issues/483 - isAvailable: semver.intersects(`>${serverVersion}`, releaseVersion, { + isAvailable: intersects(`>${serverVersion}`, releaseVersion, { includePrerelease: channel === ReleaseChannel.ReleaseCandidate, }), checkedAt, serverVersion: ServerVersionResponseDto.fromSemVer(serverVersion), releaseVersion: ServerVersionResponseDto.fromSemVer(new SemVer(releaseVersion)), - type: semver.diff(serverVersion, releaseVersion) as ReleaseType, + type: diff(serverVersion, releaseVersion) as ReleaseType, }; }; @@ -68,7 +68,7 @@ export class VersionService extends BaseService { this.logger.log(`Adding ${current} to upgrade history`); await this.versionRepository.create({ version: current }); - const isNeedsNewMemories = semver.lt(previousVersion, '1.129.0'); + const isNeedsNewMemories = lt(previousVersion, '1.129.0'); if (isNeedsNewMemories) { await this.jobRepository.queue({ name: JobName.MemoryGenerate }); } @@ -127,7 +127,7 @@ export class VersionService extends BaseService { // can't use gt because it's broken for release candidates F https://github.com/npm/node-semver/issues/483 if ( - semver.intersects(`>${serverVersion}`, releaseVersion, { + intersects(`>${serverVersion}`, releaseVersion, { includePrerelease: newVersionCheck.channel === ReleaseChannel.ReleaseCandidate, }) ) { diff --git a/server/src/services/view.service.spec.ts b/server/src/services/view.service.spec.ts index 6c707cf87..05a60e6b1 100644 --- a/server/src/services/view.service.spec.ts +++ b/server/src/services/view.service.spec.ts @@ -3,7 +3,7 @@ import { ViewService } from 'src/services/view.service.js'; import { AssetFactory } from 'test/factories/asset.factory.js'; import { authStub } from 'test/fixtures/auth.stub.js'; import { getForAsset } from 'test/mappers.js'; -import { newTestService, ServiceMocks } from 'test/utils.js'; +import { ServiceMocks, newTestService } from 'test/utils.js'; describe(ViewService.name, () => { let sut: ViewService; diff --git a/server/src/services/workflow-execution.service.ts b/server/src/services/workflow-execution.service.ts index 93fac06d4..31e0688bc 100644 --- a/server/src/services/workflow-execution.service.ts +++ b/server/src/services/workflow-execution.service.ts @@ -8,6 +8,8 @@ import { } from '@immich/plugin-sdk'; import { HttpException, UnauthorizedException } from '@nestjs/common'; import { join } from 'node:path'; +import type { ArgOf } from 'src/repositories/event.repository.js'; +import type { JobOf } from 'src/types.js'; import { DummyValue, OnEvent, OnJob } from 'src/decorators.js'; import { AlbumsAddAssetsDto, CreateAlbumDto, GetAlbumsDto } from 'src/dtos/album.dto.js'; import { BulkIdsDto } from 'src/dtos/asset-ids.response.dto.js'; @@ -25,12 +27,10 @@ import { WorkflowResult, WorkflowType, } from 'src/enum.js'; -import type { ArgOf } from 'src/repositories/event.repository.js'; import { AlbumService } from 'src/services/album.service.js'; import { AssetService } from 'src/services/asset.service.js'; import { BaseService } from 'src/services/base.service.js'; import { TagService } from 'src/services/tag.service.js'; -import type { JobOf } from 'src/types.js'; const dummy = () => { throw new Error( diff --git a/server/src/services/workflow.service.ts b/server/src/services/workflow.service.ts index d79dd5537..81a3eccc3 100644 --- a/server/src/services/workflow.service.ts +++ b/server/src/services/workflow.service.ts @@ -2,8 +2,6 @@ import { WorkflowStepConfig, WorkflowTrigger } from '@immich/plugin-sdk'; import { BadRequestException, Injectable } from '@nestjs/common'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { - mapWorkflow, - mapWorkflowShare, WorkflowCreateDto, WorkflowGetLogsDto, WorkflowLogEntryDto, @@ -12,6 +10,8 @@ import { WorkflowShareResponseDto, WorkflowTriggerResponseDto, WorkflowUpdateDto, + mapWorkflow, + mapWorkflowShare, } from 'src/dtos/workflow.dto.js'; import { Permission } from 'src/enum.js'; import { PluginMethodSearchResponse } from 'src/repositories/plugin.repository.js'; diff --git a/server/src/types.ts b/server/src/types.ts index 4cf7d4066..de98e2317 100644 --- a/server/src/types.ts +++ b/server/src/types.ts @@ -1,4 +1,5 @@ import { ShallowDehydrateObject } from 'kysely'; +import { Mocked } from 'vitest'; import { VECTOR_EXTENSIONS } from 'src/constants.js'; import { AssetFile } from 'src/database.js'; import { UploadFieldName } from 'src/dtos/asset-media.dto.js'; @@ -30,7 +31,6 @@ import { TranscodeTarget, UserMetadataKey, } from 'src/enum.js'; -import { Mocked } from 'vitest'; export type DeepPartial = T extends Date ? T diff --git a/server/src/utils/asset.util.ts b/server/src/utils/asset.util.ts index 34d3e37f6..745f1e849 100644 --- a/server/src/utils/asset.util.ts +++ b/server/src/utils/asset.util.ts @@ -1,4 +1,5 @@ import { BadRequestException } from '@nestjs/common'; +import type { IBulkAsset, ImmichFile, UploadFile, UploadRequest } from 'src/types.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { AssetFile } from 'src/database.js'; import { BulkIdErrorReason, BulkIdResponseDto } from 'src/dtos/asset-ids.response.dto.js'; @@ -10,7 +11,6 @@ import { AccessRepository } from 'src/repositories/access.repository.js'; import { AssetRepository } from 'src/repositories/asset.repository.js'; import { EventRepository } from 'src/repositories/event.repository.js'; import { PartnerRepository } from 'src/repositories/partner.repository.js'; -import type { IBulkAsset, ImmichFile, UploadFile, UploadRequest } from 'src/types.js'; import { checkAccess } from 'src/utils/access.js'; export const getAssetFile = (files: AssetFile[], type: AssetFileType, { isEdited }: { isEdited: boolean }) => { diff --git a/server/src/utils/config.ts b/server/src/utils/config.ts index e90f6cbc6..919b24f67 100644 --- a/server/src/utils/config.ts +++ b/server/src/utils/config.ts @@ -1,12 +1,12 @@ import AsyncLock from 'async-lock'; import { load as loadYaml } from 'js-yaml'; import { cloneDeep, get, isEmpty, isEqual, set } from 'lodash-es'; +import type { DeepPartial } from 'src/types.js'; import { AdminConfigDto, SystemConfig, defaults } from 'src/dtos/config.dto.js'; import { DatabaseLock, SystemMetadataKey } from 'src/enum.js'; import { ConfigRepository } from 'src/repositories/config.repository.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository.js'; -import type { DeepPartial } from 'src/types.js'; import { getKeysDeep, unsetDeep } from 'src/utils/misc.js'; type RepoDeps = { diff --git a/server/src/utils/database.ts b/server/src/utils/database.ts index fc8e04fb3..e760e7714 100644 --- a/server/src/utils/database.ts +++ b/server/src/utils/database.ts @@ -1,4 +1,4 @@ -import { createPostgres, DatabaseConnectionParams } from '@immich/sql-tools'; +import { DatabaseConnectionParams, createPostgres } from '@immich/sql-tools'; import { AliasedRawBuilder, DeduplicateJoinsPlugin, @@ -9,26 +9,27 @@ import { NotNull, OperandValueExpression, ReferenceExpression, - Selectable, SelectQueryBuilder, + Selectable, ShallowDehydrateObject, - sql, SqlBool, + sql, } from 'kysely'; -import { PostgresJSDialect } from 'kysely-postgres-js'; import { jsonArrayFrom, jsonObjectFrom } from 'kysely/helpers/postgres'; +import { PostgresJSDialect } from 'kysely-postgres-js'; import { Notice, PostgresError } from 'postgres'; -import { columns, lockableProperties, LockableProperty, Person } from 'src/database.js'; +import type { AudioStreamInfo, VectorExtension, VideoFormat, VideoPacketInfo, VideoStreamInfo } from 'src/types.js'; +import { LockableProperty, Person, columns, lockableProperties } from 'src/database.js'; import { DummyValue, GenerateSqlQueries } from 'src/decorators.js'; import { AssetEditActionItem } from 'src/dtos/editing.dto.js'; import { DEFAULT_SEARCH_ORDER, IdsFilter, - isAlbumConfined, SearchFilterBranch, SearchOrder, StringFilter, StringPatternFilter, + isAlbumConfined, } from 'src/dtos/search.dto.js'; import { AssetFileType, @@ -46,7 +47,6 @@ import { } from 'src/repositories/search.repository.js'; import { DB } from 'src/schema/index.js'; import { AssetExifTable } from 'src/schema/tables/asset-exif.table.js'; -import type { AudioStreamInfo, VectorExtension, VideoFormat, VideoPacketInfo, VideoStreamInfo } from 'src/types.js'; import { fromChecksum } from 'src/utils/request.js'; export const getKyselyConfig = (connection: DatabaseConnectionParams): KyselyConfig => { diff --git a/server/src/utils/date.spec.ts b/server/src/utils/date.spec.ts index e04d90100..0abdee763 100644 --- a/server/src/utils/date.spec.ts +++ b/server/src/utils/date.spec.ts @@ -1,5 +1,5 @@ -import { asDateString, asDateTimeString } from 'src/utils/date.js'; import { describe, expect, it } from 'vitest'; +import { asDateString, asDateTimeString } from 'src/utils/date.js'; describe('asDateString', () => { it('should return null for null input', () => { diff --git a/server/src/utils/duplicate.spec.ts b/server/src/utils/duplicate.spec.ts index c7245cd32..11f46e773 100644 --- a/server/src/utils/duplicate.spec.ts +++ b/server/src/utils/duplicate.spec.ts @@ -1,9 +1,9 @@ +import { describe, expect, it } from 'vitest'; +import type { z } from 'zod'; import { AssetResponseDto } from 'src/dtos/asset-response.dto.js'; import { ExifResponseSchema } from 'src/dtos/exif.dto.js'; import { AssetType, AssetVisibility } from 'src/enum.js'; import { getExifCount, suggestDuplicate, suggestDuplicateKeepAssetIds } from 'src/utils/duplicate.js'; -import { describe, expect, it } from 'vitest'; -import type { z } from 'zod'; type ExifInfoInput = Partial>; diff --git a/server/src/utils/editor.spec.ts b/server/src/utils/editor.spec.ts index 99bb6b925..2f1081d8b 100644 --- a/server/src/utils/editor.spec.ts +++ b/server/src/utils/editor.spec.ts @@ -1,8 +1,8 @@ +import { describe, expect, it } from 'vitest'; import { AssetFace } from 'src/database.js'; import { AssetOcrResponseDto } from 'src/dtos/ocr.dto.js'; import { SourceType } from 'src/enum.js'; import { boundingBoxOverlap, checkFaceVisibility, checkOcrVisibility } from 'src/utils/editor.js'; -import { describe, expect, it } from 'vitest'; describe('boundingBoxOverlap', () => { it('should return 1 for identical boxes', () => { diff --git a/server/src/utils/editor.ts b/server/src/utils/editor.ts index 7c6e02aad..e4d2cedc8 100644 --- a/server/src/utils/editor.ts +++ b/server/src/utils/editor.ts @@ -1,6 +1,6 @@ +import type { ImageDimensions } from 'src/types.js'; import { AssetFace } from 'src/database.js'; import { AssetOcrResponseDto } from 'src/dtos/ocr.dto.js'; -import type { ImageDimensions } from 'src/types.js'; type BoundingBox = { x1: number; diff --git a/server/src/utils/media.ts b/server/src/utils/media.ts index 945087dd2..77c9d1157 100644 --- a/server/src/utils/media.ts +++ b/server/src/utils/media.ts @@ -1,22 +1,3 @@ -import { - AUDIO_ENCODER, - AV1_LEVELS, - CodecLevel, - H264_LEVELS, - HEVC_LEVELS, - SUPPORTED_HWA_CODECS, -} from 'src/constants.js'; -import { ConfigFFmpegDto } from 'src/dtos/config.dto.js'; -import { - ColorMatrix, - ColorPrimaries, - ColorTransfer, - CQMode, - ToneMapping, - TranscodeHardwareAcceleration, - TranscodeTarget, - VideoCodec, -} from 'src/enum.js'; import type { AudioStreamInfo, BitrateDistribution, @@ -28,6 +9,25 @@ import type { VideoStreamInfo, VideoTuning, } from 'src/types.js'; +import { + AUDIO_ENCODER, + AV1_LEVELS, + CodecLevel, + H264_LEVELS, + HEVC_LEVELS, + SUPPORTED_HWA_CODECS, +} from 'src/constants.js'; +import { ConfigFFmpegDto } from 'src/dtos/config.dto.js'; +import { + CQMode, + ColorMatrix, + ColorPrimaries, + ColorTransfer, + ToneMapping, + TranscodeHardwareAcceleration, + TranscodeTarget, + VideoCodec, +} from 'src/enum.js'; export const isVideoRotated = (videoStream: VideoStreamInfo): boolean => Math.abs(videoStream.rotation) === 90; diff --git a/server/src/utils/misc.spec.ts b/server/src/utils/misc.spec.ts index 0f6e6e589..5a3ef2abd 100644 --- a/server/src/utils/misc.spec.ts +++ b/server/src/utils/misc.spec.ts @@ -1,5 +1,5 @@ -import { getKeysDeep, globToPostgresRegex, unsetDeep } from 'src/utils/misc.js'; import { describe, expect, it } from 'vitest'; +import { getKeysDeep, globToPostgresRegex, unsetDeep } from 'src/utils/misc.js'; describe('getKeysDeep', () => { it('should handle an empty object', () => { diff --git a/server/src/utils/preferences.ts b/server/src/utils/preferences.ts index 2d4da5506..1f363de86 100644 --- a/server/src/utils/preferences.ts +++ b/server/src/utils/preferences.ts @@ -1,7 +1,7 @@ import { get, isEqual, set } from 'lodash-es'; +import type { DeepPartial, UserMetadataItem, UserPreferences } from 'src/types.js'; import { UserPreferencesUpdateDto } from 'src/dtos/user-preferences.dto.js'; import { AssetOrder, UserMetadataKey } from 'src/enum.js'; -import type { DeepPartial, UserMetadataItem, UserPreferences } from 'src/types.js'; import { HumanReadableSize } from 'src/utils/bytes.js'; import { getKeysDeep } from 'src/utils/misc.js'; diff --git a/server/src/utils/search-cursor.spec.ts b/server/src/utils/search-cursor.spec.ts index b42718c77..6eae54ffe 100644 --- a/server/src/utils/search-cursor.spec.ts +++ b/server/src/utils/search-cursor.spec.ts @@ -1,6 +1,6 @@ import { BadRequestException } from '@nestjs/common'; -import { decodeSearchCursor, encodeSearchCursor } from 'src/utils/search-cursor.js'; import { describe, expect, it } from 'vitest'; +import { decodeSearchCursor, encodeSearchCursor } from 'src/utils/search-cursor.js'; describe('encodeSearchCursor', () => { it('should produce an opaque base64url string', () => { diff --git a/server/src/utils/search-filter.spec.ts b/server/src/utils/search-filter.spec.ts index 8ea6ddc2d..0be7d1fe5 100644 --- a/server/src/utils/search-filter.spec.ts +++ b/server/src/utils/search-filter.spec.ts @@ -1,9 +1,9 @@ import { UnauthorizedException } from '@nestjs/common'; -import { isAlbumConfined, isFullyAlbumConfined, SearchFilter } from 'src/dtos/search.dto.js'; +import { describe, expect, it } from 'vitest'; +import { SearchFilter, isAlbumConfined, isFullyAlbumConfined } from 'src/dtos/search.dto.js'; import { AssetVisibility } from 'src/enum.js'; import { applyLockedVisibilityPolicy, collectFilterIds } from 'src/utils/search-filter.js'; import { AuthFactory } from 'test/factories/auth.factory.js'; -import { describe, expect, it } from 'vitest'; const elevatedAuth = () => AuthFactory.from().session({ hasElevatedPermission: true }).build(); const unelevatedAuth = () => AuthFactory.from().session().build(); diff --git a/server/src/utils/sync.ts b/server/src/utils/sync.ts index 1d64ff3d1..609eaaa1c 100644 --- a/server/src/utils/sync.ts +++ b/server/src/utils/sync.ts @@ -1,6 +1,6 @@ +import type { SyncAck } from 'src/types.js'; import { SyncItem } from 'src/dtos/sync.dto.js'; import { SyncEntityType } from 'src/enum.js'; -import type { SyncAck } from 'src/types.js'; type Impossible = { [P in K]: never; diff --git a/server/src/utils/transform.spec.ts b/server/src/utils/transform.spec.ts index da4a6a093..1552bd231 100644 --- a/server/src/utils/transform.spec.ts +++ b/server/src/utils/transform.spec.ts @@ -1,7 +1,7 @@ +import { describe, expect, it } from 'vitest'; import { AssetEditAction, AssetEditActionItem, MirrorAxis } from 'src/dtos/editing.dto.js'; import { AssetOcrResponseDto } from 'src/dtos/ocr.dto.js'; import { transformFaceBoundingBox, transformOcrBoundingBox } from 'src/utils/transform.js'; -import { describe, expect, it } from 'vitest'; describe('transformFaceBoundingBox', () => { const baseFace = { diff --git a/server/src/utils/transform.ts b/server/src/utils/transform.ts index f958fb48e..be5b9280b 100644 --- a/server/src/utils/transform.ts +++ b/server/src/utils/transform.ts @@ -1,7 +1,7 @@ +import { Matrix, applyToPoint, compose, flipX, flipY, identity, rotate, scale, translate } from 'transformation-matrix'; +import type { ImageDimensions } from 'src/types.js'; import { AssetEditAction, AssetEditActionItem } from 'src/dtos/editing.dto.js'; import { AssetOcrResponseDto } from 'src/dtos/ocr.dto.js'; -import type { ImageDimensions } from 'src/types.js'; -import { applyToPoint, compose, flipX, flipY, identity, Matrix, rotate, scale, translate } from 'transformation-matrix'; export const getOutputDimensions = ( edits: AssetEditActionItem[], diff --git a/server/src/validation.spec.ts b/server/src/validation.spec.ts index 4a56bc81e..ba573de3f 100644 --- a/server/src/validation.spec.ts +++ b/server/src/validation.spec.ts @@ -1,6 +1,6 @@ -import { IsNotSiblingOf, toEmail } from 'src/validation.js'; import { describe, expect, it } from 'vitest'; import z from 'zod'; +import { IsNotSiblingOf, toEmail } from 'src/validation.js'; describe('Validation', () => { describe('IsNotSiblingOf', () => { diff --git a/server/src/validation.ts b/server/src/validation.ts index 3e26bee3a..7c8121578 100644 --- a/server/src/validation.ts +++ b/server/src/validation.ts @@ -9,9 +9,11 @@ export type IsIPRangeOptions = { requireCIDR?: boolean }; function isIPOrRange(value: string, options?: IsIPRangeOptions): boolean { const { requireCIDR = true } = options ?? {}; + // eslint-disable-next-line import-x/no-named-as-default-member if (validator.isIPRange(value)) { return true; } + // eslint-disable-next-line import-x/no-named-as-default-member return !requireCIDR && validator.isIP(value); } diff --git a/server/test/fixtures/media.stub.ts b/server/test/fixtures/media.stub.ts index 55ec16b0e..36939b508 100644 --- a/server/test/fixtures/media.stub.ts +++ b/server/test/fixtures/media.stub.ts @@ -1,3 +1,4 @@ +import type { AudioStreamInfo, VideoFormat, VideoInfo, VideoStreamInfo } from 'src/types.js'; import { AacProfile, ColorMatrix, @@ -8,7 +9,6 @@ import { H264Profile, HevcProfile, } from 'src/enum.js'; -import type { AudioStreamInfo, VideoFormat, VideoInfo, VideoStreamInfo } from 'src/types.js'; const probeStubDefaultFormat: VideoFormat = { formatName: 'mov,mp4,m4a,3gp,3g2,mj2', diff --git a/server/test/fixtures/system-config.stub.ts b/server/test/fixtures/system-config.stub.ts index b719c6948..b22f2d84b 100644 --- a/server/test/fixtures/system-config.stub.ts +++ b/server/test/fixtures/system-config.stub.ts @@ -1,5 +1,5 @@ -import { SystemConfig } from 'src/dtos/config.dto.js'; import type { DeepPartial } from 'src/types.js'; +import { SystemConfig } from 'src/dtos/config.dto.js'; export const systemConfigStub = { enabled: { diff --git a/server/test/mappers.ts b/server/test/mappers.ts index 60b8a94cb..6a1937795 100644 --- a/server/test/mappers.ts +++ b/server/test/mappers.ts @@ -1,4 +1,5 @@ import { Selectable, ShallowDehydrateObject } from 'kysely'; +import type { AudioStreamInfo, VideoFormat, VideoStreamInfo } from 'src/types.js'; import { MapAsset } from 'src/dtos/asset-response.dto.js'; import { AssetEditActionItem } from 'src/dtos/editing.dto.js'; import { AssetFileType } from 'src/enum.js'; @@ -6,7 +7,6 @@ import { FaceSearchResult } from 'src/repositories/search.repository.js'; import { ActivityTable } from 'src/schema/tables/activity.table.js'; import { AssetTable } from 'src/schema/tables/asset.table.js'; import { PartnerTable } from 'src/schema/tables/partner.table.js'; -import type { AudioStreamInfo, VideoFormat, VideoStreamInfo } from 'src/types.js'; import { AlbumFactory } from 'test/factories/album.factory.js'; import { AssetFaceFactory } from 'test/factories/asset-face.factory.js'; import { AssetFactory } from 'test/factories/asset.factory.js'; diff --git a/server/test/medium.factory.ts b/server/test/medium.factory.ts index 4b4df9fe0..159af1a45 100644 --- a/server/test/medium.factory.ts +++ b/server/test/medium.factory.ts @@ -4,6 +4,8 @@ import { createHash, randomBytes } from 'node:crypto'; import { Stats } from 'node:fs'; import { resolve } from 'node:path'; import { Writable } from 'node:stream'; +import { Mocked } from 'vitest'; +import type { ClassConstructor, ClassConstructorsToInstances, UploadFile } from 'src/types.js'; import { AssetFace } from 'src/database.js'; import { AuthDto, LoginResponseDto } from 'src/dtos/auth.dto.js'; import { SystemConfig } from 'src/dtos/config.dto.js'; @@ -81,13 +83,11 @@ import { UserTable } from 'src/schema/tables/user.table.js'; import { BASE_SERVICE_DEPENDENCIES, BaseService } from 'src/services/base.service.js'; import { MetadataService } from 'src/services/metadata.service.js'; import { SyncService } from 'src/services/sync.service.js'; -import type { ClassConstructor, ClassConstructorsToInstances, UploadFile } from 'src/types.js'; import { getConfig, updateConfig } from 'src/utils/config.js'; import { mockEnvData } from 'test/repositories/config.repository.mock.js'; import { newTelemetryRepositoryMock } from 'test/repositories/telemetry.repository.mock.js'; import { factory, newDate, newEmbedding, newUuid } from 'test/small.factory.js'; import { automock, wait } from 'test/utils.js'; -import { Mocked } from 'vitest'; export const testAssetsDir = resolve(import.meta.dirname, '../../e2e/test-assets'); diff --git a/server/test/medium/globalSetup.ts b/server/test/medium/globalSetup.ts index 3bb153c1d..d2259d8b8 100644 --- a/server/test/medium/globalSetup.ts +++ b/server/test/medium/globalSetup.ts @@ -1,10 +1,10 @@ import { Kysely } from 'kysely'; +import { GenericContainer, Wait } from 'testcontainers'; import { ConfigRepository } from 'src/repositories/config.repository.js'; import { DatabaseRepository } from 'src/repositories/database.repository.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; import { DB } from 'src/schema/index.js'; import { getKyselyConfig } from 'src/utils/database.js'; -import { GenericContainer, Wait } from 'testcontainers'; const globalSetup = async () => { const templateName = 'mich'; diff --git a/server/test/medium/specs/services/sync.service.spec.ts b/server/test/medium/specs/services/sync.service.spec.ts index 6c4f753ea..edbeacddc 100644 --- a/server/test/medium/specs/services/sync.service.spec.ts +++ b/server/test/medium/specs/services/sync.service.spec.ts @@ -1,6 +1,7 @@ import { schemaFromCode } from '@immich/sql-tools'; import { Kysely } from 'kysely'; import { DateTime } from 'luxon'; +import { v4 } from 'uuid'; import { AssetMetadataKey, UserMetadataKey } from 'src/enum.js'; import { DatabaseRepository } from 'src/repositories/database.repository.js'; import { LoggingRepository } from 'src/repositories/logging.repository.js'; @@ -9,7 +10,6 @@ import { DB } from 'src/schema/index.js'; import { SyncService } from 'src/services/sync.service.js'; import { newMediumService } from 'test/medium.factory.js'; import { getKyselyDB } from 'test/utils.js'; -import { v4 } from 'uuid'; let defaultDatabase: Kysely; diff --git a/server/test/medium/specs/sync/sync-complete.spec.ts b/server/test/medium/specs/sync/sync-complete.spec.ts index 53dbb78ea..244bbc5d5 100644 --- a/server/test/medium/specs/sync/sync-complete.spec.ts +++ b/server/test/medium/specs/sync/sync-complete.spec.ts @@ -1,12 +1,12 @@ import { Kysely } from 'kysely'; import { DateTime } from 'luxon'; +import { v7 } from 'uuid'; import { SyncEntityType, SyncRequestType } from 'src/enum.js'; import { SyncCheckpointRepository } from 'src/repositories/sync-checkpoint.repository.js'; import { DB } from 'src/schema/index.js'; import { toAck } from 'src/utils/sync.js'; import { SyncTestContext } from 'test/medium.factory.js'; import { getKyselyDB } from 'test/utils.js'; -import { v7 } from 'uuid'; let defaultDatabase: Kysely; diff --git a/server/test/repositories/access.repository.mock.ts b/server/test/repositories/access.repository.mock.ts index 59b9db2c8..1bb9f33ae 100644 --- a/server/test/repositories/access.repository.mock.ts +++ b/server/test/repositories/access.repository.mock.ts @@ -1,6 +1,6 @@ -import { AccessRepository } from 'src/repositories/access.repository.js'; -import type { RepositoryInterface } from 'src/types.js'; import { Mocked, vitest } from 'vitest'; +import type { RepositoryInterface } from 'src/types.js'; +import { AccessRepository } from 'src/repositories/access.repository.js'; type IAccessRepository = { [K in keyof AccessRepository]: RepositoryInterface }; diff --git a/server/test/repositories/asset.repository.mock.ts b/server/test/repositories/asset.repository.mock.ts index 8d65728e2..8b4fa1c9f 100644 --- a/server/test/repositories/asset.repository.mock.ts +++ b/server/test/repositories/asset.repository.mock.ts @@ -1,6 +1,6 @@ -import { AssetRepository } from 'src/repositories/asset.repository.js'; -import type { RepositoryInterface } from 'src/types.js'; import { Mocked, vitest } from 'vitest'; +import type { RepositoryInterface } from 'src/types.js'; +import { AssetRepository } from 'src/repositories/asset.repository.js'; export const newAssetRepositoryMock = (): Mocked> => { return { diff --git a/server/test/repositories/config.repository.mock.ts b/server/test/repositories/config.repository.mock.ts index e2b957e00..4ccf89e17 100644 --- a/server/test/repositories/config.repository.mock.ts +++ b/server/test/repositories/config.repository.mock.ts @@ -1,7 +1,7 @@ +import { Mocked, vitest } from 'vitest'; +import type { RepositoryInterface } from 'src/types.js'; import { DatabaseExtension, ImmichEnvironment, ImmichWorker, LogFormat } from 'src/enum.js'; import { ConfigRepository, EnvData } from 'src/repositories/config.repository.js'; -import type { RepositoryInterface } from 'src/types.js'; -import { Mocked, vitest } from 'vitest'; export const envData: EnvData = { port: 2283, diff --git a/server/test/repositories/crypto.repository.mock.ts b/server/test/repositories/crypto.repository.mock.ts index 530320bcd..5c5490d7e 100644 --- a/server/test/repositories/crypto.repository.mock.ts +++ b/server/test/repositories/crypto.repository.mock.ts @@ -1,6 +1,6 @@ -import { CryptoRepository } from 'src/repositories/crypto.repository.js'; -import type { RepositoryInterface } from 'src/types.js'; import { Mocked, vitest } from 'vitest'; +import type { RepositoryInterface } from 'src/types.js'; +import { CryptoRepository } from 'src/repositories/crypto.repository.js'; export const newCryptoRepositoryMock = (): Mocked> => { return { diff --git a/server/test/repositories/job.repository.mock.ts b/server/test/repositories/job.repository.mock.ts index 92208b2a9..5f0ab832b 100644 --- a/server/test/repositories/job.repository.mock.ts +++ b/server/test/repositories/job.repository.mock.ts @@ -1,6 +1,6 @@ -import { JobRepository } from 'src/repositories/job.repository.js'; -import type { RepositoryInterface } from 'src/types.js'; import { Mocked, vitest } from 'vitest'; +import type { RepositoryInterface } from 'src/types.js'; +import { JobRepository } from 'src/repositories/job.repository.js'; export const newJobRepositoryMock = (): Mocked> => { return { diff --git a/server/test/repositories/media.repository.mock.ts b/server/test/repositories/media.repository.mock.ts index de62e7bf7..6114390ec 100644 --- a/server/test/repositories/media.repository.mock.ts +++ b/server/test/repositories/media.repository.mock.ts @@ -1,6 +1,6 @@ -import { MediaRepository } from 'src/repositories/media.repository.js'; -import type { RepositoryInterface } from 'src/types.js'; import { Mocked, vitest } from 'vitest'; +import type { RepositoryInterface } from 'src/types.js'; +import { MediaRepository } from 'src/repositories/media.repository.js'; export const newMediaRepositoryMock = (): Mocked> => { return { diff --git a/server/test/repositories/metadata.repository.mock.ts b/server/test/repositories/metadata.repository.mock.ts index 02c23885c..28ef5f9f5 100644 --- a/server/test/repositories/metadata.repository.mock.ts +++ b/server/test/repositories/metadata.repository.mock.ts @@ -1,6 +1,6 @@ -import { MetadataRepository } from 'src/repositories/metadata.repository.js'; -import type { RepositoryInterface } from 'src/types.js'; import { Mocked, vitest } from 'vitest'; +import type { RepositoryInterface } from 'src/types.js'; +import { MetadataRepository } from 'src/repositories/metadata.repository.js'; export const newMetadataRepositoryMock = (): Mocked> => { return { diff --git a/server/test/repositories/storage.repository.mock.ts b/server/test/repositories/storage.repository.mock.ts index 657cb276f..33bf0d747 100644 --- a/server/test/repositories/storage.repository.mock.ts +++ b/server/test/repositories/storage.repository.mock.ts @@ -1,8 +1,8 @@ import { ChokidarOptions } from 'chokidar'; +import { Mocked, vitest } from 'vitest'; +import type { RepositoryInterface } from 'src/types.js'; import { StorageCore } from 'src/cores/storage.core.js'; import { StorageRepository, WatchEvents } from 'src/repositories/storage.repository.js'; -import type { RepositoryInterface } from 'src/types.js'; -import { Mocked, vitest } from 'vitest'; interface MockWatcherOptions { items?: Array<{ event: 'change' | 'add' | 'unlink' | 'error'; value: string }>; diff --git a/server/test/repositories/system-metadata.repository.mock.ts b/server/test/repositories/system-metadata.repository.mock.ts index 36ea6d18b..630ee0145 100644 --- a/server/test/repositories/system-metadata.repository.mock.ts +++ b/server/test/repositories/system-metadata.repository.mock.ts @@ -1,7 +1,7 @@ -import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository.js'; -import type { RepositoryInterface } from 'src/types.js'; -import { clearConfigCache } from 'src/utils/config.js'; import { Mocked, vitest } from 'vitest'; +import type { RepositoryInterface } from 'src/types.js'; +import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository.js'; +import { clearConfigCache } from 'src/utils/config.js'; export const newSystemMetadataRepositoryMock = (): Mocked> => { clearConfigCache(); diff --git a/server/test/repositories/telemetry.repository.mock.ts b/server/test/repositories/telemetry.repository.mock.ts index 94753b1fc..64a26cde6 100644 --- a/server/test/repositories/telemetry.repository.mock.ts +++ b/server/test/repositories/telemetry.repository.mock.ts @@ -1,6 +1,6 @@ -import { TelemetryRepository } from 'src/repositories/telemetry.repository.js'; -import type { RepositoryInterface } from 'src/types.js'; import { Mocked, vitest } from 'vitest'; +import type { RepositoryInterface } from 'src/types.js'; +import { TelemetryRepository } from 'src/repositories/telemetry.repository.js'; const newMetricGroupMock = () => { return { diff --git a/server/test/small.factory.ts b/server/test/small.factory.ts index 2f3b7a5de..d81c620b9 100644 --- a/server/test/small.factory.ts +++ b/server/test/small.factory.ts @@ -1,9 +1,9 @@ +import { v4, v7 } from 'uuid'; +import { expect } from 'vitest'; import { AuthApiKey, AuthSharedLink, AuthUser, Library, UserAdmin } from 'src/database.js'; import { AuthDto } from 'src/dtos/auth.dto.js'; import { QueueStatisticsDto } from 'src/dtos/queue.dto.js'; import { Permission, UserStatus } from 'src/enum.js'; -import { v4, v7 } from 'uuid'; -import { expect } from 'vitest'; export const newUuid = () => v4(); export const newUuids = () => Array.from({ length: 100 }, () => 0).map(() => newUuid()); diff --git a/server/test/utils.ts b/server/test/utils.ts index 5aa3b17b7..5f0850b4b 100644 --- a/server/test/utils.ts +++ b/server/test/utils.ts @@ -1,17 +1,19 @@ /* eslint-disable unicorn/no-this-outside-of-class */ -import { createPostgres, DatabaseConnectionParams } from '@immich/sql-tools'; +import { DatabaseConnectionParams, createPostgres } from '@immich/sql-tools'; import { CallHandler, ExecutionContext, Provider } from '@nestjs/common'; import { APP_FILTER, APP_GUARD, APP_INTERCEPTOR, APP_PIPE } from '@nestjs/core'; import { transformException } from '@nestjs/platform-express/multer/multer/multer.utils'; import { Test } from '@nestjs/testing'; import { NextFunction } from 'express'; import { Kysely } from 'kysely'; -import multer from 'multer'; +import multer, { memoryStorage } from 'multer'; import { ClsService } from 'nestjs-cls'; import { ZodSerializerInterceptor, ZodValidationPipe } from 'nestjs-zod'; import { ChildProcessWithoutNullStreams } from 'node:child_process'; import { Duplex, Readable, Writable } from 'node:stream'; import { PNG } from 'pngjs'; +import { Mock, Mocked, assert, vitest } from 'vitest'; +import type { RepositoryInterface } from 'src/types.js'; import { UploadFieldName } from 'src/dtos/asset-media.dto.js'; import { AssetUploadInterceptor } from 'src/middleware/asset-upload.interceptor.js'; import { AuthGuard } from 'src/middleware/auth.guard.js'; @@ -75,7 +77,6 @@ import { WorkflowRepository } from 'src/repositories/workflow.repository.js'; import { DB } from 'src/schema/index.js'; import { AuthService } from 'src/services/auth.service.js'; import { BaseService } from 'src/services/base.service.js'; -import type { RepositoryInterface } from 'src/types.js'; import { getKyselyConfig } from 'src/utils/database.js'; import { ClusterGroupFactory } from 'test/factories/cluster-group.factory.js'; import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock.js'; @@ -88,7 +89,6 @@ import { newMetadataRepositoryMock } from 'test/repositories/metadata.repository import { newStorageRepositoryMock } from 'test/repositories/storage.repository.mock.js'; import { newSystemMetadataRepositoryMock } from 'test/repositories/system-metadata.repository.mock.js'; import { ITelemetryRepositoryMock, newTelemetryRepositoryMock } from 'test/repositories/telemetry.repository.mock.js'; -import { assert, Mock, Mocked, vitest } from 'vitest'; export type ControllerContext = { authenticate: Mock; @@ -102,7 +102,7 @@ type ControllerClass = new (...args: any[]) => unknown; export const controllerSetup = async (controller: ControllerClass | ControllerClass[], providers: Provider[]) => { const noopInterceptor = { intercept: (ctx: never, next: CallHandler) => next.handle() }; - const upload = multer({ storage: multer.memoryStorage() }); + const upload = multer({ storage: memoryStorage() }); const memoryFileInterceptor = { intercept: async (ctx: ExecutionContext, next: CallHandler) => { const context = ctx.switchToHttp();