-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbundle.js
128 lines (94 loc) · 3.67 KB
/
bundle.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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import { registerSchema as registerOpenApiSchema } from '@hyperjump/json-schema/openapi-3-1'
import { registerSchema as registerJsonSchema } from '@hyperjump/json-schema/draft-2020-12'
import { registerSchema } from '@hyperjump/json-schema'
import { bundle } from '@hyperjump/json-schema/bundle'
// Utilities
import fs from 'node:fs'
import path from 'node:path'
import yaml from 'yaml'
import { globSync } from 'glob'
//import { existsSync, mkdirSync, rmSync, writeFileSync, readFileSync } from 'node:fs'
import Mustache from 'mustache'
// -----------------------------------------------------------------------------
// Constants
// '.' is from the package.json context, not this file's path
const BASE = path.resolve('.')
const SOURCE = 'src/schema'
const TARGET = 'bundled'
const DOMAIN = 'https://badgers.io'
const MustacheTags = {
BASE,
SOURCE,
TARGET,
DOMAIN,
}
console.log('Constants: ', MustacheTags)
// -----------------------------------------------------------------------------
// Helpers
const prepFilesystem = () => {
console.log('prepFilesystem: ' + TARGET)
fs.rmSync(TARGET, { force: true, recursive: true })
fs.mkdirSync(TARGET)
}
const withGlobbedFiles = (files, callbacks) => {
console.log('withGlobbedFiles:', files)
callbacks.forEach(callback => {
files.forEach((file) => {
callback(file)
})
})
}
const readActualFile = (filePath) => fs.readFileSync(filePath, {
encoding: 'utf-8',
})
const getDetailsFromParsedSchema = (schema) => [schema['$id'], schema['$schema']]
const generateTargetFilePath = sourcePath => sourcePath.replace(SOURCE, TARGET)
const ensureTargetPath = (path) => {
console.log('ensureTargetPath: ' + path)
fs.existsSync(path) || fs.mkdirSync(path, { recursive: true })
}
// -----------------------------------------------------------------------------
// Registering Schemas
const replaceTagsWithValues = (fileContents, tags) => Mustache.render(fileContents, tags)
const prepareAndRegisterFile = (filePath) => {
console.log('prepareAndRegisterFile: ' + filePath)
try {
let contents = replaceTagsWithValues(readActualFile(filePath), MustacheTags)
let parsed = yaml.parse(contents)
let [$id, $schema] = getDetailsFromParsedSchema(parsed)
registerSchema(parsed, $id, $schema)
} catch (error) {
throw error
}
}
// -----------------------------------------------------------------------------
// Bundle Json Schema
const schemaIdentifierFromSourceFilePath = (filePath) => filePath.replace(path.join(BASE, SOURCE), DOMAIN).replace('.yml', '')
const reportFailedBundle = (error) => console.error('Bundle Failed: ', error)
const writeBundledFile = (bundled, filePath) => fs.writeFileSync(filePath, yaml.stringify(bundled), { encoding: 'utf-8', flag: 'w' })
const bundleSchemaToFile = (schema, targetFilePath) => {
console.log('bundleSchemaToFile: ' + schema + ', ' + targetFilePath)
bundle(schema, { alwaysIncludeDialect: false }).then((bundled) => writeBundledFile(bundled, targetFilePath), reportFailedBundle)
}
const bundleFileAndSaveIt = (filePath) => {
console.log('bundleFileAndSaveIt: ' + filePath)
try {
let targetFilePath = generateTargetFilePath(filePath)
ensureTargetPath(path.parse(targetFilePath).dir)
bundleSchemaToFile(schemaIdentifierFromSourceFilePath(filePath), targetFilePath)
} catch (error) {
throw error
}
}
// -----------------------------------------------------------------------------
// Runtime
prepFilesystem()
withGlobbedFiles(
globSync(path.join(BASE, SOURCE, '**', '*.yml'), {
ignore: [
path.join(BASE, SOURCE, '**', '*asyncapi.yml'),
// path.join(BASE, SOURCE, '**', '*openapi.yml'),
]
}),
[prepareAndRegisterFile, bundleFileAndSaveIt]
)