/
githubmirror
/
bootstrap
Обзор
Документация
Войти
/
githubmirror
/
bootstrap
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
site/src/libs/examples.ts
74 строки
2 KB
Louis-Maxime Piton
Docs: fix local assets path handling for Windows compatibility (#41485)
25 май 2025, 15:20
Не верифицирован
25 май 2025, 15:20
d6ca5ba
Код
Авторство
О чём код?
import type { AstroInstance } from 'astro' import fs from 'node:fs' import path from 'node:path' import { z } from 'zod' import { getDocsFsPath } from './path' export const exampleFrontmatterSchema = z.object({ body_class: z.string().optional(), direction: z.literal('rtl').optional(), extra_css: z.string().array().optional(), extra_js: z .object({ async: z.boolean().optional(), integrity: z.string().optional(), src: z.string() }) .array() .optional(), html_class: z.string().optional(), include_js: z.boolean().optional(), title: z.string() }) export type ExampleFrontmatter = z.infer<typeof exampleFrontmatterSchema> export function getExamplesAssets() { const source = path.join(getDocsFsPath(), 'src/assets/examples') return getExamplesAssetsRecursively(source) } export function getAliasedExamplesPages(pages: AstroInstance[]) { return pages.filter(isAliasedAstroInstance) } export function getExampleNameFromPagePath(examplePath: string) { const matches = examplePath.match(/([^/]+)\/(?:[^/]+)\.astro$/) if (!matches || !matches[1]) { throw new Error(`Failed to get example name from path: '${examplePath}'.`) } return matches[1] } function getExamplesAssetsRecursively(source: string, assets: string[] = []) { const entries = fs.readdirSync(source, { withFileTypes: true }) for (const entry of entries) { if (entry.isFile() && !entry.name.endsWith('.astro')) { assets.push(sanitizeAssetPath(path.join(source, entry.name))) } else if (entry.isDirectory()) { getExamplesAssetsRecursively(path.join(source, entry.name), assets) } } return assets } function sanitizeAssetPath(assetPath: string) { const matches = assetPath.match(/([^\/\\]+[\/\\][^\/\\]+\.\w+)$/) if (!matches || !matches[1]) { throw new Error(`Failed to get example asset path from path: '${assetPath}'.`) } return matches[1].replaceAll('\\', '/') } function isAliasedAstroInstance(page: AstroInstance): page is AliasedAstroInstance { return (page as AliasedAstroInstance).aliases !== undefined } type AliasedAstroInstance = AstroInstance & { aliases: string | string[] }