feat: generate .md
types override
This commit is contained in:
parent
3408e9cb8b
commit
a94e354832
10 changed files with 61 additions and 39 deletions
|
@ -6,3 +6,4 @@ export const STYLES_PLACEHOLDER = '@@ASTRO-STYLES@@';
|
||||||
export const SCRIPTS_PLACEHOLDER = '@@ASTRO-SCRIPTS@@';
|
export const SCRIPTS_PLACEHOLDER = '@@ASTRO-SCRIPTS@@';
|
||||||
|
|
||||||
export const CONTENT_TYPES_FILE = 'types.d.ts';
|
export const CONTENT_TYPES_FILE = 'types.d.ts';
|
||||||
|
export const MARKDOWN_CONTENT_ENTRY_TYPE_NAME = 'astro:markdown';
|
||||||
|
|
|
@ -6,6 +6,7 @@ export {
|
||||||
getDotAstroTypeReference,
|
getDotAstroTypeReference,
|
||||||
hasMdContentEntryTypeOverride,
|
hasMdContentEntryTypeOverride,
|
||||||
} from './utils.js';
|
} from './utils.js';
|
||||||
|
export { getMarkdownContentEntryType } from './markdown.js';
|
||||||
export { astroContentAssetPropagationPlugin } from './vite-plugin-content-assets.js';
|
export { astroContentAssetPropagationPlugin } from './vite-plugin-content-assets.js';
|
||||||
export { astroContentImportPlugin } from './vite-plugin-content-imports.js';
|
export { astroContentImportPlugin } from './vite-plugin-content-imports.js';
|
||||||
export { astroContentVirtualModPlugin } from './vite-plugin-content-virtual-mod.js';
|
export { astroContentVirtualModPlugin } from './vite-plugin-content-virtual-mod.js';
|
||||||
|
|
29
packages/astro/src/content/markdown.ts
Normal file
29
packages/astro/src/content/markdown.ts
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
import type fsMod from 'node:fs';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
import { AstroConfig, ContentEntryType } from '../@types/astro.js';
|
||||||
|
import { getContentPaths, parseFrontmatter } from './utils.js';
|
||||||
|
import { MARKDOWN_CONTENT_ENTRY_TYPE_NAME } from './consts.js';
|
||||||
|
|
||||||
|
export async function getMarkdownContentEntryType(
|
||||||
|
config: Pick<AstroConfig, 'root' | 'srcDir'>,
|
||||||
|
fs: typeof fsMod
|
||||||
|
): Promise<ContentEntryType> {
|
||||||
|
const contentPaths = getContentPaths(config, fs);
|
||||||
|
return {
|
||||||
|
name: MARKDOWN_CONTENT_ENTRY_TYPE_NAME,
|
||||||
|
extensions: ['.md'],
|
||||||
|
async getEntryInfo({ fileUrl, contents }: { fileUrl: URL; contents: string }) {
|
||||||
|
const parsed = parseFrontmatter(contents, fileURLToPath(fileUrl));
|
||||||
|
return {
|
||||||
|
data: parsed.data,
|
||||||
|
body: parsed.content,
|
||||||
|
slug: parsed.data.slug,
|
||||||
|
rawData: parsed.matter,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
contentModuleTypes: await fs.promises.readFile(
|
||||||
|
new URL('./markdown-types.d.ts', contentPaths.templateDir),
|
||||||
|
'utf-8'
|
||||||
|
),
|
||||||
|
};
|
||||||
|
}
|
9
packages/astro/src/content/template/markdown-types.d.ts
vendored
Normal file
9
packages/astro/src/content/template/markdown-types.d.ts
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
declare module 'astro:content' {
|
||||||
|
interface Render {
|
||||||
|
'.md': Promise<{
|
||||||
|
Content: import('astro').MarkdownInstance<{}>['Content'];
|
||||||
|
headings: import('astro').MarkdownHeading[];
|
||||||
|
remarkPluginFrontmatter: Record<string, any>;
|
||||||
|
}>;
|
||||||
|
}
|
||||||
|
}
|
10
packages/astro/src/content/template/types.d.ts
vendored
10
packages/astro/src/content/template/types.d.ts
vendored
|
@ -1,13 +1,3 @@
|
||||||
declare module 'astro:content' {
|
|
||||||
interface Render {
|
|
||||||
'.md': Promise<{
|
|
||||||
Content: import('astro').MarkdownInstance<{}>['Content'];
|
|
||||||
headings: import('astro').MarkdownHeading[];
|
|
||||||
remarkPluginFrontmatter: Record<string, any>;
|
|
||||||
}>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module 'astro:content' {
|
declare module 'astro:content' {
|
||||||
export { z } from 'astro/zod';
|
export { z } from 'astro/zod';
|
||||||
export type CollectionEntry<C extends keyof typeof entryMap> =
|
export type CollectionEntry<C extends keyof typeof entryMap> =
|
||||||
|
|
|
@ -7,8 +7,7 @@ import { ErrorPayload as ViteErrorPayload, normalizePath, ViteDevServer } from '
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
import { AstroConfig, AstroSettings } from '../@types/astro.js';
|
import { AstroConfig, AstroSettings } from '../@types/astro.js';
|
||||||
import { AstroError, AstroErrorData } from '../core/errors/index.js';
|
import { AstroError, AstroErrorData } from '../core/errors/index.js';
|
||||||
import { MARKDOWN_CONTENT_ENTRY_TYPE_NAME } from '../vite-plugin-markdown/content-entry-type.js';
|
import { CONTENT_TYPES_FILE, MARKDOWN_CONTENT_ENTRY_TYPE_NAME } from './consts.js';
|
||||||
import { CONTENT_TYPES_FILE } from './consts.js';
|
|
||||||
|
|
||||||
export const collectionConfigParser = z.object({
|
export const collectionConfigParser = z.object({
|
||||||
schema: z.any().optional(),
|
schema: z.any().optional(),
|
||||||
|
@ -313,6 +312,7 @@ export function contentObservable(initialCtx: ContentCtx): ContentObservable {
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ContentPaths = {
|
export type ContentPaths = {
|
||||||
|
templateDir: URL;
|
||||||
contentDir: URL;
|
contentDir: URL;
|
||||||
cacheDir: URL;
|
cacheDir: URL;
|
||||||
typesTemplate: URL;
|
typesTemplate: URL;
|
||||||
|
@ -330,6 +330,7 @@ export function getContentPaths(
|
||||||
const configStats = search(fs, srcDir);
|
const configStats = search(fs, srcDir);
|
||||||
const templateDir = new URL('../../src/content/template/', import.meta.url);
|
const templateDir = new URL('../../src/content/template/', import.meta.url);
|
||||||
return {
|
return {
|
||||||
|
templateDir,
|
||||||
cacheDir: new URL('.astro/', root),
|
cacheDir: new URL('.astro/', root),
|
||||||
contentDir: new URL('./content/', srcDir),
|
contentDir: new URL('./content/', srcDir),
|
||||||
typesTemplate: new URL('types.d.ts', templateDir),
|
typesTemplate: new URL('types.d.ts', templateDir),
|
||||||
|
|
|
@ -5,7 +5,6 @@ import { fileURLToPath, pathToFileURL } from 'url';
|
||||||
import jsxRenderer from '../../jsx/renderer.js';
|
import jsxRenderer from '../../jsx/renderer.js';
|
||||||
import { createDefaultDevConfig } from './config.js';
|
import { createDefaultDevConfig } from './config.js';
|
||||||
import { loadTSConfig } from './tsconfig.js';
|
import { loadTSConfig } from './tsconfig.js';
|
||||||
import { markdownContentEntryType } from '../../vite-plugin-markdown/content-entry-type.js';
|
|
||||||
|
|
||||||
export function createBaseSettings(config: AstroConfig): AstroSettings {
|
export function createBaseSettings(config: AstroConfig): AstroSettings {
|
||||||
return {
|
return {
|
||||||
|
@ -16,7 +15,7 @@ export function createBaseSettings(config: AstroConfig): AstroSettings {
|
||||||
adapter: undefined,
|
adapter: undefined,
|
||||||
injectedRoutes: [],
|
injectedRoutes: [],
|
||||||
pageExtensions: ['.astro', '.html', ...SUPPORTED_MARKDOWN_FILE_EXTENSIONS],
|
pageExtensions: ['.astro', '.html', ...SUPPORTED_MARKDOWN_FILE_EXTENSIONS],
|
||||||
contentEntryTypes: [markdownContentEntryType],
|
contentEntryTypes: [],
|
||||||
renderers: [jsxRenderer],
|
renderers: [jsxRenderer],
|
||||||
scripts: [],
|
scripts: [],
|
||||||
watchFiles: [],
|
watchFiles: [],
|
||||||
|
|
|
@ -12,10 +12,12 @@ import {
|
||||||
HookParameters,
|
HookParameters,
|
||||||
RouteData,
|
RouteData,
|
||||||
} from '../@types/astro.js';
|
} from '../@types/astro.js';
|
||||||
|
import { hasMdContentEntryTypeOverride } from '../content/utils.js';
|
||||||
import type { SerializedSSRManifest } from '../core/app/types';
|
import type { SerializedSSRManifest } from '../core/app/types';
|
||||||
import type { PageBuildData } from '../core/build/types';
|
import type { PageBuildData } from '../core/build/types';
|
||||||
import { mergeConfig } from '../core/config/config.js';
|
import { mergeConfig } from '../core/config/config.js';
|
||||||
import { info, LogOptions } from '../core/logger/core.js';
|
import { info, LogOptions } from '../core/logger/core.js';
|
||||||
|
import { getMarkdownContentEntryType } from '../content/index.js';
|
||||||
|
|
||||||
async function withTakingALongTimeMsg<T>({
|
async function withTakingALongTimeMsg<T>({
|
||||||
name,
|
name,
|
||||||
|
@ -126,6 +128,12 @@ export async function runHookConfigSetup({
|
||||||
}
|
}
|
||||||
|
|
||||||
updatedSettings.config = updatedConfig;
|
updatedSettings.config = updatedConfig;
|
||||||
|
if (!hasMdContentEntryTypeOverride(updatedSettings)) {
|
||||||
|
updatedSettings.contentEntryTypes.push(
|
||||||
|
await getMarkdownContentEntryType(updatedSettings.config, fs)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return updatedSettings;
|
return updatedSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
import { fileURLToPath } from 'node:url';
|
|
||||||
import { ContentEntryType } from '../@types/astro.js';
|
|
||||||
import { parseFrontmatter } from '../content/utils.js';
|
|
||||||
|
|
||||||
export const MARKDOWN_CONTENT_ENTRY_TYPE_NAME = 'astro:markdown';
|
|
||||||
|
|
||||||
export const markdownContentEntryType: ContentEntryType = {
|
|
||||||
name: MARKDOWN_CONTENT_ENTRY_TYPE_NAME,
|
|
||||||
extensions: ['.md'],
|
|
||||||
async getEntryInfo({ fileUrl, contents }: { fileUrl: URL; contents: string }) {
|
|
||||||
const parsed = parseFrontmatter(contents, fileURLToPath(fileUrl));
|
|
||||||
return {
|
|
||||||
data: parsed.data,
|
|
||||||
body: parsed.content,
|
|
||||||
slug: parsed.data.slug,
|
|
||||||
rawData: parsed.matter,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -9,12 +9,15 @@ declare module 'astro:content' {
|
||||||
}): Record<string, any>;
|
}): Record<string, any>;
|
||||||
};
|
};
|
||||||
|
|
||||||
interface Render {
|
type RenderResult = Promise<{
|
||||||
'.mdoc': Promise<{
|
|
||||||
Content(props: {
|
Content(props: {
|
||||||
config?: import('@astrojs/markdoc').MarkdocConfig;
|
config?: import('@astrojs/markdoc').MarkdocConfig;
|
||||||
components?: Record<string, ComponentRenderer>;
|
components?: Record<string, ComponentRenderer>;
|
||||||
}): import('astro').MarkdownInstance<{}>['Content'];
|
}): import('astro').MarkdownInstance<{}>['Content'];
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
interface Render {
|
||||||
|
'.md': RenderResult;
|
||||||
|
'.mdoc': RenderResult;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue