Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion packages/astro/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@
"./assets/endpoint/*": "./dist/assets/endpoint/*.js",
"./assets/services/sharp": "./dist/assets/services/sharp.js",
"./assets/services/noop": "./dist/assets/services/noop.js",
"./assets/fonts/providers/*": "./dist/assets/fonts/providers/entrypoints/*.js",
"./assets/fonts/runtime": "./dist/assets/fonts/runtime.js",
"./loaders": "./dist/content/loaders/index.js",
"./content/config": "./dist/content/config.js",
Expand Down
37 changes: 33 additions & 4 deletions packages/astro/src/assets/fonts/config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import type * as unifont from 'unifont';
import { z } from 'zod';
import { LOCAL_PROVIDER_NAME } from './constants.js';
import type {
AstroFontProviderInitContext,
AstroFontProviderResolveFontOptions,
Awaitable,
} from './types.js';

const weightSchema = z.union([z.string(), z.number()]);
export const styleSchema = z.enum(['normal', 'italic', 'oblique']);
Expand Down Expand Up @@ -82,13 +88,36 @@ const entrypointSchema = z.union([z.string(), z.instanceof(URL)]);
export const fontProviderSchema = z
.object({
/**
* URL, path relative to the root or package import.
* TODO:
*/
entrypoint: entrypointSchema,
name: z.string(),
/**
* Optional serializable object passed to the unifont provider.
* Optional serializable object passed to the font provider.
*/
config: z.record(z.string(), z.any()).optional(),
options: z.record(z.string(), z.any()).optional(),
/**
* TODO:
*/
init: z.custom<(context: AstroFontProviderInitContext) => Awaitable<void>>(
(v) => typeof v === 'function',
),
/**
* TODO:
*/
resolveFont: z.custom<
(options: AstroFontProviderResolveFontOptions) => Awaitable<
| {
fonts: Array<unifont.FontFaceData>;
}
| undefined
>
>((v) => typeof v === 'function'),
/**
* TODO:
*/
listFonts: z
.custom<() => Awaitable<string[] | undefined>>((v) => typeof v === 'function')
.optional(),
})
.strict();

Expand Down
46 changes: 0 additions & 46 deletions packages/astro/src/assets/fonts/core/extract-unifont-providers.ts

This file was deleted.

11 changes: 2 additions & 9 deletions packages/astro/src/assets/fonts/core/resolve-families.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import { LOCAL_PROVIDER_NAME } from '../constants.js';
import type {
Hasher,
LocalProviderUrlResolver,
RemoteFontProviderResolver,
} from '../definitions.js';
import type { Hasher, LocalProviderUrlResolver } from '../definitions.js';
import type {
FontFamily,
LocalFontFamily,
Expand Down Expand Up @@ -41,12 +37,10 @@ function resolveVariants({
export async function resolveFamily({
family,
hasher,
remoteFontProviderResolver,
localProviderUrlResolver,
}: {
family: FontFamily;
hasher: Hasher;
remoteFontProviderResolver: RemoteFontProviderResolver;
localProviderUrlResolver: LocalProviderUrlResolver;
}): Promise<ResolvedFontFamily> {
// We remove quotes from the name so they can be properly resolved by providers.
Expand Down Expand Up @@ -74,8 +68,7 @@ export async function resolveFamily({
subsets: family.subsets ? dedupe(family.subsets) : undefined,
fallbacks: family.fallbacks ? dedupe(family.fallbacks) : undefined,
unicodeRange: family.unicodeRange ? dedupe(family.unicodeRange) : undefined,
// This will be Astro specific eventually
provider: await remoteFontProviderResolver.resolve(family.provider),
provider: family.provider,
};
}

Expand Down
18 changes: 8 additions & 10 deletions packages/astro/src/assets/fonts/definitions.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import type * as unifont from 'unifont';
import type { CollectedFontForMetrics } from './core/optimize-fallbacks.js';
import type {
AstroFontProvider,
AstroFontProviderResolveFontOptions,
FontFaceMetrics,
FontFileData,
FontType,
GenericFallbackName,
PreloadData,
ResolvedFontProvider,
Style,
} from './types.js';

Expand All @@ -16,14 +15,6 @@ export interface Hasher {
hashObject: (input: Record<string, any>) => string;
}

export interface RemoteFontProviderModResolver {
resolve: (id: string) => Promise<any>;
}

export interface RemoteFontProviderResolver {
resolve: (provider: AstroFontProvider) => Promise<ResolvedFontProvider>;
}

export interface LocalProviderUrlResolver {
resolve: (input: string) => string;
}
Expand Down Expand Up @@ -119,3 +110,10 @@ export interface Storage {
setItem: (key: string, value: any) => Promise<void>;
setItemRaw: (key: string, value: any) => Promise<void>;
}

export interface FontResolver {
resolveFont: (
options: AstroFontProviderResolveFontOptions & { provider: string },
) => Promise<Array<unifont.FontFaceData>>;
listFonts: (options: { provider: string }) => Promise<string[] | undefined>;
}

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { fileURLToPath } from 'node:url';
import { createRequire } from 'node:module';
import { fileURLToPath, pathToFileURL } from 'node:url';
import type { LocalProviderUrlResolver } from '../definitions.js';
import { resolveEntrypoint } from '../utils.js';

export class RequireLocalProviderUrlResolver implements LocalProviderUrlResolver {
readonly #root: URL;
Expand All @@ -18,10 +18,20 @@ export class RequireLocalProviderUrlResolver implements LocalProviderUrlResolver
this.#intercept = intercept;
}

#resolveEntrypoint(root: URL, entrypoint: string): URL {
const require = createRequire(root);

try {
return pathToFileURL(require.resolve(entrypoint));
} catch {
return new URL(entrypoint, root);
}
}

resolve(input: string): string {
// fileURLToPath is important so that the file can be read
// by createLocalUrlProxyContentResolver
const path = fileURLToPath(resolveEntrypoint(this.#root, input));
const path = fileURLToPath(this.#resolveEntrypoint(this.#root, input));
this.#intercept?.(path);
return path;
}
Expand Down
Loading
Loading