From ae243559da851b327a0204c010f86ae14d292115 Mon Sep 17 00:00:00 2001 From: Derock Date: Sat, 20 Apr 2024 19:53:21 -0400 Subject: [PATCH] feat: cool source page, wip on other stuff --- package.json | 4 + pnpm-lock.yaml | 223 +++++++++++++++++- .../advanced/DeploymentSettings.tsx | 32 ++- .../source/_components/BuildMethod.tsx | 100 ++++++++ .../source/_components/GitHubRepoPreview.tsx | 205 ++++++++++++++++ .../source/_components/SourceGitHub.tsx | 51 ++++ .../service/[serviceId]/source/page.tsx | 206 +++++++++++++++- src/components/ui/radio-group.tsx | 44 ++++ src/components/ui/select.tsx | 70 +++--- src/components/ui/tabs.tsx | 6 +- .../routers/projects/service/containers.ts | 60 +++-- .../api/routers/projects/service/update.ts | 7 + src/server/db/schema.ts | 23 +- src/server/db/types.ts | 6 + src/server/utils/serverUtils.ts | 51 +--- 15 files changed, 959 insertions(+), 129 deletions(-) create mode 100644 src/app/(dashboard)/project/[projectId]/service/[serviceId]/source/_components/BuildMethod.tsx create mode 100644 src/app/(dashboard)/project/[projectId]/service/[serviceId]/source/_components/GitHubRepoPreview.tsx create mode 100644 src/app/(dashboard)/project/[projectId]/service/[serviceId]/source/_components/SourceGitHub.tsx create mode 100644 src/components/ui/radio-group.tsx diff --git a/package.json b/package.json index 27fd938..03e26a1 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ }, "dependencies": { "@hookform/resolvers": "^3.3.4", + "@libsql/client": "^0.6.0", "@mantine/form": "^7.4.0", "@nicktomlin/codemirror-lang-yaml-lite": "^0.0.3", "@radix-ui/react-checkbox": "^1.0.4", @@ -25,6 +26,7 @@ "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-radio-group": "^1.1.3", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", @@ -48,6 +50,7 @@ "cookie": "^0.6.0", "date-fns": "^3.0.6", "docker-cli-js": "^2.10.0", + "docker-modem": "^5.0.3", "dockerode": "^4.0.2", "dotenv": "^16.3.1", "drizzle-orm": "^0.29.3", @@ -73,6 +76,7 @@ "trpc-openapi": "^1.2.0", "ts-permissions": "^1.0.0", "ua-parser-js": "^1.0.37", + "use-debounce": "^10.0.0", "uuidv7": "^0.6.3", "winston": "^3.11.0", "ws": "^8.16.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 005cd8e..59d4ef4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ dependencies: '@hookform/resolvers': specifier: ^3.3.4 version: 3.3.4(react-hook-form@7.49.2) + '@libsql/client': + specifier: ^0.6.0 + version: 0.6.0(bufferutil@4.0.8) '@mantine/form': specifier: ^7.4.0 version: 7.4.0(react@18.2.0) @@ -29,6 +32,9 @@ dependencies: '@radix-ui/react-label': specifier: ^2.0.2 version: 2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-radio-group': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-select': specifier: ^2.0.0 version: 2.0.0(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) @@ -98,6 +104,9 @@ dependencies: docker-cli-js: specifier: ^2.10.0 version: 2.10.0 + docker-modem: + specifier: ^5.0.3 + version: 5.0.3 dockerode: specifier: ^4.0.2 version: 4.0.2 @@ -106,7 +115,7 @@ dependencies: version: 16.3.1 drizzle-orm: specifier: ^0.29.3 - version: 0.29.3(@types/better-sqlite3@7.6.8)(@types/react@18.2.46)(better-sqlite3@9.2.2)(react@18.2.0) + version: 0.29.3(@libsql/client@0.6.0)(@types/better-sqlite3@7.6.8)(@types/react@18.2.46)(better-sqlite3@9.2.2)(react@18.2.0) drizzle-zod: specifier: ^0.5.1 version: 0.5.1(drizzle-orm@0.29.3)(zod@3.22.4) @@ -173,6 +182,9 @@ dependencies: ua-parser-js: specifier: ^1.0.37 version: 1.0.37 + use-debounce: + specifier: ^10.0.0 + version: 10.0.0(react@18.2.0) uuidv7: specifier: ^0.6.3 version: 0.6.3 @@ -1526,6 +1538,106 @@ packages: '@lezer/lr': 1.4.0 dev: false + /@libsql/client@0.6.0(bufferutil@4.0.8): + resolution: {integrity: sha512-qhQzTG/y2IEVbL3+9PULDvlQFWJ/RnjFXECr/Nc3nRngGiiMysDaOV5VUzYk7DulUX98EA4wi+z3FspKrUplUA==} + dependencies: + '@libsql/core': 0.6.0 + '@libsql/hrana-client': 0.6.0(bufferutil@4.0.8) + js-base64: 3.7.7 + libsql: 0.3.16 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@libsql/core@0.6.0: + resolution: {integrity: sha512-affAB8vSqQwqI9NBDJ5uJCVaHoOAS2pOpbv1kWConh1SBbmJBnHHd4KG73RAJ2sgd2+NbT9WA+XJBqxgp28YSw==} + dependencies: + js-base64: 3.7.7 + dev: false + + /@libsql/darwin-arm64@0.3.16: + resolution: {integrity: sha512-GPQGCulqknc4BnluNuBDK55wwAah9j3KCsRQPAAbz1XsGrPyWgXOyID6e6wNk4ZPXCFOdLs9OCUsJH6hT6dwlQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/darwin-x64@0.3.16: + resolution: {integrity: sha512-SXomcHsQSw5W/g0kZsiE3qNo/r4R1FAxfXoR6PgFOiFD85r7iUm+dRBcXwqtftiUanDlbhhrENhBPY0zuLoSfA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/hrana-client@0.6.0(bufferutil@4.0.8): + resolution: {integrity: sha512-k+fqzdjqg3IvWfKmVJK5StsbjeTcyNAXFelUbXbGNz3yH1gEVT9mZ6kmhsIXP30ZSyVV0AE1Gi25p82mxC9hwg==} + dependencies: + '@libsql/isomorphic-fetch': 0.2.1 + '@libsql/isomorphic-ws': 0.1.5(bufferutil@4.0.8) + js-base64: 3.7.7 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@libsql/isomorphic-fetch@0.2.1: + resolution: {integrity: sha512-Sv07QP1Aw8A5OOrmKgRUBKe2fFhF2hpGJhtHe3d1aRnTESZCGkn//0zDycMKTGamVWb3oLYRroOsCV8Ukes9GA==} + dev: false + + /@libsql/isomorphic-ws@0.1.5(bufferutil@4.0.8): + resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} + dependencies: + '@types/ws': 8.5.10 + ws: 8.16.0(bufferutil@4.0.8) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@libsql/linux-arm64-gnu@0.3.16: + resolution: {integrity: sha512-pvXyj0THb/y7P9mRl263ouEsQUaOPAw+dlKJZ3NDzinDImSr1JsPtgsftEAGJx2Y7qajbMAkor72uwQNj927/A==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-arm64-musl@0.3.16: + resolution: {integrity: sha512-IfNkwH1TJWnCys+1NFz8j7Hto3N5KTYuCQ/EshIhUiQSzx00aNEor+5cZMr1CCK2Vw+Pdog5zKyvWKNHqUwnyw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-gnu@0.3.16: + resolution: {integrity: sha512-O2OURkYa0jb2nGTjPpGWU5oTyj6DmBsB0dDCx/Y5wThpNLM5kbHRpXyyz8QdTE9PW5oM1zn9ij8kUYhgFDfCaQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-musl@0.3.16: + resolution: {integrity: sha512-D+4uS9HdHIAHgn3KvH9aJSJOv4Zi80ccfCFVFVbJESJ/0pdqyJVBZGzHYyuw59ol0xZAgfcxIFSriyAragbhEA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/win32-x64-msvc@0.3.16: + resolution: {integrity: sha512-/+n2ibxYs6C1GHQbmkdeCPlw7QhAJJb4XOAEzvfk069lelk8f26MHrodJJiRBBJczmwUl4HNwDjR4HT2+k9ljw==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@mantine/form@7.4.0(react@18.2.0): resolution: {integrity: sha512-JI/o2nECWct/Kvn3GF6VplHyJeaLy0q/jGNEB/F4yt12mAYBsux6vPfAhpWrKKZ8Jt31RI+ikn6R4UcY1HGIAw==} peerDependencies: @@ -1562,6 +1674,10 @@ packages: glob-to-regexp: 0.3.0 dev: true + /@neon-rs/load@0.0.4: + resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} + dev: false + /@next/env@14.0.4: resolution: {integrity: sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==} dev: false @@ -2135,6 +2251,36 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-radio-group@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.9 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: @@ -2952,7 +3098,6 @@ packages: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: '@types/node': 20.10.6 - dev: true /@typescript-eslint/eslint-plugin@6.17.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==} @@ -4030,6 +4175,11 @@ packages: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: false + /date-fns@3.0.6: resolution: {integrity: sha512-W+G99rycpKMMF2/YD064b2lE7jJGUe+EjOES7Q8BIGY8sbNdbgcs9XFTZwvzc9Jx1f3k7LB7gZaZa7f8Agzljg==} dev: false @@ -4286,7 +4436,7 @@ packages: - supports-color dev: true - /drizzle-orm@0.29.3(@types/better-sqlite3@7.6.8)(@types/react@18.2.46)(better-sqlite3@9.2.2)(react@18.2.0): + /drizzle-orm@0.29.3(@libsql/client@0.6.0)(@types/better-sqlite3@7.6.8)(@types/react@18.2.46)(better-sqlite3@9.2.2)(react@18.2.0): resolution: {integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' @@ -4357,6 +4507,7 @@ packages: sqlite3: optional: true dependencies: + '@libsql/client': 0.6.0(bufferutil@4.0.8) '@types/better-sqlite3': 7.6.8 '@types/react': 18.2.46 better-sqlite3: 9.2.2 @@ -4369,7 +4520,7 @@ packages: drizzle-orm: '>=0.23.13' zod: '*' dependencies: - drizzle-orm: 0.29.3(@types/better-sqlite3@7.6.8)(@types/react@18.2.46)(better-sqlite3@9.2.2)(react@18.2.0) + drizzle-orm: 0.29.3(@libsql/client@0.6.0)(@types/better-sqlite3@7.6.8)(@types/react@18.2.46)(better-sqlite3@9.2.2)(react@18.2.0) zod: 3.22.4 dev: false @@ -5035,6 +5186,14 @@ packages: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} dev: false + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + dev: false + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5105,6 +5264,13 @@ packages: cross-spawn: 7.0.3 signal-exit: 4.1.0 + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: false + /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true @@ -5892,6 +6058,10 @@ packages: engines: {node: '>=10'} dev: true + /js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + dev: false + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -6018,6 +6188,23 @@ packages: type-check: 0.4.0 dev: true + /libsql@0.3.16: + resolution: {integrity: sha512-pIv3hP+W0bHTyjg56H5O3D45RP1BGcs0jnSOCk8PQ41nlPpVG3+sG9AG9Vc2NcnvFKuL02gGPFLzvbBe8AQjgg==} + cpu: [x64, arm64, wasm32] + os: [darwin, linux, win32] + dependencies: + '@neon-rs/load': 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + '@libsql/darwin-arm64': 0.3.16 + '@libsql/darwin-x64': 0.3.16 + '@libsql/linux-arm64-gnu': 0.3.16 + '@libsql/linux-arm64-musl': 0.3.16 + '@libsql/linux-x64-gnu': 0.3.16 + '@libsql/linux-x64-musl': 0.3.16 + '@libsql/win32-x64-msvc': 0.3.16 + dev: false + /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -6442,6 +6629,11 @@ packages: resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} dev: false + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + /node-fetch-native@1.6.1: resolution: {integrity: sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==} dev: false @@ -6458,6 +6650,15 @@ packages: whatwg-url: 5.0.0 dev: false + /node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + /node-gyp-build@4.7.1: resolution: {integrity: sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==} hasBin: true @@ -8294,6 +8495,15 @@ packages: tslib: 2.6.2 dev: false + /use-debounce@10.0.0(react@18.2.0): + resolution: {integrity: sha512-XRjvlvCB46bah9IBXVnq/ACP2lxqXyZj0D9hj4K5OzNroMDpTEBg8Anuh1/UfRTRs7pLhQ+RiNxxwZu9+MVl1A==} + engines: {node: '>= 16.0.0'} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + /use-sidecar@1.1.2(@types/react@18.2.46)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} @@ -8361,6 +8571,11 @@ packages: graceful-fs: 4.2.11 dev: false + /web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + dev: false + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false diff --git a/src/app/(dashboard)/project/[projectId]/service/[serviceId]/advanced/DeploymentSettings.tsx b/src/app/(dashboard)/project/[projectId]/service/[serviceId]/advanced/DeploymentSettings.tsx index 9eb3645..a11f7c0 100644 --- a/src/app/(dashboard)/project/[projectId]/service/[serviceId]/advanced/DeploymentSettings.tsx +++ b/src/app/(dashboard)/project/[projectId]/service/[serviceId]/advanced/DeploymentSettings.tsx @@ -30,6 +30,9 @@ const formValidator = z.object({ zeroDowntime: z.boolean(), entrypoint: z.string().optional().nullable(), command: z.string().optional().nullable(), + + max_memory: z.string().optional(), + max_cpu: z.coerce.number().optional(), }); export default function DeploymentSettings({ @@ -46,6 +49,8 @@ export default function DeploymentSettings({ zeroDowntime: service.zeroDowntime, entrypoint: service.entrypoint, command: service.command, + max_memory: service.max_memory, + max_cpu: service.max_cpu, }, }); @@ -53,11 +58,15 @@ export default function DeploymentSettings({
{ - return update.mutateAsync({ - serviceId: service.id, - projectId: service.projectId, - ...data, - }); + try { + await update.mutateAsync({ + serviceId: service.id, + projectId: service.projectId, + ...data, + }); + + form.reset(data, { keepValues: true, keepDirty: false }); + } catch (error) {} })} className="grid grid-cols-2 gap-4" > @@ -139,14 +148,21 @@ export default function DeploymentSettings({ render={({ field }) => } /> - {/*

Resource Limits

+

Resource Limits and Reservations

*/} + description="The maximum amount of memory that this service can use. Set to `0` for no limit. Example: 512M, 4G" + /> + + diff --git a/src/app/(dashboard)/project/[projectId]/service/[serviceId]/source/_components/BuildMethod.tsx b/src/app/(dashboard)/project/[projectId]/service/[serviceId]/source/_components/BuildMethod.tsx new file mode 100644 index 0000000..259e3f5 --- /dev/null +++ b/src/app/(dashboard)/project/[projectId]/service/[serviceId]/source/_components/BuildMethod.tsx @@ -0,0 +1,100 @@ +"use client"; + +import { useFormContext, type UseFormReturn } from "react-hook-form"; +import { type z } from "zod"; +import { Label } from "~/components/ui/label"; +import { SimpleFormField } from "~/hooks/forms"; +import { ServiceBuildMethod } from "~/server/db/types"; +import { type formValidator } from "../page"; + +export default function SourceBuildMethod() { + const form = useFormContext>(); + const selected = form.watch("buildMethod"); + + return ( + <> +
+ + +
+ + + + + +
+
+ + + + ); +} + +function RadioOption({ + form, + title, + description, + value, +}: { + form: UseFormReturn>; + title: string; + description: string; + value: ServiceBuildMethod; +}) { + const selected = form.watch("buildMethod") === value; + + return ( +
{ + form.setValue("buildMethod", value, { shouldDirty: true }); + }} + > +