-
-
Notifications
You must be signed in to change notification settings - Fork 749
Expand file tree
/
Copy pathindex.ts
More file actions
78 lines (64 loc) · 2.35 KB
/
index.ts
File metadata and controls
78 lines (64 loc) · 2.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { extname } from 'pathe'
import { camelCase } from 'scule'
import { StorageMeta } from 'unstorage'
import type { ContentTransformer, TransformContentOptions } from '../types'
import csv from './csv'
import markdown from './markdown'
import yaml from './yaml'
import pathMeta from './path-meta'
import shiki from './shiki'
import json from './json'
const TRANSFORMERS = [
csv,
markdown,
json,
yaml,
shiki,
pathMeta
]
function getParser (ext: string, additionalTransformers: ContentTransformer[] = []): ContentTransformer | undefined {
let parser = additionalTransformers.find(p => ext.match(new RegExp(p.extensions.join('|'), 'i')) && p.parse)
if (!parser) {
parser = TRANSFORMERS.find(p => ext.match(new RegExp(p.extensions.join('|'), 'i')) && p.parse)
}
return parser
}
function getTransformers (ext: string, additionalTransformers: ContentTransformer[] = []) {
return [
...additionalTransformers.filter(p => ext.match(new RegExp(p.extensions.join('|'), 'i')) && p.transform),
...TRANSFORMERS.filter(p => ext.match(new RegExp(p.extensions.join('|'), 'i')) && p.transform)
]
}
/**
* Parse content file using registered plugins
*/
export async function transformContent (id: string, content: string, meta: StorageMeta = {}, options: TransformContentOptions = {}) {
const { transformers = [] } = options
// Call hook before parsing the file
const file = { _id: id, body: content }
const ext = extname(id)
const parser = getParser(ext, transformers)
if (!parser) {
// eslint-disable-next-line no-console
console.warn(`${ext} files are not supported, "${id}" falling back to raw content`)
return file
}
const parserOptions = options[camelCase(parser.name)] || {}
const parsed = await parser.parse!(file._id, file.body, parserOptions)
const matchedTransformers = getTransformers(ext, transformers)
const result = await matchedTransformers.reduce(async (prev, cur) => {
const next = (await prev) || parsed
const transformOptions = options[camelCase(cur.name)]
// disable transformer if options is false
if (transformOptions === false) {
return next
}
return cur.transform!(next, transformOptions || {})
}, Promise.resolve(parsed))
// Add meta
if (meta && meta.mtime) {
result._updatedAt = meta.mtime.toISOString()
}
return result
}
export { defineTransformer } from './utils'