@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,143 @@
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.check = check;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const config_1 = require("../../config");
10
+ const logger_1 = require("../../utils/logger");
11
+ async function check() {
12
+ const projectRoot = process.cwd();
13
+ let hasErrors = false;
14
+ logger_1.logger.info('Checking documentation project...\n');
15
+ // Check for docs.json
16
+ const configPath = path_1.default.join(projectRoot, 'docs.json');
17
+ if (!fs_extra_1.default.existsSync(configPath)) {
18
+ logger_1.logger.error('✗ docs.json not found');
19
+ process.exit(1);
20
+ }
21
+ logger_1.logger.success('✓ docs.json found');
22
+ // Load and validate config
23
+ let config;
24
+ try {
25
+ config = await (0, config_1.loadConfig)(projectRoot);
26
+ logger_1.logger.success('✓ docs.json is valid JSON');
27
+ }
28
+ catch (error) {
29
+ logger_1.logger.error(`✗ Invalid JSON in docs.json: ${error.message}`);
30
+ process.exit(1);
31
+ }
32
+ // Validate config schema
33
+ const validation = (0, config_1.validateConfig)(config);
34
+ if (validation.valid) {
35
+ logger_1.logger.success('✓ docs.json schema is valid');
36
+ }
37
+ else {
38
+ logger_1.logger.error('✗ docs.json schema validation failed:');
39
+ validation.errors.forEach(err => {
40
+ logger_1.logger.error(` - ${err}`);
41
+ });
42
+ hasErrors = true;
43
+ }
44
+ // Check navigation pages exist
45
+ if (config.navigation) {
46
+ logger_1.logger.info('\nChecking navigation pages...');
47
+ // Handle both old array format and new tabs format
48
+ const groups = [];
49
+ if (Array.isArray(config.navigation)) {
50
+ // Old format: navigation is an array of groups
51
+ groups.push(...config.navigation);
52
+ }
53
+ else if (config.navigation.tabs) {
54
+ // New format: navigation.tabs contains tabs with groups
55
+ for (const tab of config.navigation.tabs) {
56
+ if (tab.groups) {
57
+ groups.push(...tab.groups);
58
+ }
59
+ }
60
+ }
61
+ for (const group of groups) {
62
+ if (group.pages) {
63
+ checkPages(projectRoot, group.pages, (found, pagePath) => {
64
+ if (found) {
65
+ logger_1.logger.success(` ✓ ${pagePath}`);
66
+ }
67
+ else {
68
+ logger_1.logger.error(` ✗ ${pagePath} - file not found`);
69
+ hasErrors = true;
70
+ }
71
+ });
72
+ }
73
+ }
74
+ }
75
+ // Check for MDX files
76
+ logger_1.logger.info('\nScanning for MDX files...');
77
+ const mdxFiles = findMdxFiles(projectRoot);
78
+ logger_1.logger.info(` Found ${mdxFiles.length} MDX file(s)`);
79
+ // Check for public assets
80
+ const publicDir = path_1.default.join(projectRoot, 'public');
81
+ if (fs_extra_1.default.existsSync(publicDir)) {
82
+ const publicFiles = await fs_extra_1.default.readdir(publicDir);
83
+ logger_1.logger.success(`✓ public/ directory found (${publicFiles.length} files)`);
84
+ }
85
+ else {
86
+ logger_1.logger.warn('⚠ public/ directory not found (optional)');
87
+ }
88
+ // Summary
89
+ console.log('');
90
+ if (hasErrors) {
91
+ logger_1.logger.error('Check completed with errors');
92
+ process.exit(1);
93
+ }
94
+ else {
95
+ logger_1.logger.success('All checks passed!');
96
+ process.exit(0);
97
+ }
98
+ }
99
+ /**
100
+ * Recursively check pages in navigation (handles nested groups)
101
+ */
102
+ function checkPages(projectRoot, pages, callback) {
103
+ for (const page of pages) {
104
+ if (typeof page === 'string') {
105
+ // Simple page path
106
+ const mdxPath = path_1.default.join(projectRoot, `${page}.mdx`);
107
+ const mdPath = path_1.default.join(projectRoot, `${page}.md`);
108
+ callback(fs_extra_1.default.existsSync(mdxPath) || fs_extra_1.default.existsSync(mdPath), page);
109
+ }
110
+ else if (page.group && page.pages) {
111
+ // Nested group
112
+ checkPages(projectRoot, page.pages, callback);
113
+ }
114
+ else if (page.page) {
115
+ // Page object with explicit page property
116
+ const mdxPath = path_1.default.join(projectRoot, `${page.page}.mdx`);
117
+ const mdPath = path_1.default.join(projectRoot, `${page.page}.md`);
118
+ callback(fs_extra_1.default.existsSync(mdxPath) || fs_extra_1.default.existsSync(mdPath), page.page);
119
+ }
120
+ }
121
+ }
122
+ /**
123
+ * Recursively find all MDX files in a directory
124
+ */
125
+ function findMdxFiles(dir, files = []) {
126
+ const items = fs_extra_1.default.readdirSync(dir);
127
+ for (const item of items) {
128
+ // Skip common directories
129
+ if (['node_modules', 'dist', '.next', '.git'].includes(item)) {
130
+ continue;
131
+ }
132
+ const fullPath = path_1.default.join(dir, item);
133
+ const stat = fs_extra_1.default.statSync(fullPath);
134
+ if (stat.isDirectory()) {
135
+ findMdxFiles(fullPath, files);
136
+ }
137
+ else if (item.endsWith('.mdx') || item.endsWith('.md')) {
138
+ files.push(fullPath);
139
+ }
140
+ }
141
+ return files;
142
+ }
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2NoZWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0Esc0JBNEZDO0FBakdELGdEQUF3QjtBQUN4Qix3REFBMEI7QUFDMUIseUNBQTBEO0FBQzFELCtDQUE0QztBQUVyQyxLQUFLLFVBQVUsS0FBSztJQUN6QixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRXRCLGVBQU0sQ0FBQyxJQUFJLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUVuRCxzQkFBc0I7SUFDdEIsTUFBTSxVQUFVLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdkQsSUFBSSxDQUFDLGtCQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDL0IsZUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUNELGVBQU0sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUVwQywyQkFBMkI7SUFDM0IsSUFBSSxNQUFXLENBQUM7SUFDaEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLE1BQU0sSUFBQSxtQkFBVSxFQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLGVBQU0sQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztRQUNwQixlQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFF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QUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGxvYWRDb25maWcsIHZhbGlkYXRlQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xuICBsZXQgaGFzRXJyb3JzID0gZmFsc2U7XG4gIFxuICBsb2dnZXIuaW5mbygnQ2hlY2tpbmcgZG9jdW1lbnRhdGlvbiBwcm9qZWN0Li4uXFxuJyk7XG4gIFxuICAvLyBDaGVjayBmb3IgZG9jcy5qc29uXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdkb2NzLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgbG9nZ2VyLmVycm9yKCfinJcgZG9jcy5qc29uIG5vdCBmb3VuZCcpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBsb2dnZXIuc3VjY2Vzcygn4pyTIGRvY3MuanNvbiBmb3VuZCcpO1xuICBcbiAgLy8gTG9hZCBhbmQgdmFsaWRhdGUgY29uZmlnXG4gIGxldCBjb25maWc6IGFueTtcbiAgdHJ5IHtcbiAgICBjb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHByb2plY3RSb290KTtcbiAgICBsb2dnZXIuc3VjY2Vzcygn4pyTIGRvY3MuanNvbiBpcyB2YWxpZCBKU09OJyk7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBsb2dnZXIuZXJyb3IoYOKclyBJbnZhbGlkIEpTT04gaW4gZG9jcy5qc29uOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIFxuICAvLyBWYWxpZGF0ZSBjb25maWcgc2NoZW1hXG4gIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZUNvbmZpZyhjb25maWcpO1xuICBpZiAodmFsaWRhdGlvbi52YWxpZCkge1xuICAgIGxvZ2dlci5zdWNjZXNzKCfinJMgZG9jcy5qc29uIHNjaGVtYSBpcyB2YWxpZCcpO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5lcnJvcign4pyXIGRvY3MuanNvbiBzY2hlbWEgdmFsaWRhdGlvbiBmYWlsZWQ6Jyk7XG4gICAgdmFsaWRhdGlvbi5lcnJvcnMuZm9yRWFjaChlcnIgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKGAgIC0gJHtlcnJ9YCk7XG4gICAgfSk7XG4gICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgfVxuICBcbiAgLy8gQ2hlY2sgbmF2aWdhdGlvbiBwYWdlcyBleGlzdFxuICBpZiAoY29uZmlnLm5hdmlnYXRpb24pIHtcbiAgICBsb2dnZXIuaW5mbygnXFxuQ2hlY2tpbmcgbmF2aWdhdGlvbiBwYWdlcy4uLicpO1xuICAgIFxuICAgIC8vIEhhbmRsZSBib3RoIG9sZCBhcnJheSBmb3JtYXQgYW5kIG5ldyB0YWJzIGZvcm1hdFxuICAgIGNvbnN0IGdyb3VwczogYW55W10gPSBbXTtcbiAgICBcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcubmF2aWdhdGlvbikpIHtcbiAgICAgIC8vIE9sZCBmb3JtYXQ6IG5hdmlnYXRpb24gaXMgYW4gYXJyYXkgb2YgZ3JvdXBzXG4gICAgICBncm91cHMucHVzaCguLi5jb25maWcubmF2aWdhdGlvbik7XG4gICAgfSBlbHNlIGlmIChjb25maWcubmF2aWdhdGlvbi50YWJzKSB7XG4gICAgICAvLyBOZXcgZm9ybWF0OiBuYXZpZ2F0aW9uLnRhYnMgY29udGFpbnMgdGFicyB3aXRoIGdyb3Vwc1xuICAgICAgZm9yIChjb25zdCB0YWIgb2YgY29uZmlnLm5hdmlnYXRpb24udGFicykge1xuICAgICAgICBpZiAodGFiLmdyb3Vwcykge1xuICAgICAgICAgIGdyb3Vwcy5wdXNoKC4uLnRhYi5ncm91cHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICBpZiAoZ3JvdXAucGFnZXMpIHtcbiAgICAgICAgY2hlY2tQYWdlcyhwcm9qZWN0Um9vdCwgZ3JvdXAucGFnZXMsIChmb3VuZCwgcGFnZVBhdGgpID0+IHtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIGxvZ2dlci5zdWNjZXNzKGAgIOKckyAke3BhZ2VQYXRofWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYCAg4pyXICR7cGFnZVBhdGh9IC0gZmlsZSBub3QgZm91bmRgKTtcbiAgICAgICAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIC8vIENoZWNrIGZvciBNRFggZmlsZXNcbiAgbG9nZ2VyLmluZm8oJ1xcblNjYW5uaW5nIGZvciBNRFggZmlsZXMuLi4nKTtcbiAgY29uc3QgbWR4RmlsZXMgPSBmaW5kTWR4RmlsZXMocHJvamVjdFJvb3QpO1xuICBsb2dnZXIuaW5mbyhgICBGb3VuZCAke21keEZpbGVzLmxlbmd0aH0gTURYIGZpbGUocylgKTtcbiAgXG4gIC8vIENoZWNrIGZvciBwdWJsaWMgYXNzZXRzXG4gIGNvbnN0IHB1YmxpY0RpciA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ3B1YmxpYycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwdWJsaWNEaXIpKSB7XG4gICAgY29uc3QgcHVibGljRmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHB1YmxpY0Rpcik7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoYOKckyBwdWJsaWMvIGRpcmVjdG9yeSBmb3VuZCAoJHtwdWJsaWNGaWxlcy5sZW5ndGh9IGZpbGVzKWApO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci53YXJuKCfimqAgcHVibGljLyBkaXJlY3Rvcnkgbm90IGZvdW5kIChvcHRpb25hbCknKTtcbiAgfVxuICBcbiAgLy8gU3VtbWFyeVxuICBjb25zb2xlLmxvZygnJyk7XG4gIGlmIChoYXNFcnJvcnMpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ0NoZWNrIGNvbXBsZXRlZCB3aXRoIGVycm9ycycpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuc3VjY2VzcygnQWxsIGNoZWNrcyBwYXNzZWQhJyk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG59XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY2hlY2sgcGFnZXMgaW4gbmF2aWdhdGlvbiAoaGFuZGxlcyBuZXN0ZWQgZ3JvdXBzKVxuICovXG5mdW5jdGlvbiBjaGVja1BhZ2VzKFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLCBcbiAgcGFnZXM6IGFueVtdLCBcbiAgY2FsbGJhY2s6IChmb3VuZDogYm9vbGVhbiwgcGFnZVBhdGg6IHN0cmluZykgPT4gdm9pZFxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykge1xuICAgIGlmICh0eXBlb2YgcGFnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFNpbXBsZSBwYWdlIHBhdGhcbiAgICAgIGNvbnN0IG1keFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsIGAke3BhZ2V9Lm1keGApO1xuICAgICAgY29uc3QgbWRQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCBgJHtwYWdlfS5tZGApO1xuICAgICAgY2FsbGJhY2soZnMuZXhpc3RzU3luYyhtZHhQYXRoKSB8fCBmcy5leGlzdHNTeW5jKG1kUGF0aCksIHBhZ2UpO1xuICAgIH0gZWxzZSBpZiAocGFnZS5ncm91cCAmJiBwYWdlLnBhZ2VzKSB7XG4gICAgICAvLyBOZXN0ZWQgZ3JvdXBcbiAgICAgIGNoZWNrUGFnZXMocHJvamVjdFJvb3QsIHBhZ2UucGFnZXMsIGNhbGxiYWNrKTtcbiAgICB9IGVsc2UgaWYgKHBhZ2UucGFnZSkge1xuICAgICAgLy8gUGFnZSBvYmplY3Qgd2l0aCBleHBsaWNpdCBwYWdlIHByb3BlcnR5XG4gICAgICBjb25zdCBtZHhQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCBgJHtwYWdlLnBhZ2V9Lm1keGApO1xuICAgICAgY29uc3QgbWRQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCBgJHtwYWdlLnBhZ2V9Lm1kYCk7XG4gICAgICBjYWxsYmFjayhmcy5leGlzdHNTeW5jKG1keFBhdGgpIHx8IGZzLmV4aXN0c1N5bmMobWRQYXRoKSwgcGFnZS5wYWdlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBmaW5kIGFsbCBNRFggZmlsZXMgaW4gYSBkaXJlY3RvcnlcbiAqL1xuZnVuY3Rpb24gZmluZE1keEZpbGVzKGRpcjogc3RyaW5nLCBmaWxlczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpO1xuICBcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgLy8gU2tpcCBjb21tb24gZGlyZWN0b3JpZXNcbiAgICBpZiAoWydub2RlX21vZHVsZXMnLCAnZGlzdCcsICcubmV4dCcsICcuZ2l0J10uaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGl0ZW0pO1xuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aCk7XG4gICAgXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgZmluZE1keEZpbGVzKGZ1bGxQYXRoLCBmaWxlcyk7XG4gICAgfSBlbHNlIGlmIChpdGVtLmVuZHNXaXRoKCcubWR4JykgfHwgaXRlbS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgIGZpbGVzLnB1c2goZnVsbFBhdGgpO1xuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIGZpbGVzO1xufVxuIl19
@@ -0,0 +1,24 @@
1
+ declare const TEMPLATES: {
2
+ readonly basic: {
3
+ readonly name: "Basic";
4
+ readonly description: "Simple documentation site with guides and pages";
5
+ };
6
+ readonly openapi: {
7
+ readonly name: "OpenAPI";
8
+ readonly description: "Documentation with REST API reference (OpenAPI/Swagger)";
9
+ };
10
+ readonly graphql: {
11
+ readonly name: "GraphQL";
12
+ readonly description: "Documentation with GraphQL API playground";
13
+ };
14
+ };
15
+ type TemplateType = keyof typeof TEMPLATES;
16
+ interface CreateOptions {
17
+ template?: TemplateType;
18
+ git?: boolean;
19
+ install?: boolean;
20
+ url?: string;
21
+ subdomain?: string;
22
+ }
23
+ export declare function create(projectDirectory: string | undefined, options: CreateOptions): Promise<void>;
24
+ export {};
@@ -0,0 +1,387 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.create = create;
40
+ const child_process_1 = require("child_process");
41
+ const path_1 = __importDefault(require("path"));
42
+ const fs_extra_1 = __importDefault(require("fs-extra"));
43
+ const logger_1 = require("../../utils/logger");
44
+ const constants_1 = require("../../constants");
45
+ // Available templates
46
+ const TEMPLATES = {
47
+ basic: {
48
+ name: 'Basic',
49
+ description: 'Simple documentation site with guides and pages',
50
+ },
51
+ openapi: {
52
+ name: 'OpenAPI',
53
+ description: 'Documentation with REST API reference (OpenAPI/Swagger)',
54
+ },
55
+ graphql: {
56
+ name: 'GraphQL',
57
+ description: 'Documentation with GraphQL API playground',
58
+ },
59
+ };
60
+ // Simple prompt helper using readline
61
+ async function prompt(question, defaultValue) {
62
+ const readline = await Promise.resolve().then(() => __importStar(require('readline')));
63
+ const rl = readline.createInterface({
64
+ input: process.stdin,
65
+ output: process.stdout,
66
+ });
67
+ return new Promise((resolve) => {
68
+ const displayQuestion = defaultValue
69
+ ? `${question} (${defaultValue}): `
70
+ : `${question}: `;
71
+ rl.question(displayQuestion, (answer) => {
72
+ rl.close();
73
+ resolve(answer.trim() || defaultValue || '');
74
+ });
75
+ });
76
+ }
77
+ async function promptSelect(question, choices) {
78
+ console.log(`\n${question}\n`);
79
+ choices.forEach((choice, i) => {
80
+ console.log(` ${i + 1}. ${choice.label}`);
81
+ });
82
+ console.log();
83
+ const readline = await Promise.resolve().then(() => __importStar(require('readline')));
84
+ const rl = readline.createInterface({
85
+ input: process.stdin,
86
+ output: process.stdout,
87
+ });
88
+ return new Promise((resolve) => {
89
+ rl.question('Enter number: ', (answer) => {
90
+ rl.close();
91
+ const index = parseInt(answer.trim(), 10) - 1;
92
+ if (index >= 0 && index < choices.length) {
93
+ resolve(choices[index].value);
94
+ }
95
+ else {
96
+ // Default to first choice
97
+ resolve(choices[0].value);
98
+ }
99
+ });
100
+ });
101
+ }
102
+ async function promptConfirm(question, defaultValue = false) {
103
+ const readline = await Promise.resolve().then(() => __importStar(require('readline')));
104
+ const rl = readline.createInterface({
105
+ input: process.stdin,
106
+ output: process.stdout,
107
+ });
108
+ return new Promise((resolve) => {
109
+ const hint = defaultValue ? '[Y/n]' : '[y/N]';
110
+ rl.question(`${question} ${hint}: `, (answer) => {
111
+ rl.close();
112
+ const normalized = answer.trim().toLowerCase();
113
+ if (normalized === '') {
114
+ resolve(defaultValue);
115
+ }
116
+ else {
117
+ resolve(normalized === 'y' || normalized === 'yes');
118
+ }
119
+ });
120
+ });
121
+ }
122
+ function validateProjectName(name) {
123
+ if (!name) {
124
+ return { valid: false, error: 'Project name is required' };
125
+ }
126
+ // Check for valid npm package name
127
+ if (!/^[a-z0-9][a-z0-9-._]*$/i.test(name)) {
128
+ return { valid: false, error: 'Invalid project name. Use lowercase letters, numbers, and dashes.' };
129
+ }
130
+ return { valid: true };
131
+ }
132
+ /**
133
+ * Basic subdomain format validation (server does full validation including blacklist)
134
+ */
135
+ function isValidSubdomainFormat(subdomain) {
136
+ if (!subdomain) {
137
+ return { valid: false, error: 'Subdomain is required' };
138
+ }
139
+ if (subdomain.length < 3) {
140
+ return { valid: false, error: 'Subdomain must be at least 3 characters' };
141
+ }
142
+ if (subdomain.length > 63) {
143
+ return { valid: false, error: 'Subdomain must be 63 characters or less' };
144
+ }
145
+ if (!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/.test(subdomain)) {
146
+ return { valid: false, error: 'Subdomain must start and end with alphanumeric, can contain hyphens' };
147
+ }
148
+ if (/--/.test(subdomain)) {
149
+ return { valid: false, error: 'Subdomain cannot contain consecutive hyphens' };
150
+ }
151
+ return { valid: true };
152
+ }
153
+ /**
154
+ * Check subdomain availability via API (also validates against server blacklist)
155
+ */
156
+ async function checkSubdomainAvailability(subdomain, apiUrl) {
157
+ try {
158
+ const response = await fetch(`${apiUrl}/api/subdomains/check`, {
159
+ method: 'POST',
160
+ headers: {
161
+ 'Content-Type': 'application/json',
162
+ },
163
+ body: JSON.stringify({ subdomain }),
164
+ });
165
+ const result = await response.json();
166
+ return result;
167
+ }
168
+ catch {
169
+ // If API is unavailable, allow proceeding (will fail at registration if invalid)
170
+ return { available: true };
171
+ }
172
+ }
173
+ function formatProjectName(name) {
174
+ return name
175
+ .replace(/-/g, ' ')
176
+ .replace(/\b\w/g, (char) => char.toUpperCase());
177
+ }
178
+ function getPackageManager() {
179
+ const userAgent = process.env.npm_config_user_agent || '';
180
+ if (userAgent.startsWith('yarn')) {
181
+ return 'yarn';
182
+ }
183
+ if (userAgent.startsWith('pnpm')) {
184
+ return 'pnpm';
185
+ }
186
+ return 'npm';
187
+ }
188
+ async function create(projectDirectory, options) {
189
+ console.log();
190
+ logger_1.logger.info('🐟 Create DevDoc Doc');
191
+ console.log();
192
+ const apiUrl = options.url || process.env.DEVDOC_API_URL || constants_1.DEFAULT_API_URL;
193
+ // Get project name if not provided
194
+ let projectPath = projectDirectory;
195
+ if (!projectPath) {
196
+ projectPath = await prompt('What is your project named?', 'my-docs');
197
+ if (!projectPath) {
198
+ logger_1.logger.error('Project name is required');
199
+ process.exit(1);
200
+ }
201
+ }
202
+ // Validate project name
203
+ const validation = validateProjectName(projectPath);
204
+ if (!validation.valid) {
205
+ logger_1.logger.error(validation.error || 'Invalid project name');
206
+ process.exit(1);
207
+ }
208
+ // Get template selection if not provided
209
+ let template = options.template || 'basic';
210
+ if (!options.template) {
211
+ const templateChoices = Object.entries(TEMPLATES).map(([key, value]) => ({
212
+ value: key,
213
+ label: `${value.name} - ${value.description}`,
214
+ }));
215
+ template = await promptSelect('Which template would you like to use?', templateChoices);
216
+ }
217
+ // Resolve full path
218
+ const resolvedPath = path_1.default.resolve(projectPath);
219
+ const projectName = path_1.default.basename(resolvedPath);
220
+ const slug = projectName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
221
+ // Get subdomain - prompt if not provided
222
+ let subdomain = options.subdomain;
223
+ if (!subdomain) {
224
+ console.log();
225
+ subdomain = await prompt(`Enter subdomain for your docs (${slug}.devdoc.sh)`, slug);
226
+ subdomain = subdomain.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/^-|-$/g, '');
227
+ }
228
+ // Validate subdomain format locally
229
+ const formatCheck = isValidSubdomainFormat(subdomain);
230
+ if (!formatCheck.valid) {
231
+ logger_1.logger.error(formatCheck.error);
232
+ process.exit(1);
233
+ }
234
+ // Check subdomain availability via API (server validates blacklist)
235
+ logger_1.logger.info(`Checking if ${subdomain}.devdoc.sh is available...`);
236
+ const availability = await checkSubdomainAvailability(subdomain, apiUrl);
237
+ if (!availability.available) {
238
+ logger_1.logger.error(availability.error || `Subdomain "${subdomain}" is not available`);
239
+ if (availability.suggestion) {
240
+ logger_1.logger.info(`Suggestion: Try "${availability.suggestion}"`);
241
+ }
242
+ process.exit(1);
243
+ }
244
+ logger_1.logger.success(`✓ ${subdomain}.devdoc.sh is available!`);
245
+ // Check if directory exists
246
+ if (fs_extra_1.default.existsSync(resolvedPath)) {
247
+ const files = fs_extra_1.default.readdirSync(resolvedPath);
248
+ if (files.length > 0) {
249
+ const overwrite = await promptConfirm(`Directory ${projectName} is not empty. Continue anyway?`, false);
250
+ if (!overwrite) {
251
+ logger_1.logger.error('Operation cancelled');
252
+ process.exit(1);
253
+ }
254
+ }
255
+ }
256
+ const selectedTemplate = TEMPLATES[template];
257
+ console.log();
258
+ logger_1.logger.info(`Creating a new ${selectedTemplate.name} DevDoc documentation site in ${resolvedPath}`);
259
+ console.log();
260
+ // Create project directory
261
+ fs_extra_1.default.ensureDirSync(resolvedPath);
262
+ // Copy template
263
+ const templateDir = path_1.default.join(__dirname, '..', '..', '..', 'templates', template);
264
+ if (!fs_extra_1.default.existsSync(templateDir)) {
265
+ logger_1.logger.error(`Template "${template}" not found`);
266
+ logger_1.logger.debug(`Looked for template at: ${templateDir}`);
267
+ process.exit(1);
268
+ }
269
+ logger_1.logger.info('Copying template files...');
270
+ fs_extra_1.default.copySync(templateDir, resolvedPath, { overwrite: true });
271
+ // Update package.json with project name
272
+ const pkgPath = path_1.default.join(resolvedPath, 'package.json');
273
+ if (fs_extra_1.default.existsSync(pkgPath)) {
274
+ const pkg = fs_extra_1.default.readJsonSync(pkgPath);
275
+ pkg.name = projectName;
276
+ fs_extra_1.default.writeJsonSync(pkgPath, pkg, { spaces: 2 });
277
+ }
278
+ // Update docs.json with project name
279
+ const docsPath = path_1.default.join(resolvedPath, 'docs.json');
280
+ if (fs_extra_1.default.existsSync(docsPath)) {
281
+ const docs = fs_extra_1.default.readJsonSync(docsPath);
282
+ docs.name = formatProjectName(projectName);
283
+ fs_extra_1.default.writeJsonSync(docsPath, docs, { spaces: 2 });
284
+ }
285
+ // Register project with Brainfish API and create .devdoc.json
286
+ const devdocConfigPath = path_1.default.join(resolvedPath, '.devdoc.json');
287
+ logger_1.logger.info('Registering project with Brainfish...');
288
+ try {
289
+ const response = await fetch(`${apiUrl}/api/projects/register`, {
290
+ method: 'POST',
291
+ headers: {
292
+ 'Content-Type': 'application/json',
293
+ },
294
+ body: JSON.stringify({
295
+ name: formatProjectName(projectName),
296
+ slug,
297
+ subdomain,
298
+ }),
299
+ });
300
+ if (!response.ok) {
301
+ const errorData = await response.json().catch(() => ({ error: 'Unknown error' }));
302
+ throw new Error(errorData.error || `HTTP ${response.status}`);
303
+ }
304
+ const result = await response.json();
305
+ const devdocConfig = {
306
+ projectId: result.projectId,
307
+ name: formatProjectName(projectName),
308
+ slug: result.slug,
309
+ subdomain: result.subdomain,
310
+ apiKey: result.apiKey,
311
+ createdAt: new Date().toISOString(),
312
+ };
313
+ fs_extra_1.default.writeJsonSync(devdocConfigPath, devdocConfig, { spaces: 2 });
314
+ logger_1.logger.success('Project registered - API key saved to .devdoc.json');
315
+ console.log();
316
+ console.log(' URL:', `https://${result.subdomain}.devdoc.sh`);
317
+ console.log(' API Key:', result.apiKey);
318
+ }
319
+ catch (error) {
320
+ const message = error instanceof Error ? error.message : String(error);
321
+ logger_1.logger.warn(`Could not register project: ${message}`);
322
+ logger_1.logger.info('Creating local config - run "devdoc init" when online to register');
323
+ const devdocConfig = {
324
+ projectId: `${slug}-${Math.random().toString(36).substring(2, 8)}`,
325
+ name: formatProjectName(projectName),
326
+ slug: slug,
327
+ subdomain: subdomain,
328
+ createdAt: new Date().toISOString(),
329
+ };
330
+ fs_extra_1.default.writeJsonSync(devdocConfigPath, devdocConfig, { spaces: 2 });
331
+ logger_1.logger.success('Created .devdoc.json (offline mode)');
332
+ }
333
+ // Initialize git
334
+ if (options.git !== false) {
335
+ logger_1.logger.info('Initializing git repository...');
336
+ try {
337
+ (0, child_process_1.execSync)('git init', { cwd: resolvedPath, stdio: 'ignore' });
338
+ (0, child_process_1.execSync)('git add -A', { cwd: resolvedPath, stdio: 'ignore' });
339
+ (0, child_process_1.execSync)('git commit -m "Initial commit from devdoc create"', {
340
+ cwd: resolvedPath,
341
+ stdio: 'ignore',
342
+ });
343
+ logger_1.logger.success('Git repository initialized');
344
+ }
345
+ catch {
346
+ logger_1.logger.warn('Could not initialize git repository');
347
+ }
348
+ }
349
+ // Install dependencies
350
+ if (options.install !== false) {
351
+ logger_1.logger.info('Installing dependencies...');
352
+ try {
353
+ const packageManager = getPackageManager();
354
+ (0, child_process_1.execSync)(`${packageManager} install`, {
355
+ cwd: resolvedPath,
356
+ stdio: 'inherit',
357
+ });
358
+ logger_1.logger.success('Dependencies installed');
359
+ }
360
+ catch {
361
+ logger_1.logger.warn('Could not install dependencies');
362
+ }
363
+ }
364
+ // Success message
365
+ console.log();
366
+ logger_1.logger.success(`Created ${projectName} at ${resolvedPath}`);
367
+ console.log();
368
+ console.log('Your docs will be available at:');
369
+ console.log(` https://${subdomain}.devdoc.sh`);
370
+ console.log();
371
+ console.log('Inside that directory, you can run several commands:');
372
+ console.log();
373
+ console.log(' npm run dev');
374
+ console.log(' Starts the development server.');
375
+ console.log();
376
+ console.log(' devdoc deploy');
377
+ console.log(' Deploys your documentation to Brainfish.');
378
+ console.log();
379
+ console.log('We suggest that you begin by typing:');
380
+ console.log();
381
+ console.log(` cd ${projectName}`);
382
+ console.log(' npm run dev');
383
+ console.log();
384
+ console.log('Happy documenting! 📚');
385
+ console.log();
386
+ }
387
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9jcmVhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxTUEsd0JBc09DO0FBM2FELGlEQUF5QztBQUN6QyxnREFBd0I7QUFDeEIsd0RBQTBCO0FBQzFCLCtDQUE0QztBQUM1QywrQ0FBa0Q7QUFFbEQsc0JBQXNCO0FBQ3RCLE1BQU0sU0FBUyxHQUFHO0lBQ2hCLEtBQUssRUFBRTtRQUNMLElBQUksRUFBRSxPQUFPO1FBQ2IsV0FBVyxFQUFFLGlEQUFpRDtLQUMvRDtJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLHlEQUF5RDtLQUN2RTtJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLDJDQUEyQztLQUN6RDtDQUNPLENBQUM7QUF5Qlgsc0NBQXNDO0FBQ3RDLEtBQUssVUFBVSxNQUFNLENBQUMsUUFBZ0IsRUFBRSxZQUFxQjtJQUMzRCxNQUFNLFFBQVEsR0FBRyx3REFBYSxVQUFVLEdBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sZUFBZSxHQUFHLFlBQVk7WUFDbEMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxLQUFLLFlBQVksS0FBSztZQUNuQyxDQUFDLENBQUMsR0FBRyxRQUFRLElBQUksQ0FBQztRQUVwQixFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3RDLEVB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LEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDNUQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ3BELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDN0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBERUZBVUxUX0FQSV9VUkwgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuXG4vLyBBdmFpbGFibGUgdGVtcGxhdGVzXG5jb25zdCBURU1QTEFURVMgPSB7XG4gIGJhc2ljOiB7XG4gICAgbmFtZTogJ0Jhc2ljJyxcbiAgICBkZXNjcmlwdGlvbjogJ1NpbXBsZSBkb2N1bWVudGF0aW9uIHNpdGUgd2l0aCBndWlkZXMgYW5kIHBhZ2VzJyxcbiAgfSxcbiAgb3BlbmFwaToge1xuICAgIG5hbWU6ICdPcGVuQVBJJyxcbiAgICBkZXNjcmlwdGlvbjogJ0RvY3VtZW50YXRpb24gd2l0aCBSRVNUIEFQSSByZWZlcmVuY2UgKE9wZW5BUEkvU3dhZ2dlciknLFxuICB9LFxuICBncmFwaHFsOiB7XG4gICAgbmFtZTogJ0dyYXBoUUwnLFxuICAgIGRlc2NyaXB0aW9uOiAnRG9jdW1lbnRhdGlvbiB3aXRoIEdyYXBoUUwgQVBJIHBsYXlncm91bmQnLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBUZW1wbGF0ZVR5cGUgPSBrZXlvZiB0eXBlb2YgVEVNUExBVEVTO1xuXG5pbnRlcmZhY2UgQ3JlYXRlT3B0aW9ucyB7XG4gIHRlbXBsYXRlPzogVGVtcGxhdGVUeXBlO1xuICBnaXQ/OiBib29sZWFuO1xuICBpbnN0YWxsPzogYm9vbGVhbjtcbiAgdXJsPzogc3RyaW5nO1xuICBzdWJkb21haW4/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSZWdpc3RlclJlc3BvbnNlIHtcbiAgcHJvamVjdElkOiBzdHJpbmc7XG4gIHNsdWc6IHN0cmluZztcbiAgc3ViZG9tYWluOiBzdHJpbmc7XG4gIGFwaUtleTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hlY2tTdWJkb21haW5SZXNwb25zZSB7XG4gIGF2YWlsYWJsZTogYm9vbGVhbjtcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIHN1Z2dlc3Rpb24/OiBzdHJpbmc7XG59XG5cbi8vIFNpbXBsZSBwcm9tcHQgaGVscGVyIHVzaW5nIHJlYWRsaW5lXG5hc3luYyBmdW5jdGlvbiBwcm9tcHQocXVlc3Rpb246IHN0cmluZywgZGVmYXVsdFZhbHVlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVhZGxpbmUgPSBhd2FpdCBpbXBvcnQoJ3JlYWRsaW5lJyk7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBkaXNwbGF5UXVlc3Rpb24gPSBkZWZhdWx0VmFsdWUgXG4gICAgICA/IGAke3F1ZXN0aW9ufSAoJHtkZWZhdWx0VmFsdWV9KTogYFxuICAgICAgOiBgJHtxdWVzdGlvbn06IGA7XG4gICAgXG4gICAgcmwucXVlc3Rpb24oZGlzcGxheVF1ZXN0aW9uLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpIHx8IGRlZmF1bHRWYWx1ZSB8fCAnJyk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRTZWxlY3QocXVlc3Rpb246IHN0cmluZywgY2hvaWNlczogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnNvbGUubG9nKGBcXG4ke3F1ZXN0aW9ufVxcbmApO1xuICBjaG9pY2VzLmZvckVhY2goKGNob2ljZSwgaSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGAgICR7aSArIDF9LiAke2Nob2ljZS5sYWJlbH1gKTtcbiAgfSk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIFxuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHJsLnF1ZXN0aW9uKCdFbnRlciBudW1iZXI6ICcsIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGFuc3dlci50cmltKCksIDEwKSAtIDE7XG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICAgIHJlc29sdmUoY2hvaWNlc1tpbmRleF0udmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0byBmaXJzdCBjaG9pY2VcbiAgICAgICAgcmVzb2x2ZShjaG9pY2VzWzBdLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb21wdENvbmZpcm0ocXVlc3Rpb246IHN0cmluZywgZGVmYXVsdFZhbHVlID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcmVhZGxpbmUgPSBhd2FpdCBpbXBvcnQoJ3JlYWRsaW5lJyk7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBoaW50ID0gZGVmYXVsdFZhbHVlID8gJ1tZL25dJyA6ICdbeS9OXSc7XG4gICAgcmwucXVlc3Rpb24oYCR7cXVlc3Rpb259ICR7aGludH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gYW5zd2VyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWQgPT09ICcnKSB7XG4gICAgICAgIHJlc29sdmUoZGVmYXVsdFZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUobm9ybWFsaXplZCA9PT0gJ3knIHx8IG5vcm1hbGl6ZWQgPT09ICd5ZXMnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvamVjdE5hbWUobmFtZTogc3RyaW5nKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gIGlmICghbmFtZSkge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdQcm9qZWN0IG5hbWUgaXMgcmVxdWlyZWQnIH07XG4gIH1cbiAgXG4gIC8vIENoZWNrIGZvciB2YWxpZCBucG0gcGFja2FnZSBuYW1lXG4gIGlmICghL15bYS16MC05XVthLXowLTktLl9dKiQvaS50ZXN0KG5hbWUpKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ0ludmFsaWQgcHJvamVjdCBuYW1lLiBVc2UgbG93ZXJjYXNlIGxldHRlcnMsIG51bWJlcnMsIGFuZCBkYXNoZXMuJyB9O1xuICB9XG4gIFxuICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xufVxuXG4vKipcbiAqIEJhc2ljIHN1YmRvbWFpbiBmb3JtYXQgdmFsaWRhdGlvbiAoc2VydmVyIGRvZXMgZnVsbCB2YWxpZGF0aW9uIGluY2x1ZGluZyBibGFja2xpc3QpXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTdWJkb21haW5Gb3JtYXQoc3ViZG9tYWluOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgaWYgKCFzdWJkb21haW4pIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIGlzIHJlcXVpcmVkJyB9O1xuICB9XG4gIFxuICBpZiAoc3ViZG9tYWluLmxlbmd0aCA8IDMpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAnU3ViZG9tYWluIG11c3QgYmUgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzJyB9O1xuICB9XG4gIFxuICBpZiAoc3ViZG9tYWluLmxlbmd0aCA+IDYzKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBtdXN0IGJlIDYzIGNoYXJhY3RlcnMgb3IgbGVzcycgfTtcbiAgfVxuICBcbiAgaWYgKCEvXlthLXowLTldKFthLXowLTktXSpbYS16MC05XSk/JC8udGVzdChzdWJkb21haW4pKSB7XG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ1N1YmRvbWFpbiBtdXN0IHN0YXJ0IGFuZCBlbmQgd2l0aCBhbHBoYW51bWVyaWMsIGNhbiBjb250YWluIGh5cGhlbnMnIH07XG4gIH1cbiAgXG4gIGlmICgvLS0vLnRlc3Qoc3ViZG9tYWluKSkge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJkb21haW4gY2Fubm90IGNvbnRhaW4gY29uc2VjdXRpdmUgaHlwaGVucycgfTtcbiAgfVxuICBcbiAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBDaGVjayBzdWJkb21haW4gYXZhaWxhYmlsaXR5IHZpYSBBUEkgKGFsc28gdmFsaWRhdGVzIGFnYWluc3Qgc2VydmVyIGJsYWNrbGlzdClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tTdWJkb21haW5BdmFpbGFiaWxpdHkoXG4gIHN1YmRvbWFpbjogc3RyaW5nLFxuICBhcGlVcmw6IHN0cmluZ1xuKTogUHJvbWlzZTxDaGVja1N1YmRvbWFpblJlc3BvbnNlPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHthcGlVcmx9L2FwaS9zdWJkb21haW5zL2NoZWNrYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzdWJkb21haW4gfSksXG4gICAgfSk7XG4gICAgXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENoZWNrU3ViZG9tYWluUmVzcG9uc2U7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgQVBJIGlzIHVuYXZhaWxhYmxlLCBhbGxvdyBwcm9jZWVkaW5nICh3aWxsIGZhaWwgYXQgcmVnaXN0cmF0aW9uIGlmIGludmFsaWQpXG4gICAgcmV0dXJuIHsgYXZhaWxhYmxlOiB0cnVlIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0UHJvamVjdE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWVcbiAgICAucmVwbGFjZSgvLS9nLCAnICcpXG4gICAgLnJlcGxhY2UoL1xcYlxcdy9nLCAoY2hhcikgPT4gY2hhci50b1VwcGVyQ2FzZSgpKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2FnZU1hbmFnZXIoKTogc3RyaW5nIHtcbiAgY29uc3QgdXNlckFnZW50ID0gcHJvY2Vzcy5lbnYubnBtX2NvbmZpZ191c2VyX2FnZW50IHx8ICcnO1xuICBcbiAgaWYgKHVzZXJBZ2VudC5zdGFydHNXaXRoKCd5YXJuJykpIHtcbiAgICByZXR1cm4gJ3lhcm4nO1xuICB9XG4gIFxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoJ3BucG0nKSkge1xuICAgIHJldHVybiAncG5wbSc7XG4gIH1cbiAgXG4gIHJldHVybiAnbnBtJztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZShwcm9qZWN0RGlyZWN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9wdGlvbnM6IENyZWF0ZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc29sZS5sb2coKTtcbiAgbG9nZ2VyLmluZm8oJ/CfkJ8gQ3JlYXRlIERldkRvYyBEb2MnKTtcbiAgY29uc29sZS5sb2coKTtcblxuICBjb25zdCBhcGlVcmwgPSBvcHRpb25zLnVybCB8fCBwcm9jZXNzLmVudi5ERVZET0NfQVBJX1VSTCB8fCBERUZBVUxUX0FQSV9VUkw7XG5cbiAgLy8gR2V0IHByb2plY3QgbmFtZSBpZiBub3QgcHJvdmlkZWRcbiAgbGV0IHByb2plY3RQYXRoID0gcHJvamVjdERpcmVjdG9yeTtcblxuICBpZiAoIXByb2plY3RQYXRoKSB7XG4gICAgcHJvamVjdFBhdGggPSBhd2FpdCBwcm9tcHQoJ1doYXQgaXMgeW91ciBwcm9qZWN0IG5hbWVkPycsICdteS1kb2NzJyk7XG4gICAgXG4gICAgaWYgKCFwcm9qZWN0UGF0aCkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdQcm9qZWN0IG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBwcm9qZWN0IG5hbWVcbiAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlUHJvamVjdE5hbWUocHJvamVjdFBhdGgpO1xuICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICBsb2dnZXIuZXJyb3IodmFsaWRhdGlvbi5lcnJvciB8fCAnSW52YWxpZCBwcm9qZWN0IG5hbWUnKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyBHZXQgdGVtcGxhdGUgc2VsZWN0aW9uIGlmIG5vdCBwcm92aWRlZFxuICBsZXQgdGVtcGxhdGU6IFRlbXBsYXRlVHlwZSA9IG9wdGlvbnMudGVtcGxhdGUgfHwgJ2Jhc2ljJztcbiAgXG4gIGlmICghb3B0aW9ucy50ZW1wbGF0ZSkge1xuICAgIGNvbnN0IHRlbXBsYXRlQ2hvaWNlcyA9IE9iamVjdC5lbnRyaWVzKFRFTVBMQVRFUykubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICB2YWx1ZToga2V5LFxuICAgICAgbGFiZWw6IGAke3ZhbHVlLm5hbWV9IC0gJHt2YWx1ZS5kZXNjcmlwdGlvbn1gLFxuICAgIH0pKTtcblxuICAgIHRlbXBsYXRlID0gYXdhaXQgcHJvbXB0U2VsZWN0KCdXaGljaCB0ZW1wbGF0ZSB3b3VsZCB5b3UgbGlrZSB0byB1c2U/JywgdGVtcGxhdGVDaG9pY2VzKSBhcyBUZW1wbGF0ZVR5cGU7XG4gIH1cblxuICAvLyBSZXNvbHZlIGZ1bGwgcGF0aFxuICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdFBhdGgpO1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IHBhdGguYmFzZW5hbWUocmVzb2x2ZWRQYXRoKTtcbiAgY29uc3Qgc2x1ZyA9IHByb2plY3ROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tfC0kL2csICcnKTtcblxuICAvLyBHZXQgc3ViZG9tYWluIC0gcHJvbXB0IGlmIG5vdCBwcm92aWRlZFxuICBsZXQgc3ViZG9tYWluID0gb3B0aW9ucy5zdWJkb21haW47XG4gIFxuICBpZiAoIXN1YmRvbWFpbikge1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgc3ViZG9tYWluID0gYXdhaXQgcHJvbXB0KGBFbnRlciBzdWJkb21haW4gZm9yIHlvdXIgZG9jcyAoJHtzbHVnfS5kZXZkb2Muc2gpYCwgc2x1Zyk7XG4gICAgc3ViZG9tYWluID0gc3ViZG9tYWluLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpLnJlcGxhY2UoL14tfC0kL2csICcnKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHN1YmRvbWFpbiBmb3JtYXQgbG9jYWxseVxuICBjb25zdCBmb3JtYXRDaGVjayA9IGlzVmFsaWRTdWJkb21haW5Gb3JtYXQoc3ViZG9tYWluKTtcbiAgaWYgKCFmb3JtYXRDaGVjay52YWxpZCkge1xuICAgIGxvZ2dlci5lcnJvcihmb3JtYXRDaGVjay5lcnJvciEpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIENoZWNrIHN1YmRvbWFpbiBhdmFpbGFiaWxpdHkgdmlhIEFQSSAoc2VydmVyIHZhbGlkYXRlcyBibGFja2xpc3QpXG4gIGxvZ2dlci5pbmZvKGBDaGVja2luZyBpZiAke3N1YmRvbWFpbn0uZGV2ZG9jLnNoIGlzIGF2YWlsYWJsZS4uLmApO1xuICBjb25zdCBhdmFpbGFiaWxpdHkgPSBhd2FpdCBjaGVja1N1YmRvbWFpbkF2YWlsYWJpbGl0eShzdWJkb21haW4sIGFwaVVybCk7XG4gIFxuICBpZiAoIWF2YWlsYWJpbGl0eS5hdmFpbGFibGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoYXZhaWxhYmlsaXR5LmVycm9yIHx8IGBTdWJkb21haW4gXCIke3N1YmRvbWFpbn1cIiBpcyBub3QgYXZhaWxhYmxlYCk7XG4gICAgaWYgKGF2YWlsYWJpbGl0eS5zdWdnZXN0aW9uKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgU3VnZ2VzdGlvbjogVHJ5IFwiJHthdmFpbGFiaWxpdHkuc3VnZ2VzdGlvbn1cImApO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgXG4gIGxvZ2dlci5zdWNjZXNzKGDinJMgJHtzdWJkb21haW59LmRldmRvYy5zaCBpcyBhdmFpbGFibGUhYCk7XG5cbiAgLy8gQ2hlY2sgaWYgZGlyZWN0b3J5IGV4aXN0c1xuICBpZiAoZnMuZXhpc3RzU3luYyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhyZXNvbHZlZFBhdGgpO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvdmVyd3JpdGUgPSBhd2FpdCBwcm9tcHRDb25maXJtKGBEaXJlY3RvcnkgJHtwcm9qZWN0TmFtZX0gaXMgbm90IGVtcHR5LiBDb250aW51ZSBhbnl3YXk/YCwgZmFsc2UpO1xuICAgICAgXG4gICAgICBpZiAoIW92ZXJ3cml0ZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ09wZXJhdGlvbiBjYW5jZWxsZWQnKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlbGVjdGVkVGVtcGxhdGUgPSBURU1QTEFURVNbdGVtcGxhdGVdO1xuICBjb25zb2xlLmxvZygpO1xuICBsb2dnZXIuaW5mbyhgQ3JlYXRpbmcgYSBuZXcgJHtzZWxlY3RlZFRlbXBsYXRlLm5hbWV9IERldkRvYyBkb2N1bWVudGF0aW9uIHNpdGUgaW4gJHtyZXNvbHZlZFBhdGh9YCk7XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgLy8gQ3JlYXRlIHByb2plY3QgZGlyZWN0b3J5XG4gIGZzLmVuc3VyZURpclN5bmMocmVzb2x2ZWRQYXRoKTtcblxuICAvLyBDb3B5IHRlbXBsYXRlXG4gIGNvbnN0IHRlbXBsYXRlRGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJ3RlbXBsYXRlcycsIHRlbXBsYXRlKTtcbiAgXG4gIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZURpcikpIHtcbiAgICBsb2dnZXIuZXJyb3IoYFRlbXBsYXRlIFwiJHt0ZW1wbGF0ZX1cIiBub3QgZm91bmRgKTtcbiAgICBsb2dnZXIuZGVidWcoYExvb2tlZCBmb3IgdGVtcGxhdGUgYXQ6ICR7dGVtcGxhdGVEaXJ9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgbG9nZ2VyLmluZm8oJ0NvcHlpbmcgdGVtcGxhdGUgZmlsZXMuLi4nKTtcbiAgZnMuY29weVN5bmModGVtcGxhdGVEaXIsIHJlc29sdmVkUGF0aCwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG5cbiAgLy8gVXBkYXRlIHBhY2thZ2UuanNvbiB3aXRoIHByb2plY3QgbmFtZVxuICBjb25zdCBwa2dQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwa2dQYXRoKSkge1xuICAgIGNvbnN0IHBrZyA9IGZzLnJlYWRKc29uU3luYyhwa2dQYXRoKTtcbiAgICBwa2cubmFtZSA9IHByb2plY3ROYW1lO1xuICAgIGZzLndyaXRlSnNvblN5bmMocGtnUGF0aCwgcGtnLCB7IHNwYWNlczogMiB9KTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBkb2NzLmpzb24gd2l0aCBwcm9qZWN0IG5hbWVcbiAgY29uc3QgZG9jc1BhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRQYXRoLCAnZG9jcy5qc29uJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGRvY3NQYXRoKSkge1xuICAgIGNvbnN0IGRvY3MgPSBmcy5yZWFkSnNvblN5bmMoZG9jc1BhdGgpO1xuICAgIGRvY3MubmFtZSA9IGZvcm1hdFByb2plY3ROYW1lKHByb2plY3ROYW1lKTtcbiAgICBmcy53cml0ZUpzb25TeW5jKGRvY3NQYXRoLCBkb2NzLCB7IHNwYWNlczogMiB9KTtcbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHByb2plY3Qgd2l0aCBCcmFpbmZpc2ggQVBJIGFuZCBjcmVhdGUgLmRldmRvYy5qc29uXG4gIGNvbnN0IGRldmRvY0NvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRQYXRoLCAnLmRldmRvYy5qc29uJyk7XG4gIFxuICBsb2dnZXIuaW5mbygnUmVnaXN0ZXJpbmcgcHJvamVjdCB3aXRoIEJyYWluZmlzaC4uLicpO1xuICBcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vYXBpL3Byb2plY3RzL3JlZ2lzdGVyYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiBmb3JtYXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSksXG4gICAgICAgIHNsdWcsXG4gICAgICAgIHN1YmRvbWFpbixcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIFxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoeyBlcnJvcjogJ1Vua25vd24gZXJyb3InIH0pKSBhcyB7IGVycm9yPzogc3RyaW5nIH07XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JEYXRhLmVycm9yIHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgUmVnaXN0ZXJSZXNwb25zZTtcbiAgICBcbiAgICBjb25zdCBkZXZkb2NDb25maWcgPSB7XG4gICAgICBwcm9qZWN0SWQ6IHJlc3VsdC5wcm9qZWN0SWQsXG4gICAgICBuYW1lOiBmb3JtYXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSksXG4gICAgICBzbHVnOiByZXN1bHQuc2x1ZyxcbiAgICAgIHN1YmRvbWFpbjogcmVzdWx0LnN1YmRvbWFpbixcbiAgICAgIGFwaUtleTogcmVzdWx0LmFwaUtleSxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG4gICAgZnMud3JpdGVKc29uU3luYyhkZXZkb2NDb25maWdQYXRoLCBkZXZkb2NDb25maWcsIHsgc3BhY2VzOiAyIH0pO1xuICAgIGxvZ2dlci5zdWNjZXNzKCdQcm9qZWN0IHJlZ2lzdGVyZWQgLSBBUEkga2V5IHNhdmVkIHRvIC5kZXZkb2MuanNvbicpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coJyAgVVJMOicsIGBodHRwczovLyR7cmVzdWx0LnN1YmRvbWFpbn0uZGV2ZG9jLnNoYCk7XG4gICAgY29uc29sZS5sb2coJyAgQVBJIEtleTonLCByZXN1bHQuYXBpS2V5KTtcbiAgICBcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgIGxvZ2dlci53YXJuKGBDb3VsZCBub3QgcmVnaXN0ZXIgcHJvamVjdDogJHttZXNzYWdlfWApO1xuICAgIGxvZ2dlci5pbmZvKCdDcmVhdGluZyBsb2NhbCBjb25maWcgLSBydW4gXCJkZXZkb2MgaW5pdFwiIHdoZW4gb25saW5lIHRvIHJlZ2lzdGVyJyk7XG4gICAgXG4gICAgY29uc3QgZGV2ZG9jQ29uZmlnID0ge1xuICAgICAgcHJvamVjdElkOiBgJHtzbHVnfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA4KX1gLFxuICAgICAgbmFtZTogZm9ybWF0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpLFxuICAgICAgc2x1Zzogc2x1ZyxcbiAgICAgIHN1YmRvbWFpbjogc3ViZG9tYWluLFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgICBmcy53cml0ZUpzb25TeW5jKGRldmRvY0NvbmZpZ1BhdGgsIGRldmRvY0NvbmZpZywgeyBzcGFjZXM6IDIgfSk7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoJ0NyZWF0ZWQgLmRldmRvYy5qc29uIChvZmZsaW5lIG1vZGUpJyk7XG4gIH1cblxuICAvLyBJbml0aWFsaXplIGdpdFxuICBpZiAob3B0aW9ucy5naXQgIT09IGZhbHNlKSB7XG4gICAgbG9nZ2VyLmluZm8oJ0luaXRpYWxpemluZyBnaXQgcmVwb3NpdG9yeS4uLicpO1xuICAgIHRyeSB7XG4gICAgICBleGVjU3luYygnZ2l0IGluaXQnLCB7IGN3ZDogcmVzb2x2ZWRQYXRoLCBzdGRpbzogJ2lnbm9yZScgfSk7XG4gICAgICBleGVjU3luYygnZ2l0IGFkZCAtQScsIHsgY3dkOiByZXNvbHZlZFBhdGgsIHN0ZGlvOiAnaWdub3JlJyB9KTtcbiAgICAgIGV4ZWNTeW5jKCdnaXQgY29tbWl0IC1tIFwiSW5pdGlhbCBjb21taXQgZnJvbSBkZXZkb2MgY3JlYXRlXCInLCB7XG4gICAgICAgIGN3ZDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKCdHaXQgcmVwb3NpdG9yeSBpbml0aWFsaXplZCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgbG9nZ2VyLndhcm4oJ0NvdWxkIG5vdCBpbml0aWFsaXplIGdpdCByZXBvc2l0b3J5Jyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5zdGFsbCBkZXBlbmRlbmNpZXNcbiAgaWYgKG9wdGlvbnMuaW5zdGFsbCAhPT0gZmFsc2UpIHtcbiAgICBsb2dnZXIuaW5mbygnSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuLi4nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlcigpO1xuICAgICAgZXhlY1N5bmMoYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgLCB7XG4gICAgICAgIGN3ZDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBsb2dnZXIuc3VjY2VzcygnRGVwZW5kZW5jaWVzIGluc3RhbGxlZCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgbG9nZ2VyLndhcm4oJ0NvdWxkIG5vdCBpbnN0YWxsIGRlcGVuZGVuY2llcycpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN1Y2Nlc3MgbWVzc2FnZVxuICBjb25zb2xlLmxvZygpO1xuICBsb2dnZXIuc3VjY2VzcyhgQ3JlYXRlZCAke3Byb2plY3ROYW1lfSBhdCAke3Jlc29sdmVkUGF0aH1gKTtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coJ1lvdXIgZG9jcyB3aWxsIGJlIGF2YWlsYWJsZSBhdDonKTtcbiAgY29uc29sZS5sb2coYCAgaHR0cHM6Ly8ke3N1YmRvbWFpbn0uZGV2ZG9jLnNoYCk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCdJbnNpZGUgdGhhdCBkaXJlY3RvcnksIHlvdSBjYW4gcnVuIHNldmVyYWwgY29tbWFuZHM6Jyk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCcgIG5wbSBydW4gZGV2Jyk7XG4gIGNvbnNvbGUubG9nKCcgICAgU3RhcnRzIHRoZSBkZXZlbG9wbWVudCBzZXJ2ZXIuJyk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCcgIGRldmRvYyBkZXBsb3knKTtcbiAgY29uc29sZS5sb2coJyAgICBEZXBsb3lzIHlvdXIgZG9jdW1lbnRhdGlvbiB0byBCcmFpbmZpc2guJyk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKCdXZSBzdWdnZXN0IHRoYXQgeW91IGJlZ2luIGJ5IHR5cGluZzonKTtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coYCAgY2QgJHtwcm9qZWN0TmFtZX1gKTtcbiAgY29uc29sZS5sb2coJyAgbnBtIHJ1biBkZXYnKTtcbiAgY29uc29sZS5sb2coKTtcbiAgY29uc29sZS5sb2coJ0hhcHB5IGRvY3VtZW50aW5nISDwn5OaJyk7XG4gIGNvbnNvbGUubG9nKCk7XG59XG4iXX0=
@@ -0,0 +1,9 @@
1
+ interface DeployOptions {
2
+ url?: string;
3
+ apiKey?: string;
4
+ }
5
+ /**
6
+ * Deploy documentation to DevDoc platform
7
+ */
8
+ export declare function deploy(options: DeployOptions): Promise<void>;
9
+ export {};