summaryrefslogtreecommitdiff
path: root/website/src/loaders
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2026-06-18 19:21:59 +0100
committerJoe Carstairs <me@joeac.net>2026-06-18 19:21:59 +0100
commitca8e6824eaa711105f4092365792720c9dde026b (patch)
tree2b6493941352d11b799ee63d3f1311c13de649b8 /website/src/loaders
parenta0f25057283a397f006127b6f582d190d2c4294e (diff)
remove Astro website
Diffstat (limited to 'website/src/loaders')
-rw-r--r--website/src/loaders/extended-glob.d.ts18
-rw-r--r--website/src/loaders/extended-glob.js306
2 files changed, 0 insertions, 324 deletions
diff --git a/website/src/loaders/extended-glob.d.ts b/website/src/loaders/extended-glob.d.ts
deleted file mode 100644
index 87a4814..0000000
--- a/website/src/loaders/extended-glob.d.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * This file is edited from astro/loaders/glob.d.ts
- */
-
-import type { glob, Loader } from "astro/loaders";
-type GlobOptions = Parameters<typeof glob>[0];
-/**
- * Loads multiple entries, using a glob pattern to match files.
- * @param pattern A glob pattern to match files, relative to the content directory.
- * @param ignore Glob patterns to exclude from the matched results.
- */
-export declare function extendedGlob(
- globOptions: GlobOptions & {
- postprocessSlug?: (slug: string) => string;
- ignore?: string[];
- },
-): Loader;
-export {};
diff --git a/website/src/loaders/extended-glob.js b/website/src/loaders/extended-glob.js
deleted file mode 100644
index 53e36b6..0000000
--- a/website/src/loaders/extended-glob.js
+++ /dev/null
@@ -1,306 +0,0 @@
-/**
- * This file is edited from astro/loaders/glob.js
- */
-
-import { existsSync, promises as fs } from "node:fs";
-import { relative } from "node:path";
-import { fileURLToPath, pathToFileURL } from "node:url";
-import pLimit from "p-limit";
-import colors from "piccolore";
-import picomatch from "picomatch";
-import { glob as tinyglobby } from "tinyglobby";
-import {
- getContentEntryIdAndSlug,
- posixRelative,
-} from "../../node_modules/astro/dist/content/utils.js";
-function generateIdDefault({ entry, base, data }, postprocessSlug, isLegacy) {
- if (data.slug) {
- return data.slug;
- }
- const entryURL = new URL(encodeURI(entry), base);
- if (isLegacy) {
- const { id } = getContentEntryIdAndSlug({
- entry: entryURL,
- contentDir: base,
- collection: "",
- });
- return id;
- }
- const { slug } = getContentEntryIdAndSlug({
- entry: entryURL,
- contentDir: base,
- collection: "",
- });
- if (postprocessSlug) {
- return postprocessSlug(slug);
- }
- return slug;
-}
-function checkPrefix(pattern, prefix) {
- if (Array.isArray(pattern)) {
- return pattern.some((p) => p.startsWith(prefix));
- }
- return pattern.startsWith(prefix);
-}
-const secretLegacyFlag = /* @__PURE__ */ Symbol("astro.legacy-glob");
-function extendedGlob(globOptions) {
- if (checkPrefix(globOptions.pattern, "../")) {
- throw new Error(
- "Glob patterns cannot start with `../`. Set the `base` option to a parent directory instead.",
- );
- }
- if (checkPrefix(globOptions.pattern, "/")) {
- throw new Error(
- "Glob patterns cannot start with `/`. Set the `base` option to a parent directory or use a relative path instead.",
- );
- }
- const isLegacy = !!globOptions[secretLegacyFlag];
- const generateId =
- globOptions?.generateId ??
- ((opts) => generateIdDefault(opts, globOptions?.postprocessSlug, isLegacy));
- const fileToIdMap = /* @__PURE__ */ new Map();
- const ignore = globOptions.ignore || [];
- return {
- name: "extended-glob-loader",
- load: async ({
- config,
- collection,
- logger,
- watcher,
- parseData,
- store,
- generateDigest,
- entryTypes,
- }) => {
- const renderFunctionByContentType = /* @__PURE__ */ new WeakMap();
- const untouchedEntries = new Set(store.keys());
- async function syncData(entry, base, entryType, oldId) {
- if (!entryType) {
- logger.warn(`No entry type found for ${entry}`);
- return;
- }
- const fileUrl = new URL(encodeURI(entry), base);
- const contents = await fs.readFile(fileUrl, "utf-8").catch((err) => {
- logger.error(`Error reading ${entry}: ${err.message}`);
- return;
- });
- if (!contents && contents !== "") {
- logger.warn(`No contents found for ${entry}`);
- return;
- }
- const { body, data } = await entryType.getEntryInfo({
- contents,
- fileUrl,
- });
- const id = generateId({ entry, base, data });
- if (oldId && oldId !== id) {
- store.delete(oldId);
- }
- untouchedEntries.delete(id);
- const existingEntry = store.get(id);
- const digest = generateDigest(contents);
- const filePath2 = fileURLToPath(fileUrl);
- if (
- existingEntry &&
- existingEntry.digest === digest &&
- existingEntry.filePath
- ) {
- if (existingEntry.deferredRender) {
- store.addModuleImport(existingEntry.filePath);
- }
- if (existingEntry.assetImports?.length) {
- store.addAssetImports(
- existingEntry.assetImports,
- existingEntry.filePath,
- );
- }
- fileToIdMap.set(filePath2, id);
- return;
- }
- const relativePath2 = posixRelative(
- fileURLToPath(config.root),
- filePath2,
- );
- const parsedData = await parseData({
- id,
- data,
- filePath: filePath2,
- });
- if (
- existingEntry &&
- existingEntry.filePath &&
- existingEntry.filePath !== relativePath2
- ) {
- const oldFilePath = new URL(existingEntry.filePath, config.root);
- if (existsSync(oldFilePath)) {
- logger.warn(
- `Duplicate id "${id}" found in ${filePath2}. Later items with the same id will overwrite earlier ones.`,
- );
- }
- }
- if (entryType.getRenderFunction) {
- let render = renderFunctionByContentType.get(entryType);
- if (!render) {
- render = await entryType.getRenderFunction(config);
- renderFunctionByContentType.set(entryType, render);
- }
- let rendered = void 0;
- try {
- rendered = await render?.({
- id,
- data,
- body,
- filePath: filePath2,
- digest,
- });
- } catch (error) {
- logger.error(`Error rendering ${entry}: ${error.message}`);
- }
- store.set({
- id,
- data: parsedData,
- body: globOptions.retainBody === false ? void 0 : body,
- filePath: relativePath2,
- digest,
- rendered,
- assetImports: rendered?.metadata?.imagePaths,
- });
- } else if ("contentModuleTypes" in entryType) {
- store.set({
- id,
- data: parsedData,
- body: globOptions.retainBody === false ? void 0 : body,
- filePath: relativePath2,
- digest,
- deferredRender: true,
- });
- } else {
- store.set({
- id,
- data: parsedData,
- body: globOptions.retainBody === false ? void 0 : body,
- filePath: relativePath2,
- digest,
- });
- }
- fileToIdMap.set(filePath2, id);
- }
- let baseDir;
- if (isLegacy && !globOptions.base) {
- baseDir = new URL(`./src/content/${collection}`, config.root);
- } else {
- baseDir = globOptions.base
- ? new URL(globOptions.base, config.root)
- : config.root;
- }
- if (!baseDir.pathname.endsWith("/")) {
- baseDir.pathname = `${baseDir.pathname}/`;
- }
- const filePath = fileURLToPath(baseDir);
- const relativePath = relative(fileURLToPath(config.root), filePath);
- const exists = existsSync(baseDir);
- if (!exists) {
- logger.warn(
- `The base directory "${fileURLToPath(baseDir)}" does not exist.`,
- );
- }
- const files = await tinyglobby(globOptions.pattern, {
- cwd: fileURLToPath(baseDir),
- expandDirectories: false,
- ignore,
- });
- if (exists && files.length === 0) {
- logger.warn(
- `No files found matching "${globOptions.pattern}" in directory "${relativePath}"`,
- );
- return;
- }
- function configForFile(file) {
- const ext = file.split(".").at(-1);
- if (!ext) {
- logger.warn(`No extension found for ${file}`);
- return;
- }
- return entryTypes.get(`.${ext}`);
- }
- const limit = pLimit(10);
- const skippedFiles = [];
- const contentDir = new URL("content/", config.srcDir);
- const configFiles = new Set(
- ["config.js", "config.ts", "config.mjs"].map(
- (file) => new URL(file, contentDir).href,
- ),
- );
- function isConfigFile(file) {
- const fileUrl = new URL(file, baseDir);
- return configFiles.has(fileUrl.href);
- }
- await Promise.all(
- files.map((entry) => {
- if (isConfigFile(entry)) {
- return;
- }
- return limit(async () => {
- const entryType = configForFile(entry);
- await syncData(entry, baseDir, entryType);
- });
- }),
- );
- const skipCount = skippedFiles.length;
- if (skipCount > 0) {
- const patternList = Array.isArray(globOptions.pattern)
- ? globOptions.pattern.join(", ")
- : globOptions.pattern;
- logger.warn(
- `The glob() loader cannot be used for files in ${colors.bold("src/content")} when legacy mode is enabled.`,
- );
- if (skipCount > 10) {
- logger.warn(
- `Skipped ${colors.green(skippedFiles.length)} files that matched ${colors.green(patternList)}.`,
- );
- } else {
- logger.warn(
- `Skipped the following files that matched ${colors.green(patternList)}:`,
- );
- skippedFiles.forEach((file) =>
- logger.warn(`\u2022 ${colors.green(file)}`),
- );
- }
- }
- untouchedEntries.forEach((id) => store.delete(id));
- if (!watcher) {
- return;
- }
- watcher.add(filePath);
- const matchesGlob = (entry) =>
- !entry.startsWith("../") &&
- picomatch.isMatch(entry, globOptions.pattern);
- const basePath = fileURLToPath(baseDir);
- async function onChange(changedPath) {
- const entry = posixRelative(basePath, changedPath);
- if (!matchesGlob(entry)) {
- return;
- }
- const entryType = configForFile(changedPath);
- const baseUrl = pathToFileURL(basePath);
- const oldId = fileToIdMap.get(changedPath);
- await syncData(entry, baseUrl, entryType, oldId);
- logger.info(`Reloaded data from ${colors.green(entry)}`);
- }
- watcher.on("change", onChange);
- watcher.on("add", onChange);
- watcher.on("unlink", async (deletedPath) => {
- const entry = posixRelative(basePath, deletedPath);
- if (!matchesGlob(entry)) {
- return;
- }
- const id = fileToIdMap.get(deletedPath);
- if (id) {
- store.delete(id);
- fileToIdMap.delete(deletedPath);
- }
- });
- },
- };
-}
-export { extendedGlob, secretLegacyFlag };