@brainfish-ai/devdoc 0.1.21
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/LICENSE +33 -0
- package/README.md +415 -0
- package/bin/devdoc.js +13 -0
- package/dist/cli/commands/build.d.ts +5 -0
- package/dist/cli/commands/build.js +87 -0
- package/dist/cli/commands/check.d.ts +1 -0
- package/dist/cli/commands/check.js +143 -0
- package/dist/cli/commands/create.d.ts +24 -0
- package/dist/cli/commands/create.js +387 -0
- package/dist/cli/commands/deploy.d.ts +9 -0
- package/dist/cli/commands/deploy.js +433 -0
- package/dist/cli/commands/dev.d.ts +6 -0
- package/dist/cli/commands/dev.js +139 -0
- package/dist/cli/commands/init.d.ts +11 -0
- package/dist/cli/commands/init.js +238 -0
- package/dist/cli/commands/keys.d.ts +12 -0
- package/dist/cli/commands/keys.js +165 -0
- package/dist/cli/commands/start.d.ts +5 -0
- package/dist/cli/commands/start.js +56 -0
- package/dist/cli/commands/upload.d.ts +13 -0
- package/dist/cli/commands/upload.js +238 -0
- package/dist/cli/commands/whoami.d.ts +8 -0
- package/dist/cli/commands/whoami.js +91 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +106 -0
- package/dist/config/index.d.ts +80 -0
- package/dist/config/index.js +133 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.js +13 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +12 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.js +61 -0
- package/dist/utils/paths.d.ts +16 -0
- package/dist/utils/paths.js +50 -0
- package/package.json +51 -0
- package/renderer/app/api/assets/[...path]/route.ts +123 -0
- package/renderer/app/api/assets/route.ts +124 -0
- package/renderer/app/api/assets/upload/route.ts +177 -0
- package/renderer/app/api/auth-schemes/route.ts +77 -0
- package/renderer/app/api/chat/route.ts +858 -0
- package/renderer/app/api/codegen/route.ts +72 -0
- package/renderer/app/api/collections/route.ts +1016 -0
- package/renderer/app/api/debug/route.ts +53 -0
- package/renderer/app/api/deploy/route.ts +234 -0
- package/renderer/app/api/device/route.ts +42 -0
- package/renderer/app/api/docs/route.ts +187 -0
- package/renderer/app/api/keys/regenerate/route.ts +80 -0
- package/renderer/app/api/openapi-spec/route.ts +151 -0
- package/renderer/app/api/projects/[slug]/route.ts +153 -0
- package/renderer/app/api/projects/[slug]/stats/route.ts +96 -0
- package/renderer/app/api/projects/register/route.ts +152 -0
- package/renderer/app/api/proxy/route.ts +149 -0
- package/renderer/app/api/proxy-stream/route.ts +168 -0
- package/renderer/app/api/redirects/route.ts +47 -0
- package/renderer/app/api/schema/route.ts +65 -0
- package/renderer/app/api/subdomains/check/route.ts +172 -0
- package/renderer/app/api/suggestions/route.ts +144 -0
- package/renderer/app/favicon.ico +0 -0
- package/renderer/app/globals.css +1103 -0
- package/renderer/app/layout.tsx +47 -0
- package/renderer/app/llms-full.txt/route.ts +346 -0
- package/renderer/app/llms.txt/route.ts +279 -0
- package/renderer/app/page.tsx +14 -0
- package/renderer/app/robots.txt/route.ts +84 -0
- package/renderer/app/sitemap.xml/route.ts +199 -0
- package/renderer/components/docs/index.ts +12 -0
- package/renderer/components/docs/mdx/accordion.tsx +169 -0
- package/renderer/components/docs/mdx/badge.tsx +132 -0
- package/renderer/components/docs/mdx/callouts.tsx +154 -0
- package/renderer/components/docs/mdx/cards.tsx +213 -0
- package/renderer/components/docs/mdx/changelog.tsx +120 -0
- package/renderer/components/docs/mdx/code-block.tsx +186 -0
- package/renderer/components/docs/mdx/code-group.tsx +421 -0
- package/renderer/components/docs/mdx/file-embeds.tsx +105 -0
- package/renderer/components/docs/mdx/frame.tsx +112 -0
- package/renderer/components/docs/mdx/highlight.tsx +151 -0
- package/renderer/components/docs/mdx/iframe.tsx +134 -0
- package/renderer/components/docs/mdx/image.tsx +235 -0
- package/renderer/components/docs/mdx/index.ts +204 -0
- package/renderer/components/docs/mdx/mermaid.tsx +240 -0
- package/renderer/components/docs/mdx/param-field.tsx +200 -0
- package/renderer/components/docs/mdx/steps.tsx +113 -0
- package/renderer/components/docs/mdx/tabs.tsx +86 -0
- package/renderer/components/docs/mdx-renderer.tsx +100 -0
- package/renderer/components/docs/navigation/breadcrumbs.tsx +76 -0
- package/renderer/components/docs/navigation/index.ts +8 -0
- package/renderer/components/docs/navigation/page-nav.tsx +64 -0
- package/renderer/components/docs/navigation/sidebar.tsx +515 -0
- package/renderer/components/docs/navigation/toc.tsx +113 -0
- package/renderer/components/docs/notice.tsx +105 -0
- package/renderer/components/docs-header.tsx +274 -0
- package/renderer/components/docs-viewer/agent/agent-chat.tsx +2076 -0
- package/renderer/components/docs-viewer/agent/cards/debug-context-card.tsx +90 -0
- package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.tsx +49 -0
- package/renderer/components/docs-viewer/agent/cards/index.tsx +50 -0
- package/renderer/components/docs-viewer/agent/cards/response-options-card.tsx +212 -0
- package/renderer/components/docs-viewer/agent/cards/types.ts +84 -0
- package/renderer/components/docs-viewer/agent/chat-message.tsx +17 -0
- package/renderer/components/docs-viewer/agent/index.tsx +6 -0
- package/renderer/components/docs-viewer/agent/messages/assistant-message.tsx +119 -0
- package/renderer/components/docs-viewer/agent/messages/chat-message.tsx +46 -0
- package/renderer/components/docs-viewer/agent/messages/index.ts +17 -0
- package/renderer/components/docs-viewer/agent/messages/tool-call-display.tsx +721 -0
- package/renderer/components/docs-viewer/agent/messages/types.ts +61 -0
- package/renderer/components/docs-viewer/agent/messages/typing-indicator.tsx +24 -0
- package/renderer/components/docs-viewer/agent/messages/user-message.tsx +51 -0
- package/renderer/components/docs-viewer/code-editor/index.tsx +2 -0
- package/renderer/components/docs-viewer/code-editor/notes-mode.tsx +1283 -0
- package/renderer/components/docs-viewer/content/changelog-page.tsx +331 -0
- package/renderer/components/docs-viewer/content/doc-page.tsx +285 -0
- package/renderer/components/docs-viewer/content/documentation-viewer.tsx +17 -0
- package/renderer/components/docs-viewer/content/index.tsx +29 -0
- package/renderer/components/docs-viewer/content/introduction.tsx +21 -0
- package/renderer/components/docs-viewer/content/request-details.tsx +330 -0
- package/renderer/components/docs-viewer/content/sections/auth.tsx +69 -0
- package/renderer/components/docs-viewer/content/sections/body.tsx +66 -0
- package/renderer/components/docs-viewer/content/sections/headers.tsx +43 -0
- package/renderer/components/docs-viewer/content/sections/overview.tsx +40 -0
- package/renderer/components/docs-viewer/content/sections/parameters.tsx +43 -0
- package/renderer/components/docs-viewer/content/sections/responses.tsx +87 -0
- package/renderer/components/docs-viewer/global-auth-modal.tsx +352 -0
- package/renderer/components/docs-viewer/index.tsx +1466 -0
- package/renderer/components/docs-viewer/playground/auth-editor.tsx +280 -0
- package/renderer/components/docs-viewer/playground/body-editor.tsx +221 -0
- package/renderer/components/docs-viewer/playground/code-editor.tsx +224 -0
- package/renderer/components/docs-viewer/playground/code-snippet.tsx +387 -0
- package/renderer/components/docs-viewer/playground/graphql-playground.tsx +745 -0
- package/renderer/components/docs-viewer/playground/index.tsx +671 -0
- package/renderer/components/docs-viewer/playground/key-value-editor.tsx +261 -0
- package/renderer/components/docs-viewer/playground/method-selector.tsx +60 -0
- package/renderer/components/docs-viewer/playground/request-builder.tsx +179 -0
- package/renderer/components/docs-viewer/playground/request-tabs.tsx +237 -0
- package/renderer/components/docs-viewer/playground/response-cards/idle-card.tsx +21 -0
- package/renderer/components/docs-viewer/playground/response-cards/index.tsx +93 -0
- package/renderer/components/docs-viewer/playground/response-cards/loading-card.tsx +16 -0
- package/renderer/components/docs-viewer/playground/response-cards/network-error-card.tsx +23 -0
- package/renderer/components/docs-viewer/playground/response-cards/response-body-card.tsx +268 -0
- package/renderer/components/docs-viewer/playground/response-cards/types.ts +82 -0
- package/renderer/components/docs-viewer/playground/response-viewer.tsx +43 -0
- package/renderer/components/docs-viewer/search/index.ts +2 -0
- package/renderer/components/docs-viewer/search/search-dialog.tsx +331 -0
- package/renderer/components/docs-viewer/search/use-search.ts +117 -0
- package/renderer/components/docs-viewer/shared/markdown-renderer.tsx +431 -0
- package/renderer/components/docs-viewer/shared/method-badge.tsx +41 -0
- package/renderer/components/docs-viewer/shared/schema-viewer.tsx +349 -0
- package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +239 -0
- package/renderer/components/docs-viewer/sidebar/endpoint-options.tsx +316 -0
- package/renderer/components/docs-viewer/sidebar/index.tsx +343 -0
- package/renderer/components/docs-viewer/sidebar/right-sidebar.tsx +202 -0
- package/renderer/components/docs-viewer/sidebar/sidebar-group.tsx +118 -0
- package/renderer/components/docs-viewer/sidebar/sidebar-item.tsx +226 -0
- package/renderer/components/docs-viewer/sidebar/sidebar-section.tsx +52 -0
- package/renderer/components/theme-provider.tsx +11 -0
- package/renderer/components/theme-toggle.tsx +76 -0
- package/renderer/components/ui/badge.tsx +46 -0
- package/renderer/components/ui/button.tsx +59 -0
- package/renderer/components/ui/dialog.tsx +118 -0
- package/renderer/components/ui/dropdown-menu.tsx +257 -0
- package/renderer/components/ui/input.tsx +21 -0
- package/renderer/components/ui/label.tsx +24 -0
- package/renderer/components/ui/navigation-menu.tsx +168 -0
- package/renderer/components/ui/select.tsx +190 -0
- package/renderer/components/ui/spinner.tsx +114 -0
- package/renderer/components/ui/tabs.tsx +66 -0
- package/renderer/components/ui/tooltip.tsx +61 -0
- package/renderer/hooks/use-code-copy.ts +88 -0
- package/renderer/hooks/use-openapi-title.ts +44 -0
- package/renderer/lib/api-docs/agent/index.ts +6 -0
- package/renderer/lib/api-docs/agent/indexer.ts +323 -0
- package/renderer/lib/api-docs/agent/spec-summary.ts +335 -0
- package/renderer/lib/api-docs/agent/types.ts +116 -0
- package/renderer/lib/api-docs/auth/auth-context.tsx +225 -0
- package/renderer/lib/api-docs/auth/auth-storage.ts +87 -0
- package/renderer/lib/api-docs/auth/crypto.ts +89 -0
- package/renderer/lib/api-docs/auth/index.ts +4 -0
- package/renderer/lib/api-docs/code-editor/db.ts +164 -0
- package/renderer/lib/api-docs/code-editor/hooks.ts +266 -0
- package/renderer/lib/api-docs/code-editor/index.ts +6 -0
- package/renderer/lib/api-docs/code-editor/mode-context.tsx +207 -0
- package/renderer/lib/api-docs/code-editor/types.ts +105 -0
- package/renderer/lib/api-docs/codegen/definitions.ts +297 -0
- package/renderer/lib/api-docs/codegen/har.ts +251 -0
- package/renderer/lib/api-docs/codegen/index.ts +159 -0
- package/renderer/lib/api-docs/factories.ts +151 -0
- package/renderer/lib/api-docs/index.ts +17 -0
- package/renderer/lib/api-docs/mobile-context.tsx +112 -0
- package/renderer/lib/api-docs/navigation-context.tsx +88 -0
- package/renderer/lib/api-docs/parsers/graphql/README.md +129 -0
- package/renderer/lib/api-docs/parsers/graphql/index.ts +91 -0
- package/renderer/lib/api-docs/parsers/graphql/parser.ts +491 -0
- package/renderer/lib/api-docs/parsers/graphql/transformer.ts +246 -0
- package/renderer/lib/api-docs/parsers/graphql/types.ts +283 -0
- package/renderer/lib/api-docs/parsers/openapi/README.md +32 -0
- package/renderer/lib/api-docs/parsers/openapi/dereferencer.ts +60 -0
- package/renderer/lib/api-docs/parsers/openapi/extractors/auth.ts +574 -0
- package/renderer/lib/api-docs/parsers/openapi/extractors/body.ts +403 -0
- package/renderer/lib/api-docs/parsers/openapi/extractors/index.ts +232 -0
- package/renderer/lib/api-docs/parsers/openapi/index.ts +171 -0
- package/renderer/lib/api-docs/parsers/openapi/transformer.ts +277 -0
- package/renderer/lib/api-docs/parsers/openapi/validator.ts +31 -0
- package/renderer/lib/api-docs/playground/context.tsx +107 -0
- package/renderer/lib/api-docs/playground/navigation-context.tsx +124 -0
- package/renderer/lib/api-docs/playground/request-builder.ts +223 -0
- package/renderer/lib/api-docs/playground/request-runner.ts +282 -0
- package/renderer/lib/api-docs/playground/types.ts +35 -0
- package/renderer/lib/api-docs/types.ts +269 -0
- package/renderer/lib/api-docs/utils.ts +311 -0
- package/renderer/lib/cache.ts +193 -0
- package/renderer/lib/docs/config/index.ts +29 -0
- package/renderer/lib/docs/config/loader.ts +142 -0
- package/renderer/lib/docs/config/schema.ts +298 -0
- package/renderer/lib/docs/index.ts +12 -0
- package/renderer/lib/docs/mdx/compiler.ts +176 -0
- package/renderer/lib/docs/mdx/frontmatter.ts +80 -0
- package/renderer/lib/docs/mdx/index.ts +26 -0
- package/renderer/lib/docs/navigation/generator.ts +348 -0
- package/renderer/lib/docs/navigation/index.ts +12 -0
- package/renderer/lib/docs/navigation/types.ts +123 -0
- package/renderer/lib/docs-navigation-context.tsx +80 -0
- package/renderer/lib/multi-tenant/context.ts +105 -0
- package/renderer/lib/storage/blob.ts +845 -0
- package/renderer/lib/utils.ts +6 -0
- package/renderer/next.config.ts +76 -0
- package/renderer/package.json +66 -0
- package/renderer/postcss.config.mjs +5 -0
- package/renderer/public/assets/images/screenshot.png +0 -0
- package/renderer/public/assets/logo/dark.svg +9 -0
- package/renderer/public/assets/logo/light.svg +9 -0
- package/renderer/public/assets/logo.svg +9 -0
- package/renderer/public/file.svg +1 -0
- package/renderer/public/globe.svg +1 -0
- package/renderer/public/icon.png +0 -0
- package/renderer/public/logo.svg +9 -0
- package/renderer/public/window.svg +1 -0
- package/renderer/tsconfig.json +28 -0
- package/templates/basic/README.md +139 -0
- package/templates/basic/assets/favicon.svg +4 -0
- package/templates/basic/assets/logo.svg +9 -0
- package/templates/basic/docs.json +47 -0
- package/templates/basic/guides/configuration.mdx +149 -0
- package/templates/basic/guides/overview.mdx +96 -0
- package/templates/basic/index.mdx +39 -0
- package/templates/basic/package.json +14 -0
- package/templates/basic/quickstart.mdx +92 -0
- package/templates/basic/vercel.json +6 -0
- package/templates/graphql/README.md +139 -0
- package/templates/graphql/api-reference/schema.graphql +305 -0
- package/templates/graphql/assets/favicon.svg +4 -0
- package/templates/graphql/assets/logo.svg +9 -0
- package/templates/graphql/docs.json +54 -0
- package/templates/graphql/guides/configuration.mdx +149 -0
- package/templates/graphql/guides/overview.mdx +96 -0
- package/templates/graphql/index.mdx +39 -0
- package/templates/graphql/package.json +14 -0
- package/templates/graphql/quickstart.mdx +92 -0
- package/templates/graphql/vercel.json +6 -0
- package/templates/openapi/README.md +139 -0
- package/templates/openapi/api-reference/openapi.json +419 -0
- package/templates/openapi/assets/favicon.svg +4 -0
- package/templates/openapi/assets/logo.svg +9 -0
- package/templates/openapi/docs.json +61 -0
- package/templates/openapi/guides/configuration.mdx +149 -0
- package/templates/openapi/guides/overview.mdx +96 -0
- package/templates/openapi/index.mdx +39 -0
- package/templates/openapi/package.json +14 -0
- package/templates/openapi/quickstart.mdx +92 -0
- package/templates/openapi/vercel.json +6 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.start = start;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
+
const logger_1 = require("../../utils/logger");
|
|
11
|
+
const paths_1 = require("../../utils/paths");
|
|
12
|
+
async function start(options) {
|
|
13
|
+
const projectRoot = process.cwd();
|
|
14
|
+
logger_1.logger.info('Starting production server...');
|
|
15
|
+
// Check for build output
|
|
16
|
+
const buildDir = path_1.default.join(projectRoot, 'dist', '.next');
|
|
17
|
+
if (!fs_extra_1.default.existsSync(buildDir)) {
|
|
18
|
+
logger_1.logger.error('No build found. Run "devdoc build" first.');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
// Get the renderer directory
|
|
22
|
+
const rendererDir = (0, paths_1.getRendererDir)();
|
|
23
|
+
if (!rendererDir || !fs_extra_1.default.existsSync(rendererDir)) {
|
|
24
|
+
logger_1.logger.error('Renderer not found. Package may be corrupted.');
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
// Set environment variables
|
|
28
|
+
const env = {
|
|
29
|
+
...process.env,
|
|
30
|
+
STARTER_PATH: projectRoot,
|
|
31
|
+
PORT: options.port,
|
|
32
|
+
};
|
|
33
|
+
logger_1.logger.info(`Starting server at http://localhost:${options.port}`);
|
|
34
|
+
// Start Next.js production server
|
|
35
|
+
const child = (0, child_process_1.spawn)('npx', ['next', 'start', '-p', options.port], {
|
|
36
|
+
cwd: rendererDir,
|
|
37
|
+
env,
|
|
38
|
+
stdio: 'inherit',
|
|
39
|
+
shell: true,
|
|
40
|
+
});
|
|
41
|
+
child.on('error', (error) => {
|
|
42
|
+
logger_1.logger.error(`Failed to start server: ${error.message}`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
});
|
|
45
|
+
child.on('exit', (code) => {
|
|
46
|
+
process.exit(code || 0);
|
|
47
|
+
});
|
|
48
|
+
// Handle termination
|
|
49
|
+
process.on('SIGINT', () => {
|
|
50
|
+
child.kill('SIGINT');
|
|
51
|
+
});
|
|
52
|
+
process.on('SIGTERM', () => {
|
|
53
|
+
child.kill('SIGTERM');
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL3N0YXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBVUEsc0JBMERDO0FBcEVELGlEQUFzQztBQUN0QyxnREFBd0I7QUFDeEIsd0RBQTBCO0FBQzFCLCtDQUE0QztBQUM1Qyw2Q0FBbUQ7QUFNNUMsS0FBSyxVQUFVLEtBQUssQ0FBQyxPQUFxQjtJQUMvQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFbEMsZUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBRTdDLHlCQUF5QjtJQUN6QixNQUFNLFFBQVEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekQsSUFBSSxDQUFDLGtCQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDN0IsZUFBTSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQzFELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELDZCQUE2QjtJQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFBLHNCQUFjLEdBQUUsQ0FBQztJQUVyQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsa0JBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxlQUFNLENBQUMsS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsNEJBQTRCO0lBQzVCLE1BQU0sR0FBRyxHQUFHO1FBQ1YsR0FBRyxPQUFPLENBQUMsR0FBRztRQUNkLFlBQVksRUFBRSxXQUFXO1FBQ3pCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtLQUNuQixDQUFDO0lBRUYsZUFBTSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFFbkUsa0NBQWtDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUEscUJBQUssRUFDakIsS0FBSyxFQUNMLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUNyQztRQUNFLEdBQUcsRUFBRSxXQUFXO1FBQ2hCLEdBQUc7UUFDSCxLQUFLLEVBQUUsU0FBUztRQUNoQixLQUFLLEVBQUUsSUFBSTtLQUNaLENBQ0YsQ0FBQztJQUVGLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDMUIsZUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDekQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxxQkFBcUI7SUFDckIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IGdldFJlbmRlcmVyRGlyIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGF0aHMnO1xuXG5pbnRlcmZhY2UgU3RhcnRPcHRpb25zIHtcbiAgcG9ydDogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnQob3B0aW9uczogU3RhcnRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gcHJvY2Vzcy5jd2QoKTtcbiAgXG4gIGxvZ2dlci5pbmZvKCdTdGFydGluZyBwcm9kdWN0aW9uIHNlcnZlci4uLicpO1xuICBcbiAgLy8gQ2hlY2sgZm9yIGJ1aWxkIG91dHB1dFxuICBjb25zdCBidWlsZERpciA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ2Rpc3QnLCAnLm5leHQnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGJ1aWxkRGlyKSkge1xuICAgIGxvZ2dlci5lcnJvcignTm8gYnVpbGQgZm91bmQuIFJ1biBcImRldmRvYyBidWlsZFwiIGZpcnN0LicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBcbiAgLy8gR2V0IHRoZSByZW5kZXJlciBkaXJlY3RvcnlcbiAgY29uc3QgcmVuZGVyZXJEaXIgPSBnZXRSZW5kZXJlckRpcigpO1xuICBcbiAgaWYgKCFyZW5kZXJlckRpciB8fCAhZnMuZXhpc3RzU3luYyhyZW5kZXJlckRpcikpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ1JlbmRlcmVyIG5vdCBmb3VuZC4gUGFja2FnZSBtYXkgYmUgY29ycnVwdGVkLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBcbiAgLy8gU2V0IGVudmlyb25tZW50IHZhcmlhYmxlc1xuICBjb25zdCBlbnYgPSB7XG4gICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgU1RBUlRFUl9QQVRIOiBwcm9qZWN0Um9vdCxcbiAgICBQT1JUOiBvcHRpb25zLnBvcnQsXG4gIH07XG4gIFxuICBsb2dnZXIuaW5mbyhgU3RhcnRpbmcgc2VydmVyIGF0IGh0dHA6Ly9sb2NhbGhvc3Q6JHtvcHRpb25zLnBvcnR9YCk7XG4gIFxuICAvLyBTdGFydCBOZXh0LmpzIHByb2R1Y3Rpb24gc2VydmVyXG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oXG4gICAgJ25weCcsXG4gICAgWyduZXh0JywgJ3N0YXJ0JywgJy1wJywgb3B0aW9ucy5wb3J0XSxcbiAgICB7XG4gICAgICBjd2Q6IHJlbmRlcmVyRGlyLFxuICAgICAgZW52LFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgIH1cbiAgKTtcbiAgXG4gIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG4gIFxuICBjaGlsZC5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMCk7XG4gIH0pO1xuICBcbiAgLy8gSGFuZGxlIHRlcm1pbmF0aW9uXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHtcbiAgICBjaGlsZC5raWxsKCdTSUdJTlQnKTtcbiAgfSk7XG4gIFxuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4ge1xuICAgIGNoaWxkLmtpbGwoJ1NJR1RFUk0nKTtcbiAgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface UploadOptions {
|
|
2
|
+
url?: string;
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Upload assets to DevDoc storage
|
|
7
|
+
*/
|
|
8
|
+
export declare function upload(files: string[], options: UploadOptions): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* List uploaded assets
|
|
11
|
+
*/
|
|
12
|
+
export declare function listAssets(options: UploadOptions): Promise<void>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.upload = upload;
|
|
7
|
+
exports.listAssets = listAssets;
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
+
const logger_1 = require("../../utils/logger");
|
|
11
|
+
const constants_1 = require("../../constants");
|
|
12
|
+
// Max file size: 25MB
|
|
13
|
+
const MAX_FILE_SIZE = 25 * 1024 * 1024;
|
|
14
|
+
/**
|
|
15
|
+
* Format file size for display
|
|
16
|
+
*/
|
|
17
|
+
function formatSize(bytes) {
|
|
18
|
+
if (bytes < 1024)
|
|
19
|
+
return `${bytes} B`;
|
|
20
|
+
if (bytes < 1024 * 1024)
|
|
21
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
22
|
+
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create a progress bar string
|
|
26
|
+
*/
|
|
27
|
+
function createProgressBar(progress, width = 30) {
|
|
28
|
+
const filled = Math.round(width * progress);
|
|
29
|
+
const empty = width - filled;
|
|
30
|
+
const bar = '█'.repeat(filled) + '░'.repeat(empty);
|
|
31
|
+
const percentage = Math.round(progress * 100);
|
|
32
|
+
return `[${bar}] ${percentage}%`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Upload a file with progress tracking using XMLHttpRequest-like approach
|
|
36
|
+
*/
|
|
37
|
+
async function uploadFileWithProgress(file, apiUrl, slug, apiKey, onProgress) {
|
|
38
|
+
const filePath = path_1.default.resolve(file);
|
|
39
|
+
if (!fs_extra_1.default.existsSync(filePath)) {
|
|
40
|
+
throw new Error(`File not found: ${filePath}`);
|
|
41
|
+
}
|
|
42
|
+
const stats = fs_extra_1.default.statSync(filePath);
|
|
43
|
+
const fileSize = stats.size;
|
|
44
|
+
const fileName = path_1.default.basename(filePath);
|
|
45
|
+
// Check file size
|
|
46
|
+
if (fileSize > MAX_FILE_SIZE) {
|
|
47
|
+
throw new Error(`File size (${formatSize(fileSize)}) exceeds maximum allowed size of 25MB`);
|
|
48
|
+
}
|
|
49
|
+
// Read file
|
|
50
|
+
const fileBuffer = fs_extra_1.default.readFileSync(filePath);
|
|
51
|
+
// Create form data manually for Node.js
|
|
52
|
+
const boundary = `----DevDocUpload${Date.now()}`;
|
|
53
|
+
const CRLF = '\r\n';
|
|
54
|
+
// Build multipart form data
|
|
55
|
+
const header = [
|
|
56
|
+
`--${boundary}`,
|
|
57
|
+
`Content-Disposition: form-data; name="file"; filename="${fileName}"`,
|
|
58
|
+
`Content-Type: application/octet-stream`,
|
|
59
|
+
'',
|
|
60
|
+
''
|
|
61
|
+
].join(CRLF);
|
|
62
|
+
const slugPart = [
|
|
63
|
+
'',
|
|
64
|
+
`--${boundary}`,
|
|
65
|
+
`Content-Disposition: form-data; name="slug"`,
|
|
66
|
+
'',
|
|
67
|
+
slug,
|
|
68
|
+
''
|
|
69
|
+
].join(CRLF);
|
|
70
|
+
const footer = `${CRLF}--${boundary}--${CRLF}`;
|
|
71
|
+
const headerBuffer = Buffer.from(header);
|
|
72
|
+
const slugBuffer = Buffer.from(slugPart);
|
|
73
|
+
const footerBuffer = Buffer.from(footer);
|
|
74
|
+
const totalSize = headerBuffer.length + fileBuffer.length + slugBuffer.length + footerBuffer.length;
|
|
75
|
+
// Combine all parts
|
|
76
|
+
const body = Buffer.concat([headerBuffer, fileBuffer, slugBuffer, footerBuffer]);
|
|
77
|
+
// Simulate progress for better UX (since fetch doesn't support upload progress natively)
|
|
78
|
+
let uploaded = 0;
|
|
79
|
+
const chunkSize = Math.ceil(totalSize / 20); // Simulate 20 progress updates
|
|
80
|
+
const progressInterval = setInterval(() => {
|
|
81
|
+
if (uploaded < totalSize * 0.9) { // Only go to 90% until response
|
|
82
|
+
uploaded = Math.min(uploaded + chunkSize, totalSize * 0.9);
|
|
83
|
+
onProgress(uploaded / totalSize, uploaded, totalSize);
|
|
84
|
+
}
|
|
85
|
+
}, 100);
|
|
86
|
+
try {
|
|
87
|
+
const response = await fetch(`${apiUrl}/api/assets/upload`, {
|
|
88
|
+
method: 'POST',
|
|
89
|
+
headers: {
|
|
90
|
+
'Content-Type': `multipart/form-data; boundary=${boundary}`,
|
|
91
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
92
|
+
},
|
|
93
|
+
body,
|
|
94
|
+
});
|
|
95
|
+
clearInterval(progressInterval);
|
|
96
|
+
// Complete progress
|
|
97
|
+
onProgress(1, totalSize, totalSize);
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
const error = await response.json().catch(() => ({ error: 'Upload failed' }));
|
|
100
|
+
throw new Error(error.error || `HTTP ${response.status}`);
|
|
101
|
+
}
|
|
102
|
+
return await response.json();
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
clearInterval(progressInterval);
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Upload assets to DevDoc storage
|
|
111
|
+
*/
|
|
112
|
+
async function upload(files, options) {
|
|
113
|
+
const projectRoot = process.cwd();
|
|
114
|
+
const apiUrl = options.url || process.env.DEVDOC_API_URL || constants_1.DEFAULT_API_URL;
|
|
115
|
+
if (files.length === 0) {
|
|
116
|
+
logger_1.logger.error('No files specified');
|
|
117
|
+
logger_1.logger.info('Usage: devdoc upload <file1> [file2] ...');
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
// Load .devdoc.json to get project info
|
|
121
|
+
const devdocConfigPath = path_1.default.join(projectRoot, '.devdoc.json');
|
|
122
|
+
if (!fs_extra_1.default.existsSync(devdocConfigPath)) {
|
|
123
|
+
logger_1.logger.error('.devdoc.json not found');
|
|
124
|
+
logger_1.logger.info('Run "devdoc init" or "devdoc deploy" first to initialize your project');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
let devdocConfig;
|
|
128
|
+
try {
|
|
129
|
+
devdocConfig = fs_extra_1.default.readJsonSync(devdocConfigPath);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
logger_1.logger.error('Failed to read .devdoc.json');
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
const slug = devdocConfig.slug;
|
|
136
|
+
const apiKey = options.apiKey || process.env.DEVDOC_API_KEY || devdocConfig.apiKey;
|
|
137
|
+
if (!slug) {
|
|
138
|
+
logger_1.logger.error('Project slug not found in .devdoc.json');
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
if (!apiKey) {
|
|
142
|
+
logger_1.logger.error('API key not found');
|
|
143
|
+
logger_1.logger.info('Provide via --api-key, DEVDOC_API_KEY env var, or in .devdoc.json');
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
logger_1.logger.info(`Uploading ${files.length} file(s) to ${slug}...\n`);
|
|
147
|
+
const results = [];
|
|
148
|
+
for (const file of files) {
|
|
149
|
+
const fileName = path_1.default.basename(file);
|
|
150
|
+
process.stdout.write(` ${fileName}: `);
|
|
151
|
+
try {
|
|
152
|
+
const result = await uploadFileWithProgress(file, apiUrl, slug, apiKey, (progress, loaded, total) => {
|
|
153
|
+
// Clear line and rewrite progress
|
|
154
|
+
process.stdout.clearLine(0);
|
|
155
|
+
process.stdout.cursorTo(0);
|
|
156
|
+
process.stdout.write(` ${fileName}: ${createProgressBar(progress)} ${formatSize(loaded)}/${formatSize(total)}`);
|
|
157
|
+
});
|
|
158
|
+
// Clear line and show success
|
|
159
|
+
process.stdout.clearLine(0);
|
|
160
|
+
process.stdout.cursorTo(0);
|
|
161
|
+
console.log(` ${logger_1.logger.green('✓')} ${fileName} (${formatSize(result.size)})`);
|
|
162
|
+
console.log(` ${logger_1.logger.cyan(result.url)}`);
|
|
163
|
+
results.push({ file: fileName, success: true, url: result.url });
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
167
|
+
// Clear line and show error
|
|
168
|
+
process.stdout.clearLine(0);
|
|
169
|
+
process.stdout.cursorTo(0);
|
|
170
|
+
console.log(` ${logger_1.logger.red('✗')} ${fileName}: ${message}`);
|
|
171
|
+
results.push({ file: fileName, success: false, error: message });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Summary
|
|
175
|
+
console.log('');
|
|
176
|
+
const successful = results.filter(r => r.success).length;
|
|
177
|
+
const failed = results.filter(r => !r.success).length;
|
|
178
|
+
if (failed === 0) {
|
|
179
|
+
logger_1.logger.success(`All ${successful} file(s) uploaded successfully!`);
|
|
180
|
+
}
|
|
181
|
+
else if (successful === 0) {
|
|
182
|
+
logger_1.logger.error(`All ${failed} file(s) failed to upload`);
|
|
183
|
+
process.exit(1);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
logger_1.logger.warn(`${successful} file(s) uploaded, ${failed} failed`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* List uploaded assets
|
|
191
|
+
*/
|
|
192
|
+
async function listAssets(options) {
|
|
193
|
+
const projectRoot = process.cwd();
|
|
194
|
+
const apiUrl = options.url || process.env.DEVDOC_API_URL || constants_1.DEFAULT_API_URL;
|
|
195
|
+
// Load .devdoc.json
|
|
196
|
+
const devdocConfigPath = path_1.default.join(projectRoot, '.devdoc.json');
|
|
197
|
+
if (!fs_extra_1.default.existsSync(devdocConfigPath)) {
|
|
198
|
+
logger_1.logger.error('.devdoc.json not found');
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
const devdocConfig = fs_extra_1.default.readJsonSync(devdocConfigPath);
|
|
202
|
+
const slug = devdocConfig.slug;
|
|
203
|
+
const apiKey = options.apiKey || process.env.DEVDOC_API_KEY || devdocConfig.apiKey;
|
|
204
|
+
if (!slug || !apiKey) {
|
|
205
|
+
logger_1.logger.error('Project slug or API key not found');
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
logger_1.logger.info(`Fetching assets for ${slug}...`);
|
|
209
|
+
try {
|
|
210
|
+
const response = await fetch(`${apiUrl}/api/assets?slug=${slug}`, {
|
|
211
|
+
headers: {
|
|
212
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
if (!response.ok) {
|
|
216
|
+
throw new Error(`HTTP ${response.status}`);
|
|
217
|
+
}
|
|
218
|
+
const data = await response.json();
|
|
219
|
+
if (data.assets.length === 0) {
|
|
220
|
+
logger_1.logger.info('No assets found');
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
console.log('');
|
|
224
|
+
console.log('Assets:');
|
|
225
|
+
for (const asset of data.assets) {
|
|
226
|
+
console.log(` ${asset.fileName} (${formatSize(asset.size)})`);
|
|
227
|
+
console.log(` ${logger_1.logger.cyan(asset.url)}`);
|
|
228
|
+
}
|
|
229
|
+
console.log('');
|
|
230
|
+
logger_1.logger.info(`Total: ${data.assets.length} asset(s)`);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
234
|
+
logger_1.logger.error(`Failed to list assets: ${message}`);
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy91cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUF1SkEsd0JBZ0dDO0FBS0QsZ0NBc0RDO0FBbFRELGdEQUF1QjtBQUN2Qix3REFBeUI7QUFDekIsK0NBQTJDO0FBQzNDLCtDQUFpRDtBQUVqRCxzQkFBc0I7QUFDdEIsTUFBTSxhQUFhLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7QUF1QnRDOztHQUVHO0FBQ0gsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixJQUFJLEtBQUssR0FBRyxJQUFJO1FBQUUsT0FBTyxHQUFHLEtBQUssSUFBSSxDQUFBO0lBQ3JDLElBQUksS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJO1FBQUUsT0FBTyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO0lBQ2pFLE9BQU8sR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO0FBQ25ELENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsaUJBQWlCLENBQUMsUUFBZ0IsRUFBRSxRQUFnQixFQUFFO0lBQzdELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFBO0lBQzNDLE1BQU0sS0FBSyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUE7SUFDNUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2xELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFBO0lB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aUJBQWlCLENBQUMsQ0FBQTtZQUM5QixPQUFNO1FBQ1IsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3RCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQzlELE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxlQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDOUMsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDZixlQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsQ0FBQyxDQUFBO0lBQ3RELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxPQUFPLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3RFLGVBQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDakQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInXG5pbXBvcnQgeyBERUZBVUxUX0FQSV9VUkwgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnXG5cbi8vIE1heCBmaWxlIHNpemU6IDI1TUJcbmNvbnN0IE1BWF9GSUxFX1NJWkUgPSAyNSAqIDEwMjQgKiAxMDI0XG5cbmludGVyZmFjZSBEZXZEb2NDb25maWcge1xuICBzbHVnOiBzdHJpbmdcbiAgYXBpS2V5Pzogc3RyaW5nXG4gIHVybD86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgVXBsb2FkT3B0aW9ucyB7XG4gIHVybD86IHN0cmluZ1xuICBhcGlLZXk/OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIFVwbG9hZFJlc3BvbnNlIHtcbiAgc3VjY2VzczogYm9vbGVhblxuICB1cmw6IHN0cmluZ1xuICBwYXRoOiBzdHJpbmdcbiAgZmlsZU5hbWU6IHN0cmluZ1xuICBzaXplOiBudW1iZXJcbiAgY29udGVudFR5cGU6IHN0cmluZ1xuICBlcnJvcj86IHN0cmluZ1xufVxuXG4vKipcbiAqIEZvcm1hdCBmaWxlIHNpemUgZm9yIGRpc3BsYXlcbiAqL1xuZnVuY3Rpb24gZm9ybWF0U2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGJ5dGVzIDwgMTAyNCkgcmV0dXJuIGAke2J5dGVzfSBCYFxuICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkgcmV0dXJuIGAkeyhieXRlcyAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCYFxuICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgyKX0gTUJgXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcHJvZ3Jlc3MgYmFyIHN0cmluZ1xuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9ncmVzc0Jhcihwcm9ncmVzczogbnVtYmVyLCB3aWR0aDogbnVtYmVyID0gMzApOiBzdHJpbmcge1xuICBjb25zdCBmaWxsZWQgPSBNYXRoLnJvdW5kKHdpZHRoICogcHJvZ3Jlc3MpXG4gIGNvbnN0IGVtcHR5ID0gd2lkdGggLSBmaWxsZWRcbiAgY29uc3QgYmFyID0gJ+KWiCcucmVwZWF0KGZpbGxlZCkgKyAn4paRJy5yZXBlYXQoZW1wdHkpXG4gIGNvbnN0IHBlcmNlbnRhZ2UgPSBNYXRoLnJvdW5kKHByb2dyZXNzICogMTAwKVxuICByZXR1cm4gYFske2Jhcn1dICR7cGVyY2VudGFnZX0lYFxufVxuXG4vKipcbiAqIFVwbG9hZCBhIGZpbGUgd2l0aCBwcm9ncmVzcyB0cmFja2luZyB1c2luZyBYTUxIdHRwUmVxdWVzdC1saWtlIGFwcHJvYWNoXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZEZpbGVXaXRoUHJvZ3Jlc3MoXG4gIGZpbGU6IHN0cmluZyxcbiAgYXBpVXJsOiBzdHJpbmcsXG4gIHNsdWc6IHN0cmluZyxcbiAgYXBpS2V5OiBzdHJpbmcsXG4gIG9uUHJvZ3Jlc3M6IChwcm9ncmVzczogbnVtYmVyLCBsb2FkZWQ6IG51bWJlciwgdG90YWw6IG51bWJlcikgPT4gdm9pZFxuKTogUHJvbWlzZTxVcGxvYWRSZXNwb25zZT4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlKVxuICBcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZVBhdGh9YClcbiAgfVxuICBcbiAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlUGF0aClcbiAgY29uc3QgZmlsZVNpemUgPSBzdGF0cy5zaXplXG4gIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aClcbiAgXG4gIC8vIENoZWNrIGZpbGUgc2l6ZVxuICBpZiAoZmlsZVNpemUgPiBNQVhfRklMRV9TSVpFKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIHNpemUgKCR7Zm9ybWF0U2l6ZShmaWxlU2l6ZSl9KSBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBzaXplIG9mIDI1TUJgKVxuICB9XG4gIFxuICAvLyBSZWFkIGZpbGVcbiAgY29uc3QgZmlsZUJ1ZmZlciA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aClcbiAgXG4gIC8vIENyZWF0ZSBmb3JtIGRhdGEgbWFudWFsbHkgZm9yIE5vZGUuanNcbiAgY29uc3QgYm91bmRhcnkgPSBgLS0tLURldkRvY1VwbG9hZCR7RGF0ZS5ub3coKX1gXG4gIGNvbnN0IENSTEYgPSAnXFxyXFxuJ1xuICBcbiAgLy8gQnVpbGQgbXVsdGlwYXJ0IGZvcm0gZGF0YVxuICBjb25zdCBoZWFkZXIgPSBbXG4gICAgYC0tJHtib3VuZGFyeX1gLFxuICAgIGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJmaWxlXCI7IGZpbGVuYW1lPVwiJHtmaWxlTmFtZX1cImAsXG4gICAgYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtYCxcbiAgICAnJyxcbiAgICAnJ1xuICBdLmpvaW4oQ1JMRilcbiAgXG4gIGNvbnN0IHNsdWdQYXJ0ID0gW1xuICAgICcnLFxuICAgIGAtLSR7Ym91bmRhcnl9YCxcbiAgICBgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwic2x1Z1wiYCxcbiAgICAnJyxcbiAgICBzbHVnLFxuICAgICcnXG4gIF0uam9pbihDUkxGKVxuICBcbiAgY29uc3QgZm9vdGVyID0gYCR7Q1JMRn0tLSR7Ym91bmRhcnl9LS0ke0NSTEZ9YFxuICBcbiAgY29uc3QgaGVhZGVyQnVmZmVyID0gQnVmZmVyLmZyb20oaGVhZGVyKVxuICBjb25zdCBzbHVnQnVmZmVyID0gQnVmZmVyLmZyb20oc2x1Z1BhcnQpXG4gIGNvbnN0IGZvb3RlckJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGZvb3RlcilcbiAgXG4gIGNvbnN0IHRvdGFsU2l6ZSA9IGhlYWRlckJ1ZmZlci5sZW5ndGggKyBmaWxlQnVmZmVyLmxlbmd0aCArIHNsdWdCdWZmZXIubGVuZ3RoICsgZm9vdGVyQnVmZmVyLmxlbmd0aFxuICBcbiAgLy8gQ29tYmluZSBhbGwgcGFydHNcbiAgY29uc3QgYm9keSA9IEJ1ZmZlci5jb25jYXQoW2hlYWRlckJ1ZmZlciwgZmlsZUJ1ZmZlciwgc2x1Z0J1ZmZlciwgZm9vdGVyQnVmZmVyXSlcbiAgXG4gIC8vIFNpbXVsYXRlIHByb2dyZXNzIGZvciBiZXR0ZXIgVVggKHNpbmNlIGZldGNoIGRvZXNuJ3Qgc3VwcG9ydCB1cGxvYWQgcHJvZ3Jlc3MgbmF0aXZlbHkpXG4gIGxldCB1cGxvYWRlZCA9IDBcbiAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5jZWlsKHRvdGFsU2l6ZSAvIDIwKSAvLyBTaW11bGF0ZSAyMCBwcm9ncmVzcyB1cGRhdGVzXG4gIFxuICBjb25zdCBwcm9ncmVzc0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh1cGxvYWRlZCA8IHRvdGFsU2l6ZSAqIDAuOSkgeyAvLyBPbmx5IGdvIHRvIDkwJSB1bnRpbCByZXNwb25zZVxuICAgICAgdXBsb2FkZWQgPSBNYXRoLm1pbih1cGxvYWRlZCArIGNodW5rU2l6ZSwgdG90YWxTaXplICogMC45KVxuICAgICAgb25Qcm9ncmVzcyh1cGxvYWRlZCAvIHRvdGFsU2l6ZSwgdXBsb2FkZWQsIHRvdGFsU2l6ZSlcbiAgICB9XG4gIH0sIDEwMClcbiAgXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9hc3NldHMvdXBsb2FkYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JHtib3VuZGFyeX1gLFxuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHthcGlLZXl9YCxcbiAgICAgIH0sXG4gICAgICBib2R5LFxuICAgIH0pXG4gICAgXG4gICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc0ludGVydmFsKVxuICAgIFxuICAgIC8vIENvbXBsZXRlIHByb2dyZXNzXG4gICAgb25Qcm9ncmVzcygxLCB0b3RhbFNpemUsIHRvdGFsU2l6ZSlcbiAgICBcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoeyBlcnJvcjogJ1VwbG9hZCBmYWlsZWQnIH0pKSBhcyB7IGVycm9yPzogc3RyaW5nIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIFVwbG9hZFJlc3BvbnNlXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc0ludGVydmFsKVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuLyoqXG4gKiBVcGxvYWQgYXNzZXRzIHRvIERldkRvYyBzdG9yYWdlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGxvYWQoZmlsZXM6IHN0cmluZ1tdLCBvcHRpb25zOiBVcGxvYWRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gcHJvY2Vzcy5jd2QoKVxuICBjb25zdCBhcGlVcmwgPSBvcHRpb25zLnVybCB8fCBwcm9jZXNzLmVudi5ERVZET0NfQVBJX1VSTCB8fCBERUZBVUxUX0FQSV9VUkxcbiAgXG4gIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZXJyb3IoJ05vIGZpbGVzIHNwZWNpZmllZCcpXG4gICAgbG9nZ2VyLmluZm8oJ1VzYWdlOiBkZXZkb2MgdXBsb2FkIDxmaWxlMT4gW2ZpbGUyXSAuLi4nKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG4gIFxuICAvLyBMb2FkIC5kZXZkb2MuanNvbiB0byBnZXQgcHJvamVjdCBpbmZvXG4gIGNvbnN0IGRldmRvY0NvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICcuZGV2ZG9jLmpzb24nKVxuICBcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRldmRvY0NvbmZpZ1BhdGgpKSB7XG4gICAgbG9nZ2VyLmVycm9yKCcuZGV2ZG9jLmpzb24gbm90IGZvdW5kJylcbiAgICBsb2dnZXIuaW5mbygnUnVuIFwiZGV2ZG9jIGluaXRcIiBvciBcImRldmRvYyBkZXBsb3lcIiBmaXJzdCB0byBpbml0aWFsaXplIHlvdXIgcHJvamVjdCcpXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbiAgXG4gIGxldCBkZXZkb2NDb25maWc6IERldkRvY0NvbmZpZ1xuICB0cnkge1xuICAgIGRldmRvY0NvbmZpZyA9IGZzLnJlYWRKc29uU3luYyhkZXZkb2NDb25maWdQYXRoKSBhcyBEZXZEb2NDb25maWdcbiAgfSBjYXRjaCB7XG4gICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gcmVhZCAuZGV2ZG9jLmpzb24nKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG4gIFxuICBjb25zdCBzbHVnID0gZGV2ZG9jQ29uZmlnLnNsdWdcbiAgY29uc3QgYXBpS2V5ID0gb3B0aW9ucy5hcGlLZXkgfHwgcHJvY2Vzcy5lbnYuREVWRE9DX0FQSV9LRVkgfHwgZGV2ZG9jQ29uZmlnLmFwaUtleVxuICBcbiAgaWYgKCFzbHVnKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdQcm9qZWN0IHNsdWcgbm90IGZvdW5kIGluIC5kZXZkb2MuanNvbicpXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbiAgXG4gIGlmICghYXBpS2V5KSB7XG4gICAgbG9nZ2VyLmVycm9yKCdBUEkga2V5IG5vdCBmb3VuZCcpXG4gICAgbG9nZ2VyLmluZm8oJ1Byb3ZpZGUgdmlhIC0tYXBpLWtleSwgREVWRE9DX0FQSV9LRVkgZW52IHZhciwgb3IgaW4gLmRldmRvYy5qc29uJylcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuICBcbiAgbG9nZ2VyLmluZm8oYFVwbG9hZGluZyAke2ZpbGVzLmxlbmd0aH0gZmlsZShzKSB0byAke3NsdWd9Li4uXFxuYClcbiAgXG4gIGNvbnN0IHJlc3VsdHM6IHsgZmlsZTogc3RyaW5nOyBzdWNjZXNzOiBib29sZWFuOyB1cmw/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nIH1bXSA9IFtdXG4gIFxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZSlcbiAgICBcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgICAke2ZpbGVOYW1lfTogYClcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXBsb2FkRmlsZVdpdGhQcm9ncmVzcyhcbiAgICAgICAgZmlsZSxcbiAgICAgICAgYXBpVXJsLFxuICAgICAgICBzbHVnLFxuICAgICAgICBhcGlLZXksXG4gICAgICAgIChwcm9ncmVzcywgbG9hZGVkLCB0b3RhbCkgPT4ge1xuICAgICAgICAgIC8vIENsZWFyIGxpbmUgYW5kIHJld3JpdGUgcHJvZ3Jlc3NcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoMClcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC5jdXJzb3JUbygwKVxuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAgICR7ZmlsZU5hbWV9OiAke2NyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzKX0gJHtmb3JtYXRTaXplKGxvYWRlZCl9LyR7Zm9ybWF0U2l6ZSh0b3RhbCl9YClcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgXG4gICAgICAvLyBDbGVhciBsaW5lIGFuZCBzaG93IHN1Y2Nlc3NcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgcHJvY2Vzcy5zdGRvdXQuY3Vyc29yVG8oMClcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7bG9nZ2VyLmdyZWVuKCfinJMnKX0gJHtmaWxlTmFtZX0gKCR7Zm9ybWF0U2l6ZShyZXN1bHQuc2l6ZSl9KWApXG4gICAgICBjb25zb2xlLmxvZyhgICAgICR7bG9nZ2VyLmN5YW4ocmVzdWx0LnVybCl9YClcbiAgICAgIFxuICAgICAgcmVzdWx0cy5wdXNoKHsgZmlsZTogZmlsZU5hbWUsIHN1Y2Nlc3M6IHRydWUsIHVybDogcmVzdWx0LnVybCB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICBcbiAgICAgIC8vIENsZWFyIGxpbmUgYW5kIHNob3cgZXJyb3JcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgwKVxuICAgICAgcHJvY2Vzcy5zdGRvdXQuY3Vyc29yVG8oMClcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7bG9nZ2VyLnJlZCgn4pyXJyl9ICR7ZmlsZU5hbWV9OiAke21lc3NhZ2V9YClcbiAgICAgIFxuICAgICAgcmVzdWx0cy5wdXNoKHsgZmlsZTogZmlsZU5hbWUsIHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogbWVzc2FnZSB9KVxuICAgIH1cbiAgfVxuICBcbiAgLy8gU3VtbWFyeVxuICBjb25zb2xlLmxvZygnJylcbiAgY29uc3Qgc3VjY2Vzc2Z1bCA9IHJlc3VsdHMuZmlsdGVyKHIgPT4gci5zdWNjZXNzKS5sZW5ndGhcbiAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIociA9PiAhci5zdWNjZXNzKS5sZW5ndGhcbiAgXG4gIGlmIChmYWlsZWQgPT09IDApIHtcbiAgICBsb2dnZXIuc3VjY2VzcyhgQWxsICR7c3VjY2Vzc2Z1bH0gZmlsZShzKSB1cGxvYWRlZCBzdWNjZXNzZnVsbHkhYClcbiAgfSBlbHNlIGlmIChzdWNjZXNzZnVsID09PSAwKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBBbGwgJHtmYWlsZWR9IGZpbGUocykgZmFpbGVkIHRvIHVwbG9hZGApXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLndhcm4oYCR7c3VjY2Vzc2Z1bH0gZmlsZShzKSB1cGxvYWRlZCwgJHtmYWlsZWR9IGZhaWxlZGApXG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0IHVwbG9hZGVkIGFzc2V0c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEFzc2V0cyhvcHRpb25zOiBVcGxvYWRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gcHJvY2Vzcy5jd2QoKVxuICBjb25zdCBhcGlVcmwgPSBvcHRpb25zLnVybCB8fCBwcm9jZXNzLmVudi5ERVZET0NfQVBJX1VSTCB8fCBERUZBVUxUX0FQSV9VUkxcbiAgXG4gIC8vIExvYWQgLmRldmRvYy5qc29uXG4gIGNvbnN0IGRldmRvY0NvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICcuZGV2ZG9jLmpzb24nKVxuICBcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRldmRvY0NvbmZpZ1BhdGgpKSB7XG4gICAgbG9nZ2VyLmVycm9yKCcuZGV2ZG9jLmpzb24gbm90IGZvdW5kJylcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuICBcbiAgY29uc3QgZGV2ZG9jQ29uZmlnID0gZnMucmVhZEpzb25TeW5jKGRldmRvY0NvbmZpZ1BhdGgpIGFzIERldkRvY0NvbmZpZ1xuICBjb25zdCBzbHVnID0gZGV2ZG9jQ29uZmlnLnNsdWdcbiAgY29uc3QgYXBpS2V5ID0gb3B0aW9ucy5hcGlLZXkgfHwgcHJvY2Vzcy5lbnYuREVWRE9DX0FQSV9LRVkgfHwgZGV2ZG9jQ29uZmlnLmFwaUtleVxuICBcbiAgaWYgKCFzbHVnIHx8ICFhcGlLZXkpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ1Byb2plY3Qgc2x1ZyBvciBBUEkga2V5IG5vdCBmb3VuZCcpXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbiAgXG4gIGxvZ2dlci5pbmZvKGBGZXRjaGluZyBhc3NldHMgZm9yICR7c2x1Z30uLi5gKVxuICBcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL2Fzc2V0cz9zbHVnPSR7c2x1Z31gLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgfSxcbiAgICB9KVxuICAgIFxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIHsgYXNzZXRzOiBBcnJheTx7IGZpbGVOYW1lOiBzdHJpbmc7IHNpemU6IG51bWJlcjsgdXJsOiBzdHJpbmc7IHVwbG9hZGVkQXQ6IHN0cmluZyB9PiB9XG4gICAgXG4gICAgaWYgKGRhdGEuYXNzZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oJ05vIGFzc2V0cyBmb3VuZCcpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgXG4gICAgY29uc29sZS5sb2coJycpXG4gICAgY29uc29sZS5sb2coJ0Fzc2V0czonKVxuICAgIGZvciAoY29uc3QgYXNzZXQgb2YgZGF0YS5hc3NldHMpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7YXNzZXQuZmlsZU5hbWV9ICgke2Zvcm1hdFNpemUoYXNzZXQuc2l6ZSl9KWApXG4gICAgICBjb25zb2xlLmxvZyhgICAgICR7bG9nZ2VyLmN5YW4oYXNzZXQudXJsKX1gKVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygnJylcbiAgICBsb2dnZXIuaW5mbyhgVG90YWw6ICR7ZGF0YS5hc3NldHMubGVuZ3RofSBhc3NldChzKWApXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxpc3QgYXNzZXRzOiAke21lc3NhZ2V9YClcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.whoami = whoami;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const logger_1 = require("../../utils/logger");
|
|
10
|
+
const constants_1 = require("../../constants");
|
|
11
|
+
/**
|
|
12
|
+
* Show current project information
|
|
13
|
+
*/
|
|
14
|
+
async function whoami(options) {
|
|
15
|
+
const projectRoot = process.cwd();
|
|
16
|
+
const apiUrl = options.url || process.env.DEVDOC_API_URL || constants_1.DEFAULT_API_URL;
|
|
17
|
+
const devdocConfigPath = path_1.default.join(projectRoot, '.devdoc.json');
|
|
18
|
+
const docsConfigPath = path_1.default.join(projectRoot, 'docs.json');
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log('DevDoc Project Information');
|
|
21
|
+
console.log('========================');
|
|
22
|
+
console.log('');
|
|
23
|
+
// Check for docs.json
|
|
24
|
+
if (fs_extra_1.default.existsSync(docsConfigPath)) {
|
|
25
|
+
try {
|
|
26
|
+
const docsConfig = fs_extra_1.default.readJsonSync(docsConfigPath);
|
|
27
|
+
console.log(` Project Name: ${logger_1.logger.cyan(docsConfig.name || 'Untitled')}`);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
console.log(` Project Name: ${logger_1.logger.yellow('Unable to read docs.json')}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
console.log(` ${logger_1.logger.yellow('No docs.json found in current directory')}`);
|
|
35
|
+
console.log('');
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
// Check for .devdoc.json
|
|
39
|
+
if (!fs_extra_1.default.existsSync(devdocConfigPath)) {
|
|
40
|
+
console.log(` Status: ${logger_1.logger.yellow('Not deployed')}`);
|
|
41
|
+
console.log('');
|
|
42
|
+
logger_1.logger.info('Run "devdoc deploy" to deploy your documentation.');
|
|
43
|
+
console.log('');
|
|
44
|
+
process.exit(0);
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const config = fs_extra_1.default.readJsonSync(devdocConfigPath);
|
|
48
|
+
console.log(` Project Slug: ${config.slug || logger_1.logger.yellow('Unknown')}`);
|
|
49
|
+
console.log(` Status: ${logger_1.logger.green('Deployed')}`);
|
|
50
|
+
if (config.url) {
|
|
51
|
+
console.log(` URL: ${logger_1.logger.cyan(config.url)}`);
|
|
52
|
+
}
|
|
53
|
+
if (config.apiKey) {
|
|
54
|
+
const maskedKey = config.apiKey.substring(0, 12) + '...' + config.apiKey.substring(config.apiKey.length - 4);
|
|
55
|
+
console.log(` API Key: ${maskedKey}`);
|
|
56
|
+
}
|
|
57
|
+
if (config.lastDeployed) {
|
|
58
|
+
const date = new Date(config.lastDeployed);
|
|
59
|
+
console.log(` Last Deploy: ${date.toLocaleString()}`);
|
|
60
|
+
}
|
|
61
|
+
console.log('');
|
|
62
|
+
console.log(` Platform: ${apiUrl}`);
|
|
63
|
+
console.log('');
|
|
64
|
+
// Optional: verify with server
|
|
65
|
+
if (config.slug && config.apiKey) {
|
|
66
|
+
try {
|
|
67
|
+
const response = await fetch(`${apiUrl}/api/deploy?slug=${config.slug}`, {
|
|
68
|
+
method: 'GET',
|
|
69
|
+
headers: {
|
|
70
|
+
'Authorization': `Bearer ${config.apiKey}`,
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
if (response.ok) {
|
|
74
|
+
const data = await response.json();
|
|
75
|
+
if (data.exists) {
|
|
76
|
+
logger_1.logger.success('✓ Project verified on server');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Silent fail - server verification is optional
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
87
|
+
logger_1.logger.error(`Failed to read project config: ${message}`);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hvYW1pLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy93aG9hbWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFtQkEsd0JBb0ZDO0FBdkdELGdEQUF1QjtBQUN2Qix3REFBeUI7QUFDekIsK0NBQTJDO0FBQzNDLCtDQUFpRDtBQWFqRDs7R0FFRztBQUNJLEtBQUssVUFBVSxNQUFNLENBQUMsT0FBc0I7SUFDakQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLElBQUksMkJBQWUsQ0FBQTtJQUMzRSxNQUFNLGdCQUFnQixHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQy9ELE1BQU0sY0FBYyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBRTFELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUE7SUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0lBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFZixzQkFBc0I7SUFDdEIsSUFBSSxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLGtCQUFFLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQ2xELE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLGVBQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUE7UUFD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QUFNLENBQUMsTUFBTSxFQUFFO3FCQUMzQztpQkFDRixDQUFDLENBQUE7Z0JBRUYsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBMEIsQ0FBQTtvQkFDMUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ2hCLGVBQU0sQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQTtvQkFDaEQsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxnREFBZ0Q7WUFDbEQsQ0FBQztRQUNILENBQUM7SUFFSCxDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdEUsZUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcidcbmltcG9ydCB7IERFRkFVTFRfQVBJX1VSTCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cydcblxuaW50ZXJmYWNlIFdob2FtaU9wdGlvbnMge1xuICB1cmw/OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIERldkRvY0NvbmZpZyB7XG4gIHNsdWc/OiBzdHJpbmdcbiAgYXBpS2V5Pzogc3RyaW5nXG4gIHVybD86IHN0cmluZ1xuICBsYXN0RGVwbG95ZWQ/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBTaG93IGN1cnJlbnQgcHJvamVjdCBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2hvYW1pKG9wdGlvbnM6IFdob2FtaU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9jZXNzLmN3ZCgpXG4gIGNvbnN0IGFwaVVybCA9IG9wdGlvbnMudXJsIHx8IHByb2Nlc3MuZW52LkRFVkRPQ19BUElfVVJMIHx8IERFRkFVTFRfQVBJX1VSTFxuICBjb25zdCBkZXZkb2NDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCAnLmRldmRvYy5qc29uJylcbiAgY29uc3QgZG9jc0NvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdkb2NzLmpzb24nKVxuICBcbiAgY29uc29sZS5sb2coJycpXG4gIGNvbnNvbGUubG9nKCdEZXZEb2MgUHJvamVjdCBJbmZvcm1hdGlvbicpXG4gIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09PT0nKVxuICBjb25zb2xlLmxvZygnJylcbiAgXG4gIC8vIENoZWNrIGZvciBkb2NzLmpzb25cbiAgaWYgKGZzLmV4aXN0c1N5bmMoZG9jc0NvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRvY3NDb25maWcgPSBmcy5yZWFkSnNvblN5bmMoZG9jc0NvbmZpZ1BhdGgpXG4gICAgICBjb25zb2xlLmxvZyhgICBQcm9qZWN0IE5hbWU6ICR7bG9nZ2VyLmN5YW4oZG9jc0NvbmZpZy5uYW1lIHx8ICdVbnRpdGxlZCcpfWApXG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zb2xlLmxvZyhgICBQcm9qZWN0IE5hbWU6ICR7bG9nZ2VyLnllbGxvdygnVW5hYmxlIHRvIHJlYWQgZG9jcy5qc29uJyl9YClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coYCAgJHtsb2dnZXIueWVsbG93KCdObyBkb2NzLmpzb24gZm91bmQgaW4gY3VycmVudCBkaXJlY3RvcnknKX1gKVxuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIHByb2Nlc3MuZXhpdCgwKVxuICB9XG4gIFxuICAvLyBDaGVjayBmb3IgLmRldmRvYy5qc29uXG4gIGlmICghZnMuZXhpc3RzU3luYyhkZXZkb2NDb25maWdQYXRoKSkge1xuICAgIGNvbnNvbGUubG9nKGAgIFN0YXR1czogICAgICAgJHtsb2dnZXIueWVsbG93KCdOb3QgZGVwbG95ZWQnKX1gKVxuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIGxvZ2dlci5pbmZvKCdSdW4gXCJkZXZkb2MgZGVwbG95XCIgdG8gZGVwbG95IHlvdXIgZG9jdW1lbnRhdGlvbi4nKVxuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIHByb2Nlc3MuZXhpdCgwKVxuICB9XG4gIFxuICB0cnkge1xuICAgIGNvbnN0IGNvbmZpZyA9IGZzLnJlYWRKc29uU3luYyhkZXZkb2NDb25maWdQYXRoKSBhcyBEZXZEb2NDb25maWdcbiAgICBcbiAgICBjb25zb2xlLmxvZyhgICBQcm9qZWN0IFNsdWc6ICR7Y29uZmlnLnNsdWcgfHwgbG9nZ2VyLnllbGxvdygnVW5rbm93bicpfWApXG4gICAgY29uc29sZS5sb2coYCAgU3RhdHVzOiAgICAgICAke2xvZ2dlci5ncmVlbignRGVwbG95ZWQnKX1gKVxuICAgIFxuICAgIGlmIChjb25maWcudXJsKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICBVUkw6ICAgICAgICAgICR7bG9nZ2VyLmN5YW4oY29uZmlnLnVybCl9YClcbiAgICB9XG4gICAgXG4gICAgaWYgKGNvbmZpZy5hcGlLZXkpIHtcbiAgICAgIGNvbnN0IG1hc2tlZEtleSA9IGNvbmZpZy5hcGlLZXkuc3Vic3RyaW5nKDAsIDEyKSArICcuLi4nICsgY29uZmlnLmFwaUtleS5zdWJzdHJpbmcoY29uZmlnLmFwaUtleS5sZW5ndGggLSA0KVxuICAgICAgY29uc29sZS5sb2coYCAgQVBJIEtleTogICAgICAke21hc2tlZEtleX1gKVxuICAgIH1cbiAgICBcbiAgICBpZiAoY29uZmlnLmxhc3REZXBsb3llZCkge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGNvbmZpZy5sYXN0RGVwbG95ZWQpXG4gICAgICBjb25zb2xlLmxvZyhgICBMYXN0IERlcGxveTogICR7ZGF0ZS50b0xvY2FsZVN0cmluZygpfWApXG4gICAgfVxuICAgIFxuICAgIGNvbnNvbGUubG9nKCcnKVxuICAgIGNvbnNvbGUubG9nKGAgIFBsYXRmb3JtOiAgICAgJHthcGlVcmx9YClcbiAgICBjb25zb2xlLmxvZygnJylcbiAgICBcbiAgICAvLyBPcHRpb25hbDogdmVyaWZ5IHdpdGggc2VydmVyXG4gICAgaWYgKGNvbmZpZy5zbHVnICYmIGNvbmZpZy5hcGlLZXkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YXBpVXJsfS9hcGkvZGVwbG95P3NsdWc9JHtjb25maWcuc2x1Z31gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtjb25maWcuYXBpS2V5fWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgeyBleGlzdHM/OiBib29sZWFuIH1cbiAgICAgICAgICBpZiAoZGF0YS5leGlzdHMpIHtcbiAgICAgICAgICAgIGxvZ2dlci5zdWNjZXNzKCfinJMgUHJvamVjdCB2ZXJpZmllZCBvbiBzZXJ2ZXInKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNpbGVudCBmYWlsIC0gc2VydmVyIHZlcmlmaWNhdGlvbiBpcyBvcHRpb25hbFxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcmVhZCBwcm9qZWN0IGNvbmZpZzogJHttZXNzYWdlfWApXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const commander_1 = require("commander");
|
|
4
|
+
const create_1 = require("./commands/create");
|
|
5
|
+
const init_1 = require("./commands/init");
|
|
6
|
+
const dev_1 = require("./commands/dev");
|
|
7
|
+
const build_1 = require("./commands/build");
|
|
8
|
+
const start_1 = require("./commands/start");
|
|
9
|
+
const check_1 = require("./commands/check");
|
|
10
|
+
const deploy_1 = require("./commands/deploy");
|
|
11
|
+
const keys_1 = require("./commands/keys");
|
|
12
|
+
const whoami_1 = require("./commands/whoami");
|
|
13
|
+
const upload_1 = require("./commands/upload");
|
|
14
|
+
const packageJson = require('../../package.json');
|
|
15
|
+
const program = new commander_1.Command();
|
|
16
|
+
program
|
|
17
|
+
.name('devdoc')
|
|
18
|
+
.description('Documentation framework for developers')
|
|
19
|
+
.version(packageJson.version);
|
|
20
|
+
program
|
|
21
|
+
.command('create [project-directory]')
|
|
22
|
+
.description('Create a new DevDoc documentation site')
|
|
23
|
+
.option('-t, --template <type>', 'Template to use (basic, openapi, graphql)')
|
|
24
|
+
.option('-s, --subdomain <subdomain>', 'Subdomain for your docs (e.g., my-docs.devdoc.sh)')
|
|
25
|
+
.option('--no-git', 'Skip git initialization')
|
|
26
|
+
.option('--no-install', 'Skip installing dependencies')
|
|
27
|
+
.option('-u, --url <url>', 'API URL (default: https://devdoc.sh)')
|
|
28
|
+
.action(create_1.create);
|
|
29
|
+
program
|
|
30
|
+
.command('init')
|
|
31
|
+
.description('Initialize/register project with Brainfish')
|
|
32
|
+
.option('-s, --slug <slug>', 'Project slug')
|
|
33
|
+
.option('--subdomain <subdomain>', 'Subdomain for your docs (e.g., my-docs.devdoc.sh)')
|
|
34
|
+
.option('-f, --force', 'Overwrite existing .devdoc.json')
|
|
35
|
+
.option('-u, --url <url>', 'API URL (default: https://devdoc.sh)')
|
|
36
|
+
.action(init_1.init);
|
|
37
|
+
program
|
|
38
|
+
.command('dev')
|
|
39
|
+
.description('Start development server with hot reload')
|
|
40
|
+
.option('-p, --port <port>', 'Port to run the server on', '3333')
|
|
41
|
+
.option('-H, --host <host>', 'Host to bind the server to', 'localhost')
|
|
42
|
+
.action(dev_1.dev);
|
|
43
|
+
program
|
|
44
|
+
.command('build')
|
|
45
|
+
.description('Build documentation for production')
|
|
46
|
+
.option('-o, --output <dir>', 'Output directory', 'dist')
|
|
47
|
+
.action(build_1.build);
|
|
48
|
+
program
|
|
49
|
+
.command('start')
|
|
50
|
+
.description('Start production server')
|
|
51
|
+
.option('-p, --port <port>', 'Port to run the server on', '3000')
|
|
52
|
+
.action(start_1.start);
|
|
53
|
+
program
|
|
54
|
+
.command('check')
|
|
55
|
+
.description('Validate docs.json and MDX files')
|
|
56
|
+
.action(check_1.check);
|
|
57
|
+
program
|
|
58
|
+
.command('deploy')
|
|
59
|
+
.description('Deploy documentation to DevDoc platform')
|
|
60
|
+
.option('-u, --url <url>', 'API URL (default: https://devdoc.sh)')
|
|
61
|
+
.option('-k, --api-key <key>', 'API key for authentication')
|
|
62
|
+
.action(deploy_1.deploy);
|
|
63
|
+
// Keys management
|
|
64
|
+
const keysCmd = program
|
|
65
|
+
.command('keys')
|
|
66
|
+
.description('Manage API keys for your project');
|
|
67
|
+
keysCmd
|
|
68
|
+
.command('list')
|
|
69
|
+
.description('Show current API key info')
|
|
70
|
+
.option('-u, --url <url>', 'API URL')
|
|
71
|
+
.action(keys_1.listKeys);
|
|
72
|
+
keysCmd
|
|
73
|
+
.command('regenerate')
|
|
74
|
+
.description('Generate a new API key (invalidates the old one)')
|
|
75
|
+
.option('-u, --url <url>', 'API URL')
|
|
76
|
+
.action(keys_1.regenerateKey);
|
|
77
|
+
program
|
|
78
|
+
.command('whoami')
|
|
79
|
+
.description('Show current project information')
|
|
80
|
+
.option('-u, --url <url>', 'API URL')
|
|
81
|
+
.action(whoami_1.whoami);
|
|
82
|
+
// Assets management
|
|
83
|
+
const assetsCmd = program
|
|
84
|
+
.command('assets')
|
|
85
|
+
.description('Manage project assets (images, files)');
|
|
86
|
+
assetsCmd
|
|
87
|
+
.command('upload <files...>')
|
|
88
|
+
.description('Upload assets to storage (max 25MB per file)')
|
|
89
|
+
.option('-u, --url <url>', 'API URL')
|
|
90
|
+
.option('-k, --api-key <key>', 'API key for authentication')
|
|
91
|
+
.action(upload_1.upload);
|
|
92
|
+
assetsCmd
|
|
93
|
+
.command('list')
|
|
94
|
+
.description('List uploaded assets')
|
|
95
|
+
.option('-u, --url <url>', 'API URL')
|
|
96
|
+
.option('-k, --api-key <key>', 'API key for authentication')
|
|
97
|
+
.action(upload_1.listAssets);
|
|
98
|
+
// Shortcut for upload
|
|
99
|
+
program
|
|
100
|
+
.command('upload <files...>')
|
|
101
|
+
.description('Upload assets to storage (shortcut for "devdoc assets upload")')
|
|
102
|
+
.option('-u, --url <url>', 'API URL')
|
|
103
|
+
.option('-k, --api-key <key>', 'API key for authentication')
|
|
104
|
+
.action(upload_1.upload);
|
|
105
|
+
program.parse(process.argv);
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUNBQW9DO0FBQ3BDLDhDQUEyQztBQUMzQywwQ0FBdUM7QUFDdkMsd0NBQXFDO0FBQ3JDLDRDQUF5QztBQUN6Qyw0Q0FBeUM7QUFDekMsNENBQXlDO0FBQ3pDLDhDQUEyQztBQUMzQywwQ0FBMEQ7QUFDMUQsOENBQTJDO0FBQzNDLDhDQUF1RDtBQUV2RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUVsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFPLEVBQUUsQ0FBQztBQUU5QixPQUFPO0tBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQztLQUNkLFdBQVcsQ0FBQyx3Q0FBd0MsQ0FBQztLQUNyRCxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRWhDLE9BQU87S0FDSixPQUFPLENBQUMsNEJBQTRCLENBQUM7S0FDckMsV0FBVyxDQUFDLHdDQUF3QyxDQUFDO0tBQ3JELE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSwyQ0FBMkMsQ0FBQztLQUM1RSxNQUFNLENBQUMsNkJBQTZCLEVBQUUsbURBQW1ELENBQUM7S0FDMUYsTUFBTSxDQUFDLFVBQVUsRUFBRSx5QkFBeUIsQ0FBQztLQUM3QyxNQUFNLENBQUMsY0FBYyxFQUFFLDhCQUE4QixDQUFDO0tBQ3RELE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxzQ0FBc0MsQ0FBQztLQUNqRSxNQUFNLENBQUMsZUFBTSxDQUFDLENBQUM7QUFFbEIsT0FBTztLQUNKLE9BQU8sQ0FBQyxNQUFNLENBQUM7S0FDZixXQUFXLENBQUMsNENBQTRDLENBQUM7S0FDekQsTUFBTSxDQUFDLG1CQUFtQixFQUFFLGNBQWMsQ0FBQztLQUMzQyxNQUFNLENBQUMseUJBQXlCLEVBQUUsbURBQW1ELENBQUM7S0FDdEYsTUFBTSxDQUFDLGFBQWEs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QixPQUFPO0tBQ0osT0FBTyxDQUFDLG1CQUFtQixDQUFDO0tBQzVCLFdBQVcsQ0FBQyxnRUFBZ0UsQ0FBQztLQUM3RSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0tBQ3BDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSw0QkFBNEIsQ0FBQztLQUMzRCxNQUFNLENBQUMsZUFBTSxDQUFDLENBQUM7QUFFbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJy4vY29tbWFuZHMvY3JlYXRlJztcbmltcG9ydCB7IGluaXQgfSBmcm9tICcuL2NvbW1hbmRzL2luaXQnO1xuaW1wb3J0IHsgZGV2IH0gZnJvbSAnLi9jb21tYW5kcy9kZXYnO1xuaW1wb3J0IHsgYnVpbGQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkJztcbmltcG9ydCB7IHN0YXJ0IH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydCc7XG5pbXBvcnQgeyBjaGVjayB9IGZyb20gJy4vY29tbWFuZHMvY2hlY2snO1xuaW1wb3J0IHsgZGVwbG95IH0gZnJvbSAnLi9jb21tYW5kcy9kZXBsb3knO1xuaW1wb3J0IHsgbGlzdEtleXMsIHJlZ2VuZXJhdGVLZXkgfSBmcm9tICcuL2NvbW1hbmRzL2tleXMnO1xuaW1wb3J0IHsgd2hvYW1pIH0gZnJvbSAnLi9jb21tYW5kcy93aG9hbWknO1xuaW1wb3J0IHsgdXBsb2FkLCBsaXN0QXNzZXRzIH0gZnJvbSAnLi9jb21tYW5kcy91cGxvYWQnO1xuXG5jb25zdCBwYWNrYWdlSnNvbiA9IHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpO1xuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxucHJvZ3JhbVxuICAubmFtZSgnZGV2ZG9jJylcbiAgLmRlc2NyaXB0aW9uKCdEb2N1bWVudGF0aW9uIGZyYW1ld29yayBmb3IgZGV2ZWxvcGVycycpXG4gIC52ZXJzaW9uKHBhY2thZ2VKc29uLnZlcnNpb24pO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdjcmVhdGUgW3Byb2plY3QtZGlyZWN0b3J5XScpXG4gIC5kZXNjcmlwdGlvbignQ3JlYXRlIGEgbmV3IERldkRvYyBkb2N1bWVudGF0aW9uIHNpdGUnKVxuICAub3B0aW9uKCctdCwgLS10ZW1wbGF0ZSA8dHlwZT4nLCAnVGVtcGxhdGUgdG8gdXNlIChiYXNpYywgb3BlbmFwaSwgZ3JhcGhxbCknKVxuICAub3B0aW9uKCctcywgLS1zdWJkb21haW4gPHN1YmRvbWFpbj4nLCAnU3ViZG9tYWluIGZvciB5b3VyIGRvY3MgKGUuZy4sIG15LWRvY3MuZGV2ZG9jLnNoKScpXG4gIC5vcHRpb24oJy0tbm8tZ2l0JywgJ1NraXAgZ2l0IGluaXRpYWxpemF0aW9uJylcbiAgLm9wdGlvbignLS1uby1pbnN0YWxsJywgJ1NraXAgaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMnKVxuICAub3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnQVBJIFVSTCAoZGVmYXVsdDogaHR0cHM6Ly9kZXZkb2Muc2gpJylcbiAgLmFjdGlvbihjcmVhdGUpO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdpbml0JylcbiAgLmRlc2NyaXB0aW9uKCdJbml0aWFsaXplL3JlZ2lzdGVyIHByb2plY3Qgd2l0aCBCcmFpbmZpc2gnKVxuICAub3B0aW9uKCctcywgLS1zbHVnIDxzbHVnPicsICdQcm9qZWN0IHNsdWcnKVxuICAub3B0aW9uKCctLXN1YmRvbWFpbiA8c3ViZG9tYWluPicsICdTdWJkb21haW4gZm9yIHlvdXIgZG9jcyAoZS5nLiwgbXktZG9jcy5kZXZkb2Muc2gpJylcbiAgLm9wdGlvbignLWYsIC0tZm9yY2UnLCAnT3ZlcndyaXRlIGV4aXN0aW5nIC5kZXZkb2MuanNvbicpXG4gIC5vcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdBUEkgVVJMIChkZWZhdWx0OiBodHRwczovL2RldmRvYy5zaCknKVxuICAuYWN0aW9uKGluaXQpO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdkZXYnKVxuICAuZGVzY3JpcHRpb24oJ1N0YXJ0IGRldmVsb3BtZW50IHNlcnZlciB3aXRoIGhvdCByZWxvYWQnKVxuICAub3B0aW9uKCctcCwgLS1wb3J0IDxwb3J0PicsICdQb3J0IHRvIHJ1biB0aGUgc2VydmVyIG9uJywgJzMzMzMnKVxuICAub3B0aW9uKCctSCwgLS1ob3N0IDxob3N0PicsICdIb3N0IHRvIGJpbmQgdGhlIHNlcnZlciB0bycsICdsb2NhbGhvc3QnKVxuICAuYWN0aW9uKGRldik7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2J1aWxkJylcbiAgLmRlc2NyaXB0aW9uKCdCdWlsZCBkb2N1bWVudGF0aW9uIGZvciBwcm9kdWN0aW9uJylcbiAgLm9wdGlvbignLW8sIC0tb3V0cHV0IDxkaXI+JywgJ091dHB1dCBkaXJlY3RvcnknLCAnZGlzdCcpXG4gIC5hY3Rpb24oYnVpbGQpO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdzdGFydCcpXG4gIC5kZXNjcmlwdGlvbignU3RhcnQgcHJvZHVjdGlvbiBzZXJ2ZXInKVxuICAub3B0aW9uKCctcCwgLS1wb3J0IDxwb3J0PicsICdQb3J0IHRvIHJ1biB0aGUgc2VydmVyIG9uJywgJzMwMDAnKVxuICAuYWN0aW9uKHN0YXJ0KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnY2hlY2snKVxuICAuZGVzY3JpcHRpb24oJ1ZhbGlkYXRlIGRvY3MuanNvbiBhbmQgTURYIGZpbGVzJylcbiAgLmFjdGlvbihjaGVjayk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2RlcGxveScpXG4gIC5kZXNjcmlwdGlvbignRGVwbG95IGRvY3VtZW50YXRpb24gdG8gRGV2RG9jIHBsYXRmb3JtJylcbiAgLm9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ0FQSSBVUkwgKGRlZmF1bHQ6IGh0dHBzOi8vZGV2ZG9jLnNoKScpXG4gIC5vcHRpb24oJy1rLCAtLWFwaS1rZXkgPGtleT4nLCAnQVBJIGtleSBmb3IgYXV0aGVudGljYXRpb24nKVxuICAuYWN0aW9uKGRlcGxveSk7XG5cbi8vIEtleXMgbWFuYWdlbWVudFxuY29uc3Qga2V5c0NtZCA9IHByb2dyYW1cbiAgLmNvbW1hbmQoJ2tleXMnKVxuICAuZGVzY3JpcHRpb24oJ01hbmFnZSBBUEkga2V5cyBmb3IgeW91ciBwcm9qZWN0Jyk7XG5cbmtleXNDbWRcbiAgLmNvbW1hbmQoJ2xpc3QnKVxuICAuZGVzY3JpcHRpb24oJ1Nob3cgY3VycmVudCBBUEkga2V5IGluZm8nKVxuICAub3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnQVBJIFVSTCcpXG4gIC5hY3Rpb24obGlzdEtleXMpO1xuXG5rZXlzQ21kXG4gIC5jb21tYW5kKCdyZWdlbmVyYXRlJylcbiAgLmRlc2NyaXB0aW9uKCdHZW5lcmF0ZSBhIG5ldyBBUEkga2V5IChpbnZhbGlkYXRlcyB0aGUgb2xkIG9uZSknKVxuICAub3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnQVBJIFVSTCcpXG4gIC5hY3Rpb24ocmVnZW5lcmF0ZUtleSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3dob2FtaScpXG4gIC5kZXNjcmlwdGlvbignU2hvdyBjdXJyZW50IHByb2plY3QgaW5mb3JtYXRpb24nKVxuICAub3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnQVBJIFVSTCcpXG4gIC5hY3Rpb24od2hvYW1pKTtcblxuLy8gQXNzZXRzIG1hbmFnZW1lbnRcbmNvbnN0IGFzc2V0c0NtZCA9IHByb2dyYW1cbiAgLmNvbW1hbmQoJ2Fzc2V0cycpXG4gIC5kZXNjcmlwdGlvbignTWFuYWdlIHByb2plY3QgYXNzZXRzIChpbWFnZXMsIGZpbGVzKScpO1xuXG5hc3NldHNDbWRcbiAgLmNvbW1hbmQoJ3VwbG9hZCA8ZmlsZXMuLi4+JylcbiAgLmRlc2NyaXB0aW9uKCdVcGxvYWQgYXNzZXRzIHRvIHN0b3JhZ2UgKG1heCAyNU1CIHBlciBmaWxlKScpXG4gIC5vcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdBUEkgVVJMJylcbiAgLm9wdGlvbignLWssIC0tYXBpLWtleSA8a2V5PicsICdBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbicpXG4gIC5hY3Rpb24odXBsb2FkKTtcblxuYXNzZXRzQ21kXG4gIC5jb21tYW5kKCdsaXN0JylcbiAgLmRlc2NyaXB0aW9uKCdMaXN0IHVwbG9hZGVkIGFzc2V0cycpXG4gIC5vcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdBUEkgVVJMJylcbiAgLm9wdGlvbignLWssIC0tYXBpLWtleSA8a2V5PicsICdBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbicpXG4gIC5hY3Rpb24obGlzdEFzc2V0cyk7XG5cbi8vIFNob3J0Y3V0IGZvciB1cGxvYWRcbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3VwbG9hZCA8ZmlsZXMuLi4+JylcbiAgLmRlc2NyaXB0aW9uKCdVcGxvYWQgYXNzZXRzIHRvIHN0b3JhZ2UgKHNob3J0Y3V0IGZvciBcImRldmRvYyBhc3NldHMgdXBsb2FkXCIpJylcbiAgLm9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ0FQSSBVUkwnKVxuICAub3B0aW9uKCctaywgLS1hcGkta2V5IDxrZXk+JywgJ0FQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uJylcbiAgLmFjdGlvbih1cGxvYWQpO1xuXG5wcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7XG4iXX0=
|