astro 6.0.0-beta.0 → 6.0.0-beta.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 (99) hide show
  1. package/client.d.ts +4 -4
  2. package/components/Font.astro +1 -1
  3. package/dist/assets/endpoint/node.js +21 -4
  4. package/dist/assets/fonts/config.d.ts +28 -1
  5. package/dist/assets/fonts/config.js +10 -4
  6. package/dist/assets/fonts/constants.d.ts +4 -1
  7. package/dist/assets/fonts/constants.js +8 -0
  8. package/dist/assets/fonts/core/create-get-font-buffer.d.ts +4 -0
  9. package/dist/assets/fonts/core/create-get-font-buffer.js +35 -0
  10. package/dist/assets/fonts/core/filter-preloads.d.ts +2 -0
  11. package/dist/assets/fonts/{runtime.js → core/filter-preloads.js} +0 -17
  12. package/dist/assets/fonts/core/resolve-families.d.ts +4 -5
  13. package/dist/assets/fonts/core/resolve-families.js +8 -13
  14. package/dist/assets/fonts/definitions.d.ts +4 -10
  15. package/dist/assets/fonts/infra/require-local-provider-url-resolver.js +11 -3
  16. package/dist/assets/fonts/infra/unifont-font-resolver.d.ts +13 -5
  17. package/dist/assets/fonts/infra/unifont-font-resolver.js +60 -18
  18. package/dist/assets/fonts/orchestrate.d.ts +5 -7
  19. package/dist/assets/fonts/orchestrate.js +12 -16
  20. package/dist/assets/fonts/providers/index.d.ts +7 -3
  21. package/dist/assets/fonts/providers/index.js +83 -9
  22. package/dist/assets/fonts/providers/local.d.ts +1 -3
  23. package/dist/assets/fonts/providers/local.js +40 -42
  24. package/dist/assets/fonts/runtime/client.d.ts +2 -0
  25. package/dist/assets/fonts/runtime/client.js +9 -0
  26. package/dist/assets/fonts/runtime/server.d.ts +2 -0
  27. package/dist/assets/fonts/runtime/server.js +8 -0
  28. package/dist/assets/fonts/types.d.ts +66 -22
  29. package/dist/assets/fonts/utils.d.ts +0 -1
  30. package/dist/assets/fonts/utils.js +0 -11
  31. package/dist/assets/fonts/vite-plugin-fonts.js +96 -42
  32. package/dist/assets/services/sharp.js +2 -7
  33. package/dist/assets/vite-plugin-assets.js +8 -10
  34. package/dist/cli/infra/build-time-astro-version-provider.js +1 -1
  35. package/dist/config/index.d.ts +4 -2
  36. package/dist/content/content-layer.js +3 -3
  37. package/dist/content/runtime.js +2 -2
  38. package/dist/content/vite-plugin-content-assets.d.ts +2 -1
  39. package/dist/content/vite-plugin-content-assets.js +13 -3
  40. package/dist/core/build/generate.js +2 -2
  41. package/dist/core/build/internal.d.ts +8 -0
  42. package/dist/core/build/internal.js +14 -0
  43. package/dist/core/build/plugins/plugin-analyzer.js +17 -7
  44. package/dist/core/build/plugins/plugin-css.js +84 -2
  45. package/dist/core/build/static-build.js +43 -13
  46. package/dist/core/compile/compile.js +1 -0
  47. package/dist/core/compile/style.d.ts +3 -1
  48. package/dist/core/compile/style.js +32 -1
  49. package/dist/core/config/config.d.ts +1 -1
  50. package/dist/core/config/config.js +1 -3
  51. package/dist/core/config/schemas/base.d.ts +16 -4
  52. package/dist/core/config/schemas/relative.d.ts +40 -12
  53. package/dist/core/constants.js +1 -1
  54. package/dist/core/dev/dev.js +1 -1
  55. package/dist/core/errors/dev/utils.js +1 -1
  56. package/dist/core/errors/errors-data.d.ts +6 -5
  57. package/dist/core/errors/errors-data.js +7 -6
  58. package/dist/core/logger/core.d.ts +1 -1
  59. package/dist/core/messages.js +2 -2
  60. package/dist/core/middleware/index.js +2 -14
  61. package/dist/core/render-context.js +16 -32
  62. package/dist/core/session/config.d.ts +2 -2
  63. package/dist/core/session/config.js +1 -1
  64. package/dist/core/session/types.d.ts +5 -5
  65. package/dist/core/session/utils.js +3 -2
  66. package/dist/core/session/vite-plugin.js +1 -1
  67. package/dist/manifest/serialized.js +14 -0
  68. package/dist/runtime/server/render/component.js +4 -28
  69. package/dist/transitions/events.d.ts +4 -0
  70. package/dist/transitions/events.js +8 -2
  71. package/dist/transitions/router.d.ts +0 -4
  72. package/dist/transitions/router.js +3 -9
  73. package/dist/types/public/common.d.ts +4 -4
  74. package/dist/types/public/config.d.ts +7 -4
  75. package/dist/types/public/context.d.ts +5 -5
  76. package/dist/vite-plugin-css/index.d.ts +1 -1
  77. package/dist/vite-plugin-css/index.js +12 -6
  78. package/dist/vite-plugin-renderers/index.d.ts +0 -1
  79. package/dist/vite-plugin-renderers/index.js +0 -1
  80. package/env.d.ts +1 -1
  81. package/package.json +13 -14
  82. package/types/fonts.d.ts +1 -1
  83. package/dist/assets/fonts/infra/build-remote-font-provider-mod-resolver.d.ts +0 -4
  84. package/dist/assets/fonts/infra/build-remote-font-provider-mod-resolver.js +0 -8
  85. package/dist/assets/fonts/infra/dev-remote-font-provider-mod-resolver.d.ts +0 -9
  86. package/dist/assets/fonts/infra/dev-remote-font-provider-mod-resolver.js +0 -14
  87. package/dist/assets/fonts/infra/remote-font-provider-resolver.d.ts +0 -10
  88. package/dist/assets/fonts/infra/remote-font-provider-resolver.js +0 -49
  89. package/dist/assets/fonts/providers/entrypoints/adobe.d.ts +0 -2
  90. package/dist/assets/fonts/providers/entrypoints/adobe.js +0 -5
  91. package/dist/assets/fonts/providers/entrypoints/bunny.d.ts +0 -1
  92. package/dist/assets/fonts/providers/entrypoints/bunny.js +0 -5
  93. package/dist/assets/fonts/providers/entrypoints/fontshare.d.ts +0 -1
  94. package/dist/assets/fonts/providers/entrypoints/fontshare.js +0 -5
  95. package/dist/assets/fonts/providers/entrypoints/fontsource.d.ts +0 -1
  96. package/dist/assets/fonts/providers/entrypoints/fontsource.js +0 -5
  97. package/dist/assets/fonts/providers/entrypoints/google.d.ts +0 -2
  98. package/dist/assets/fonts/providers/entrypoints/google.js +0 -5
  99. package/dist/assets/fonts/runtime.d.ts +0 -5
package/client.d.ts CHANGED
@@ -58,9 +58,8 @@ declare module 'astro:assets' {
58
58
  Image: typeof import('./components/Image.astro').default;
59
59
  Picture: typeof import('./components/Picture.astro').default;
60
60
  Font: typeof import('./components/Font.astro').default;
61
- getFontData: (
62
- cssVariable: import('astro:assets').CssVariable,
63
- ) => Array<import('astro:assets').FontData>;
61
+ fontData: Record<import('astro:assets').CssVariable, Array<import('astro:assets').FontData>>;
62
+ getFontBuffer: (url: string) => Promise<Buffer>;
64
63
  };
65
64
 
66
65
  type ImgAttributes = import('./dist/type-utils.js').WithRequired<
@@ -82,7 +81,8 @@ declare module 'astro:assets' {
82
81
  Picture,
83
82
  Font,
84
83
  inferRemoteSize,
85
- getFontData,
84
+ fontData,
85
+ getFontBuffer,
86
86
  }: AstroAssets;
87
87
  }
88
88
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  import * as mod from 'virtual:astro:assets/fonts/internal';
3
- import { filterPreloads } from 'astro/assets/fonts/runtime';
3
+ import { filterPreloads } from '../dist/assets/fonts/core/filter-preloads.js';
4
4
  import { AstroError, AstroErrorData } from '../dist/core/errors/index.js';
5
5
 
6
6
  // TODO: remove check when fonts are stabilized
@@ -1,21 +1,23 @@
1
- import { outDir } from "astro:assets";
1
+ import { outDir, serverDir } from "astro:assets";
2
2
  import { readFile } from "node:fs/promises";
3
+ import path from "node:path";
3
4
  import { fileURLToPath } from "node:url";
4
5
  import { isParentDirectory } from "@astrojs/internal-helpers/path";
5
6
  import { handleImageRequest } from "./shared.js";
6
7
  async function loadLocalImage(src, url) {
8
+ const outDirURL = resolveOutDir();
7
9
  const idx = url.pathname.indexOf("/_image");
8
10
  if (idx > 0) {
9
11
  src = src.slice(idx);
10
12
  }
11
- if (!URL.canParse("." + src, outDir)) {
13
+ if (!URL.canParse("." + src, outDirURL)) {
12
14
  return void 0;
13
15
  }
14
- const fileUrl = new URL("." + src, outDir);
16
+ const fileUrl = new URL("." + src, outDirURL);
15
17
  if (fileUrl.protocol !== "file:") {
16
18
  return void 0;
17
19
  }
18
- if (!isParentDirectory(fileURLToPath(outDir), fileURLToPath(fileUrl))) {
20
+ if (!isParentDirectory(fileURLToPath(outDirURL), fileURLToPath(fileUrl))) {
19
21
  return void 0;
20
22
  }
21
23
  try {
@@ -34,6 +36,21 @@ const GET = async ({ request }) => {
34
36
  });
35
37
  }
36
38
  };
39
+ function resolveOutDir() {
40
+ const serverDirPath = fileURLToPath(serverDir);
41
+ const rel = path.relative(serverDirPath, fileURLToPath(outDir));
42
+ const serverFolder = path.basename(serverDirPath);
43
+ let serverEntryFolderURL = path.dirname(import.meta.url);
44
+ while (!serverEntryFolderURL.endsWith(serverFolder)) {
45
+ serverEntryFolderURL = path.dirname(serverEntryFolderURL);
46
+ }
47
+ const serverEntryURL = serverEntryFolderURL + "/entry.mjs";
48
+ const outDirURL = new URL(appendForwardSlash(rel), serverEntryURL);
49
+ return outDirURL;
50
+ }
51
+ function appendForwardSlash(pth) {
52
+ return pth.endsWith("/") ? pth : pth + "/";
53
+ }
37
54
  export {
38
55
  GET
39
56
  };
@@ -70,11 +70,38 @@ export declare const localFontFamilySchema: z.ZodObject<{
70
70
  name: z.ZodString;
71
71
  cssVariable: z.ZodString;
72
72
  }, z.core.$strict>;
73
+ export declare const fontProviderSchema: z.ZodObject<{
74
+ name: z.ZodString;
75
+ config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
76
+ init: z.ZodOptional<z.ZodCustom<((context: import("./types.js").FontProviderInitContext) => void | Promise<void>) | undefined, ((context: import("./types.js").FontProviderInitContext) => void | Promise<void>) | undefined>>;
77
+ resolveFont: z.ZodCustom<(options: import("./types.js").ResolveFontOptions<never>) => {
78
+ fonts: Array<import("unifont").FontFaceData>;
79
+ } | Promise<{
80
+ fonts: Array<import("unifont").FontFaceData>;
81
+ } | undefined> | undefined, (options: import("./types.js").ResolveFontOptions<never>) => {
82
+ fonts: Array<import("unifont").FontFaceData>;
83
+ } | Promise<{
84
+ fonts: Array<import("unifont").FontFaceData>;
85
+ } | undefined> | undefined>;
86
+ listFonts: z.ZodOptional<z.ZodCustom<(() => string[] | Promise<string[] | undefined> | undefined) | undefined, (() => string[] | Promise<string[] | undefined> | undefined) | undefined>>;
87
+ }, z.core.$strict>;
73
88
  export declare const remoteFontFamilySchema: z.ZodObject<{
74
89
  provider: z.ZodObject<{
75
- entrypoint: z.ZodUnion<readonly [z.ZodString, z.ZodCustom<URL, URL>]>;
90
+ name: z.ZodString;
76
91
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
92
+ init: z.ZodOptional<z.ZodCustom<((context: import("./types.js").FontProviderInitContext) => void | Promise<void>) | undefined, ((context: import("./types.js").FontProviderInitContext) => void | Promise<void>) | undefined>>;
93
+ resolveFont: z.ZodCustom<(options: import("./types.js").ResolveFontOptions<never>) => {
94
+ fonts: Array<import("unifont").FontFaceData>;
95
+ } | Promise<{
96
+ fonts: Array<import("unifont").FontFaceData>;
97
+ } | undefined> | undefined, (options: import("./types.js").ResolveFontOptions<never>) => {
98
+ fonts: Array<import("unifont").FontFaceData>;
99
+ } | Promise<{
100
+ fonts: Array<import("unifont").FontFaceData>;
101
+ } | undefined> | undefined>;
102
+ listFonts: z.ZodOptional<z.ZodCustom<(() => string[] | Promise<string[] | undefined> | undefined) | undefined, (() => string[] | Promise<string[] | undefined> | undefined) | undefined>>;
77
103
  }, z.core.$strict>;
104
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
78
105
  weights: z.ZodOptional<z.ZodTuple<[z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>], z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
79
106
  styles: z.ZodOptional<z.ZodTuple<[z.ZodEnum<{
80
107
  normal: "normal";
@@ -37,6 +37,13 @@ const localFontFamilySchema = z.object({
37
37
  provider: z.literal(LOCAL_PROVIDER_NAME),
38
38
  variants: z.tuple([variantSchema], variantSchema)
39
39
  }).strict();
40
+ const fontProviderSchema = z.object({
41
+ name: z.string(),
42
+ config: z.record(z.string(), z.any()).optional(),
43
+ init: z.custom((v) => typeof v === "function").optional(),
44
+ resolveFont: z.custom((v) => typeof v === "function"),
45
+ listFonts: z.custom((v) => typeof v === "function").optional()
46
+ }).strict();
40
47
  const remoteFontFamilySchema = z.object({
41
48
  ...requiredFamilyAttributesSchema.shape,
42
49
  ...fallbacksSchema.shape,
@@ -44,10 +51,8 @@ const remoteFontFamilySchema = z.object({
44
51
  weight: true,
45
52
  style: true
46
53
  }).shape,
47
- provider: z.object({
48
- entrypoint: entrypointSchema,
49
- config: z.record(z.string(), z.any()).optional()
50
- }).strict(),
54
+ provider: fontProviderSchema,
55
+ options: z.record(z.string(), z.any()).optional(),
51
56
  weights: z.tuple([weightSchema], weightSchema).optional(),
52
57
  styles: z.tuple([styleSchema], styleSchema).optional(),
53
58
  subsets: z.tuple([z.string()], z.string()).optional(),
@@ -55,6 +60,7 @@ const remoteFontFamilySchema = z.object({
55
60
  }).strict();
56
61
  export {
57
62
  displaySchema,
63
+ fontProviderSchema,
58
64
  localFontFamilySchema,
59
65
  remoteFontFamilySchema,
60
66
  styleSchema,
@@ -1,9 +1,12 @@
1
1
  import type { Defaults, FontType } from './types.js';
2
2
  export declare const LOCAL_PROVIDER_NAME = "local";
3
3
  export declare const DEFAULTS: Defaults;
4
- /** Used to serialize data, to be used by public APIs */
5
4
  export declare const VIRTUAL_MODULE_ID = "virtual:astro:assets/fonts/internal";
6
5
  export declare const RESOLVED_VIRTUAL_MODULE_ID: string;
6
+ export declare const RUNTIME_VIRTUAL_MODULE_ID = "virtual:astro:assets/fonts/runtime";
7
+ export declare const RESOLVED_RUNTIME_VIRTUAL_MODULE_ID: string;
8
+ export declare const BUFFER_VIRTUAL_MODULE_ID_PREFIX = "virtual:astro:assets/fonts/file/";
9
+ export declare const RESOLVED_BUFFER_VIRTUAL_MODULE_ID_PREFIX: string;
7
10
  export declare const ASSETS_DIR = "fonts";
8
11
  export declare const CACHE_DIR = "./fonts/";
9
12
  export declare const FONT_TYPES: readonly ["woff2", "woff", "otf", "ttf", "eot"];
@@ -10,6 +10,10 @@ const DEFAULTS = {
10
10
  };
11
11
  const VIRTUAL_MODULE_ID = "virtual:astro:assets/fonts/internal";
12
12
  const RESOLVED_VIRTUAL_MODULE_ID = "\0" + VIRTUAL_MODULE_ID;
13
+ const RUNTIME_VIRTUAL_MODULE_ID = "virtual:astro:assets/fonts/runtime";
14
+ const RESOLVED_RUNTIME_VIRTUAL_MODULE_ID = "\0" + RUNTIME_VIRTUAL_MODULE_ID;
15
+ const BUFFER_VIRTUAL_MODULE_ID_PREFIX = "virtual:astro:assets/fonts/file/";
16
+ const RESOLVED_BUFFER_VIRTUAL_MODULE_ID_PREFIX = "\0" + BUFFER_VIRTUAL_MODULE_ID_PREFIX;
13
17
  const ASSETS_DIR = "fonts";
14
18
  const CACHE_DIR = "./fonts/";
15
19
  const FONT_TYPES = ["woff2", "woff", "otf", "ttf", "eot"];
@@ -38,6 +42,7 @@ const GENERIC_FALLBACK_NAMES = [
38
42
  const FONTS_TYPES_FILE = "fonts.d.ts";
39
43
  export {
40
44
  ASSETS_DIR,
45
+ BUFFER_VIRTUAL_MODULE_ID_PREFIX,
41
46
  CACHE_DIR,
42
47
  DEFAULTS,
43
48
  FONTS_TYPES_FILE,
@@ -45,6 +50,9 @@ export {
45
50
  FONT_TYPES,
46
51
  GENERIC_FALLBACK_NAMES,
47
52
  LOCAL_PROVIDER_NAME,
53
+ RESOLVED_BUFFER_VIRTUAL_MODULE_ID_PREFIX,
54
+ RESOLVED_RUNTIME_VIRTUAL_MODULE_ID,
48
55
  RESOLVED_VIRTUAL_MODULE_ID,
56
+ RUNTIME_VIRTUAL_MODULE_ID,
49
57
  VIRTUAL_MODULE_ID
50
58
  };
@@ -0,0 +1,4 @@
1
+ import type { BufferImports } from './../types.js';
2
+ export declare function createGetFontBuffer({ bufferImports }: {
3
+ bufferImports?: BufferImports;
4
+ }): (url: string) => Promise<Buffer<ArrayBufferLike>>;
@@ -0,0 +1,35 @@
1
+ import { AstroError, AstroErrorData } from "../../../core/errors/index.js";
2
+ function createGetFontBuffer({ bufferImports }) {
3
+ return async function getFontBuffer(url) {
4
+ if (!bufferImports) {
5
+ throw new AstroError(AstroErrorData.ExperimentalFontsNotEnabled);
6
+ }
7
+ const hash = url.split("/").pop() ?? "";
8
+ const fn = bufferImports[hash];
9
+ if (!fn) {
10
+ throw new AstroError({
11
+ ...AstroErrorData.FontBufferNotFound,
12
+ message: AstroErrorData.FontBufferNotFound.message(url)
13
+ });
14
+ }
15
+ let mod;
16
+ try {
17
+ mod = await fn();
18
+ } catch {
19
+ throw new AstroError({
20
+ ...AstroErrorData.FontBufferNotFound,
21
+ message: AstroErrorData.FontBufferNotFound.message(url)
22
+ });
23
+ }
24
+ if (!mod?.default) {
25
+ throw new AstroError({
26
+ ...AstroErrorData.FontBufferNotFound,
27
+ message: AstroErrorData.FontBufferNotFound.message(url)
28
+ });
29
+ }
30
+ return mod.default;
31
+ };
32
+ }
33
+ export {
34
+ createGetFontBuffer
35
+ };
@@ -0,0 +1,2 @@
1
+ import type { PreloadData, PreloadFilter } from '../types.js';
2
+ export declare function filterPreloads(data: Array<PreloadData>, preload: PreloadFilter): Array<PreloadData> | null;
@@ -1,19 +1,3 @@
1
- import { AstroError, AstroErrorData } from "../../core/errors/index.js";
2
- function createGetFontData({ consumableMap }) {
3
- return function getFontData(cssVariable) {
4
- if (!consumableMap) {
5
- throw new AstroError(AstroErrorData.ExperimentalFontsNotEnabled);
6
- }
7
- const data = consumableMap.get(cssVariable);
8
- if (!data) {
9
- throw new AstroError({
10
- ...AstroErrorData.FontFamilyNotFound,
11
- message: AstroErrorData.FontFamilyNotFound.message(cssVariable)
12
- });
13
- }
14
- return data;
15
- };
16
- }
17
1
  function filterPreloads(data, preload) {
18
2
  if (!preload) {
19
3
  return null;
@@ -49,6 +33,5 @@ function checkWeight(input, target) {
49
33
  return input === target;
50
34
  }
51
35
  export {
52
- createGetFontData,
53
36
  filterPreloads
54
37
  };
@@ -1,17 +1,16 @@
1
- import type { Hasher, LocalProviderUrlResolver, RemoteFontProviderResolver } from '../definitions.js';
1
+ import type { Hasher, LocalProviderUrlResolver } from '../definitions.js';
2
2
  import type { FontFamily, ResolvedFontFamily } from '../types.js';
3
3
  /**
4
4
  * Dedupes properties if applicable and resolves entrypoints.
5
5
  */
6
- export declare function resolveFamily({ family, hasher, remoteFontProviderResolver, localProviderUrlResolver, }: {
6
+ export declare function resolveFamily({ family, hasher, localProviderUrlResolver, }: {
7
7
  family: FontFamily;
8
8
  hasher: Hasher;
9
- remoteFontProviderResolver: RemoteFontProviderResolver;
10
9
  localProviderUrlResolver: LocalProviderUrlResolver;
11
- }): Promise<ResolvedFontFamily>;
10
+ }): ResolvedFontFamily;
12
11
  /**
13
12
  * A function for convenience. The actual logic lives in resolveFamily
14
13
  */
15
14
  export declare function resolveFamilies({ families, ...dependencies }: {
16
15
  families: Array<FontFamily>;
17
- } & Omit<Parameters<typeof resolveFamily>[0], 'family'>): Promise<Array<ResolvedFontFamily>>;
16
+ } & Omit<Parameters<typeof resolveFamily>[0], 'family'>): Array<ResolvedFontFamily>;
@@ -18,10 +18,9 @@ function resolveVariants({
18
18
  })
19
19
  }));
20
20
  }
21
- async function resolveFamily({
21
+ function resolveFamily({
22
22
  family,
23
23
  hasher,
24
- remoteFontProviderResolver,
25
24
  localProviderUrlResolver
26
25
  }) {
27
26
  const name = withoutQuotes(family.name);
@@ -44,22 +43,18 @@ async function resolveFamily({
44
43
  subsets: family.subsets ? dedupe(family.subsets) : void 0,
45
44
  formats: family.formats ? dedupe(family.formats) : void 0,
46
45
  fallbacks: family.fallbacks ? dedupe(family.fallbacks) : void 0,
47
- unicodeRange: family.unicodeRange ? dedupe(family.unicodeRange) : void 0,
48
- // This will be Astro specific eventually
49
- provider: await remoteFontProviderResolver.resolve(family.provider)
46
+ unicodeRange: family.unicodeRange ? dedupe(family.unicodeRange) : void 0
50
47
  };
51
48
  }
52
- async function resolveFamilies({
49
+ function resolveFamilies({
53
50
  families,
54
51
  ...dependencies
55
52
  }) {
56
- return await Promise.all(
57
- families.map(
58
- (family) => resolveFamily({
59
- family,
60
- ...dependencies
61
- })
62
- )
53
+ return families.map(
54
+ (family) => resolveFamily({
55
+ family,
56
+ ...dependencies
57
+ })
63
58
  );
64
59
  }
65
60
  export {
@@ -1,16 +1,10 @@
1
1
  import type * as unifont from 'unifont';
2
2
  import type { CollectedFontForMetrics } from './core/optimize-fallbacks.js';
3
- import type { AstroFontProviderResolveFontOptions, FontFaceMetrics, FontFileData, FontProvider, FontType, GenericFallbackName, PreloadData, ResolvedFontProvider, Style } from './types.js';
3
+ import type { FontFaceMetrics, FontFileData, FontProvider, FontType, GenericFallbackName, PreloadData, ResolveFontOptions, Style } from './types.js';
4
4
  export interface Hasher {
5
5
  hashString: (input: string) => string;
6
6
  hashObject: (input: Record<string, any>) => string;
7
7
  }
8
- export interface RemoteFontProviderModResolver {
9
- resolve: (id: string) => Promise<any>;
10
- }
11
- export interface RemoteFontProviderResolver {
12
- resolve: (provider: FontProvider) => Promise<ResolvedFontProvider>;
13
- }
14
8
  export interface LocalProviderUrlResolver {
15
9
  resolve: (input: string) => string;
16
10
  }
@@ -91,10 +85,10 @@ export interface Storage {
91
85
  setItemRaw: (key: string, value: any) => Promise<void>;
92
86
  }
93
87
  export interface FontResolver {
94
- resolveFont: (options: AstroFontProviderResolveFontOptions & {
95
- provider: string;
88
+ resolveFont: (options: ResolveFontOptions<Record<string, any>> & {
89
+ provider: FontProvider;
96
90
  }) => Promise<Array<unifont.FontFaceData>>;
97
91
  listFonts: (options: {
98
- provider: string;
92
+ provider: FontProvider;
99
93
  }) => Promise<string[] | undefined>;
100
94
  }
@@ -1,5 +1,5 @@
1
- import { fileURLToPath } from "node:url";
2
- import { resolveEntrypoint } from "../utils.js";
1
+ import { createRequire } from "node:module";
2
+ import { fileURLToPath, pathToFileURL } from "node:url";
3
3
  class RequireLocalProviderUrlResolver {
4
4
  #root;
5
5
  // TODO: remove when stabilizing
@@ -11,8 +11,16 @@ class RequireLocalProviderUrlResolver {
11
11
  this.#root = root;
12
12
  this.#intercept = intercept;
13
13
  }
14
+ #resolveEntrypoint(root, entrypoint) {
15
+ const require2 = createRequire(root);
16
+ try {
17
+ return pathToFileURL(require2.resolve(entrypoint));
18
+ } catch {
19
+ return new URL(entrypoint, root);
20
+ }
21
+ }
14
22
  resolve(input) {
15
- const path = fileURLToPath(resolveEntrypoint(this.#root, input));
23
+ const path = fileURLToPath(this.#resolveEntrypoint(this.#root, input));
16
24
  this.#intercept?.(path);
17
25
  return path;
18
26
  }
@@ -1,10 +1,18 @@
1
1
  import type { FontFaceData, Provider } from 'unifont';
2
2
  import type { FontResolver, Hasher, Storage } from '../definitions.js';
3
- import type { AstroFontProviderResolveFontOptions, ResolvedFontFamily } from '../types.js';
4
- type NonEmptyProviders = [Provider, ...Array<Provider>];
3
+ import type { FontProvider, ResolvedFontFamily, ResolveFontOptions } from '../types.js';
4
+ type NonEmptyProviders = [
5
+ Provider<string, Record<string, any>>,
6
+ ...Array<Provider<string, Record<string, any>>>
7
+ ];
5
8
  export declare class UnifontFontResolver implements FontResolver {
6
9
  #private;
7
10
  private constructor();
11
+ static idFromProvider({ hasher, provider }: {
12
+ hasher: Hasher;
13
+ provider: FontProvider;
14
+ }): string;
15
+ static astroToUnifontProvider(astroProvider: FontProvider): Provider;
8
16
  static extractUnifontProviders({ families, hasher, }: {
9
17
  families: Array<ResolvedFontFamily>;
10
18
  hasher: Hasher;
@@ -14,11 +22,11 @@ export declare class UnifontFontResolver implements FontResolver {
14
22
  hasher: Hasher;
15
23
  storage: Storage;
16
24
  }): Promise<UnifontFontResolver>;
17
- resolveFont({ familyName, provider, ...rest }: AstroFontProviderResolveFontOptions & {
18
- provider: string;
25
+ resolveFont({ familyName, provider, options, ...rest }: ResolveFontOptions<Record<string, any>> & {
26
+ provider: FontProvider;
19
27
  }): Promise<Array<FontFaceData>>;
20
28
  listFonts({ provider }: {
21
- provider: string;
29
+ provider: FontProvider;
22
30
  }): Promise<string[] | undefined>;
23
31
  }
24
32
  export {};
@@ -1,33 +1,52 @@
1
- import { createUnifont } from "unifont";
1
+ import { createUnifont, defineFontProvider } from "unifont";
2
2
  import { LOCAL_PROVIDER_NAME } from "../constants.js";
3
3
  class UnifontFontResolver {
4
4
  #unifont;
5
- constructor({ unifont }) {
5
+ #hasher;
6
+ constructor({
7
+ unifont,
8
+ hasher
9
+ }) {
6
10
  this.#unifont = unifont;
11
+ this.#hasher = hasher;
12
+ }
13
+ static idFromProvider({ hasher, provider }) {
14
+ const hash = hasher.hashObject({
15
+ name: provider.name,
16
+ ...provider.config
17
+ });
18
+ return `${provider.name}-${hash}`;
19
+ }
20
+ static astroToUnifontProvider(astroProvider) {
21
+ return defineFontProvider(astroProvider.name, async (_options, ctx) => {
22
+ await astroProvider?.init?.(ctx);
23
+ return {
24
+ async resolveFont(familyName, { options, ...rest }) {
25
+ return await astroProvider.resolveFont({ familyName, options, ...rest });
26
+ },
27
+ async listFonts() {
28
+ return astroProvider.listFonts?.();
29
+ }
30
+ };
31
+ })(astroProvider.config);
7
32
  }
8
33
  static extractUnifontProviders({
9
34
  families,
10
35
  hasher
11
36
  }) {
12
- const hashes = /* @__PURE__ */ new Set();
13
- const providers = [];
37
+ const providers = /* @__PURE__ */ new Map();
14
38
  for (const { provider } of families) {
15
39
  if (provider === LOCAL_PROVIDER_NAME) {
16
40
  continue;
17
41
  }
18
- const unifontProvider = provider.provider(provider.config);
19
- const hash = hasher.hashObject({
20
- name: unifontProvider._name,
21
- ...provider.config
22
- });
23
- unifontProvider._name += `-${hash}`;
24
- provider.name = unifontProvider._name;
25
- if (!hashes.has(hash)) {
26
- hashes.add(hash);
27
- providers.push(unifontProvider);
42
+ const id = this.idFromProvider({ hasher, provider });
43
+ if (!providers.has(id)) {
44
+ const unifontProvider = this.astroToUnifontProvider(provider);
45
+ unifontProvider._name = this.idFromProvider({ hasher, provider });
46
+ providers.set(id, unifontProvider);
28
47
  }
29
48
  }
30
- return providers;
49
+ return Array.from(providers.values());
31
50
  }
32
51
  static async create({
33
52
  families,
@@ -39,19 +58,42 @@ class UnifontFontResolver {
39
58
  storage,
40
59
  // TODO: consider enabling, would require new astro errors
41
60
  throwOnError: false
42
- })
61
+ }),
62
+ hasher
43
63
  });
44
64
  }
45
65
  async resolveFont({
46
66
  familyName,
47
67
  provider,
68
+ options,
48
69
  ...rest
49
70
  }) {
50
- const { fonts } = await this.#unifont.resolveFont(familyName, rest, [provider]);
71
+ const { fonts } = await this.#unifont.resolveFont(
72
+ familyName,
73
+ {
74
+ // Options are currently namespaced by provider name, it may change in
75
+ // https://github.com/unjs/unifont/pull/287
76
+ options: {
77
+ [provider.name]: options
78
+ },
79
+ ...rest
80
+ },
81
+ [
82
+ UnifontFontResolver.idFromProvider({
83
+ hasher: this.#hasher,
84
+ provider
85
+ })
86
+ ]
87
+ );
51
88
  return fonts;
52
89
  }
53
90
  async listFonts({ provider }) {
54
- return await this.#unifont.listFonts([provider]);
91
+ return await this.#unifont.listFonts([
92
+ UnifontFontResolver.idFromProvider({
93
+ hasher: this.#hasher,
94
+ provider
95
+ })
96
+ ]);
55
97
  }
56
98
  }
57
99
  export {
@@ -1,12 +1,11 @@
1
1
  import type { Logger } from '../../core/logger/core.js';
2
- import type { CssRenderer, FontFileReader, FontMetricsResolver, FontResolver, FontTypeExtractor, Hasher, LocalProviderUrlResolver, RemoteFontProviderResolver, StringMatcher, SystemFallbacksProvider, UrlProxy } from './definitions.js';
3
- import type { ConsumableMap, CreateUrlProxyParams, Defaults, FontFamily, FontFileDataMap, InternalConsumableMap, ResolvedFontFamily } from './types.js';
2
+ import type { CssRenderer, FontFileReader, FontMetricsResolver, FontResolver, FontTypeExtractor, Hasher, LocalProviderUrlResolver, StringMatcher, SystemFallbacksProvider, UrlProxy } from './definitions.js';
3
+ import type { CreateUrlProxyParams, Defaults, FontDataRecord, FontFamily, FontFileDataMap, InternalConsumableMap, ResolvedFontFamily } from './types.js';
4
4
  /**
5
5
  * Manages how fonts are resolved:
6
6
  *
7
7
  * - families are resolved
8
- * - unifont providers are extracted from families
9
- * - unifont is initialized
8
+ * - font resolver is initialized
10
9
  *
11
10
  * For each family:
12
11
  * - We create a URL proxy
@@ -19,10 +18,9 @@ import type { ConsumableMap, CreateUrlProxyParams, Defaults, FontFamily, FontFil
19
18
  *
20
19
  * Once that's done, the collected data is returned
21
20
  */
22
- export declare function orchestrate({ families, hasher, remoteFontProviderResolver, localProviderUrlResolver, cssRenderer, systemFallbacksProvider, fontMetricsResolver, fontTypeExtractor, fontFileReader, logger, createUrlProxy, defaults, bold, stringMatcher, createFontResolver, }: {
21
+ export declare function orchestrate({ families, hasher, localProviderUrlResolver, cssRenderer, systemFallbacksProvider, fontMetricsResolver, fontTypeExtractor, fontFileReader, logger, createUrlProxy, defaults, bold, stringMatcher, createFontResolver, }: {
23
22
  families: Array<FontFamily>;
24
23
  hasher: Hasher;
25
- remoteFontProviderResolver: RemoteFontProviderResolver;
26
24
  localProviderUrlResolver: LocalProviderUrlResolver;
27
25
  cssRenderer: CssRenderer;
28
26
  systemFallbacksProvider: SystemFallbacksProvider;
@@ -40,5 +38,5 @@ export declare function orchestrate({ families, hasher, remoteFontProviderResolv
40
38
  }): Promise<{
41
39
  fontFileDataMap: FontFileDataMap;
42
40
  internalConsumableMap: InternalConsumableMap;
43
- consumableMap: ConsumableMap;
41
+ fontData: FontDataRecord;
44
42
  }>;