Files snapshot from new-commit-view
0
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
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
90eb8e Tucker McKnight
import {Ajv} from 'ajv'
import {ReposConfiguration, ReposConfigurationWithDefaultsApplied} from './src/configTypes.ts'
import ConfigSchema from './schemas/ReposConfiguration.json' with { type: 'json' }
const ajv = new Ajv()
function isObject(item) {
return (item && typeof item === 'object' && !Array.isArray(item));
}
function mergeDeep(target, ...sources) {
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, ...sources);
}
export const getConfig = (userConfiguration: ReposConfiguration)
: ReposConfigurationWithDefaultsApplied => {
const validator = ajv.compile(ConfigSchema)
const valid = validator(userConfiguration)
if (!valid) {
throw new Error(validator.errors.map(error => `config object at ${error.instancePath.replaceAll("/", ".")}: ${error.message}\n${Object.values(error.params).toString()}`).join("\n"))
}
const defaults = {
path: '/repos',
defaultTemplate: {
enabled: true,
allRepositoriesPageTitle: "All Repositories",
colors: {
languageGraph: [
{ light: '#ff549bff' },
{ light: '#8ec323ff' },
{ light: '#f8e276ff' },
{ light: '#f49530ff' },
{ light: '#edabb8ff' },
{ light: '#e273faff' },
{ light: '#852cdfff', dark: '#B673FA' },
]
}
}
}
const userRepos = userConfiguration.repos
const reposConfiguration = mergeDeep({}, defaults, userConfiguration)
const repoDefaults = {
defaultBranch: 'main',
branches: ['**'],
tags: ['**'],
languageExtensions: {},
defaultTemplate: {
homepageButtons: [],
}
}
const repos = {}
for (const repoName in userRepos) {
const res = mergeDeep({}, repoDefaults, userRepos[repoName])
repos[repoName] = res
}
reposConfiguration['repos'] = repos
return reposConfiguration
}