From ed47404862f43582f0279f649a1ef8ab020c9d4f Mon Sep 17 00:00:00 2001 From: constantly-dev Date: Thu, 19 Mar 2026 16:39:14 +0900 Subject: [PATCH 1/9] =?UTF-8?q?feat:=20VITE=5FGOOGLE=5FREDIRECT=5FURI=20?= =?UTF-8?q?=ED=95=98=EB=82=98=EB=A1=9C=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/client/src/pages/onBoarding/GoogleCallback.tsx | 4 +--- apps/client/src/shared/utils/handleGoogleLogin.ts | 5 ++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/apps/client/src/pages/onBoarding/GoogleCallback.tsx b/apps/client/src/pages/onBoarding/GoogleCallback.tsx index a742e7fe..b4d03e64 100644 --- a/apps/client/src/pages/onBoarding/GoogleCallback.tsx +++ b/apps/client/src/pages/onBoarding/GoogleCallback.tsx @@ -46,9 +46,7 @@ const GoogleCallback = () => { } }; - const redirectUri = import.meta.env.PROD - ? import.meta.env.VITE_GOOGLE_REDIRECT_URI_PROD - : import.meta.env.VITE_GOOGLE_REDIRECT_URI_DEV; + const redirectUri = import.meta.env.VITE_GOOGLE_REDIRECT_URI; const loginWithCode = async (code: string) => { try { diff --git a/apps/client/src/shared/utils/handleGoogleLogin.ts b/apps/client/src/shared/utils/handleGoogleLogin.ts index 8b0ff14b..f70ac974 100644 --- a/apps/client/src/shared/utils/handleGoogleLogin.ts +++ b/apps/client/src/shared/utils/handleGoogleLogin.ts @@ -1,14 +1,13 @@ export const handleGoogleLogin = () => { const clientId = import.meta.env.VITE_GOOGLE_CLIENT_ID; - const redirectUri = import.meta.env.PROD - ? import.meta.env.VITE_GOOGLE_REDIRECT_URI_PROD - : import.meta.env.VITE_GOOGLE_REDIRECT_URI_DEV; + const redirectUri = import.meta.env.VITE_GOOGLE_REDIRECT_URI; if (!clientId || !redirectUri) { alert('Google OAuth 설정이 누락되었습니다.'); return; } + const googleAuthUrl = `https://accounts.google.com/o/oauth2/v2/auth?` + `client_id=${clientId}` + From cf4b2fda3fa8925a94dd3a45d78d48ea9fddfc28 Mon Sep 17 00:00:00 2001 From: constantly-dev Date: Thu, 19 Mar 2026 16:40:57 +0900 Subject: [PATCH 2/9] =?UTF-8?q?feat:=20extension=20build=20dev=EC=99=80=20?= =?UTF-8?q?prod=20=ED=99=98=EA=B2=BD=20=EB=B6=84=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20script,=20turbo.json=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/extension/.gitignore | 2 ++ apps/extension/package.json | 8 +++++--- package.json | 8 +++++--- turbo.json | 11 +++++++++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/apps/extension/.gitignore b/apps/extension/.gitignore index 800f3a80..7a22cca6 100644 --- a/apps/extension/.gitignore +++ b/apps/extension/.gitignore @@ -15,8 +15,10 @@ # misc .DS_Store .env.local +.env.development .env.development.local .env.test.local +.env.production .env.production.local npm-debug.log* diff --git a/apps/extension/package.json b/apps/extension/package.json index f1f7715f..471df6c9 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -4,11 +4,13 @@ "private": true, "type": "module", "scripts": { - "dev": "vite", - "build": "tsc -b && vite build", + "dev": "vite --mode development", + "build:dev": "tsc -b && vite build --mode development", + "build:prod": "tsc -b && vite build --mode production", + "build": "yarn build:prod", "lint": "eslint .", "format": "prettier -w .", - "zip": "vite build && node scripts/zip.mjs" + "zip": "yarn build:prod && node scripts/zip.mjs" }, "dependencies": { "@pinback/contracts": "workspace:*", diff --git a/package.json b/package.json index b4d1c485..73cec766 100644 --- a/package.json +++ b/package.json @@ -3,14 +3,16 @@ "private": true, "scripts": { "build": "turbo run build", + "build:dev": "turbo run build:dev --filter=@pinback/extension", + "build:prod": "turbo run build:prod --filter=@pinback/extension", + "build-storybook": "storybook build", "dev": "turbo run dev", "dev:client": "turbo run dev --filter=@pinback/client", + "storybook": "storybook dev -p 6006", "lint": "turbo run lint", "format": "prettier --write \"**/*.{ts,tsx,md}\"", "check-types": "turbo run check-types", - "test": "turbo run test", - "storybook": "storybook dev -p 6006", - "build-storybook": "storybook build" + "test": "turbo run test" }, "devDependencies": { "@chromatic-com/storybook": "^4.1.1", diff --git a/turbo.json b/turbo.json index e8616fb8..f040fdaa 100644 --- a/turbo.json +++ b/turbo.json @@ -7,6 +7,17 @@ "inputs": ["$TURBO_DEFAULT$", ".env*", "!.env.sample"], "outputs": [".next/**", "!.next/cache/**", "dist/**"] }, + + "build:dev": { + "dependsOn": ["^build"], + "inputs": ["$TURBO_DEFAULT$", ".env*", "!.env.sample"], + "outputs": ["dist/**"] + }, + "build:prod": { + "dependsOn": ["^build"], + "inputs": ["$TURBO_DEFAULT$", ".env*", "!.env.sample"], + "outputs": ["dist/**"] + }, "dev": { "cache": false, "persistent": true From 63aa58c8d895c5d247326e2685d927d0f7fccab3 Mon Sep 17 00:00:00 2001 From: constantly-dev Date: Thu, 19 Mar 2026 16:41:47 +0900 Subject: [PATCH 3/9] =?UTF-8?q?feat:=20extension=20build=20=EC=8B=9C?= =?UTF-8?q?=EC=A0=90=EC=97=90=20dev,=20prod=EA=B0=80=20name=20env=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=EC=9C=BC=EB=A1=9C=20=EB=82=98=EB=89=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=95=B1=20=EB=B6=84=EB=A6=AC=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/extension/src/vite-env.d.ts | 3 ++ apps/extension/vite.config.ts | 70 +++++++++++++++++++------------- 2 files changed, 45 insertions(+), 28 deletions(-) create mode 100644 apps/extension/src/vite-env.d.ts diff --git a/apps/extension/src/vite-env.d.ts b/apps/extension/src/vite-env.d.ts new file mode 100644 index 00000000..ffefc447 --- /dev/null +++ b/apps/extension/src/vite-env.d.ts @@ -0,0 +1,3 @@ +/// + +declare const __ALLOWED_ORIGINS__: string[]; diff --git a/apps/extension/vite.config.ts b/apps/extension/vite.config.ts index 84ab1ff4..1e8ae6c6 100644 --- a/apps/extension/vite.config.ts +++ b/apps/extension/vite.config.ts @@ -1,36 +1,50 @@ -// vite.config.ts -import { defineConfig } from 'vite'; +import { crx } from '@crxjs/vite-plugin'; +import svgSpritePlugin from '@pivanov/vite-plugin-svg-sprite'; import tailwindcss from '@tailwindcss/vite'; import react from '@vitejs/plugin-react-swc'; -import tsconfigPaths from 'vite-tsconfig-paths'; import { resolve } from 'path'; -import { crx } from '@crxjs/vite-plugin'; +import { defineConfig, loadEnv } from 'vite'; +import tsconfigPaths from 'vite-tsconfig-paths'; import manifest from './manifest.json'; -import svgSpritePlugin from '@pivanov/vite-plugin-svg-sprite'; -export default defineConfig({ - plugins: [ - react(), - tsconfigPaths({ - projects: [resolve(__dirname, './tsconfig.json')], - }), - tailwindcss(), - crx({ manifest }), - svgSpritePlugin({ - iconDirs: ['../../packages/design-system/src/icons/source'], - symbolId: 'icon-[name]', - inject: 'body-last', - }), - ], +export default defineConfig(({ mode }) => { + const env = loadEnv(mode, process.cwd()); + + const dynamicManifest = { + ...manifest, + name: env.VITE_EXTENSION_NAME || manifest.name, + }; + + return { + define: { + __ALLOWED_ORIGINS__: JSON.stringify( + env.VITE_ALLOWED_ORIGINS?.split(',') || [] + ), + }, + + plugins: [ + react(), + tsconfigPaths({ + projects: [resolve(__dirname, './tsconfig.json')], + }), + tailwindcss(), + crx({ manifest: dynamicManifest }), + svgSpritePlugin({ + iconDirs: ['../../packages/design-system/src/icons/source'], + symbolId: 'icon-[name]', + inject: 'body-last', + }), + ], - build: { - outDir: 'dist', - copyPublicDir: true, - }, - publicDir: 'public', + build: { + outDir: 'dist', + copyPublicDir: true, + }, + publicDir: 'public', - server: { - port: 5175, - strictPort: true, - }, + server: { + port: 5175, + strictPort: true, + }, + }; }); From f132130c33eb20a21a41d8c32600dd6a250a1927 Mon Sep 17 00:00:00 2001 From: constantly-dev Date: Thu, 19 Mar 2026 16:42:37 +0900 Subject: [PATCH 4/9] =?UTF-8?q?feat:=20extension=20login=20popup=20?= =?UTF-8?q?=EC=B0=BD=20=EC=97=B4=EB=A6=B4=20=EB=95=8C=20dev,=20prod=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=20=EB=B6=84=EB=A6=AC=EB=90=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=8F=99=EC=A0=81=20url=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/extension/src/pages/LogOutPop.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/extension/src/pages/LogOutPop.tsx b/apps/extension/src/pages/LogOutPop.tsx index c515a224..4f8f2e97 100644 --- a/apps/extension/src/pages/LogOutPop.tsx +++ b/apps/extension/src/pages/LogOutPop.tsx @@ -1,6 +1,8 @@ import { Icon } from '@pinback/design-system/icons'; import LogOutImg from '/logout_chippi.svg'; const LogOutPop = () => { + const webUrl = import.meta.env.VITE_WEB_URL || 'https://pinback.today'; + return (
@@ -25,7 +27,7 @@ const LogOutPop = () => { type="button" onClick={() => { chrome.tabs.create({ - url: 'https://pinback.today/onboarding?step=SOCIAL_LOGIN', + url: `${webUrl}/onboarding?step=SOCIAL_LOGIN`, }); }} > From c1e56ac1f18e57abd12adb54a68a4fd9003fbe92 Mon Sep 17 00:00:00 2001 From: constantly-dev Date: Thu, 19 Mar 2026 16:43:30 +0900 Subject: [PATCH 5/9] =?UTF-8?q?feat:=20extension=20background=20webUrl=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=8B=9C=20=EB=8F=99=EC=A0=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EA=B8=B0=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/extension/src/background.ts | 6 +++--- apps/extension/src/content.ts | 24 +++++++++++++++--------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/apps/extension/src/background.ts b/apps/extension/src/background.ts index 42b17fcd..a089b710 100644 --- a/apps/extension/src/background.ts +++ b/apps/extension/src/background.ts @@ -1,5 +1,7 @@ import { EXTENSION_MESSAGE_TYPE } from '@pinback/contracts/extension-messages'; +const webUrl = import.meta.env.VITE_WEB_URL || 'https://pinback.today'; + chrome.runtime.onInstalled.addListener((details) => { if (details.reason === 'install') { chrome.identity.getProfileUserInfo(function (info) { @@ -8,7 +10,7 @@ chrome.runtime.onInstalled.addListener((details) => { }); setTimeout(() => { chrome.tabs.create({ - url: `https://pinback.today/onboarding?email=${info.email}`, + url: `${webUrl}/onboarding?email=${info.email}`, }); }, 1000); }); @@ -21,9 +23,7 @@ chrome.runtime.onMessage.addListener((message) => { console.log('Token saved!'); }); } -}); -chrome.runtime.onMessage.addListener((message) => { if (message.type === EXTENSION_MESSAGE_TYPE.logout) { chrome.storage.local.remove('token', () => { console.log('Token removed!'); diff --git a/apps/extension/src/content.ts b/apps/extension/src/content.ts index 92002d60..1cf80453 100644 --- a/apps/extension/src/content.ts +++ b/apps/extension/src/content.ts @@ -1,23 +1,29 @@ import { EXTENSION_MESSAGE_TYPE } from '@pinback/contracts/extension-messages'; +const ALLOWED_ORIGINS = __ALLOWED_ORIGINS__; + window.addEventListener('message', (event) => { if (event.source !== window) return; - if (event.data.type === EXTENSION_MESSAGE_TYPE.setToken) { + + if (!ALLOWED_ORIGINS.includes(event.origin)) return; + + const { type, token } = event.data; + + if (type === EXTENSION_MESSAGE_TYPE.setToken) { chrome.runtime.sendMessage({ type: EXTENSION_MESSAGE_TYPE.setToken, - token: event.data.token, + token, }); - chrome.storage.local.set({ token: event.data.token }, () => { - console.log('Token saved!'); + + chrome.storage.local.set({ token }, () => { + console.log(`[${event.origin}] Token saved!`); }); } -}); -window.addEventListener('message', (event) => { - if (event.source !== window) return; - if (event.data.type === EXTENSION_MESSAGE_TYPE.logout) { + // 토큰 삭제 (로그아웃) + if (type === EXTENSION_MESSAGE_TYPE.logout) { chrome.storage.local.remove('token', () => { - console.log('Token removed!'); + console.log(`[${event.origin}] Token removed!`); }); } }); From d5def082324572b1efc62eb6aef8c5f2525188a1 Mon Sep 17 00:00:00 2001 From: constantly-dev Date: Thu, 19 Mar 2026 16:58:01 +0900 Subject: [PATCH 6/9] setting: update extension version to 1.0.3 --- apps/extension/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/extension/manifest.json b/apps/extension/manifest.json index f0b3aa5a..9ae1f400 100644 --- a/apps/extension/manifest.json +++ b/apps/extension/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Pinback 핀백 - 북마크 관리와 리마인드 도구", - "version": "1.0.2", + "version": "1.0.3", "action": { "default_popup": "popup.html" }, "icons": { "128": "icon.png", From 01f89339c1dde965667d5f526ba93118ce6ca15e Mon Sep 17 00:00:00 2001 From: constantly-dev Date: Thu, 19 Mar 2026 17:17:23 +0900 Subject: [PATCH 7/9] =?UTF-8?q?fix:=20build=20script=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EB=A7=A4=EB=8B=88=EC=A0=80=20yarn=EC=97=90?= =?UTF-8?q?=EC=84=9C=20pnpm=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/extension/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index 471df6c9..84779808 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -5,12 +5,12 @@ "type": "module", "scripts": { "dev": "vite --mode development", + "build": "pnpm build:prod", "build:dev": "tsc -b && vite build --mode development", "build:prod": "tsc -b && vite build --mode production", - "build": "yarn build:prod", "lint": "eslint .", "format": "prettier -w .", - "zip": "yarn build:prod && node scripts/zip.mjs" + "zip": "pnpm build:prod && node scripts/zip.mjs" }, "dependencies": { "@pinback/contracts": "workspace:*", From 823c4a6604445eaf04c38e7719d03a492dcf5642 Mon Sep 17 00:00:00 2001 From: constantly-dev Date: Thu, 19 Mar 2026 17:41:41 +0900 Subject: [PATCH 8/9] =?UTF-8?q?refactor:=20ALLOWED=5FORIGINS=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/extension/src/content.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/extension/src/content.ts b/apps/extension/src/content.ts index 1cf80453..30dd9146 100644 --- a/apps/extension/src/content.ts +++ b/apps/extension/src/content.ts @@ -2,6 +2,12 @@ import { EXTENSION_MESSAGE_TYPE } from '@pinback/contracts/extension-messages'; const ALLOWED_ORIGINS = __ALLOWED_ORIGINS__; +if (ALLOWED_ORIGINS.length === 0) { + console.warn( + '[Pinback] 허용된 도메인(ALLOWED_ORIGINS) 설정이 비어 있습니다. 토큰 동기화가 작동하지 않으니 .env 파일을 확인해주세요.' + ); +} + window.addEventListener('message', (event) => { if (event.source !== window) return; From de53079df0d947e9545ccff49a1a5546253aaf2d Mon Sep 17 00:00:00 2001 From: constantly-dev Date: Thu, 19 Mar 2026 17:42:25 +0900 Subject: [PATCH 9/9] =?UTF-8?q?refactor:=20split(,)=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=9D=BC=20[]=20=EB=B0=B0=EC=97=B4=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EC=97=A3=EC=A7=80=20?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=97=90=EB=9F=AC=20=EB=B0=A9?= =?UTF-8?q?=EC=A7=80=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/extension/vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/extension/vite.config.ts b/apps/extension/vite.config.ts index 1e8ae6c6..c1c3d914 100644 --- a/apps/extension/vite.config.ts +++ b/apps/extension/vite.config.ts @@ -18,7 +18,7 @@ export default defineConfig(({ mode }) => { return { define: { __ALLOWED_ORIGINS__: JSON.stringify( - env.VITE_ALLOWED_ORIGINS?.split(',') || [] + env.VITE_ALLOWED_ORIGINS?.split(',').filter(Boolean) || [] ), },