-
-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathindex.js
74 lines (68 loc) · 2.11 KB
/
index.js
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
const { getOptions } = require('loader-utils')
const { stringify } = require('javascript-stringify')
const YAML = require('yaml')
const makeIdIterator = (prefix = 'v', i = 1) => ({ next: () => prefix + i++ })
module.exports = function yamlLoader(src) {
const { asJSON, asStream, ...options } = Object.assign(
{ prettyErrors: true },
this.getOptions?.() ?? getOptions(this)
)
const namespace =
(this.resourceQuery &&
new URLSearchParams(this.resourceQuery).get('namespace')) ||
options.namespace
// keep track of repeated object references
const refs = new Map()
const idIter = makeIdIterator()
function addRef(ref, count) {
if (ref && typeof ref === 'object' && count > 1)
refs.set(ref, { id: idIter.next(), seen: false })
}
const stringifyWithRefs = (value) =>
stringify(value, (value, space, next) => {
const v = refs.get(value)
if (v) {
if (v.seen) return v.id
v.seen = true
}
return next(value)
})
const jsOpt = Object.assign({}, options, {
namespace: undefined,
onAnchor: addRef
})
if (asJSON) {
jsOpt.json = true
jsOpt.mapAsMap = false
}
let res
if (asStream) {
const stream = YAML.parseAllDocuments(src, options)
res = []
for (const doc of stream) {
for (const warn of doc.warnings) this.emitWarning(warn)
for (const err of doc.errors) throw err
res.push(doc.toJS(jsOpt))
}
} else {
const doc = YAML.parseDocument(src, options)
for (const warn of doc.warnings) this.emitWarning(warn)
for (const err of doc.errors) {
if (err.message.includes('Source contains multiple documents')) {
err.message = err.message.replace(
'YAML.parseAllDocuments()',
'yaml-loader asStream option'
)
}
throw err
}
if (namespace) doc.contents = doc.getIn(namespace.split('.'))
res = doc.toJS(jsOpt)
}
if (asJSON) return JSON.stringify(res)
let str = ''
for (const [obj, { id }] of refs.entries())
str += `var ${id} = ${stringifyWithRefs(obj)};\n`
str += `export default ${stringifyWithRefs(res)};`
return str
}