Skip to content

Commit 6efdddc

Browse files
Copilotimbant
andcommitted
Initial Astro blog setup with sample content migration
Co-authored-by: imbant <[email protected]>
1 parent 77d62b3 commit 6efdddc

File tree

29 files changed

+6992
-0
lines changed

29 files changed

+6992
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
{
2+
"$ref": "#/definitions/blog",
3+
"definitions": {
4+
"blog": {
5+
"type": "object",
6+
"properties": {
7+
"title": {
8+
"type": "string"
9+
},
10+
"description": {
11+
"type": "string"
12+
},
13+
"date": {
14+
"anyOf": [
15+
{
16+
"type": "string",
17+
"format": "date-time"
18+
},
19+
{
20+
"type": "string",
21+
"format": "date"
22+
},
23+
{
24+
"type": "integer",
25+
"format": "unix-time"
26+
}
27+
]
28+
},
29+
"tags": {
30+
"type": "array",
31+
"items": {
32+
"type": "string"
33+
}
34+
},
35+
"categories": {
36+
"type": "array",
37+
"items": {
38+
"type": "string"
39+
}
40+
},
41+
"mathjax": {
42+
"type": "boolean"
43+
},
44+
"toc": {
45+
"type": "boolean"
46+
},
47+
"comments": {
48+
"type": "boolean",
49+
"default": true
50+
},
51+
"$schema": {
52+
"type": "string"
53+
}
54+
},
55+
"required": [
56+
"title",
57+
"date"
58+
],
59+
"additionalProperties": false
60+
}
61+
},
62+
"$schema": "http://json-schema.org/draft-07/schema#"
63+
}

astro-blog/.astro/content-assets.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default new Map();

astro-blog/.astro/content-modules.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default new Map();

astro-blog/.astro/content.d.ts

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
declare module 'astro:content' {
2+
export interface RenderResult {
3+
Content: import('astro/runtime/server/index.js').AstroComponentFactory;
4+
headings: import('astro').MarkdownHeading[];
5+
remarkPluginFrontmatter: Record<string, any>;
6+
}
7+
interface Render {
8+
'.md': Promise<RenderResult>;
9+
}
10+
11+
export interface RenderedContent {
12+
html: string;
13+
metadata?: {
14+
imagePaths: Array<string>;
15+
[key: string]: unknown;
16+
};
17+
}
18+
}
19+
20+
declare module 'astro:content' {
21+
type Flatten<T> = T extends { [K: string]: infer U } ? U : never;
22+
23+
export type CollectionKey = keyof AnyEntryMap;
24+
export type CollectionEntry<C extends CollectionKey> = Flatten<AnyEntryMap[C]>;
25+
26+
export type ContentCollectionKey = keyof ContentEntryMap;
27+
export type DataCollectionKey = keyof DataEntryMap;
28+
29+
type AllValuesOf<T> = T extends any ? T[keyof T] : never;
30+
type ValidContentEntrySlug<C extends keyof ContentEntryMap> = AllValuesOf<
31+
ContentEntryMap[C]
32+
>['slug'];
33+
34+
export type ReferenceDataEntry<
35+
C extends CollectionKey,
36+
E extends keyof DataEntryMap[C] = string,
37+
> = {
38+
collection: C;
39+
id: E;
40+
};
41+
export type ReferenceContentEntry<
42+
C extends keyof ContentEntryMap,
43+
E extends ValidContentEntrySlug<C> | (string & {}) = string,
44+
> = {
45+
collection: C;
46+
slug: E;
47+
};
48+
export type ReferenceLiveEntry<C extends keyof LiveContentConfig['collections']> = {
49+
collection: C;
50+
id: string;
51+
};
52+
53+
/** @deprecated Use `getEntry` instead. */
54+
export function getEntryBySlug<
55+
C extends keyof ContentEntryMap,
56+
E extends ValidContentEntrySlug<C> | (string & {}),
57+
>(
58+
collection: C,
59+
// Note that this has to accept a regular string too, for SSR
60+
entrySlug: E,
61+
): E extends ValidContentEntrySlug<C>
62+
? Promise<CollectionEntry<C>>
63+
: Promise<CollectionEntry<C> | undefined>;
64+
65+
/** @deprecated Use `getEntry` instead. */
66+
export function getDataEntryById<C extends keyof DataEntryMap, E extends keyof DataEntryMap[C]>(
67+
collection: C,
68+
entryId: E,
69+
): Promise<CollectionEntry<C>>;
70+
71+
export function getCollection<C extends keyof AnyEntryMap, E extends CollectionEntry<C>>(
72+
collection: C,
73+
filter?: (entry: CollectionEntry<C>) => entry is E,
74+
): Promise<E[]>;
75+
export function getCollection<C extends keyof AnyEntryMap>(
76+
collection: C,
77+
filter?: (entry: CollectionEntry<C>) => unknown,
78+
): Promise<CollectionEntry<C>[]>;
79+
80+
export function getLiveCollection<C extends keyof LiveContentConfig['collections']>(
81+
collection: C,
82+
filter?: LiveLoaderCollectionFilterType<C>,
83+
): Promise<
84+
import('astro').LiveDataCollectionResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>
85+
>;
86+
87+
export function getEntry<
88+
C extends keyof ContentEntryMap,
89+
E extends ValidContentEntrySlug<C> | (string & {}),
90+
>(
91+
entry: ReferenceContentEntry<C, E>,
92+
): E extends ValidContentEntrySlug<C>
93+
? Promise<CollectionEntry<C>>
94+
: Promise<CollectionEntry<C> | undefined>;
95+
export function getEntry<
96+
C extends keyof DataEntryMap,
97+
E extends keyof DataEntryMap[C] | (string & {}),
98+
>(
99+
entry: ReferenceDataEntry<C, E>,
100+
): E extends keyof DataEntryMap[C]
101+
? Promise<DataEntryMap[C][E]>
102+
: Promise<CollectionEntry<C> | undefined>;
103+
export function getEntry<
104+
C extends keyof ContentEntryMap,
105+
E extends ValidContentEntrySlug<C> | (string & {}),
106+
>(
107+
collection: C,
108+
slug: E,
109+
): E extends ValidContentEntrySlug<C>
110+
? Promise<CollectionEntry<C>>
111+
: Promise<CollectionEntry<C> | undefined>;
112+
export function getEntry<
113+
C extends keyof DataEntryMap,
114+
E extends keyof DataEntryMap[C] | (string & {}),
115+
>(
116+
collection: C,
117+
id: E,
118+
): E extends keyof DataEntryMap[C]
119+
? string extends keyof DataEntryMap[C]
120+
? Promise<DataEntryMap[C][E]> | undefined
121+
: Promise<DataEntryMap[C][E]>
122+
: Promise<CollectionEntry<C> | undefined>;
123+
export function getLiveEntry<C extends keyof LiveContentConfig['collections']>(
124+
collection: C,
125+
filter: string | LiveLoaderEntryFilterType<C>,
126+
): Promise<import('astro').LiveDataEntryResult<LiveLoaderDataType<C>, LiveLoaderErrorType<C>>>;
127+
128+
/** Resolve an array of entry references from the same collection */
129+
export function getEntries<C extends keyof ContentEntryMap>(
130+
entries: ReferenceContentEntry<C, ValidContentEntrySlug<C>>[],
131+
): Promise<CollectionEntry<C>[]>;
132+
export function getEntries<C extends keyof DataEntryMap>(
133+
entries: ReferenceDataEntry<C, keyof DataEntryMap[C]>[],
134+
): Promise<CollectionEntry<C>[]>;
135+
136+
export function render<C extends keyof AnyEntryMap>(
137+
entry: AnyEntryMap[C][string],
138+
): Promise<RenderResult>;
139+
140+
export function reference<C extends keyof AnyEntryMap>(
141+
collection: C,
142+
): import('astro/zod').ZodEffects<
143+
import('astro/zod').ZodString,
144+
C extends keyof ContentEntryMap
145+
? ReferenceContentEntry<C, ValidContentEntrySlug<C>>
146+
: ReferenceDataEntry<C, keyof DataEntryMap[C]>
147+
>;
148+
// Allow generic `string` to avoid excessive type errors in the config
149+
// if `dev` is not running to update as you edit.
150+
// Invalid collection names will be caught at build time.
151+
export function reference<C extends string>(
152+
collection: C,
153+
): import('astro/zod').ZodEffects<import('astro/zod').ZodString, never>;
154+
155+
type ReturnTypeOrOriginal<T> = T extends (...args: any[]) => infer R ? R : T;
156+
type InferEntrySchema<C extends keyof AnyEntryMap> = import('astro/zod').infer<
157+
ReturnTypeOrOriginal<Required<ContentConfig['collections'][C]>['schema']>
158+
>;
159+
160+
type ContentEntryMap = {
161+
162+
};
163+
164+
type DataEntryMap = {
165+
"blog": Record<string, {
166+
id: string;
167+
render(): Render[".md"];
168+
slug: string;
169+
body: string;
170+
collection: "blog";
171+
data: InferEntrySchema<"blog">;
172+
rendered?: RenderedContent;
173+
filePath?: string;
174+
}>;
175+
176+
};
177+
178+
type AnyEntryMap = ContentEntryMap & DataEntryMap;
179+
180+
type ExtractLoaderTypes<T> = T extends import('astro/loaders').LiveLoader<
181+
infer TData,
182+
infer TEntryFilter,
183+
infer TCollectionFilter,
184+
infer TError
185+
>
186+
? { data: TData; entryFilter: TEntryFilter; collectionFilter: TCollectionFilter; error: TError }
187+
: { data: never; entryFilter: never; collectionFilter: never; error: never };
188+
type ExtractDataType<T> = ExtractLoaderTypes<T>['data'];
189+
type ExtractEntryFilterType<T> = ExtractLoaderTypes<T>['entryFilter'];
190+
type ExtractCollectionFilterType<T> = ExtractLoaderTypes<T>['collectionFilter'];
191+
type ExtractErrorType<T> = ExtractLoaderTypes<T>['error'];
192+
193+
type LiveLoaderDataType<C extends keyof LiveContentConfig['collections']> =
194+
LiveContentConfig['collections'][C]['schema'] extends undefined
195+
? ExtractDataType<LiveContentConfig['collections'][C]['loader']>
196+
: import('astro/zod').infer<
197+
Exclude<LiveContentConfig['collections'][C]['schema'], undefined>
198+
>;
199+
type LiveLoaderEntryFilterType<C extends keyof LiveContentConfig['collections']> =
200+
ExtractEntryFilterType<LiveContentConfig['collections'][C]['loader']>;
201+
type LiveLoaderCollectionFilterType<C extends keyof LiveContentConfig['collections']> =
202+
ExtractCollectionFilterType<LiveContentConfig['collections'][C]['loader']>;
203+
type LiveLoaderErrorType<C extends keyof LiveContentConfig['collections']> = ExtractErrorType<
204+
LiveContentConfig['collections'][C]['loader']
205+
>;
206+
207+
export type ContentConfig = typeof import("../src/content/config.js");
208+
export type LiveContentConfig = never;
209+
}

astro-blog/.astro/data-store.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

astro-blog/.astro/types.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/// <reference types="astro/client" />
2+
/// <reference path="content.d.ts" />

astro-blog/astro.config.mjs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { defineConfig } from 'astro/config';
2+
import rss from '@astrojs/rss';
3+
import sitemap from '@astrojs/sitemap';
4+
5+
// https://astro.build/config
6+
export default defineConfig({
7+
site: 'https://imbant.github.io',
8+
base: '/blog',
9+
integrations: [sitemap()],
10+
markdown: {
11+
shikiConfig: {
12+
theme: 'github-light',
13+
wrap: true
14+
}
15+
}
16+
});

0 commit comments

Comments
 (0)