charbi-font 0.1.2 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +2 -2
- package/dist/cli.mjs +2 -2
- package/dist/config/index.d.cts +1 -1
- package/dist/config/index.d.mts +1 -1
- package/dist/config/loader.cjs +1 -1
- package/dist/config/loader.d.cts +1 -1
- package/dist/config/loader.d.mts +1 -1
- package/dist/config/loader.mjs +1 -1
- package/dist/{schema-B8yH_G4r.d.cts → schema-BH0yB0WV.d.mts} +1 -1
- package/dist/{schema-bUBG41yN.d.mts → schema-BN6N2z3p.d.cts} +1 -1
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./schema-ClqJnGnv.cjs`),n=require(`./config/loader.cjs`);let r=require(`node:fs`);r=e.t(r);let i=require(`node:path`);i=e.t(i);let a=require(`node:process`);a=e.t(a);let o=require(`node:url`),s=require(`cac`),c=require(`node:http`);c=e.t(c);let l=require(`node:https`);l=e.t(l);let u=require(`consola`);u=e.t(u);let d=require(`fast-glob`);d=e.t(d);let f=require(`fontmin`);f=e.t(f);let p=require(`p-limit`);p=e.t(p);let m=require(`enquirer`);m=e.t(m);async function h(e,t){return new Promise((n,i)=>{let a=e.startsWith(`https`)?l.default:c.default,o=r.default.createWriteStream(t);a.get(e,e=>{if(e.statusCode!==200){o.close(),r.default.unlink(t,()=>{}),i(Error(`下载失败: ${e.statusCode}`));return}e.pipe(o),o.on(`finish`,()=>{if(o.close(),r.default.statSync(t).size===0){r.default.unlink(t,()=>{}),i(Error(`下载的文件为空`));return}n()})}).on(`error`,e=>{o.close(),r.default.unlink(t,()=>{}),i(e)})})}async function g(e,t,n=!1){u.default.info(`下载字体文件...`),r.default.mkdirSync(e,{recursive:!0});let a=new Map;for(let o of t){let t=`${o.family}-${o.weight}.ttf`,s=i.default.join(e,t);if(n&&r.default.existsSync(s)&&r.default.unlinkSync(s),r.default.existsSync(s)){let e=r.default.statSync(s);if(e.size===0)r.default.unlinkSync(s);else{let t=(e.size/1024).toFixed(2);u.default.info(` ✓ ${o.family} ${o.name} (缓存, ${t} KB)`),a.set(`${o.family}-${o.weight}`,s);continue}}u.default.info(` ↓ ${o.family} ${o.name}...`);try{await h(o.url,s);let e=(r.default.statSync(s).size/1024).toFixed(2);u.default.success(` 完成 ${t} (${e} KB)`),a.set(`${o.family}-${o.weight}`,s)}catch(e){u.default.error(` 失败 ${o.family} ${o.name} 下载失败:`,e.message),r.default.existsSync(s)&&r.default.unlinkSync(s)}}return a}function _(e){return e.replace(/\s+/g,``)}function v(e,t,n,r){let{cos:i}=e;if(i.cdnUrl){if(!i.basePath)throw Error(`COS 配置缺少 basePath,请在 fonts.config.ts 中设置 cos.basePath`);let e=`${_(t.family)}-${t.weight}.${r}`,a=i.basePath.replace(`{version}`,n),o=a.startsWith(`/`)?a.slice(1):a;return`${i.cdnUrl}/${o}/${e}`.replace(/\/+/g,`/`)}return`./fonts/${_(t.family)}-${t.weight}.${r}`}function y(e,t,n,r,i=`normal`){return`@font-face {
|
|
1
|
+
const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./schema-ClqJnGnv.cjs`),n=require(`./config/loader.cjs`);let r=require(`node:fs`);r=e.t(r);let i=require(`node:path`);i=e.t(i);let a=require(`node:process`);a=e.t(a);let o=require(`node:url`),s=require(`cac`),c=require(`node:http`);c=e.t(c);let l=require(`node:https`);l=e.t(l);let u=require(`consola`);u=e.t(u);let d=require(`fast-glob`);d=e.t(d);let f=require(`fontmin`);f=e.t(f);let p=require(`p-limit`);p=e.t(p);let m=require(`enquirer`);m=e.t(m);async function h(e,t){return new Promise((n,i)=>{let a=e.startsWith(`https`)?l.default:c.default,o=r.default.createWriteStream(t);a.get(e,e=>{if(e.statusCode!==200){o.close(),r.default.unlink(t,()=>{}),i(Error(`下载失败: ${e.statusCode}`));return}e.pipe(o),o.on(`finish`,()=>{if(o.close(),r.default.statSync(t).size===0){r.default.unlink(t,()=>{}),i(Error(`下载的文件为空`));return}n()})}).on(`error`,e=>{o.close(),r.default.unlink(t,()=>{}),i(e)})})}async function g(e,t,n=!1){u.default.info(`下载字体文件...`),u.default.info(` 缓存目录: ${e}`),r.default.mkdirSync(e,{recursive:!0});let a=new Map;for(let o of t){let t=`${o.family}-${o.weight}.ttf`,s=i.default.join(e,t);if(n&&r.default.existsSync(s)&&r.default.unlinkSync(s),r.default.existsSync(s)){let e=r.default.statSync(s);if(e.size===0)r.default.unlinkSync(s);else{let t=(e.size/1024).toFixed(2);u.default.info(` ✓ ${o.family} ${o.name} (缓存, ${t} KB)`),a.set(`${o.family}-${o.weight}`,s);continue}}u.default.info(` ↓ ${o.family} ${o.name}...`);try{await h(o.url,s);let e=(r.default.statSync(s).size/1024).toFixed(2);u.default.success(` 完成 ${t} (${e} KB)`),a.set(`${o.family}-${o.weight}`,s)}catch(e){u.default.error(` 失败 ${o.family} ${o.name} 下载失败:`,e.message),r.default.existsSync(s)&&r.default.unlinkSync(s)}}return a}function _(e){return e.replace(/\s+/g,``)}function v(e,t,n,r){let{cos:i}=e;if(i.cdnUrl){if(!i.basePath)throw Error(`COS 配置缺少 basePath,请在 fonts.config.ts 中设置 cos.basePath`);let e=`${_(t.family)}-${t.weight}.${r}`,a=i.basePath.replace(`{version}`,n),o=a.startsWith(`/`)?a.slice(1):a;return`${i.cdnUrl}/${o}/${e}`.replace(/\/+/g,`/`)}return`./fonts/${_(t.family)}-${t.weight}.${r}`}function y(e,t,n,r,i=`normal`){return`@font-face {
|
|
2
2
|
font-family: '${e}';
|
|
3
3
|
src: url('${n}') format('${r}');
|
|
4
4
|
font-display: swap;
|
|
@@ -29,4 +29,4 @@ const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./schema-ClqJnGnv.cjs`),n=req
|
|
|
29
29
|
|
|
30
30
|
${f.map(e=>x(`${t.t}/${e.replace(/\.(scss|css)$/,``)}`,n.output.styleFormat)).join(`
|
|
31
31
|
`)}
|
|
32
|
-
`,_=i.default.join(l,h);r.default.writeFileSync(_,g);let S=(p/1024).toFixed(2);u.default.success(`生成汇总文件: ${h} (${S} KB)`)}function C(e){return e.replace(/\/\/.*$/gm,``).replace(/\/\*[\s\S]*?\*\//g,``).replace(/\/\*\*[\s\S]*?\*\//g,``)}function w(e){return e.replace(/<!--[\s\S]*?-->/g,``)}function T(e){return e.replace(/\/\*[\s\S]*?\*\//g,``)}function E(e){let t=e;return t=t.replace(/<template[^>]*>([\s\S]*?)<\/template>/gi,(e,t)=>`<template>${w(t)}</template>`),t=t.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,(e,t)=>`<script>${C(t)}<\/script>`),t=t.replace(/<style[^>]*>([\s\S]*?)<\/style>/gi,(e,t)=>`<style>${T(t)}</style>`),t}function D(e,t){switch(t){case`vue`:return E(e);case`tsx`:case`ts`:case`jsx`:case`js`:return C(e);case`scss`:case`css`:return T(e);default:return e}}function O(e,t){(e.match(/[\u4E00-\u9FA5]/g)||[]).forEach(e=>t.add(e)),(e.match(/\d/g)||[]).forEach(e=>t.add(e)),(e.match(/[a-z]/gi)||[]).forEach(e=>t.add(e)),(e.match(/[·.,;:!?@#$%^&*()_+\-=[\]{}|\\/"'<>,。;:!?、【】《》「」『』()]/g)||[]).forEach(e=>t.add(e))}function k(e){return e?Array.isArray(e)?e:[e]:[]}function A(e,t){for(let n of e)for(let e of n)e.trim()&&t.add(e)}async function j(e){u.default.info(`扫描项目文件...`);let t=await(0,d.default)(e.scan.srcDir.flatMap(t=>e.scan.extensions.map(e=>`${t}/**/*.${e}`)),{cwd:e.root,absolute:!1,onlyFiles:!0});u.default.info(` 找到 ${t.length} 个文件`);let n=new Set;for(let a of t)O(D(r.default.readFileSync(i.default.join(e.root,a),`utf-8`),a.split(`.`).pop()||``),n);A(k(e.scan.extraText),n),u.default.info(` 收集到 ${n.size} 个唯一字符`);for(let e of`0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.;:!?'",。;:!?`)n.add(e);return u.default.info(` 添加默认字符集后共 ${n.size} 个字符`),n}function M(e){return e?Array.isArray(e)?e:[e]:[]}function N(e,t){let n=new Set(e);for(let e of M(t))for(let t of e)t.trim()&&n.add(t);return Array.from(n).join(``)}async function P(e,t,n,a,o=`woff`){u.default.info(`生成字体子集...`);let s=new Map;for(let c of a){let a=e.get(`${c.family}-${c.weight}`);if(!a){u.default.warn(` 跳过 ${c.family} ${c.name} (未下载)`);continue}u.default.info(` 处理 ${c.family} ${c.name}...`);let l=c.format||o,d=N(n,c.extraText);try{let e=await new Promise((e,n)=>{let o=(0,f.default)().src(a).use(f.default.glyph({text:d,hinting:!1}));l===`woff2`?o.use(f.default.ttf2woff2()):l===`woff`&&o.use(f.default.ttf2woff()),o.dest(t).run((a,o)=>{if(a)n(a);else if(o&&o[0]){let n=o[0],a=l===`woff2`?`woff2`:l,s=`${_(c.family)}-${c.weight}.${a}`,u=i.default.join(t,s);n.path&&r.default.existsSync(n.path)&&r.default.renameSync(n.path,u),e({outputPath:u,size:r.default.statSync(u).size})}else n(Error(`No output file generated`))})}),n=(e.size/1024).toFixed(2);u.default.success(` 完成 ${c.family} ${c.name} (${n} KB)`),s.has(c.family)||s.set(c.family,[]),s.get(c.family).push({config:c,filePath:e.outputPath,size:e.size,format:l})}catch(e){u.default.error(` 失败 ${c.family} ${c.name}: ${e.message}`)}}return s}async function F(e,t){if(!t.basePath)throw Error(`COS 配置缺少 basePath,请在 fonts.config.ts 中设置 cos.basePath`);if(!t.bucket)throw Error(`COS 配置缺少 bucket,请在 fonts.config.ts 中设置 cos.bucket`);if(!t.region)throw Error(`COS 配置缺少 region,请在 fonts.config.ts 中设置 cos.region`);if(!t.cdnUrl)throw Error(`COS 配置缺少 cdnUrl,请在 fonts.config.ts 中设置 cos.cdnUrl`);let n=t.basePath.replace(`{version}`,e),r=[];r.push({type:`input`,name:`secretId`,message:`请输入腾讯云 SecretId:`,validate:e=>e.length>0||`SecretId 不能为空`}),r.push({type:`password`,name:`secretKey`,message:`请输入腾讯云 SecretKey:`,validate:e=>e.length>0||`SecretKey 不能为空`}),t.overwrite===void 0&&r.push({type:`confirm`,name:`overwrite`,message:`如果文件已存在,是否覆盖?`,initial:!1});let i=await m.default.prompt(r);return{secretId:i.secretId,secretKey:i.secretKey,bucket:t.bucket,region:t.region,uploadPath:n,cdnUrl:t.cdnUrl,overwrite:t.overwrite??i.overwrite??!1}}async function I(){try{let e=await import(`cos-nodejs-sdk-v5`);return e.default||e}catch{throw Error(`缺少依赖 cos-nodejs-sdk-v5,请在使用项目中安装该包后重试`)}}var L=class{validateConfig(e){if(!e.cos.basePath||!e.cos.bucket||!e.cos.region||!e.cos.cdnUrl)throw Error(`COS 上传配置不完整,请检查 fonts.config.ts 中的 cos 配置`)}async create(e,t){this.cosConfig=await F(e,t.cos),this.cos=new(await(I()))({SecretId:this.cosConfig.secretId,SecretKey:this.cosConfig.secretKey}),u.default.info(`开始上传到 COS...`),u.default.info(` Bucket: ${this.cosConfig.bucket}`),u.default.info(` 区域: ${this.cosConfig.region}`),u.default.info(` 路径: ${this.cosConfig.uploadPath}`)}async uploadFile(e){let t=`${this.cosConfig.uploadPath}/${e.fileName}`.replace(/\/+/g,`/`);if(!this.cosConfig.overwrite)try{return await this.cos.headObject({Bucket:this.cosConfig.bucket,Region:this.cosConfig.region,Key:t}),{status:`skipped`}}catch{}return await this.cos.putObject({Bucket:this.cosConfig.bucket,Region:this.cosConfig.region,Key:t,StorageClass:`STANDARD`,Body:r.default.createReadStream(e.filePath)}),{status:`uploaded`}}finalize(){u.default.success(`上传完成!`),u.default.info(` CDN 地址: ${this.cosConfig.cdnUrl}${this.cosConfig.uploadPath}/`)}};function R(e){switch(e.upload.provider||`cos`){case`cos`:return new L;default:throw Error(`不支持的上传 provider: ${e.upload.provider}`)}}async function z(e,t,n){let a=R(n);a.validateConfig(n);let o=e.filter(e=>r.default.existsSync(e)?r.default.statSync(e).size>0:!1).map(e=>{let t=r.default.statSync(e);return{filePath:e,fileName:i.default.basename(e),sizeKB:(t.size/1024).toFixed(2)}});if(o.length===0){u.default.error(`没有有效的文件可上传`);return}await a.create(t,n);let s=(0,p.default)(n.upload.concurrency??5);await Promise.all(o.map(e=>s(async()=>{try{(await a.uploadFile(e)).status===`skipped`?u.default.info(` 跳过 ${e.fileName} (远端已存在)`):u.default.success(` 完成 ${e.fileName} (${e.sizeKB} KB)`)}catch(t){u.default.error(` 失败 ${e.fileName} 上传失败:`,t.message)}}))),a.finalize()}const B=i.default.dirname((()=>{try{return r.default.realpathSync((0,o.fileURLToPath)(require(`url`).pathToFileURL(__filename).href))}catch{return(0,o.fileURLToPath)(require(`url`).pathToFileURL(__filename).href)}})()),V=JSON.parse(r.default.readFileSync(i.default.resolve(B,`../package.json`),`utf-8`)),H=new s.CAC(`charbi`);H.version(V.version),H.option(`--mode <mode>`,`development 或 production`),H.command(``).action(U),H.command(`build`).option(`--no-cache`,`强制重新下载字体文件`).action(W),H.command(`upload`).action(G);async function U(e,t){await W({cache:!0},t),await G(void 0,t)}async function W(e,
|
|
32
|
+
`,_=i.default.join(l,h);r.default.writeFileSync(_,g);let S=(p/1024).toFixed(2);u.default.success(`生成汇总文件: ${h} (${S} KB)`)}function C(e){return e.replace(/\/\/.*$/gm,``).replace(/\/\*[\s\S]*?\*\//g,``).replace(/\/\*\*[\s\S]*?\*\//g,``)}function w(e){return e.replace(/<!--[\s\S]*?-->/g,``)}function T(e){return e.replace(/\/\*[\s\S]*?\*\//g,``)}function E(e){let t=e;return t=t.replace(/<template[^>]*>([\s\S]*?)<\/template>/gi,(e,t)=>`<template>${w(t)}</template>`),t=t.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,(e,t)=>`<script>${C(t)}<\/script>`),t=t.replace(/<style[^>]*>([\s\S]*?)<\/style>/gi,(e,t)=>`<style>${T(t)}</style>`),t}function D(e,t){switch(t){case`vue`:return E(e);case`tsx`:case`ts`:case`jsx`:case`js`:return C(e);case`scss`:case`css`:return T(e);default:return e}}function O(e,t){(e.match(/[\u4E00-\u9FA5]/g)||[]).forEach(e=>t.add(e)),(e.match(/\d/g)||[]).forEach(e=>t.add(e)),(e.match(/[a-z]/gi)||[]).forEach(e=>t.add(e)),(e.match(/[·.,;:!?@#$%^&*()_+\-=[\]{}|\\/"'<>,。;:!?、【】《》「」『』()]/g)||[]).forEach(e=>t.add(e))}function k(e){return e?Array.isArray(e)?e:[e]:[]}function A(e,t){for(let n of e)for(let e of n)e.trim()&&t.add(e)}async function j(e){u.default.info(`扫描项目文件...`);let t=await(0,d.default)(e.scan.srcDir.flatMap(t=>e.scan.extensions.map(e=>`${t}/**/*.${e}`)),{cwd:e.root,absolute:!1,onlyFiles:!0});u.default.info(` 找到 ${t.length} 个文件`);let n=new Set;for(let a of t)O(D(r.default.readFileSync(i.default.join(e.root,a),`utf-8`),a.split(`.`).pop()||``),n);A(k(e.scan.extraText),n),u.default.info(` 收集到 ${n.size} 个唯一字符`);for(let e of`0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.;:!?'",。;:!?`)n.add(e);return u.default.info(` 添加默认字符集后共 ${n.size} 个字符`),n}function M(e){return e?Array.isArray(e)?e:[e]:[]}function N(e,t){let n=new Set(e);for(let e of M(t))for(let t of e)t.trim()&&n.add(t);return Array.from(n).join(``)}async function P(e,t,n,a,o=`woff`){u.default.info(`生成字体子集...`);let s=new Map;for(let c of a){let a=e.get(`${c.family}-${c.weight}`);if(!a){u.default.warn(` 跳过 ${c.family} ${c.name} (未下载)`);continue}u.default.info(` 处理 ${c.family} ${c.name}...`);let l=c.format||o,d=N(n,c.extraText);try{let e=await new Promise((e,n)=>{let o=(0,f.default)().src(a).use(f.default.glyph({text:d,hinting:!1}));l===`woff2`?o.use(f.default.ttf2woff2()):l===`woff`&&o.use(f.default.ttf2woff()),o.dest(t).run((a,o)=>{if(a)n(a);else if(o&&o[0]){let n=o[0],a=l===`woff2`?`woff2`:l,s=`${_(c.family)}-${c.weight}.${a}`,u=i.default.join(t,s);n.path&&r.default.existsSync(n.path)&&r.default.renameSync(n.path,u),e({outputPath:u,size:r.default.statSync(u).size})}else n(Error(`No output file generated`))})}),n=(e.size/1024).toFixed(2);u.default.success(` 完成 ${c.family} ${c.name} (${n} KB)`),s.has(c.family)||s.set(c.family,[]),s.get(c.family).push({config:c,filePath:e.outputPath,size:e.size,format:l})}catch(e){u.default.error(` 失败 ${c.family} ${c.name}: ${e.message}`)}}return s}async function F(e,t){if(!t.basePath)throw Error(`COS 配置缺少 basePath,请在 fonts.config.ts 中设置 cos.basePath`);if(!t.bucket)throw Error(`COS 配置缺少 bucket,请在 fonts.config.ts 中设置 cos.bucket`);if(!t.region)throw Error(`COS 配置缺少 region,请在 fonts.config.ts 中设置 cos.region`);if(!t.cdnUrl)throw Error(`COS 配置缺少 cdnUrl,请在 fonts.config.ts 中设置 cos.cdnUrl`);let n=t.basePath.replace(`{version}`,e),r=[];r.push({type:`input`,name:`secretId`,message:`请输入腾讯云 SecretId:`,validate:e=>e.length>0||`SecretId 不能为空`}),r.push({type:`password`,name:`secretKey`,message:`请输入腾讯云 SecretKey:`,validate:e=>e.length>0||`SecretKey 不能为空`}),t.overwrite===void 0&&r.push({type:`confirm`,name:`overwrite`,message:`如果文件已存在,是否覆盖?`,initial:!1});let i=await m.default.prompt(r);return{secretId:i.secretId,secretKey:i.secretKey,bucket:t.bucket,region:t.region,uploadPath:n,cdnUrl:t.cdnUrl,overwrite:t.overwrite??i.overwrite??!1}}async function I(){try{let e=await import(`cos-nodejs-sdk-v5`);return e.default||e}catch{throw Error(`缺少依赖 cos-nodejs-sdk-v5,请在使用项目中安装该包后重试`)}}var L=class{validateConfig(e){if(!e.cos.basePath||!e.cos.bucket||!e.cos.region||!e.cos.cdnUrl)throw Error(`COS 上传配置不完整,请检查 fonts.config.ts 中的 cos 配置`)}async create(e,t){this.cosConfig=await F(e,t.cos),this.cos=new(await(I()))({SecretId:this.cosConfig.secretId,SecretKey:this.cosConfig.secretKey}),u.default.info(`开始上传到 COS...`),u.default.info(` Bucket: ${this.cosConfig.bucket}`),u.default.info(` 区域: ${this.cosConfig.region}`),u.default.info(` 路径: ${this.cosConfig.uploadPath}`)}async uploadFile(e){let t=`${this.cosConfig.uploadPath}/${e.fileName}`.replace(/\/+/g,`/`);if(!this.cosConfig.overwrite)try{return await this.cos.headObject({Bucket:this.cosConfig.bucket,Region:this.cosConfig.region,Key:t}),{status:`skipped`}}catch{}return await this.cos.putObject({Bucket:this.cosConfig.bucket,Region:this.cosConfig.region,Key:t,StorageClass:`STANDARD`,Body:r.default.createReadStream(e.filePath)}),{status:`uploaded`}}finalize(){u.default.success(`上传完成!`),u.default.info(` CDN 地址: ${this.cosConfig.cdnUrl}${this.cosConfig.uploadPath}/`)}};function R(e){switch(e.upload.provider||`cos`){case`cos`:return new L;default:throw Error(`不支持的上传 provider: ${e.upload.provider}`)}}async function z(e,t,n){let a=R(n);a.validateConfig(n);let o=e.filter(e=>r.default.existsSync(e)?r.default.statSync(e).size>0:!1).map(e=>{let t=r.default.statSync(e);return{filePath:e,fileName:i.default.basename(e),sizeKB:(t.size/1024).toFixed(2)}});if(o.length===0){u.default.error(`没有有效的文件可上传`);return}await a.create(t,n);let s=(0,p.default)(n.upload.concurrency??5);await Promise.all(o.map(e=>s(async()=>{try{(await a.uploadFile(e)).status===`skipped`?u.default.info(` 跳过 ${e.fileName} (远端已存在)`):u.default.success(` 完成 ${e.fileName} (${e.sizeKB} KB)`)}catch(t){u.default.error(` 失败 ${e.fileName} 上传失败:`,t.message)}}))),a.finalize()}const B=i.default.dirname((()=>{try{return r.default.realpathSync((0,o.fileURLToPath)(require(`url`).pathToFileURL(__filename).href))}catch{return(0,o.fileURLToPath)(require(`url`).pathToFileURL(__filename).href)}})()),V=JSON.parse(r.default.readFileSync(i.default.resolve(B,`../package.json`),`utf-8`)),H=new s.CAC(`charbi`);H.version(V.version),H.option(`--mode <mode>`,`development 或 production`),H.command(``).action(U),H.command(`build`).option(`--no-cache`,`强制重新下载字体文件`).action(W),H.command(`upload`).action(G);async function U(e,t){await W({cache:!0},t),await G(void 0,t)}async function W(e,t){let o=t?.mode||`development`,s=await n.loadConfig(o),c=n.getVersion(s.version);u.default.info(`charbi`),u.default.info(` 模式: ${o}`),u.default.info(` 版本基线: ${c}`),u.default.info(` 格式: ${s.output.format}`);let l=i.default.join(s.cacheDir,`subsets`);r.default.mkdirSync(l,{recursive:!0});for(let e of r.default.readdirSync(l))r.default.unlinkSync(i.default.join(l,e));let d=await g(s.cacheDir,s.fonts,!e.cache);d.size===0&&(u.default.error(`没有可用的字体文件,构建失败`),a.default.exit(1));let f=await P(d,l,await j(s),s.fonts,s.output.format),p=0,m=0;for(let e of f.values())for(let t of e)p+=t.size,m++;let h=(p/1024).toFixed(2);u.default.success(`字体子集生成完成!`),u.default.info(` 生成文件: ${m} 个`),u.default.info(` 总大小: ${h} KB`),u.default.info(` 输出目录: ${l}`);let _=c;u.default.info(` 字体版本: ${_}`),await S(f,s,_,s.output.format)}async function G(e,t){let o=t?.mode||`development`,s=await n.loadConfig(o),c=n.getVersion(s.version);u.default.info(`charbi upload`),u.default.info(` 模式: ${o}`),u.default.info(` 版本: ${c}`);let l=i.default.join(s.cacheDir,`subsets`);r.default.existsSync(l)||(u.default.error(`没有找到字体文件目录: ${l}`),u.default.error(`请先执行 build 命令`),a.default.exit(1));let d=[];for(let e of r.default.readdirSync(l)){let t=i.default.join(l,e);r.default.statSync(t).isFile()&&d.push(t)}d.length===0&&(u.default.error(`没有找到字体文件,请先执行 build`),a.default.exit(1)),await z(d,c,s)}H.help(),H.parse();
|
package/dist/cli.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{t as e}from"./schema-BuMY-k7u.mjs";import{getVersion as t,loadConfig as n}from"./config/loader.mjs";import r from"node:fs";import i from"node:path";import a from"node:process";import{fileURLToPath as o}from"node:url";import{CAC as s}from"cac";import c from"node:http";import l from"node:https";import u from"consola";import d from"fast-glob";import f from"fontmin";import p from"p-limit";import m from"enquirer";async function h(e,t){return new Promise((n,i)=>{let a=e.startsWith(`https`)?l:c,o=r.createWriteStream(t);a.get(e,e=>{if(e.statusCode!==200){o.close(),r.unlink(t,()=>{}),i(Error(`下载失败: ${e.statusCode}`));return}e.pipe(o),o.on(`finish`,()=>{if(o.close(),r.statSync(t).size===0){r.unlink(t,()=>{}),i(Error(`下载的文件为空`));return}n()})}).on(`error`,e=>{o.close(),r.unlink(t,()=>{}),i(e)})})}async function g(e,t,n=!1){u.info(`下载字体文件...`),r.mkdirSync(e,{recursive:!0});let a=new Map;for(let o of t){let t=`${o.family}-${o.weight}.ttf`,s=i.join(e,t);if(n&&r.existsSync(s)&&r.unlinkSync(s),r.existsSync(s)){let e=r.statSync(s);if(e.size===0)r.unlinkSync(s);else{let t=(e.size/1024).toFixed(2);u.info(` ✓ ${o.family} ${o.name} (缓存, ${t} KB)`),a.set(`${o.family}-${o.weight}`,s);continue}}u.info(` ↓ ${o.family} ${o.name}...`);try{await h(o.url,s);let e=(r.statSync(s).size/1024).toFixed(2);u.success(` 完成 ${t} (${e} KB)`),a.set(`${o.family}-${o.weight}`,s)}catch(e){u.error(` 失败 ${o.family} ${o.name} 下载失败:`,e.message),r.existsSync(s)&&r.unlinkSync(s)}}return a}function _(e){return e.replace(/\s+/g,``)}function v(e,t,n,r){let{cos:i}=e;if(i.cdnUrl){if(!i.basePath)throw Error(`COS 配置缺少 basePath,请在 fonts.config.ts 中设置 cos.basePath`);let e=`${_(t.family)}-${t.weight}.${r}`,a=i.basePath.replace(`{version}`,n),o=a.startsWith(`/`)?a.slice(1):a;return`${i.cdnUrl}/${o}/${e}`.replace(/\/+/g,`/`)}return`./fonts/${_(t.family)}-${t.weight}.${r}`}function y(e,t,n,r,i=`normal`){return`@font-face {
|
|
1
|
+
import{t as e}from"./schema-BuMY-k7u.mjs";import{getVersion as t,loadConfig as n}from"./config/loader.mjs";import r from"node:fs";import i from"node:path";import a from"node:process";import{fileURLToPath as o}from"node:url";import{CAC as s}from"cac";import c from"node:http";import l from"node:https";import u from"consola";import d from"fast-glob";import f from"fontmin";import p from"p-limit";import m from"enquirer";async function h(e,t){return new Promise((n,i)=>{let a=e.startsWith(`https`)?l:c,o=r.createWriteStream(t);a.get(e,e=>{if(e.statusCode!==200){o.close(),r.unlink(t,()=>{}),i(Error(`下载失败: ${e.statusCode}`));return}e.pipe(o),o.on(`finish`,()=>{if(o.close(),r.statSync(t).size===0){r.unlink(t,()=>{}),i(Error(`下载的文件为空`));return}n()})}).on(`error`,e=>{o.close(),r.unlink(t,()=>{}),i(e)})})}async function g(e,t,n=!1){u.info(`下载字体文件...`),u.info(` 缓存目录: ${e}`),r.mkdirSync(e,{recursive:!0});let a=new Map;for(let o of t){let t=`${o.family}-${o.weight}.ttf`,s=i.join(e,t);if(n&&r.existsSync(s)&&r.unlinkSync(s),r.existsSync(s)){let e=r.statSync(s);if(e.size===0)r.unlinkSync(s);else{let t=(e.size/1024).toFixed(2);u.info(` ✓ ${o.family} ${o.name} (缓存, ${t} KB)`),a.set(`${o.family}-${o.weight}`,s);continue}}u.info(` ↓ ${o.family} ${o.name}...`);try{await h(o.url,s);let e=(r.statSync(s).size/1024).toFixed(2);u.success(` 完成 ${t} (${e} KB)`),a.set(`${o.family}-${o.weight}`,s)}catch(e){u.error(` 失败 ${o.family} ${o.name} 下载失败:`,e.message),r.existsSync(s)&&r.unlinkSync(s)}}return a}function _(e){return e.replace(/\s+/g,``)}function v(e,t,n,r){let{cos:i}=e;if(i.cdnUrl){if(!i.basePath)throw Error(`COS 配置缺少 basePath,请在 fonts.config.ts 中设置 cos.basePath`);let e=`${_(t.family)}-${t.weight}.${r}`,a=i.basePath.replace(`{version}`,n),o=a.startsWith(`/`)?a.slice(1):a;return`${i.cdnUrl}/${o}/${e}`.replace(/\/+/g,`/`)}return`./fonts/${_(t.family)}-${t.weight}.${r}`}function y(e,t,n,r,i=`normal`){return`@font-face {
|
|
2
2
|
font-family: '${e}';
|
|
3
3
|
src: url('${n}') format('${r}');
|
|
4
4
|
font-display: swap;
|
|
@@ -29,4 +29,4 @@ import{t as e}from"./schema-BuMY-k7u.mjs";import{getVersion as t,loadConfig as n
|
|
|
29
29
|
|
|
30
30
|
${f.map(t=>x(`${e}/${t.replace(/\.(scss|css)$/,``)}`,n.output.styleFormat)).join(`
|
|
31
31
|
`)}
|
|
32
|
-
`,_=i.join(l,h);r.writeFileSync(_,g);let S=(p/1024).toFixed(2);u.success(`生成汇总文件: ${h} (${S} KB)`)}function C(e){return e.replace(/\/\/.*$/gm,``).replace(/\/\*[\s\S]*?\*\//g,``).replace(/\/\*\*[\s\S]*?\*\//g,``)}function w(e){return e.replace(/<!--[\s\S]*?-->/g,``)}function T(e){return e.replace(/\/\*[\s\S]*?\*\//g,``)}function E(e){let t=e;return t=t.replace(/<template[^>]*>([\s\S]*?)<\/template>/gi,(e,t)=>`<template>${w(t)}</template>`),t=t.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,(e,t)=>`<script>${C(t)}<\/script>`),t=t.replace(/<style[^>]*>([\s\S]*?)<\/style>/gi,(e,t)=>`<style>${T(t)}</style>`),t}function D(e,t){switch(t){case`vue`:return E(e);case`tsx`:case`ts`:case`jsx`:case`js`:return C(e);case`scss`:case`css`:return T(e);default:return e}}function O(e,t){(e.match(/[\u4E00-\u9FA5]/g)||[]).forEach(e=>t.add(e)),(e.match(/\d/g)||[]).forEach(e=>t.add(e)),(e.match(/[a-z]/gi)||[]).forEach(e=>t.add(e)),(e.match(/[·.,;:!?@#$%^&*()_+\-=[\]{}|\\/"'<>,。;:!?、【】《》「」『』()]/g)||[]).forEach(e=>t.add(e))}function k(e){return e?Array.isArray(e)?e:[e]:[]}function A(e,t){for(let n of e)for(let e of n)e.trim()&&t.add(e)}async function j(e){u.info(`扫描项目文件...`);let t=await d(e.scan.srcDir.flatMap(t=>e.scan.extensions.map(e=>`${t}/**/*.${e}`)),{cwd:e.root,absolute:!1,onlyFiles:!0});u.info(` 找到 ${t.length} 个文件`);let n=new Set;for(let a of t)O(D(r.readFileSync(i.join(e.root,a),`utf-8`),a.split(`.`).pop()||``),n);A(k(e.scan.extraText),n),u.info(` 收集到 ${n.size} 个唯一字符`);for(let e of`0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.;:!?'",。;:!?`)n.add(e);return u.info(` 添加默认字符集后共 ${n.size} 个字符`),n}function M(e){return e?Array.isArray(e)?e:[e]:[]}function N(e,t){let n=new Set(e);for(let e of M(t))for(let t of e)t.trim()&&n.add(t);return Array.from(n).join(``)}async function P(e,t,n,a,o=`woff`){u.info(`生成字体子集...`);let s=new Map;for(let c of a){let a=e.get(`${c.family}-${c.weight}`);if(!a){u.warn(` 跳过 ${c.family} ${c.name} (未下载)`);continue}u.info(` 处理 ${c.family} ${c.name}...`);let l=c.format||o,d=N(n,c.extraText);try{let e=await new Promise((e,n)=>{let o=f().src(a).use(f.glyph({text:d,hinting:!1}));l===`woff2`?o.use(f.ttf2woff2()):l===`woff`&&o.use(f.ttf2woff()),o.dest(t).run((a,o)=>{if(a)n(a);else if(o&&o[0]){let n=o[0],a=l===`woff2`?`woff2`:l,s=`${_(c.family)}-${c.weight}.${a}`,u=i.join(t,s);n.path&&r.existsSync(n.path)&&r.renameSync(n.path,u),e({outputPath:u,size:r.statSync(u).size})}else n(Error(`No output file generated`))})}),n=(e.size/1024).toFixed(2);u.success(` 完成 ${c.family} ${c.name} (${n} KB)`),s.has(c.family)||s.set(c.family,[]),s.get(c.family).push({config:c,filePath:e.outputPath,size:e.size,format:l})}catch(e){u.error(` 失败 ${c.family} ${c.name}: ${e.message}`)}}return s}async function F(e,t){if(!t.basePath)throw Error(`COS 配置缺少 basePath,请在 fonts.config.ts 中设置 cos.basePath`);if(!t.bucket)throw Error(`COS 配置缺少 bucket,请在 fonts.config.ts 中设置 cos.bucket`);if(!t.region)throw Error(`COS 配置缺少 region,请在 fonts.config.ts 中设置 cos.region`);if(!t.cdnUrl)throw Error(`COS 配置缺少 cdnUrl,请在 fonts.config.ts 中设置 cos.cdnUrl`);let n=t.basePath.replace(`{version}`,e),r=[];r.push({type:`input`,name:`secretId`,message:`请输入腾讯云 SecretId:`,validate:e=>e.length>0||`SecretId 不能为空`}),r.push({type:`password`,name:`secretKey`,message:`请输入腾讯云 SecretKey:`,validate:e=>e.length>0||`SecretKey 不能为空`}),t.overwrite===void 0&&r.push({type:`confirm`,name:`overwrite`,message:`如果文件已存在,是否覆盖?`,initial:!1});let i=await m.prompt(r);return{secretId:i.secretId,secretKey:i.secretKey,bucket:t.bucket,region:t.region,uploadPath:n,cdnUrl:t.cdnUrl,overwrite:t.overwrite??i.overwrite??!1}}async function I(){try{let e=await import(`cos-nodejs-sdk-v5`);return e.default||e}catch{throw Error(`缺少依赖 cos-nodejs-sdk-v5,请在使用项目中安装该包后重试`)}}var L=class{validateConfig(e){if(!e.cos.basePath||!e.cos.bucket||!e.cos.region||!e.cos.cdnUrl)throw Error(`COS 上传配置不完整,请检查 fonts.config.ts 中的 cos 配置`)}async create(e,t){this.cosConfig=await F(e,t.cos),this.cos=new(await(I()))({SecretId:this.cosConfig.secretId,SecretKey:this.cosConfig.secretKey}),u.info(`开始上传到 COS...`),u.info(` Bucket: ${this.cosConfig.bucket}`),u.info(` 区域: ${this.cosConfig.region}`),u.info(` 路径: ${this.cosConfig.uploadPath}`)}async uploadFile(e){let t=`${this.cosConfig.uploadPath}/${e.fileName}`.replace(/\/+/g,`/`);if(!this.cosConfig.overwrite)try{return await this.cos.headObject({Bucket:this.cosConfig.bucket,Region:this.cosConfig.region,Key:t}),{status:`skipped`}}catch{}return await this.cos.putObject({Bucket:this.cosConfig.bucket,Region:this.cosConfig.region,Key:t,StorageClass:`STANDARD`,Body:r.createReadStream(e.filePath)}),{status:`uploaded`}}finalize(){u.success(`上传完成!`),u.info(` CDN 地址: ${this.cosConfig.cdnUrl}${this.cosConfig.uploadPath}/`)}};function R(e){switch(e.upload.provider||`cos`){case`cos`:return new L;default:throw Error(`不支持的上传 provider: ${e.upload.provider}`)}}async function z(e,t,n){let a=R(n);a.validateConfig(n);let o=e.filter(e=>r.existsSync(e)?r.statSync(e).size>0:!1).map(e=>{let t=r.statSync(e);return{filePath:e,fileName:i.basename(e),sizeKB:(t.size/1024).toFixed(2)}});if(o.length===0){u.error(`没有有效的文件可上传`);return}await a.create(t,n);let s=p(n.upload.concurrency??5);await Promise.all(o.map(e=>s(async()=>{try{(await a.uploadFile(e)).status===`skipped`?u.info(` 跳过 ${e.fileName} (远端已存在)`):u.success(` 完成 ${e.fileName} (${e.sizeKB} KB)`)}catch(t){u.error(` 失败 ${e.fileName} 上传失败:`,t.message)}}))),a.finalize()}const B=i.dirname((()=>{try{return r.realpathSync(o(import.meta.url))}catch{return o(import.meta.url)}})()),V=JSON.parse(r.readFileSync(i.resolve(B,`../package.json`),`utf-8`)),H=new s(`charbi`);H.version(V.version),H.option(`--mode <mode>`,`development 或 production`),H.command(``).action(U),H.command(`build`).option(`--no-cache`,`强制重新下载字体文件`).action(W),H.command(`upload`).action(G);async function U(e,t){await W({cache:!0},t),await G(void 0,t)}async function W(o
|
|
32
|
+
`,_=i.join(l,h);r.writeFileSync(_,g);let S=(p/1024).toFixed(2);u.success(`生成汇总文件: ${h} (${S} KB)`)}function C(e){return e.replace(/\/\/.*$/gm,``).replace(/\/\*[\s\S]*?\*\//g,``).replace(/\/\*\*[\s\S]*?\*\//g,``)}function w(e){return e.replace(/<!--[\s\S]*?-->/g,``)}function T(e){return e.replace(/\/\*[\s\S]*?\*\//g,``)}function E(e){let t=e;return t=t.replace(/<template[^>]*>([\s\S]*?)<\/template>/gi,(e,t)=>`<template>${w(t)}</template>`),t=t.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,(e,t)=>`<script>${C(t)}<\/script>`),t=t.replace(/<style[^>]*>([\s\S]*?)<\/style>/gi,(e,t)=>`<style>${T(t)}</style>`),t}function D(e,t){switch(t){case`vue`:return E(e);case`tsx`:case`ts`:case`jsx`:case`js`:return C(e);case`scss`:case`css`:return T(e);default:return e}}function O(e,t){(e.match(/[\u4E00-\u9FA5]/g)||[]).forEach(e=>t.add(e)),(e.match(/\d/g)||[]).forEach(e=>t.add(e)),(e.match(/[a-z]/gi)||[]).forEach(e=>t.add(e)),(e.match(/[·.,;:!?@#$%^&*()_+\-=[\]{}|\\/"'<>,。;:!?、【】《》「」『』()]/g)||[]).forEach(e=>t.add(e))}function k(e){return e?Array.isArray(e)?e:[e]:[]}function A(e,t){for(let n of e)for(let e of n)e.trim()&&t.add(e)}async function j(e){u.info(`扫描项目文件...`);let t=await d(e.scan.srcDir.flatMap(t=>e.scan.extensions.map(e=>`${t}/**/*.${e}`)),{cwd:e.root,absolute:!1,onlyFiles:!0});u.info(` 找到 ${t.length} 个文件`);let n=new Set;for(let a of t)O(D(r.readFileSync(i.join(e.root,a),`utf-8`),a.split(`.`).pop()||``),n);A(k(e.scan.extraText),n),u.info(` 收集到 ${n.size} 个唯一字符`);for(let e of`0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.;:!?'",。;:!?`)n.add(e);return u.info(` 添加默认字符集后共 ${n.size} 个字符`),n}function M(e){return e?Array.isArray(e)?e:[e]:[]}function N(e,t){let n=new Set(e);for(let e of M(t))for(let t of e)t.trim()&&n.add(t);return Array.from(n).join(``)}async function P(e,t,n,a,o=`woff`){u.info(`生成字体子集...`);let s=new Map;for(let c of a){let a=e.get(`${c.family}-${c.weight}`);if(!a){u.warn(` 跳过 ${c.family} ${c.name} (未下载)`);continue}u.info(` 处理 ${c.family} ${c.name}...`);let l=c.format||o,d=N(n,c.extraText);try{let e=await new Promise((e,n)=>{let o=f().src(a).use(f.glyph({text:d,hinting:!1}));l===`woff2`?o.use(f.ttf2woff2()):l===`woff`&&o.use(f.ttf2woff()),o.dest(t).run((a,o)=>{if(a)n(a);else if(o&&o[0]){let n=o[0],a=l===`woff2`?`woff2`:l,s=`${_(c.family)}-${c.weight}.${a}`,u=i.join(t,s);n.path&&r.existsSync(n.path)&&r.renameSync(n.path,u),e({outputPath:u,size:r.statSync(u).size})}else n(Error(`No output file generated`))})}),n=(e.size/1024).toFixed(2);u.success(` 完成 ${c.family} ${c.name} (${n} KB)`),s.has(c.family)||s.set(c.family,[]),s.get(c.family).push({config:c,filePath:e.outputPath,size:e.size,format:l})}catch(e){u.error(` 失败 ${c.family} ${c.name}: ${e.message}`)}}return s}async function F(e,t){if(!t.basePath)throw Error(`COS 配置缺少 basePath,请在 fonts.config.ts 中设置 cos.basePath`);if(!t.bucket)throw Error(`COS 配置缺少 bucket,请在 fonts.config.ts 中设置 cos.bucket`);if(!t.region)throw Error(`COS 配置缺少 region,请在 fonts.config.ts 中设置 cos.region`);if(!t.cdnUrl)throw Error(`COS 配置缺少 cdnUrl,请在 fonts.config.ts 中设置 cos.cdnUrl`);let n=t.basePath.replace(`{version}`,e),r=[];r.push({type:`input`,name:`secretId`,message:`请输入腾讯云 SecretId:`,validate:e=>e.length>0||`SecretId 不能为空`}),r.push({type:`password`,name:`secretKey`,message:`请输入腾讯云 SecretKey:`,validate:e=>e.length>0||`SecretKey 不能为空`}),t.overwrite===void 0&&r.push({type:`confirm`,name:`overwrite`,message:`如果文件已存在,是否覆盖?`,initial:!1});let i=await m.prompt(r);return{secretId:i.secretId,secretKey:i.secretKey,bucket:t.bucket,region:t.region,uploadPath:n,cdnUrl:t.cdnUrl,overwrite:t.overwrite??i.overwrite??!1}}async function I(){try{let e=await import(`cos-nodejs-sdk-v5`);return e.default||e}catch{throw Error(`缺少依赖 cos-nodejs-sdk-v5,请在使用项目中安装该包后重试`)}}var L=class{validateConfig(e){if(!e.cos.basePath||!e.cos.bucket||!e.cos.region||!e.cos.cdnUrl)throw Error(`COS 上传配置不完整,请检查 fonts.config.ts 中的 cos 配置`)}async create(e,t){this.cosConfig=await F(e,t.cos),this.cos=new(await(I()))({SecretId:this.cosConfig.secretId,SecretKey:this.cosConfig.secretKey}),u.info(`开始上传到 COS...`),u.info(` Bucket: ${this.cosConfig.bucket}`),u.info(` 区域: ${this.cosConfig.region}`),u.info(` 路径: ${this.cosConfig.uploadPath}`)}async uploadFile(e){let t=`${this.cosConfig.uploadPath}/${e.fileName}`.replace(/\/+/g,`/`);if(!this.cosConfig.overwrite)try{return await this.cos.headObject({Bucket:this.cosConfig.bucket,Region:this.cosConfig.region,Key:t}),{status:`skipped`}}catch{}return await this.cos.putObject({Bucket:this.cosConfig.bucket,Region:this.cosConfig.region,Key:t,StorageClass:`STANDARD`,Body:r.createReadStream(e.filePath)}),{status:`uploaded`}}finalize(){u.success(`上传完成!`),u.info(` CDN 地址: ${this.cosConfig.cdnUrl}${this.cosConfig.uploadPath}/`)}};function R(e){switch(e.upload.provider||`cos`){case`cos`:return new L;default:throw Error(`不支持的上传 provider: ${e.upload.provider}`)}}async function z(e,t,n){let a=R(n);a.validateConfig(n);let o=e.filter(e=>r.existsSync(e)?r.statSync(e).size>0:!1).map(e=>{let t=r.statSync(e);return{filePath:e,fileName:i.basename(e),sizeKB:(t.size/1024).toFixed(2)}});if(o.length===0){u.error(`没有有效的文件可上传`);return}await a.create(t,n);let s=p(n.upload.concurrency??5);await Promise.all(o.map(e=>s(async()=>{try{(await a.uploadFile(e)).status===`skipped`?u.info(` 跳过 ${e.fileName} (远端已存在)`):u.success(` 完成 ${e.fileName} (${e.sizeKB} KB)`)}catch(t){u.error(` 失败 ${e.fileName} 上传失败:`,t.message)}}))),a.finalize()}const B=i.dirname((()=>{try{return r.realpathSync(o(import.meta.url))}catch{return o(import.meta.url)}})()),V=JSON.parse(r.readFileSync(i.resolve(B,`../package.json`),`utf-8`)),H=new s(`charbi`);H.version(V.version),H.option(`--mode <mode>`,`development 或 production`),H.command(``).action(U),H.command(`build`).option(`--no-cache`,`强制重新下载字体文件`).action(W),H.command(`upload`).action(G);async function U(e,t){await W({cache:!0},t),await G(void 0,t)}async function W(e,o){let s=o?.mode||`development`,c=await n(s),l=t(c.version);u.info(`charbi`),u.info(` 模式: ${s}`),u.info(` 版本基线: ${l}`),u.info(` 格式: ${c.output.format}`);let d=i.join(c.cacheDir,`subsets`);r.mkdirSync(d,{recursive:!0});for(let e of r.readdirSync(d))r.unlinkSync(i.join(d,e));let f=await g(c.cacheDir,c.fonts,!e.cache);f.size===0&&(u.error(`没有可用的字体文件,构建失败`),a.exit(1));let p=await P(f,d,await j(c),c.fonts,c.output.format),m=0,h=0;for(let e of p.values())for(let t of e)m+=t.size,h++;let _=(m/1024).toFixed(2);u.success(`字体子集生成完成!`),u.info(` 生成文件: ${h} 个`),u.info(` 总大小: ${_} KB`),u.info(` 输出目录: ${d}`);let v=l;u.info(` 字体版本: ${v}`),await S(p,c,v,c.output.format)}async function G(e,o){let s=o?.mode||`development`,c=await n(s),l=t(c.version);u.info(`charbi upload`),u.info(` 模式: ${s}`),u.info(` 版本: ${l}`);let d=i.join(c.cacheDir,`subsets`);r.existsSync(d)||(u.error(`没有找到字体文件目录: ${d}`),u.error(`请先执行 build 命令`),a.exit(1));let f=[];for(let e of r.readdirSync(d)){let t=i.join(d,e);r.statSync(t).isFile()&&f.push(t)}f.length===0&&(u.error(`没有找到字体文件,请先执行 build`),a.exit(1)),await z(f,l,c)}H.help(),H.parse();export{};
|
package/dist/config/index.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as FONT_ASSETS_DIR, c as OutputConfig, d as StyleFormat, f as UploadConfig, g as defineConfig, h as defaultConfig, i as ExtraText, l as ResolvedConfig, m as UserConfig, n as COSConfig, o as FontConfig, p as UploadProviderType, r as EnvConfig, s as FontFormat, t as BuildConfig, u as ScanConfig } from "../schema-
|
|
1
|
+
import { a as FONT_ASSETS_DIR, c as OutputConfig, d as StyleFormat, f as UploadConfig, g as defineConfig, h as defaultConfig, i as ExtraText, l as ResolvedConfig, m as UserConfig, n as COSConfig, o as FontConfig, p as UploadProviderType, r as EnvConfig, s as FontFormat, t as BuildConfig, u as ScanConfig } from "../schema-BN6N2z3p.cjs";
|
|
2
2
|
export { BuildConfig, COSConfig, EnvConfig, ExtraText, FONT_ASSETS_DIR, FontConfig, FontFormat, OutputConfig, ResolvedConfig, ScanConfig, StyleFormat, UploadConfig, UploadProviderType, UserConfig, defaultConfig, defineConfig };
|
package/dist/config/index.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as FONT_ASSETS_DIR, c as OutputConfig, d as StyleFormat, f as UploadConfig, g as defineConfig, h as defaultConfig, i as ExtraText, l as ResolvedConfig, m as UserConfig, n as COSConfig, o as FontConfig, p as UploadProviderType, r as EnvConfig, s as FontFormat, t as BuildConfig, u as ScanConfig } from "../schema-
|
|
1
|
+
import { a as FONT_ASSETS_DIR, c as OutputConfig, d as StyleFormat, f as UploadConfig, g as defineConfig, h as defaultConfig, i as ExtraText, l as ResolvedConfig, m as UserConfig, n as COSConfig, o as FontConfig, p as UploadProviderType, r as EnvConfig, s as FontFormat, t as BuildConfig, u as ScanConfig } from "../schema-BH0yB0WV.mjs";
|
|
2
2
|
export { BuildConfig, COSConfig, EnvConfig, ExtraText, FONT_ASSETS_DIR, FontConfig, FontFormat, OutputConfig, ResolvedConfig, ScanConfig, StyleFormat, UploadConfig, UploadProviderType, UserConfig, defaultConfig, defineConfig };
|
package/dist/config/loader.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../chunk-Bmb41Sf3.cjs`),t=require(`../schema-ClqJnGnv.cjs`);let n=require(`node:fs`);n=e.t(n);let r=require(`node:path`);r=e.t(r);let i=require(`node:process`);i=e.t(i);let a=require(`node:url`),o=require(`defu`),s=require(`unconfig`),c=require(`node:util`);const l=(0,o.createDefu)((e,t,n)=>{if(Array.isArray(e[t])&&Array.isArray(n))return e[t]=n,!0});function u(){
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../chunk-Bmb41Sf3.cjs`),t=require(`../schema-ClqJnGnv.cjs`);let n=require(`node:fs`);n=e.t(n);let r=require(`node:path`);r=e.t(r);let i=require(`node:process`);i=e.t(i);let a=require(`node:url`),o=require(`defu`),s=require(`unconfig`),c=require(`node:util`);const l=(0,o.createDefu)((e,t,n)=>{if(Array.isArray(e[t])&&Array.isArray(n))return e[t]=n,!0});function u(){return i.default.cwd()}function d(e){if(e)return e;let t=r.default.join(u(),`package.json`);return JSON.parse(n.default.readFileSync(t,`utf-8`)).version||`0.0.1`}function f(e){if(e)return r.default.isAbsolute(e)?e:r.default.join(u(),e);let t=(0,a.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),i=r.default.dirname(t),o;try{o=n.default.realpathSync(i)}catch{o=i}return r.default.join(o,`.cache/fonts`)}function p(e,t){let a=t?.[e]||{development:`.env.development`,production:`.env.production`}[e],o=r.default.join(u(),a);if(n.default.existsSync(o)){let e=(0,c.parseEnv)(n.default.readFileSync(o,`utf-8`));for(let[t,n]of Object.entries(e))i.default.env[t]=n}}async function m(e=`development`){let n=(await(0,s.loadConfig)({sources:[{files:`fonts.config`,extensions:[`ts`,`mts`,`cts`,`js`,`mjs`,`cjs`,`json`,`json5`]}],cwd:u(),defaults:{}})).config||{};p(e,n.build?.env);let r=l(n.build||{},t.n);if(!r.fonts||r.fonts.length===0)throw Error(`未配置字体,请在 fonts.config.ts 的 build.fonts 中添加字体配置`);return{scan:r.scan,fonts:r.fonts,output:r.output,upload:{provider:n.upload?.provider||`cos`,concurrency:n.upload?.concurrency??5},cos:n.cos||{},root:u(),cacheDir:f(n.build?.cacheDir),version:r.version,env:r.env||{},mode:e}}exports.getCacheDir=f,exports.getProjectRoot=u,exports.getVersion=d,exports.loadConfig=m,exports.loadEnvFile=p;
|
package/dist/config/loader.d.cts
CHANGED
package/dist/config/loader.d.mts
CHANGED
package/dist/config/loader.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"../schema-BuMY-k7u.mjs";import t from"node:fs";import n from"node:path";import r from"node:process";import{fileURLToPath as i}from"node:url";import{createDefu as a}from"defu";import{loadConfig as o}from"unconfig";import{parseEnv as s}from"node:util";const c=a((e,t,n)=>{if(Array.isArray(e[t])&&Array.isArray(n))return e[t]=n,!0});function l(){
|
|
1
|
+
import{n as e}from"../schema-BuMY-k7u.mjs";import t from"node:fs";import n from"node:path";import r from"node:process";import{fileURLToPath as i}from"node:url";import{createDefu as a}from"defu";import{loadConfig as o}from"unconfig";import{parseEnv as s}from"node:util";const c=a((e,t,n)=>{if(Array.isArray(e[t])&&Array.isArray(n))return e[t]=n,!0});function l(){return r.cwd()}function u(e){if(e)return e;let r=n.join(l(),`package.json`);return JSON.parse(t.readFileSync(r,`utf-8`)).version||`0.0.1`}function d(e){if(e)return n.isAbsolute(e)?e:n.join(l(),e);let r=i(import.meta.url),a=n.dirname(r),o;try{o=t.realpathSync(a)}catch{o=a}return n.join(o,`.cache/fonts`)}function f(e,i){let a=i?.[e]||{development:`.env.development`,production:`.env.production`}[e],o=n.join(l(),a);if(t.existsSync(o)){let e=s(t.readFileSync(o,`utf-8`));for(let[t,n]of Object.entries(e))r.env[t]=n}}async function p(t=`development`){let n=(await o({sources:[{files:`fonts.config`,extensions:[`ts`,`mts`,`cts`,`js`,`mjs`,`cjs`,`json`,`json5`]}],cwd:l(),defaults:{}})).config||{};f(t,n.build?.env);let r=c(n.build||{},e);if(!r.fonts||r.fonts.length===0)throw Error(`未配置字体,请在 fonts.config.ts 的 build.fonts 中添加字体配置`);return{scan:r.scan,fonts:r.fonts,output:r.output,upload:{provider:n.upload?.provider||`cos`,concurrency:n.upload?.concurrency??5},cos:n.cos||{},root:l(),cacheDir:d(n.build?.cacheDir),version:r.version,env:r.env||{},mode:t}}export{d as getCacheDir,l as getProjectRoot,u as getVersion,p as loadConfig,f as loadEnvFile};
|
|
@@ -46,12 +46,12 @@ interface BuildConfig {
|
|
|
46
46
|
output: OutputConfig;
|
|
47
47
|
version?: string;
|
|
48
48
|
env?: EnvConfig;
|
|
49
|
+
cacheDir?: string;
|
|
49
50
|
}
|
|
50
51
|
interface UserConfig {
|
|
51
52
|
build?: Partial<BuildConfig>;
|
|
52
53
|
upload?: UploadConfig;
|
|
53
54
|
cos?: COSConfig;
|
|
54
|
-
cacheDir?: string;
|
|
55
55
|
}
|
|
56
56
|
interface ResolvedConfig extends Required<Omit<BuildConfig, "version" | "env">> {
|
|
57
57
|
upload: UploadConfig;
|
|
@@ -46,12 +46,12 @@ interface BuildConfig {
|
|
|
46
46
|
output: OutputConfig;
|
|
47
47
|
version?: string;
|
|
48
48
|
env?: EnvConfig;
|
|
49
|
+
cacheDir?: string;
|
|
49
50
|
}
|
|
50
51
|
interface UserConfig {
|
|
51
52
|
build?: Partial<BuildConfig>;
|
|
52
53
|
upload?: UploadConfig;
|
|
53
54
|
cos?: COSConfig;
|
|
54
|
-
cacheDir?: string;
|
|
55
55
|
}
|
|
56
56
|
interface ResolvedConfig extends Required<Omit<BuildConfig, "version" | "env">> {
|
|
57
57
|
upload: UploadConfig;
|