@brainfish-ai/devdoc 0.1.26 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/ai.d.ts +6 -0
- package/dist/cli/commands/ai.js +280 -0
- package/dist/cli/commands/create.d.ts +3 -0
- package/dist/cli/commands/create.js +162 -16
- package/dist/cli/index.js +7 -1
- package/package.json +1 -1
- package/renderer/app/api/docs/route.ts +6 -2
- package/renderer/app/icon.svg +4 -0
- package/renderer/components/docs-viewer/content/doc-page.tsx +17 -2
- package/renderer/components/docs-viewer/content/not-found-page.tsx +330 -0
- package/renderer/components/docs-viewer/index.tsx +15 -2
- package/renderer/app/favicon.ico +0 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ai = ai;
|
|
40
|
+
const path_1 = __importDefault(require("path"));
|
|
41
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
42
|
+
const logger_1 = require("../../utils/logger");
|
|
43
|
+
// Simple prompt helper using readline
|
|
44
|
+
async function prompt(question, defaultValue) {
|
|
45
|
+
const readline = await Promise.resolve().then(() => __importStar(require('readline')));
|
|
46
|
+
const rl = readline.createInterface({
|
|
47
|
+
input: process.stdin,
|
|
48
|
+
output: process.stdout,
|
|
49
|
+
});
|
|
50
|
+
return new Promise((resolve) => {
|
|
51
|
+
const displayQuestion = defaultValue
|
|
52
|
+
? `${question} (${defaultValue}): `
|
|
53
|
+
: `${question}: `;
|
|
54
|
+
rl.question(displayQuestion, (answer) => {
|
|
55
|
+
rl.close();
|
|
56
|
+
resolve(answer.trim() || defaultValue || '');
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async function promptSelect(question, choices) {
|
|
61
|
+
console.log(`\n${question}\n`);
|
|
62
|
+
choices.forEach((choice, i) => {
|
|
63
|
+
console.log(` ${i + 1}. ${choice.label}`);
|
|
64
|
+
});
|
|
65
|
+
console.log();
|
|
66
|
+
const readline = await Promise.resolve().then(() => __importStar(require('readline')));
|
|
67
|
+
const rl = readline.createInterface({
|
|
68
|
+
input: process.stdin,
|
|
69
|
+
output: process.stdout,
|
|
70
|
+
});
|
|
71
|
+
return new Promise((resolve) => {
|
|
72
|
+
rl.question('Enter number: ', (answer) => {
|
|
73
|
+
rl.close();
|
|
74
|
+
const index = parseInt(answer.trim(), 10) - 1;
|
|
75
|
+
if (index >= 0 && index < choices.length) {
|
|
76
|
+
resolve(choices[index].value);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// Default to first choice
|
|
80
|
+
resolve(choices[0].value);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Claude Code skills to create
|
|
86
|
+
const CLAUDE_SKILLS = [
|
|
87
|
+
'bootstrap-docs',
|
|
88
|
+
'migrate-docs',
|
|
89
|
+
'import-api-spec',
|
|
90
|
+
'sync-docs',
|
|
91
|
+
'check-docs',
|
|
92
|
+
'create-doc-page',
|
|
93
|
+
'update-docs-json',
|
|
94
|
+
'generate-api-docs',
|
|
95
|
+
'docs-from-code',
|
|
96
|
+
];
|
|
97
|
+
// Cursor rules to create
|
|
98
|
+
const CURSOR_RULES = [
|
|
99
|
+
'devdoc.mdc',
|
|
100
|
+
'devdoc-bootstrap.mdc',
|
|
101
|
+
'devdoc-migrate.mdc',
|
|
102
|
+
'devdoc-sync.mdc',
|
|
103
|
+
];
|
|
104
|
+
/**
|
|
105
|
+
* Get the template directory path (handles both development and installed package scenarios)
|
|
106
|
+
*/
|
|
107
|
+
function getTemplateDir() {
|
|
108
|
+
// Try relative to this file (packages/devdoc/src/cli/commands -> packages/devdoc/templates)
|
|
109
|
+
let templateDir = path_1.default.join(__dirname, '..', '..', '..', 'templates', 'starter');
|
|
110
|
+
if (fs_extra_1.default.existsSync(templateDir)) {
|
|
111
|
+
return templateDir;
|
|
112
|
+
}
|
|
113
|
+
// Try devdoc/templates at repo root (development - monorepo structure)
|
|
114
|
+
// __dirname is packages/devdoc/src/cli/commands -> go up 5 levels to repo root
|
|
115
|
+
templateDir = path_1.default.join(__dirname, '..', '..', '..', '..', '..', 'devdoc', 'templates', 'starter');
|
|
116
|
+
if (fs_extra_1.default.existsSync(templateDir)) {
|
|
117
|
+
return templateDir;
|
|
118
|
+
}
|
|
119
|
+
// Try node_modules location (installed package)
|
|
120
|
+
templateDir = path_1.default.join(__dirname, '..', '..', 'templates', 'starter');
|
|
121
|
+
if (fs_extra_1.default.existsSync(templateDir)) {
|
|
122
|
+
return templateDir;
|
|
123
|
+
}
|
|
124
|
+
throw new Error('Could not find template directory');
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Copy CLAUDE.md to project root
|
|
128
|
+
*/
|
|
129
|
+
function copyClaudeMd(projectPath, templateDir) {
|
|
130
|
+
const sourcePath = path_1.default.join(templateDir, 'CLAUDE.md');
|
|
131
|
+
const destPath = path_1.default.join(projectPath, 'CLAUDE.md');
|
|
132
|
+
if (!fs_extra_1.default.existsSync(sourcePath)) {
|
|
133
|
+
logger_1.logger.warn('CLAUDE.md template not found');
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
fs_extra_1.default.copySync(sourcePath, destPath);
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Copy Claude Code skills to .claude/skills/
|
|
141
|
+
*/
|
|
142
|
+
function copyClaudeSkills(projectPath, templateDir) {
|
|
143
|
+
const copied = [];
|
|
144
|
+
const sourceSkillsDir = path_1.default.join(templateDir, '.claude', 'skills');
|
|
145
|
+
const destSkillsDir = path_1.default.join(projectPath, '.claude', 'skills');
|
|
146
|
+
if (!fs_extra_1.default.existsSync(sourceSkillsDir)) {
|
|
147
|
+
logger_1.logger.warn('Claude skills template directory not found');
|
|
148
|
+
return copied;
|
|
149
|
+
}
|
|
150
|
+
// Ensure destination directory exists
|
|
151
|
+
fs_extra_1.default.ensureDirSync(destSkillsDir);
|
|
152
|
+
for (const skill of CLAUDE_SKILLS) {
|
|
153
|
+
const sourceDir = path_1.default.join(sourceSkillsDir, skill);
|
|
154
|
+
const destDir = path_1.default.join(destSkillsDir, skill);
|
|
155
|
+
if (fs_extra_1.default.existsSync(sourceDir)) {
|
|
156
|
+
fs_extra_1.default.copySync(sourceDir, destDir);
|
|
157
|
+
copied.push(skill);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return copied;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Copy Cursor rules to .cursor/rules/
|
|
164
|
+
*/
|
|
165
|
+
function copyCursorRules(projectPath, templateDir) {
|
|
166
|
+
const copied = [];
|
|
167
|
+
const sourceRulesDir = path_1.default.join(templateDir, '.cursor', 'rules');
|
|
168
|
+
const destRulesDir = path_1.default.join(projectPath, '.cursor', 'rules');
|
|
169
|
+
if (!fs_extra_1.default.existsSync(sourceRulesDir)) {
|
|
170
|
+
logger_1.logger.warn('Cursor rules template directory not found');
|
|
171
|
+
return copied;
|
|
172
|
+
}
|
|
173
|
+
// Ensure destination directory exists
|
|
174
|
+
fs_extra_1.default.ensureDirSync(destRulesDir);
|
|
175
|
+
for (const rule of CURSOR_RULES) {
|
|
176
|
+
const sourcePath = path_1.default.join(sourceRulesDir, rule);
|
|
177
|
+
const destPath = path_1.default.join(destRulesDir, rule);
|
|
178
|
+
if (fs_extra_1.default.existsSync(sourcePath)) {
|
|
179
|
+
fs_extra_1.default.copySync(sourcePath, destPath);
|
|
180
|
+
copied.push(rule);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return copied;
|
|
184
|
+
}
|
|
185
|
+
async function ai(options) {
|
|
186
|
+
console.log();
|
|
187
|
+
logger_1.logger.info('DevDoc AI Agent Setup');
|
|
188
|
+
console.log();
|
|
189
|
+
const projectPath = process.cwd();
|
|
190
|
+
// Check if this is a DevDoc project
|
|
191
|
+
const docsJsonPath = path_1.default.join(projectPath, 'docs.json');
|
|
192
|
+
const hasDocsJson = fs_extra_1.default.existsSync(docsJsonPath);
|
|
193
|
+
if (!hasDocsJson) {
|
|
194
|
+
logger_1.logger.warn('No docs.json found. This may not be a DevDoc project.');
|
|
195
|
+
console.log();
|
|
196
|
+
}
|
|
197
|
+
// Get template directory
|
|
198
|
+
let templateDir;
|
|
199
|
+
try {
|
|
200
|
+
templateDir = getTemplateDir();
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
logger_1.logger.error('Could not find AI agent templates. Please ensure DevDoc is installed correctly.');
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
// Get tool selection if not provided
|
|
207
|
+
let tool = options.tool || 'both';
|
|
208
|
+
if (!options.tool) {
|
|
209
|
+
const toolChoices = [
|
|
210
|
+
{ value: 'both', label: 'Both - Claude Code and Cursor' },
|
|
211
|
+
{ value: 'claude', label: 'Claude Code - Skills and CLAUDE.md' },
|
|
212
|
+
{ value: 'cursor', label: 'Cursor - Rules (.cursor/rules/)' },
|
|
213
|
+
];
|
|
214
|
+
tool = await promptSelect('Which AI tool do you use?', toolChoices);
|
|
215
|
+
}
|
|
216
|
+
console.log();
|
|
217
|
+
logger_1.logger.info('Setting up AI agent configuration...');
|
|
218
|
+
console.log();
|
|
219
|
+
const results = {
|
|
220
|
+
claudeMd: false,
|
|
221
|
+
claudeSkills: [],
|
|
222
|
+
cursorRules: [],
|
|
223
|
+
};
|
|
224
|
+
// Setup Claude Code
|
|
225
|
+
if (tool === 'claude' || tool === 'both') {
|
|
226
|
+
// Copy CLAUDE.md
|
|
227
|
+
results.claudeMd = copyClaudeMd(projectPath, templateDir);
|
|
228
|
+
if (results.claudeMd) {
|
|
229
|
+
logger_1.logger.success('Created CLAUDE.md');
|
|
230
|
+
}
|
|
231
|
+
// Copy skills
|
|
232
|
+
results.claudeSkills = copyClaudeSkills(projectPath, templateDir);
|
|
233
|
+
for (const skill of results.claudeSkills) {
|
|
234
|
+
logger_1.logger.success(`Created .claude/skills/${skill}/SKILL.md`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Setup Cursor
|
|
238
|
+
if (tool === 'cursor' || tool === 'both') {
|
|
239
|
+
results.cursorRules = copyCursorRules(projectPath, templateDir);
|
|
240
|
+
for (const rule of results.cursorRules) {
|
|
241
|
+
logger_1.logger.success(`Created .cursor/rules/${rule}`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Summary
|
|
245
|
+
console.log();
|
|
246
|
+
logger_1.logger.success('AI agent configuration complete!');
|
|
247
|
+
console.log();
|
|
248
|
+
if (tool === 'claude' || tool === 'both') {
|
|
249
|
+
console.log('Available Claude Code commands:');
|
|
250
|
+
console.log(' /bootstrap-docs - Analyze repo and generate initial documentation');
|
|
251
|
+
console.log(' /migrate-docs - Migrate from Mintlify, Docusaurus, GitBook, etc.');
|
|
252
|
+
console.log(' /import-api-spec - Import OpenAPI, GraphQL, or AsyncAPI specs');
|
|
253
|
+
console.log(' /sync-docs - Find and fix outdated documentation');
|
|
254
|
+
console.log(' /check-docs - Quick health check without changes');
|
|
255
|
+
console.log(' /create-doc-page - Create a new documentation page');
|
|
256
|
+
console.log(' /update-docs-json - Add pages to navigation');
|
|
257
|
+
console.log(' /generate-api-docs - Generate API documentation');
|
|
258
|
+
console.log(' /docs-from-code - Generate docs from specific code files');
|
|
259
|
+
console.log();
|
|
260
|
+
}
|
|
261
|
+
if (tool === 'cursor' || tool === 'both') {
|
|
262
|
+
console.log('Cursor rules configured for *.mdx files.');
|
|
263
|
+
console.log();
|
|
264
|
+
console.log('Suggested prompts in Agent mode:');
|
|
265
|
+
console.log(' "Analyze this repo and generate initial documentation"');
|
|
266
|
+
console.log(' "Migrate my Mintlify docs to DevDoc format"');
|
|
267
|
+
console.log(' "Check my docs for outdated content"');
|
|
268
|
+
console.log(' "Create a new guide about authentication"');
|
|
269
|
+
console.log();
|
|
270
|
+
}
|
|
271
|
+
console.log('Quick start:');
|
|
272
|
+
if (tool === 'claude' || tool === 'both') {
|
|
273
|
+
console.log(' Claude Code: /bootstrap-docs');
|
|
274
|
+
}
|
|
275
|
+
if (tool === 'cursor' || tool === 'both') {
|
|
276
|
+
console.log(' Cursor: Ask "generate initial documentation from this repo"');
|
|
277
|
+
}
|
|
278
|
+
console.log();
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2FpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUxBLGdCQTZHQztBQWxTRCxnREFBd0I7QUFDeEIsd0RBQTBCO0FBQzFCLCtDQUE0QztBQVE1QyxzQ0FBc0M7QUFDdEMsS0FBSyxVQUFVLE1BQU0sQ0FBQyxRQUFnQixFQUFFLFlBQXFCO0lBQzNELE1BQU0sUUFBUSxHQUFHLHdEQUFhLFVBQVUsR0FBQyxDQUFDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDbEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxlQUFlLEdBQUcsWUFBWTtZQUNsQyxDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUssWUFBWSxLQUFLO1lBQ25DLENBQUMsQ0FBQyxHQUFHLFFBQVEsSUFBSSxDQUFDO1FBRXBCLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdEMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCLEVBQUUsT0FBMkM7SUFDdkYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUM7SUFDL0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0s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LENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDeEQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsMERBQTBELENBQUMsQ0FBQztRQUN4RSxPQUFPLENBQUMsR0FBRyxDQUFDLCtDQUErQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUMzRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDNUIsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrREFBK0QsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5cbnR5cGUgQUlUb29sID0gJ2NsYXVkZScgfCAnY3Vyc29yJyB8ICdib3RoJztcblxuaW50ZXJmYWNlIEFJT3B0aW9ucyB7XG4gIHRvb2w/OiBBSVRvb2w7XG59XG5cbi8vIFNpbXBsZSBwcm9tcHQgaGVscGVyIHVzaW5nIHJlYWRsaW5lXG5hc3luYyBmdW5jdGlvbiBwcm9tcHQocXVlc3Rpb246IHN0cmluZywgZGVmYXVsdFZhbHVlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVhZGxpbmUgPSBhd2FpdCBpbXBvcnQoJ3JlYWRsaW5lJyk7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBkaXNwbGF5UXVlc3Rpb24gPSBkZWZhdWx0VmFsdWUgXG4gICAgICA/IGAke3F1ZXN0aW9ufSAoJHtkZWZhdWx0VmFsdWV9KTogYFxuICAgICAgOiBgJHtxdWVzdGlvbn06IGA7XG4gICAgXG4gICAgcmwucXVlc3Rpb24oZGlzcGxheVF1ZXN0aW9uLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpIHx8IGRlZmF1bHRWYWx1ZSB8fCAnJyk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRTZWxlY3QocXVlc3Rpb246IHN0cmluZywgY2hvaWNlczogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnNvbGUubG9nKGBcXG4ke3F1ZXN0aW9ufVxcbmApO1xuICBjaG9pY2VzLmZvckVhY2goKGNob2ljZSwgaSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGAgICR7aSArIDF9LiAke2Nob2ljZS5sYWJlbH1gKTtcbiAgfSk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIFxuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHJsLnF1ZXN0aW9uKCdFbnRlciBudW1iZXI6ICcsIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGFuc3dlci50cmltKCksIDEwKSAtIDE7XG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICAgIHJlc29sdmUoY2hvaWNlc1tpbmRleF0udmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0byBmaXJzdCBjaG9pY2VcbiAgICAgICAgcmVzb2x2ZShjaG9pY2VzWzBdLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIENsYXVkZSBDb2RlIHNraWxscyB0byBjcmVhdGVcbmNvbnN0IENMQVVERV9TS0lMTFMgPSBbXG4gICdib290c3RyYXAtZG9jcycsXG4gICdtaWdyYXRlLWRvY3MnLFxuICAnaW1wb3J0LWFwaS1zcGVjJyxcbiAgJ3N5bmMtZG9jcycsXG4gICdjaGVjay1kb2NzJyxcbiAgJ2NyZWF0ZS1kb2MtcGFnZScsXG4gICd1cGRhdGUtZG9jcy1qc29uJyxcbiAgJ2dlbmVyYXRlLWFwaS1kb2NzJyxcbiAgJ2RvY3MtZnJvbS1jb2RlJyxcbl07XG5cbi8vIEN1cnNvciBydWxlcyB0byBjcmVhdGVcbmNvbnN0IENVUlNPUl9SVUxFUyA9IFtcbiAgJ2RldmRvYy5tZGMnLFxuICAnZGV2ZG9jLWJvb3RzdHJhcC5tZGMnLFxuICAnZGV2ZG9jLW1pZ3JhdGUubWRjJyxcbiAgJ2RldmRvYy1zeW5jLm1kYycsXG5dO1xuXG4vKipcbiAqIEdldCB0aGUgdGVtcGxhdGUgZGlyZWN0b3J5IHBhdGggKGhhbmRsZXMgYm90aCBkZXZlbG9wbWVudCBhbmQgaW5zdGFsbGVkIHBhY2thZ2Ugc2NlbmFyaW9zKVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZURpcigpOiBzdHJpbmcge1xuICAvLyBUcnkgcmVsYXRpdmUgdG8gdGhpcyBmaWxlIChwYWNrYWdlcy9kZXZkb2Mvc3JjL2NsaS9jb21tYW5kcyAtPiBwYWNrYWdlcy9kZXZkb2MvdGVtcGxhdGVzKVxuICBsZXQgdGVtcGxhdGVEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAndGVtcGxhdGVzJywgJ3N0YXJ0ZXInKTtcbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKHRlbXBsYXRlRGlyKSkge1xuICAgIHJldHVybiB0ZW1wbGF0ZURpcjtcbiAgfVxuICBcbiAgLy8gVHJ5IGRldmRvYy90ZW1wbGF0ZXMgYXQgcmVwbyByb290IChkZXZlbG9wbWVudCAtIG1vbm9yZXBvIHN0cnVjdHVyZSlcbiAgLy8gX19kaXJuYW1lIGlzIHBhY2thZ2VzL2RldmRvYy9zcmMvY2xpL2NvbW1hbmRzIC0+IGdvIHVwIDUgbGV2ZWxzIHRvIHJlcG8gcm9vdFxuICB0ZW1wbGF0ZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICcuLicsICcuLicsICdkZXZkb2MnLCAndGVtcGxhdGVzJywgJ3N0YXJ0ZXInKTtcbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKHRlbXBsYXRlRGlyKSkge1xuICAgIHJldHVybiB0ZW1wbGF0ZURpcjtcbiAgfVxuICBcbiAgLy8gVHJ5IG5vZGVfbW9kdWxlcyBsb2NhdGlvbiAoaW5zdGFsbGVkIHBhY2thZ2UpXG4gIHRlbXBsYXRlRGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ3RlbXBsYXRlcycsICdzdGFydGVyJyk7XG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZURpcikpIHtcbiAgICByZXR1cm4gdGVtcGxhdGVEaXI7XG4gIH1cbiAgXG4gIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgdGVtcGxhdGUgZGlyZWN0b3J5Jyk7XG59XG5cbi8qKlxuICogQ29weSBDTEFVREUubWQgdG8gcHJvamVjdCByb290XG4gKi9cbmZ1bmN0aW9uIGNvcHlDbGF1ZGVNZChwcm9qZWN0UGF0aDogc3RyaW5nLCB0ZW1wbGF0ZURpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBwYXRoLmpvaW4odGVtcGxhdGVEaXIsICdDTEFVREUubWQnKTtcbiAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFBhdGgsICdDTEFVREUubWQnKTtcbiAgXG4gIGlmICghZnMuZXhpc3RzU3luYyhzb3VyY2VQYXRoKSkge1xuICAgIGxvZ2dlci53YXJuKCdDTEFVREUubWQgdGVtcGxhdGUgbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIFxuICBmcy5jb3B5U3luYyhzb3VyY2VQYXRoLCBkZXN0UGF0aCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvcHkgQ2xhdWRlIENvZGUgc2tpbGxzIHRvIC5jbGF1ZGUvc2tpbGxzL1xuICovXG5mdW5jdGlvbiBjb3B5Q2xhdWRlU2tpbGxzKHByb2plY3RQYXRoOiBzdHJpbmcsIHRlbXBsYXRlRGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNvcGllZDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc291cmNlU2tpbGxzRGlyID0gcGF0aC5qb2luKHRlbXBsYXRlRGlyLCAnLmNsYXVkZScsICdza2lsbHMnKTtcbiAgY29uc3QgZGVzdFNraWxsc0RpciA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJy5jbGF1ZGUnLCAnc2tpbGxzJyk7XG4gIFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc291cmNlU2tpbGxzRGlyKSkge1xuICAgIGxvZ2dlci53YXJuKCdDbGF1ZGUgc2tpbGxzIHRlbXBsYXRlIGRpcmVjdG9yeSBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gY29waWVkO1xuICB9XG4gIFxuICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICBmcy5lbnN1cmVEaXJTeW5jKGRlc3RTa2lsbHNEaXIpO1xuICBcbiAgZm9yIChjb25zdCBza2lsbCBvZiBDTEFVREVfU0tJTExTKSB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gcGF0aC5qb2luKHNvdXJjZVNraWxsc0Rpciwgc2tpbGwpO1xuICAgIGNvbnN0IGRlc3REaXIgPSBwYXRoLmpvaW4oZGVzdFNraWxsc0Rpciwgc2tpbGwpO1xuICAgIFxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNvdXJjZURpcikpIHtcbiAgICAgIGZzLmNvcHlTeW5jKHNvdXJjZURpciwgZGVzdERpcik7XG4gICAgICBjb3BpZWQucHVzaChza2lsbCk7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gY29waWVkO1xufVxuXG4vKipcbiAqIENvcHkgQ3Vyc29yIHJ1bGVzIHRvIC5jdXJzb3IvcnVsZXMvXG4gKi9cbmZ1bmN0aW9uIGNvcHlDdXJzb3JSdWxlcyhwcm9qZWN0UGF0aDogc3RyaW5nLCB0ZW1wbGF0ZURpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjb3BpZWQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNvdXJjZVJ1bGVzRGlyID0gcGF0aC5qb2luKHRlbXBsYXRlRGlyLCAnLmN1cnNvcicsICdydWxlcycpO1xuICBjb25zdCBkZXN0UnVsZXNEaXIgPSBwYXRoLmpvaW4ocHJvamVjdFBhdGgsICcuY3Vyc29yJywgJ3J1bGVzJyk7XG4gIFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc291cmNlUnVsZXNEaXIpKSB7XG4gICAgbG9nZ2VyLndhcm4oJ0N1cnNvciBydWxlcyB0ZW1wbGF0ZSBkaXJlY3Rvcnkgbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIGNvcGllZDtcbiAgfVxuICBcbiAgLy8gRW5zdXJlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHNcbiAgZnMuZW5zdXJlRGlyU3luYyhkZXN0UnVsZXNEaXIpO1xuICBcbiAgZm9yIChjb25zdCBydWxlIG9mIENVUlNPUl9SVUxFUykge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBwYXRoLmpvaW4oc291cmNlUnVsZXNEaXIsIHJ1bGUpO1xuICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKGRlc3RSdWxlc0RpciwgcnVsZSk7XG4gICAgXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoc291cmNlUGF0aCkpIHtcbiAgICAgIGZzLmNvcHlTeW5jKHNvdXJjZVBhdGgsIGRlc3RQYXRoKTtcbiAgICAgIGNvcGllZC5wdXNoKHJ1bGUpO1xuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIGNvcGllZDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFpKG9wdGlvbnM6IEFJT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zb2xlLmxvZygpO1xuICBsb2dnZXIuaW5mbygnRGV2RG9jIEFJIEFnZW50IFNldHVwJyk7XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgY29uc3QgcHJvamVjdFBhdGggPSBwcm9jZXNzLmN3ZCgpO1xuICBcbiAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIERldkRvYyBwcm9qZWN0XG4gIGNvbnN0IGRvY3NKc29uUGF0aCA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJ2RvY3MuanNvbicpO1xuICBjb25zdCBoYXNEb2NzSnNvbiA9IGZzLmV4aXN0c1N5bmMoZG9jc0pzb25QYXRoKTtcbiAgXG4gIGlmICghaGFzRG9jc0pzb24pIHtcbiAgICBsb2dnZXIud2FybignTm8gZG9jcy5qc29uIGZvdW5kLiBUaGlzIG1heSBub3QgYmUgYSBEZXZEb2MgcHJvamVjdC4nKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgLy8gR2V0IHRlbXBsYXRlIGRpcmVjdG9yeVxuICBsZXQgdGVtcGxhdGVEaXI6IHN0cmluZztcbiAgdHJ5IHtcbiAgICB0ZW1wbGF0ZURpciA9IGdldFRlbXBsYXRlRGlyKCk7XG4gIH0gY2F0Y2gge1xuICAgIGxvZ2dlci5lcnJvcignQ291bGQgbm90IGZpbmQgQUkgYWdlbnQgdGVtcGxhdGVzLiBQbGVhc2UgZW5zdXJlIERldkRvYyBpcyBpbnN0YWxsZWQgY29ycmVjdGx5LicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIEdldCB0b29sIHNlbGVjdGlvbiBpZiBub3QgcHJvdmlkZWRcbiAgbGV0IHRvb2w6IEFJVG9vbCA9IG9wdGlvbnMudG9vbCB8fCAnYm90aCc7XG4gIFxuICBpZiAoIW9wdGlvbnMudG9vbCkge1xuICAgIGNvbnN0IHRvb2xDaG9pY2VzID0gW1xuICAgICAgeyB2YWx1ZTogJ2JvdGgnLCBsYWJlbDogJ0JvdGggLSBDbGF1ZGUgQ29kZSBhbmQgQ3Vyc29yJyB9LFxuICAgICAgeyB2YWx1ZTogJ2NsYXVkZScsIGxhYmVsOiAnQ2xhdWRlIENvZGUgLSBTa2lsbHMgYW5kIENMQVVERS5tZCcgfSxcbiAgICAgIHsgdmFsdWU6ICdjdXJzb3InLCBsYWJlbDogJ0N1cnNvciAtIFJ1bGVzICguY3Vyc29yL3J1bGVzLyknIH0sXG4gICAgXTtcblxuICAgIHRvb2wgPSBhd2FpdCBwcm9tcHRTZWxlY3QoJ1doaWNoIEFJIHRvb2wgZG8geW91IHVzZT8nLCB0b29sQ2hvaWNlcykgYXMgQUlUb29sO1xuICB9XG5cbiAgY29uc29sZS5sb2coKTtcbiAgbG9nZ2VyLmluZm8oJ1NldHRpbmcgdXAgQUkgYWdlbnQgY29uZmlndXJhdGlvbi4uLicpO1xuICBjb25zb2xlLmxvZygpO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSB7XG4gICAgY2xhdWRlTWQ6IGZhbHNlLFxuICAgIGNsYXVkZVNraWxsczogW10gYXMgc3RyaW5nW10sXG4gICAgY3Vyc29yUnVsZXM6IFtdIGFzIHN0cmluZ1tdLFxuICB9O1xuXG4gIC8vIFNldHVwIENsYXVkZSBDb2RlXG4gIGlmICh0b29sID09PSAnY2xhdWRlJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICAvLyBDb3B5IENMQVVERS5tZFxuICAgIHJlc3VsdHMuY2xhdWRlTWQgPSBjb3B5Q2xhdWRlTWQocHJvamVjdFBhdGgsIHRlbXBsYXRlRGlyKTtcbiAgICBpZiAocmVzdWx0cy5jbGF1ZGVNZCkge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoJ0NyZWF0ZWQgQ0xBVURFLm1kJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENvcHkgc2tpbGxzXG4gICAgcmVzdWx0cy5jbGF1ZGVTa2lsbHMgPSBjb3B5Q2xhdWRlU2tpbGxzKHByb2plY3RQYXRoLCB0ZW1wbGF0ZURpcik7XG4gICAgZm9yIChjb25zdCBza2lsbCBvZiByZXN1bHRzLmNsYXVkZVNraWxscykge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYENyZWF0ZWQgLmNsYXVkZS9za2lsbHMvJHtza2lsbH0vU0tJTEwubWRgKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXR1cCBDdXJzb3JcbiAgaWYgKHRvb2wgPT09ICdjdXJzb3InIHx8IHRvb2wgPT09ICdib3RoJykge1xuICAgIHJlc3VsdHMuY3Vyc29yUnVsZXMgPSBjb3B5Q3Vyc29yUnVsZXMocHJvamVjdFBhdGgsIHRlbXBsYXRlRGlyKTtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcmVzdWx0cy5jdXJzb3JSdWxlcykge1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYENyZWF0ZWQgLmN1cnNvci9ydWxlcy8ke3J1bGV9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU3VtbWFyeVxuICBjb25zb2xlLmxvZygpO1xuICBsb2dnZXIuc3VjY2VzcygnQUkgYWdlbnQgY29uZmlndXJhdGlvbiBjb21wbGV0ZSEnKTtcbiAgY29uc29sZS5sb2coKTtcblxuICBpZiAodG9vbCA9PT0gJ2NsYXVkZScgfHwgdG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc29sZS5sb2coJ0F2YWlsYWJsZSBDbGF1ZGUgQ29kZSBjb21tYW5kczonKTtcbiAgICBjb25zb2xlLmxvZygnICAvYm9vdHN0cmFwLWRvY3MgICAgLSBBbmFseXplIHJlcG8gYW5kIGdlbmVyYXRlIGluaXRpYWwgZG9jdW1lbnRhdGlvbicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9taWdyYXRlLWRvY3MgICAgICAtIE1pZ3JhdGUgZnJvbSBNaW50bGlmeSwgRG9jdXNhdXJ1cywgR2l0Qm9vaywgZXRjLicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9pbXBvcnQtYXBpLXNwZWMgICAtIEltcG9ydCBPcGVuQVBJLCBHcmFwaFFMLCBvciBBc3luY0FQSSBzcGVjcycpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9zeW5jLWRvY3MgICAgICAgICAtIEZpbmQgYW5kIGZpeCBvdXRkYXRlZCBkb2N1bWVudGF0aW9uJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2NoZWNrLWRvY3MgICAgICAgIC0gUXVpY2sgaGVhbHRoIGNoZWNrIHdpdGhvdXQgY2hhbmdlcycpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9jcmVhdGUtZG9jLXBhZ2UgICAtIENyZWF0ZSBhIG5ldyBkb2N1bWVudGF0aW9uIHBhZ2UnKTtcbiAgICBjb25zb2xlLmxvZygnICAvdXBkYXRlLWRvY3MtanNvbiAgLSBBZGQgcGFnZXMgdG8gbmF2aWdhdGlvbicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9nZW5lcmF0ZS1hcGktZG9jcyAtIEdlbmVyYXRlIEFQSSBkb2N1bWVudGF0aW9uJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2RvY3MtZnJvbS1jb2RlICAgIC0gR2VuZXJhdGUgZG9jcyBmcm9tIHNwZWNpZmljIGNvZGUgZmlsZXMnKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgaWYgKHRvb2wgPT09ICdjdXJzb3InIHx8IHRvb2wgPT09ICdib3RoJykge1xuICAgIGNvbnNvbGUubG9nKCdDdXJzb3IgcnVsZXMgY29uZmlndXJlZCBmb3IgKi5tZHggZmlsZXMuJyk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZygnU3VnZ2VzdGVkIHByb21wdHMgaW4gQWdlbnQgbW9kZTonKTtcbiAgICBjb25zb2xlLmxvZygnICBcIkFuYWx5emUgdGhpcyByZXBvIGFuZCBnZW5lcmF0ZSBpbml0aWFsIGRvY3VtZW50YXRpb25cIicpO1xuICAgIGNvbnNvbGUubG9nKCcgIFwiTWlncmF0ZSBteSBNaW50bGlmeSBkb2NzIHRvIERldkRvYyBmb3JtYXRcIicpO1xuICAgIGNvbnNvbGUubG9nKCcgIFwiQ2hlY2sgbXkgZG9jcyBmb3Igb3V0ZGF0ZWQgY29udGVudFwiJyk7XG4gICAgY29uc29sZS5sb2coJyAgXCJDcmVhdGUgYSBuZXcgZ3VpZGUgYWJvdXQgYXV0aGVudGljYXRpb25cIicpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cblxuICBjb25zb2xlLmxvZygnUXVpY2sgc3RhcnQ6Jyk7XG4gIGlmICh0b29sID09PSAnY2xhdWRlJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICBjb25zb2xlLmxvZygnICBDbGF1ZGUgQ29kZTogL2Jvb3RzdHJhcC1kb2NzJyk7XG4gIH1cbiAgaWYgKHRvb2wgPT09ICdjdXJzb3InIHx8IHRvb2wgPT09ICdib3RoJykge1xuICAgIGNvbnNvbGUubG9nKCcgIEN1cnNvcjogQXNrIFwiZ2VuZXJhdGUgaW5pdGlhbCBkb2N1bWVudGF0aW9uIGZyb20gdGhpcyByZXBvXCInKTtcbiAgfVxuICBjb25zb2xlLmxvZygpO1xufVxuIl19
|
|
@@ -2,14 +2,17 @@ declare const TEMPLATES: {
|
|
|
2
2
|
readonly basic: {
|
|
3
3
|
readonly name: "Basic";
|
|
4
4
|
readonly description: "Simple documentation site with guides and pages";
|
|
5
|
+
readonly color: "#10b981";
|
|
5
6
|
};
|
|
6
7
|
readonly openapi: {
|
|
7
8
|
readonly name: "OpenAPI";
|
|
8
9
|
readonly description: "Documentation with REST API reference (OpenAPI/Swagger)";
|
|
10
|
+
readonly color: "#10b981";
|
|
9
11
|
};
|
|
10
12
|
readonly graphql: {
|
|
11
13
|
readonly name: "GraphQL";
|
|
12
14
|
readonly description: "Documentation with GraphQL API playground";
|
|
15
|
+
readonly color: "#e535ab";
|
|
13
16
|
};
|
|
14
17
|
};
|
|
15
18
|
type TemplateType = keyof typeof TEMPLATES;
|