@capsizecss/unpack
Advanced tools
| import { n as Options } from "./shared-CnZ3qQtb.mjs"; | ||
| //#region src/fs.d.ts | ||
| declare const fromFile: (path: string, options?: Options) => Promise<{ | ||
| familyName: string; | ||
| fullName: string; | ||
| postscriptName: string; | ||
| capHeight: number; | ||
| ascent: number; | ||
| descent: number; | ||
| lineGap: number; | ||
| unitsPerEm: number; | ||
| xHeight: number; | ||
| xWidthAvg: number; | ||
| subsets: Record<"latin" | "thai", { | ||
| xWidthAvg: number; | ||
| }>; | ||
| }>; | ||
| //#endregion | ||
| export { fromFile }; |
+10
| import { t as _fromBuffer } from "./shared-KjM_oZR2.mjs"; | ||
| import { readFile } from "node:fs/promises"; | ||
| //#region src/fs.ts | ||
| const fromFile = async (path, options) => { | ||
| return _fromBuffer(await readFile(path), "fromFile", "path", options); | ||
| }; | ||
| //#endregion | ||
| export { fromFile }; |
| import { Font } from "fontkitten"; | ||
| //#region src/weightings.d.ts | ||
| declare const _default: { | ||
| latin: { | ||
| "0": number; | ||
| "1": number; | ||
| "2": number; | ||
| "3": number; | ||
| "4": number; | ||
| "5": number; | ||
| "6": number; | ||
| "7": number; | ||
| "8": number; | ||
| "9": number; | ||
| ",": number; | ||
| " ": number; | ||
| t: number; | ||
| h: number; | ||
| e: number; | ||
| o: number; | ||
| f: number; | ||
| P: number; | ||
| p: number; | ||
| l: number; | ||
| "'": number; | ||
| s: number; | ||
| R: number; | ||
| u: number; | ||
| b: number; | ||
| i: number; | ||
| c: number; | ||
| C: number; | ||
| n: number; | ||
| a: number; | ||
| d: number; | ||
| y: number; | ||
| w: number; | ||
| B: number; | ||
| r: number; | ||
| z: number; | ||
| G: number; | ||
| j: number; | ||
| T: number; | ||
| ".": number; | ||
| L: number; | ||
| k: number; | ||
| m: number; | ||
| "]": number; | ||
| J: number; | ||
| F: number; | ||
| v: number; | ||
| g: number; | ||
| A: number; | ||
| N: number; | ||
| "-": number; | ||
| H: number; | ||
| D: number; | ||
| M: number; | ||
| I: number; | ||
| E: number; | ||
| "\"": number; | ||
| S: number; | ||
| "(": number; | ||
| ")": number; | ||
| x: number; | ||
| W: number; | ||
| Q: number; | ||
| Y: number; | ||
| q: number; | ||
| V: number; | ||
| á: number; | ||
| K: number; | ||
| U: number; | ||
| "=": number; | ||
| "[": number; | ||
| O: number; | ||
| é: number; | ||
| $: number; | ||
| ":": number; | ||
| "|": number; | ||
| "/": number; | ||
| "%": number; | ||
| Z: number; | ||
| ";": number; | ||
| X: number; | ||
| }; | ||
| thai: { | ||
| ส: number; | ||
| ว: number; | ||
| น: number; | ||
| บ: number; | ||
| จ: number; | ||
| า: number; | ||
| ก: number; | ||
| เ: number; | ||
| ร: number; | ||
| ม: number; | ||
| ค: number; | ||
| ำ: number; | ||
| ข: number; | ||
| อ: number; | ||
| ป: number; | ||
| ด: number; | ||
| ใ: number; | ||
| ภ: number; | ||
| ท: number; | ||
| พ: number; | ||
| ฤ: number; | ||
| ษ: number; | ||
| ศ: number; | ||
| ะ: number; | ||
| ช: number; | ||
| แ: number; | ||
| ล: number; | ||
| ง: number; | ||
| ย: number; | ||
| ห: number; | ||
| ฝ: number; | ||
| ต: number; | ||
| โ: number; | ||
| ญ: number; | ||
| ณ: number; | ||
| ผ: number; | ||
| ไ: number; | ||
| ฯ: number; | ||
| ฟ: number; | ||
| ธ: number; | ||
| ถ: number; | ||
| ฐ: number; | ||
| ซ: number; | ||
| ฉ: number; | ||
| ฑ: number; | ||
| ฆ: number; | ||
| ฬ: number; | ||
| ฏ: number; | ||
| ฎ: number; | ||
| ฒ: number; | ||
| ๆ: number; | ||
| ฮ: number; | ||
| "\u0E52": number; | ||
| "\u0E55": number; | ||
| }; | ||
| }; | ||
| //#endregion | ||
| //#region src/shared.d.ts | ||
| type SupportedSubsets = keyof typeof _default; | ||
| declare const supportedSubsets: SupportedSubsets[]; | ||
| declare const unpackMetricsFromFont: (font: Font) => { | ||
| familyName: string; | ||
| fullName: string; | ||
| postscriptName: string; | ||
| capHeight: number; | ||
| ascent: number; | ||
| descent: number; | ||
| lineGap: number; | ||
| unitsPerEm: number; | ||
| xHeight: number; | ||
| xWidthAvg: number; | ||
| subsets: Record<"latin" | "thai", { | ||
| xWidthAvg: number; | ||
| }>; | ||
| }; | ||
| type Font$1 = ReturnType<typeof unpackMetricsFromFont>; | ||
| interface Options { | ||
| postscriptName?: string; | ||
| } | ||
| declare const fromBuffer: (buffer: Buffer, options?: Options) => Promise<{ | ||
| familyName: string; | ||
| fullName: string; | ||
| postscriptName: string; | ||
| capHeight: number; | ||
| ascent: number; | ||
| descent: number; | ||
| lineGap: number; | ||
| unitsPerEm: number; | ||
| xHeight: number; | ||
| xWidthAvg: number; | ||
| subsets: Record<"latin" | "thai", { | ||
| xWidthAvg: number; | ||
| }>; | ||
| }>; | ||
| declare const fromBlob: (blob: Blob, options?: Options) => Promise<{ | ||
| familyName: string; | ||
| fullName: string; | ||
| postscriptName: string; | ||
| capHeight: number; | ||
| ascent: number; | ||
| descent: number; | ||
| lineGap: number; | ||
| unitsPerEm: number; | ||
| xHeight: number; | ||
| xWidthAvg: number; | ||
| subsets: Record<"latin" | "thai", { | ||
| xWidthAvg: number; | ||
| }>; | ||
| }>; | ||
| declare const fromUrl: (url: string, options?: Options) => Promise<{ | ||
| familyName: string; | ||
| fullName: string; | ||
| postscriptName: string; | ||
| capHeight: number; | ||
| ascent: number; | ||
| descent: number; | ||
| lineGap: number; | ||
| unitsPerEm: number; | ||
| xHeight: number; | ||
| xWidthAvg: number; | ||
| subsets: Record<"latin" | "thai", { | ||
| xWidthAvg: number; | ||
| }>; | ||
| }>; | ||
| //#endregion | ||
| export { fromBuffer as a, fromBlob as i, Options as n, fromUrl as o, SupportedSubsets as r, supportedSubsets as s, Font$1 as t }; |
| import { create } from "fontkitten"; | ||
| //#region src/weightings.ts | ||
| var weightings_default = { | ||
| "latin": { | ||
| "0": .0053, | ||
| "1": .0023, | ||
| "2": .0026, | ||
| "3": .001, | ||
| "4": 8e-4, | ||
| "5": .0015, | ||
| "6": 7e-4, | ||
| "7": 5e-4, | ||
| "8": 7e-4, | ||
| "9": 6e-4, | ||
| ",": .0083, | ||
| " ": .154, | ||
| "t": .0672, | ||
| "h": .0351, | ||
| "e": .0922, | ||
| "o": .0571, | ||
| "f": .017, | ||
| "P": .0023, | ||
| "p": .0163, | ||
| "l": .0304, | ||
| "'": .0014, | ||
| "s": .0469, | ||
| "R": .0015, | ||
| "u": .0207, | ||
| "b": .0114, | ||
| "i": .0588, | ||
| "c": .0232, | ||
| "C": .0031, | ||
| "n": .0578, | ||
| "a": .0668, | ||
| "d": .0298, | ||
| "y": .0123, | ||
| "w": .011, | ||
| "B": .002, | ||
| "r": .0526, | ||
| "z": .0011, | ||
| "G": .0011, | ||
| "j": 9e-4, | ||
| "T": .0041, | ||
| ".": .0079, | ||
| "L": .0012, | ||
| "k": .0046, | ||
| "m": .0181, | ||
| "]": 7e-4, | ||
| "J": 9e-4, | ||
| "F": .0015, | ||
| "v": .0076, | ||
| "g": .0155, | ||
| "A": .004, | ||
| "N": .0014, | ||
| "-": .0018, | ||
| "H": .0013, | ||
| "D": .0013, | ||
| "M": .0025, | ||
| "I": .0022, | ||
| "E": .0011, | ||
| "\"": .0012, | ||
| "S": .0041, | ||
| "(": .001, | ||
| ")": .001, | ||
| "x": .0025, | ||
| "W": .0012, | ||
| "Q": 1e-4, | ||
| "Y": 3e-4, | ||
| "q": 8e-4, | ||
| "V": 5e-4, | ||
| "á": 1e-4, | ||
| "K": 7e-4, | ||
| "U": .0016, | ||
| "=": 7e-4, | ||
| "[": .0021, | ||
| "O": 9e-4, | ||
| "é": 1e-4, | ||
| "$": 2e-4, | ||
| ":": 8e-4, | ||
| "|": .0038, | ||
| "/": 1e-4, | ||
| "%": 1e-4, | ||
| "Z": 2e-4, | ||
| ";": 1e-4, | ||
| "X": 1e-4 | ||
| }, | ||
| "thai": { | ||
| "ส": .0258, | ||
| "ว": .0372, | ||
| "น": .0711, | ||
| "บ": .0258, | ||
| "จ": .0169, | ||
| "า": .1024, | ||
| "ก": .0552, | ||
| "เ": .0419, | ||
| "ร": .0873, | ||
| "ม": .0416, | ||
| "ค": .0214, | ||
| "ำ": .0097, | ||
| "ข": .0127, | ||
| "อ": .0459, | ||
| "ป": .0204, | ||
| "ด": .0271, | ||
| "ใ": .0109, | ||
| "ภ": .0046, | ||
| "ท": .0311, | ||
| "พ": .0175, | ||
| "ฤ": 9e-4, | ||
| "ษ": .0042, | ||
| "ศ": .0063, | ||
| "ะ": .0255, | ||
| "ช": .0158, | ||
| "แ": .0158, | ||
| "ล": .0339, | ||
| "ง": .0433, | ||
| "ย": .0345, | ||
| "ห": .0197, | ||
| "ฝ": 6e-4, | ||
| "ต": .0239, | ||
| "โ": .0077, | ||
| "ญ": .0039, | ||
| "ณ": .0071, | ||
| "ผ": .0077, | ||
| "ไ": .0111, | ||
| "ฯ": 7e-4, | ||
| "ฟ": .0044, | ||
| "ธ": .0068, | ||
| "ถ": .0061, | ||
| "ฐ": .0033, | ||
| "ซ": .0046, | ||
| "ฉ": .0023, | ||
| "ฑ": 4e-4, | ||
| "ฆ": 2e-4, | ||
| "ฬ": 3e-4, | ||
| "ฏ": 2e-4, | ||
| "ฎ": 3e-4, | ||
| "ฒ": .0012, | ||
| "ๆ": 3e-4, | ||
| "ฮ": 4e-4, | ||
| "๒": 1e-4, | ||
| "๕": 1e-4 | ||
| } | ||
| }; | ||
| //#endregion | ||
| //#region src/shared.ts | ||
| const supportedSubsets = Object.keys(weightings_default); | ||
| const weightingForCharacter = (character, subset) => { | ||
| if (!Object.keys(weightings_default[subset]).includes(character)) throw new Error(`No weighting specified for character: “${character}”`); | ||
| return weightings_default[subset][character]; | ||
| }; | ||
| const avgWidthForSubset = (font, subset) => { | ||
| const sampleString = Object.keys(weightings_default[subset]).join(""); | ||
| const weightedWidth = font.glyphsForString(sampleString).reduce((sum, glyph, index) => { | ||
| const character = sampleString.charAt(index); | ||
| let charWidth = font["OS/2"].xAvgCharWidth; | ||
| try { | ||
| charWidth = glyph.advanceWidth; | ||
| } catch (e) { | ||
| console.warn(`Couldn’t read 'advanceWidth' for character “${character === " " ? "<space>" : character}” from “${font.familyName}”. Falling back to “xAvgCharWidth”.`); | ||
| } | ||
| if (glyph.isMark) return sum; | ||
| return sum + charWidth * weightingForCharacter(character, subset); | ||
| }, 0); | ||
| return Math.round(weightedWidth); | ||
| }; | ||
| const unpackMetricsFromFont = (font) => { | ||
| const { capHeight, ascent, descent, lineGap, unitsPerEm, familyName, fullName, postscriptName, xHeight } = font; | ||
| const subsets = supportedSubsets.reduce((acc, subset) => ({ | ||
| ...acc, | ||
| [subset]: { xWidthAvg: avgWidthForSubset(font, subset) } | ||
| }), {}); | ||
| return { | ||
| familyName, | ||
| fullName, | ||
| postscriptName, | ||
| capHeight, | ||
| ascent, | ||
| descent, | ||
| lineGap, | ||
| unitsPerEm, | ||
| xHeight, | ||
| xWidthAvg: subsets.latin.xWidthAvg, | ||
| subsets | ||
| }; | ||
| }; | ||
| function handleCollectionErrors(font, { postscriptName, apiName, apiParamName }) { | ||
| if (postscriptName && font === null) throw new Error([ | ||
| `The provided \`postscriptName\` of “${postscriptName}” cannot be found in the provided font collection.\n`, | ||
| "Run the same command without specifying a `postscriptName` in the options to see the available names in the collection.", | ||
| "For example:", | ||
| "------------------------------------------", | ||
| `const metrics = await ${apiName}('<${apiParamName}>');`, | ||
| "------------------------------------------\n", | ||
| "" | ||
| ].join("\n")); | ||
| if (font !== null && font.isCollection) { | ||
| const availableNames = font.fonts.map((f) => f.postscriptName); | ||
| throw new Error([ | ||
| "Metrics cannot be unpacked from a font collection.\n", | ||
| "Provide either a single font or specify a `postscriptName` to extract from the collection via the options.", | ||
| "For example:", | ||
| "------------------------------------------", | ||
| `const metrics = await ${apiName}('<${apiParamName}>', {`, | ||
| ` postscriptName: '${availableNames[0]}'`, | ||
| "});", | ||
| "------------------------------------------\n", | ||
| "Available `postscriptNames` in this font collection are:", | ||
| ...availableNames.map((fontName) => ` - ${fontName}`), | ||
| "" | ||
| ].join("\n")); | ||
| } | ||
| } | ||
| const _fromBuffer = async (buffer, apiName, apiParamName, options) => { | ||
| const { postscriptName } = options || {}; | ||
| const fontkitFont = create(buffer instanceof Buffer ? buffer : Buffer.from(buffer), postscriptName); | ||
| handleCollectionErrors(fontkitFont, { | ||
| postscriptName, | ||
| apiName, | ||
| apiParamName | ||
| }); | ||
| return unpackMetricsFromFont(fontkitFont); | ||
| }; | ||
| const fromBuffer = async (buffer, options) => { | ||
| return _fromBuffer(buffer, "fromBuffer", "buffer", options); | ||
| }; | ||
| const fromBlob = async (blob, options) => { | ||
| const arrayBuffer = await blob.arrayBuffer(); | ||
| return _fromBuffer(new Uint8Array(arrayBuffer), "fromBlob", "blob", options); | ||
| }; | ||
| const fromUrl = async (url, options) => { | ||
| const arrayBuffer = await (await fetch(url)).arrayBuffer(); | ||
| return _fromBuffer(new Uint8Array(arrayBuffer), "fromUrl", "url", options); | ||
| }; | ||
| //#endregion | ||
| export { supportedSubsets as a, fromUrl as i, fromBlob as n, fromBuffer as r, _fromBuffer as t }; |
+2
-174
@@ -1,174 +0,2 @@ | ||
| /// <reference types="node" /> | ||
| import { Font as Font$1 } from "fontkit"; | ||
| //#region src/weightings.d.ts | ||
| declare const _default: { | ||
| latin: { | ||
| "0": number; | ||
| "1": number; | ||
| "2": number; | ||
| "3": number; | ||
| "4": number; | ||
| "5": number; | ||
| "6": number; | ||
| "7": number; | ||
| "8": number; | ||
| "9": number; | ||
| ",": number; | ||
| " ": number; | ||
| t: number; | ||
| h: number; | ||
| e: number; | ||
| o: number; | ||
| f: number; | ||
| P: number; | ||
| p: number; | ||
| l: number; | ||
| "'": number; | ||
| s: number; | ||
| R: number; | ||
| u: number; | ||
| b: number; | ||
| i: number; | ||
| c: number; | ||
| C: number; | ||
| n: number; | ||
| a: number; | ||
| d: number; | ||
| y: number; | ||
| w: number; | ||
| B: number; | ||
| r: number; | ||
| z: number; | ||
| G: number; | ||
| j: number; | ||
| T: number; | ||
| ".": number; | ||
| L: number; | ||
| k: number; | ||
| m: number; | ||
| "]": number; | ||
| J: number; | ||
| F: number; | ||
| v: number; | ||
| g: number; | ||
| A: number; | ||
| N: number; | ||
| "-": number; | ||
| H: number; | ||
| D: number; | ||
| M: number; | ||
| I: number; | ||
| E: number; | ||
| "\"": number; | ||
| S: number; | ||
| "(": number; | ||
| ")": number; | ||
| x: number; | ||
| W: number; | ||
| Q: number; | ||
| Y: number; | ||
| q: number; | ||
| V: number; | ||
| á: number; | ||
| K: number; | ||
| U: number; | ||
| "=": number; | ||
| "[": number; | ||
| O: number; | ||
| é: number; | ||
| $: number; | ||
| ":": number; | ||
| "|": number; | ||
| "/": number; | ||
| "%": number; | ||
| Z: number; | ||
| ";": number; | ||
| X: number; | ||
| }; | ||
| thai: { | ||
| ส: number; | ||
| ว: number; | ||
| น: number; | ||
| บ: number; | ||
| จ: number; | ||
| า: number; | ||
| ก: number; | ||
| เ: number; | ||
| ร: number; | ||
| ม: number; | ||
| ค: number; | ||
| ำ: number; | ||
| ข: number; | ||
| อ: number; | ||
| ป: number; | ||
| ด: number; | ||
| ใ: number; | ||
| ภ: number; | ||
| ท: number; | ||
| พ: number; | ||
| ฤ: number; | ||
| ษ: number; | ||
| ศ: number; | ||
| ะ: number; | ||
| ช: number; | ||
| แ: number; | ||
| ล: number; | ||
| ง: number; | ||
| ย: number; | ||
| ห: number; | ||
| ฝ: number; | ||
| ต: number; | ||
| โ: number; | ||
| ญ: number; | ||
| ณ: number; | ||
| ผ: number; | ||
| ไ: number; | ||
| ฯ: number; | ||
| ฟ: number; | ||
| ธ: number; | ||
| ถ: number; | ||
| ฐ: number; | ||
| ซ: number; | ||
| ฉ: number; | ||
| ฑ: number; | ||
| ฆ: number; | ||
| ฬ: number; | ||
| ฏ: number; | ||
| ฎ: number; | ||
| ฒ: number; | ||
| ๆ: number; | ||
| ฮ: number; | ||
| "\u0E52": number; | ||
| "\u0E55": number; | ||
| }; | ||
| }; | ||
| //#endregion | ||
| //#region src/index.d.ts | ||
| type SupportedSubsets = keyof typeof _default; | ||
| declare const supportedSubsets: ("latin" | "thai")[]; | ||
| declare const unpackMetricsFromFont: (font: Font$1) => { | ||
| familyName: string; | ||
| fullName: string; | ||
| postscriptName: string; | ||
| capHeight: number; | ||
| ascent: number; | ||
| descent: number; | ||
| lineGap: number; | ||
| unitsPerEm: number; | ||
| xHeight: number; | ||
| xWidthAvg: number; | ||
| subsets: Record<"latin" | "thai", { | ||
| xWidthAvg: number; | ||
| }>; | ||
| }; | ||
| type Font = ReturnType<typeof unpackMetricsFromFont>; | ||
| interface Options { | ||
| postscriptName?: string; | ||
| } | ||
| declare const fromFile: (path: string, options?: Options) => Promise<Font>; | ||
| declare const fromBuffer: (buffer: Buffer, options?: Options) => Promise<Font>; | ||
| declare const fromBlob: (blob: Blob, options?: Options) => Promise<Font>; | ||
| declare const fromUrl: (url: string, options?: Options) => Promise<Font>; | ||
| //#endregion | ||
| export { Font, SupportedSubsets, fromBlob, fromBuffer, fromFile, fromUrl, supportedSubsets }; | ||
| import { a as fromBuffer, i as fromBlob, o as fromUrl, r as SupportedSubsets, s as supportedSubsets, t as Font } from "./shared-CnZ3qQtb.mjs"; | ||
| export { type Font, type SupportedSubsets, fromBlob, fromBuffer, fromUrl, supportedSubsets }; |
+2
-250
@@ -1,251 +0,3 @@ | ||
| import * as fontkit from "fontkit"; | ||
| import { a as supportedSubsets, i as fromUrl, n as fromBlob, r as fromBuffer } from "./shared-KjM_oZR2.mjs"; | ||
| //#region src/weightings.ts | ||
| var weightings_default = { | ||
| "latin": { | ||
| "0": .0053, | ||
| "1": .0023, | ||
| "2": .0026, | ||
| "3": .001, | ||
| "4": 8e-4, | ||
| "5": .0015, | ||
| "6": 7e-4, | ||
| "7": 5e-4, | ||
| "8": 7e-4, | ||
| "9": 6e-4, | ||
| ",": .0083, | ||
| " ": .154, | ||
| "t": .0672, | ||
| "h": .0351, | ||
| "e": .0922, | ||
| "o": .0571, | ||
| "f": .017, | ||
| "P": .0023, | ||
| "p": .0163, | ||
| "l": .0304, | ||
| "'": .0014, | ||
| "s": .0469, | ||
| "R": .0015, | ||
| "u": .0207, | ||
| "b": .0114, | ||
| "i": .0588, | ||
| "c": .0232, | ||
| "C": .0031, | ||
| "n": .0578, | ||
| "a": .0668, | ||
| "d": .0298, | ||
| "y": .0123, | ||
| "w": .011, | ||
| "B": .002, | ||
| "r": .0526, | ||
| "z": .0011, | ||
| "G": .0011, | ||
| "j": 9e-4, | ||
| "T": .0041, | ||
| ".": .0079, | ||
| "L": .0012, | ||
| "k": .0046, | ||
| "m": .0181, | ||
| "]": 7e-4, | ||
| "J": 9e-4, | ||
| "F": .0015, | ||
| "v": .0076, | ||
| "g": .0155, | ||
| "A": .004, | ||
| "N": .0014, | ||
| "-": .0018, | ||
| "H": .0013, | ||
| "D": .0013, | ||
| "M": .0025, | ||
| "I": .0022, | ||
| "E": .0011, | ||
| "\"": .0012, | ||
| "S": .0041, | ||
| "(": .001, | ||
| ")": .001, | ||
| "x": .0025, | ||
| "W": .0012, | ||
| "Q": 1e-4, | ||
| "Y": 3e-4, | ||
| "q": 8e-4, | ||
| "V": 5e-4, | ||
| "á": 1e-4, | ||
| "K": 7e-4, | ||
| "U": .0016, | ||
| "=": 7e-4, | ||
| "[": .0021, | ||
| "O": 9e-4, | ||
| "é": 1e-4, | ||
| "$": 2e-4, | ||
| ":": 8e-4, | ||
| "|": .0038, | ||
| "/": 1e-4, | ||
| "%": 1e-4, | ||
| "Z": 2e-4, | ||
| ";": 1e-4, | ||
| "X": 1e-4 | ||
| }, | ||
| "thai": { | ||
| "ส": .0258, | ||
| "ว": .0372, | ||
| "น": .0711, | ||
| "บ": .0258, | ||
| "จ": .0169, | ||
| "า": .1024, | ||
| "ก": .0552, | ||
| "เ": .0419, | ||
| "ร": .0873, | ||
| "ม": .0416, | ||
| "ค": .0214, | ||
| "ำ": .0097, | ||
| "ข": .0127, | ||
| "อ": .0459, | ||
| "ป": .0204, | ||
| "ด": .0271, | ||
| "ใ": .0109, | ||
| "ภ": .0046, | ||
| "ท": .0311, | ||
| "พ": .0175, | ||
| "ฤ": 9e-4, | ||
| "ษ": .0042, | ||
| "ศ": .0063, | ||
| "ะ": .0255, | ||
| "ช": .0158, | ||
| "แ": .0158, | ||
| "ล": .0339, | ||
| "ง": .0433, | ||
| "ย": .0345, | ||
| "ห": .0197, | ||
| "ฝ": 6e-4, | ||
| "ต": .0239, | ||
| "โ": .0077, | ||
| "ญ": .0039, | ||
| "ณ": .0071, | ||
| "ผ": .0077, | ||
| "ไ": .0111, | ||
| "ฯ": 7e-4, | ||
| "ฟ": .0044, | ||
| "ธ": .0068, | ||
| "ถ": .0061, | ||
| "ฐ": .0033, | ||
| "ซ": .0046, | ||
| "ฉ": .0023, | ||
| "ฑ": 4e-4, | ||
| "ฆ": 2e-4, | ||
| "ฬ": 3e-4, | ||
| "ฏ": 2e-4, | ||
| "ฎ": 3e-4, | ||
| "ฒ": .0012, | ||
| "ๆ": 3e-4, | ||
| "ฮ": 4e-4, | ||
| "๒": 1e-4, | ||
| "๕": 1e-4 | ||
| } | ||
| }; | ||
| //#endregion | ||
| //#region src/index.ts | ||
| const supportedSubsets = Object.keys(weightings_default); | ||
| const weightingForCharacter = (character, subset) => { | ||
| if (!Object.keys(weightings_default[subset]).includes(character)) throw new Error(`No weighting specified for character: “${character}”`); | ||
| return weightings_default[subset][character]; | ||
| }; | ||
| const avgWidthForSubset = (font, subset) => { | ||
| const sampleString = Object.keys(weightings_default[subset]).join(""); | ||
| const weightedWidth = font.glyphsForString(sampleString).reduce((sum, glyph, index) => { | ||
| const character = sampleString.charAt(index); | ||
| let charWidth = font["OS/2"].xAvgCharWidth; | ||
| try { | ||
| charWidth = glyph.advanceWidth; | ||
| } catch (e) { | ||
| console.warn(`Couldn’t read 'advanceWidth' for character “${character === " " ? "<space>" : character}” from “${font.familyName}”. Falling back to “xAvgCharWidth”.`); | ||
| } | ||
| if (glyph.isMark) return sum; | ||
| return sum + charWidth * weightingForCharacter(character, subset); | ||
| }, 0); | ||
| return Math.round(weightedWidth); | ||
| }; | ||
| const unpackMetricsFromFont = (font) => { | ||
| const { capHeight, ascent, descent, lineGap, unitsPerEm, familyName, fullName, postscriptName, xHeight } = font; | ||
| const subsets = supportedSubsets.reduce((acc, subset) => ({ | ||
| ...acc, | ||
| [subset]: { xWidthAvg: avgWidthForSubset(font, subset) } | ||
| }), {}); | ||
| return { | ||
| familyName, | ||
| fullName, | ||
| postscriptName, | ||
| capHeight, | ||
| ascent, | ||
| descent, | ||
| lineGap, | ||
| unitsPerEm, | ||
| xHeight, | ||
| xWidthAvg: subsets.latin.xWidthAvg, | ||
| subsets | ||
| }; | ||
| }; | ||
| const handleCollectionErrors = ({ font, postscriptName, apiName, apiParamName }) => { | ||
| if (postscriptName && font === null) throw new Error([ | ||
| `The provided \`postscriptName\` of “${postscriptName}” cannot be found in the provided font collection.\n`, | ||
| "Run the same command without specifying a `postscriptName` in the options to see the available names in the collection.", | ||
| "For example:", | ||
| "------------------------------------------", | ||
| `const metrics = await ${apiName}('<${apiParamName}>');`, | ||
| "------------------------------------------\n", | ||
| "" | ||
| ].join("\n")); | ||
| if (font !== null && "fonts" in font && Array.isArray(font.fonts)) { | ||
| const availableNames = font.fonts.map((f) => f.postscriptName); | ||
| throw new Error([ | ||
| "Metrics cannot be unpacked from a font collection.\n", | ||
| "Provide either a single font or specify a `postscriptName` to extract from the collection via the options.", | ||
| "For example:", | ||
| "------------------------------------------", | ||
| `const metrics = await ${apiName}('<${apiParamName}>', {`, | ||
| ` postscriptName: '${availableNames[0]}'`, | ||
| "});", | ||
| "------------------------------------------\n", | ||
| "Available `postscriptNames` in this font collection are:", | ||
| ...availableNames.map((fontName) => ` - ${fontName}`), | ||
| "" | ||
| ].join("\n")); | ||
| } | ||
| }; | ||
| const fromFile = (path, options) => { | ||
| const { postscriptName } = options || {}; | ||
| return fontkit.open(path, postscriptName).then((font) => { | ||
| handleCollectionErrors({ | ||
| font, | ||
| postscriptName, | ||
| apiName: "fromFile", | ||
| apiParamName: "path" | ||
| }); | ||
| return unpackMetricsFromFont(font); | ||
| }); | ||
| }; | ||
| const _fromBuffer = async (buffer, apiName, apiParamName, options) => { | ||
| const { postscriptName } = options || {}; | ||
| const fontkitFont = fontkit.create(buffer, postscriptName); | ||
| handleCollectionErrors({ | ||
| font: fontkitFont, | ||
| postscriptName, | ||
| apiName, | ||
| apiParamName | ||
| }); | ||
| return unpackMetricsFromFont(fontkitFont); | ||
| }; | ||
| const fromBuffer = async (buffer, options) => { | ||
| return _fromBuffer(buffer, "fromBuffer", "buffer", options); | ||
| }; | ||
| const fromBlob = async (blob, options) => { | ||
| const arrayBuffer = await blob.arrayBuffer(); | ||
| return _fromBuffer(Buffer.from(arrayBuffer), "fromBlob", "blob", options); | ||
| }; | ||
| const fromUrl = async (url, options) => { | ||
| const arrayBuffer = await (await fetch(url)).arrayBuffer(); | ||
| return _fromBuffer(Buffer.from(arrayBuffer), "fromUrl", "url", options); | ||
| }; | ||
| //#endregion | ||
| export { fromBlob, fromBuffer, fromFile, fromUrl, supportedSubsets }; | ||
| export { fromBlob, fromBuffer, fromUrl, supportedSubsets }; |
+8
-10
| { | ||
| "name": "@capsizecss/unpack", | ||
| "version": "3.0.1", | ||
| "version": "4.0.0", | ||
| "description": "Unpack capsize font metrics from fonts", | ||
@@ -26,12 +26,10 @@ "keywords": [ | ||
| }, | ||
| "type": "module", | ||
| "exports": { | ||
| ".": { | ||
| "import": "./dist/index.mjs", | ||
| "require": "./dist/index.cjs" | ||
| }, | ||
| ".": "./dist/index.mjs", | ||
| "./fs": "./dist/fs.mjs", | ||
| "./package.json": "./package.json" | ||
| }, | ||
| "main": "./dist/index.cjs", | ||
| "module": "./dist/index.mjs", | ||
| "types": "./dist/index.d.cts", | ||
| "types": "./dist/index.d.mts", | ||
| "files": [ | ||
@@ -41,6 +39,5 @@ "dist" | ||
| "dependencies": { | ||
| "fontkit": "^2.0.2" | ||
| "fontkitten": "^1.0.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@types/fontkit": "^2.0.1", | ||
| "@types/node": "^22.18.8", | ||
@@ -50,3 +47,3 @@ "fast-xml-parser": "^4.3.2", | ||
| "tsx": "^4.7.0", | ||
| "typescript": "^5.3.3" | ||
| "typescript": "^5.9.3" | ||
| }, | ||
@@ -56,2 +53,3 @@ "engines": { | ||
| }, | ||
| "main": "./dist/index.mjs", | ||
| "scripts": { | ||
@@ -58,0 +56,0 @@ "build": "tsdown", |
+2
-2
@@ -58,3 +58,3 @@ <img src="https://raw.githubusercontent.com/seek-oss/capsize/HEAD/images/capsize-header.png" alt="Capsize" title="Capsize" width="443px" /> | ||
| ```ts | ||
| import { fromFile } from '@capsizecss/unpack'; | ||
| import { fromFile } from '@capsizecss/unpack/fs'; | ||
@@ -104,3 +104,3 @@ const metrics = await fromFile(filePath); | ||
| - [Devon Govett](https://github.com/devongovett) for creating [Fontkit](https://github.com/foliojs/fontkit), which does all the heavy lifting of extracting the font metrics under the covers. | ||
| - [Devon Govett](https://github.com/devongovett) for creating [Fontkit](https://github.com/foliojs/fontkit). A [fork of Fontkit](https://github.com/delucis/fontkitten) does all the heavy lifting of extracting the font metrics under the covers. | ||
| - [SEEK](https://www.seek.com.au) for giving us the space to do interesting work. | ||
@@ -107,0 +107,0 @@ |
-279
| //#region rolldown:runtime | ||
| var __create = Object.create; | ||
| var __defProp = Object.defineProperty; | ||
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
| var __getOwnPropNames = Object.getOwnPropertyNames; | ||
| var __getProtoOf = Object.getPrototypeOf; | ||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
| var __copyProps = (to, from, except, desc) => { | ||
| if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) { | ||
| key = keys[i]; | ||
| if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { | ||
| get: ((k) => from[k]).bind(null, key), | ||
| enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable | ||
| }); | ||
| } | ||
| return to; | ||
| }; | ||
| var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { | ||
| value: mod, | ||
| enumerable: true | ||
| }) : target, mod)); | ||
| //#endregion | ||
| let fontkit = require("fontkit"); | ||
| fontkit = __toESM(fontkit); | ||
| //#region src/weightings.ts | ||
| var weightings_default = { | ||
| "latin": { | ||
| "0": .0053, | ||
| "1": .0023, | ||
| "2": .0026, | ||
| "3": .001, | ||
| "4": 8e-4, | ||
| "5": .0015, | ||
| "6": 7e-4, | ||
| "7": 5e-4, | ||
| "8": 7e-4, | ||
| "9": 6e-4, | ||
| ",": .0083, | ||
| " ": .154, | ||
| "t": .0672, | ||
| "h": .0351, | ||
| "e": .0922, | ||
| "o": .0571, | ||
| "f": .017, | ||
| "P": .0023, | ||
| "p": .0163, | ||
| "l": .0304, | ||
| "'": .0014, | ||
| "s": .0469, | ||
| "R": .0015, | ||
| "u": .0207, | ||
| "b": .0114, | ||
| "i": .0588, | ||
| "c": .0232, | ||
| "C": .0031, | ||
| "n": .0578, | ||
| "a": .0668, | ||
| "d": .0298, | ||
| "y": .0123, | ||
| "w": .011, | ||
| "B": .002, | ||
| "r": .0526, | ||
| "z": .0011, | ||
| "G": .0011, | ||
| "j": 9e-4, | ||
| "T": .0041, | ||
| ".": .0079, | ||
| "L": .0012, | ||
| "k": .0046, | ||
| "m": .0181, | ||
| "]": 7e-4, | ||
| "J": 9e-4, | ||
| "F": .0015, | ||
| "v": .0076, | ||
| "g": .0155, | ||
| "A": .004, | ||
| "N": .0014, | ||
| "-": .0018, | ||
| "H": .0013, | ||
| "D": .0013, | ||
| "M": .0025, | ||
| "I": .0022, | ||
| "E": .0011, | ||
| "\"": .0012, | ||
| "S": .0041, | ||
| "(": .001, | ||
| ")": .001, | ||
| "x": .0025, | ||
| "W": .0012, | ||
| "Q": 1e-4, | ||
| "Y": 3e-4, | ||
| "q": 8e-4, | ||
| "V": 5e-4, | ||
| "á": 1e-4, | ||
| "K": 7e-4, | ||
| "U": .0016, | ||
| "=": 7e-4, | ||
| "[": .0021, | ||
| "O": 9e-4, | ||
| "é": 1e-4, | ||
| "$": 2e-4, | ||
| ":": 8e-4, | ||
| "|": .0038, | ||
| "/": 1e-4, | ||
| "%": 1e-4, | ||
| "Z": 2e-4, | ||
| ";": 1e-4, | ||
| "X": 1e-4 | ||
| }, | ||
| "thai": { | ||
| "ส": .0258, | ||
| "ว": .0372, | ||
| "น": .0711, | ||
| "บ": .0258, | ||
| "จ": .0169, | ||
| "า": .1024, | ||
| "ก": .0552, | ||
| "เ": .0419, | ||
| "ร": .0873, | ||
| "ม": .0416, | ||
| "ค": .0214, | ||
| "ำ": .0097, | ||
| "ข": .0127, | ||
| "อ": .0459, | ||
| "ป": .0204, | ||
| "ด": .0271, | ||
| "ใ": .0109, | ||
| "ภ": .0046, | ||
| "ท": .0311, | ||
| "พ": .0175, | ||
| "ฤ": 9e-4, | ||
| "ษ": .0042, | ||
| "ศ": .0063, | ||
| "ะ": .0255, | ||
| "ช": .0158, | ||
| "แ": .0158, | ||
| "ล": .0339, | ||
| "ง": .0433, | ||
| "ย": .0345, | ||
| "ห": .0197, | ||
| "ฝ": 6e-4, | ||
| "ต": .0239, | ||
| "โ": .0077, | ||
| "ญ": .0039, | ||
| "ณ": .0071, | ||
| "ผ": .0077, | ||
| "ไ": .0111, | ||
| "ฯ": 7e-4, | ||
| "ฟ": .0044, | ||
| "ธ": .0068, | ||
| "ถ": .0061, | ||
| "ฐ": .0033, | ||
| "ซ": .0046, | ||
| "ฉ": .0023, | ||
| "ฑ": 4e-4, | ||
| "ฆ": 2e-4, | ||
| "ฬ": 3e-4, | ||
| "ฏ": 2e-4, | ||
| "ฎ": 3e-4, | ||
| "ฒ": .0012, | ||
| "ๆ": 3e-4, | ||
| "ฮ": 4e-4, | ||
| "๒": 1e-4, | ||
| "๕": 1e-4 | ||
| } | ||
| }; | ||
| //#endregion | ||
| //#region src/index.ts | ||
| const supportedSubsets = Object.keys(weightings_default); | ||
| const weightingForCharacter = (character, subset) => { | ||
| if (!Object.keys(weightings_default[subset]).includes(character)) throw new Error(`No weighting specified for character: “${character}”`); | ||
| return weightings_default[subset][character]; | ||
| }; | ||
| const avgWidthForSubset = (font, subset) => { | ||
| const sampleString = Object.keys(weightings_default[subset]).join(""); | ||
| const weightedWidth = font.glyphsForString(sampleString).reduce((sum, glyph, index) => { | ||
| const character = sampleString.charAt(index); | ||
| let charWidth = font["OS/2"].xAvgCharWidth; | ||
| try { | ||
| charWidth = glyph.advanceWidth; | ||
| } catch (e) { | ||
| console.warn(`Couldn’t read 'advanceWidth' for character “${character === " " ? "<space>" : character}” from “${font.familyName}”. Falling back to “xAvgCharWidth”.`); | ||
| } | ||
| if (glyph.isMark) return sum; | ||
| return sum + charWidth * weightingForCharacter(character, subset); | ||
| }, 0); | ||
| return Math.round(weightedWidth); | ||
| }; | ||
| const unpackMetricsFromFont = (font) => { | ||
| const { capHeight, ascent, descent, lineGap, unitsPerEm, familyName, fullName, postscriptName, xHeight } = font; | ||
| const subsets = supportedSubsets.reduce((acc, subset) => ({ | ||
| ...acc, | ||
| [subset]: { xWidthAvg: avgWidthForSubset(font, subset) } | ||
| }), {}); | ||
| return { | ||
| familyName, | ||
| fullName, | ||
| postscriptName, | ||
| capHeight, | ||
| ascent, | ||
| descent, | ||
| lineGap, | ||
| unitsPerEm, | ||
| xHeight, | ||
| xWidthAvg: subsets.latin.xWidthAvg, | ||
| subsets | ||
| }; | ||
| }; | ||
| const handleCollectionErrors = ({ font, postscriptName, apiName, apiParamName }) => { | ||
| if (postscriptName && font === null) throw new Error([ | ||
| `The provided \`postscriptName\` of “${postscriptName}” cannot be found in the provided font collection.\n`, | ||
| "Run the same command without specifying a `postscriptName` in the options to see the available names in the collection.", | ||
| "For example:", | ||
| "------------------------------------------", | ||
| `const metrics = await ${apiName}('<${apiParamName}>');`, | ||
| "------------------------------------------\n", | ||
| "" | ||
| ].join("\n")); | ||
| if (font !== null && "fonts" in font && Array.isArray(font.fonts)) { | ||
| const availableNames = font.fonts.map((f) => f.postscriptName); | ||
| throw new Error([ | ||
| "Metrics cannot be unpacked from a font collection.\n", | ||
| "Provide either a single font or specify a `postscriptName` to extract from the collection via the options.", | ||
| "For example:", | ||
| "------------------------------------------", | ||
| `const metrics = await ${apiName}('<${apiParamName}>', {`, | ||
| ` postscriptName: '${availableNames[0]}'`, | ||
| "});", | ||
| "------------------------------------------\n", | ||
| "Available `postscriptNames` in this font collection are:", | ||
| ...availableNames.map((fontName) => ` - ${fontName}`), | ||
| "" | ||
| ].join("\n")); | ||
| } | ||
| }; | ||
| const fromFile = (path, options) => { | ||
| const { postscriptName } = options || {}; | ||
| return fontkit.open(path, postscriptName).then((font) => { | ||
| handleCollectionErrors({ | ||
| font, | ||
| postscriptName, | ||
| apiName: "fromFile", | ||
| apiParamName: "path" | ||
| }); | ||
| return unpackMetricsFromFont(font); | ||
| }); | ||
| }; | ||
| const _fromBuffer = async (buffer, apiName, apiParamName, options) => { | ||
| const { postscriptName } = options || {}; | ||
| const fontkitFont = fontkit.create(buffer, postscriptName); | ||
| handleCollectionErrors({ | ||
| font: fontkitFont, | ||
| postscriptName, | ||
| apiName, | ||
| apiParamName | ||
| }); | ||
| return unpackMetricsFromFont(fontkitFont); | ||
| }; | ||
| const fromBuffer = async (buffer, options) => { | ||
| return _fromBuffer(buffer, "fromBuffer", "buffer", options); | ||
| }; | ||
| const fromBlob = async (blob, options) => { | ||
| const arrayBuffer = await blob.arrayBuffer(); | ||
| return _fromBuffer(Buffer.from(arrayBuffer), "fromBlob", "blob", options); | ||
| }; | ||
| const fromUrl = async (url, options) => { | ||
| const arrayBuffer = await (await fetch(url)).arrayBuffer(); | ||
| return _fromBuffer(Buffer.from(arrayBuffer), "fromUrl", "url", options); | ||
| }; | ||
| //#endregion | ||
| exports.fromBlob = fromBlob; | ||
| exports.fromBuffer = fromBuffer; | ||
| exports.fromFile = fromFile; | ||
| exports.fromUrl = fromUrl; | ||
| exports.supportedSubsets = supportedSubsets; |
-174
| /// <reference types="node" /> | ||
| import { Font as Font$1 } from "fontkit"; | ||
| //#region src/weightings.d.ts | ||
| declare const _default: { | ||
| latin: { | ||
| "0": number; | ||
| "1": number; | ||
| "2": number; | ||
| "3": number; | ||
| "4": number; | ||
| "5": number; | ||
| "6": number; | ||
| "7": number; | ||
| "8": number; | ||
| "9": number; | ||
| ",": number; | ||
| " ": number; | ||
| t: number; | ||
| h: number; | ||
| e: number; | ||
| o: number; | ||
| f: number; | ||
| P: number; | ||
| p: number; | ||
| l: number; | ||
| "'": number; | ||
| s: number; | ||
| R: number; | ||
| u: number; | ||
| b: number; | ||
| i: number; | ||
| c: number; | ||
| C: number; | ||
| n: number; | ||
| a: number; | ||
| d: number; | ||
| y: number; | ||
| w: number; | ||
| B: number; | ||
| r: number; | ||
| z: number; | ||
| G: number; | ||
| j: number; | ||
| T: number; | ||
| ".": number; | ||
| L: number; | ||
| k: number; | ||
| m: number; | ||
| "]": number; | ||
| J: number; | ||
| F: number; | ||
| v: number; | ||
| g: number; | ||
| A: number; | ||
| N: number; | ||
| "-": number; | ||
| H: number; | ||
| D: number; | ||
| M: number; | ||
| I: number; | ||
| E: number; | ||
| "\"": number; | ||
| S: number; | ||
| "(": number; | ||
| ")": number; | ||
| x: number; | ||
| W: number; | ||
| Q: number; | ||
| Y: number; | ||
| q: number; | ||
| V: number; | ||
| á: number; | ||
| K: number; | ||
| U: number; | ||
| "=": number; | ||
| "[": number; | ||
| O: number; | ||
| é: number; | ||
| $: number; | ||
| ":": number; | ||
| "|": number; | ||
| "/": number; | ||
| "%": number; | ||
| Z: number; | ||
| ";": number; | ||
| X: number; | ||
| }; | ||
| thai: { | ||
| ส: number; | ||
| ว: number; | ||
| น: number; | ||
| บ: number; | ||
| จ: number; | ||
| า: number; | ||
| ก: number; | ||
| เ: number; | ||
| ร: number; | ||
| ม: number; | ||
| ค: number; | ||
| ำ: number; | ||
| ข: number; | ||
| อ: number; | ||
| ป: number; | ||
| ด: number; | ||
| ใ: number; | ||
| ภ: number; | ||
| ท: number; | ||
| พ: number; | ||
| ฤ: number; | ||
| ษ: number; | ||
| ศ: number; | ||
| ะ: number; | ||
| ช: number; | ||
| แ: number; | ||
| ล: number; | ||
| ง: number; | ||
| ย: number; | ||
| ห: number; | ||
| ฝ: number; | ||
| ต: number; | ||
| โ: number; | ||
| ญ: number; | ||
| ณ: number; | ||
| ผ: number; | ||
| ไ: number; | ||
| ฯ: number; | ||
| ฟ: number; | ||
| ธ: number; | ||
| ถ: number; | ||
| ฐ: number; | ||
| ซ: number; | ||
| ฉ: number; | ||
| ฑ: number; | ||
| ฆ: number; | ||
| ฬ: number; | ||
| ฏ: number; | ||
| ฎ: number; | ||
| ฒ: number; | ||
| ๆ: number; | ||
| ฮ: number; | ||
| "\u0E52": number; | ||
| "\u0E55": number; | ||
| }; | ||
| }; | ||
| //#endregion | ||
| //#region src/index.d.ts | ||
| type SupportedSubsets = keyof typeof _default; | ||
| declare const supportedSubsets: ("latin" | "thai")[]; | ||
| declare const unpackMetricsFromFont: (font: Font$1) => { | ||
| familyName: string; | ||
| fullName: string; | ||
| postscriptName: string; | ||
| capHeight: number; | ||
| ascent: number; | ||
| descent: number; | ||
| lineGap: number; | ||
| unitsPerEm: number; | ||
| xHeight: number; | ||
| xWidthAvg: number; | ||
| subsets: Record<"latin" | "thai", { | ||
| xWidthAvg: number; | ||
| }>; | ||
| }; | ||
| type Font = ReturnType<typeof unpackMetricsFromFont>; | ||
| interface Options { | ||
| postscriptName?: string; | ||
| } | ||
| declare const fromFile: (path: string, options?: Options) => Promise<Font>; | ||
| declare const fromBuffer: (buffer: Buffer, options?: Options) => Promise<Font>; | ||
| declare const fromBlob: (blob: Blob, options?: Options) => Promise<Font>; | ||
| declare const fromUrl: (url: string, options?: Options) => Promise<Font>; | ||
| //#endregion | ||
| export { Font, SupportedSubsets, fromBlob, fromBuffer, fromFile, fromUrl, supportedSubsets }; |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
5
-16.67%9
28.57%2
-33.33%Yes
NaN19380
-31.37%242
-53.55%+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed