Home / File/ compute-font-families-assets.ts — astro Source File

compute-font-families-assets.ts — astro Source File

Architecture documentation for compute-font-families-assets.ts, a typescript file in the astro codebase. 6 imports, 0 dependents.

File typescript CoreAstro RenderingEngine 6 imports 1 functions

Entity Profile

Dependency Diagram

graph LR
  cdee4da8_e0b1_abf7_3abf_ee643402e96d["compute-font-families-assets.ts"]
  d3861967_b647_84d2_ff48_15013353bd56["../core/logger/core.js"]
  cdee4da8_e0b1_abf7_3abf_ee643402e96d --> d3861967_b647_84d2_ff48_15013353bd56
  e92fda44_4a5d_b83b_1a45_958cdae6c91b["./definitions.js"]
  cdee4da8_e0b1_abf7_3abf_ee643402e96d --> e92fda44_4a5d_b83b_1a45_958cdae6c91b
  ea387312_d0a2_bb52_dafc_3872f7307f95["../../src/assets/fonts/types.js"]
  cdee4da8_e0b1_abf7_3abf_ee643402e96d --> ea387312_d0a2_bb52_dafc_3872f7307f95
  28685c73_a9d0_3d9e_e6a1_3d0209745c56["./core/collect-font-assets-from-faces.js"]
  cdee4da8_e0b1_abf7_3abf_ee643402e96d --> 28685c73_a9d0_3d9e_e6a1_3d0209745c56
  206cdf73_1d30_d44a_eb5b_ba57eadaccd2["./core/filter-and-transform-font-faces.js"]
  cdee4da8_e0b1_abf7_3abf_ee643402e96d --> 206cdf73_1d30_d44a_eb5b_ba57eadaccd2
  944bc514_ae36_655b_b208_3e4e35faac0b["./core/get-or-create-font-family-assets.js"]
  cdee4da8_e0b1_abf7_3abf_ee643402e96d --> 944bc514_ae36_655b_b208_3e4e35faac0b
  style cdee4da8_e0b1_abf7_3abf_ee643402e96d fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import type { Logger } from '../../../core/logger/core.js';
import type { FontResolver, StringMatcher } from '../definitions.js';
import type {
	Collaborator,
	Defaults,
	FontFamilyAssetsByUniqueKey,
	FontFileById,
	ResolvedFontFamily,
} from '../types.js';
import type { collectFontAssetsFromFaces as _collectFontAssetsFromFaces } from './collect-font-assets-from-faces.js';
import type { filterAndTransformFontFaces as _filterAndTransformFontFaces } from './filter-and-transform-font-faces.js';
import type { getOrCreateFontFamilyAssets as _getOrCreateFontFamilyAssets } from './get-or-create-font-family-assets.js';

export async function computeFontFamiliesAssets({
	resolvedFamilies,
	fontResolver,
	logger,
	bold,
	defaults,
	stringMatcher,
	getOrCreateFontFamilyAssets,
	collectFontAssetsFromFaces,
	filterAndTransformFontFaces,
}: {
	resolvedFamilies: Array<ResolvedFontFamily>;
	fontResolver: FontResolver;
	logger: Logger;
	bold: (input: string) => string;
	defaults: Defaults;
	stringMatcher: StringMatcher;
	getOrCreateFontFamilyAssets: Collaborator<
		typeof _getOrCreateFontFamilyAssets,
		'family' | 'fontFamilyAssetsByUniqueKey'
	>;
	filterAndTransformFontFaces: Collaborator<
		typeof _filterAndTransformFontFaces,
		'family' | 'fonts'
	>;
	collectFontAssetsFromFaces: Collaborator<
		typeof _collectFontAssetsFromFaces,
		'family' | 'fonts' | 'collectedFontsIds' | 'fontFilesIds'
	>;
}) {
	/**
	 * Holds family data by a key, to allow merging families
	 */
	const fontFamilyAssetsByUniqueKey: FontFamilyAssetsByUniqueKey = new Map();

	/**
	 * Holds associations of id and original font file URLs, so they can be
	 * downloaded whenever the id is requested.
	 */
	const fontFileById: FontFileById = new Map();

	// First loop: we try to merge families. This is useful for advanced cases, where eg. you want
	// 500, 600, 700 as normal but also 500 as italic. That requires 2 families
	for (const family of resolvedFamilies) {
		const fontAssets = getOrCreateFontFamilyAssets({
			fontFamilyAssetsByUniqueKey,
			family,
		});

		const _fonts = await fontResolver.resolveFont({
			familyName: family.name,
			provider: family.provider,
			// We do not merge the defaults, we only provide defaults as a fallback
			weights: family.weights ?? defaults.weights,
			styles: family.styles ?? defaults.styles,
			subsets: family.subsets ?? defaults.subsets,
			formats: family.formats ?? defaults.formats,
			options: family.options,
		});
		if (_fonts.length === 0) {
			logger.warn(
				'assets',
				`No data found for font family ${bold(family.name)}. Review your configuration`,
			);
			const availableFamilies = await fontResolver.listFonts({ provider: family.provider });
			if (
				availableFamilies &&
				availableFamilies.length > 0 &&
				!availableFamilies.includes(family.name)
			) {
				logger.warn(
					'assets',
					`${bold(family.name)} font family cannot be retrieved by the provider. Did you mean ${bold(stringMatcher.getClosestMatch(family.name, availableFamilies))}?`,
				);
			}
			continue;
		}
		// The data returned by the provider contains original URLs. We proxy them.
		// TODO: dedupe?
		fontAssets.fonts.push(
			...filterAndTransformFontFaces({
				fonts: _fonts,
				family,
			}),
		);

		const result = collectFontAssetsFromFaces({
			fonts: fontAssets.fonts,
			family,
			fontFilesIds: new Set(fontFileById.keys()),
			collectedFontsIds: new Set(fontAssets.collectedFontsForMetricsByUniqueKey.keys()),
		});
		for (const [key, value] of result.fontFileById.entries()) {
			fontFileById.set(key, value);
		}
		for (const [key, value] of result.collectedFontsForMetricsByUniqueKey.entries()) {
			fontAssets.collectedFontsForMetricsByUniqueKey.set(key, value);
		}
		fontAssets.preloads.push(...result.preloads);
	}

	return { fontFamilyAssets: Array.from(fontFamilyAssetsByUniqueKey.values()), fontFileById };
}

Domain

Subdomains

Dependencies

  • ../../src/assets/fonts/types.js
  • ../core/logger/core.js
  • ./core/collect-font-assets-from-faces.js
  • ./core/filter-and-transform-font-faces.js
  • ./core/get-or-create-font-family-assets.js
  • ./definitions.js

Frequently Asked Questions

What does compute-font-families-assets.ts do?
compute-font-families-assets.ts is a source file in the astro codebase, written in typescript. It belongs to the CoreAstro domain, RenderingEngine subdomain.
What functions are defined in compute-font-families-assets.ts?
compute-font-families-assets.ts defines 1 function(s): computeFontFamiliesAssets.
What does compute-font-families-assets.ts depend on?
compute-font-families-assets.ts imports 6 module(s): ../../src/assets/fonts/types.js, ../core/logger/core.js, ./core/collect-font-assets-from-faces.js, ./core/filter-and-transform-font-faces.js, ./core/get-or-create-font-family-assets.js, ./definitions.js.
Where is compute-font-families-assets.ts in the architecture?
compute-font-families-assets.ts is located at packages/astro/src/assets/fonts/core/compute-font-families-assets.ts (domain: CoreAstro, subdomain: RenderingEngine, directory: packages/astro/src/assets/fonts/core).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free