{"_id":"@astralweb/nova-e-map-wds","name":"@astralweb/nova-e-map-wds","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@astralweb/nova-e-map-wds","version":"1.0.0","description":"7-ELEVEN store pickup e-map (WDS) integration module for Nova e-commerce platform (Internal Use Only)","repository":{"type":"git","url":"git+https://github.com/AstralWebTW/nova-packages.git","directory":"packages/e-map-wds"},"license":"Proprietary","type":"module","exports":{".":{"types":"./dist/module.d.mts","import":"./dist/module.mjs"},"./types":{"types":"./dist/runtime/types/index.d.ts","import":"./dist/runtime/types/index.js"},"./utils":{"types":"./dist/runtime/utils/index.d.ts","import":"./dist/runtime/utils/index.js"},"./composables":{"types":"./dist/runtime/composables/index.d.ts","import":"./dist/runtime/composables/index.js"}},"main":"./dist/module.mjs","typesVersions":{"*":{".":["./dist/types.d.mts"],"types":["./dist/runtime/types/index.d.ts"],"utils":["./dist/runtime/utils/index.d.ts"],"composables":["./dist/runtime/composables/index.d.ts"]}},"dependencies":{"@nuxt/kit":"^4.3.0"},"peerDependencies":{"nuxt":"^3.0.0 || ^4.0.0"},"devDependencies":{"@nuxt/devtools":"^2.6.5","@nuxt/eslint-config":"^1.9.0","@nuxt/module-builder":"^1.0.2","@nuxt/schema":"^4.1.3","@nuxt/test-utils":"^3.19.2","@types/node":"latest","changelogen":"^0.6.2","eslint":"^9.38.0","nuxt":"^4.1.3","typescript":"~5.9.3","vitest":"^3.2.4","vue-tsc":"^3.1.1","@astralweb/eslint-config":"1.0.6"},"publishConfig":{"access":"public"},"keywords":["e-map-wds","7-eleven","store-pickup","magento","nuxt-module","taiwan"],"author":{"name":"Astral Web"},"homepage":"https://github.com/AstralWebTW/nova-packages/tree/main/packages/e-map-wds","engines":{"node":">=20.0.0","pnpm":">=10.0.0"},"scripts":{"build:prepare":"nuxt-module-build prepare && nuxi prepare playground","build":"nuxt-module-build build","dev":"pnpm run dev:prepare && nuxi dev playground","dev:build":"nuxi build playground","dev:preview":"nuxi preview playground --port 3001","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","lint":"eslint .","lint:fix":"eslint . --fix","test":"vitest run","test:watch":"vitest watch","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit"},"_id":"@astralweb/nova-e-map-wds@1.0.0","bugs":{"url":"https://github.com/AstralWebTW/nova-packages/issues"},"_integrity":"sha512-/F/eMii0Cr4J25SUlF+0/4AQxiiDv9Vrj9bVKorEBv5e1i0X4uv1rmQF+xhN3ocJSk/uWHQ2rmoRXR8DT8M1YQ==","_resolved":"/tmp/add926aaa99d8ff23fed0a79863147c3/astralweb-nova-e-map-wds-1.0.0.tgz","_from":"file:astralweb-nova-e-map-wds-1.0.0.tgz","_nodeVersion":"20.20.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-/F/eMii0Cr4J25SUlF+0/4AQxiiDv9Vrj9bVKorEBv5e1i0X4uv1rmQF+xhN3ocJSk/uWHQ2rmoRXR8DT8M1YQ==","shasum":"d8c44d619313fe5a7cf60a4fdf9b354f8a9d01b1","tarball":"https://registry.npmjs.org/@astralweb/nova-e-map-wds/-/nova-e-map-wds-1.0.0.tgz","fileCount":27,"unpackedSize":25685,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIErcstZ4txcXaej5UCW72Oe4FCjyovq5p4pBr4KhFhWLAiEA9gM2dVliuSKdPgjLlNIlIgtF/9ZQ6bEnoi6rFwHKVzc="}]},"_npmUser":{"name":"infoaw","email":"info@astralwebinc.com"},"directories":{},"maintainers":[{"name":"jimsu","email":"jim@astralwebinc.com"},{"name":"astralweb-darren","email":"darren@astralwebinc.com"},{"name":"infoaw","email":"info@astralwebinc.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nova-e-map-wds_1.0.0_1770796038201_0.46696209987625825"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-11T07:47:18.084Z","1.0.0":"2026-02-11T07:47:18.367Z","modified":"2026-02-11T07:47:18.659Z"},"maintainers":[{"name":"jimsu","email":"jim@astralwebinc.com"},{"name":"astralweb-darren","email":"darren@astralwebinc.com"},{"name":"infoaw","email":"info@astralwebinc.com"}],"description":"7-ELEVEN store pickup e-map (WDS) integration module for Nova e-commerce platform (Internal Use Only)","homepage":"https://github.com/AstralWebTW/nova-packages/tree/main/packages/e-map-wds","keywords":["e-map-wds","7-eleven","store-pickup","magento","nuxt-module","taiwan"],"repository":{"type":"git","url":"git+https://github.com/AstralWebTW/nova-packages.git","directory":"packages/e-map-wds"},"author":{"name":"Astral Web"},"bugs":{"url":"https://github.com/AstralWebTW/nova-packages/issues"},"license":"Proprietary","readme":"# 7-ELEVEN WDS 電子地圖整合模組使用指南\n\n> ⚠️ **內部使用套件** - 此套件僅供 Astral Web 內部使用，未經授權不得用於其他用途。\n\n## 概覽\n\n7-ELEVEN 超商取貨電子地圖（WDS）整合模組為 Nuxt 應用程式提供完整的 7-ELEVEN 門市選擇功能，支援桌機版與手機版電子地圖、自動處理回調資料格式轉換。模組設計簡潔易用，提供自動註冊 composable 和 server route，並提供完整的 TypeScript 型別支援。\n\n### 功能特色\n\n- 整合 7-ELEVEN WDS 電子地圖門市選擇\n- 支援桌機版與手機版電子地圖\n- 自動處理回調資料格式轉換\n\n## 安裝與設定\n\n### 1. 安裝套件\n\n#### 在 apps/web 安裝\n\n```bash\nyarn add @astralweb/nova-e-map-wds\n```\n\n### 2. 註冊模組\n\n在 `nuxt.config.ts` 中註冊模組\n\n```typescript\n// apps/web/nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: [\n    '@astralweb/nova-e-map-wds',\n  ],\n});\n```\n\n### 3. 模組配置選項（可選）\n\n```typescript\n// apps/web/nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: [\n    '@astralweb/nova-e-map-wds',\n  ],\n  emapWds: {\n    // 回調後重導向路徑（預設：'/checkout'）\n    redirectPath: '/checkout',\n    // Cookie 有效期（秒）（預設：60）\n    cookieMaxAge: 60,\n  },\n\n  // 多語系支援（專案級別設定）\n  runtimeConfig: {\n    public: {\n      multiLocales: true,\n    },\n  },\n});\n```\n\n## 使用方式\n\n### 基本使用\n\n```vue\n<script setup lang=\"ts\">\nimport type { EMapWDSConfig } from '@astralweb/nova-e-map-wds/types';\n\n// 從 Magento storeConfig 取得設定\nconst config: EMapWDSConfig = {\n  eshopId: 'your_shop_id',\n  eshopParId: 'your_parent_id',\n  eshopPwd: 'your_password',\n  emapEndpoint: 'https://emap.pcsc.com.tw/ecmap/default.aspx',\n  emapMobileEndpoint: 'https://emap.pcsc.com.tw/ecmap/default.aspx',\n  storeCategory: '1',\n};\n\nconst {\n  selectedStore,\n  hasSelectedStore,\n  openEMap,\n  setSelectedStore,\n  clearSelectedStore,\n  readCallbackCookie,\n} = useEMapWDS({ config });\n\n// 開啟電子地圖選擇門市（會跳轉頁面）\nconst handleSelectStore = () => {\n  openEMap();\n};\n\n// 處理回調資料（通常在 checkout 頁面的 onMounted 中處理）\n// 回調資料會存在 Cookie 中，有效期 60 秒\nonMounted(() => {\n  const callbackData = readCallbackCookie();\n  if (callbackData) {\n    setSelectedStore(callbackData);\n  }\n});\n</script>\n\n<template>\n  <div>\n    <button @click=\"handleSelectStore\">選擇門市</button>\n\n    <div v-if=\"hasSelectedStore\">\n      <p>門市代碼：{{ selectedStore?.storeId }}</p>\n      <p>門市名稱：{{ selectedStore?.storeName }}</p>\n      <p>門市地址：{{ selectedStore?.storeAddress }}</p>\n      <button @click=\"clearSelectedStore\">清除選擇</button>\n    </div>\n  </div>\n</template>\n```\n\n### 從 Magento storeConfig 取得設定\n\n```typescript\nimport { mapStoreConfigToEMapWDSConfig } from '@astralweb/nova-e-map-wds/types';\n\n// 假設 storeConfig 來自 Magento GraphQL\nconst storeConfig = {\n  seven_eleven_shipping_e_shop_id: 'shop_id',\n  seven_eleven_shipping_e_shop_pid: 'parent_id',\n  seven_eleven_shipping_e_shop_pwd: 'password',\n  seven_eleven_shipping_emap_endpoint: 'https://emap.pcsc.com.tw/ecmap/default.aspx',\n  seven_eleven_shipping_emap_mobile_endpoint: 'https://emap.pcsc.com.tw/ecmap/default.aspx',\n  seven_eleven_shipping_store_category: '1',\n};\n\nconst emapConfig = mapStoreConfigToEMapWDSConfig(storeConfig);\n```\n\n### 使用工具函數驗證回調資料\n\n```typescript\nimport {\n  isWDSData,\n  convertWDSToUnified,\n  parseWDSCallback,\n} from '@astralweb/nova-e-map-wds/utils';\n\n// 檢查是否為 WDS 資料格式\nif (isWDSData(callbackData)) {\n  const unified = convertWDSToUnified(callbackData);\n  console.log(unified.storeId);\n}\n\n// 或使用 parseWDSCallback 一次完成驗證和轉換\nconst result = parseWDSCallback(callbackData);\nif (result) {\n  console.log(result.storeId);\n}\n```\n\n## 型別定義\n\n### EMapWDSConfig\n\n```typescript\ninterface EMapWDSConfig {\n  eshopId: string; // 統一超商商店 ID\n  eshopParId: string; // 統一超商 Parent ID\n  eshopPwd: string; // 統一超商密碼\n  emapEndpoint: string; // 桌機版電子地圖 URL\n  emapMobileEndpoint: string; // 手機版電子地圖 URL\n  storeCategory: string; // 門市類型\n}\n```\n\n### WDSEMapData（原始回調格式）\n\n```typescript\ninterface WDSEMapData {\n  storeid: string; // 門市代碼\n  storename: string; // 門市名稱\n  storeaddress: string; // 門市地址\n  outside: string; // 外部區域\n  ship: string; // 配送方式\n  TempVar: string; // 時間戳記\n}\n```\n\n### UnifiedEMapData（統一格式）\n\n```typescript\ninterface UnifiedEMapData {\n  storeId: string; // 門市代碼\n  storeName: string; // 門市名稱\n  storeAddress: string; // 門市地址\n  shippingMethod: 'sevenelevenstoredelivery';\n}\n```\n\n## API 參考\n\n### useEMapWDS(options)\n\n#### 選項\n\n| 參數           | 型別            | 預設值        | 說明             |\n| -------------- | --------------- | ------------- | ---------------- |\n| `config`       | `EMapWDSConfig` | 必填          | WDS 電子地圖設定 |\n| `callbackPath` | `string`        | `'/emap/wds'` | 回調 URL 路徑    |\n\n#### 回傳值\n\n| 屬性                 | 型別                                      | 說明                  |\n| -------------------- | ----------------------------------------- | --------------------- |\n| `selectedStore`      | `Ref<UnifiedEMapData \\| null>`            | 已選擇的門市資料      |\n| `hasSelectedStore`   | `ComputedRef<boolean>`                    | 是否已選擇門市        |\n| `openEMap`           | `(isMobile?: boolean) => void`            | 開啟電子地圖選擇器    |\n| `setSelectedStore`   | `(data: UnifiedEMapData \\| null) => void` | 設定已選擇的門市      |\n| `clearSelectedStore` | `() => void`                              | 清除已選擇的門市      |\n| `readCallbackCookie` | `() => UnifiedEMapData \\| null`           | 讀取並清除回調 Cookie |\n| `getFormData`        | `() => FormData`                          | 產生 WDS API FormData |\n| `getEndpoint`        | `(isMobile?: boolean) => string`          | 取得電子地圖 URL      |\n\n## Server Route\n\n模組會自動註冊 `/emap/wds` POST 路由來處理 WDS 回調（符合 7-ELEVEN WDS 實際回調方式）。\n\n### 回調流程\n\n1. 用戶在 WDS 電子地圖選擇門市\n2. WDS 系統 POST 資料到 `/emap/wds`\n3. Server 將門市資料存入 Cookie（有效期 60 秒）\n4. 重導向回 `/checkout`\n5. 前端使用 `readCallbackCookie()` 讀取門市資料\n\n### Cookie 格式\n\n- Cookie 名稱：`eMap`\n- 有效期：60 秒（可透過 `cookieMaxAge` 配置）\n- 內容：JSON 格式的 `UnifiedEMapData`\n\n### 多語系支援\n\n模組使用專案級別的 `runtimeConfig.public.multiLocales` 設定（與 `line-pay` 等其他模組共用）。\n\n當 `multiLocales: true` 時，模組會：\n\n1. 讀取 `i18n_redirected` cookie 取得當前語系\n2. 自動在重導向路徑前加上語系前綴（如 `/zh-Hant-TW/checkout`）\n\n```typescript\n// apps/web/nuxt.config.ts\nexport default defineNuxtConfig({\n  runtimeConfig: {\n    public: {\n      multiLocales: true, // 設定後所有模組共用\n    },\n  },\n});\n```\n\n## Magento GraphQL 欄位\n\n需要在 Magento storeConfig 查詢中加入以下欄位：\n\n```graphql\nquery {\n  storeConfig {\n    seven_eleven_shipping_e_shop_id\n    seven_eleven_shipping_e_shop_pid\n    seven_eleven_shipping_e_shop_pwd\n    seven_eleven_shipping_emap_endpoint\n    seven_eleven_shipping_emap_mobile_endpoint\n    seven_eleven_shipping_store_category\n  }\n}\n```\n\n## 授權聲明\n\n此套件僅供 Astral Web 內部使用，未經授權不得用於其他用途。\n","readmeFilename":"README.md","_rev":"1-78f56c61862d753144333cd60a4dc27c"}