From f04aaca29ea764431c4222a319a5ea26457808c2 Mon Sep 17 00:00:00 2001 From: Umar Adilov <99314948+adilovcode@users.noreply.github.com> Date: Mon, 1 Jun 2026 23:18:12 +0500 Subject: [PATCH] Fixed issues with query builder --- next.config.ts | 2 +- package.json | 8 +- pnpm-lock.yaml | 639 ++++++++++++++- .../presenters/taylor-presenters.ts | 65 +- src/features/pages/services/pages.service.ts | 49 +- src/shared/types/database.types.ts | 768 ++++++------------ 6 files changed, 899 insertions(+), 632 deletions(-) diff --git a/next.config.ts b/next.config.ts index 199b53c..61b794b 100644 --- a/next.config.ts +++ b/next.config.ts @@ -5,7 +5,7 @@ const nextConfig: NextConfig = { remotePatterns: [ { protocol: 'https', - hostname: 'media.bambooapp.ai', + hostname: 'media.taylordb.ai', pathname: '/files/**', }, { diff --git a/package.json b/package.json index 8d502ad..dfe2a6d 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "dev": "next dev --turbopack", "build": "next build", "start": "next start", - "lint": "eslint ." + "lint": "eslint .", + "regenerate:types": "npx @taylordb/cli generate-schema af483cef-ec47-48fc-b186-e11022dbb0e2 src/shared/database.types.ts" }, "dependencies": { "@hookform/resolvers": "^5.0.1", @@ -25,7 +26,8 @@ "@radix-ui/react-toast": "^1.2.11", "@radix-ui/react-tooltip": "^1.2.6", "@reduxjs/toolkit": "^2.7.0", - "@taylordb/query-builder": "^0.10.1", + "@taylordb/cli": "^0.18.2", + "@taylordb/query-builder": "^0.18.2", "aos": "^2.3.4", "axios": "^1.9.0", "class-variance-authority": "^0.7.1", @@ -87,4 +89,4 @@ "@types/react-dom": "19.2.3" } } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1cf66b5..5a06a32 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,9 +57,12 @@ importers: '@reduxjs/toolkit': specifier: ^2.7.0 version: 2.7.0(react-redux@9.2.0(@types/react@19.2.7)(react@19.2.3)(redux@5.0.1))(react@19.2.3) + '@taylordb/cli': + specifier: ^0.18.2 + version: 0.18.2(@types/node@20.17.30) '@taylordb/query-builder': - specifier: ^0.10.1 - version: 0.10.1 + specifier: ^0.18.2 + version: 0.18.2 aos: specifier: ^2.3.4 version: 2.3.4 @@ -224,6 +227,10 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} + '@apidevtools/json-schema-ref-parser@11.9.3': + resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} + engines: {node: '>= 16'} + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -557,6 +564,140 @@ packages: cpu: [x64] os: [win32] + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.10.1': + resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -584,6 +725,9 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@napi-rs/wasm-runtime@0.2.9': resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} @@ -1302,11 +1446,15 @@ packages: '@tailwindcss/postcss@4.1.4': resolution: {integrity: sha512-bjV6sqycCEa+AQSt2Kr7wpGF1bOZJ5wsqnLEkqSbM/JEHxx/yhMH8wHmdkPyApF9xhHeMSwnnkDUUMMM/hYnXw==} - '@taylordb/query-builder@0.10.1': - resolution: {integrity: sha512-WUyohbO8R+xFC+t+zfTP5VSLakGlBu2gsdWbFWwru4KqLNFW/NCsIvSDhzNObVbtbSgvkf+oVC0li+/z9uZYig==} + '@taylordb/cli@0.18.2': + resolution: {integrity: sha512-lIwcJ3cUS7z9s+P5Xo5DPJSoiu2lCLLGUZhT4pMZ2TAmR52q0RUNB6zZ9UXDp57Aa7RbRznQ+MUz4s/loc7nXQ==} + hasBin: true - '@taylordb/shared@0.4.4': - resolution: {integrity: sha512-Xykr4I26JapNLePkapBGjz15t9Ep1iLs30VbfCcc2z30x8Qy/2tm+sSa5LcacCP2EaxNVDp2UuYKhZ7kOWBLBQ==} + '@taylordb/query-builder@0.18.2': + resolution: {integrity: sha512-1nUrXxbMZ5a8xdZMnlRlLd87bxUmInz5k0eQbgOdcOvjtSEYt+o3201pn0RGKruiP/xhvDQGYe++31Tt5F+dOA==} + + '@taylordb/shared@0.18.2': + resolution: {integrity: sha512-uVW68f7wsnkeBbtkLeSptzALXGMIEBMz8XvNreLXDsuEWcWl9nZhbL2DLAidtTsWH9LOQeG4SZKSNGBeNihSYw==} '@trivago/prettier-plugin-sort-imports@5.2.2': resolution: {integrity: sha512-fYDQA9e6yTNmA13TLVSA+WMQRc5Bn/c0EUBditUHNfMMxN7M82c38b1kEggVE3pLpZ0FwkwJkUEKMiOi52JXFA==} @@ -1324,6 +1472,9 @@ packages: svelte: optional: true + '@ts-morph/common@0.12.3': + resolution: {integrity: sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==} + '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} @@ -1567,9 +1718,24 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1634,6 +1800,9 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + atomically@2.1.1: + resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -1697,12 +1866,23 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} classlist-polyfill@1.2.0: resolution: {integrity: sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ==} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -1710,6 +1890,9 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + code-block-writer@11.0.3: + resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1721,9 +1904,17 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + conf@15.1.0: + resolution: {integrity: sha512-Uy5YN9KEu0WWDaZAVJ5FAmZoaJt9rdK6kH+utItPyGsCqCgaTKkrmZx3zoE0/3q6S3bcp3Ihkk+ZqPxWxFK5og==} + engines: {node: '>=20'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1767,6 +1958,10 @@ packages: date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + debounce-fn@6.0.0: + resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} + engines: {node: '>=18'} + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1827,6 +2022,10 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} + dot-prop@10.1.0: + resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} + engines: {node: '>=20'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1852,6 +2051,9 @@ packages: embla-carousel@8.6.0: resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -1866,6 +2068,10 @@ packages: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + es-abstract@1.23.9: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} @@ -2086,6 +2292,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -2246,6 +2455,10 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2265,6 +2478,15 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inquirer@12.11.1: + resolution: {integrity: sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -2312,6 +2534,10 @@ packages: 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.0: resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} @@ -2404,9 +2630,20 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-schema-to-typescript@15.0.4: + resolution: {integrity: sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==} + engines: {node: '>=16.0.0'} + hasBin: true + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2552,6 +2789,10 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + minimatch@10.0.1: resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} engines: {node: 20 || >=22} @@ -2566,9 +2807,18 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2671,6 +2921,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2868,6 +3121,10 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} @@ -2891,9 +3148,16 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + run-async@4.0.6: + resolution: {integrity: sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==} + engines: {node: '>=0.12.0'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -2906,6 +3170,9 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -2963,6 +3230,10 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + socket.io-client@4.8.1: resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} engines: {node: '>=10.0.0'} @@ -2988,6 +3259,10 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + string.prototype.includes@2.0.1: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'} @@ -3011,6 +3286,10 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -3019,6 +3298,12 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.2: + resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -3044,6 +3329,10 @@ packages: resolution: {integrity: sha512-8aXpYKtjy3DjcbzZfz+/OX/GhcU5h+looA6PbAzHMZT6ESSycSp9nAjPCenczgJyslV+rUGse64LMGpWE3PX9Q==} engines: {node: '>= 4.7.0'} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tailwind-merge@3.2.0: resolution: {integrity: sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==} @@ -3082,6 +3371,9 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-morph@13.0.3: + resolution: {integrity: sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==} + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -3095,6 +3387,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@5.7.0: + resolution: {integrity: sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==} + engines: {node: '>=20'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -3130,6 +3426,10 @@ packages: engines: {node: '>=14.17'} hasBin: true + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -3174,6 +3474,9 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + 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'} @@ -3199,6 +3502,10 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + ws@8.17.1: resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} @@ -3222,6 +3529,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + zod-validation-error@4.0.2: resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} engines: {node: '>=18.0.0'} @@ -3241,6 +3552,12 @@ snapshots: '@alloc/quick-lru@5.2.0': {} + '@apidevtools/json-schema-ref-parser@11.9.3': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + js-yaml: 4.1.0 + '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -3588,6 +3905,131 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true + '@inquirer/ansi@1.0.2': {} + + '@inquirer/checkbox@4.3.2(@types/node@20.17.30)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@20.17.30) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@20.17.30) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/confirm@5.1.21(@types/node@20.17.30)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.17.30) + '@inquirer/type': 3.0.10(@types/node@20.17.30) + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/core@10.3.2(@types/node@20.17.30)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@20.17.30) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/editor@4.2.23(@types/node@20.17.30)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.17.30) + '@inquirer/external-editor': 1.0.3(@types/node@20.17.30) + '@inquirer/type': 3.0.10(@types/node@20.17.30) + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/expand@4.0.23(@types/node@20.17.30)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.17.30) + '@inquirer/type': 3.0.10(@types/node@20.17.30) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/external-editor@1.0.3(@types/node@20.17.30)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/input@4.3.1(@types/node@20.17.30)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.17.30) + '@inquirer/type': 3.0.10(@types/node@20.17.30) + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/number@3.0.23(@types/node@20.17.30)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.17.30) + '@inquirer/type': 3.0.10(@types/node@20.17.30) + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/password@4.0.23(@types/node@20.17.30)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@20.17.30) + '@inquirer/type': 3.0.10(@types/node@20.17.30) + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/prompts@7.10.1(@types/node@20.17.30)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@20.17.30) + '@inquirer/confirm': 5.1.21(@types/node@20.17.30) + '@inquirer/editor': 4.2.23(@types/node@20.17.30) + '@inquirer/expand': 4.0.23(@types/node@20.17.30) + '@inquirer/input': 4.3.1(@types/node@20.17.30) + '@inquirer/number': 3.0.23(@types/node@20.17.30) + '@inquirer/password': 4.0.23(@types/node@20.17.30) + '@inquirer/rawlist': 4.1.11(@types/node@20.17.30) + '@inquirer/search': 3.2.2(@types/node@20.17.30) + '@inquirer/select': 4.4.2(@types/node@20.17.30) + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/rawlist@4.1.11(@types/node@20.17.30)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.17.30) + '@inquirer/type': 3.0.10(@types/node@20.17.30) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/search@3.2.2(@types/node@20.17.30)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.17.30) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@20.17.30) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/select@4.4.2(@types/node@20.17.30)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@20.17.30) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@20.17.30) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.17.30 + + '@inquirer/type@3.0.10(@types/node@20.17.30)': + optionalDependencies: + '@types/node': 20.17.30 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -3620,6 +4062,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jsdevtools/ono@7.1.3': {} + '@napi-rs/wasm-runtime@0.2.9': dependencies: '@emnapi/core': 1.4.3 @@ -4296,9 +4740,29 @@ snapshots: postcss: 8.5.3 tailwindcss: 4.1.4 - '@taylordb/query-builder@0.10.1': + '@taylordb/cli@0.18.2(@types/node@20.17.30)': dependencies: - '@taylordb/shared': 0.4.4 + '@inquirer/prompts': 7.10.1(@types/node@20.17.30) + '@taylordb/query-builder': 0.18.2 + axios: 1.9.0 + chalk: 5.6.2 + commander: 8.3.0 + conf: 15.1.0 + inquirer: 12.11.1(@types/node@20.17.30) + json-schema-to-typescript: 15.0.4 + json-to-graphql-query: 2.3.0 + lodash: 4.17.21 + ts-morph: 13.0.3 + transitivePeerDependencies: + - '@types/node' + - bufferutil + - debug + - supports-color + - utf-8-validate + + '@taylordb/query-builder@0.18.2': + dependencies: + '@taylordb/shared': 0.18.2 eventemitter3: 5.0.1 fast-json-patch: 3.1.1 json-to-graphql-query: 2.3.0 @@ -4310,7 +4774,7 @@ snapshots: - supports-color - utf-8-validate - '@taylordb/shared@0.4.4': + '@taylordb/shared@0.18.2': dependencies: lodash: 4.17.21 @@ -4326,6 +4790,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@ts-morph/common@0.12.3': + dependencies: + fast-glob: 3.3.3 + minimatch: 3.1.2 + mkdirp: 1.0.4 + path-browserify: 1.0.1 + '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 @@ -4611,6 +5082,10 @@ snapshots: acorn@8.14.1: {} + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -4618,6 +5093,15 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -4718,6 +5202,11 @@ snapshots: asynckit@0.4.0: {} + atomically@2.1.1: + dependencies: + stubborn-fs: 2.0.0 + when-exit: 2.1.5 + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -4787,16 +5276,24 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + + chardet@2.1.1: {} + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 classlist-polyfill@1.2.0: {} + cli-width@4.1.0: {} + client-only@0.0.1: {} clsx@2.1.1: {} + code-block-writer@11.0.3: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -4807,8 +5304,22 @@ snapshots: dependencies: delayed-stream: 1.0.0 + commander@8.3.0: {} + concat-map@0.0.1: {} + conf@15.1.0: + dependencies: + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + atomically: 2.1.1 + debounce-fn: 6.0.0 + dot-prop: 10.1.0 + env-paths: 3.0.0 + json-schema-typed: 8.0.2 + semver: 7.7.3 + uint8array-extras: 1.5.0 + convert-source-map@2.0.0: {} cookie@1.0.2: {} @@ -4853,6 +5364,10 @@ snapshots: date-fns@4.1.0: {} + debounce-fn@6.0.0: + dependencies: + mimic-function: 5.0.1 + debug@3.2.7: dependencies: ms: 2.1.3 @@ -4896,6 +5411,10 @@ snapshots: dependencies: esutils: 2.0.3 + dot-prop@10.1.0: + dependencies: + type-fest: 5.7.0 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -4920,6 +5439,8 @@ snapshots: embla-carousel@8.6.0: {} + emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} engine.io-client@6.6.3: @@ -4941,6 +5462,8 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 + env-paths@3.0.0: {} + es-abstract@1.23.9: dependencies: array-buffer-byte-length: 1.0.2 @@ -5373,6 +5896,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-uri@3.1.2: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -5518,6 +6043,10 @@ snapshots: dependencies: hermes-estree: 0.25.1 + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + ignore@5.3.2: {} ignore@7.0.5: {} @@ -5531,6 +6060,18 @@ snapshots: imurmurhash@0.1.4: {} + inquirer@12.11.1(@types/node@20.17.30): + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@20.17.30) + '@inquirer/prompts': 7.10.1(@types/node@20.17.30) + '@inquirer/type': 3.0.10(@types/node@20.17.30) + mute-stream: 2.0.0 + run-async: 4.0.6 + rxjs: 7.8.2 + optionalDependencies: + '@types/node': 20.17.30 + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -5587,6 +6128,8 @@ snapshots: dependencies: call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.0: dependencies: call-bound: 1.0.4 @@ -5675,8 +6218,24 @@ snapshots: json-buffer@3.0.1: {} + json-schema-to-typescript@15.0.4: + dependencies: + '@apidevtools/json-schema-ref-parser': 11.9.3 + '@types/json-schema': 7.0.15 + '@types/lodash': 4.17.16 + is-glob: 4.0.3 + js-yaml: 4.1.0 + lodash: 4.17.21 + minimist: 1.2.8 + prettier: 3.5.3 + tinyglobby: 0.2.15 + json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + json-stable-stringify-without-jsonify@1.0.1: {} json-to-graphql-query@2.3.0: {} @@ -5793,6 +6352,8 @@ snapshots: dependencies: mime-db: 1.52.0 + mimic-function@5.0.1: {} + minimatch@10.0.1: dependencies: brace-expansion: 2.0.1 @@ -5807,8 +6368,12 @@ snapshots: minimist@1.2.8: {} + mkdirp@1.0.4: {} + ms@2.1.3: {} + mute-stream@2.0.0: {} + nanoid@3.3.11: {} napi-postinstall@0.1.1: {} @@ -5920,6 +6485,8 @@ snapshots: dependencies: callsites: 3.1.0 + path-browserify@1.0.1: {} + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -6050,6 +6617,8 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + require-from-string@2.0.2: {} + reselect@5.1.1: {} resolve-from@4.0.0: {} @@ -6070,10 +6639,16 @@ snapshots: reusify@1.1.0: {} + run-async@4.0.6: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -6093,14 +6668,15 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safer-buffer@2.1.2: {} + scheduler@0.27.0: {} semver@6.3.1: {} semver@7.7.1: {} - semver@7.7.3: - optional: true + semver@7.7.3: {} set-function-length@1.2.2: dependencies: @@ -6190,6 +6766,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + signal-exit@4.1.0: {} + socket.io-client@4.8.1: dependencies: '@socket.io/component-emitter': 3.1.2 @@ -6222,6 +6800,12 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + string.prototype.includes@2.0.1: dependencies: call-bind: 1.0.8 @@ -6272,10 +6856,20 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + strip-bom@3.0.0: {} strip-json-comments@3.1.1: {} + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.2 + + stubborn-utils@1.0.2: {} + styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.3): dependencies: client-only: 0.0.1 @@ -6291,6 +6885,8 @@ snapshots: swiper@11.2.6: {} + tagged-tag@1.0.0: {} + tailwind-merge@3.2.0: {} tailwindcss-animate@1.0.7(tailwindcss@4.1.4): @@ -6323,6 +6919,11 @@ snapshots: dependencies: typescript: 5.8.3 + ts-morph@13.0.3: + dependencies: + '@ts-morph/common': 0.12.3 + code-block-writer: 11.0.3 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -6338,6 +6939,10 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@5.7.0: + dependencies: + tagged-tag: 1.0.0 + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -6394,6 +6999,8 @@ snapshots: typescript@5.8.3: {} + uint8array-extras@1.5.0: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -6453,6 +7060,8 @@ snapshots: dependencies: react: 19.2.3 + when-exit@2.1.5: {} + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -6500,6 +7109,12 @@ snapshots: word-wrap@1.2.5: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + ws@8.17.1: {} xmlhttprequest-ssl@2.1.2: {} @@ -6508,6 +7123,8 @@ snapshots: yocto-queue@0.1.0: {} + yoctocolors-cjs@2.1.3: {} + zod-validation-error@4.0.2(zod@3.25.76): dependencies: zod: 3.25.76 diff --git a/src/app/api-utlities/presenters/taylor-presenters.ts b/src/app/api-utlities/presenters/taylor-presenters.ts index 54926fc..5081b35 100644 --- a/src/app/api-utlities/presenters/taylor-presenters.ts +++ b/src/app/api-utlities/presenters/taylor-presenters.ts @@ -1,32 +1,33 @@ -import { isEmpty } from 'lodash'; +import { TaylorDatabase } from '@/shared/types/database.types'; -import { - AttachmentColumnValue, - TableRaws, -} from '@/shared/types/database.types'; +type TaylorColumnRaw = TColumn extends { + raw: infer TRaw; + isRequired: true; +} + ? TRaw + : TColumn extends { raw: infer TRaw } + ? TRaw | undefined + : never; -// Helper to get image URL from Attachment array -export const getAttachmentUrl = ( - attachments: AttachmentColumnValue[] | undefined | null, -): string | null => { - if (isEmpty(attachments) || !attachments?.[0]) return null; - const attachment = attachments[0]; - return `${process.env.TAYLOR_MEDIA_URL}/${attachment.url}`; +type TableRaws = { + [K in keyof TaylorDatabase[TTableName]]: TaylorColumnRaw< + TaylorDatabase[TTableName][K] + >; }; -// Helper to get link select name (link to selectTable returns object with name) -export const getLinkSelectName = ( - link: { name: string } | undefined | null, -): string | null => { - return link?.name || null; -}; +const getAttachmentUrl = (urls: string[] | undefined): string | null => { + if (!urls?.length) return null; -// Helper to get multiple link select names (for arrays of links) -export const getLinkSelectNames = ( - links: Array<{ name: string }> | undefined | null, -): string[] => { - if (!links || isEmpty(links)) return []; - return links.map((link) => link.name); + const [url] = urls; + if (!url) return null; + + if (/^https?:\/\//.test(url)) { + return url; + } + + return process.env.TAYLOR_MEDIA_URL + ? `${process.env.TAYLOR_MEDIA_URL}/${url}` + : url; }; // Presenters for TaylorDB query builder results (direct array format, no wrapper) @@ -53,13 +54,9 @@ export const presentJobsFromTaylor = ( return jobs.map((job, index) => ({ id: index + 1, name: job.zagolovok || '', - // tegi is a LinkColumnType, so it returns objects when loaded with .with() - tags: Array.isArray(job.tegi) - ? (job.tegi as Array<{ name: string }>).map((tag) => tag.name) - : [], - // tip and lokaciya are SingleSelectColumnType, which return arrays of strings - location: job.lokaciya?.[0] || null, - type: job.tip?.[0] || null, + tags: job.tegi || [], + location: job.lokaciya || null, + type: job.tip || null, })); }; @@ -108,9 +105,7 @@ export const presentStationsFromTaylor = ( name: station.imya || '', description: station.opisanie || '', address: station.adress || '', - // chasyRaboty and region are SingleSelectColumnType, which return arrays of strings - workingHours: station.chasyRaboty?.[0] || null, - // Parse string coordinates to numbers + workingHours: station.chasyRaboty || null, latitude: parseFloat(station.lat || '0') || 0, longitude: parseFloat(station.long || '0') || 0, carWash: station.avtomojka || false, @@ -122,7 +117,7 @@ export const presentStationsFromTaylor = ( electricCharge: station.zaryadnayaStanciya || false, miniMarket: station.miniMarket || false, toilet: station.tualet || false, - region: station.region?.[0] || null, + region: station.region || null, image: getAttachmentUrl(station.foto), })); }; diff --git a/src/features/pages/services/pages.service.ts b/src/features/pages/services/pages.service.ts index 345066b..cf6a3b5 100644 --- a/src/features/pages/services/pages.service.ts +++ b/src/features/pages/services/pages.service.ts @@ -30,36 +30,16 @@ export async function fetchMainPageContent(): Promise { await taylorQueryBuilder .batch([ // Fetch partners - taylorQueryBuilder - .selectFrom('partnyory') - .selectAll() - .with({ - izobrozhenie: (qb) => qb.selectAll(), - }), + taylorQueryBuilder.selectFrom('partnyory').selectAll(), // Fetch jobs - taylorQueryBuilder - .selectFrom('vakansii') - .selectAll() - .with({ - tegi: (qb) => qb.select(['name']), - }), + taylorQueryBuilder.selectFrom('vakansii').selectAll(), // Fetch discounts - taylorQueryBuilder - .selectFrom('akcii') - .selectAll() - .with({ - foto: (qb) => qb.selectAll(), - }), + taylorQueryBuilder.selectFrom('akcii').selectAll(), // Fetch stations - taylorQueryBuilder - .selectFrom('azs') - .selectAll() - .with({ - foto: (qb) => qb.selectAll(), - }), + taylorQueryBuilder.selectFrom('azs').selectAll(), ]) .execute(); @@ -82,12 +62,7 @@ export async function fetchAboutUsPageContent(): Promise { await taylorQueryBuilder .batch([ // Fetch team members - taylorQueryBuilder - .selectFrom('komanda') - .selectAll() - .with({ - foto: (qb) => qb.selectAll(), - }), + taylorQueryBuilder.selectFrom('komanda').selectAll(), // Fetch history items taylorQueryBuilder.selectFrom('istoriyaKompanii').selectAll(), @@ -96,10 +71,7 @@ export async function fetchAboutUsPageContent(): Promise { taylorQueryBuilder .selectFrom('azs') .selectAll() - .where('foto', 'isNotEmpty') - .with({ - foto: (qb) => qb.selectAll(), - }), + .where('foto', 'isNotEmpty'), // Fetch reviews (filtered by published status) taylorQueryBuilder @@ -126,9 +98,6 @@ export async function fetchCharityPageContent(): Promise { const charitiesData = await taylorQueryBuilder .selectFrom('blagotvoritelnyjFond') .selectAll() - .with({ - foto: (qb) => qb.selectAll(), - }) .execute(); console.log('Loading charity page content...'); @@ -145,9 +114,6 @@ export async function fetchCertificatesPageContent(): Promise qb.selectAll(), - }) .execute(); console.log('Loading certificates page content...'); @@ -182,9 +148,6 @@ export async function fetchMediaContent(): Promise< const mediaData = await taylorQueryBuilder .selectFrom('mediaKontentSajta') .selectAll() - .with({ - foto: (qb) => qb.selectAll(), - }) .execute(); console.log('Loading media content...'); diff --git a/src/shared/types/database.types.ts b/src/shared/types/database.types.ts index 5670e47..cc1599e 100644 --- a/src/shared/types/database.types.ts +++ b/src/shared/types/database.types.ts @@ -4,545 +4,235 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ +import { + attachmentField, + autoDateField, + autoNumberField, + checkboxField, + dateField, + defineTaylorSchema, + linkField, + numberField, + searchField, + selectField, + textField, +} from '@taylordb/query-builder'; +import type { InferTaylorDatabase } from '@taylordb/query-builder'; -interface FileInformation { - fieldname: string; - originalname: string; - encoding: string; - mimetype: string; - destination: string; - filename: string; - path: string; - size: number; - format: string; - width: number; - height: number; -} +export const taylorSchema = defineTaylorSchema({ + attachmentTable: { + id: autoNumberField(), + name: textField({ required: true }), + metadata: textField({ required: true }), + size: numberField({ required: true }), + fileType: textField({ required: true }), + url: textField({ required: true }), + searchText: searchField(), + }, + collaborators: { + id: autoNumberField(), + name: textField({ required: true }), + emailAddress: textField({ required: true }), + avatar: textField({ required: true }), + searchText: searchField(), + }, + vakansii: { + id: autoNumberField(), + createdAt: autoDateField(), + updatedAt: autoDateField(), + searchText: searchField(), + zagolovok: textField({ required: false }), + tip: selectField({ + required: false, + mode: 'single', + options: ['Офис', 'Заправки'] as const, + }), + lokaciya: selectField({ + required: false, + mode: 'single', + options: ['Душанбе'] as const, + }), + tegi: selectField({ + required: false, + mode: 'multi', + options: ['Полный день', 'Опыт от 1 года', 'Мужчины'] as const, + }), + }, + partnyory: { + id: autoNumberField(), + createdAt: autoDateField(), + updatedAt: autoDateField(), + searchText: searchField(), + nazvanie: textField({ required: false }), + tt: linkField({ + linkedTo: 'ff', + required: false + }), + izobrozhenie: attachmentField({ required: false }), + }, + azs: { + id: autoNumberField(), + createdAt: autoDateField(), + updatedAt: autoDateField(), + searchText: searchField(), + imya: textField({ required: false }), + adress: textField({ required: false }), + opisanie: textField({ required: false }), + chasyRaboty: selectField({ + required: false, + mode: 'single', + options: ['Круглосуточно'] as const, + }), + lat: textField({ required: false }), + long: textField({ required: false }), + avtomojka: checkboxField({ required: false }), + dt: checkboxField({ required: false }), + ai92: checkboxField({ required: false }), + ai95: checkboxField({ required: false }), + z100: checkboxField({ required: false }), + propan: checkboxField({ required: false }), + zaryadnayaStanciya: checkboxField({ required: false }), + miniMarket: checkboxField({ required: false }), + tualet: checkboxField({ required: false }), + region: selectField({ + required: false, + mode: 'single', + options: [ + 'Душанбе', + 'Бохтар', + 'Худжанд', + 'Регар', + 'Вахдат', + 'А.Джоми', + 'Обикиик', + 'Кулоб', + 'Дахана', + 'Ёвон', + 'Панч', + 'Исфара', + 'Мастчох', + 'Хисор', + ] as const, + }), + foto: attachmentField({ required: false }), + }, + akcii: { + id: autoNumberField(), + createdAt: autoDateField(), + updatedAt: autoDateField(), + searchText: searchField(), + zagolovok: textField({ required: false }), + opisanie: textField({ required: false }), + do: dateField({ required: false }), + foto: attachmentField({ required: false }), + }, + istoriyaKompanii: { + id: autoNumberField(), + createdAt: autoDateField(), + updatedAt: autoDateField(), + searchText: searchField(), + zagolovok: textField({ required: false }), + god: numberField({ required: false }), + opisanie: textField({ required: false }), + }, + komanda: { + id: autoNumberField(), + createdAt: autoDateField(), + updatedAt: autoDateField(), + searchText: searchField(), + polnoeImya: textField({ required: false }), + foto: attachmentField({ required: false }), + zvanie: textField({ required: false }), + }, + otzyvy: { + id: autoNumberField(), + createdAt: autoDateField(), + updatedAt: autoDateField(), + searchText: searchField(), + polnoeImya: textField({ required: false }), + otzyv: textField({ required: false }), + rejting: numberField({ required: false }), + status: selectField({ + required: false, + mode: 'single', + options: ['Опубликовано', 'Не публиковать'] as const, + }), + }, + tekstovyjKontentSajta: { + id: autoNumberField(), + createdAt: autoDateField(), + updatedAt: autoDateField(), + searchText: searchField(), + klyuchNeIzmenyat: textField({ required: true }), + znachenie: textField({ required: true }), + opisanie: selectField({ + required: false, + mode: 'multi', + options: [ + 'Общая', + 'Домашняя страница', + 'О нас', + 'Благотворительность', + 'Клиенты', + 'Почты', + 'Соц сети', + 'Карты', + 'Лояльность', + 'Авторизация', + 'Сертификаты', + 'Бонусный клиент', + 'Корпоративный клиент', + 'Транзакции', + ] as const, + }), + }, + sertifikaty: { + id: autoNumberField(), + createdAt: autoDateField(), + updatedAt: autoDateField(), + searchText: searchField(), + nazvanie: textField({ required: false }), + opisanie: textField({ required: false }), + dataVydachi: dateField({ required: false }), + dejstvitelenDo: dateField({ required: false }), + foto: attachmentField({ required: false }), + }, + mediaKontentSajta: { + id: autoNumberField(), + createdAt: autoDateField(), + updatedAt: autoDateField(), + searchText: searchField(), + mestopolozheniya: textField({ required: false }), + klyuchNeIzmenyat: textField({ required: true }), + foto: attachmentField({ required: false }), + stranica: selectField({ + required: false, + mode: 'single', + options: [ + 'Главная', + 'О нас', + 'Благотворительность', + 'Общая', + 'Клиенты', + 'Программа лояльности', + ] as const, + }), + }, + blagotvoritelnyjFond: { + id: autoNumberField(), + createdAt: autoDateField(), + updatedAt: autoDateField(), + searchText: searchField(), + zagolovok: textField({ required: false }), + opisanie: textField({ required: false }), + data: dateField({ required: false }), + lokaciya: textField({ required: false }), + foto: attachmentField({ required: false }), + }, +}); -interface UploadResponse { - collectionName: string; - fileInformation: FileInformation; - metadata: { - thumbnails: any[]; - clips: any[]; - }; - baseId: string; - storageAdaptor: string; - _id: string; - __v: number; -} - -export interface AttachmentColumnValue { - url: string; - fileType: string; - size: number; -} - -export class Attachment { - public readonly collectionName: string; - public readonly fileInformation: FileInformation; - public readonly metadata: { thumbnails: any[]; clips: any[] }; - public readonly baseId: string; - public readonly storageAdaptor: string; - public readonly _id: string; - - constructor(data: UploadResponse) { - this.collectionName = data.collectionName; - this.fileInformation = data.fileInformation; - this.metadata = data.metadata; - this.baseId = data.baseId; - this.storageAdaptor = data.storageAdaptor; - this._id = data._id; - } - - toColumnValue(): AttachmentColumnValue { - return { - url: this.fileInformation.path, - fileType: this.fileInformation.mimetype, - size: this.fileInformation.size, - }; - } -} - -type IsWithinOperatorValue = - | 'pastWeek' - | 'pastMonth' - | 'pastYear' - | 'nextWeek' - | 'nextMonth' - | 'nextYear' - | 'daysFromNow' - | 'daysAgo' - | 'currentWeek' - | 'currentMonth' - | 'currentYear'; - -type DefaultDateFilterValue = - | ( - | 'today' - | 'tomorrow' - | 'yesterday' - | 'oneWeekAgo' - | 'oneWeekFromNow' - | 'oneMonthAgo' - | 'oneMonthFromNow' - ) - | ['exactDay' | 'exactTimestamp', string] - | ['daysAgo' | 'daysFromNow', number]; - -type DateFilters = { - '=': DefaultDateFilterValue; - '!=': DefaultDateFilterValue; - '<': DefaultDateFilterValue; - '>': DefaultDateFilterValue; - '<=': DefaultDateFilterValue; - '>=': DefaultDateFilterValue; - isWithIn: - | IsWithinOperatorValue - | { value: 'daysAgo' | 'daysFromNow'; date: number }; - isEmpty: boolean; - isNotEmpty: boolean; -}; - -type DateAggregations = { - empty: number; - filled: number; - unique: number; - percentEmpty: number; - percentFilled: number; - percentUnique: number; - min: number | null; - max: number | null; - daysRange: number | null; - monthRange: number | null; -}; - -type TextFilters = { - '=': string; - '!=': string; - caseEqual: string; - hasAnyOf: string[]; - contains: string; - startsWith: string; - endsWith: string; - doesNotContain: string; - isEmpty: never; - isNotEmpty: never; -}; - -type LinkFilters = { - hasAnyOf: number[]; - hasAllOf: number[]; - isExactly: number[]; - '=': number; - hasNoneOf: number[]; - contains: string; - doesNotContain: string; - isEmpty: never; - isNotEmpty: never; -}; - -type SelectFilters = { - hasAnyOf: O[number][]; - hasAllOf: O[number][]; - isExactly: O[number][]; - '=': O[number]; - hasNoneOf: O[number][]; - contains: string; - doesNotContain: string; - isEmpty: never; - isNotEmpty: never; -}; - -type LinkAggregations = { - empty: number; - filled: number; - percentEmpty: number; - percentFilled: number; -}; - -type NumberFilters = { - '=': number; - '!=': number; - '>': number; - '>=': number; - '<': number; - '<=': number; - hasAnyOf: number[]; - hasNoneOf: number[]; - isEmpty: never; - isNotEmpty: never; -}; - -type NumberAggregations = { - sum: number; - average: number; - median: number; - min: number | null; - max: number | null; - range: number; - standardDeviation: number; - histogram: Record; - empty: number; - filled: number; - unique: number; - percentEmpty: number; - percentFilled: number; - percentUnique: number; -}; - -type CheckboxFilters = { - '=': number; -}; - -/** - * - * Column types - * - */ -export type ColumnType< - S, - U, - I, - R extends boolean, - F extends { [key: string]: any } = object, - A extends { [key: string]: any } = object, -> = { - raw: S; - insert: I; - update: U; - filters: F; - aggregations: A; - isRequired: R; -}; - -export type DateColumnType = ColumnType< - string, - string, - string, - R, - DateFilters, - DateAggregations ->; - -export type TextColumnType = ColumnType< - string, - string, - string, - R, - TextFilters ->; - -export type ALinkColumnType< - T extends string, - S, - U, - I, - R extends boolean, - F extends { [key: string]: any } = LinkFilters, - A extends LinkAggregations = LinkAggregations, -> = ColumnType & { - linkedTo: T; -}; - -export type LinkColumnType< - T extends string, - R extends boolean, -> = ALinkColumnType< - T, - object, - number | number[] | { newIds: number[]; deletedIds: number[] }, - number | number[], - R ->; - -export type AttachmentColumnType = ALinkColumnType< - 'attachmentTable', - AttachmentColumnValue[], - Attachment[] | { newIds: number[]; deletedIds: number[] } | number[], - Attachment[] | number[], - R ->; - -export type NumberColumnType = ColumnType< - number, - number, - number, - R, - NumberFilters, - NumberAggregations ->; - -export type CheckboxColumnType = ColumnType< - boolean, - boolean, - boolean, - R, - CheckboxFilters ->; - -export type AutoGeneratedNumberColumnType = ColumnType< - number, - never, - never, - false, - NumberFilters, - NumberAggregations ->; - -export type AutoGeneratedDateColumnType = ColumnType< - string, - never, - never, - false, - DateFilters, - DateAggregations ->; - -export type SingleSelectColumnType< - O extends readonly string[], - R extends boolean, -> = ALinkColumnType< - 'selectTable', - O[number], - O[number] | O[number][], - O[number] | O[number][], - R, - SelectFilters ->; - -export type TableRaws = { - [K in keyof TaylorDatabase[T]]: TaylorDatabase[T][K] extends ColumnType< - infer S, - any, - any, - infer R, - any, - any - > - ? R extends true - ? S - : S | undefined - : never; -}; - -export type TableInserts = { - [K in keyof TaylorDatabase[T]]: TaylorDatabase[T][K] extends ColumnType< - any, - infer I, - any, - infer R, - any, - any - > - ? R extends true - ? I - : I | undefined - : never; -}; - -export type TableUpdates = { - [K in keyof TaylorDatabase[T]]: TaylorDatabase[T][K] extends ColumnType< - any, - any, - infer U, - any, - any, - any - > - ? U - : never; -}; - -export type SelectTable = { - id: AutoGeneratedNumberColumnType; - name: TextColumnType; - color: TextColumnType; -}; - -export type AttachmentTable = { - id: AutoGeneratedNumberColumnType; - name: TextColumnType; - metadata: TextColumnType; - size: NumberColumnType; - fileType: TextColumnType; - url: TextColumnType; -}; - -export type CollaboratorsTable = { - id: AutoGeneratedNumberColumnType; - name: TextColumnType; - emailAddress: TextColumnType; - avatar: TextColumnType; -}; - -export type TaylorDatabase = { - /** - * - * - * Internal tables, these tables can not be queried directly. - * - */ - selectTable: SelectTable; - attachmentTable: AttachmentTable; - collaboratorsTable: CollaboratorsTable; - vakansii: VakansiiTable; - partnyory: PartnyoryTable; - azs: AzsTable; - akcii: AkciiTable; - istoriyaKompanii: IstoriyaKompaniiTable; - komanda: KomandaTable; - otzyvy: OtzyvyTable; - tekstovyjKontentSajta: TekstovyjKontentSajtaTable; - sertifikaty: SertifikatyTable; - mediaKontentSajta: MediaKontentSajtaTable; - blagotvoritelnyjFond: BlagotvoritelnyjFondTable; -}; - -export const VakansiiTipOptions = ['Офис', 'Заправки'] as const; -export const VakansiiLokaciyaOptions = ['Душанбе'] as const; - -type VakansiiTable = { - id: NumberColumnType; - createdAt: AutoGeneratedDateColumnType; - updatedAt: AutoGeneratedDateColumnType; - zagolovok: TextColumnType; - tip: SingleSelectColumnType; - lokaciya: SingleSelectColumnType; - tegi: LinkColumnType<'selectTable', false>; -}; -type PartnyoryTable = { - id: NumberColumnType; - createdAt: AutoGeneratedDateColumnType; - updatedAt: AutoGeneratedDateColumnType; - nazvanie: TextColumnType; - izobrozhenie: AttachmentColumnType; -}; - -export const AzsChasyRabotyOptions = ['Круглосуточно'] as const; -export const AzsRegionOptions = [ - 'Душанбе', - 'Бохтар', - 'Худжанд', - 'Регар', - 'Вахдат', - 'А.Джоми', - 'Обикиик', - 'Кулоб', - 'Дахана', - 'Ёвон', - 'Панч', - 'Исфара', - 'Мастчох', - 'Хисор', -] as const; - -type AzsTable = { - id: NumberColumnType; - createdAt: AutoGeneratedDateColumnType; - updatedAt: AutoGeneratedDateColumnType; - imya: TextColumnType; - adress: TextColumnType; - opisanie: TextColumnType; - chasyRaboty: SingleSelectColumnType; - lat: TextColumnType; - long: TextColumnType; - avtomojka: CheckboxColumnType; - dt: CheckboxColumnType; - ai92: CheckboxColumnType; - ai95: CheckboxColumnType; - z100: CheckboxColumnType; - propan: CheckboxColumnType; - zaryadnayaStanciya: CheckboxColumnType; - miniMarket: CheckboxColumnType; - tualet: CheckboxColumnType; - region: SingleSelectColumnType; - foto: AttachmentColumnType; -}; -type AkciiTable = { - id: NumberColumnType; - createdAt: AutoGeneratedDateColumnType; - updatedAt: AutoGeneratedDateColumnType; - zagolovok: TextColumnType; - opisanie: TextColumnType; - do: DateColumnType; - foto: AttachmentColumnType; -}; -type IstoriyaKompaniiTable = { - id: NumberColumnType; - createdAt: AutoGeneratedDateColumnType; - updatedAt: AutoGeneratedDateColumnType; - zagolovok: TextColumnType; - god: NumberColumnType; - opisanie: TextColumnType; -}; -type KomandaTable = { - id: NumberColumnType; - createdAt: AutoGeneratedDateColumnType; - updatedAt: AutoGeneratedDateColumnType; - polnoeImya: TextColumnType; - foto: AttachmentColumnType; - zvanie: TextColumnType; -}; - -export const OtzyvyStatusOptions = ['Опубликовано', 'Не публиковать'] as const; - -type OtzyvyTable = { - id: NumberColumnType; - createdAt: AutoGeneratedDateColumnType; - updatedAt: AutoGeneratedDateColumnType; - polnoeImya: TextColumnType; - otzyv: TextColumnType; - rejting: NumberColumnType; - status: SingleSelectColumnType; -}; -type TekstovyjKontentSajtaTable = { - id: NumberColumnType; - createdAt: AutoGeneratedDateColumnType; - updatedAt: AutoGeneratedDateColumnType; - klyuchNeIzmenyat: TextColumnType; - znachenie: TextColumnType; - opisanie: LinkColumnType<'selectTable', false>; -}; -type SertifikatyTable = { - id: NumberColumnType; - createdAt: AutoGeneratedDateColumnType; - updatedAt: AutoGeneratedDateColumnType; - nazvanie: TextColumnType; - opisanie: TextColumnType; - dataVydachi: DateColumnType; - dejstvitelenDo: DateColumnType; - foto: AttachmentColumnType; -}; - -export const MediaKontentSajtaStranicaOptions = [ - 'Главная', - 'О нас', - 'Благотворительность', - 'Общая', - 'Клиенты', - 'Программа лояльности', -] as const; - -type MediaKontentSajtaTable = { - id: NumberColumnType; - createdAt: AutoGeneratedDateColumnType; - updatedAt: AutoGeneratedDateColumnType; - mestopolozheniya: TextColumnType; - klyuchNeIzmenyat: TextColumnType; - foto: AttachmentColumnType; - stranica: SingleSelectColumnType< - typeof MediaKontentSajtaStranicaOptions, - false - >; -}; -type BlagotvoritelnyjFondTable = { - id: NumberColumnType; - createdAt: AutoGeneratedDateColumnType; - updatedAt: AutoGeneratedDateColumnType; - zagolovok: TextColumnType; - opisanie: TextColumnType; - data: DateColumnType; - lokaciya: TextColumnType; - foto: AttachmentColumnType; +/** Generic type for plugin actions */ +export type PluginActionType = { input: I; result: O }; +export type TaylorDatabase = InferTaylorDatabase & { + _plugins: {}; };