@volter/twin-googlefonts 1.0.1 → 1.0.3
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/api/spec/sources.json +11 -1
- package/api/src/semantics/doors.ts +10 -5
- package/api/src/semantics/index.ts +1 -1
- package/assets/src/semantics/index.ts +1 -1
- package/css/spec/SOURCE.md +10 -2
- package/css/src/semantics/css.ts +5 -3
- package/css/src/semantics/css2.ts +9 -8
- package/css/src/semantics/index.ts +1 -1
- package/dist/api/spec/sources.json +11 -1
- package/dist/api/src/semantics/doors.js +10 -5
- package/dist/css/spec/SOURCE.md +10 -2
- package/dist/css/src/semantics/css.js +5 -3
- package/dist/css/src/semantics/css2.js +9 -8
- package/dist/generated/pack-facts.json +68 -0
- package/dist/journeys/customer-life.json +81 -0
- package/dist/journeys/decisions.json +15 -5
- package/dist/journeys/demand.json +56 -0
- package/dist/src/cli.js +11 -10
- package/dist/src/manifest.js +5 -3
- package/dist/src/semantics/seed.js +135 -0
- package/dist/src/semantics/shared.d.ts +1 -0
- package/dist/src/semantics/shared.js +50 -2
- package/generated/pack-facts.json +5 -2
- package/journeys/customer-life.json +81 -0
- package/journeys/decisions.json +15 -5
- package/journeys/demand.json +56 -0
- package/package.json +30 -14
- package/src/cli.ts +10 -10
- package/src/manifest.ts +5 -3
- package/src/semantics/seed.ts +135 -0
- package/src/semantics/shared.ts +55 -2
- package/{dist/vendor/OFL.txt → vendor/DMMono-OFL.txt} +93 -94
- package/vendor/SOURCE.md +28 -0
- package/vendor/browser-classes.json +529 -0
- package/vendor/inter-dm-mono-chromium.json +108 -0
- package/vendor/inter-variable.json +52 -0
- package/dist/api/src/fetch.ts +0 -16
- package/dist/api/src/index.ts +0 -3
- package/dist/api/src/manifest.ts +0 -31
- package/dist/api/src/semantics/doors.ts +0 -131
- package/dist/api/src/semantics/index.ts +0 -8
- package/dist/api/src/semantics/shared.ts +0 -1
- package/dist/api/src/semantics/states.ts +0 -6
- package/dist/api/src/semantics/webfonts.ts +0 -32
- package/dist/assets/src/fetch.ts +0 -14
- package/dist/assets/src/index.ts +0 -3
- package/dist/assets/src/manifest.ts +0 -19
- package/dist/assets/src/semantics/index.ts +0 -10
- package/dist/assets/src/semantics/l.ts +0 -4
- package/dist/assets/src/semantics/s.ts +0 -4
- package/dist/assets/src/semantics/shared.ts +0 -13
- package/dist/css/src/fetch.ts +0 -14
- package/dist/css/src/index.ts +0 -3
- package/dist/css/src/manifest.ts +0 -19
- package/dist/css/src/semantics/css.ts +0 -19
- package/dist/css/src/semantics/css2.ts +0 -20
- package/dist/css/src/semantics/index.ts +0 -10
- package/dist/css/src/semantics/shared.ts +0 -1
- package/dist/journeys/customer-life.outline.md +0 -24
- package/dist/journeys/customer-life.outline.verdict.json +0 -82
- package/dist/journeys/customer-life.verdict.json +0 -149
- package/dist/vendor/Inter-OFL.txt +0 -93
- package/dist/vendor/SOURCE.md +0 -33
- package/dist/vendor/antic.json +0 -93
- package/dist/vendor/inputs.json +0 -460
- package/dist/vendor/inter.json +0 -44
- package/dist/vendor/noto-sans-sc-text.json +0 -24
- package/journeys/customer-life.outline.md +0 -24
- package/journeys/customer-life.outline.verdict.json +0 -82
- package/journeys/customer-life.verdict.json +0 -149
|
@@ -2,6 +2,7 @@ import type { HandlerContext } from '@volter/world-core';
|
|
|
2
2
|
export declare const FONT = "webfont", CATALOG = "_font_catalog", CSS = "_stylesheet", FILE = "_font_file", KEY = "_api_key";
|
|
3
3
|
export declare const object: (value: unknown) => Record<string, unknown>;
|
|
4
4
|
export declare const assetKey: (value: string) => string;
|
|
5
|
+
export declare const browserClass: (userAgent: string) => string;
|
|
5
6
|
export declare const cssKey: (ctx: HandlerContext, family: string, subset: string, userAgent: string) => string;
|
|
6
7
|
export declare const css2Query: (query: URLSearchParams) => Array<[string, string]> | undefined;
|
|
7
8
|
export declare const css2Key: (ctx: HandlerContext, pairs: Array<[string, string]>, userAgent: string) => string;
|
|
@@ -8,7 +8,55 @@ export const assetKey = (value) => {
|
|
|
8
8
|
url.searchParams.sort();
|
|
9
9
|
return url.pathname + url.search;
|
|
10
10
|
};
|
|
11
|
-
|
|
11
|
+
const major = (userAgent, pattern) => Number(pattern.exec(userAgent)?.[1] ?? Number.NaN);
|
|
12
|
+
export const browserClass = (userAgent) => {
|
|
13
|
+
const ua = userAgent;
|
|
14
|
+
const platform = /\b(?:Android|iPhone|iPad|iPod)\b/.test(ua) ? 'mobile' : /\bMacintosh\b/.test(ua) ? 'mac' : 'desktop';
|
|
15
|
+
// an agent that is no browser (none, node, undici, curl) is answered truetype, as an unknown browser on a desktop is
|
|
16
|
+
if (!ua.startsWith('Mozilla/'))
|
|
17
|
+
return 'truetype';
|
|
18
|
+
const legacy = (engine, version) => `legacy ${engine} ${version} ${platform}`;
|
|
19
|
+
const msie = major(ua, /\bMSIE (\d+)/);
|
|
20
|
+
if (msie <= 8)
|
|
21
|
+
return 'eot';
|
|
22
|
+
if (msie >= 9 || /\bTrident\/7\./.test(ua))
|
|
23
|
+
return 'woff desktop';
|
|
24
|
+
// every browser on iOS is Safari's engine, whatever it calls itself (CriOS, FxiOS)
|
|
25
|
+
const ios = /\bOS (\d+)_(\d+)(?:_\d+)? like Mac OS X\b/.exec(ua);
|
|
26
|
+
if (ios) {
|
|
27
|
+
const [v, minor] = [Number(ios[1]), Number(ios[2])];
|
|
28
|
+
if (v <= 4)
|
|
29
|
+
return 'svg';
|
|
30
|
+
return v >= 11 || (v === 10 && minor >= 3) ? 'woff2+range mobile' : legacy('ios', `${v}_${minor}`);
|
|
31
|
+
}
|
|
32
|
+
const chrome = /\b(?:HeadlessChrome|Chrome|Chromium|CriOS)\/((\d+)[\d.]*)/.exec(ua);
|
|
33
|
+
if (chrome) {
|
|
34
|
+
const v = Number(chrome[2]);
|
|
35
|
+
if (v >= 43)
|
|
36
|
+
return `woff2+range ${platform}`;
|
|
37
|
+
if (platform !== 'desktop')
|
|
38
|
+
return legacy('chrome', chrome[1]);
|
|
39
|
+
return v >= 40 ? 'woff+range desktop' : 'woff desktop';
|
|
40
|
+
}
|
|
41
|
+
const firefox = /\bFirefox\/((\d+)[\d.]*)/.exec(ua);
|
|
42
|
+
if (firefox) {
|
|
43
|
+
const v = Number(firefox[2]);
|
|
44
|
+
// on macOS Google answers Firefox 44 to 59 the mobile faces, and Firefox 60 and later WOFF with unicode-range
|
|
45
|
+
if (platform === 'mac')
|
|
46
|
+
return v >= 60 ? 'woff+range mac' : v >= 44 ? 'woff2+range mobile' : legacy('firefox', firefox[1]);
|
|
47
|
+
if (v >= 44)
|
|
48
|
+
return `woff2+range ${platform}`;
|
|
49
|
+
if (platform !== 'desktop')
|
|
50
|
+
return legacy('firefox', firefox[1]);
|
|
51
|
+
return v >= 39 ? 'woff2 desktop' : 'woff desktop';
|
|
52
|
+
}
|
|
53
|
+
// Safari on macOS names its version; Android's own browser names one too, and is answered truetype
|
|
54
|
+
const safari = /\bVersion\/((\d+)[\d.]*)(?: Mobile)?(?:\/\S+)? Safari\//.exec(ua);
|
|
55
|
+
if (safari && platform === 'mac')
|
|
56
|
+
return Number(safari[2]) >= 10 ? 'woff+range mac' : legacy('safari', safari[1]);
|
|
57
|
+
return platform === 'mobile' ? 'truetype mobile' : 'truetype';
|
|
58
|
+
};
|
|
59
|
+
export const cssKey = (ctx, family, subset, userAgent) => ctx.crypto.digest('sha256', JSON.stringify([family, subset, browserClass(userAgent)]));
|
|
12
60
|
// A CSS2 request is its ordered query pairs; family may repeat, text and display may not.
|
|
13
61
|
export const css2Query = (query) => {
|
|
14
62
|
const pairs = [...query.entries()];
|
|
@@ -18,6 +66,6 @@ export const css2Query = (query) => {
|
|
|
18
66
|
return undefined;
|
|
19
67
|
return pairs;
|
|
20
68
|
};
|
|
21
|
-
export const css2Key = (ctx, pairs, userAgent) => ctx.crypto.digest('sha256', JSON.stringify(['css2', pairs, userAgent]));
|
|
69
|
+
export const css2Key = (ctx, pairs, userAgent) => ctx.crypto.digest('sha256', JSON.stringify(['css2', pairs, browserClass(userAgent)]));
|
|
22
70
|
export const googleError = (status, message, kind = status === 403 ? 'PERMISSION_DENIED' : 'INVALID_ARGUMENT') => Response.json({ error: { code: status, message, status: kind } }, { status });
|
|
23
71
|
export const htmlError = (status, message) => new Response('<!doctype html><title>' + status + '</title><p>' + message.replace(/[<>&]/g, c => ({ '<': '<', '>': '>', '&': '&' }[c])) + '</p>', { status, headers: { 'content-type': 'text/html; charset=UTF-8' } });
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
|
-
"//": "GENERATED by
|
|
2
|
+
"//": "GENERATED by twin-standard facts from the pack descriptor; no prior-artifact entries are retained.",
|
|
3
3
|
"packs": {
|
|
4
4
|
"googlefonts": {
|
|
5
5
|
"adoption": {
|
|
6
6
|
"sdks": [],
|
|
7
7
|
"envStems": [
|
|
8
8
|
"GOOGLE_FONTS"
|
|
9
|
+
],
|
|
10
|
+
"modules": [
|
|
11
|
+
"next/font/google"
|
|
9
12
|
]
|
|
10
13
|
},
|
|
11
14
|
"hosts": [
|
|
@@ -52,7 +55,7 @@
|
|
|
52
55
|
"deployment": {
|
|
53
56
|
"field": "deployment",
|
|
54
57
|
"object": "Project API key",
|
|
55
|
-
"source": "https://cloud.google.com/docs/authentication/api-keys"
|
|
58
|
+
"source": "https://docs.cloud.google.com/docs/authentication/api-keys"
|
|
56
59
|
},
|
|
57
60
|
"fill": {
|
|
58
61
|
"GOOGLE_FONTS_API_KEY": "api_key"
|