From 59d121db2c9629838b739fcca3e358f45f6a7556 Mon Sep 17 00:00:00 2001 From: Toby Nguyen <208221158+tobynguyen27@users.noreply.github.com> Date: Mon, 23 Feb 2026 13:33:31 +0700 Subject: [PATCH 1/2] chore: replace valibot with arktype --- .vscode/settings.json | 1 + apps/frontend/package.json | 2 +- .../app/components/form/QrGeneratorForm.vue | 14 ++--- .../app/components/form/UrlShortenerForm.vue | 54 +++++++------------ pnpm-lock.yaml | 35 ++++++++++-- 5 files changed, 61 insertions(+), 45 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index aade13c..5e70447 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -15,6 +15,7 @@ "files.associations": { "*.css": "tailwindcss" }, + "typescript.preferences.autoImportSpecifierExcludeRegexes": ["^(node:)?os$"], "tailwindCSS.classAttributes": ["class", "ui"], "tailwindCSS.experimental.classRegex": [["ui:\\s*{([^)]*)\\s*}", "(?:'|\"|`)([^']*)(?:'|\"|`)"]] diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 2b29eb5..c89b210 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -16,12 +16,12 @@ "@nuxt/ui": "^4.4.0", "@nuxtjs/seo": "^3.4.0", "@vueuse/integrations": "^14.2.1", + "arktype": "^2.1.29", "dayjs": "^1.11.19", "nuxt": "^4.3.1", "qrcode": "^1.5.4", "tailwindcss": "^4.2.0", "ufo": "^1.6.3", - "valibot": "^1.2.0", "vue": "^3.5.28", "vue-router": "^4.6.4" }, diff --git a/apps/frontend/src/app/components/form/QrGeneratorForm.vue b/apps/frontend/src/app/components/form/QrGeneratorForm.vue index d601dfa..483a8e6 100644 --- a/apps/frontend/src/app/components/form/QrGeneratorForm.vue +++ b/apps/frontend/src/app/components/form/QrGeneratorForm.vue @@ -1,20 +1,22 @@ + + diff --git a/apps/frontend/src/app/pages/[shortCode].vue b/apps/frontend/src/app/pages/[shortCode].vue index 438c8e1..ca7e126 100644 --- a/apps/frontend/src/app/pages/[shortCode].vue +++ b/apps/frontend/src/app/pages/[shortCode].vue @@ -10,13 +10,22 @@ const shortCode = route.params.shortCode!.toString(); const { data, error } = await useAsyncData(() => urlRepository.getLongUrl({ shortCode })); if (error.value) { - const e = error.value.data as { error: string; message: string }; - - throw createError({ - statusCode: error.value?.status || 500, - statusMessage: e.error || "Internal Server Error", - message: e.message || "Failed to resolve short URL", - }); + if (error.value.status == 401) { + await navigateTo({ + path: "/unlock", + query: { + c: shortCode, + }, + }); + } else { + const e = error.value.data as { title: string; detail: string }; + + throw createError({ + statusCode: error.value?.status || 500, + statusMessage: e.title || "Internal Server Error", + message: e.detail || "Failed to resolve short URL", + }); + } } const originalUrl = data.value as string; @@ -29,65 +38,10 @@ if (isSecure) { redirectCode: 302, }); } - -const forceHttps = () => { - const secureUrl = originalUrl.replace(/^http:/, "https:"); - navigateTo(secureUrl, { external: true }); -}; - -const acceptRisk = () => { - navigateTo(originalUrl, { external: true }); -}; diff --git a/apps/frontend/src/app/pages/unlock.vue b/apps/frontend/src/app/pages/unlock.vue new file mode 100644 index 0000000..fbf2100 --- /dev/null +++ b/apps/frontend/src/app/pages/unlock.vue @@ -0,0 +1,91 @@ + + +