{"_id":"@142vip/cdn","_rev":"4-f33f39eb913d59bae78dafc1529d651e","name":"@142vip/cdn","dist-tags":{"latest":"0.0.1-alpha.3"},"versions":{"0.0.1-alpha.0":{"name":"@142vip/cdn","version":"0.0.1-alpha.0","author":{"name":"142vip"},"license":"MIT","_id":"@142vip/cdn@0.0.1-alpha.0","maintainers":[{"name":"mmdapl","email":"2237221210@qq.com"}],"homepage":"https://github.com/142vip/cdn_service#readme","bugs":{"url":"https://github.com/142vip/cdn_service/issues"},"dist":{"shasum":"933fac695c9b399ed45c1919b23c5f4b8d69abc5","tarball":"https://registry.npmjs.org/@142vip/cdn/-/cdn-0.0.1-alpha.0.tgz","fileCount":24,"integrity":"sha512-htO4peq8MPoPBsdyHx76D5uDGIMmq7/a30qIhGQWp0mU8tcoxSMP6sgvwU00XqB2tOiDo5uAOeQcanP635oAFA==","signatures":[{"sig":"MEUCIQCNq1xZj7Ig93HGCusIqyzeoUa13Ph3pChYiQcq1pL/fwIgdXmfXtO+zbATzpyOJp/MuBaKeFtHBjo+Up+vJEAoO0w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":899634},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./media/*":"./assets/media/*","./vip-main/*":"./assets/vip-main/*"},"gitHead":"3f15f5676f1d935e168d0025d5fca6331ae672dc","private":false,"_npmUser":{"name":"mmdapl","email":"2237221210@qq.com"},"repository":{"url":"git+https://github.com/142vip/cdn_service.git","type":"git","directory":"packages/cdn"},"_npmVersion":"10.9.4","description":"142vip CDN 静态资源与 URL 工具（media / vip-main JSON + getCdnUrl）","directories":{},"_nodeVersion":"22.21.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/cdn_0.0.1-alpha.0_1779870125902_0.2789776804676478","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.1":{"name":"@142vip/cdn","version":"0.0.1-alpha.1","author":{"name":"142vip"},"license":"MIT","_id":"@142vip/cdn@0.0.1-alpha.1","maintainers":[{"name":"mmdapl","email":"2237221210@qq.com"}],"homepage":"https://github.com/142vip/cdn_service#readme","bugs":{"url":"https://github.com/142vip/cdn_service/issues"},"dist":{"shasum":"9d32e9430db953e05391f2620dac027179c67369","tarball":"https://registry.npmjs.org/@142vip/cdn/-/cdn-0.0.1-alpha.1.tgz","fileCount":25,"integrity":"sha512-v+2Yf7eYnhsOCHVoSDO+/N8FsEcPtotTMR7GFdgGXCl0Pd9GmhOr2OyDmAck/jFyiNh1tW/lu4cteIDulHKemA==","signatures":[{"sig":"MEUCIQDe9aOYNDuuq8rjZQ9mBjoWwUnBl3pDvFEb9z6fZYk3MgIgDZbuYisZzzN8rcbZwg7Hi2Xnwk7k/ZzBG0+AuVN0ucE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":901226},"main":"./dist/index.cjs","type":"module","_from":"file:142vip-cdn-0.0.1-alpha.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./media/*":"./assets/media/*","./vip-main/*":"./assets/vip-main/*"},"private":false,"_npmUser":{"name":"mmdapl","email":"2237221210@qq.com"},"_resolved":"/private/var/folders/93/44x7xwkd2vz0pdy1z9s29m4r0000gn/T/2a3757e7aaea120490f7c9ce1e025d82/142vip-cdn-0.0.1-alpha.1.tgz","_integrity":"sha512-v+2Yf7eYnhsOCHVoSDO+/N8FsEcPtotTMR7GFdgGXCl0Pd9GmhOr2OyDmAck/jFyiNh1tW/lu4cteIDulHKemA==","repository":{"url":"git+https://github.com/142vip/cdn_service.git","type":"git","directory":"packages/cdn"},"_npmVersion":"11.12.1","description":"142vip CDN 静态资源与 URL 工具（media / vip-main JSON + getCdnUrl）","directories":{},"_nodeVersion":"25.9.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/cdn_0.0.1-alpha.1_1785294822662_0.5420756378135878","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.2":{"name":"@142vip/cdn","version":"0.0.1-alpha.2","author":{"name":"142vip"},"license":"MIT","_id":"@142vip/cdn@0.0.1-alpha.2","maintainers":[{"name":"mmdapl","email":"2237221210@qq.com"}],"homepage":"https://github.com/142vip/cdn_service#readme","bugs":{"url":"https://github.com/142vip/cdn_service/issues"},"dist":{"shasum":"2312a7928b7c3a79137e66d60536057b13b0dff8","tarball":"https://registry.npmjs.org/@142vip/cdn/-/cdn-0.0.1-alpha.2.tgz","fileCount":28,"integrity":"sha512-FZSR2Z/RezrvaUo9IlNcZAaOv391w6hM7EoQVtIcIwI/F/im1oHZyceM6Q4z97PIQWGevabQ9QPswLtLKKoV0Q==","signatures":[{"sig":"MEYCIQDd5seHPVLFeybxyRb1auWDbw0LJaMwcjyMOWJsgoHnBQIhALTk7/oIuGABW4eYUWbefia8rRgA6KW0VHNPZmb1wJ1C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":923595},"main":"./dist/index.cjs","type":"module","_from":"file:142vip-cdn-0.0.1-alpha.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./media/*":"./assets/media/*","./vip-main/*":"./assets/vip-main/*"},"private":false,"_npmUser":{"name":"mmdapl","email":"2237221210@qq.com"},"_resolved":"/private/var/folders/93/44x7xwkd2vz0pdy1z9s29m4r0000gn/T/9a5dfa22c5546dea3b754497b8d69f67/142vip-cdn-0.0.1-alpha.2.tgz","_integrity":"sha512-FZSR2Z/RezrvaUo9IlNcZAaOv391w6hM7EoQVtIcIwI/F/im1oHZyceM6Q4z97PIQWGevabQ9QPswLtLKKoV0Q==","repository":{"url":"git+https://github.com/142vip/cdn_service.git","type":"git","directory":"packages/cdn"},"_npmVersion":"11.12.1","description":"142vip CDN 静态资源与 URL 工具（media / vip-main JSON + getCdnUrl）","directories":{},"_nodeVersion":"25.9.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/cdn_0.0.1-alpha.2_1787639558505_0.4098312550212142","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.3":{"_id":"@142vip/cdn@0.0.1-alpha.3","bugs":{"url":"https://github.com/142vip/cdn_service/issues"},"dist":{"shasum":"e669cee49fc4acaa114fca3e30f7fcffac0c2c7f","tarball":"https://registry.npmjs.org/@142vip/cdn/-/cdn-0.0.1-alpha.3.tgz","fileCount":32,"integrity":"sha512-Mt5lRYcAh+33QXSBmMKO5c2ccim3VsXk0tWadJInGClx6QoicvGqigOe0mcULBRhh3n4j4IayW2tFMevwKndKA==","signatures":[{"sig":"MEYCIQDbB9lgrbS1Xat8vrBZ1udr/2WrIa4StrowValQNKwqWgIhANDvBw5brFgREIKpl9v2m9daXtCzQ528390jsgzn6xls","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICZny5ZL3izSmZ3d22rHpwToxZcZ1NpLanHzK+W9TxFJAiBdbfTgCarLqB2kAelapFXY/Zf9r8gMUFdsLaBCovdOWg=="}],"unpackedSize":978229},"main":"./dist/index.cjs","name":"@142vip/cdn","type":"module","_from":"file:142vip-cdn-0.0.1-alpha.3.tgz","types":"./dist/index.d.ts","author":{"name":"142vip"},"module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./media/*":"./assets/media/*","./vip-main/*":"./assets/vip-main/*"},"license":"MIT","private":false,"version":"0.0.1-alpha.3","_npmUser":{"name":"mmdapl","email":"2237221210@qq.com"},"homepage":"https://github.com/142vip/cdn_service#readme","_resolved":"/private/var/folders/93/44x7xwkd2vz0pdy1z9s29m4r0000gn/T/9fa063f32e5792af787d2c33e33e7a21/142vip-cdn-0.0.1-alpha.3.tgz","_integrity":"sha512-Mt5lRYcAh+33QXSBmMKO5c2ccim3VsXk0tWadJInGClx6QoicvGqigOe0mcULBRhh3n4j4IayW2tFMevwKndKA==","repository":{"url":"git+https://github.com/142vip/cdn_service.git","type":"git","directory":"packages/cdn"},"_npmVersion":"11.12.1","description":"142vip CDN 静态资源与 URL 工具（media / vip-main JSON + getCdnUrl）","directories":{},"maintainers":[{"name":"mmdapl","email":"2237221210@qq.com"}],"_nodeVersion":"25.9.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cdn_0.0.1-alpha.3_1789025921508_0.07795254111985961"}}},"time":{"created":"2026-05-27T08:22:05.687Z","modified":"2026-09-10T07:38:41.865Z","0.0.1-alpha.0":"2026-05-27T08:22:06.169Z","0.0.1-alpha.1":"2026-07-29T03:13:42.872Z","0.0.1-alpha.2":"2026-08-25T06:32:38.689Z","0.0.1-alpha.3":"2026-09-10T07:38:41.641Z"},"bugs":{"url":"https://github.com/142vip/cdn_service/issues"},"author":{"name":"142vip"},"license":"MIT","homepage":"https://github.com/142vip/cdn_service#readme","repository":{"url":"git+https://github.com/142vip/cdn_service.git","type":"git","directory":"packages/cdn"},"description":"142vip CDN 静态资源与 URL 工具（media / vip-main JSON + getCdnUrl）","maintainers":[{"name":"mmdapl","email":"2237221210@qq.com"}],"readme":"# @142vip/cdn\n\n142vip 图床 npm 包：**npm 包内静态资源** + **CDN URL 工具**，支持 ESM / CJS。\n\n包含 `apps/media` 图片资源与 `apps/vip-main` JSON 数据（如 `photos.json`）。\n\n## 安装\n\n```bash\npnpm add @142vip/cdn\n```\n\n## 最佳实践\n\n| 场景 | 推荐方式 |\n| --- | --- |\n| 前端页面、组件内图片 | `import` 包内 media 资源，随项目构建与缓存 |\n| 前端读取照片墙 JSON | `import` `@142vip/cdn/vip-main/photos.json` |\n| 需要统一资源 key、类型提示 | `MEDIA_SRC` / `VIP_MAIN_SRC` |\n| 线上文档、邮件、API 返回 JSON CDN 链接 | `VIP_MAIN_CDN` 或 `getVipMainProductionCdnUrl` |\n| 线上文档、邮件、API 返回图片 CDN 链接 | `getProductionCdnUrl`（main + Statically） |\n| 联调 next 分支未发布资源 | `getDevelopmentCdnUrl`（next + Statically） |\n| 切换 CDN 域名或分支 | `getCdnUrl(path, { host, branch })` |\n\n**优先 import，其次 CDN 外链。** 前端项目应尽量走 npm 包静态资源，减少对外部 CDN 的运行时依赖。\n\n### 前端：import 资源\n\n```vue\n<script setup lang=\"ts\">\nimport vipFavicon from '@142vip/cdn/media/icons/vip-favicon.ico'\nimport githubIcon from '@142vip/cdn/media/svg/github.svg'\nimport wechatCode from '@142vip/cdn/media/wechat/chu-fan-code.jpg'\n</script>\n\n<template>\n  <link rel=\"icon\" :href=\"vipFavicon\">\n  <img :src=\"githubIcon\" alt=\"GitHub\">\n  <img :src=\"wechatCode\" alt=\"微信公众号\">\n</template>\n```\n\n### 类型安全的资源 key\n\n`MEDIA_SRC` 由仓库 `apps/media` 同步生成：\n\n```ts\nimport { MEDIA_SRC } from '@142vip/cdn'\n\nconst githubPath = MEDIA_SRC.svg.github\nconst vipFaviconPath = MEDIA_SRC.icons.vipFavicon\n// '@142vip/cdn/media/svg/github.svg' — 供 bundler 解析或动态 import\n```\n\n### vip-main JSON（photos.json）\n\n`VIP_MAIN_SRC` / `VIP_MAIN_CDN` 由仓库 `apps/vip-main` 同步生成：\n\n```ts\nimport {\n  getVipMainProductionCdnUrl,\n  VIP_MAIN_CDN,\n  VIP_MAIN_SRC,\n} from '@142vip/cdn'\nimport photos from '@142vip/cdn/vip-main/photos.json'\n\nconst items = photos\n\n// 包内 import 路径\nconst photosExport = VIP_MAIN_SRC.photos\n// '@142vip/cdn/vip-main/photos.json'\n\n// CDN 外链\nconst prodUrl = VIP_MAIN_CDN.photos.production\n// 或\nconst prodUrl2 = getVipMainProductionCdnUrl('photos.json')\n```\n\n### CDN 外链\n\n路径相对于 `apps/`，不含 `apps/` 前缀；域名见 `CdnHostEnum`：\n\n```ts\nimport {\n  CdnHostEnum,\n  getCdnUrl,\n  getDevelopmentCdnUrl,\n  getProductionCdnUrl,\n  resolveCdnHost,\n} from '@142vip/cdn'\n\nconst prodUrl = getProductionCdnUrl('media/svg/github.svg')\nconst devUrl = getDevelopmentCdnUrl('media/wechat/chu-fan-code.jpg')\nconst customUrl = getCdnUrl('media/svg/github.svg', {\n  host: CdnHostEnum.JsDelivr,\n  branch: 'main',\n})\n\n// 应用配置解析（非法 host 回退默认 Fastly）\nconst host = resolveCdnHost(process.env.VITE_CDN_HOST)\n```\n\n### Node.js（ESM / CJS）\n\n```ts\nimport { getProductionCdnUrl, MEDIA_SRC } from '@142vip/cdn'\n\nexport const avatarUrl = getProductionCdnUrl('media/wechat/chu-fan-code.jpg')\nexport const githubExport = MEDIA_SRC.svg.github\n```\n\n```js\nconst { getProductionCdnUrl } = require('@142vip/cdn')\n\nmodule.exports.wechatUrl = getProductionCdnUrl('media/wechat/chu-fan-code.jpg')\n```\n\n## API\n\n| 导出 | 说明 |\n| --- | --- |\n| `MEDIA_SRC` / `MediaSrc` | media 资源路径映射 |\n| `VIP_MAIN_SRC` / `VipMainSrc` | vip-main JSON 包内路径映射 |\n| `VIP_MAIN_CDN` / `VipMainCdn` | vip-main JSON CDN 链接（production / development） |\n| `mediaExportPath(path)` | 构造 media 包内 export 路径 |\n| `vipMainExportPath(path)` | 构造 vip-main JSON 包内 export 路径 |\n| `getVipMainCdnUrl(path, options?)` | vip-main JSON CDN URL |\n| `getVipMainProductionCdnUrl(path, host?)` | vip-main JSON 生产环境 CDN URL |\n| `getVipMainDevelopmentCdnUrl(path, host?)` | vip-main JSON 开发环境 CDN URL |\n| `getCdnBase(options?)` | CDN apps 根 URL |\n| `getCdnUrl(path, options?)` | 完整 CDN 文件 URL |\n| `getProductionCdnUrl(path, host?)` | 生产环境（main） |\n| `getDevelopmentCdnUrl(path, host?)` | 开发环境（next） |\n| `getDefaultCdnHost()` | 默认 CDN 域名（`CdnHostEnum.Fastly`） |\n| `getDefaultCdnBranch()` | 默认 next |\n| `getCdnDomains()` | 可选 CDN 域名列表 |\n| `CdnHostEnum` | CDN 镜像域名枚举 |\n| `resolveCdnHost(host?, fallback?)` | 解析应用配置的 CDN 域名 |\n| `buildCdnPublicBaseUrl(owner, repo, branch, host?)` | 仓库根 URL（不含 `/apps`） |\n| `getCdnProductionRepoRoot(host?)` | 生产分支 `cdn_service` 仓库根 |\n| `isCdnServicePublicUrl(url)` | 是否为 `cdn_service` 公开静态 URL |\n| `getCdnAllowedHosts()` | URL 校验白名单 host 列表 |\n\n## 升级替换\n\n若从旧版 `@142vip/cdn` 升级，按下列方式替换：\n\n| 已移除 | 替换为 |\n| --- | --- |\n| `VipCdnHost.FastlyJsDelivr` | `CdnHostEnum.Fastly` |\n| `VipCdnHost.Statically` | `CdnHostEnum.Statically` |\n| `CDN_DEFAULT_HOST` | `getDefaultCdnHost()` 或 `CDN_CONFIG.defaultHost` |\n| `resolveVipCdnHost(host, fallback?)` | `resolveCdnHost(host, fallback?)` |\n| `buildProductionCdnAssetUrl(path, host)` | `getProductionCdnUrl(path, host)` |\n| `LifePhotoItem`（类型） | 在业务项目内自行定义，或直接 `import` JSON 使用 |\n\n`resolveCdnHost` 会校验 `CdnHostEnum` 中的全部 host（含 jsDelivr），非法值回退 `fallback`（默认 Fastly）。\n\n```ts\nimport { resolveVipCdnHost, VipCdnHost } from '@142vip/cdn'\n\nconst host = resolveVipCdnHost(envHost, VipCdnHost.FastlyJsDelivr)\n```\n\n```ts\nimport { getDefaultCdnHost, resolveCdnHost } from '@142vip/cdn'\n\nconst host = resolveCdnHost(envHost, getDefaultCdnHost())\n// 显式 fallback：resolveCdnHost(envHost, CdnHostEnum.Fastly)\n```\n\n## 本仓库维护\n\n在 monorepo 根目录：`pnpm sync:cdn` · `pnpm build:cdn` · `pnpm prepublish:cdn` · `pnpm publish:cdn`\n\n### 同步机制\n\n`pnpm sync:cdn`（`scripts/sync-media.ts`）会：\n\n1. 复制 `apps/media/` → `packages/cdn/assets/media/`，生成 `MEDIA_SRC`\n2. 扫描 `apps/vip-main/**/*.json` → `packages/cdn/assets/vip-main/`，生成 `VIP_MAIN_SRC` 与 `VIP_MAIN_CDN`\n\n`assets/` 目录在 gitignore 中，发布 npm 前须执行 `pnpm build:cdn`。新增 vip-main JSON 文件会自动纳入同步。\n\n### package exports\n\n```textmate\n\"./media/*\": \"./assets/media/*\",\n\"./vip-main/*\": \"./assets/vip-main/*\"\n```\n\n新增 CDN 域名：在 `src/config.ts` 扩展 `CdnHostEnum` 与 `CDN_DOMAIN_LABELS`。\n\n## 证书\n\nMIT © 2019-present 142vip 储凡\n","readmeFilename":"README.md"}