@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.
Files changed (268) hide show
  1. package/LICENSE +33 -0
  2. package/README.md +415 -0
  3. package/bin/devdoc.js +13 -0
  4. package/dist/cli/commands/build.d.ts +5 -0
  5. package/dist/cli/commands/build.js +87 -0
  6. package/dist/cli/commands/check.d.ts +1 -0
  7. package/dist/cli/commands/check.js +143 -0
  8. package/dist/cli/commands/create.d.ts +24 -0
  9. package/dist/cli/commands/create.js +387 -0
  10. package/dist/cli/commands/deploy.d.ts +9 -0
  11. package/dist/cli/commands/deploy.js +433 -0
  12. package/dist/cli/commands/dev.d.ts +6 -0
  13. package/dist/cli/commands/dev.js +139 -0
  14. package/dist/cli/commands/init.d.ts +11 -0
  15. package/dist/cli/commands/init.js +238 -0
  16. package/dist/cli/commands/keys.d.ts +12 -0
  17. package/dist/cli/commands/keys.js +165 -0
  18. package/dist/cli/commands/start.d.ts +5 -0
  19. package/dist/cli/commands/start.js +56 -0
  20. package/dist/cli/commands/upload.d.ts +13 -0
  21. package/dist/cli/commands/upload.js +238 -0
  22. package/dist/cli/commands/whoami.d.ts +8 -0
  23. package/dist/cli/commands/whoami.js +91 -0
  24. package/dist/cli/index.d.ts +1 -0
  25. package/dist/cli/index.js +106 -0
  26. package/dist/config/index.d.ts +80 -0
  27. package/dist/config/index.js +133 -0
  28. package/dist/constants.d.ts +9 -0
  29. package/dist/constants.js +13 -0
  30. package/dist/index.d.ts +7 -0
  31. package/dist/index.js +12 -0
  32. package/dist/utils/logger.d.ts +16 -0
  33. package/dist/utils/logger.js +61 -0
  34. package/dist/utils/paths.d.ts +16 -0
  35. package/dist/utils/paths.js +50 -0
  36. package/package.json +51 -0
  37. package/renderer/app/api/assets/[...path]/route.ts +123 -0
  38. package/renderer/app/api/assets/route.ts +124 -0
  39. package/renderer/app/api/assets/upload/route.ts +177 -0
  40. package/renderer/app/api/auth-schemes/route.ts +77 -0
  41. package/renderer/app/api/chat/route.ts +858 -0
  42. package/renderer/app/api/codegen/route.ts +72 -0
  43. package/renderer/app/api/collections/route.ts +1016 -0
  44. package/renderer/app/api/debug/route.ts +53 -0
  45. package/renderer/app/api/deploy/route.ts +234 -0
  46. package/renderer/app/api/device/route.ts +42 -0
  47. package/renderer/app/api/docs/route.ts +187 -0
  48. package/renderer/app/api/keys/regenerate/route.ts +80 -0
  49. package/renderer/app/api/openapi-spec/route.ts +151 -0
  50. package/renderer/app/api/projects/[slug]/route.ts +153 -0
  51. package/renderer/app/api/projects/[slug]/stats/route.ts +96 -0
  52. package/renderer/app/api/projects/register/route.ts +152 -0
  53. package/renderer/app/api/proxy/route.ts +149 -0
  54. package/renderer/app/api/proxy-stream/route.ts +168 -0
  55. package/renderer/app/api/redirects/route.ts +47 -0
  56. package/renderer/app/api/schema/route.ts +65 -0
  57. package/renderer/app/api/subdomains/check/route.ts +172 -0
  58. package/renderer/app/api/suggestions/route.ts +144 -0
  59. package/renderer/app/favicon.ico +0 -0
  60. package/renderer/app/globals.css +1103 -0
  61. package/renderer/app/layout.tsx +47 -0
  62. package/renderer/app/llms-full.txt/route.ts +346 -0
  63. package/renderer/app/llms.txt/route.ts +279 -0
  64. package/renderer/app/page.tsx +14 -0
  65. package/renderer/app/robots.txt/route.ts +84 -0
  66. package/renderer/app/sitemap.xml/route.ts +199 -0
  67. package/renderer/components/docs/index.ts +12 -0
  68. package/renderer/components/docs/mdx/accordion.tsx +169 -0
  69. package/renderer/components/docs/mdx/badge.tsx +132 -0
  70. package/renderer/components/docs/mdx/callouts.tsx +154 -0
  71. package/renderer/components/docs/mdx/cards.tsx +213 -0
  72. package/renderer/components/docs/mdx/changelog.tsx +120 -0
  73. package/renderer/components/docs/mdx/code-block.tsx +186 -0
  74. package/renderer/components/docs/mdx/code-group.tsx +421 -0
  75. package/renderer/components/docs/mdx/file-embeds.tsx +105 -0
  76. package/renderer/components/docs/mdx/frame.tsx +112 -0
  77. package/renderer/components/docs/mdx/highlight.tsx +151 -0
  78. package/renderer/components/docs/mdx/iframe.tsx +134 -0
  79. package/renderer/components/docs/mdx/image.tsx +235 -0
  80. package/renderer/components/docs/mdx/index.ts +204 -0
  81. package/renderer/components/docs/mdx/mermaid.tsx +240 -0
  82. package/renderer/components/docs/mdx/param-field.tsx +200 -0
  83. package/renderer/components/docs/mdx/steps.tsx +113 -0
  84. package/renderer/components/docs/mdx/tabs.tsx +86 -0
  85. package/renderer/components/docs/mdx-renderer.tsx +100 -0
  86. package/renderer/components/docs/navigation/breadcrumbs.tsx +76 -0
  87. package/renderer/components/docs/navigation/index.ts +8 -0
  88. package/renderer/components/docs/navigation/page-nav.tsx +64 -0
  89. package/renderer/components/docs/navigation/sidebar.tsx +515 -0
  90. package/renderer/components/docs/navigation/toc.tsx +113 -0
  91. package/renderer/components/docs/notice.tsx +105 -0
  92. package/renderer/components/docs-header.tsx +274 -0
  93. package/renderer/components/docs-viewer/agent/agent-chat.tsx +2076 -0
  94. package/renderer/components/docs-viewer/agent/cards/debug-context-card.tsx +90 -0
  95. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.tsx +49 -0
  96. package/renderer/components/docs-viewer/agent/cards/index.tsx +50 -0
  97. package/renderer/components/docs-viewer/agent/cards/response-options-card.tsx +212 -0
  98. package/renderer/components/docs-viewer/agent/cards/types.ts +84 -0
  99. package/renderer/components/docs-viewer/agent/chat-message.tsx +17 -0
  100. package/renderer/components/docs-viewer/agent/index.tsx +6 -0
  101. package/renderer/components/docs-viewer/agent/messages/assistant-message.tsx +119 -0
  102. package/renderer/components/docs-viewer/agent/messages/chat-message.tsx +46 -0
  103. package/renderer/components/docs-viewer/agent/messages/index.ts +17 -0
  104. package/renderer/components/docs-viewer/agent/messages/tool-call-display.tsx +721 -0
  105. package/renderer/components/docs-viewer/agent/messages/types.ts +61 -0
  106. package/renderer/components/docs-viewer/agent/messages/typing-indicator.tsx +24 -0
  107. package/renderer/components/docs-viewer/agent/messages/user-message.tsx +51 -0
  108. package/renderer/components/docs-viewer/code-editor/index.tsx +2 -0
  109. package/renderer/components/docs-viewer/code-editor/notes-mode.tsx +1283 -0
  110. package/renderer/components/docs-viewer/content/changelog-page.tsx +331 -0
  111. package/renderer/components/docs-viewer/content/doc-page.tsx +285 -0
  112. package/renderer/components/docs-viewer/content/documentation-viewer.tsx +17 -0
  113. package/renderer/components/docs-viewer/content/index.tsx +29 -0
  114. package/renderer/components/docs-viewer/content/introduction.tsx +21 -0
  115. package/renderer/components/docs-viewer/content/request-details.tsx +330 -0
  116. package/renderer/components/docs-viewer/content/sections/auth.tsx +69 -0
  117. package/renderer/components/docs-viewer/content/sections/body.tsx +66 -0
  118. package/renderer/components/docs-viewer/content/sections/headers.tsx +43 -0
  119. package/renderer/components/docs-viewer/content/sections/overview.tsx +40 -0
  120. package/renderer/components/docs-viewer/content/sections/parameters.tsx +43 -0
  121. package/renderer/components/docs-viewer/content/sections/responses.tsx +87 -0
  122. package/renderer/components/docs-viewer/global-auth-modal.tsx +352 -0
  123. package/renderer/components/docs-viewer/index.tsx +1466 -0
  124. package/renderer/components/docs-viewer/playground/auth-editor.tsx +280 -0
  125. package/renderer/components/docs-viewer/playground/body-editor.tsx +221 -0
  126. package/renderer/components/docs-viewer/playground/code-editor.tsx +224 -0
  127. package/renderer/components/docs-viewer/playground/code-snippet.tsx +387 -0
  128. package/renderer/components/docs-viewer/playground/graphql-playground.tsx +745 -0
  129. package/renderer/components/docs-viewer/playground/index.tsx +671 -0
  130. package/renderer/components/docs-viewer/playground/key-value-editor.tsx +261 -0
  131. package/renderer/components/docs-viewer/playground/method-selector.tsx +60 -0
  132. package/renderer/components/docs-viewer/playground/request-builder.tsx +179 -0
  133. package/renderer/components/docs-viewer/playground/request-tabs.tsx +237 -0
  134. package/renderer/components/docs-viewer/playground/response-cards/idle-card.tsx +21 -0
  135. package/renderer/components/docs-viewer/playground/response-cards/index.tsx +93 -0
  136. package/renderer/components/docs-viewer/playground/response-cards/loading-card.tsx +16 -0
  137. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.tsx +23 -0
  138. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.tsx +268 -0
  139. package/renderer/components/docs-viewer/playground/response-cards/types.ts +82 -0
  140. package/renderer/components/docs-viewer/playground/response-viewer.tsx +43 -0
  141. package/renderer/components/docs-viewer/search/index.ts +2 -0
  142. package/renderer/components/docs-viewer/search/search-dialog.tsx +331 -0
  143. package/renderer/components/docs-viewer/search/use-search.ts +117 -0
  144. package/renderer/components/docs-viewer/shared/markdown-renderer.tsx +431 -0
  145. package/renderer/components/docs-viewer/shared/method-badge.tsx +41 -0
  146. package/renderer/components/docs-viewer/shared/schema-viewer.tsx +349 -0
  147. package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +239 -0
  148. package/renderer/components/docs-viewer/sidebar/endpoint-options.tsx +316 -0
  149. package/renderer/components/docs-viewer/sidebar/index.tsx +343 -0
  150. package/renderer/components/docs-viewer/sidebar/right-sidebar.tsx +202 -0
  151. package/renderer/components/docs-viewer/sidebar/sidebar-group.tsx +118 -0
  152. package/renderer/components/docs-viewer/sidebar/sidebar-item.tsx +226 -0
  153. package/renderer/components/docs-viewer/sidebar/sidebar-section.tsx +52 -0
  154. package/renderer/components/theme-provider.tsx +11 -0
  155. package/renderer/components/theme-toggle.tsx +76 -0
  156. package/renderer/components/ui/badge.tsx +46 -0
  157. package/renderer/components/ui/button.tsx +59 -0
  158. package/renderer/components/ui/dialog.tsx +118 -0
  159. package/renderer/components/ui/dropdown-menu.tsx +257 -0
  160. package/renderer/components/ui/input.tsx +21 -0
  161. package/renderer/components/ui/label.tsx +24 -0
  162. package/renderer/components/ui/navigation-menu.tsx +168 -0
  163. package/renderer/components/ui/select.tsx +190 -0
  164. package/renderer/components/ui/spinner.tsx +114 -0
  165. package/renderer/components/ui/tabs.tsx +66 -0
  166. package/renderer/components/ui/tooltip.tsx +61 -0
  167. package/renderer/hooks/use-code-copy.ts +88 -0
  168. package/renderer/hooks/use-openapi-title.ts +44 -0
  169. package/renderer/lib/api-docs/agent/index.ts +6 -0
  170. package/renderer/lib/api-docs/agent/indexer.ts +323 -0
  171. package/renderer/lib/api-docs/agent/spec-summary.ts +335 -0
  172. package/renderer/lib/api-docs/agent/types.ts +116 -0
  173. package/renderer/lib/api-docs/auth/auth-context.tsx +225 -0
  174. package/renderer/lib/api-docs/auth/auth-storage.ts +87 -0
  175. package/renderer/lib/api-docs/auth/crypto.ts +89 -0
  176. package/renderer/lib/api-docs/auth/index.ts +4 -0
  177. package/renderer/lib/api-docs/code-editor/db.ts +164 -0
  178. package/renderer/lib/api-docs/code-editor/hooks.ts +266 -0
  179. package/renderer/lib/api-docs/code-editor/index.ts +6 -0
  180. package/renderer/lib/api-docs/code-editor/mode-context.tsx +207 -0
  181. package/renderer/lib/api-docs/code-editor/types.ts +105 -0
  182. package/renderer/lib/api-docs/codegen/definitions.ts +297 -0
  183. package/renderer/lib/api-docs/codegen/har.ts +251 -0
  184. package/renderer/lib/api-docs/codegen/index.ts +159 -0
  185. package/renderer/lib/api-docs/factories.ts +151 -0
  186. package/renderer/lib/api-docs/index.ts +17 -0
  187. package/renderer/lib/api-docs/mobile-context.tsx +112 -0
  188. package/renderer/lib/api-docs/navigation-context.tsx +88 -0
  189. package/renderer/lib/api-docs/parsers/graphql/README.md +129 -0
  190. package/renderer/lib/api-docs/parsers/graphql/index.ts +91 -0
  191. package/renderer/lib/api-docs/parsers/graphql/parser.ts +491 -0
  192. package/renderer/lib/api-docs/parsers/graphql/transformer.ts +246 -0
  193. package/renderer/lib/api-docs/parsers/graphql/types.ts +283 -0
  194. package/renderer/lib/api-docs/parsers/openapi/README.md +32 -0
  195. package/renderer/lib/api-docs/parsers/openapi/dereferencer.ts +60 -0
  196. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.ts +574 -0
  197. package/renderer/lib/api-docs/parsers/openapi/extractors/body.ts +403 -0
  198. package/renderer/lib/api-docs/parsers/openapi/extractors/index.ts +232 -0
  199. package/renderer/lib/api-docs/parsers/openapi/index.ts +171 -0
  200. package/renderer/lib/api-docs/parsers/openapi/transformer.ts +277 -0
  201. package/renderer/lib/api-docs/parsers/openapi/validator.ts +31 -0
  202. package/renderer/lib/api-docs/playground/context.tsx +107 -0
  203. package/renderer/lib/api-docs/playground/navigation-context.tsx +124 -0
  204. package/renderer/lib/api-docs/playground/request-builder.ts +223 -0
  205. package/renderer/lib/api-docs/playground/request-runner.ts +282 -0
  206. package/renderer/lib/api-docs/playground/types.ts +35 -0
  207. package/renderer/lib/api-docs/types.ts +269 -0
  208. package/renderer/lib/api-docs/utils.ts +311 -0
  209. package/renderer/lib/cache.ts +193 -0
  210. package/renderer/lib/docs/config/index.ts +29 -0
  211. package/renderer/lib/docs/config/loader.ts +142 -0
  212. package/renderer/lib/docs/config/schema.ts +298 -0
  213. package/renderer/lib/docs/index.ts +12 -0
  214. package/renderer/lib/docs/mdx/compiler.ts +176 -0
  215. package/renderer/lib/docs/mdx/frontmatter.ts +80 -0
  216. package/renderer/lib/docs/mdx/index.ts +26 -0
  217. package/renderer/lib/docs/navigation/generator.ts +348 -0
  218. package/renderer/lib/docs/navigation/index.ts +12 -0
  219. package/renderer/lib/docs/navigation/types.ts +123 -0
  220. package/renderer/lib/docs-navigation-context.tsx +80 -0
  221. package/renderer/lib/multi-tenant/context.ts +105 -0
  222. package/renderer/lib/storage/blob.ts +845 -0
  223. package/renderer/lib/utils.ts +6 -0
  224. package/renderer/next.config.ts +76 -0
  225. package/renderer/package.json +66 -0
  226. package/renderer/postcss.config.mjs +5 -0
  227. package/renderer/public/assets/images/screenshot.png +0 -0
  228. package/renderer/public/assets/logo/dark.svg +9 -0
  229. package/renderer/public/assets/logo/light.svg +9 -0
  230. package/renderer/public/assets/logo.svg +9 -0
  231. package/renderer/public/file.svg +1 -0
  232. package/renderer/public/globe.svg +1 -0
  233. package/renderer/public/icon.png +0 -0
  234. package/renderer/public/logo.svg +9 -0
  235. package/renderer/public/window.svg +1 -0
  236. package/renderer/tsconfig.json +28 -0
  237. package/templates/basic/README.md +139 -0
  238. package/templates/basic/assets/favicon.svg +4 -0
  239. package/templates/basic/assets/logo.svg +9 -0
  240. package/templates/basic/docs.json +47 -0
  241. package/templates/basic/guides/configuration.mdx +149 -0
  242. package/templates/basic/guides/overview.mdx +96 -0
  243. package/templates/basic/index.mdx +39 -0
  244. package/templates/basic/package.json +14 -0
  245. package/templates/basic/quickstart.mdx +92 -0
  246. package/templates/basic/vercel.json +6 -0
  247. package/templates/graphql/README.md +139 -0
  248. package/templates/graphql/api-reference/schema.graphql +305 -0
  249. package/templates/graphql/assets/favicon.svg +4 -0
  250. package/templates/graphql/assets/logo.svg +9 -0
  251. package/templates/graphql/docs.json +54 -0
  252. package/templates/graphql/guides/configuration.mdx +149 -0
  253. package/templates/graphql/guides/overview.mdx +96 -0
  254. package/templates/graphql/index.mdx +39 -0
  255. package/templates/graphql/package.json +14 -0
  256. package/templates/graphql/quickstart.mdx +92 -0
  257. package/templates/graphql/vercel.json +6 -0
  258. package/templates/openapi/README.md +139 -0
  259. package/templates/openapi/api-reference/openapi.json +419 -0
  260. package/templates/openapi/assets/favicon.svg +4 -0
  261. package/templates/openapi/assets/logo.svg +9 -0
  262. package/templates/openapi/docs.json +61 -0
  263. package/templates/openapi/guides/configuration.mdx +149 -0
  264. package/templates/openapi/guides/overview.mdx +96 -0
  265. package/templates/openapi/index.mdx +39 -0
  266. package/templates/openapi/package.json +14 -0
  267. package/templates/openapi/quickstart.mdx +92 -0
  268. package/templates/openapi/vercel.json +6 -0
@@ -0,0 +1,5 @@
1
+ interface StartOptions {
2
+ port: string;
3
+ }
4
+ export declare function start(options: StartOptions): Promise<void>;
5
+ export {};
@@ -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,8 @@
1
+ interface WhoamiOptions {
2
+ url?: string;
3
+ }
4
+ /**
5
+ * Show current project information
6
+ */
7
+ export declare function whoami(options: WhoamiOptions): Promise<void>;
8
+ export {};
@@ -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=