format: apply repo prettier (3.8.1) to the folded skills tree
963 markdown files reformatted with the repository's pinned prettier so pnpm format:check covers the folded tree like every other repo file. The formatter's embedded-language pass also normalized code fences (TS semicolons, closed HTML tags in examples, lowercased CSS hex colors, one renumbered list that skipped an index). Alphanumeric token deltas vs the fold commit were audited file-by-file; all are formatter-equivalent markup normalizations plus the four sanitized skills.
This commit is contained in:
@@ -17,17 +17,17 @@ export default {
|
||||
load() {
|
||||
return {
|
||||
hello: 'world',
|
||||
timestamp: Date.now()
|
||||
}
|
||||
}
|
||||
}
|
||||
timestamp: Date.now(),
|
||||
};
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
Import the `data` named export:
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
import { data } from './example.data.ts'
|
||||
import { data } from './example.data.ts';
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -43,10 +43,10 @@ Fetch remote data:
|
||||
// api.data.ts
|
||||
export default {
|
||||
async load() {
|
||||
const response = await fetch('https://api.example.com/data')
|
||||
return response.json()
|
||||
}
|
||||
}
|
||||
const response = await fetch('https://api.example.com/data');
|
||||
return response.json();
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
## Local Files with Watch
|
||||
@@ -55,21 +55,21 @@ Process local files with hot reload:
|
||||
|
||||
```ts
|
||||
// posts.data.ts
|
||||
import fs from 'node:fs'
|
||||
import { parse } from 'csv-parse/sync'
|
||||
import fs from 'node:fs';
|
||||
import { parse } from 'csv-parse/sync';
|
||||
|
||||
export default {
|
||||
watch: ['./data/*.csv'],
|
||||
load(watchedFiles) {
|
||||
// watchedFiles = array of absolute paths
|
||||
return watchedFiles.map(file => {
|
||||
return watchedFiles.map((file) => {
|
||||
return parse(fs.readFileSync(file, 'utf-8'), {
|
||||
columns: true,
|
||||
skip_empty_lines: true
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
skip_empty_lines: true,
|
||||
});
|
||||
});
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
## createContentLoader
|
||||
@@ -78,20 +78,20 @@ Helper for loading markdown content (common for blogs/archives):
|
||||
|
||||
```ts
|
||||
// posts.data.ts
|
||||
import { createContentLoader } from 'vitepress'
|
||||
import { createContentLoader } from 'vitepress';
|
||||
|
||||
export default createContentLoader('posts/*.md')
|
||||
export default createContentLoader('posts/*.md');
|
||||
```
|
||||
|
||||
Returns array of `ContentData`:
|
||||
|
||||
```ts
|
||||
interface ContentData {
|
||||
url: string // e.g. /posts/hello.html
|
||||
frontmatter: Record<string, any>
|
||||
src?: string // raw markdown (opt-in)
|
||||
html?: string // rendered HTML (opt-in)
|
||||
excerpt?: string // excerpt HTML (opt-in)
|
||||
url: string; // e.g. /posts/hello.html
|
||||
frontmatter: Record<string, any>;
|
||||
src?: string; // raw markdown (opt-in)
|
||||
html?: string; // rendered HTML (opt-in)
|
||||
excerpt?: string; // excerpt HTML (opt-in)
|
||||
}
|
||||
```
|
||||
|
||||
@@ -99,47 +99,47 @@ With options:
|
||||
|
||||
```ts
|
||||
// posts.data.ts
|
||||
import { createContentLoader } from 'vitepress'
|
||||
import { createContentLoader } from 'vitepress';
|
||||
|
||||
export default createContentLoader('posts/*.md', {
|
||||
includeSrc: true, // Include raw markdown
|
||||
render: true, // Include rendered HTML
|
||||
excerpt: true, // Include excerpt (content before first ---)
|
||||
|
||||
includeSrc: true, // Include raw markdown
|
||||
render: true, // Include rendered HTML
|
||||
excerpt: true, // Include excerpt (content before first ---)
|
||||
|
||||
transform(rawData) {
|
||||
// Sort by date, newest first
|
||||
return rawData
|
||||
.sort((a, b) => +new Date(b.frontmatter.date) - +new Date(a.frontmatter.date))
|
||||
.map(page => ({
|
||||
.map((page) => ({
|
||||
title: page.frontmatter.title,
|
||||
url: page.url,
|
||||
date: page.frontmatter.date,
|
||||
excerpt: page.excerpt
|
||||
}))
|
||||
}
|
||||
})
|
||||
excerpt: page.excerpt,
|
||||
}));
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
## Usage Example: Blog Index
|
||||
|
||||
```ts
|
||||
// posts.data.ts
|
||||
import { createContentLoader } from 'vitepress'
|
||||
import { createContentLoader } from 'vitepress';
|
||||
|
||||
export default createContentLoader('posts/*.md', {
|
||||
excerpt: true,
|
||||
transform(data) {
|
||||
return data
|
||||
.filter(post => !post.frontmatter.draft)
|
||||
.sort((a, b) => +new Date(b.frontmatter.date) - +new Date(a.frontmatter.date))
|
||||
}
|
||||
})
|
||||
.filter((post) => !post.frontmatter.draft)
|
||||
.sort((a, b) => +new Date(b.frontmatter.date) - +new Date(a.frontmatter.date));
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
```vue
|
||||
<!-- posts/index.md -->
|
||||
<script setup>
|
||||
import { data as posts } from './posts.data.ts'
|
||||
import { data as posts } from './posts.data.ts';
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -156,22 +156,22 @@ import { data as posts } from './posts.data.ts'
|
||||
|
||||
```ts
|
||||
// example.data.ts
|
||||
import { defineLoader } from 'vitepress'
|
||||
import { defineLoader } from 'vitepress';
|
||||
|
||||
export interface Data {
|
||||
posts: Array<{ title: string; url: string }>
|
||||
posts: Array<{ title: string; url: string }>;
|
||||
}
|
||||
|
||||
declare const data: Data
|
||||
export { data }
|
||||
declare const data: Data;
|
||||
export { data };
|
||||
|
||||
export default defineLoader({
|
||||
watch: ['./posts/*.md'],
|
||||
async load(): Promise<Data> {
|
||||
// ...
|
||||
return { posts: [] }
|
||||
}
|
||||
})
|
||||
return { posts: [] };
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
## In Build Hooks
|
||||
@@ -180,28 +180,28 @@ Use in config for generating additional files:
|
||||
|
||||
```ts
|
||||
// .vitepress/config.ts
|
||||
import { createContentLoader } from 'vitepress'
|
||||
import { createContentLoader } from 'vitepress';
|
||||
|
||||
export default {
|
||||
async buildEnd() {
|
||||
const posts = await createContentLoader('posts/*.md').load()
|
||||
const posts = await createContentLoader('posts/*.md').load();
|
||||
// Generate RSS feed, sitemap, etc.
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
## Accessing Config
|
||||
|
||||
```ts
|
||||
// example.data.ts
|
||||
import type { SiteConfig } from 'vitepress'
|
||||
import type { SiteConfig } from 'vitepress';
|
||||
|
||||
export default {
|
||||
load() {
|
||||
const config: SiteConfig = (globalThis as any).VITEPRESS_CONFIG
|
||||
return { base: config.site.base }
|
||||
}
|
||||
}
|
||||
const config: SiteConfig = (globalThis as any).VITEPRESS_CONFIG;
|
||||
return { base: config.site.base };
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
## Key Points
|
||||
|
||||
Reference in New Issue
Block a user