@gem-sdk/pages 17.0.0-staging.15 → 17.0.0-staging.18

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.
@@ -1 +1,7 @@
1
- import{checkNotInOptionFont as t}from"./helpers/check-option-font.js";import{getFontsFromDataBuilder as e}from"./helpers/gen-fonts.js";import{sentryCaptureException as r}from"./helpers/sentry.js";import{THEME_FONT_CSS_KEYS as o}from"./constants/theme-font-keys.js";import{googleFontFamilies as n}from"../constants/googleFontV1.js";let CHROME_UA="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36",IE_UA="Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko";async function getFontForUA(t,e){try{return fetch(t,{headers:{"User-Agent":e}}).then(o=>200===o.status?o.text():(r("getFontForUA",`Unexpected status ${o.status}`,{url:t,UA:e}),""))}catch(o){return r("getFontForUA","Error fetching font",{url:t,UA:e,error:o}),""}}let composeFonts=t=>{let e=t.filter((t,e,r)=>e===r.findIndex(e=>e.family===t.family));return e.map(e=>{let r=t.filter(t=>t.family===e.family).reduce((t,e)=>[...t,...e.variants],[]).filter((t,e,r)=>e===r.findIndex(e=>e===t));return{...e,variants:r}})},GOOGLE_CSS2_OVERRIDES={"Roboto Flex":"https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap"},normalizeFamily=t=>t?.trim().replace(/\s+/g,"+")??"",getFontApiVersion=t=>t.includes("fonts.googleapis.com/css2")?"css2":t.includes("fonts.bunny.net")?"bunny":"css1",getOverrideUrlForFamily=t=>{let e=normalizeFamily(t);return GOOGLE_CSS2_OVERRIDES[t]??GOOGLE_CSS2_OVERRIDES[e]},VARIANT_WEIGHT_MAP={regular:"400",normal:"400",bold:"700",italic:"400italic"},googleFontFamiliesSet=new Set(n),IGNORED_FONT_FAMILIES=[...o,...o.map(t=>`--g-${t}`)],isValidFont=(e,r,o)=>{if(("google"===r||"google"===e.type)&&!googleFontFamiliesSet.has(e.family))return!1;let n="google"===e.type||"bunny"===e.type,a="theme"===e.type&&o,i=t(e.family,r);return!(n&&i)&&(n||!e.type||a)},normalizeVariant=t=>{let e=String(t).toLowerCase().trim();return VARIANT_WEIGHT_MAP[e]??t},sortFontVariants=t=>{let e=t=>{let e=String(t).toLowerCase().trim(),r=e.includes("italic"),o=e.replace("italic","").trim(),n=VARIANT_WEIGHT_MAP[o]??o,a=parseInt(n,10)||400;return{weight:a,isItalic:r}};return[...t].sort((t,r)=>{let o=e(t),n=e(r);return o.weight!==n.weight?o.weight-n.weight:o.isItalic!==n.isItalic?o.isItalic?1:-1:0})},makeUrlBySourceFont=(t,e,r)=>{let o=composeFonts(t).map(t=>{let e=t.variants.map(t=>normalizeVariant(t)),r=sortFontVariants(e);return`${t.family.replace(/ /g,"+")}:${r.join(",")}`}).join("|");if("sans-serif"===o)return;let n=new URLSearchParams;return(n.append("family",o),n.append("display",r?.display||"swap"),"bunny"===e)?`https://fonts.bunny.net/css?${decodeURIComponent(n.toString())}`:(r?.subset&&n.append("subset",r.subset),r?.effect&&n.append("effect",r.effect),`https://fonts.googleapis.com/css?${decodeURIComponent(n.toString())}`)},createFontUrls=(t,e,r,o)=>{let n=t.filter(t=>isValidFont(t,r||"google",o));if(!n.length)return;let a=n.filter((t,e,r)=>e===r.findIndex(e=>e.family===t.family)),i=[],l=[];for(let t of a){let e=getOverrideUrlForFamily(t.family);e&&"bunny"!==r?i.push(e):l.push(t)}let s=l.length?makeUrlBySourceFont(l,r||"google",e):void 0;return i.length&&s?[...i,s]:s?[s,...i]:i};async function getFonts(t,e,o=!0,n){let a=t.filter(t=>!IGNORED_FONT_FAMILIES.includes(t.family)),i=createFontUrls(a,e,n),l=Array.isArray(i)?i:i?[i]:[];if(!l.length)return"";if(o)return l.map(t=>`@import url('${t}');`).join("");let s="",f="";for(let t of l)try{let[e,r]=await Promise.all([getFontForUA(t,"Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko"),getFontForUA(t,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36")]),o=`${e}${r}`;s+=o,f+=`@import url('${t}');`}catch(o){let e=getFontApiVersion(t);r("getFonts",`Error fetching font ${e}`,{url:t,fontType:n,fontApiVersion:e,error:String(o)}),f+="",s+=""}let p=new TextEncoder().encode(s).length;return p<51200?s:f}let extractFontsFromPageTemplate=(t,r)=>{let o=[];return t.forEach(t=>{o.push(...e(t.data,r))}),composeFonts(o)},extractVariantFromTypography=(t,e)=>{let r="400";if(null!=t){let e=String(t).toLowerCase().trim();r=normalizeVariant(e)}let o=r,n=e&&"italic"===e.toLowerCase();return n&&!r.includes("italic")&&(o=r.includes("i")?r:`${r}italic`),o},HEADING_FONT_PREFIX="heading-",SUBHEADING_FONT_PREFIX="subheading-",PARAGRAPH_FONT_PREFIX="paragraph-",extractTypographyVariants=t=>{let e=t?.typography??{},r=t?.font??{},o=new Map;Object.entries(e).forEach(([t,e])=>{if(!e||"object"!=typeof e)return;let n=t.startsWith(HEADING_FONT_PREFIX)||t.startsWith(SUBHEADING_FONT_PREFIX)?r.heading?"heading":void 0:t.startsWith(PARAGRAPH_FONT_PREFIX)&&r.body?"body":void 0,a=e.desktop,i=a?.fontFamily,l=i||n;["desktop","mobile","tablet"].forEach(t=>{let n=e[t];if(!n||"object"!=typeof n)return;let i=n.fontFamily||l;if(!i||"string"!=typeof i||!r[i])return;let s=n.fontWeight??a?.fontWeight,f=n.fontStyle??a?.fontStyle;if(null==s)return;let p=extractVariantFromTypography(s,f);o.has(i)||o.set(i,new Set),o.get(i).add(p)})});let n={};return o.forEach((t,e)=>{let o=r[e];o&&(n[e]={variants:Array.from(t).sort(),family:o.family})}),n},mapTypographyToFontFamily=t=>{let e=t?.typography??{},r=t?.font??{},o=t?.font??{},n={};return Object.entries(e).forEach(([t,e])=>{if(!e||"object"!=typeof e)return;let a=e.desktop,i=e.mobile,l=e.tablet,s=t.startsWith(HEADING_FONT_PREFIX)||t.startsWith(SUBHEADING_FONT_PREFIX)?o.heading?"heading":void 0:t.startsWith(PARAGRAPH_FONT_PREFIX)&&o.body?"body":void 0,f=a?.fontFamily||i?.fontFamily||l?.fontFamily||s;if(!f||"string"!=typeof f)return;let p=r[f],y=o[f],c=p?.family||y?.family||f,m=p?.type||y?.type||"google";c&&(n[t]={family:c,type:m})}),n},getFontLinkFromGlobalStyle=async(t,e)=>{if(!t)return"";try{let r=JSON.parse(t),o=r?.font??{},n=Object.values(o),a=extractTypographyVariants(r);Object.keys(a).length>0&&(n=Object.entries(o).filter(([t])=>a[t]).map(([t,e])=>({...e,variants:a[t].variants})));let i=composeFonts(n);return getFonts(i,void 0,void 0,e)}catch{return""}},getFontFromGlobalStyle=(t,e)=>{if(!t)return"";try{let r=JSON.parse(t),o=r?.font??{},n=Object.entries(o).map(([,t])=>t);return getFonts(n,void 0,void 0,e)}catch{return""}};async function getFontStyleFromPageTemplate(t,e,r){let o,n=null;if(r)try{n=JSON.parse(r),o=mapTypographyToFontFamily(n)}catch{}let a=extractFontsFromPageTemplate(t,o);if(!n){if(0===a.length)return[];let t=await getFonts(a,void 0,void 0,e);return t?[t]:[]}let i=extractTypographyVariants(n),l=new Map;for(let t of Object.values(i)){let e=l.get(t.family);if(!e){l.set(t.family,new Set(t.variants));continue}t.variants.forEach(t=>e.add(t))}if(0===(a=a.map(t=>{let e=l.get(t.family);if(!e)return t;let r=t.variants.filter(t=>!e.has(t));return 0===r.length?null:{...t,variants:r}}).filter(t=>null!==t)).length)return[];let s=await getFonts(a,void 0,void 0,e);return s?[s]:[]}export{composeFonts,createFontUrls,extractTypographyVariants,getFontFromGlobalStyle,getFontLinkFromGlobalStyle,getFontStyleFromPageTemplate,getFonts,mapTypographyToFontFamily};
1
+ import{checkNotInOptionFont as t}from"./helpers/check-option-font.js";import{getFontsFromDataBuilder as e}from"./helpers/gen-fonts.js";import{sentryCaptureException as r}from"./helpers/sentry.js";import{THEME_FONT_CSS_KEYS as a}from"./constants/theme-font-keys.js";import{googleFontFamilies as n}from"../constants/googleFontV1.js";import o from"./data/fonts.js";let CHROME_UA="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36",IE_UA="Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko";async function getFontForUA(t,e){try{return fetch(t,{headers:{"User-Agent":e}}).then(a=>200===a.status?a.text():(r("getFontForUA",`Unexpected status ${a.status}`,{url:t,UA:e}),""))}catch(a){return r("getFontForUA","Error fetching font",{url:t,UA:e,error:a}),""}}let composeFonts=t=>{let e=t.filter((t,e,r)=>e===r.findIndex(e=>e.family===t.family));return e.map(e=>{let r=t.filter(t=>t.family===e.family).reduce((t,e)=>[...t,...e.variants],[]).filter((t,e,r)=>e===r.findIndex(e=>e===t));return{...e,variants:r}})},GOOGLE_CSS2_OVERRIDES={"Roboto Flex":"https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap"},normalizeFamily=t=>t?.trim().replace(/\s+/g,"+")??"",getFontApiVersion=t=>t.includes("fonts.googleapis.com/css2")?"css2":t.includes("fonts.bunny.net")?"bunny":"css1",getOverrideUrlForFamily=t=>{let e=normalizeFamily(t);return GOOGLE_CSS2_OVERRIDES[t]??GOOGLE_CSS2_OVERRIDES[e]},VARIANT_WEIGHT_MAP={regular:"400",normal:"400",bold:"700",italic:"400italic"},googleFontFamiliesSet=new Set(n),IGNORED_FONT_FAMILIES=[...a,...a.map(t=>`--g-${t}`)],isValidFont=(e,r,a)=>{if(("google"===r||"google"===e.type)&&!googleFontFamiliesSet.has(e.family))return!1;let n="google"===e.type||"bunny"===e.type,o="theme"===e.type&&a,i=t(e.family,r);return!(n&&i)&&(n||!e.type||o)},normalizeVariant=t=>{let e=String(t).toLowerCase().trim();return VARIANT_WEIGHT_MAP[e]??t},sortFontVariants=t=>{let e=t=>{let e=String(t).toLowerCase().trim(),r=e.includes("italic"),a=e.replace("italic","").trim(),n=VARIANT_WEIGHT_MAP[a]??a,o=parseInt(n,10)||400;return{weight:o,isItalic:r}};return[...t].sort((t,r)=>{let a=e(t),n=e(r);return a.weight!==n.weight?a.weight-n.weight:a.isItalic!==n.isItalic?a.isItalic?1:-1:0})},makeUrlBySourceFont=(t,e,r)=>{let a=composeFonts(t).map(t=>{let e=t.variants.map(t=>normalizeVariant(t)),r=sortFontVariants(e);return`${t.family.replace(/ /g,"+")}:${r.join(",")}`}).join("|");if("sans-serif"===a)return;let n=new URLSearchParams;return(n.append("family",a),n.append("display",r?.display||"swap"),"bunny"===e)?`https://fonts.bunny.net/css?${decodeURIComponent(n.toString())}`:(r?.subset&&n.append("subset",r.subset),r?.effect&&n.append("effect",r.effect),`https://fonts.googleapis.com/css?${decodeURIComponent(n.toString())}`)},createFontUrls=(t,e,r,a)=>{let n=t.filter(t=>isValidFont(t,r||"google",a));if(!n.length)return;let o=n.filter((t,e,r)=>e===r.findIndex(e=>e.family===t.family)),i=[],l=[];for(let t of o){let e=getOverrideUrlForFamily(t.family);e&&"bunny"!==r?i.push(e):l.push(t)}let s=l.length?makeUrlBySourceFont(l,r||"google",e):void 0;return i.length&&s?[...i,s]:s?[s,...i]:i};async function getFonts(t,e,a=!0,n){let o=t.filter(t=>!IGNORED_FONT_FAMILIES.includes(t.family)),i=createFontUrls(o,e,n),l=Array.isArray(i)?i:i?[i]:[];if(!l.length)return"";if(a)return l.map(t=>`@import url('${t}');`).join("");let s="",f="";for(let t of l)try{let[e,r]=await Promise.all([getFontForUA(t,"Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko"),getFontForUA(t,CHROME_UA)]),a=`${e}${r}`;s+=a,f+=`@import url('${t}');`}catch(a){let e=getFontApiVersion(t);r("getFonts",`Error fetching font ${e}`,{url:t,fontType:n,fontApiVersion:e,error:String(a)}),f+="",s+=""}let c=new TextEncoder().encode(s).length;return c<51200?s:f}let extractFontsFromPageTemplate=(t,r)=>{let a=[];return t.forEach(t=>{a.push(...e(t.data,r))}),composeFonts(a)},extractVariantFromTypography=(t,e)=>{let r="400";if(null!=t){let e=String(t).toLowerCase().trim();r=normalizeVariant(e)}let a=r,n=e&&"italic"===e.toLowerCase();return n&&!r.includes("italic")&&(a=r.includes("i")?r:`${r}italic`),a},HEADING_FONT_PREFIX="heading-",SUBHEADING_FONT_PREFIX="subheading-",PARAGRAPH_FONT_PREFIX="paragraph-",extractTypographyVariants=t=>{let e=t?.typography??{},r=t?.font??{},a=new Map;Object.entries(e).forEach(([t,e])=>{if(!e||"object"!=typeof e)return;let n=t.startsWith(HEADING_FONT_PREFIX)||t.startsWith(SUBHEADING_FONT_PREFIX)?r.heading?"heading":void 0:t.startsWith(PARAGRAPH_FONT_PREFIX)&&r.body?"body":void 0,o=e.desktop,i=o?.fontFamily,l=i||n;["desktop","mobile","tablet"].forEach(t=>{let n=e[t];if(!n||"object"!=typeof n)return;let i=n.fontFamily||l;if(!i||"string"!=typeof i||!r[i])return;let s=n.fontWeight??o?.fontWeight,f=n.fontStyle??o?.fontStyle;if(null==s)return;let c=extractVariantFromTypography(s,f);a.has(i)||a.set(i,new Set),a.get(i).add(c)})});let n={};return a.forEach((t,e)=>{let a=r[e];a&&(n[e]={variants:Array.from(t).sort(),family:a.family,type:a.type})}),n},mapTypographyToFontFamily=t=>{let e=t?.typography??{},r=t?.font??{},a=t?.font??{},n={};return Object.entries(e).forEach(([t,e])=>{if(!e||"object"!=typeof e)return;let o=e.desktop,i=e.mobile,l=e.tablet,s=t.startsWith(HEADING_FONT_PREFIX)||t.startsWith(SUBHEADING_FONT_PREFIX)?a.heading?"heading":void 0:t.startsWith(PARAGRAPH_FONT_PREFIX)&&a.body?"body":void 0,f=o?.fontFamily||i?.fontFamily||l?.fontFamily||s;if(!f||"string"!=typeof f)return;let c=r[f],y=a[f],p=c?.family||y?.family||f,g=c?.type||y?.type||"google";p&&(n[t]={family:p,type:g})}),n},getFontLinkFromGlobalStyle=async(t,e)=>{if(!t)return"";try{let r=JSON.parse(t),a=r?.font??{},n=Object.values(a),o=extractTypographyVariants(r);Object.keys(o).length>0&&(n=Object.entries(a).filter(([t])=>o[t]).map(([t,e])=>({...e,variants:o[t].variants})));let i=composeFonts(n);return getFonts(i,void 0,void 0,e)}catch{return""}},getFontFromGlobalStyle=(t,e)=>{if(!t)return"";try{let r=JSON.parse(t),a=r?.font??{},n=Object.entries(a).map(([,t])=>t);return getFonts(n,void 0,void 0,e)}catch{return""}};async function getFontStyleFromPageTemplate(t,e,r){let a,n=null;if(r)try{n=JSON.parse(r),a=mapTypographyToFontFamily(n)}catch{}let o=extractFontsFromPageTemplate(t,a);if(!n){if(0===o.length)return[];let t=await getFonts(o,void 0,void 0,e);return t?[t]:[]}let i=extractTypographyVariants(n),l=new Map;for(let t of Object.values(i)){let e=l.get(t.family);if(!e){l.set(t.family,new Set(t.variants));continue}t.variants.forEach(t=>e.add(t))}if(0===(o=o.map(t=>{let e=l.get(t.family);if(!e)return t;let r=t.variants.filter(t=>!e.has(t));return 0===r.length?null:{...t,variants:r}}).filter(t=>null!==t)).length)return[];let s=await getFonts(o,void 0,void 0,e);return s?[s]:[]}let staticFontsCache=null;function loadStaticFonts(){if(staticFontsCache)return staticFontsCache;for(let t of(staticFontsCache={},o.fonts)){let e=`${t.fontFamily}_${t.fontStyle}_${t.fontWeight}`.replace(/\s+/g,"");staticFontsCache[e]=t}return staticFontsCache}function staticFontToCSS({fontFamily:t,fontStyle:e,fontWeight:r,src:a,fontDisplay:n}){let o=a.replace(/^"|"$/g,""),i=`@font-face {
2
+ `;return i+=` font-family: '${t}';
3
+ font-style: ${e};
4
+ font-weight: ${r};
5
+ `,n&&(i+=` font-display: ${n};
6
+ `),i+=` src: ${o};
7
+ }`}function parseVariant({variant:t}){let e=t.trim().toLowerCase();if("regular"===e||"400"===e)return{fontStyle:"normal",fontWeight:"400"};if("italic"===e)return{fontStyle:"italic",fontWeight:"400"};if("bold"===e||"700"===e)return{fontStyle:"normal",fontWeight:"700"};let r=e.endsWith("i")||e.endsWith("italic"),a=e.replace(/i(talic)?$/,"").trim()||"400";return{fontStyle:r?"italic":"normal",fontWeight:a}}async function resolveFontFaces({fonts:t,sourceFont:e}){let a=t.filter(t=>!IGNORED_FONT_FAMILIES.includes(t.family));if(!a.length)return"";let n="bunny"===e,o=n?null:loadStaticFonts(),i=await Promise.all(a.map(async t=>{let a=[],n=[];for(let e of t.variants){if(o){let{fontStyle:r,fontWeight:n}=parseVariant({variant:e}),i=`${t.family}_${r}_${n}`.replace(/\s+/g,""),l=o[i];if(l){a.push(staticFontToCSS(l));continue}}n.push(e)}if(n.length){let o=createFontUrls([{...t,variants:n}],void 0,e),i=Array.isArray(o)?o:o?[o]:[],l=await Promise.all(i.map(t=>getFontForUA(t,CHROME_UA)));for(let e=0;e<l.length;e++){let o=l[e];o?a.push(o):r("resolveFontFaces","API fallback returned empty CSS",{family:t.family,variants:n,url:i[e]})}}return a.length?a.join("\n"):""}));return i.filter(Boolean).join("\n")}async function getStaticFontFacesFromGlobalStyle({data:t,sourceFont:e}){if(!t)return"";try{let r="string"==typeof t?JSON.parse(t):t,a=r?.font??{},n=Object.values(a),o=extractTypographyVariants(r);return Object.keys(o).length>0&&(n=Object.entries(a).filter(([t])=>o[t]).map(([t,e])=>Object.assign({},e,{variants:o[t].variants}))),resolveFontFaces({fonts:composeFonts(n),sourceFont:e})}catch{return""}}async function getStaticFontFacesFromPageTemplate({pageTemplate:t,sourceFont:e,data:r}){let a,n=null;if(r)try{n="string"==typeof r?JSON.parse(r):r,a=mapTypographyToFontFamily(n)}catch(t){console.log(t)}let o=extractFontsFromPageTemplate(t,a);if(!n){if(!o.length)return[];let t=await resolveFontFaces({fonts:o,sourceFont:e});return t?[t]:[]}let i=extractTypographyVariants(n),l=new Map,s=new Map,f=(t,e)=>`${t}::${e}`;for(let t of Object.values(i))if(t.type){let e=f(t.family,t.type),r=l.get(e);r?t.variants.forEach(t=>r.add(t)):l.set(e,new Set(t.variants))}else{let e=s.get(t.family);e?t.variants.forEach(t=>e.add(t)):s.set(t.family,new Set(t.variants))}if(!(o=o.map(t=>{let e=l.get(f(t.family,t.type))||s.get(t.family);if(!e)return t;let r=t.variants.filter(t=>!e.has(t));return r.length?Object.assign({},t,{variants:r}):null}).filter(t=>null!==t)).length)return[];let c=await resolveFontFaces({fonts:o,sourceFont:e});return c?[c]:[]}export{composeFonts,createFontUrls,extractTypographyVariants,getFontFromGlobalStyle,getFontLinkFromGlobalStyle,getFontStyleFromPageTemplate,getFonts,getStaticFontFacesFromGlobalStyle,getStaticFontFacesFromPageTemplate,mapTypographyToFontFamily,parseVariant,staticFontToCSS};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gem-sdk/pages",
3
- "version": "17.0.0-staging.15",
3
+ "version": "17.0.0-staging.18",
4
4
  "license": "MIT",
5
5
  "sideEffects": false,
6
6
  "main": "dist/cjs/index.js",