@volter/twin-googlefonts 0.0.0-stage → 1.0.2

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.
Files changed (140) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +15 -2
  3. package/api/spec/SOURCE.md +17 -0
  4. package/api/spec/discovery.json +306 -0
  5. package/api/spec/openapi.json +647 -0
  6. package/api/spec/sources.json +16 -0
  7. package/api/src/fetch.ts +16 -0
  8. package/api/src/generated/surface.gen.json +1 -0
  9. package/api/src/generated/ui.gen.json +1 -0
  10. package/api/src/index.ts +3 -0
  11. package/api/src/manifest.ts +31 -0
  12. package/api/src/semantics/doors.ts +135 -0
  13. package/api/src/semantics/index.ts +8 -0
  14. package/api/src/semantics/shared.ts +1 -0
  15. package/api/src/semantics/states.ts +6 -0
  16. package/api/src/semantics/webfonts.ts +32 -0
  17. package/assets/spec/SOURCE.md +11 -0
  18. package/assets/spec/openapi.json +162 -0
  19. package/assets/spec/sources.json +1 -0
  20. package/assets/src/fetch.ts +14 -0
  21. package/assets/src/generated/surface.gen.json +1 -0
  22. package/assets/src/generated/ui.gen.json +1 -0
  23. package/assets/src/index.ts +3 -0
  24. package/assets/src/manifest.ts +19 -0
  25. package/assets/src/semantics/index.ts +10 -0
  26. package/assets/src/semantics/l.ts +4 -0
  27. package/assets/src/semantics/s.ts +4 -0
  28. package/assets/src/semantics/shared.ts +13 -0
  29. package/css/spec/SOURCE.md +17 -0
  30. package/css/spec/openapi.json +142 -0
  31. package/css/spec/sources.json +1 -0
  32. package/css/src/fetch.ts +14 -0
  33. package/css/src/generated/surface.gen.json +1 -0
  34. package/css/src/generated/ui.gen.json +1 -0
  35. package/css/src/index.ts +3 -0
  36. package/css/src/manifest.ts +19 -0
  37. package/css/src/semantics/css.ts +19 -0
  38. package/css/src/semantics/css2.ts +20 -0
  39. package/css/src/semantics/index.ts +10 -0
  40. package/css/src/semantics/shared.ts +1 -0
  41. package/dist/api/spec/SOURCE.md +17 -0
  42. package/dist/api/spec/discovery.json +306 -0
  43. package/dist/api/spec/openapi.json +647 -0
  44. package/dist/api/spec/sources.json +16 -0
  45. package/dist/api/src/fetch.d.ts +2 -0
  46. package/dist/api/src/fetch.js +15 -0
  47. package/dist/api/src/generated/surface.gen.json +1 -0
  48. package/dist/api/src/generated/ui.gen.json +1 -0
  49. package/dist/api/src/index.d.ts +2 -0
  50. package/dist/api/src/index.js +3 -0
  51. package/dist/api/src/manifest.d.ts +2 -0
  52. package/dist/api/src/manifest.js +29 -0
  53. package/dist/api/src/semantics/doors.d.ts +3 -0
  54. package/dist/api/src/semantics/doors.js +142 -0
  55. package/dist/api/src/semantics/index.d.ts +2 -0
  56. package/dist/api/src/semantics/index.js +4 -0
  57. package/dist/api/src/semantics/shared.d.ts +1 -0
  58. package/dist/api/src/semantics/shared.js +1 -0
  59. package/dist/api/src/semantics/states.d.ts +8 -0
  60. package/dist/api/src/semantics/states.js +6 -0
  61. package/dist/api/src/semantics/webfonts.d.ts +2 -0
  62. package/dist/api/src/semantics/webfonts.js +34 -0
  63. package/dist/assets/spec/SOURCE.md +11 -0
  64. package/dist/assets/spec/openapi.json +162 -0
  65. package/dist/assets/spec/sources.json +1 -0
  66. package/dist/assets/src/fetch.d.ts +2 -0
  67. package/dist/assets/src/fetch.js +13 -0
  68. package/dist/assets/src/generated/surface.gen.json +1 -0
  69. package/dist/assets/src/generated/ui.gen.json +1 -0
  70. package/dist/assets/src/index.d.ts +2 -0
  71. package/dist/assets/src/index.js +3 -0
  72. package/dist/assets/src/manifest.d.ts +2 -0
  73. package/dist/assets/src/manifest.js +17 -0
  74. package/dist/assets/src/semantics/index.d.ts +2 -0
  75. package/dist/assets/src/semantics/index.js +6 -0
  76. package/dist/assets/src/semantics/l.d.ts +2 -0
  77. package/dist/assets/src/semantics/l.js +3 -0
  78. package/dist/assets/src/semantics/s.d.ts +2 -0
  79. package/dist/assets/src/semantics/s.js +3 -0
  80. package/dist/assets/src/semantics/shared.d.ts +2 -0
  81. package/dist/assets/src/semantics/shared.js +13 -0
  82. package/dist/css/spec/SOURCE.md +17 -0
  83. package/dist/css/spec/openapi.json +142 -0
  84. package/dist/css/spec/sources.json +1 -0
  85. package/dist/css/src/fetch.d.ts +2 -0
  86. package/dist/css/src/fetch.js +13 -0
  87. package/dist/css/src/generated/surface.gen.json +1 -0
  88. package/dist/css/src/generated/ui.gen.json +1 -0
  89. package/dist/css/src/index.d.ts +2 -0
  90. package/dist/css/src/index.js +3 -0
  91. package/dist/css/src/manifest.d.ts +2 -0
  92. package/dist/css/src/manifest.js +16 -0
  93. package/dist/css/src/semantics/css.d.ts +2 -0
  94. package/dist/css/src/semantics/css.js +19 -0
  95. package/dist/css/src/semantics/css2.d.ts +2 -0
  96. package/dist/css/src/semantics/css2.js +21 -0
  97. package/dist/css/src/semantics/index.d.ts +2 -0
  98. package/dist/css/src/semantics/index.js +6 -0
  99. package/dist/css/src/semantics/shared.d.ts +1 -0
  100. package/dist/css/src/semantics/shared.js +1 -0
  101. package/dist/generated/pack-facts.json +68 -0
  102. package/dist/journeys/customer-life.json +544 -0
  103. package/dist/journeys/decisions.json +64 -0
  104. package/dist/journeys/demand.json +101 -0
  105. package/dist/journeys/first-use.json +20 -0
  106. package/dist/src/cli.d.ts +2 -0
  107. package/dist/src/cli.js +22 -0
  108. package/dist/src/fetch.d.ts +2 -0
  109. package/dist/src/fetch.js +10 -0
  110. package/dist/src/index.d.ts +5 -0
  111. package/dist/src/index.js +15 -0
  112. package/dist/src/manifest.d.ts +2 -0
  113. package/dist/src/manifest.js +27 -0
  114. package/dist/src/semantics/seed.d.ts +2 -0
  115. package/dist/src/semantics/seed.js +181 -0
  116. package/dist/src/semantics/shared.d.ts +9 -0
  117. package/dist/src/semantics/shared.js +23 -0
  118. package/dist/src/server.d.ts +7 -0
  119. package/dist/src/server.js +7 -0
  120. package/generated/pack-facts.json +68 -0
  121. package/journeys/customer-life.json +544 -0
  122. package/journeys/decisions.json +64 -0
  123. package/journeys/demand.json +101 -0
  124. package/journeys/first-use.json +20 -0
  125. package/package.json +57 -4
  126. package/src/cli.ts +22 -0
  127. package/src/fetch.ts +11 -0
  128. package/src/index.ts +17 -0
  129. package/src/manifest.ts +29 -0
  130. package/src/semantics/seed.ts +183 -0
  131. package/src/semantics/shared.ts +25 -0
  132. package/src/server.ts +8 -0
  133. package/vendor/Inter-OFL.txt +93 -0
  134. package/vendor/OFL.txt +94 -0
  135. package/vendor/SOURCE.md +40 -0
  136. package/vendor/antic.json +93 -0
  137. package/vendor/inputs.json +460 -0
  138. package/vendor/inter-variable.json +52 -0
  139. package/vendor/inter.json +44 -0
  140. package/vendor/noto-sans-sc-text.json +24 -0
@@ -0,0 +1,9 @@
1
+ import type { HandlerContext } from '@volter/world-core';
2
+ export declare const FONT = "webfont", CATALOG = "_font_catalog", CSS = "_stylesheet", FILE = "_font_file", KEY = "_api_key";
3
+ export declare const object: (value: unknown) => Record<string, unknown>;
4
+ export declare const assetKey: (value: string) => string;
5
+ export declare const cssKey: (ctx: HandlerContext, family: string, subset: string, userAgent: string) => string;
6
+ export declare const css2Query: (query: URLSearchParams) => Array<[string, string]> | undefined;
7
+ export declare const css2Key: (ctx: HandlerContext, pairs: Array<[string, string]>, userAgent: string) => string;
8
+ export declare const googleError: (status: number, message: string, kind?: string) => Response;
9
+ export declare const htmlError: (status: number, message: string) => Response;
@@ -0,0 +1,23 @@
1
+ export const FONT = 'webfont', CATALOG = '_font_catalog', CSS = '_stylesheet', FILE = '_font_file', KEY = '_api_key';
2
+ export const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : {};
3
+ export const assetKey = (value) => {
4
+ const url = new URL(value);
5
+ url.hash = '';
6
+ if (url.hostname !== 'fonts.gstatic.com' || url.username || url.password || !['http:', 'https:'].includes(url.protocol))
7
+ throw new Error('Invalid font URL');
8
+ url.searchParams.sort();
9
+ return url.pathname + url.search;
10
+ };
11
+ export const cssKey = (ctx, family, subset, userAgent) => ctx.crypto.digest('sha256', JSON.stringify([family, subset, userAgent]));
12
+ // A CSS2 request is its ordered query pairs; family may repeat, text and display may not.
13
+ export const css2Query = (query) => {
14
+ const pairs = [...query.entries()];
15
+ const once = (name) => pairs.filter(([k]) => k === name).length <= 1;
16
+ if (!pairs.some(([k, v]) => k === 'family' && v) || pairs.some(([k]) => !['family', 'text', 'display'].includes(k)) ||
17
+ !once('text') || !once('display'))
18
+ return undefined;
19
+ return pairs;
20
+ };
21
+ export const css2Key = (ctx, pairs, userAgent) => ctx.crypto.digest('sha256', JSON.stringify(['css2', pairs, userAgent]));
22
+ export const googleError = (status, message, kind = status === 403 ? 'PERMISSION_DENIED' : 'INVALID_ARGUMENT') => Response.json({ error: { code: status, message, status: kind } }, { status });
23
+ export const htmlError = (status, message) => new Response('<!doctype html><title>' + status + '</title><p>' + message.replace(/[<>&]/g, c => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;' }[c])) + '</p>', { status, headers: { 'content-type': 'text/html; charset=UTF-8' } });
@@ -0,0 +1,7 @@
1
+ import { type PackFetchOptions } from '@volter/world-core';
2
+ export declare function createGooglefontsTwinServer(options?: PackFetchOptions & {
3
+ port?: number;
4
+ }): Promise<{
5
+ port: number;
6
+ stop: () => void;
7
+ }>;
@@ -0,0 +1,7 @@
1
+ // FETCH-FIRST (runtime contract R12b): a fixed file, the kernel's serve seam around the pack's fetch (./fetch.ts).
2
+ import { serveHttp } from '@volter/world-core';
3
+ import { createGooglefontsFetch } from "./fetch.js";
4
+ export async function createGooglefontsTwinServer(options = {}) {
5
+ const server = await serveHttp({ port: options.port ?? 0, idleTimeout: 60, fetch: createGooglefontsFetch(options) });
6
+ return { port: server.port ?? options.port ?? 0, stop: () => server.stop(true) };
7
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "//": "GENERATED by twin-standard facts from the pack descriptor; no prior-artifact entries are retained.",
3
+ "packs": {
4
+ "googlefonts": {
5
+ "adoption": {
6
+ "sdks": [],
7
+ "envStems": [
8
+ "GOOGLE_FONTS"
9
+ ],
10
+ "modules": [
11
+ "next/font/google"
12
+ ]
13
+ },
14
+ "hosts": [
15
+ {
16
+ "host": "www.googleapis.com",
17
+ "pathPattern": "^/webfonts/v1/webfonts$"
18
+ },
19
+ {
20
+ "host": "webfonts.googleapis.com",
21
+ "pathPattern": "^/v1/webfonts$"
22
+ },
23
+ {
24
+ "host": "fonts.googleapis.com",
25
+ "pathPattern": "^/css2?$"
26
+ },
27
+ {
28
+ "host": "fonts.gstatic.com",
29
+ "pathPattern": "^/(s/|l/font$)"
30
+ }
31
+ ],
32
+ "archetype": "crud",
33
+ "protocol": {
34
+ "declared": "3",
35
+ "major": 3,
36
+ "standing": "current"
37
+ },
38
+ "transport": "rest",
39
+ "resources": [
40
+ "webfont",
41
+ "_api_key",
42
+ "_font_catalog",
43
+ "_stylesheet",
44
+ "_font_file"
45
+ ],
46
+ "endpointEnvNone": "Pinned helper hardcodes the vendor API and CSS hosts, then downloads their returned gstatic URLs. Scoped host routing preserves these URLs.",
47
+ "credentialDoor": {
48
+ "path": "/_twin/app-credentials",
49
+ "body": {},
50
+ "account": {
51
+ "field": "account",
52
+ "tenancy": "Google Cloud project",
53
+ "source": "https://developers.google.com/fonts/docs/developer_api"
54
+ },
55
+ "deployment": {
56
+ "field": "deployment",
57
+ "object": "Project API key",
58
+ "source": "https://docs.cloud.google.com/docs/authentication/api-keys"
59
+ },
60
+ "fill": {
61
+ "GOOGLE_FONTS_API_KEY": "api_key"
62
+ }
63
+ },
64
+ "serveExport": "createGooglefontsTwinServer"
65
+ }
66
+ },
67
+ "undeclared": []
68
+ }