@gtkx/cli 2.0.0-beta.6 → 2.0.0-beta.7
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/README.md +43 -40
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/codegen/freshness.d.ts.map +1 -1
- package/dist/codegen/freshness.js +5 -1
- package/dist/codegen/freshness.js.map +1 -1
- package/dist/deploy/settings/libraries.d.ts.map +1 -1
- package/dist/deploy/settings/libraries.js +2 -1
- package/dist/deploy/settings/libraries.js.map +1 -1
- package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
- package/dist/deploy/targets/flatpak-source.js +2 -0
- package/dist/deploy/targets/flatpak-source.js.map +1 -1
- package/dist/dev/font-dir.d.ts +3 -0
- package/dist/dev/font-dir.d.ts.map +1 -0
- package/dist/dev/font-dir.js +12 -0
- package/dist/dev/font-dir.js.map +1 -0
- package/dist/dev/runner-main.d.ts.map +1 -1
- package/dist/dev/runner-main.js +2 -0
- package/dist/dev/runner-main.js.map +1 -1
- package/dist/internal/agent-rules.d.ts.map +1 -1
- package/dist/internal/agent-rules.js +6 -2
- package/dist/internal/agent-rules.js.map +1 -1
- package/dist/internal/banner.d.ts.map +1 -1
- package/dist/internal/banner.js +3 -0
- package/dist/internal/banner.js.map +1 -1
- package/dist/internal/font-path.d.ts +4 -0
- package/dist/internal/font-path.d.ts.map +1 -0
- package/dist/internal/font-path.js +12 -0
- package/dist/internal/font-path.js.map +1 -0
- package/dist/internal/font-staging.d.ts +3 -0
- package/dist/internal/font-staging.d.ts.map +1 -0
- package/dist/internal/font-staging.js +43 -0
- package/dist/internal/font-staging.js.map +1 -0
- package/dist/internal/source-imports.d.ts +2 -1
- package/dist/internal/source-imports.d.ts.map +1 -1
- package/dist/internal/source-imports.js +7 -2
- package/dist/internal/source-imports.js.map +1 -1
- package/dist/internal/xdg-banner.d.ts +4 -0
- package/dist/internal/xdg-banner.d.ts.map +1 -0
- package/dist/internal/xdg-banner.js +11 -0
- package/dist/internal/xdg-banner.js.map +1 -0
- package/dist/internal/xdg-data-dirs.d.ts +2 -1
- package/dist/internal/xdg-data-dirs.d.ts.map +1 -1
- package/dist/internal/xdg-data-dirs.js +1 -1
- package/dist/internal/xdg-data-dirs.js.map +1 -1
- package/dist/settings/schema.d.ts.map +1 -1
- package/dist/settings/schema.js +1 -6
- package/dist/settings/schema.js.map +1 -1
- package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
- package/dist/vite-plugins/asset-extensions.js +2 -0
- package/dist/vite-plugins/asset-extensions.js.map +1 -1
- package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
- package/dist/vite-plugins/asset-imports.js +7 -2
- package/dist/vite-plugins/asset-imports.js.map +1 -1
- package/dist/vite-plugins/asset-specifier.d.ts +5 -1
- package/dist/vite-plugins/asset-specifier.d.ts.map +1 -1
- package/dist/vite-plugins/asset-specifier.js +10 -1
- package/dist/vite-plugins/asset-specifier.js.map +1 -1
- package/dist/vite-plugins/css.d.ts.map +1 -1
- package/dist/vite-plugins/css.js +3 -2
- package/dist/vite-plugins/css.js.map +1 -1
- package/dist/vite-plugins/font-name.d.ts +3 -0
- package/dist/vite-plugins/font-name.d.ts.map +1 -0
- package/dist/vite-plugins/font-name.js +406 -0
- package/dist/vite-plugins/font-name.js.map +1 -0
- package/dist/vite-plugins/font-worker-env.d.ts +4 -0
- package/dist/vite-plugins/font-worker-env.d.ts.map +1 -0
- package/dist/vite-plugins/font-worker-env.js +22 -0
- package/dist/vite-plugins/font-worker-env.js.map +1 -0
- package/dist/vite-plugins/font.d.ts +4 -0
- package/dist/vite-plugins/font.d.ts.map +1 -0
- package/dist/vite-plugins/font.js +87 -0
- package/dist/vite-plugins/font.js.map +1 -0
- package/dist/vite-plugins/icons.d.ts.map +1 -1
- package/dist/vite-plugins/icons.js +3 -8
- package/dist/vite-plugins/icons.js.map +1 -1
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +2 -0
- package/dist/vite-plugins/index.js.map +1 -1
- package/dist/vite-plugins/resources.js +1 -1
- package/dist/vite-plugins/resources.js.map +1 -1
- package/dist/vite-plugins/undeclared-library.js +3 -3
- package/dist/vite-plugins/undeclared-library.js.map +1 -1
- package/dist/vitest-plugin.d.ts.map +1 -1
- package/dist/vitest-plugin.js +2 -0
- package/dist/vitest-plugin.js.map +1 -1
- package/env.d.ts +9 -0
- package/package.json +14 -12
- package/src/cli.ts +1 -1
- package/src/codegen/freshness.ts +5 -1
- package/src/deploy/settings/libraries.ts +2 -1
- package/src/deploy/targets/flatpak-source.ts +2 -0
- package/src/dev/font-dir.ts +16 -0
- package/src/dev/runner-main.ts +2 -0
- package/src/internal/agent-rules.ts +6 -2
- package/src/internal/banner.ts +4 -0
- package/src/internal/font-path.ts +15 -0
- package/src/internal/font-staging.ts +57 -0
- package/src/internal/source-imports.ts +17 -2
- package/src/internal/xdg-banner.ts +13 -0
- package/src/internal/xdg-data-dirs.ts +1 -1
- package/src/settings/schema.ts +1 -8
- package/src/vite-plugins/asset-extensions.ts +2 -0
- package/src/vite-plugins/asset-imports.ts +9 -1
- package/src/vite-plugins/asset-specifier.ts +17 -0
- package/src/vite-plugins/css.ts +4 -2
- package/src/vite-plugins/font-name.ts +582 -0
- package/src/vite-plugins/font-worker-env.ts +29 -0
- package/src/vite-plugins/font.ts +147 -0
- package/src/vite-plugins/icons.ts +4 -10
- package/src/vite-plugins/index.ts +2 -0
- package/src/vite-plugins/resources.ts +1 -1
- package/src/vite-plugins/undeclared-library.ts +3 -3
- package/src/vitest-plugin.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/vite-plugins/css.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/vite-plugins/css.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAM7D,MAAM,MAAM,GAAG,SAAS,CAAC;AACzB,MAAM,aAAa,GAAG,SAAS,CAAC;AAChC,MAAM,cAAc,GAAG,aAAa,CAAC;AACrC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;AAE9F,MAAM,YAAY,GAAG,KAAK,EAAE,GAAsB,EAAE,OAA0B,EAA+B,EAAE;IAC3G,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO;IACX,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAEvD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO;IACX,CAAC;IAED,OAAO,SAAS,GAAG,aAAa,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,GAAmB,EAAE,EAAU,EAAsB,EAAE;IAC5E,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAChD,OAAO;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE3B,OAAO,CAAC,6CAA6C,EAAE,gBAAgB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnH,CAAC,CAAC;AAEF,SAAS,OAAO;IACZ,OAAO;QACH,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,KAAK;QAEd,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO;YAC/B,OAAO,YAAY,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,EAAE;YACH,OAAO,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrC,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,CAAC","sourcesContent":["import type { Plugin } from \"vite\";\nimport { readFileSync } from \"node:fs\";\nimport { createVirtualNamespace } from \"./virtual-module.js\";\n\ntype CssResolveContext = Parameters<typeof resolveToVirtual>[0];\ntype CssResolveRequest = Parameters<typeof resolveToVirtual>[1];\ntype CssLoadContext = { addWatchFile: (file: string) => void };\n\nconst CSS_RE = /\\.css$/i;\nconst INJECT_SUFFIX = \"?inject\";\nconst VIRTUAL_PREFIX = \"\\0gtkx-css:\";\nconst { isVirtual, fromVirtualId, resolveToVirtual } = createVirtualNamespace(VIRTUAL_PREFIX);\n\nconst resolveCssId = async (ctx: CssResolveContext, request: CssResolveRequest): Promise<string | undefined> => {\n if (!CSS_RE.test(request.source)) {\n return;\n }\n\n const virtualId = await resolveToVirtual(ctx, request);\n\n if (virtualId === undefined) {\n return;\n }\n\n return virtualId + INJECT_SUFFIX;\n};\n\nconst loadInjectedCss = (ctx: CssLoadContext, id: string): string | undefined => {\n if (!isVirtual(id) || !id.endsWith(INJECT_SUFFIX)) {\n return;\n }\n\n const filePath = fromVirtualId(id.slice(0, -INJECT_SUFFIX.length));\n const content = readFileSync(filePath, \"utf8\");\n ctx.addWatchFile(filePath);\n\n return [\"import { injectGlobal } from \\\"@gtkx/css\\\";\", `injectGlobal(${JSON.stringify(content)});`].join(\"\\n\");\n};\n\nfunction gtkxCss(): Plugin {\n return {\n name: \"gtkx:css\",\n enforce: \"pre\",\n\n resolveId(source, importer, options) {\n return resolveCssId(this, { source, importer, options });\n },\n\n load(id) {\n return loadInjectedCss(this, id);\n },\n };\n}\n\nexport { gtkxCss };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"font-name.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/font-name.ts"],"names":[],"mappings":"AA6jBA,QAAA,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,MAAM,EAM7C,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { brotliDecompressSync, inflateSync } from "node:zlib";
|
|
2
|
+
const MAX_FONT_BYTES = 256 * 1024 * 1024;
|
|
3
|
+
const MAX_TABLE_BYTES = 16 * 1024 * 1024;
|
|
4
|
+
const TAG_SIZE = 4;
|
|
5
|
+
const TAG_GLYF = "glyf";
|
|
6
|
+
const TAG_LOCA = "loca";
|
|
7
|
+
const TAG_NAME = "name";
|
|
8
|
+
const TAG_TTCF = "ttcf";
|
|
9
|
+
const SIGNATURE_WOFF = "wOFF";
|
|
10
|
+
const SIGNATURE_WOFF2 = "wOF2";
|
|
11
|
+
const SFNT_VERSION_COLLECTION = 0x74_74_63_66;
|
|
12
|
+
const SFNT_VERSIONS = new Set([0x00_01_00_00, 0x4F_54_54_4F, 0x74_72_75_65]);
|
|
13
|
+
const SFNT_TABLE_COUNT_OFFSET = 4;
|
|
14
|
+
const SFNT_DIRECTORY_OFFSET = 12;
|
|
15
|
+
const SFNT_RECORD_SIZE = 16;
|
|
16
|
+
const SFNT_RECORD_OFFSET_FIELD = 8;
|
|
17
|
+
const SFNT_RECORD_LENGTH_FIELD = 12;
|
|
18
|
+
const COLLECTION_COUNT_OFFSET = 8;
|
|
19
|
+
const COLLECTION_DIRECTORY_OFFSET = 12;
|
|
20
|
+
const COLLECTION_ENTRY_SIZE = 4;
|
|
21
|
+
const WOFF_TABLE_COUNT_OFFSET = 12;
|
|
22
|
+
const WOFF_DIRECTORY_OFFSET = 44;
|
|
23
|
+
const WOFF_RECORD_SIZE = 20;
|
|
24
|
+
const WOFF_RECORD_OFFSET_FIELD = 4;
|
|
25
|
+
const WOFF_RECORD_COMPRESSED_FIELD = 8;
|
|
26
|
+
const WOFF_RECORD_ORIGINAL_FIELD = 12;
|
|
27
|
+
const WOFF2_FLAVOR_OFFSET = 4;
|
|
28
|
+
const WOFF2_TABLE_COUNT_OFFSET = 12;
|
|
29
|
+
const WOFF2_COMPRESSED_SIZE_OFFSET = 20;
|
|
30
|
+
const WOFF2_HEADER_SIZE = 48;
|
|
31
|
+
const WOFF2_COLLECTION_FONTS_OFFSET = 4;
|
|
32
|
+
const WOFF2_COLLECTION_FLAVOR_SIZE = 4;
|
|
33
|
+
const WOFF2_TAG_MASK = 0x3F;
|
|
34
|
+
const WOFF2_TAG_ESCAPE = 63;
|
|
35
|
+
const WOFF2_TRANSFORM_SHIFT = 6;
|
|
36
|
+
const WOFF2_KNOWN_TAGS = [
|
|
37
|
+
"cmap", "head", "hhea", "hmtx", "maxp", "name", "OS/2", "post", "cvt ", "fpgm",
|
|
38
|
+
"glyf", "loca", "prep", "CFF ", "VORG", "EBDT", "EBLC", "gasp", "hdmx", "kern",
|
|
39
|
+
"LTSH", "PCLT", "VDMX", "vhea", "vmtx", "BASE", "GDEF", "GPOS", "GSUB", "EBSC",
|
|
40
|
+
"JSTF", "MATH", "CBDT", "CBLC", "COLR", "CPAL", "SVG ", "sbix", "acnt", "avar",
|
|
41
|
+
"bdat", "bloc", "bsln", "cvar", "fdsc", "feat", "fmtx", "fvar", "gvar", "hsty",
|
|
42
|
+
"just", "lcar", "mort", "morx", "opbd", "prop", "trak", "Zapf", "Silf", "Glat",
|
|
43
|
+
"Gloc", "Feat", "Sill",
|
|
44
|
+
];
|
|
45
|
+
const BASE128_MAX_BYTES = 5;
|
|
46
|
+
const BASE128_MASK = 0x7F;
|
|
47
|
+
const BASE128_RADIX = 128;
|
|
48
|
+
const BASE128_CONTINUATION = 0x80;
|
|
49
|
+
const UINT32_MAX = 0xFF_FF_FF_FF;
|
|
50
|
+
const WORD_CODE = 253;
|
|
51
|
+
const EXTENDED_CODES = new Map([[254, 506], [255, 253]]);
|
|
52
|
+
const NAME_FORMATS = new Set([0, 1]);
|
|
53
|
+
const NAME_HEADER_SIZE = 6;
|
|
54
|
+
const NAME_RECORD_SIZE = 12;
|
|
55
|
+
const NAME_COUNT_OFFSET = 2;
|
|
56
|
+
const NAME_STORAGE_OFFSET = 4;
|
|
57
|
+
const FAMILY_NAME_IDS = [21, 16, 1];
|
|
58
|
+
const PLATFORM_UNICODE = 0;
|
|
59
|
+
const PLATFORM_MACINTOSH = 1;
|
|
60
|
+
const PLATFORM_WINDOWS = 3;
|
|
61
|
+
const WINDOWS_UTF16_ENCODINGS = new Set([1, 10]);
|
|
62
|
+
const MAC_ROMAN_ENCODING = 0;
|
|
63
|
+
const MAC_ROMAN_LANGUAGE = 0;
|
|
64
|
+
const MAC_ROMAN_HIGH_START = 128;
|
|
65
|
+
const MAC_ROMAN_HIGH = "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü" +
|
|
66
|
+
"†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø" +
|
|
67
|
+
"¿¡¬√ƒ≈∆«»…\u{A0}ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›fifl" +
|
|
68
|
+
"‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ\u{F8FF}ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ";
|
|
69
|
+
const LANGUAGE_ENGLISH_US = 0x04_09;
|
|
70
|
+
const LANGUAGE_ENGLISH = 0x09;
|
|
71
|
+
const LANGUAGE_PRIMARY_MASK = 0x03_FF;
|
|
72
|
+
const SCORE_WINDOWS_ENGLISH_US = 100;
|
|
73
|
+
const SCORE_WINDOWS_ENGLISH = 90;
|
|
74
|
+
const SCORE_UNICODE = 80;
|
|
75
|
+
const SCORE_MAC_ROMAN = 70;
|
|
76
|
+
const SCORE_WINDOWS_OTHER = 10;
|
|
77
|
+
const SCORE_NONE = 0;
|
|
78
|
+
const CONTROL_PATTERN = /\p{Cc}/gu;
|
|
79
|
+
const isValidRange = (data, start, length) => Number.isSafeInteger(start) && Number.isSafeInteger(length) && start >= 0 && length >= 0 &&
|
|
80
|
+
start + length <= data.length;
|
|
81
|
+
const sliceRange = (data, start, length) => isValidRange(data, start, length) ? data.subarray(start, start + length) : undefined;
|
|
82
|
+
const readUint16 = (data, offset) => sliceRange(data, offset, 2)?.readUInt16BE(0);
|
|
83
|
+
const readUint32 = (data, offset) => sliceRange(data, offset, 4)?.readUInt32BE(0);
|
|
84
|
+
const readTag = (data, offset) => sliceRange(data, offset, TAG_SIZE)?.toString("latin1");
|
|
85
|
+
const inflateTable = (data, limit) => {
|
|
86
|
+
try {
|
|
87
|
+
return inflateSync(data, { maxOutputLength: Math.min(limit, MAX_TABLE_BYTES) });
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const brotliFont = (data) => {
|
|
94
|
+
try {
|
|
95
|
+
return brotliDecompressSync(data, { maxOutputLength: MAX_FONT_BYTES });
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const macRomanChar = (byte) => {
|
|
102
|
+
const code = byte < MAC_ROMAN_HIGH_START ? byte : MAC_ROMAN_HIGH.codePointAt(byte - MAC_ROMAN_HIGH_START);
|
|
103
|
+
return code === undefined ? "" : String.fromCodePoint(code);
|
|
104
|
+
};
|
|
105
|
+
const decodeMacRoman = (bytes) => [...bytes].map((byte) => macRomanChar(byte)).join("");
|
|
106
|
+
const decodeUtf16 = (bytes) => {
|
|
107
|
+
if (bytes.length % 2 !== 0) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
const swapped = Buffer.from(bytes);
|
|
111
|
+
swapped.swap16();
|
|
112
|
+
return swapped.toString("utf16le");
|
|
113
|
+
};
|
|
114
|
+
const isUtf16Name = (header) => header.platformId === PLATFORM_UNICODE ||
|
|
115
|
+
(header.platformId === PLATFORM_WINDOWS && WINDOWS_UTF16_ENCODINGS.has(header.encodingId));
|
|
116
|
+
const isMacRomanName = (header) => header.platformId === PLATFORM_MACINTOSH &&
|
|
117
|
+
header.encodingId === MAC_ROMAN_ENCODING &&
|
|
118
|
+
header.languageId === MAC_ROMAN_LANGUAGE;
|
|
119
|
+
const decodeName = (bytes, header) => {
|
|
120
|
+
if (isUtf16Name(header)) {
|
|
121
|
+
return decodeUtf16(bytes);
|
|
122
|
+
}
|
|
123
|
+
return isMacRomanName(header) ? decodeMacRoman(bytes) : undefined;
|
|
124
|
+
};
|
|
125
|
+
const nameRecordHeader = (table, offset) => {
|
|
126
|
+
const record = sliceRange(table, offset, NAME_RECORD_SIZE);
|
|
127
|
+
if (record === undefined) {
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
encodingId: record.readUInt16BE(2),
|
|
132
|
+
languageId: record.readUInt16BE(4),
|
|
133
|
+
length: record.readUInt16BE(8),
|
|
134
|
+
nameId: record.readUInt16BE(6),
|
|
135
|
+
platformId: record.readUInt16BE(0),
|
|
136
|
+
stringOffset: record.readUInt16BE(10),
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
const nameRecordAt = (table, offset, storage) => {
|
|
140
|
+
const header = nameRecordHeader(table, offset);
|
|
141
|
+
if (header === undefined) {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
const bytes = sliceRange(table, storage + header.stringOffset, header.length);
|
|
145
|
+
const decoded = bytes === undefined ? undefined : decodeName(bytes, header);
|
|
146
|
+
const value = decoded?.replaceAll(CONTROL_PATTERN, "").trim();
|
|
147
|
+
return value === undefined || value.length === 0 ? undefined : { ...header, value };
|
|
148
|
+
};
|
|
149
|
+
const nameRecords = (table) => {
|
|
150
|
+
const format = readUint16(table, 0);
|
|
151
|
+
const count = readUint16(table, NAME_COUNT_OFFSET);
|
|
152
|
+
const storage = readUint16(table, NAME_STORAGE_OFFSET);
|
|
153
|
+
const records = [];
|
|
154
|
+
if (format === undefined || count === undefined || storage === undefined || !NAME_FORMATS.has(format)) {
|
|
155
|
+
return records;
|
|
156
|
+
}
|
|
157
|
+
for (let index = 0; index < count; index += 1) {
|
|
158
|
+
const record = nameRecordAt(table, NAME_HEADER_SIZE + index * NAME_RECORD_SIZE, storage);
|
|
159
|
+
if (record !== undefined) {
|
|
160
|
+
records.push(record);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return records;
|
|
164
|
+
};
|
|
165
|
+
const windowsLanguageScore = (languageId) => {
|
|
166
|
+
if (languageId === LANGUAGE_ENGLISH_US) {
|
|
167
|
+
return SCORE_WINDOWS_ENGLISH_US;
|
|
168
|
+
}
|
|
169
|
+
return (languageId & LANGUAGE_PRIMARY_MASK) === LANGUAGE_ENGLISH ? SCORE_WINDOWS_ENGLISH : SCORE_WINDOWS_OTHER;
|
|
170
|
+
};
|
|
171
|
+
const nameScore = (record) => {
|
|
172
|
+
if (record.platformId === PLATFORM_WINDOWS && WINDOWS_UTF16_ENCODINGS.has(record.encodingId)) {
|
|
173
|
+
return windowsLanguageScore(record.languageId);
|
|
174
|
+
}
|
|
175
|
+
if (record.platformId === PLATFORM_UNICODE) {
|
|
176
|
+
return SCORE_UNICODE;
|
|
177
|
+
}
|
|
178
|
+
return isMacRomanName(record) ? SCORE_MAC_ROMAN : SCORE_NONE;
|
|
179
|
+
};
|
|
180
|
+
const scoredNames = (records, nameId) => records
|
|
181
|
+
.filter((record) => record.nameId === nameId)
|
|
182
|
+
.map((record) => ({ score: nameScore(record), value: record.value }))
|
|
183
|
+
.filter((entry) => entry.score > SCORE_NONE);
|
|
184
|
+
const bestName = (records, nameId) => scoredNames(records, nameId).toSorted((left, right) => right.score - left.score)[0]?.value;
|
|
185
|
+
const familyName = (table) => {
|
|
186
|
+
const records = nameRecords(table);
|
|
187
|
+
return FAMILY_NAME_IDS.map((nameId) => bestName(records, nameId)).find((value) => value !== undefined);
|
|
188
|
+
};
|
|
189
|
+
const sfntTableAt = (data, record) => {
|
|
190
|
+
const tag = readTag(data, record);
|
|
191
|
+
const offset = readUint32(data, record + SFNT_RECORD_OFFSET_FIELD);
|
|
192
|
+
const length = readUint32(data, record + SFNT_RECORD_LENGTH_FIELD);
|
|
193
|
+
if (tag !== TAG_NAME || offset === undefined || length === undefined) {
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
return sliceRange(data, offset, length);
|
|
197
|
+
};
|
|
198
|
+
const sfntNameTable = (data, start) => {
|
|
199
|
+
const version = readUint32(data, start);
|
|
200
|
+
const count = readUint16(data, start + SFNT_TABLE_COUNT_OFFSET);
|
|
201
|
+
if (version === undefined || count === undefined || !SFNT_VERSIONS.has(version)) {
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
for (let index = 0; index < count; index += 1) {
|
|
205
|
+
const table = sfntTableAt(data, start + SFNT_DIRECTORY_OFFSET + index * SFNT_RECORD_SIZE);
|
|
206
|
+
if (table !== undefined) {
|
|
207
|
+
return table;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return undefined;
|
|
211
|
+
};
|
|
212
|
+
const sfntNameTables = (data) => {
|
|
213
|
+
const table = sfntNameTable(data, 0);
|
|
214
|
+
return table === undefined ? [] : [table];
|
|
215
|
+
};
|
|
216
|
+
const collectionNameTables = (data) => {
|
|
217
|
+
const count = readUint32(data, COLLECTION_COUNT_OFFSET) ?? 0;
|
|
218
|
+
const limit = Math.floor((data.length - COLLECTION_DIRECTORY_OFFSET) / COLLECTION_ENTRY_SIZE);
|
|
219
|
+
const tables = [];
|
|
220
|
+
for (let index = 0; index < Math.min(count, limit); index += 1) {
|
|
221
|
+
const start = readUint32(data, COLLECTION_DIRECTORY_OFFSET + index * COLLECTION_ENTRY_SIZE);
|
|
222
|
+
const table = start === undefined ? undefined : sfntNameTable(data, start);
|
|
223
|
+
if (table !== undefined) {
|
|
224
|
+
tables.push(table);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return tables;
|
|
228
|
+
};
|
|
229
|
+
const woffTableData = (compressed, compressedLength, originalLength) => compressedLength === originalLength ? compressed : inflateTable(compressed, originalLength);
|
|
230
|
+
const woffTableAt = (data, record) => {
|
|
231
|
+
const tag = readTag(data, record);
|
|
232
|
+
const offset = readUint32(data, record + WOFF_RECORD_OFFSET_FIELD);
|
|
233
|
+
const compressedLength = readUint32(data, record + WOFF_RECORD_COMPRESSED_FIELD);
|
|
234
|
+
const originalLength = readUint32(data, record + WOFF_RECORD_ORIGINAL_FIELD);
|
|
235
|
+
if (tag !== TAG_NAME || offset === undefined || compressedLength === undefined || originalLength === undefined) {
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
const compressed = sliceRange(data, offset, compressedLength);
|
|
239
|
+
return compressed === undefined ? undefined : woffTableData(compressed, compressedLength, originalLength);
|
|
240
|
+
};
|
|
241
|
+
const woffNameTables = (data) => {
|
|
242
|
+
const count = readUint16(data, WOFF_TABLE_COUNT_OFFSET) ?? 0;
|
|
243
|
+
const tables = [];
|
|
244
|
+
for (let index = 0; index < count; index += 1) {
|
|
245
|
+
const table = woffTableAt(data, WOFF_DIRECTORY_OFFSET + index * WOFF_RECORD_SIZE);
|
|
246
|
+
if (table !== undefined) {
|
|
247
|
+
tables.push(table);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return tables;
|
|
251
|
+
};
|
|
252
|
+
const base128Length = (data, start) => {
|
|
253
|
+
const window = data.subarray(start, start + BASE128_MAX_BYTES);
|
|
254
|
+
const terminator = window.findIndex((byte) => (byte & BASE128_CONTINUATION) === 0);
|
|
255
|
+
return terminator === -1 ? undefined : terminator + 1;
|
|
256
|
+
};
|
|
257
|
+
const base128Value = (data, start, length) => {
|
|
258
|
+
const bytes = data.subarray(start, start + length);
|
|
259
|
+
let value = 0;
|
|
260
|
+
for (const byte of bytes) {
|
|
261
|
+
value = value * BASE128_RADIX + (byte & BASE128_MASK);
|
|
262
|
+
}
|
|
263
|
+
return value;
|
|
264
|
+
};
|
|
265
|
+
const readBase128 = (data, start) => {
|
|
266
|
+
const length = base128Length(data, start);
|
|
267
|
+
if (length === undefined || data[start] === BASE128_CONTINUATION) {
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
const value = base128Value(data, start, length);
|
|
271
|
+
return value > UINT32_MAX ? undefined : { offset: start + length, value };
|
|
272
|
+
};
|
|
273
|
+
const readExtended255 = (data, start, code) => {
|
|
274
|
+
const extra = EXTENDED_CODES.get(code);
|
|
275
|
+
if (extra === undefined) {
|
|
276
|
+
return { offset: start + 1, value: code };
|
|
277
|
+
}
|
|
278
|
+
const byte = data[start + 1];
|
|
279
|
+
return byte === undefined ? undefined : { offset: start + 2, value: byte + extra };
|
|
280
|
+
};
|
|
281
|
+
const read255Uint16 = (data, start) => {
|
|
282
|
+
const code = data[start];
|
|
283
|
+
if (code === undefined) {
|
|
284
|
+
return undefined;
|
|
285
|
+
}
|
|
286
|
+
if (code !== WORD_CODE) {
|
|
287
|
+
return readExtended255(data, start, code);
|
|
288
|
+
}
|
|
289
|
+
const value = readUint16(data, start + 1);
|
|
290
|
+
return value === undefined ? undefined : { offset: start + 3, value };
|
|
291
|
+
};
|
|
292
|
+
const woff2Tag = (data, start, flags) => (flags & WOFF2_TAG_MASK) === WOFF2_TAG_ESCAPE
|
|
293
|
+
? readTag(data, start + 1)
|
|
294
|
+
: WOFF2_KNOWN_TAGS[flags & WOFF2_TAG_MASK];
|
|
295
|
+
const woff2TagEnd = (start, flags) => (flags & WOFF2_TAG_MASK) === WOFF2_TAG_ESCAPE ? start + 1 + TAG_SIZE : start + 1;
|
|
296
|
+
const isWoff2Transformed = (tag, flags) => tag === TAG_GLYF || tag === TAG_LOCA
|
|
297
|
+
? (flags >> WOFF2_TRANSFORM_SHIFT) === 0
|
|
298
|
+
: (flags >> WOFF2_TRANSFORM_SHIFT) !== 0;
|
|
299
|
+
const woff2TransformedEntry = (data, tag, original) => {
|
|
300
|
+
const transformed = readBase128(data, original.offset);
|
|
301
|
+
return transformed === undefined ? undefined : { length: transformed.value, next: transformed.offset, tag };
|
|
302
|
+
};
|
|
303
|
+
const woff2Entry = (data, start) => {
|
|
304
|
+
const flags = data[start];
|
|
305
|
+
if (flags === undefined) {
|
|
306
|
+
return undefined;
|
|
307
|
+
}
|
|
308
|
+
const tag = woff2Tag(data, start, flags);
|
|
309
|
+
const original = readBase128(data, woff2TagEnd(start, flags));
|
|
310
|
+
if (tag === undefined || original === undefined) {
|
|
311
|
+
return undefined;
|
|
312
|
+
}
|
|
313
|
+
return isWoff2Transformed(tag, flags)
|
|
314
|
+
? woff2TransformedEntry(data, tag, original)
|
|
315
|
+
: { length: original.value, next: original.offset, tag };
|
|
316
|
+
};
|
|
317
|
+
const woff2Directory = (data, count) => {
|
|
318
|
+
const tables = [];
|
|
319
|
+
let cursor = WOFF2_HEADER_SIZE;
|
|
320
|
+
let offset = 0;
|
|
321
|
+
for (let index = 0; index < count; index += 1) {
|
|
322
|
+
const entry = woff2Entry(data, cursor);
|
|
323
|
+
if (entry === undefined) {
|
|
324
|
+
return undefined;
|
|
325
|
+
}
|
|
326
|
+
tables.push({ length: entry.length, offset, tag: entry.tag });
|
|
327
|
+
cursor = entry.next;
|
|
328
|
+
offset += entry.length;
|
|
329
|
+
}
|
|
330
|
+
return { end: cursor, tables };
|
|
331
|
+
};
|
|
332
|
+
const skipSequence = (data, start, count, step) => {
|
|
333
|
+
let cursor = start;
|
|
334
|
+
for (let index = 0; index < count; index += 1) {
|
|
335
|
+
const next = step(data, cursor);
|
|
336
|
+
if (next === undefined) {
|
|
337
|
+
return undefined;
|
|
338
|
+
}
|
|
339
|
+
cursor = next;
|
|
340
|
+
}
|
|
341
|
+
return cursor;
|
|
342
|
+
};
|
|
343
|
+
const skipIndex = (data, offset) => read255Uint16(data, offset)?.offset;
|
|
344
|
+
const skipCollectionFont = (data, start) => {
|
|
345
|
+
const tables = read255Uint16(data, start);
|
|
346
|
+
if (tables === undefined) {
|
|
347
|
+
return undefined;
|
|
348
|
+
}
|
|
349
|
+
return skipSequence(data, tables.offset + WOFF2_COLLECTION_FLAVOR_SIZE, tables.value, skipIndex);
|
|
350
|
+
};
|
|
351
|
+
const woff2CollectionEnd = (data, start) => {
|
|
352
|
+
const fonts = read255Uint16(data, start + WOFF2_COLLECTION_FONTS_OFFSET);
|
|
353
|
+
if (fonts === undefined) {
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
356
|
+
return skipSequence(data, fonts.offset, fonts.value, skipCollectionFont);
|
|
357
|
+
};
|
|
358
|
+
const woff2DataStart = (data, end) => {
|
|
359
|
+
const flavor = readUint32(data, WOFF2_FLAVOR_OFFSET);
|
|
360
|
+
return flavor === SFNT_VERSION_COLLECTION ? woff2CollectionEnd(data, end) : end;
|
|
361
|
+
};
|
|
362
|
+
const woff2Compressed = (data, start) => {
|
|
363
|
+
const size = readUint32(data, WOFF2_COMPRESSED_SIZE_OFFSET);
|
|
364
|
+
const bounded = size === undefined ? undefined : sliceRange(data, start, size);
|
|
365
|
+
return bounded ?? data.subarray(start);
|
|
366
|
+
};
|
|
367
|
+
const woff2NameSlices = (font, tables) => tables
|
|
368
|
+
.filter((table) => table.tag === TAG_NAME)
|
|
369
|
+
.map((table) => sliceRange(font, table.offset, table.length))
|
|
370
|
+
.filter((table) => table !== undefined);
|
|
371
|
+
const woff2Tables = (data, directory) => {
|
|
372
|
+
const start = woff2DataStart(data, directory.end);
|
|
373
|
+
const font = start === undefined ? undefined : brotliFont(woff2Compressed(data, start));
|
|
374
|
+
return font === undefined ? [] : woff2NameSlices(font, directory.tables);
|
|
375
|
+
};
|
|
376
|
+
const woff2NameTables = (data) => {
|
|
377
|
+
const count = readUint16(data, WOFF2_TABLE_COUNT_OFFSET);
|
|
378
|
+
const directory = count === undefined ? undefined : woff2Directory(data, count);
|
|
379
|
+
return directory === undefined ? [] : woff2Tables(data, directory);
|
|
380
|
+
};
|
|
381
|
+
const nameTables = (data) => {
|
|
382
|
+
const signature = readTag(data, 0);
|
|
383
|
+
if (signature === SIGNATURE_WOFF) {
|
|
384
|
+
return woffNameTables(data);
|
|
385
|
+
}
|
|
386
|
+
if (signature === SIGNATURE_WOFF2) {
|
|
387
|
+
return woff2NameTables(data);
|
|
388
|
+
}
|
|
389
|
+
return signature === TAG_TTCF ? collectionNameTables(data) : sfntNameTables(data);
|
|
390
|
+
};
|
|
391
|
+
const familyNames = (font) => {
|
|
392
|
+
const names = nameTables(font)
|
|
393
|
+
.map((table) => familyName(table))
|
|
394
|
+
.filter((name) => name !== undefined);
|
|
395
|
+
return [...new Set(names)];
|
|
396
|
+
};
|
|
397
|
+
const fontFamilyNames = (font) => {
|
|
398
|
+
try {
|
|
399
|
+
return familyNames(font);
|
|
400
|
+
}
|
|
401
|
+
catch {
|
|
402
|
+
return [];
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
export { fontFamilyNames };
|
|
406
|
+
//# sourceMappingURL=font-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"font-name.js","sourceRoot":"","sources":["../../src/vite-plugins/font-name.ts"],"names":[],"mappings":"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","sourcesContent":["import { brotliDecompressSync, inflateSync } from \"node:zlib\";\n\ntype Base128 = {\n offset: number;\n value: number;\n};\n\ntype NameHeader = {\n encodingId: number;\n languageId: number;\n length: number;\n nameId: number;\n platformId: number;\n stringOffset: number;\n};\n\ntype NameRecord = NameHeader & { value: string };\n\ntype ScoredName = {\n score: number;\n value: string;\n};\n\ntype Woff2Entry = {\n length: number;\n next: number;\n tag: string;\n};\n\ntype Woff2Table = {\n length: number;\n offset: number;\n tag: string;\n};\n\ntype Woff2Directory = {\n end: number;\n tables: Woff2Table[];\n};\n\ntype Woff2Step = (data: Buffer, offset: number) => number | undefined;\n\nconst MAX_FONT_BYTES = 256 * 1024 * 1024;\nconst MAX_TABLE_BYTES = 16 * 1024 * 1024;\nconst TAG_SIZE = 4;\nconst TAG_GLYF = \"glyf\";\nconst TAG_LOCA = \"loca\";\nconst TAG_NAME = \"name\";\nconst TAG_TTCF = \"ttcf\";\nconst SIGNATURE_WOFF = \"wOFF\";\nconst SIGNATURE_WOFF2 = \"wOF2\";\nconst SFNT_VERSION_COLLECTION = 0x74_74_63_66;\nconst SFNT_VERSIONS = new Set([0x00_01_00_00, 0x4F_54_54_4F, 0x74_72_75_65]);\nconst SFNT_TABLE_COUNT_OFFSET = 4;\nconst SFNT_DIRECTORY_OFFSET = 12;\nconst SFNT_RECORD_SIZE = 16;\nconst SFNT_RECORD_OFFSET_FIELD = 8;\nconst SFNT_RECORD_LENGTH_FIELD = 12;\nconst COLLECTION_COUNT_OFFSET = 8;\nconst COLLECTION_DIRECTORY_OFFSET = 12;\nconst COLLECTION_ENTRY_SIZE = 4;\nconst WOFF_TABLE_COUNT_OFFSET = 12;\nconst WOFF_DIRECTORY_OFFSET = 44;\nconst WOFF_RECORD_SIZE = 20;\nconst WOFF_RECORD_OFFSET_FIELD = 4;\nconst WOFF_RECORD_COMPRESSED_FIELD = 8;\nconst WOFF_RECORD_ORIGINAL_FIELD = 12;\nconst WOFF2_FLAVOR_OFFSET = 4;\nconst WOFF2_TABLE_COUNT_OFFSET = 12;\nconst WOFF2_COMPRESSED_SIZE_OFFSET = 20;\nconst WOFF2_HEADER_SIZE = 48;\nconst WOFF2_COLLECTION_FONTS_OFFSET = 4;\nconst WOFF2_COLLECTION_FLAVOR_SIZE = 4;\nconst WOFF2_TAG_MASK = 0x3F;\nconst WOFF2_TAG_ESCAPE = 63;\nconst WOFF2_TRANSFORM_SHIFT = 6;\nconst WOFF2_KNOWN_TAGS = [\n \"cmap\", \"head\", \"hhea\", \"hmtx\", \"maxp\", \"name\", \"OS/2\", \"post\", \"cvt \", \"fpgm\",\n \"glyf\", \"loca\", \"prep\", \"CFF \", \"VORG\", \"EBDT\", \"EBLC\", \"gasp\", \"hdmx\", \"kern\",\n \"LTSH\", \"PCLT\", \"VDMX\", \"vhea\", \"vmtx\", \"BASE\", \"GDEF\", \"GPOS\", \"GSUB\", \"EBSC\",\n \"JSTF\", \"MATH\", \"CBDT\", \"CBLC\", \"COLR\", \"CPAL\", \"SVG \", \"sbix\", \"acnt\", \"avar\",\n \"bdat\", \"bloc\", \"bsln\", \"cvar\", \"fdsc\", \"feat\", \"fmtx\", \"fvar\", \"gvar\", \"hsty\",\n \"just\", \"lcar\", \"mort\", \"morx\", \"opbd\", \"prop\", \"trak\", \"Zapf\", \"Silf\", \"Glat\",\n \"Gloc\", \"Feat\", \"Sill\",\n];\nconst BASE128_MAX_BYTES = 5;\nconst BASE128_MASK = 0x7F;\nconst BASE128_RADIX = 128;\nconst BASE128_CONTINUATION = 0x80;\nconst UINT32_MAX = 0xFF_FF_FF_FF;\nconst WORD_CODE = 253;\nconst EXTENDED_CODES = new Map([[254, 506], [255, 253]]);\nconst NAME_FORMATS = new Set([0, 1]);\nconst NAME_HEADER_SIZE = 6;\nconst NAME_RECORD_SIZE = 12;\nconst NAME_COUNT_OFFSET = 2;\nconst NAME_STORAGE_OFFSET = 4;\nconst FAMILY_NAME_IDS = [21, 16, 1];\nconst PLATFORM_UNICODE = 0;\nconst PLATFORM_MACINTOSH = 1;\nconst PLATFORM_WINDOWS = 3;\nconst WINDOWS_UTF16_ENCODINGS = new Set([1, 10]);\nconst MAC_ROMAN_ENCODING = 0;\nconst MAC_ROMAN_LANGUAGE = 0;\nconst MAC_ROMAN_HIGH_START = 128;\nconst MAC_ROMAN_HIGH =\n \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü\" +\n \"†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø\" +\n \"¿¡¬√ƒ≈∆«»…\\u{A0}ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›fifl\" +\n \"‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ\\u{F8FF}ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\";\nconst LANGUAGE_ENGLISH_US = 0x04_09;\nconst LANGUAGE_ENGLISH = 0x09;\nconst LANGUAGE_PRIMARY_MASK = 0x03_FF;\nconst SCORE_WINDOWS_ENGLISH_US = 100;\nconst SCORE_WINDOWS_ENGLISH = 90;\nconst SCORE_UNICODE = 80;\nconst SCORE_MAC_ROMAN = 70;\nconst SCORE_WINDOWS_OTHER = 10;\nconst SCORE_NONE = 0;\nconst CONTROL_PATTERN = /\\p{Cc}/gu;\n\nconst isValidRange = (data: Buffer, start: number, length: number): boolean =>\n Number.isSafeInteger(start) && Number.isSafeInteger(length) && start >= 0 && length >= 0 &&\n start + length <= data.length;\n\nconst sliceRange = (data: Buffer, start: number, length: number): Buffer | undefined =>\n isValidRange(data, start, length) ? data.subarray(start, start + length) : undefined;\n\nconst readUint16 = (data: Buffer, offset: number): number | undefined =>\n sliceRange(data, offset, 2)?.readUInt16BE(0);\n\nconst readUint32 = (data: Buffer, offset: number): number | undefined =>\n sliceRange(data, offset, 4)?.readUInt32BE(0);\n\nconst readTag = (data: Buffer, offset: number): string | undefined =>\n sliceRange(data, offset, TAG_SIZE)?.toString(\"latin1\");\n\nconst inflateTable = (data: Buffer, limit: number): Buffer | undefined => {\n try {\n return inflateSync(data, { maxOutputLength: Math.min(limit, MAX_TABLE_BYTES) });\n } catch {\n return undefined;\n }\n};\n\nconst brotliFont = (data: Buffer): Buffer | undefined => {\n try {\n return brotliDecompressSync(data, { maxOutputLength: MAX_FONT_BYTES });\n } catch {\n return undefined;\n }\n};\n\nconst macRomanChar = (byte: number): string => {\n const code = byte < MAC_ROMAN_HIGH_START ? byte : MAC_ROMAN_HIGH.codePointAt(byte - MAC_ROMAN_HIGH_START);\n\n return code === undefined ? \"\" : String.fromCodePoint(code);\n};\n\nconst decodeMacRoman = (bytes: Buffer): string => [...bytes].map((byte) => macRomanChar(byte)).join(\"\");\n\nconst decodeUtf16 = (bytes: Buffer): string | undefined => {\n if (bytes.length % 2 !== 0) {\n return undefined;\n }\n\n const swapped = Buffer.from(bytes);\n\n swapped.swap16();\n\n return swapped.toString(\"utf16le\");\n};\n\nconst isUtf16Name = (header: NameHeader): boolean =>\n header.platformId === PLATFORM_UNICODE ||\n (header.platformId === PLATFORM_WINDOWS && WINDOWS_UTF16_ENCODINGS.has(header.encodingId));\n\nconst isMacRomanName = (header: NameHeader): boolean =>\n header.platformId === PLATFORM_MACINTOSH &&\n header.encodingId === MAC_ROMAN_ENCODING &&\n header.languageId === MAC_ROMAN_LANGUAGE;\n\nconst decodeName = (bytes: Buffer, header: NameHeader): string | undefined => {\n if (isUtf16Name(header)) {\n return decodeUtf16(bytes);\n }\n\n return isMacRomanName(header) ? decodeMacRoman(bytes) : undefined;\n};\n\nconst nameRecordHeader = (table: Buffer, offset: number): NameHeader | undefined => {\n const record = sliceRange(table, offset, NAME_RECORD_SIZE);\n\n if (record === undefined) {\n return undefined;\n }\n\n return {\n encodingId: record.readUInt16BE(2),\n languageId: record.readUInt16BE(4),\n length: record.readUInt16BE(8),\n nameId: record.readUInt16BE(6),\n platformId: record.readUInt16BE(0),\n stringOffset: record.readUInt16BE(10),\n };\n};\n\nconst nameRecordAt = (table: Buffer, offset: number, storage: number): NameRecord | undefined => {\n const header = nameRecordHeader(table, offset);\n\n if (header === undefined) {\n return undefined;\n }\n\n const bytes = sliceRange(table, storage + header.stringOffset, header.length);\n const decoded = bytes === undefined ? undefined : decodeName(bytes, header);\n const value = decoded?.replaceAll(CONTROL_PATTERN, \"\").trim();\n\n return value === undefined || value.length === 0 ? undefined : { ...header, value };\n};\n\nconst nameRecords = (table: Buffer): NameRecord[] => {\n const format = readUint16(table, 0);\n const count = readUint16(table, NAME_COUNT_OFFSET);\n const storage = readUint16(table, NAME_STORAGE_OFFSET);\n const records: NameRecord[] = [];\n\n if (format === undefined || count === undefined || storage === undefined || !NAME_FORMATS.has(format)) {\n return records;\n }\n\n for (let index = 0; index < count; index += 1) {\n const record = nameRecordAt(table, NAME_HEADER_SIZE + index * NAME_RECORD_SIZE, storage);\n\n if (record !== undefined) {\n records.push(record);\n }\n }\n\n return records;\n};\n\nconst windowsLanguageScore = (languageId: number): number => {\n if (languageId === LANGUAGE_ENGLISH_US) {\n return SCORE_WINDOWS_ENGLISH_US;\n }\n\n return (languageId & LANGUAGE_PRIMARY_MASK) === LANGUAGE_ENGLISH ? SCORE_WINDOWS_ENGLISH : SCORE_WINDOWS_OTHER;\n};\n\nconst nameScore = (record: NameRecord): number => {\n if (record.platformId === PLATFORM_WINDOWS && WINDOWS_UTF16_ENCODINGS.has(record.encodingId)) {\n return windowsLanguageScore(record.languageId);\n }\n\n if (record.platformId === PLATFORM_UNICODE) {\n return SCORE_UNICODE;\n }\n\n return isMacRomanName(record) ? SCORE_MAC_ROMAN : SCORE_NONE;\n};\n\nconst scoredNames = (records: NameRecord[], nameId: number): ScoredName[] =>\n records\n .filter((record) => record.nameId === nameId)\n .map((record) => ({ score: nameScore(record), value: record.value }))\n .filter((entry) => entry.score > SCORE_NONE);\n\nconst bestName = (records: NameRecord[], nameId: number): string | undefined =>\n scoredNames(records, nameId).toSorted((left, right) => right.score - left.score)[0]?.value;\n\nconst familyName = (table: Buffer): string | undefined => {\n const records = nameRecords(table);\n\n return FAMILY_NAME_IDS.map((nameId) => bestName(records, nameId)).find((value) => value !== undefined);\n};\n\nconst sfntTableAt = (data: Buffer, record: number): Buffer | undefined => {\n const tag = readTag(data, record);\n const offset = readUint32(data, record + SFNT_RECORD_OFFSET_FIELD);\n const length = readUint32(data, record + SFNT_RECORD_LENGTH_FIELD);\n\n if (tag !== TAG_NAME || offset === undefined || length === undefined) {\n return undefined;\n }\n\n return sliceRange(data, offset, length);\n};\n\nconst sfntNameTable = (data: Buffer, start: number): Buffer | undefined => {\n const version = readUint32(data, start);\n const count = readUint16(data, start + SFNT_TABLE_COUNT_OFFSET);\n\n if (version === undefined || count === undefined || !SFNT_VERSIONS.has(version)) {\n return undefined;\n }\n\n for (let index = 0; index < count; index += 1) {\n const table = sfntTableAt(data, start + SFNT_DIRECTORY_OFFSET + index * SFNT_RECORD_SIZE);\n\n if (table !== undefined) {\n return table;\n }\n }\n\n return undefined;\n};\n\nconst sfntNameTables = (data: Buffer): Buffer[] => {\n const table = sfntNameTable(data, 0);\n\n return table === undefined ? [] : [table];\n};\n\nconst collectionNameTables = (data: Buffer): Buffer[] => {\n const count = readUint32(data, COLLECTION_COUNT_OFFSET) ?? 0;\n const limit = Math.floor((data.length - COLLECTION_DIRECTORY_OFFSET) / COLLECTION_ENTRY_SIZE);\n const tables: Buffer[] = [];\n\n for (let index = 0; index < Math.min(count, limit); index += 1) {\n const start = readUint32(data, COLLECTION_DIRECTORY_OFFSET + index * COLLECTION_ENTRY_SIZE);\n const table = start === undefined ? undefined : sfntNameTable(data, start);\n\n if (table !== undefined) {\n tables.push(table);\n }\n }\n\n return tables;\n};\n\nconst woffTableData = (compressed: Buffer, compressedLength: number, originalLength: number): Buffer | undefined =>\n compressedLength === originalLength ? compressed : inflateTable(compressed, originalLength);\n\nconst woffTableAt = (data: Buffer, record: number): Buffer | undefined => {\n const tag = readTag(data, record);\n const offset = readUint32(data, record + WOFF_RECORD_OFFSET_FIELD);\n const compressedLength = readUint32(data, record + WOFF_RECORD_COMPRESSED_FIELD);\n const originalLength = readUint32(data, record + WOFF_RECORD_ORIGINAL_FIELD);\n\n if (tag !== TAG_NAME || offset === undefined || compressedLength === undefined || originalLength === undefined) {\n return undefined;\n }\n\n const compressed = sliceRange(data, offset, compressedLength);\n\n return compressed === undefined ? undefined : woffTableData(compressed, compressedLength, originalLength);\n};\n\nconst woffNameTables = (data: Buffer): Buffer[] => {\n const count = readUint16(data, WOFF_TABLE_COUNT_OFFSET) ?? 0;\n const tables: Buffer[] = [];\n\n for (let index = 0; index < count; index += 1) {\n const table = woffTableAt(data, WOFF_DIRECTORY_OFFSET + index * WOFF_RECORD_SIZE);\n\n if (table !== undefined) {\n tables.push(table);\n }\n }\n\n return tables;\n};\n\nconst base128Length = (data: Buffer, start: number): number | undefined => {\n const window = data.subarray(start, start + BASE128_MAX_BYTES);\n const terminator = window.findIndex((byte) => (byte & BASE128_CONTINUATION) === 0);\n\n return terminator === -1 ? undefined : terminator + 1;\n};\n\nconst base128Value = (data: Buffer, start: number, length: number): number => {\n const bytes = data.subarray(start, start + length);\n let value = 0;\n\n for (const byte of bytes) {\n value = value * BASE128_RADIX + (byte & BASE128_MASK);\n }\n\n return value;\n};\n\nconst readBase128 = (data: Buffer, start: number): Base128 | undefined => {\n const length = base128Length(data, start);\n\n if (length === undefined || data[start] === BASE128_CONTINUATION) {\n return undefined;\n }\n\n const value = base128Value(data, start, length);\n\n return value > UINT32_MAX ? undefined : { offset: start + length, value };\n};\n\nconst readExtended255 = (data: Buffer, start: number, code: number): Base128 | undefined => {\n const extra = EXTENDED_CODES.get(code);\n\n if (extra === undefined) {\n return { offset: start + 1, value: code };\n }\n\n const byte = data[start + 1];\n\n return byte === undefined ? undefined : { offset: start + 2, value: byte + extra };\n};\n\nconst read255Uint16 = (data: Buffer, start: number): Base128 | undefined => {\n const code = data[start];\n\n if (code === undefined) {\n return undefined;\n }\n\n if (code !== WORD_CODE) {\n return readExtended255(data, start, code);\n }\n\n const value = readUint16(data, start + 1);\n\n return value === undefined ? undefined : { offset: start + 3, value };\n};\n\nconst woff2Tag = (data: Buffer, start: number, flags: number): string | undefined =>\n (flags & WOFF2_TAG_MASK) === WOFF2_TAG_ESCAPE\n ? readTag(data, start + 1)\n : WOFF2_KNOWN_TAGS[flags & WOFF2_TAG_MASK];\n\nconst woff2TagEnd = (start: number, flags: number): number =>\n (flags & WOFF2_TAG_MASK) === WOFF2_TAG_ESCAPE ? start + 1 + TAG_SIZE : start + 1;\n\nconst isWoff2Transformed = (tag: string, flags: number): boolean =>\n tag === TAG_GLYF || tag === TAG_LOCA\n ? (flags >> WOFF2_TRANSFORM_SHIFT) === 0\n : (flags >> WOFF2_TRANSFORM_SHIFT) !== 0;\n\nconst woff2TransformedEntry = (data: Buffer, tag: string, original: Base128): Woff2Entry | undefined => {\n const transformed = readBase128(data, original.offset);\n\n return transformed === undefined ? undefined : { length: transformed.value, next: transformed.offset, tag };\n};\n\nconst woff2Entry = (data: Buffer, start: number): Woff2Entry | undefined => {\n const flags = data[start];\n\n if (flags === undefined) {\n return undefined;\n }\n\n const tag = woff2Tag(data, start, flags);\n const original = readBase128(data, woff2TagEnd(start, flags));\n\n if (tag === undefined || original === undefined) {\n return undefined;\n }\n\n return isWoff2Transformed(tag, flags)\n ? woff2TransformedEntry(data, tag, original)\n : { length: original.value, next: original.offset, tag };\n};\n\nconst woff2Directory = (data: Buffer, count: number): Woff2Directory | undefined => {\n const tables: Woff2Table[] = [];\n let cursor = WOFF2_HEADER_SIZE;\n let offset = 0;\n\n for (let index = 0; index < count; index += 1) {\n const entry = woff2Entry(data, cursor);\n\n if (entry === undefined) {\n return undefined;\n }\n\n tables.push({ length: entry.length, offset, tag: entry.tag });\n cursor = entry.next;\n offset += entry.length;\n }\n\n return { end: cursor, tables };\n};\n\nconst skipSequence = (data: Buffer, start: number, count: number, step: Woff2Step): number | undefined => {\n let cursor = start;\n\n for (let index = 0; index < count; index += 1) {\n const next = step(data, cursor);\n\n if (next === undefined) {\n return undefined;\n }\n\n cursor = next;\n }\n\n return cursor;\n};\n\nconst skipIndex = (data: Buffer, offset: number): number | undefined => read255Uint16(data, offset)?.offset;\n\nconst skipCollectionFont = (data: Buffer, start: number): number | undefined => {\n const tables = read255Uint16(data, start);\n\n if (tables === undefined) {\n return undefined;\n }\n\n return skipSequence(data, tables.offset + WOFF2_COLLECTION_FLAVOR_SIZE, tables.value, skipIndex);\n};\n\nconst woff2CollectionEnd = (data: Buffer, start: number): number | undefined => {\n const fonts = read255Uint16(data, start + WOFF2_COLLECTION_FONTS_OFFSET);\n\n if (fonts === undefined) {\n return undefined;\n }\n\n return skipSequence(data, fonts.offset, fonts.value, skipCollectionFont);\n};\n\nconst woff2DataStart = (data: Buffer, end: number): number | undefined => {\n const flavor = readUint32(data, WOFF2_FLAVOR_OFFSET);\n\n return flavor === SFNT_VERSION_COLLECTION ? woff2CollectionEnd(data, end) : end;\n};\n\nconst woff2Compressed = (data: Buffer, start: number): Buffer => {\n const size = readUint32(data, WOFF2_COMPRESSED_SIZE_OFFSET);\n const bounded = size === undefined ? undefined : sliceRange(data, start, size);\n\n return bounded ?? data.subarray(start);\n};\n\nconst woff2NameSlices = (font: Buffer, tables: Woff2Table[]): Buffer[] =>\n tables\n .filter((table) => table.tag === TAG_NAME)\n .map((table) => sliceRange(font, table.offset, table.length))\n .filter((table) => table !== undefined);\n\nconst woff2Tables = (data: Buffer, directory: Woff2Directory): Buffer[] => {\n const start = woff2DataStart(data, directory.end);\n const font = start === undefined ? undefined : brotliFont(woff2Compressed(data, start));\n\n return font === undefined ? [] : woff2NameSlices(font, directory.tables);\n};\n\nconst woff2NameTables = (data: Buffer): Buffer[] => {\n const count = readUint16(data, WOFF2_TABLE_COUNT_OFFSET);\n const directory = count === undefined ? undefined : woff2Directory(data, count);\n\n return directory === undefined ? [] : woff2Tables(data, directory);\n};\n\nconst nameTables = (data: Buffer): Buffer[] => {\n const signature = readTag(data, 0);\n\n if (signature === SIGNATURE_WOFF) {\n return woffNameTables(data);\n }\n\n if (signature === SIGNATURE_WOFF2) {\n return woff2NameTables(data);\n }\n\n return signature === TAG_TTCF ? collectionNameTables(data) : sfntNameTables(data);\n};\n\nconst familyNames = (font: Buffer): string[] => {\n const names = nameTables(font)\n .map((table) => familyName(table))\n .filter((name) => name !== undefined);\n\n return [...new Set(names)];\n};\n\nconst fontFamilyNames = (font: Buffer): string[] => {\n try {\n return familyNames(font);\n } catch {\n return [];\n }\n};\n\nexport { fontFamilyNames };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"font-worker-env.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/font-worker-env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAK5C,iBAAS,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAoBtD;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createConfigLoader } from "@gtkx/config/internal";
|
|
2
|
+
import { stageProjectFonts } from "../internal/font-staging.js";
|
|
3
|
+
import { prependXdgDataDir } from "../internal/xdg-data-dirs.js";
|
|
4
|
+
function gtkxFontWorkerEnv(configFile) {
|
|
5
|
+
const loadConfig = createConfigLoader({ configFile });
|
|
6
|
+
return {
|
|
7
|
+
name: "gtkx:font-worker-env",
|
|
8
|
+
enforce: "pre",
|
|
9
|
+
async config(config) {
|
|
10
|
+
const loaded = await loadConfig.load(config.root ?? process.cwd());
|
|
11
|
+
const shareDir = stageProjectFonts(loaded.root);
|
|
12
|
+
if (shareDir === null) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
test: { env: { XDG_DATA_DIRS: prependXdgDataDir(shareDir, process.env.XDG_DATA_DIRS) } },
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export { gtkxFontWorkerEnv };
|
|
22
|
+
//# sourceMappingURL=font-worker-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"font-worker-env.js","sourceRoot":"","sources":["../../src/vite-plugins/font-worker-env.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,SAAS,iBAAiB,CAAC,UAAmB;IAC1C,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAEtD,OAAO;QACH,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,KAAK;QAEd,KAAK,CAAC,MAAM,CAAC,MAAkB;YAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACnE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEhD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO;YACX,CAAC;YAED,OAAO;gBACH,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,EAAE;aAC3F,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import type { UserConfig } from \"vite\";\nimport type { Plugin } from \"vitest/config\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { stageProjectFonts } from \"../internal/font-staging.js\";\nimport { prependXdgDataDir } from \"../internal/xdg-data-dirs.js\";\n\nfunction gtkxFontWorkerEnv(configFile?: string): Plugin {\n const loadConfig = createConfigLoader({ configFile });\n\n return {\n name: \"gtkx:font-worker-env\",\n enforce: \"pre\",\n\n async config(config: UserConfig) {\n const loaded = await loadConfig.load(config.root ?? process.cwd());\n const shareDir = stageProjectFonts(loaded.root);\n\n if (shareDir === null) {\n return;\n }\n\n return {\n test: { env: { XDG_DATA_DIRS: prependXdgDataDir(shareDir, process.env.XDG_DATA_DIRS) } },\n };\n },\n };\n}\n\nexport { gtkxFontWorkerEnv };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"font.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/font.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,MAAM,CAAC;AAiH3C,iBAAS,QAAQ,IAAI,MAAM,CA+B1B;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { parseSync } from "vite";
|
|
3
|
+
import { prependBanner } from "../internal/banner.js";
|
|
4
|
+
import { fontFileName, FONTS_DIR } from "../internal/font-path.js";
|
|
5
|
+
import { sourceLanguage } from "../internal/source-imports.js";
|
|
6
|
+
import { xdgDataDirsBanner } from "../internal/xdg-banner.js";
|
|
7
|
+
import { parseFontSpecifier } from "./asset-specifier.js";
|
|
8
|
+
import { fontFamilyNames } from "./font-name.js";
|
|
9
|
+
import { stripQuery } from "./strip-query.js";
|
|
10
|
+
import { createVirtualNamespace } from "./virtual-module.js";
|
|
11
|
+
const VIRTUAL_PREFIX = "\0gtkx-font:";
|
|
12
|
+
const { isVirtual, fromVirtualId, resolveToVirtual } = createVirtualNamespace(VIRTUAL_PREFIX);
|
|
13
|
+
const unreadableFontError = (filePath) => `Cannot read a font family name from ${filePath}; ?font expects a TrueType, OpenType, ` +
|
|
14
|
+
"TrueType Collection, WOFF, or WOFF2 font";
|
|
15
|
+
const resolveFontId = async (ctx, request) => {
|
|
16
|
+
if (parseFontSpecifier(request.source) === null) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const virtualId = await resolveToVirtual(ctx, request);
|
|
20
|
+
return virtualId === undefined ? undefined : { id: virtualId, moduleSideEffects: true };
|
|
21
|
+
};
|
|
22
|
+
const emitFont = (ctx, state, filePath, content) => {
|
|
23
|
+
const fileName = `${FONTS_DIR}/${fontFileName(filePath, content)}`;
|
|
24
|
+
if (state.emitted.has(fileName)) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
state.emitted.add(fileName);
|
|
28
|
+
ctx.emitFile({ type: "asset", fileName, source: content });
|
|
29
|
+
};
|
|
30
|
+
const loadFontModule = (ctx, state, id) => {
|
|
31
|
+
if (!isVirtual(id)) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const filePath = stripQuery(fromVirtualId(id));
|
|
35
|
+
const content = readFileSync(filePath);
|
|
36
|
+
const [family] = fontFamilyNames(content);
|
|
37
|
+
if (family === undefined) {
|
|
38
|
+
return ctx.error(unreadableFontError(filePath));
|
|
39
|
+
}
|
|
40
|
+
ctx.addWatchFile(filePath);
|
|
41
|
+
if (state.isBuild) {
|
|
42
|
+
emitFont(ctx, state, filePath, content);
|
|
43
|
+
}
|
|
44
|
+
return `export default ${JSON.stringify(family)};`;
|
|
45
|
+
};
|
|
46
|
+
const hasSideEffectFontImport = (code, id) => {
|
|
47
|
+
const lang = sourceLanguage(stripQuery(id));
|
|
48
|
+
if (lang === undefined || !code.includes("?font")) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const parsed = parseSync(id, code, { lang });
|
|
52
|
+
if (parsed.errors.length > 0) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
return parsed.module.staticImports.some((statement) => statement.entries.length === 0 && parseFontSpecifier(statement.moduleRequest.value) !== null);
|
|
56
|
+
};
|
|
57
|
+
const retainSideEffectFontImport = (code, id) => hasSideEffectFontImport(code, id)
|
|
58
|
+
? { code, moduleSideEffects: true }
|
|
59
|
+
: null;
|
|
60
|
+
const fontBanner = (state) => (chunk) => state.emitted.size === 0 ? "" : xdgDataDirsBanner(chunk);
|
|
61
|
+
function gtkxFont() {
|
|
62
|
+
const state = { isBuild: false, emitted: new Set() };
|
|
63
|
+
return {
|
|
64
|
+
name: "gtkx:font",
|
|
65
|
+
enforce: "pre",
|
|
66
|
+
configResolved(config) {
|
|
67
|
+
state.isBuild = config.command === "build";
|
|
68
|
+
},
|
|
69
|
+
resolveId(source, importer, options) {
|
|
70
|
+
return resolveFontId(this, { source, importer, options });
|
|
71
|
+
},
|
|
72
|
+
load(id) {
|
|
73
|
+
return loadFontModule(this, state, id);
|
|
74
|
+
},
|
|
75
|
+
transform(code, id) {
|
|
76
|
+
return retainSideEffectFontImport(code, id);
|
|
77
|
+
},
|
|
78
|
+
outputOptions(options) {
|
|
79
|
+
if (!state.isBuild) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
return prependBanner(options, fontBanner(state));
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export { gtkxFont };
|
|
87
|
+
//# sourceMappingURL=font.js.map
|