@brainfish-ai/devdoc 0.1.25 → 0.1.27
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/README.md +2 -2
- package/dist/cli/commands/create.d.ts +3 -0
- package/dist/cli/commands/create.js +180 -15
- package/dist/cli/commands/dev.js +41 -77
- package/package.json +6 -6
- 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 +56 -4
- package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +20 -0
- package/renderer/app/favicon.ico +0 -0
- package/templates/basic/README.md +0 -139
- package/templates/basic/assets/favicon.svg +0 -4
- package/templates/basic/assets/logo.svg +0 -9
- package/templates/basic/docs.json +0 -47
- package/templates/basic/guides/configuration.mdx +0 -149
- package/templates/basic/guides/overview.mdx +0 -96
- package/templates/basic/index.mdx +0 -39
- package/templates/basic/package.json +0 -14
- package/templates/basic/quickstart.mdx +0 -92
- package/templates/basic/vercel.json +0 -6
- package/templates/graphql/README.md +0 -139
- package/templates/graphql/api-reference/schema.graphql +0 -305
- package/templates/graphql/assets/favicon.svg +0 -4
- package/templates/graphql/assets/logo.svg +0 -9
- package/templates/graphql/docs.json +0 -54
- package/templates/graphql/guides/configuration.mdx +0 -149
- package/templates/graphql/guides/overview.mdx +0 -96
- package/templates/graphql/index.mdx +0 -39
- package/templates/graphql/package.json +0 -14
- package/templates/graphql/quickstart.mdx +0 -92
- package/templates/graphql/vercel.json +0 -6
- package/templates/openapi/README.md +0 -139
- package/templates/openapi/api-reference/openapi.json +0 -419
- package/templates/openapi/assets/favicon.svg +0 -4
- package/templates/openapi/assets/logo.svg +0 -9
- package/templates/openapi/docs.json +0 -61
- package/templates/openapi/guides/configuration.mdx +0 -149
- package/templates/openapi/guides/overview.mdx +0 -96
- package/templates/openapi/index.mdx +0 -39
- package/templates/openapi/package.json +0 -14
- package/templates/openapi/quickstart.mdx +0 -92
- package/templates/openapi/vercel.json +0 -6
package/dist/cli/commands/dev.js
CHANGED
|
@@ -72,129 +72,93 @@ async function findAvailablePort(startPort, host) {
|
|
|
72
72
|
throw new Error(`No available port found between ${startPort} and ${startPort + maxAttempts - 1}`);
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
|
-
*
|
|
75
|
+
* Spinner frames for animated progress
|
|
76
76
|
*/
|
|
77
|
-
|
|
78
|
-
const filled = Math.round(width * progress);
|
|
79
|
-
const empty = width - filled;
|
|
80
|
-
const bar = '█'.repeat(filled) + '░'.repeat(empty);
|
|
81
|
-
const percentage = Math.round(progress * 100);
|
|
82
|
-
return `[${bar}] ${percentage}%`;
|
|
83
|
-
}
|
|
77
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
84
78
|
/**
|
|
85
|
-
* Install dependencies with progress display
|
|
79
|
+
* Install dependencies with animated progress display
|
|
86
80
|
*/
|
|
87
81
|
async function installWithProgress(cwd) {
|
|
88
82
|
return new Promise((resolve, reject) => {
|
|
89
|
-
const installChild = (0, child_process_1.spawn)('npm', ['install'
|
|
83
|
+
const installChild = (0, child_process_1.spawn)('npm', ['install'], {
|
|
90
84
|
cwd,
|
|
91
85
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
92
86
|
shell: true,
|
|
93
87
|
});
|
|
88
|
+
let currentStep = 'Resolving dependencies...';
|
|
94
89
|
let packagesAdded = 0;
|
|
95
|
-
let
|
|
96
|
-
let
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
if (
|
|
108
|
-
currentStep = `Installing ${reifyMatch[1].trim()}`;
|
|
109
|
-
}
|
|
110
|
-
// Match "timing reifyNode:node_modules/X Completed in Xms"
|
|
111
|
-
const completedMatch = line.match(/Completed in \d+/);
|
|
112
|
-
if (completedMatch && totalPackages > 0) {
|
|
113
|
-
packagesAdded++;
|
|
114
|
-
}
|
|
115
|
-
// Match initial package count from lockfile or package.json analysis
|
|
116
|
-
const totalMatch = line.match(/(\d+) packages? (?:are|to be|will be)/i);
|
|
117
|
-
if (totalMatch) {
|
|
118
|
-
totalPackages = parseInt(totalMatch[1], 10);
|
|
119
|
-
}
|
|
120
|
-
// Match "idealTree" phase
|
|
121
|
-
if (line.includes('idealTree')) {
|
|
90
|
+
let spinnerIndex = 0;
|
|
91
|
+
let lastOutput = '';
|
|
92
|
+
// Animated spinner
|
|
93
|
+
const spinnerInterval = setInterval(() => {
|
|
94
|
+
process.stdout.clearLine(0);
|
|
95
|
+
process.stdout.cursorTo(0);
|
|
96
|
+
const spinner = SPINNER_FRAMES[spinnerIndex % SPINNER_FRAMES.length];
|
|
97
|
+
process.stdout.write(` ${logger_1.logger.cyan(spinner)} ${currentStep}`);
|
|
98
|
+
spinnerIndex++;
|
|
99
|
+
}, 80);
|
|
100
|
+
const updateStep = (line) => {
|
|
101
|
+
// Detect phases from npm output
|
|
102
|
+
if (line.includes('idealTree') || line.includes('resolving')) {
|
|
122
103
|
currentStep = 'Resolving dependencies...';
|
|
123
104
|
}
|
|
124
|
-
|
|
125
|
-
if (line.includes('reify:') && !currentStep.startsWith('Installing')) {
|
|
105
|
+
else if (line.includes('reify') || line.includes('extract')) {
|
|
126
106
|
currentStep = 'Installing packages...';
|
|
127
107
|
}
|
|
128
|
-
|
|
129
|
-
if (line.includes('audit')) {
|
|
108
|
+
else if (line.includes('audit')) {
|
|
130
109
|
currentStep = 'Running security audit...';
|
|
131
110
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
if (totalPackages > 0 && packagesAdded > 0) {
|
|
138
|
-
const progress = Math.min(packagesAdded / totalPackages, 1);
|
|
139
|
-
process.stdout.write(` ${createProgressBar(progress)} ${packagesAdded}/${totalPackages} packages`);
|
|
140
|
-
}
|
|
141
|
-
else if (currentStep) {
|
|
142
|
-
process.stdout.write(` ${logger_1.logger.cyan('○')} ${currentStep}`);
|
|
111
|
+
else if (line.includes('added')) {
|
|
112
|
+
const match = line.match(/added (\d+) packages?/i);
|
|
113
|
+
if (match) {
|
|
114
|
+
packagesAdded = parseInt(match[1], 10);
|
|
115
|
+
currentStep = `Installed ${packagesAdded} packages`;
|
|
143
116
|
}
|
|
144
117
|
}
|
|
118
|
+
lastOutput = line;
|
|
145
119
|
};
|
|
146
120
|
// Process stdout
|
|
147
121
|
installChild.stdout?.on('data', (data) => {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
updateProgress(line);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
122
|
+
data.toString().split('\n').forEach(line => {
|
|
123
|
+
if (line.trim())
|
|
124
|
+
updateStep(line);
|
|
125
|
+
});
|
|
155
126
|
});
|
|
156
|
-
// Process stderr (npm
|
|
127
|
+
// Process stderr (npm outputs progress to stderr)
|
|
157
128
|
installChild.stderr?.on('data', (data) => {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
// Skip WARN messages but process progress info
|
|
162
|
-
if (!line.includes('WARN') && !line.includes('npm warn')) {
|
|
163
|
-
lastLine = line;
|
|
164
|
-
updateProgress(line);
|
|
165
|
-
}
|
|
129
|
+
data.toString().split('\n').forEach(line => {
|
|
130
|
+
if (line.trim() && !line.includes('WARN') && !line.includes('npm warn')) {
|
|
131
|
+
updateStep(line);
|
|
166
132
|
}
|
|
167
|
-
}
|
|
133
|
+
});
|
|
168
134
|
});
|
|
169
135
|
installChild.on('exit', (code) => {
|
|
170
|
-
|
|
136
|
+
clearInterval(spinnerInterval);
|
|
171
137
|
process.stdout.clearLine(0);
|
|
172
138
|
process.stdout.cursorTo(0);
|
|
173
139
|
if (code === 0) {
|
|
174
|
-
// Show final summary
|
|
175
140
|
if (packagesAdded > 0) {
|
|
176
141
|
console.log(` ${logger_1.logger.green('✓')} Installed ${packagesAdded} packages`);
|
|
177
142
|
}
|
|
178
143
|
else {
|
|
179
|
-
console.log(` ${logger_1.logger.green('✓')}
|
|
144
|
+
console.log(` ${logger_1.logger.green('✓')} Dependencies installed`);
|
|
180
145
|
}
|
|
181
146
|
resolve();
|
|
182
147
|
}
|
|
183
148
|
else {
|
|
184
149
|
console.log(` ${logger_1.logger.red('✗')} Installation failed`);
|
|
185
|
-
if (
|
|
186
|
-
console.log(`
|
|
150
|
+
if (lastOutput && !lastOutput.includes('npm warn')) {
|
|
151
|
+
console.log(` ${lastOutput}`);
|
|
187
152
|
}
|
|
188
153
|
reject(new Error(`npm install failed with code ${code}`));
|
|
189
154
|
}
|
|
190
155
|
});
|
|
191
156
|
installChild.on('error', (error) => {
|
|
157
|
+
clearInterval(spinnerInterval);
|
|
192
158
|
process.stdout.clearLine(0);
|
|
193
159
|
process.stdout.cursorTo(0);
|
|
194
160
|
reject(error);
|
|
195
161
|
});
|
|
196
|
-
// Show initial message
|
|
197
|
-
process.stdout.write(` ${logger_1.logger.cyan('○')} Resolving dependencies...`);
|
|
198
162
|
});
|
|
199
163
|
}
|
|
200
164
|
async function dev(options) {
|
|
@@ -293,4 +257,4 @@ async function dev(options) {
|
|
|
293
257
|
child.kill('SIGTERM');
|
|
294
258
|
});
|
|
295
259
|
}
|
|
296
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9kZXYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFnT0Esa0JBc0hDO0FBdFZELGlEQUFzQztBQUN0QyxnREFBd0I7QUFDeEIsd0RBQTBCO0FBQzFCLDhDQUFzQjtBQUN0Qix5Q0FBMEQ7QUFDMUQsK0NBQTRDO0FBQzVDLDZDQUFtRDtBQVFuRDs7R0FFRztBQUNILEtBQUssVUFBVSxXQUFXLENBQUMsR0FBVztJQUNwQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTdCLElBQUksQ0FBQztRQUNILElBQUksT0FBZSxDQUFDO1FBQ3BCLElBQUksSUFBYyxDQUFDO1FBRW5CLFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDakIsS0FBSyxRQUFRLEVBQUUsUUFBUTtnQkFDckIsT0FBTyxHQUFHLE1BQU0sQ0FBQztnQkFDakIsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2IsTUFBTTtZQUNSLEtBQUssT0FBTyxFQUFFLFVBQVU7Z0JBQ3RCLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ2hCLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1IsU0FBUyxtQkFBbUI7Z0JBQzFCLE9BQU8sR0FBRyxVQUFVLENBQUM7Z0JBQ3JCLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNiLE1BQU07UUFDVixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBQSxxQkFBSyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7WUFDakMsS0FBSyxFQUFFLFFBQVE7WUFDZixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsMkNB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Q0FBQyxLQUFLLElBQUksRUFBRTtZQUNwQixlQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsU0FBUyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9CLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLHdDQUF3QztJQUNwRCxDQUFDO0lBRUQsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUMxQixlQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxQixDQUFDLENBQUMsQ0FBQztJQUVILHFCQUFxQjtJQUNyQixPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgeyBsb2FkQ29uZmlnLCB2YWxpZGF0ZUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHsgZ2V0UmVuZGVyZXJEaXIgfSBmcm9tICcuLi8uLi91dGlscy9wYXRocyc7XG5cbmludGVyZmFjZSBEZXZPcHRpb25zIHtcbiAgcG9ydDogc3RyaW5nO1xuICBob3N0OiBzdHJpbmc7XG4gIG9wZW46IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3BlbiBVUkwgaW4gdGhlIGRlZmF1bHQgYnJvd3NlciAoY3Jvc3MtcGxhdGZvcm0pXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5Ccm93c2VyKHVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcGxhdGZvcm0gfSA9IHByb2Nlc3M7XG4gIFxuICB0cnkge1xuICAgIGxldCBjb21tYW5kOiBzdHJpbmc7XG4gICAgbGV0IGFyZ3M6IHN0cmluZ1tdO1xuICAgIFxuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgIGNhc2UgJ2Rhcndpbic6IC8vIG1hY09TXG4gICAgICAgIGNvbW1hbmQgPSAnb3Blbic7XG4gICAgICAgIGFyZ3MgPSBbdXJsXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3aW4zMic6IC8vIFdpbmRvd3NcbiAgICAgICAgY29tbWFuZCA9ICdjbWQnO1xuICAgICAgICBhcmdzID0gWycvYycsICdzdGFydCcsICcnLCB1cmxdO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IC8vIExpbnV4IGFuZCBvdGhlcnNcbiAgICAgICAgY29tbWFuZCA9ICd4ZGctb3Blbic7XG4gICAgICAgIGFyZ3MgPSBbdXJsXTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oY29tbWFuZCwgYXJncywge1xuICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgfSk7XG4gICAgXG4gICAgY2hpbGQudW5yZWYoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gU2lsZW50bHkgZmFpbCBpZiBicm93c2VyIGNhbid0IGJlIG9wZW5lZFxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZVxuICovXG5hc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyLCBob3N0OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gbmV0LmNyZWF0ZVNlcnZlcigpO1xuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsICgpID0+IHJlc29sdmUoZmFsc2UpKTtcbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCk7XG4gICAgICByZXNvbHZlKHRydWUpO1xuICAgIH0pO1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEZpbmQgYW4gYXZhaWxhYmxlIHBvcnQgc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kQXZhaWxhYmxlUG9ydChzdGFydFBvcnQ6IG51bWJlciwgaG9zdDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgbGV0IHBvcnQgPSBzdGFydFBvcnQ7XG4gIGNvbnN0IG1heEF0dGVtcHRzID0gMTA7XG4gIFxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1heEF0dGVtcHRzOyBpKyspIHtcbiAgICBpZiAoYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQsIGhvc3QpKSB7XG4gICAgICByZXR1cm4gcG9ydDtcbiAgICB9XG4gICAgcG9ydCsrO1xuICB9XG4gIFxuICB0aHJvdyBuZXcgRXJyb3IoYE5vIGF2YWlsYWJsZSBwb3J0IGZvdW5kIGJldHdlZW4gJHtzdGFydFBvcnR9IGFuZCAke3N0YXJ0UG9ydCArIG1heEF0dGVtcHRzIC0gMX1gKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBwcm9ncmVzcyBiYXIgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgPSAzMCk6IHN0cmluZyB7XG4gIGNvbnN0IGZpbGxlZCA9IE1hdGgucm91bmQod2lkdGggKiBwcm9ncmVzcyk7XG4gIGNvbnN0IGVtcHR5ID0gd2lkdGggLSBmaWxsZWQ7XG4gIGNvbnN0IGJhciA9ICfilognLnJlcGVhdChmaWxsZWQpICsgJ+KWkScucmVwZWF0KGVtcHR5KTtcbiAgY29uc3QgcGVyY2VudGFnZSA9IE1hdGgucm91bmQocHJvZ3Jlc3MgKiAxMDApO1xuICByZXR1cm4gYFske2Jhcn1dICR7cGVyY2VudGFnZX0lYDtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIGRlcGVuZGVuY2llcyB3aXRoIHByb2dyZXNzIGRpc3BsYXlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFdpdGhQcm9ncmVzcyhjd2Q6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbGxDaGlsZCA9IHNwYXduKCducG0nLCBbJ2luc3RhbGwnLCAnLS1wcm9ncmVzcyddLCB7XG4gICAgICBjd2QsXG4gICAgICBzdGRpbzogWydwaXBlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgfSk7XG4gICAgXG4gICAgbGV0IHBhY2thZ2VzQWRkZWQgPSAwO1xuICAgIGxldCB0b3RhbFBhY2thZ2VzID0gMDtcbiAgICBsZXQgY3VycmVudFN0ZXAgPSAnJztcbiAgICBsZXQgbGFzdExpbmUgPSAnJztcbiAgICBcbiAgICBjb25zdCB1cGRhdGVQcm9ncmVzcyA9IChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFBhcnNlIG5wbSBvdXRwdXQgdG8gdHJhY2sgcHJvZ3Jlc3NcbiAgICAgIFxuICAgICAgLy8gTWF0Y2ggXCJhZGRlZCBYIHBhY2thZ2VzXCIgcGF0dGVyblxuICAgICAgY29uc3QgYWRkZWRNYXRjaCA9IGxpbmUubWF0Y2goL2FkZGVkIChcXGQrKSBwYWNrYWdlcz8vaSk7XG4gICAgICBpZiAoYWRkZWRNYXRjaCkge1xuICAgICAgICBwYWNrYWdlc0FkZGVkID0gcGFyc2VJbnQoYWRkZWRNYXRjaFsxXSwgMTApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBNYXRjaCBwYWNrYWdlIGNvdW50IGZyb20gXCJyZWlmeTpwYWNrYWdlLW5hbWU6IHRpbWluZ1wiIG9yIHNpbWlsYXJcbiAgICAgIGNvbnN0IHJlaWZ5TWF0Y2ggPSBsaW5lLm1hdGNoKC9yZWlmeTooW146XSspLyk7XG4gICAgICBpZiAocmVpZnlNYXRjaCkge1xuICAgICAgICBjdXJyZW50U3RlcCA9IGBJbnN0YWxsaW5nICR7cmVpZnlNYXRjaFsxXS50cmltKCl9YDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTWF0Y2ggXCJ0aW1pbmcgcmVpZnlOb2RlOm5vZGVfbW9kdWxlcy9YIENvbXBsZXRlZCBpbiBYbXNcIlxuICAgICAgY29uc3QgY29tcGxldGVkTWF0Y2ggPSBsaW5lLm1hdGNoKC9Db21wbGV0ZWQgaW4gXFxkKy8pO1xuICAgICAgaWYgKGNvbXBsZXRlZE1hdGNoICYmIHRvdGFsUGFja2FnZXMgPiAwKSB7XG4gICAgICAgIHBhY2thZ2VzQWRkZWQrKztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTWF0Y2ggaW5pdGlhbCBwYWNrYWdlIGNvdW50IGZyb20gbG9ja2ZpbGUgb3IgcGFja2FnZS5qc29uIGFuYWx5c2lzXG4gICAgICBjb25zdCB0b3RhbE1hdGNoID0gbGluZS5tYXRjaCgvKFxcZCspIHBhY2thZ2VzPyAoPzphcmV8dG8gYmV8d2lsbCBiZSkvaSk7XG4gICAgICBpZiAodG90YWxNYXRjaCkge1xuICAgICAgICB0b3RhbFBhY2thZ2VzID0gcGFyc2VJbnQodG90YWxNYXRjaFsxXSwgMTApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBNYXRjaCBcImlkZWFsVHJlZVwiIHBoYXNlXG4gICAgICBpZiAobGluZS5pbmNsdWRlcygnaWRlYWxUcmVlJykpIHtcbiAgICAgICAgY3VycmVudFN0ZXAgPSAnUmVzb2x2aW5nIGRlcGVuZGVuY2llcy4uLic7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE1hdGNoIFwicmVpZnlcIiBwaGFzZSBzdGFydFxuICAgICAgaWYgKGxpbmUuaW5jbHVkZXMoJ3JlaWZ5OicpICYmICFjdXJyZW50U3RlcC5zdGFydHNXaXRoKCdJbnN0YWxsaW5nJykpIHtcbiAgICAgICAgY3VycmVudFN0ZXAgPSAnSW5zdGFsbGluZyBwYWNrYWdlcy4uLic7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE1hdGNoIFwiYXVkaXRcIiBwaGFzZVxuICAgICAgaWYgKGxpbmUuaW5jbHVkZXMoJ2F1ZGl0JykpIHtcbiAgICAgICAgY3VycmVudFN0ZXAgPSAnUnVubmluZyBzZWN1cml0eSBhdWRpdC4uLic7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE9ubHkgdXBkYXRlIGRpc3BsYXkgaWYgd2UgaGF2ZSBtZWFuaW5nZnVsIGluZm9cbiAgICAgIGlmIChjdXJyZW50U3RlcCB8fCBwYWNrYWdlc0FkZGVkID4gMCkge1xuICAgICAgICAvLyBDbGVhciBsaW5lIGFuZCBzaG93IHByb2dyZXNzXG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKTtcbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQuY3Vyc29yVG8oMCk7XG4gICAgICAgIFxuICAgICAgICBpZiAodG90YWxQYWNrYWdlcyA+IDAgJiYgcGFja2FnZXNBZGRlZCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IE1hdGgubWluKHBhY2thZ2VzQWRkZWQgLyB0b3RhbFBhY2thZ2VzLCAxKTtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgICAke2NyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzKX0gJHtwYWNrYWdlc0FkZGVkfS8ke3RvdGFsUGFja2FnZXN9IHBhY2thZ2VzYCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFN0ZXApIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgICAke2xvZ2dlci5jeWFuKCfil4snKX0gJHtjdXJyZW50U3RlcH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gUHJvY2VzcyBzdGRvdXRcbiAgICBpbnN0YWxsQ2hpbGQuc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IGxpbmVzID0gZGF0YS50b1N0cmluZygpLnNwbGl0KCdcXG4nKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAobGluZS50cmltKCkpIHtcbiAgICAgICAgICBsYXN0TGluZSA9IGxpbmU7XG4gICAgICAgICAgdXBkYXRlUHJvZ3Jlc3MobGluZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBQcm9jZXNzIHN0ZGVyciAobnBtIG9mdGVuIG91dHB1dHMgcHJvZ3Jlc3MgdG8gc3RkZXJyKVxuICAgIGluc3RhbGxDaGlsZC5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgY29uc3QgbGluZXMgPSBkYXRhLnRvU3RyaW5nKCkuc3BsaXQoJ1xcbicpO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmIChsaW5lLnRyaW0oKSkge1xuICAgICAgICAgIC8vIFNraXAgV0FSTiBtZXNzYWdlcyBidXQgcHJvY2VzcyBwcm9ncmVzcyBpbmZvXG4gICAgICAgICAgaWYgKCFsaW5lLmluY2x1ZGVzKCdXQVJOJykgJiYgIWxpbmUuaW5jbHVkZXMoJ25wbSB3YXJuJykpIHtcbiAgICAgICAgICAgIGxhc3RMaW5lID0gbGluZTtcbiAgICAgICAgICAgIHVwZGF0ZVByb2dyZXNzKGxpbmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIGluc3RhbGxDaGlsZC5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICAvLyBDbGVhciB0aGUgcHJvZ3Jlc3MgbGluZVxuICAgICAgcHJvY2Vzcy5zdGRvdXQuY2xlYXJMaW5lKDApO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQuY3Vyc29yVG8oMCk7XG4gICAgICBcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIC8vIFNob3cgZmluYWwgc3VtbWFyeVxuICAgICAgICBpZiAocGFja2FnZXNBZGRlZCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2xvZ2dlci5ncmVlbign4pyTJyl9IEluc3RhbGxlZCAke3BhY2thZ2VzQWRkZWR9IHBhY2thZ2VzYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIuZ3JlZW4oJ+KckycpfSBJbnN0YWxsYXRpb24gY29tcGxldGVgKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2xvZ2dlci5yZWQoJ+KclycpfSBJbnN0YWxsYXRpb24gZmFpbGVkYCk7XG4gICAgICAgIGlmIChsYXN0TGluZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICR7bGFzdExpbmV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgbnBtIGluc3RhbGwgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9YCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIGluc3RhbGxDaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LmN1cnNvclRvKDApO1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTaG93IGluaXRpYWwgbWVzc2FnZVxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7bG9nZ2VyLmN5YW4oJ+KXiycpfSBSZXNvbHZpbmcgZGVwZW5kZW5jaWVzLi4uYCk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV2KG9wdGlvbnM6IERldk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xuICBcbiAgbG9nZ2VyLmluZm8oJ1N0YXJ0aW5nIERldkRvYyBkZXZlbG9wbWVudCBzZXJ2ZXIuLi4nKTtcbiAgXG4gIC8vIENoZWNrIGZvciBkb2NzLmpzb25cbiAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2RvY3MuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ2RvY3MuanNvbiBub3QgZm91bmQgaW4gY3VycmVudCBkaXJlY3RvcnknKTtcbiAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGluaXRcIiB0byBjcmVhdGUgYSBuZXcgZG9jdW1lbnRhdGlvbiBwcm9qZWN0Jyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIFxuICAvLyBMb2FkIGFuZCB2YWxpZGF0ZSBjb25maWdcbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHByb2plY3RSb290KTtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICBcbiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignSW52YWxpZCBkb2NzLmpzb24gY29uZmlndXJhdGlvbjonKTtcbiAgICAgIHZhbGlkYXRpb24uZXJyb3JzLmZvckVhY2goZXJyID0+IGxvZ2dlci5lcnJvcihgICAtICR7ZXJyfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLnN1Y2Nlc3MoYExvYWRlZCBjb25maWd1cmF0aW9uOiAke2NvbmZpZy5uYW1lIHx8ICdVbnRpdGxlZCd9YCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGRvY3MuanNvbjogJHttZXNzYWdlfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBcbiAgLy8gR2V0IHRoZSByZW5kZXJlciBkaXJlY3RvcnkgKGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UpXG4gIGNvbnN0IHJlbmRlcmVyRGlyID0gZ2V0UmVuZGVyZXJEaXIoKTtcbiAgXG4gIGlmICghcmVuZGVyZXJEaXIgfHwgIWZzLmV4aXN0c1N5bmMocmVuZGVyZXJEaXIpKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdSZW5kZXJlciBub3QgZm91bmQuIFBhY2thZ2UgbWF5IGJlIGNvcnJ1cHRlZC4nKTtcbiAgICBsb2dnZXIuZGVidWcoYExvb2tlZCBmb3IgcmVuZGVyZXIgYXQ6ICR7cmVuZGVyZXJEaXJ9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIFxuICAvLyBDaGVjayBpZiByZW5kZXJlciBoYXMgbm9kZV9tb2R1bGVzXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aCA9IHBhdGguam9pbihyZW5kZXJlckRpciwgJ25vZGVfbW9kdWxlcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobm9kZU1vZHVsZXNQYXRoKSkge1xuICAgIGxvZ2dlci5pbmZvKCdJbnN0YWxsaW5nIHJlbmRlcmVyIGRlcGVuZGVuY2llcyAoZmlyc3QgcnVuKS4uLicpO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICBcbiAgICBhd2FpdCBpbnN0YWxsV2l0aFByb2dyZXNzKHJlbmRlcmVyRGlyKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ0RlcGVuZGVuY2llcyBpbnN0YWxsZWQnKTtcbiAgfVxuICBcbiAgLy8gRmluZCBhdmFpbGFibGUgcG9ydFxuICBjb25zdCByZXF1ZXN0ZWRQb3J0ID0gcGFyc2VJbnQob3B0aW9ucy5wb3J0LCAxMCk7XG4gIGxldCBhY3R1YWxQb3J0OiBudW1iZXI7XG4gIFxuICB0cnkge1xuICAgIGFjdHVhbFBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydChyZXF1ZXN0ZWRQb3J0LCBvcHRpb25zLmhvc3QpO1xuICAgIGlmIChhY3R1YWxQb3J0ICE9PSByZXF1ZXN0ZWRQb3J0KSB7XG4gICAgICBsb2dnZXIud2FybihgUG9ydCAke3JlcXVlc3RlZFBvcnR9IGlzIGluIHVzZSwgdXNpbmcgJHthY3R1YWxQb3J0fSBpbnN0ZWFkYCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2UpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBcbiAgLy8gU2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyAtIHVzZSBTVEFSVEVSX1BBVEggd2l0aCBhYnNvbHV0ZSBwYXRoXG4gIGNvbnN0IGVudiA9IHtcbiAgICAuLi5wcm9jZXNzLmVudixcbiAgICBTVEFSVEVSX1BBVEg6IHByb2plY3RSb290LCAvLyBBYnNvbHV0ZSBwYXRoIHRvIHVzZXIncyBwcm9qZWN0XG4gICAgUE9SVDogU3RyaW5nKGFjdHVhbFBvcnQpLFxuICAgIEhPU1ROQU1FOiBvcHRpb25zLmhvc3QsXG4gIH07XG4gIFxuICBjb25zdCBzZXJ2ZXJVcmwgPSBgaHR0cDovLyR7b3B0aW9ucy5ob3N0fToke2FjdHVhbFBvcnR9YDtcbiAgXG4gIGxvZ2dlci5pbmZvKGBDb250ZW50IGRpcmVjdG9yeTogJHtwcm9qZWN0Um9vdH1gKTtcbiAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nIHNlcnZlciBhdCAke3NlcnZlclVybH1gKTtcbiAgbG9nZ2VyLmluZm8oJ1ByZXNzIEN0cmwrQyB0byBzdG9wXFxuJyk7XG4gIFxuICAvLyBTdGFydCBOZXh0LmpzIGRldiBzZXJ2ZXIgd2l0aCBUdXJib3BhY2sgZm9yIGJldHRlciBwYXRoIGFsaWFzIHN1cHBvcnRcbiAgY29uc3QgY2hpbGQgPSBzcGF3bihcbiAgICAnbnB4JyxcbiAgICBbJ25leHQnLCAnZGV2JywgJy0tdHVyYm8nLCAnLXAnLCBTdHJpbmcoYWN0dWFsUG9ydCksICctSCcsIG9wdGlvbnMuaG9zdF0sXG4gICAge1xuICAgICAgY3dkOiByZW5kZXJlckRpcixcbiAgICAgIGVudixcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICB9XG4gICk7XG4gIFxuICAvLyBPcGVuIGJyb3dzZXIgYWZ0ZXIgYSBzaG9ydCBkZWxheSB0byBsZXQgdGhlIHNlcnZlciBzdGFydFxuICBpZiAob3B0aW9ucy5vcGVuKSB7XG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhgT3BlbmluZyAke3NlcnZlclVybH0gaW4geW91ciBicm93c2VyLi4uYCk7XG4gICAgICBhd2FpdCBvcGVuQnJvd3NlcihzZXJ2ZXJVcmwpO1xuICAgIH0sIDMwMDApOyAvLyBXYWl0IDMgc2Vjb25kcyBmb3Igc2VydmVyIHRvIGJlIHJlYWR5XG4gIH1cbiAgXG4gIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG4gIFxuICBjaGlsZC5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMCk7XG4gIH0pO1xuICBcbiAgLy8gSGFuZGxlIHRlcm1pbmF0aW9uXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHtcbiAgICBjaGlsZC5raWxsKCdTSUdJTlQnKTtcbiAgfSk7XG4gIFxuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4ge1xuICAgIGNoaWxkLmtpbGwoJ1NJR1RFUk0nKTtcbiAgfSk7XG59XG4iXX0=
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9kZXYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFnTEEsa0JBc0hDO0FBdFNELGlEQUFzQztBQUN0QyxnREFBd0I7QUFDeEIsd0RBQTBCO0FBQzFCLDhDQUFzQjtBQUN0Qix5Q0FBMEQ7QUFDMUQsK0NBQTRDO0FBQzVDLDZDQUFtRDtBQVFuRDs7R0FFRztBQUNILEtBQUssVUFBVSxXQUFXLENBQUMsR0FBVztJQUNwQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTdCLElBQUksQ0FBQztRQUNILElBQUksT0FBZSxDQUFDO1FBQ3BCLElBQUksSUFBYyxDQUFDO1FBRW5CLFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDakIsS0FBSyxRQUFRLEVBQUUsUUFBUTtnQkFDckIsT0FBTyxHQUFHLE1BQU0sQ0FBQztnQkFDakIsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2IsTUFBTTtZQUNSLEtBQUssT0FBTyxFQUFFLFVBQVU7Z0JBQ3RCLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ2hCLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1IsU0FBUyxtQkFBbUI7Z0JBQzFCLE9BQU8sR0FBRyxVQUFVLENBQUM7Z0JBQ3JCLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNiLE1BQU07UUFDVixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBQSxxQkFBSyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7WUFDakMsS0FBSyxFQUFFLFFBQVE7WUFDZixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsMkNB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Q0FBQztRQUMvQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyx3Q0FBd0M7SUFDcEQsQ0FBQztJQUVELEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDMUIsZUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDekQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxxQkFBcUI7SUFDckIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IG5ldCBmcm9tICduZXQnO1xuaW1wb3J0IHsgbG9hZENvbmZpZywgdmFsaWRhdGVDb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IGdldFJlbmRlcmVyRGlyIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGF0aHMnO1xuXG5pbnRlcmZhY2UgRGV2T3B0aW9ucyB7XG4gIHBvcnQ6IHN0cmluZztcbiAgaG9zdDogc3RyaW5nO1xuICBvcGVuOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wZW4gVVJMIGluIHRoZSBkZWZhdWx0IGJyb3dzZXIgKGNyb3NzLXBsYXRmb3JtKVxuICovXG5hc3luYyBmdW5jdGlvbiBvcGVuQnJvd3Nlcih1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHBsYXRmb3JtIH0gPSBwcm9jZXNzO1xuICBcbiAgdHJ5IHtcbiAgICBsZXQgY29tbWFuZDogc3RyaW5nO1xuICAgIGxldCBhcmdzOiBzdHJpbmdbXTtcbiAgICBcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICBjYXNlICdkYXJ3aW4nOiAvLyBtYWNPU1xuICAgICAgICBjb21tYW5kID0gJ29wZW4nO1xuICAgICAgICBhcmdzID0gW3VybF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2luMzInOiAvLyBXaW5kb3dzXG4gICAgICAgIGNvbW1hbmQgPSAnY21kJztcbiAgICAgICAgYXJncyA9IFsnL2MnLCAnc3RhcnQnLCAnJywgdXJsXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OiAvLyBMaW51eCBhbmQgb3RoZXJzXG4gICAgICAgIGNvbW1hbmQgPSAneGRnLW9wZW4nO1xuICAgICAgICBhcmdzID0gW3VybF07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgIH0pO1xuICAgIFxuICAgIGNoaWxkLnVucmVmKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFNpbGVudGx5IGZhaWwgaWYgYnJvd3NlciBjYW4ndCBiZSBvcGVuZWRcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcG9ydCBpcyBhdmFpbGFibGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlciwgaG9zdDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IG5ldC5jcmVhdGVTZXJ2ZXIoKTtcbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoKSA9PiByZXNvbHZlKGZhbHNlKSk7XG4gICAgc2VydmVyLm9uY2UoJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgIHNlcnZlci5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICB9KTtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBGaW5kIGFuIGF2YWlsYWJsZSBwb3J0IHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuIHBvcnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZEF2YWlsYWJsZVBvcnQoc3RhcnRQb3J0OiBudW1iZXIsIGhvc3Q6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGxldCBwb3J0ID0gc3RhcnRQb3J0O1xuICBjb25zdCBtYXhBdHRlbXB0cyA9IDEwO1xuICBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhBdHRlbXB0czsgaSsrKSB7XG4gICAgaWYgKGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0LCBob3N0KSkge1xuICAgICAgcmV0dXJuIHBvcnQ7XG4gICAgfVxuICAgIHBvcnQrKztcbiAgfVxuICBcbiAgdGhyb3cgbmV3IEVycm9yKGBObyBhdmFpbGFibGUgcG9ydCBmb3VuZCBiZXR3ZWVuICR7c3RhcnRQb3J0fSBhbmQgJHtzdGFydFBvcnQgKyBtYXhBdHRlbXB0cyAtIDF9YCk7XG59XG5cbi8qKlxuICogU3Bpbm5lciBmcmFtZXMgZm9yIGFuaW1hdGVkIHByb2dyZXNzXG4gKi9cbmNvbnN0IFNQSU5ORVJfRlJBTUVTID0gWyfioIsnLCAn4qCZJywgJ+KguScsICfioLgnLCAn4qC8JywgJ+KgtCcsICfioKYnLCAn4qCnJywgJ+KghycsICfioI8nXTtcblxuLyoqXG4gKiBJbnN0YWxsIGRlcGVuZGVuY2llcyB3aXRoIGFuaW1hdGVkIHByb2dyZXNzIGRpc3BsYXlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFdpdGhQcm9ncmVzcyhjd2Q6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbGxDaGlsZCA9IHNwYXduKCducG0nLCBbJ2luc3RhbGwnXSwge1xuICAgICAgY3dkLFxuICAgICAgc3RkaW86IFsncGlwZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgIH0pO1xuICAgIFxuICAgIGxldCBjdXJyZW50U3RlcCA9ICdSZXNvbHZpbmcgZGVwZW5kZW5jaWVzLi4uJztcbiAgICBsZXQgcGFja2FnZXNBZGRlZCA9IDA7XG4gICAgbGV0IHNwaW5uZXJJbmRleCA9IDA7XG4gICAgbGV0IGxhc3RPdXRwdXQgPSAnJztcbiAgICBcbiAgICAvLyBBbmltYXRlZCBzcGlubmVyXG4gICAgY29uc3Qgc3Bpbm5lckludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQuY2xlYXJMaW5lKDApO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQuY3Vyc29yVG8oMCk7XG4gICAgICBjb25zdCBzcGlubmVyID0gU1BJTk5FUl9GUkFNRVNbc3Bpbm5lckluZGV4ICUgU1BJTk5FUl9GUkFNRVMubGVuZ3RoXTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7bG9nZ2VyLmN5YW4oc3Bpbm5lcil9ICR7Y3VycmVudFN0ZXB9YCk7XG4gICAgICBzcGlubmVySW5kZXgrKztcbiAgICB9LCA4MCk7XG4gICAgXG4gICAgY29uc3QgdXBkYXRlU3RlcCA9IChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIERldGVjdCBwaGFzZXMgZnJvbSBucG0gb3V0cHV0XG4gICAgICBpZiAobGluZS5pbmNsdWRlcygnaWRlYWxUcmVlJykgfHwgbGluZS5pbmNsdWRlcygncmVzb2x2aW5nJykpIHtcbiAgICAgICAgY3VycmVudFN0ZXAgPSAnUmVzb2x2aW5nIGRlcGVuZGVuY2llcy4uLic7XG4gICAgICB9IGVsc2UgaWYgKGxpbmUuaW5jbHVkZXMoJ3JlaWZ5JykgfHwgbGluZS5pbmNsdWRlcygnZXh0cmFjdCcpKSB7XG4gICAgICAgIGN1cnJlbnRTdGVwID0gJ0luc3RhbGxpbmcgcGFja2FnZXMuLi4nO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLmluY2x1ZGVzKCdhdWRpdCcpKSB7XG4gICAgICAgIGN1cnJlbnRTdGVwID0gJ1J1bm5pbmcgc2VjdXJpdHkgYXVkaXQuLi4nO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLmluY2x1ZGVzKCdhZGRlZCcpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvYWRkZWQgKFxcZCspIHBhY2thZ2VzPy9pKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgcGFja2FnZXNBZGRlZCA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgY3VycmVudFN0ZXAgPSBgSW5zdGFsbGVkICR7cGFja2FnZXNBZGRlZH0gcGFja2FnZXNgO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsYXN0T3V0cHV0ID0gbGluZTtcbiAgICB9O1xuICAgIFxuICAgIC8vIFByb2Nlc3Mgc3Rkb3V0XG4gICAgaW5zdGFsbENoaWxkLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICBkYXRhLnRvU3RyaW5nKCkuc3BsaXQoJ1xcbicpLmZvckVhY2gobGluZSA9PiB7XG4gICAgICAgIGlmIChsaW5lLnRyaW0oKSkgdXBkYXRlU3RlcChsaW5lKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIFByb2Nlc3Mgc3RkZXJyIChucG0gb3V0cHV0cyBwcm9ncmVzcyB0byBzdGRlcnIpXG4gICAgaW5zdGFsbENoaWxkLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICBkYXRhLnRvU3RyaW5nKCkuc3BsaXQoJ1xcbicpLmZvckVhY2gobGluZSA9PiB7XG4gICAgICAgIGlmIChsaW5lLnRyaW0oKSAmJiAhbGluZS5pbmNsdWRlcygnV0FSTicpICYmICFsaW5lLmluY2x1ZGVzKCducG0gd2FybicpKSB7XG4gICAgICAgICAgdXBkYXRlU3RlcChsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgXG4gICAgaW5zdGFsbENoaWxkLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoc3Bpbm5lckludGVydmFsKTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LmN1cnNvclRvKDApO1xuICAgICAgXG4gICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICBpZiAocGFja2FnZXNBZGRlZCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2xvZ2dlci5ncmVlbign4pyTJyl9IEluc3RhbGxlZCAke3BhY2thZ2VzQWRkZWR9IHBhY2thZ2VzYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIuZ3JlZW4oJ+KckycpfSBEZXBlbmRlbmNpZXMgaW5zdGFsbGVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIucmVkKCfinJcnKX0gSW5zdGFsbGF0aW9uIGZhaWxlZGApO1xuICAgICAgICBpZiAobGFzdE91dHB1dCAmJiAhbGFzdE91dHB1dC5pbmNsdWRlcygnbnBtIHdhcm4nKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtsYXN0T3V0cHV0fWApO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYG5wbSBpbnN0YWxsIGZhaWxlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICBpbnN0YWxsQ2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKHNwaW5uZXJJbnRlcnZhbCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoMCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC5jdXJzb3JUbygwKTtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV2KG9wdGlvbnM6IERldk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xuICBcbiAgbG9nZ2VyLmluZm8oJ1N0YXJ0aW5nIERldkRvYyBkZXZlbG9wbWVudCBzZXJ2ZXIuLi4nKTtcbiAgXG4gIC8vIENoZWNrIGZvciBkb2NzLmpzb25cbiAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2RvY3MuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ2RvY3MuanNvbiBub3QgZm91bmQgaW4gY3VycmVudCBkaXJlY3RvcnknKTtcbiAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGluaXRcIiB0byBjcmVhdGUgYSBuZXcgZG9jdW1lbnRhdGlvbiBwcm9qZWN0Jyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIFxuICAvLyBMb2FkIGFuZCB2YWxpZGF0ZSBjb25maWdcbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHByb2plY3RSb290KTtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICBcbiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignSW52YWxpZCBkb2NzLmpzb24gY29uZmlndXJhdGlvbjonKTtcbiAgICAgIHZhbGlkYXRpb24uZXJyb3JzLmZvckVhY2goZXJyID0+IGxvZ2dlci5lcnJvcihgICAtICR7ZXJyfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLnN1Y2Nlc3MoYExvYWRlZCBjb25maWd1cmF0aW9uOiAke2NvbmZpZy5uYW1lIHx8ICdVbnRpdGxlZCd9YCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGRvY3MuanNvbjogJHttZXNzYWdlfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBcbiAgLy8gR2V0IHRoZSByZW5kZXJlciBkaXJlY3RvcnkgKGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UpXG4gIGNvbnN0IHJlbmRlcmVyRGlyID0gZ2V0UmVuZGVyZXJEaXIoKTtcbiAgXG4gIGlmICghcmVuZGVyZXJEaXIgfHwgIWZzLmV4aXN0c1N5bmMocmVuZGVyZXJEaXIpKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdSZW5kZXJlciBub3QgZm91bmQuIFBhY2thZ2UgbWF5IGJlIGNvcnJ1cHRlZC4nKTtcbiAgICBsb2dnZXIuZGVidWcoYExvb2tlZCBmb3IgcmVuZGVyZXIgYXQ6ICR7cmVuZGVyZXJEaXJ9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIFxuICAvLyBDaGVjayBpZiByZW5kZXJlciBoYXMgbm9kZV9tb2R1bGVzXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aCA9IHBhdGguam9pbihyZW5kZXJlckRpciwgJ25vZGVfbW9kdWxlcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobm9kZU1vZHVsZXNQYXRoKSkge1xuICAgIGxvZ2dlci5pbmZvKCdJbnN0YWxsaW5nIHJlbmRlcmVyIGRlcGVuZGVuY2llcyAoZmlyc3QgcnVuKS4uLicpO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICBcbiAgICBhd2FpdCBpbnN0YWxsV2l0aFByb2dyZXNzKHJlbmRlcmVyRGlyKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ0RlcGVuZGVuY2llcyBpbnN0YWxsZWQnKTtcbiAgfVxuICBcbiAgLy8gRmluZCBhdmFpbGFibGUgcG9ydFxuICBjb25zdCByZXF1ZXN0ZWRQb3J0ID0gcGFyc2VJbnQob3B0aW9ucy5wb3J0LCAxMCk7XG4gIGxldCBhY3R1YWxQb3J0OiBudW1iZXI7XG4gIFxuICB0cnkge1xuICAgIGFjdHVhbFBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydChyZXF1ZXN0ZWRQb3J0LCBvcHRpb25zLmhvc3QpO1xuICAgIGlmIChhY3R1YWxQb3J0ICE9PSByZXF1ZXN0ZWRQb3J0KSB7XG4gICAgICBsb2dnZXIud2FybihgUG9ydCAke3JlcXVlc3RlZFBvcnR9IGlzIGluIHVzZSwgdXNpbmcgJHthY3R1YWxQb3J0fSBpbnN0ZWFkYCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2UpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBcbiAgLy8gU2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyAtIHVzZSBTVEFSVEVSX1BBVEggd2l0aCBhYnNvbHV0ZSBwYXRoXG4gIGNvbnN0IGVudiA9IHtcbiAgICAuLi5wcm9jZXNzLmVudixcbiAgICBTVEFSVEVSX1BBVEg6IHByb2plY3RSb290LCAvLyBBYnNvbHV0ZSBwYXRoIHRvIHVzZXIncyBwcm9qZWN0XG4gICAgUE9SVDogU3RyaW5nKGFjdHVhbFBvcnQpLFxuICAgIEhPU1ROQU1FOiBvcHRpb25zLmhvc3QsXG4gIH07XG4gIFxuICBjb25zdCBzZXJ2ZXJVcmwgPSBgaHR0cDovLyR7b3B0aW9ucy5ob3N0fToke2FjdHVhbFBvcnR9YDtcbiAgXG4gIGxvZ2dlci5pbmZvKGBDb250ZW50IGRpcmVjdG9yeTogJHtwcm9qZWN0Um9vdH1gKTtcbiAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nIHNlcnZlciBhdCAke3NlcnZlclVybH1gKTtcbiAgbG9nZ2VyLmluZm8oJ1ByZXNzIEN0cmwrQyB0byBzdG9wXFxuJyk7XG4gIFxuICAvLyBTdGFydCBOZXh0LmpzIGRldiBzZXJ2ZXIgd2l0aCBUdXJib3BhY2sgZm9yIGJldHRlciBwYXRoIGFsaWFzIHN1cHBvcnRcbiAgY29uc3QgY2hpbGQgPSBzcGF3bihcbiAgICAnbnB4JyxcbiAgICBbJ25leHQnLCAnZGV2JywgJy0tdHVyYm8nLCAnLXAnLCBTdHJpbmcoYWN0dWFsUG9ydCksICctSCcsIG9wdGlvbnMuaG9zdF0sXG4gICAge1xuICAgICAgY3dkOiByZW5kZXJlckRpcixcbiAgICAgIGVudixcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICB9XG4gICk7XG4gIFxuICAvLyBPcGVuIGJyb3dzZXIgYWZ0ZXIgYSBzaG9ydCBkZWxheSB0byBsZXQgdGhlIHNlcnZlciBzdGFydFxuICBpZiAob3B0aW9ucy5vcGVuKSB7XG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhgT3BlbmluZyAke3NlcnZlclVybH0gaW4geW91ciBicm93c2VyLi4uYCk7XG4gICAgICBhd2FpdCBvcGVuQnJvd3NlcihzZXJ2ZXJVcmwpO1xuICAgIH0sIDMwMDApOyAvLyBXYWl0IDMgc2Vjb25kcyBmb3Igc2VydmVyIHRvIGJlIHJlYWR5XG4gIH1cbiAgXG4gIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG4gIFxuICBjaGlsZC5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMCk7XG4gIH0pO1xuICBcbiAgLy8gSGFuZGxlIHRlcm1pbmF0aW9uXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHtcbiAgICBjaGlsZC5raWxsKCdTSUdJTlQnKTtcbiAgfSk7XG4gIFxuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4ge1xuICAgIGNoaWxkLmtpbGwoJ1NJR1RFUk0nKTtcbiAgfSk7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brainfish-ai/devdoc",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.27",
|
|
4
4
|
"description": "Documentation framework for developers. Write docs in MDX, preview locally, deploy to Brainfish.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
"build:bundle": "node scripts/build.js",
|
|
13
13
|
"build": "npm run build:cli",
|
|
14
14
|
"dev": "tsc --watch",
|
|
15
|
-
"test:dev": "npm run build:cli && cd ../../devdoc
|
|
16
|
-
"test:check": "npm run build:cli && cd ../../devdoc
|
|
15
|
+
"test:dev": "npm run build:cli && cd ../../devdoc/docs && node ../../packages/devdoc/bin/devdoc.js dev",
|
|
16
|
+
"test:check": "npm run build:cli && cd ../../devdoc/docs && node ../../packages/devdoc/bin/devdoc.js check",
|
|
17
17
|
"prepublishOnly": "npm run build:bundle"
|
|
18
18
|
},
|
|
19
19
|
"keywords": [
|
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"commander": "^12.0.0",
|
|
34
|
-
"fs-extra": "^11.2.0"
|
|
34
|
+
"fs-extra": "^11.2.0",
|
|
35
|
+
"giget": "^1.2.3"
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|
|
37
38
|
"@types/node": "^20.0.0",
|
|
@@ -41,8 +42,7 @@
|
|
|
41
42
|
"files": [
|
|
42
43
|
"bin",
|
|
43
44
|
"dist",
|
|
44
|
-
"renderer"
|
|
45
|
-
"templates"
|
|
45
|
+
"renderer"
|
|
46
46
|
],
|
|
47
47
|
"repository": {
|
|
48
48
|
"type": "git",
|
|
@@ -29,6 +29,7 @@ const prettyCodeOptions = {
|
|
|
29
29
|
export async function GET(request: NextRequest) {
|
|
30
30
|
const searchParams = request.nextUrl.searchParams
|
|
31
31
|
const slug = searchParams.get('slug')
|
|
32
|
+
const is404Request = searchParams.get('is404') === 'true'
|
|
32
33
|
|
|
33
34
|
if (!slug) {
|
|
34
35
|
return NextResponse.json(
|
|
@@ -42,7 +43,7 @@ export async function GET(request: NextRequest) {
|
|
|
42
43
|
|
|
43
44
|
// If multi-tenant, fetch from Blob Storage
|
|
44
45
|
if (projectSlug && !projectSlug.startsWith('custom:')) {
|
|
45
|
-
return handleMultiTenantDocs(projectSlug, slug)
|
|
46
|
+
return handleMultiTenantDocs(projectSlug, slug, is404Request)
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
try {
|
|
@@ -55,6 +56,8 @@ export async function GET(request: NextRequest) {
|
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
if (!existsSync(fullPath)) {
|
|
59
|
+
// For 404 page requests, return 404 status (not a server error)
|
|
60
|
+
// The client will handle showing the default 404 if custom doesn't exist
|
|
58
61
|
return NextResponse.json(
|
|
59
62
|
{ error: 'Page not found' },
|
|
60
63
|
{ status: 404 }
|
|
@@ -122,7 +125,7 @@ export async function GET(request: NextRequest) {
|
|
|
122
125
|
/**
|
|
123
126
|
* Handle multi-tenant docs request - fetch from Blob Storage
|
|
124
127
|
*/
|
|
125
|
-
async function handleMultiTenantDocs(projectSlug: string, slug: string): Promise<Response> {
|
|
128
|
+
async function handleMultiTenantDocs(projectSlug: string, slug: string, is404Request: boolean = false): Promise<Response> {
|
|
126
129
|
try {
|
|
127
130
|
// Try .mdx then .md
|
|
128
131
|
let fileContent = await getProjectFile(projectSlug, `${slug}.mdx`)
|
|
@@ -131,6 +134,7 @@ async function handleMultiTenantDocs(projectSlug: string, slug: string): Promise
|
|
|
131
134
|
}
|
|
132
135
|
|
|
133
136
|
if (!fileContent) {
|
|
137
|
+
// For 404 page requests, return 404 status
|
|
134
138
|
return NextResponse.json(
|
|
135
139
|
{ error: 'Page not found' },
|
|
136
140
|
{ status: 404 }
|
|
@@ -5,6 +5,7 @@ import { Spinner } from '@phosphor-icons/react'
|
|
|
5
5
|
import { MDXRemote, MDXRemoteSerializeResult } from 'next-mdx-remote'
|
|
6
6
|
import { useDocsNavigation } from '@/lib/docs-navigation-context'
|
|
7
7
|
import { useCodeCopy } from '@/hooks/use-code-copy'
|
|
8
|
+
import { NotFoundPage } from './not-found-page'
|
|
8
9
|
|
|
9
10
|
// Custom Link component for MDX - uses docs navigation context
|
|
10
11
|
function MdxLink({ href, children, ...props }: React.AnchorHTMLAttributes<HTMLAnchorElement>) {
|
|
@@ -225,6 +226,7 @@ const mdxComponents = {
|
|
|
225
226
|
|
|
226
227
|
interface DocPageProps {
|
|
227
228
|
slug: string
|
|
229
|
+
onSearch?: () => void
|
|
228
230
|
}
|
|
229
231
|
|
|
230
232
|
interface DocPageData {
|
|
@@ -242,10 +244,11 @@ interface DocPageData {
|
|
|
242
244
|
mdxSource: MDXRemoteSerializeResult
|
|
243
245
|
}
|
|
244
246
|
|
|
245
|
-
export function DocPage({ slug }: DocPageProps) {
|
|
247
|
+
export function DocPage({ slug, onSearch }: DocPageProps) {
|
|
246
248
|
const [pageData, setPageData] = useState<DocPageData | null>(null)
|
|
247
249
|
const [loading, setLoading] = useState(true)
|
|
248
250
|
const [error, setError] = useState<string | null>(null)
|
|
251
|
+
const [isNotFound, setIsNotFound] = useState(false)
|
|
249
252
|
const contentRef = useRef<HTMLDivElement>(null)
|
|
250
253
|
|
|
251
254
|
// Add copy buttons to code blocks after content loads
|
|
@@ -256,9 +259,15 @@ export function DocPage({ slug }: DocPageProps) {
|
|
|
256
259
|
try {
|
|
257
260
|
setLoading(true)
|
|
258
261
|
setError(null)
|
|
262
|
+
setIsNotFound(false)
|
|
259
263
|
|
|
260
264
|
const response = await fetch(`/api/docs?slug=${encodeURIComponent(slug)}`)
|
|
261
265
|
|
|
266
|
+
if (response.status === 404) {
|
|
267
|
+
setIsNotFound(true)
|
|
268
|
+
return
|
|
269
|
+
}
|
|
270
|
+
|
|
262
271
|
if (!response.ok) {
|
|
263
272
|
throw new Error('Failed to load page')
|
|
264
273
|
}
|
|
@@ -286,11 +295,17 @@ export function DocPage({ slug }: DocPageProps) {
|
|
|
286
295
|
)
|
|
287
296
|
}
|
|
288
297
|
|
|
298
|
+
// Show 404 page for not found errors
|
|
299
|
+
if (isNotFound) {
|
|
300
|
+
return <NotFoundPage slug={slug} onSearch={onSearch} />
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Show generic error for other errors
|
|
289
304
|
if (error || !pageData) {
|
|
290
305
|
return (
|
|
291
306
|
<div className="docs-page docs-page-error w-full min-h-[200px]">
|
|
292
307
|
<div className="docs-error text-center py-12">
|
|
293
|
-
<p className="text-destructive">{error || '
|
|
308
|
+
<p className="text-destructive">{error || 'Failed to load page'}</p>
|
|
294
309
|
</div>
|
|
295
310
|
</div>
|
|
296
311
|
)
|