Skip to content

Commit 9fa96b4

Browse files
committed
Initial Astro project setup and cleanup
Set up Astro project with configuration, ESLint, and Prettier. Added core components, layouts, and scripts for the HTMLHint Playground. Updated documentation, project rules, and .gitignore. Removed legacy docs assets and scripts to focus on the new Astro-based implementation.
1 parent 2af721d commit 9fa96b4

File tree

153 files changed

+8867
-9847
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

153 files changed

+8867
-9847
lines changed

.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/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/content.d.ts

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
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+
166+
};
167+
168+
type AnyEntryMap = ContentEntryMap & DataEntryMap;
169+
170+
type ExtractLoaderTypes<T> = T extends import('astro/loaders').LiveLoader<
171+
infer TData,
172+
infer TEntryFilter,
173+
infer TCollectionFilter,
174+
infer TError
175+
>
176+
? { data: TData; entryFilter: TEntryFilter; collectionFilter: TCollectionFilter; error: TError }
177+
: { data: never; entryFilter: never; collectionFilter: never; error: never };
178+
type ExtractDataType<T> = ExtractLoaderTypes<T>['data'];
179+
type ExtractEntryFilterType<T> = ExtractLoaderTypes<T>['entryFilter'];
180+
type ExtractCollectionFilterType<T> = ExtractLoaderTypes<T>['collectionFilter'];
181+
type ExtractErrorType<T> = ExtractLoaderTypes<T>['error'];
182+
183+
type LiveLoaderDataType<C extends keyof LiveContentConfig['collections']> =
184+
LiveContentConfig['collections'][C]['schema'] extends undefined
185+
? ExtractDataType<LiveContentConfig['collections'][C]['loader']>
186+
: import('astro/zod').infer<
187+
Exclude<LiveContentConfig['collections'][C]['schema'], undefined>
188+
>;
189+
type LiveLoaderEntryFilterType<C extends keyof LiveContentConfig['collections']> =
190+
ExtractEntryFilterType<LiveContentConfig['collections'][C]['loader']>;
191+
type LiveLoaderCollectionFilterType<C extends keyof LiveContentConfig['collections']> =
192+
ExtractCollectionFilterType<LiveContentConfig['collections'][C]['loader']>;
193+
type LiveLoaderErrorType<C extends keyof LiveContentConfig['collections']> = ExtractErrorType<
194+
LiveContentConfig['collections'][C]['loader']
195+
>;
196+
197+
export type ContentConfig = typeof import("./../src/content.config.mjs");
198+
export type LiveContentConfig = never;
199+
}

.astro/data-store.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[["Map",1,2],"meta::meta",["Map",3,4,5,6],"astro-version","5.12.0","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"site\":\"https://playground.htmlhint.com\",\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"attribute\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":{\"type\":\"shiki\",\"excludeLangs\":[\"math\"]},\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[],\"rehypePlugins\":[],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"rawEnvValues\":false},\"legacy\":{\"collections\":false}}"]

.astro/settings.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"_variables": {
3+
"lastUpdateCheck": 1753078438149
4+
}
5+
}

.astro/types.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/// <reference types="astro/client" />

.cursor/rules/general.mdc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ alwaysApply: true
1212
- Use latest Astro for building the website.
1313
- Locally host JS/CSS - don't use third-party CDNs.
1414
- All HTML must be accessible.
15+
- Use Bootstrap utility CSS classes for styling rather than custom CSS.

.eslintrc.cjs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module.exports = {
2+
extends: [
3+
'eslint:recommended',
4+
'@astrojs/eslint-config',
5+
'@typescript-eslint/recommended'
6+
],
7+
parser: '@typescript-eslint/parser',
8+
plugins: ['@typescript-eslint'],
9+
root: true,
10+
env: {
11+
node: true,
12+
browser: true,
13+
es2022: true
14+
}
15+
};

.github/copilot-instructions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
- All code should be formatted with Prettier.
66
- Use ESLint v8.57.1 to check for JavaScript errors.
77
- Node v22 is used for development.
8-
- Use Bootstrap v5.3.0 for styling.
8+
- Use Bootstrap v5.3.7 for styling.
99
- Use latest Astro for building the website.
1010
- Locally host JS/CSS - don't use third-party CDNs.
1111
- All HTML must be accessible.

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1+
dist/
12
node_modules/
3+
public/

0 commit comments

Comments
 (0)