From b5f364a6e36f13f6d8e1a1e9667f0f3c20e0ea38 Mon Sep 17 00:00:00 2001 From: Arsh <69170106+lilnasy@users.noreply.github.com> Date: Fri, 15 Nov 2024 20:18:59 +0530 Subject: [PATCH] automatic font loading --- ...K3E20CsoJ9j1DDkjHcQ5ZL8xRaxru9no1P2w.woff2 | Bin 14536 -> 0 bytes astro.config.ts | 13 ++- env.d.ts | 7 +- lib/font-loader.ts | 83 ++++++++++++++++++ precompress.ts => lib/precompress.ts | 0 package.json | 3 +- pages/index.astro | 10 +-- pnpm-lock.yaml | 51 ++++++----- 8 files changed, 128 insertions(+), 39 deletions(-) delete mode 100644 assets/wXK3E20CsoJ9j1DDkjHcQ5ZL8xRaxru9no1P2w.woff2 create mode 100644 lib/font-loader.ts rename precompress.ts => lib/precompress.ts (100%) diff --git a/assets/wXK3E20CsoJ9j1DDkjHcQ5ZL8xRaxru9no1P2w.woff2 b/assets/wXK3E20CsoJ9j1DDkjHcQ5ZL8xRaxru9no1P2w.woff2 deleted file mode 100644 index fbf3830a54486dd1f4501e7f477b7b4e83e39f89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14536 zcmV;(I5)?4Pew8T0RR91065414*&oF0DY(c061&_0RR9100000000000000000000 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 diff --git a/astro.config.ts b/astro.config.ts index 7581470..adee5a9 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -1,20 +1,17 @@ -import { fileURLToPath } from "node:url" import { defineConfig, type ViteUserConfig } from "astro/config" import node from "@withastro/node" import preact from "@preact/preset-vite" import emotion from "astro-emotion" -import precompress from "./precompress.ts" +import precompress from "./lib/precompress.ts" +import fontLoader from "./lib/font-loader.ts" + const vite: ViteUserConfig = { - plugins: [ preact() ], + assetsInclude: "font:*", + plugins: [ preact(), fontLoader() ], ssr: { noExternal: import.meta.env.PROD || undefined }, - resolve: { - alias: { - assets: fileURLToPath(new URL("./assets", import.meta.url)) - } - }, build: { assetsInlineLimit: 0, sourcemap: true, diff --git a/env.d.ts b/env.d.ts index 0e42fad..ef39b17 100644 --- a/env.d.ts +++ b/env.d.ts @@ -1,3 +1,8 @@ /// /// -/// \ No newline at end of file +/// + +declare module 'font:*' { + const href: string + export default href +} diff --git a/lib/font-loader.ts b/lib/font-loader.ts new file mode 100644 index 0000000..5ab6816 --- /dev/null +++ b/lib/font-loader.ts @@ -0,0 +1,83 @@ +import path from "node:path" +import crypto from "node:crypto" +import fs from "node:fs" +import type { Plugin } from "vite" + +export default function (): Plugin { + let root: string + let metadata: Record + function metadataFilePath() { + return path.join(root, "node_modules", ".fonts", "metadata.json") + } + function readMetadata() { + if (metadata) return metadata + const metadataFilePath = path.join(root, "node_modules", ".fonts", "metadata.json") + try { + const metadataText = fs.readFileSync(metadataFilePath, "utf8") + metadata = JSON.parse(metadataText) + } catch { + fs.writeFileSync(metadataFilePath, "{}") + metadata = {} + } + return metadata + } + function writeMetadata() { + fs.writeFileSync(metadataFilePath(), JSON.stringify(metadata, null, 4)) + } + const resolveId: Plugin["resolveId"] = async function (id) { + if (id.startsWith("font:") === false && id.startsWith("/font:") === false) { + return + } + const query = id.startsWith("font:") ? id.slice(5) : id.slice(6) + try { + const metadata = readMetadata() + const filePath = metadata[query] + if (filePath) return filePath + } + catch { + // continue + } + const cssResponse = await fetch(`https://fonts.googleapis.com/css2?${query}`, { + headers: { + "User-Agent": "AppleWebKit/537.36 Chrome/130.0.0.0" + } + }) + const cssText = await cssResponse.text() + const [ fontPath ] = /(?<=url\()https:\/\/fonts.gstatic.com\/(\S)+(?=\))/.exec(cssText)! + const fontResponse = await fetch(fontPath) + const fontBuffer = await fontResponse.arrayBuffer() + const fontBytes = new Uint8Array(fontBuffer) + const hash = crypto.hash("md5", fontBytes) + const filePath = path.join(root, "node_modules", ".fonts", `${hash}.woff2`) + fs.mkdirSync(path.dirname(filePath)) + fs.writeFileSync(filePath, fontBytes) + const metadata = readMetadata() + metadata[query] = filePath + writeMetadata() + return filePath + } + return { + name: "font-loader", + config() { + return { + resolve: { + alias: [{ + find: /font:/, + replacement: "font:", + // url() in css can only be hooked into this way, + // and even then the url must start with a forward + // slash - dunno why, just vite being vite + customResolver: { resolveId } + }] + } + } + }, + configureServer({ config }) { + root = config.root + }, + configResolved(config) { + root = config.root + }, + resolveId + } +} \ No newline at end of file diff --git a/precompress.ts b/lib/precompress.ts similarity index 100% rename from precompress.ts rename to lib/precompress.ts diff --git a/package.json b/package.json index f59ce73..55075e9 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "devDependencies": { "@preact/preset-vite": "^2.9.1", "@withastro/node": "^8.4.0", - "astro": "^4.16.9", + "astro": "^4.16.13", "astro-emotion": "^2.0.0", "canvas-confetti": "^1.9.3", "clsx": "^2.1.1", @@ -18,6 +18,7 @@ "preact": "^10.24.3", "preact-render-to-string": "^6.5.11", "typescript": "^5.6.3", + "vite": "^5.4.10", "ws": "^8.18.0" }, "packageManager": "pnpm@9.12.1", diff --git a/pages/index.astro b/pages/index.astro index dc4b5f3..cc9024a 100644 --- a/pages/index.astro +++ b/pages/index.astro @@ -3,7 +3,7 @@ import favicon from "./_favicon.svg" import { h } from "preact" import { renderToString } from "preact-render-to-string" import { GameUISSR } from "components/GameUI.tsx" -import font from "assets/wXK3E20CsoJ9j1DDkjHcQ5ZL8xRaxru9no1P2w.woff2" +// import font from "font:family=Sue Ellen Francisco" import "../tokens.css" --- @@ -14,14 +14,14 @@ import "../tokens.css" Tic Tac Toe - + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fa565bd..9244e8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,13 +30,13 @@ importers: devDependencies: '@preact/preset-vite': specifier: ^2.9.1 - version: 2.9.1(patch_hash=wx4a2puiselz4n5hatk6npe6l4)(@babel/core@7.26.0)(preact@10.24.3(patch_hash=nmwo7i2pfqokqkren3uyzcqkya))(vite@5.4.10(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2)) + version: 2.9.1(patch_hash=wx4a2puiselz4n5hatk6npe6l4)(@babel/core@7.26.0)(preact@10.24.3(patch_hash=nmwo7i2pfqokqkren3uyzcqkya))(vite@5.4.11(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2)) '@withastro/node': specifier: ^8.4.0 - version: 8.4.0(astro@4.16.9(patch_hash=etcf34y5ycd4ewbhb2nylfitly)(@types/node@22.4.2)(rollup@4.24.0)(typescript@5.6.3)) + version: 8.4.0(astro@4.16.13(patch_hash=etcf34y5ycd4ewbhb2nylfitly)(@types/node@22.4.2)(rollup@4.24.0)(typescript@5.6.3)) astro: - specifier: ^4.16.9 - version: 4.16.9(patch_hash=etcf34y5ycd4ewbhb2nylfitly)(@types/node@22.4.2)(rollup@4.24.0)(typescript@5.6.3) + specifier: ^4.16.13 + version: 4.16.13(patch_hash=etcf34y5ycd4ewbhb2nylfitly)(@types/node@22.4.2)(rollup@4.24.0)(typescript@5.6.3) astro-emotion: specifier: ^2.0.0 version: 2.0.0 @@ -58,6 +58,9 @@ importers: typescript: specifier: ^5.6.3 version: 5.6.3 + vite: + specifier: ^5.4.10 + version: 5.4.11(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2) ws: specifier: ^8.18.0 version: 8.18.0(patch_hash=kx7tmpitapmudddeuody7gwvtq) @@ -806,8 +809,8 @@ packages: astro-emotion@2.0.0: resolution: {integrity: sha512-VT5aZh8wAv3lkdlK+og2b2y1pcsNj1AW1gTm7NKJRpTOV4hmFN9MdK1j0FA3aKDmw9fJ6DqocaVlJMP9+eBOhw==} - astro@4.16.9: - resolution: {integrity: sha512-DFYzPZooVArKSGu969BBByUV44tJMVDPGKxgqWNFBaIrkvGljdVUqQSVwD+/iPYACoSkI8BRYvDMEBDkathIUQ==} + astro@4.16.13: + resolution: {integrity: sha512-Mtd76+BC0zLWqoXpf9xc731AhdH4MNh5JFHYdLRvSH0Nqn48hA64dPGh/cWsJvh/DZFmC0NTZusM1Qq2gyNaVg==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true @@ -1926,8 +1929,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@5.4.10: - resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -2580,13 +2583,13 @@ snapshots: '@oslojs/encoding@1.1.0': {} - '@preact/preset-vite@2.9.1(patch_hash=wx4a2puiselz4n5hatk6npe6l4)(@babel/core@7.26.0)(preact@10.24.3(patch_hash=nmwo7i2pfqokqkren3uyzcqkya))(vite@5.4.10(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2))': + '@preact/preset-vite@2.9.1(patch_hash=wx4a2puiselz4n5hatk6npe6l4)(@babel/core@7.26.0)(preact@10.24.3(patch_hash=nmwo7i2pfqokqkren3uyzcqkya))(vite@5.4.11(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2))': dependencies: '@babel/code-frame': 7.25.7 '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx': 7.25.7(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-development': 7.25.7(@babel/core@7.26.0) - '@prefresh/vite': 2.4.6(preact@10.24.3(patch_hash=nmwo7i2pfqokqkren3uyzcqkya))(vite@5.4.10(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2)) + '@prefresh/vite': 2.4.6(preact@10.24.3(patch_hash=nmwo7i2pfqokqkren3uyzcqkya))(vite@5.4.11(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.26.0) debug: 4.3.7 @@ -2595,7 +2598,7 @@ snapshots: node-html-parser: 6.1.13 source-map: 0.7.4 stack-trace: 1.0.0-pre2 - vite: 5.4.10(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2) + vite: 5.4.11(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2) transitivePeerDependencies: - preact - supports-color @@ -2608,7 +2611,7 @@ snapshots: '@prefresh/utils@1.2.0': {} - '@prefresh/vite@2.4.6(preact@10.24.3(patch_hash=nmwo7i2pfqokqkren3uyzcqkya))(vite@5.4.10(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2))': + '@prefresh/vite@2.4.6(preact@10.24.3(patch_hash=nmwo7i2pfqokqkren3uyzcqkya))(vite@5.4.11(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2))': dependencies: '@babel/core': 7.25.7 '@prefresh/babel-plugin': 0.5.1 @@ -2616,7 +2619,7 @@ snapshots: '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 preact: 10.24.3(patch_hash=nmwo7i2pfqokqkren3uyzcqkya) - vite: 5.4.10(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2) + vite: 5.4.11(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2) transitivePeerDependencies: - supports-color @@ -2710,7 +2713,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.25.7 + '@babel/parser': 7.26.2 '@babel/types': 7.26.0 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 @@ -2722,7 +2725,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.25.7 + '@babel/parser': 7.26.2 '@babel/types': 7.26.0 '@types/babel__traverse@7.20.6': @@ -2765,10 +2768,10 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@withastro/node@8.4.0(astro@4.16.9(patch_hash=etcf34y5ycd4ewbhb2nylfitly)(@types/node@22.4.2)(rollup@4.24.0)(typescript@5.6.3))': + '@withastro/node@8.4.0(astro@4.16.13(patch_hash=etcf34y5ycd4ewbhb2nylfitly)(@types/node@22.4.2)(rollup@4.24.0)(typescript@5.6.3))': dependencies: '@types/ws': 8.5.12 - astro: 4.16.9(patch_hash=etcf34y5ycd4ewbhb2nylfitly)(@types/node@22.4.2)(rollup@4.24.0)(typescript@5.6.3) + astro: 4.16.13(patch_hash=etcf34y5ycd4ewbhb2nylfitly)(@types/node@22.4.2)(rollup@4.24.0)(typescript@5.6.3) send: 0.19.1 server-destroy: 1.0.1 ws: 8.18.0(patch_hash=kx7tmpitapmudddeuody7gwvtq) @@ -2815,7 +2818,7 @@ snapshots: transitivePeerDependencies: - supports-color - astro@4.16.9(patch_hash=etcf34y5ycd4ewbhb2nylfitly)(@types/node@22.4.2)(rollup@4.24.0)(typescript@5.6.3): + astro@4.16.13(patch_hash=etcf34y5ycd4ewbhb2nylfitly)(@types/node@22.4.2)(rollup@4.24.0)(typescript@5.6.3): dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/internal-helpers': 0.4.1 @@ -2871,8 +2874,8 @@ snapshots: tsconfck: 3.1.4(typescript@5.6.3) unist-util-visit: 5.0.0 vfile: 6.0.3 - vite: 5.4.10(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2) - vitefu: 1.0.3(vite@5.4.10(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2)) + vite: 5.4.11(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2) + vitefu: 1.0.3(vite@5.4.11(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2)) which-pm: 3.0.0 xxhash-wasm: 1.0.2 yargs-parser: 21.1.1 @@ -3433,7 +3436,7 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.25.7 + '@babel/parser': 7.26.2 '@babel/types': 7.26.0 source-map-js: 1.2.1 @@ -4269,7 +4272,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@5.4.10(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2): + vite@5.4.11(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2): dependencies: esbuild: 0.21.5 postcss: 8.4.47 @@ -4278,9 +4281,9 @@ snapshots: '@types/node': 22.4.2 fsevents: 2.3.3 - vitefu@1.0.3(vite@5.4.10(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2)): + vitefu@1.0.3(vite@5.4.11(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2)): optionalDependencies: - vite: 5.4.10(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2) + vite: 5.4.11(patch_hash=t7mv5eo4jnpkrovnpp7p2hvsn4)(@types/node@22.4.2) web-namespaces@2.0.1: {}