@shahadpichen/docpush 1.0.0

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 (168) hide show
  1. package/README.md +129 -0
  2. package/dist/cli/commands/init.d.ts +2 -0
  3. package/dist/cli/commands/init.d.ts.map +1 -0
  4. package/dist/cli/commands/init.js +116 -0
  5. package/dist/cli/commands/init.js.map +1 -0
  6. package/dist/cli/commands/start.d.ts +4 -0
  7. package/dist/cli/commands/start.d.ts.map +1 -0
  8. package/dist/cli/commands/start.js +58 -0
  9. package/dist/cli/commands/start.js.map +1 -0
  10. package/dist/cli/index.d.ts +3 -0
  11. package/dist/cli/index.d.ts.map +1 -0
  12. package/dist/cli/index.js +22 -0
  13. package/dist/cli/index.js.map +1 -0
  14. package/dist/core/config/index.d.ts +3 -0
  15. package/dist/core/config/index.d.ts.map +1 -0
  16. package/dist/core/config/index.js +9 -0
  17. package/dist/core/config/index.js.map +1 -0
  18. package/dist/core/config/loader.d.ts +6 -0
  19. package/dist/core/config/loader.d.ts.map +1 -0
  20. package/dist/core/config/loader.js +50 -0
  21. package/dist/core/config/loader.js.map +1 -0
  22. package/dist/core/config/schema.d.ts +134 -0
  23. package/dist/core/config/schema.d.ts.map +1 -0
  24. package/dist/core/config/schema.js +106 -0
  25. package/dist/core/config/schema.js.map +1 -0
  26. package/dist/core/errors.d.ts +45 -0
  27. package/dist/core/errors.d.ts.map +1 -0
  28. package/dist/core/errors.js +76 -0
  29. package/dist/core/errors.js.map +1 -0
  30. package/dist/core/github/client.d.ts +47 -0
  31. package/dist/core/github/client.d.ts.map +1 -0
  32. package/dist/core/github/client.js +159 -0
  33. package/dist/core/github/client.js.map +1 -0
  34. package/dist/core/github/index.d.ts +4 -0
  35. package/dist/core/github/index.d.ts.map +1 -0
  36. package/dist/core/github/index.js +9 -0
  37. package/dist/core/github/index.js.map +1 -0
  38. package/dist/core/github/retry.d.ts +15 -0
  39. package/dist/core/github/retry.d.ts.map +1 -0
  40. package/dist/core/github/retry.js +61 -0
  41. package/dist/core/github/retry.js.map +1 -0
  42. package/dist/index.d.ts +9 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +40 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/react/components/comments-panel.d.ts +14 -0
  47. package/dist/react/components/comments-panel.d.ts.map +1 -0
  48. package/dist/react/components/comments-panel.js +62 -0
  49. package/dist/react/components/comments-panel.js.map +1 -0
  50. package/dist/react/components/docs-sidebar.d.ts +13 -0
  51. package/dist/react/components/docs-sidebar.d.ts.map +1 -0
  52. package/dist/react/components/docs-sidebar.js +70 -0
  53. package/dist/react/components/docs-sidebar.js.map +1 -0
  54. package/dist/react/components/drafts-list.d.ts +18 -0
  55. package/dist/react/components/drafts-list.d.ts.map +1 -0
  56. package/dist/react/components/drafts-list.js +38 -0
  57. package/dist/react/components/drafts-list.js.map +1 -0
  58. package/dist/react/components/markdown-editor.d.ts +8 -0
  59. package/dist/react/components/markdown-editor.d.ts.map +1 -0
  60. package/dist/react/components/markdown-editor.js +59 -0
  61. package/dist/react/components/markdown-editor.js.map +1 -0
  62. package/dist/react/components/markdown-viewer.d.ts +7 -0
  63. package/dist/react/components/markdown-viewer.d.ts.map +1 -0
  64. package/dist/react/components/markdown-viewer.js +58 -0
  65. package/dist/react/components/markdown-viewer.js.map +1 -0
  66. package/dist/react/components/search-bar.d.ts +14 -0
  67. package/dist/react/components/search-bar.d.ts.map +1 -0
  68. package/dist/react/components/search-bar.js +80 -0
  69. package/dist/react/components/search-bar.js.map +1 -0
  70. package/dist/react/components/ui/badge.d.ts +10 -0
  71. package/dist/react/components/ui/badge.d.ts.map +1 -0
  72. package/dist/react/components/ui/badge.js +27 -0
  73. package/dist/react/components/ui/badge.js.map +1 -0
  74. package/dist/react/components/ui/button.d.ts +12 -0
  75. package/dist/react/components/ui/button.d.ts.map +1 -0
  76. package/dist/react/components/ui/button.js +71 -0
  77. package/dist/react/components/ui/button.js.map +1 -0
  78. package/dist/react/components/ui/card.d.ts +7 -0
  79. package/dist/react/components/ui/card.d.ts.map +1 -0
  80. package/dist/react/components/ui/card.js +52 -0
  81. package/dist/react/components/ui/card.js.map +1 -0
  82. package/dist/react/components/ui/input.d.ts +6 -0
  83. package/dist/react/components/ui/input.d.ts.map +1 -0
  84. package/dist/react/components/ui/input.js +45 -0
  85. package/dist/react/components/ui/input.js.map +1 -0
  86. package/dist/react/components/ui/scroll-area.d.ts +6 -0
  87. package/dist/react/components/ui/scroll-area.d.ts.map +1 -0
  88. package/dist/react/components/ui/scroll-area.js +48 -0
  89. package/dist/react/components/ui/scroll-area.js.map +1 -0
  90. package/dist/react/components/ui/textarea.d.ts +6 -0
  91. package/dist/react/components/ui/textarea.d.ts.map +1 -0
  92. package/dist/react/components/ui/textarea.js +45 -0
  93. package/dist/react/components/ui/textarea.js.map +1 -0
  94. package/dist/react/context/docpush-provider.d.ts +17 -0
  95. package/dist/react/context/docpush-provider.d.ts.map +1 -0
  96. package/dist/react/context/docpush-provider.js +72 -0
  97. package/dist/react/context/docpush-provider.js.map +1 -0
  98. package/dist/react/hooks/use-auth.d.ts +16 -0
  99. package/dist/react/hooks/use-auth.d.ts.map +1 -0
  100. package/dist/react/hooks/use-auth.js +72 -0
  101. package/dist/react/hooks/use-auth.js.map +1 -0
  102. package/dist/react/hooks/use-comments.d.ts +15 -0
  103. package/dist/react/hooks/use-comments.d.ts.map +1 -0
  104. package/dist/react/hooks/use-comments.js +67 -0
  105. package/dist/react/hooks/use-comments.js.map +1 -0
  106. package/dist/react/hooks/use-docs.d.ts +13 -0
  107. package/dist/react/hooks/use-docs.d.ts.map +1 -0
  108. package/dist/react/hooks/use-docs.js +69 -0
  109. package/dist/react/hooks/use-docs.js.map +1 -0
  110. package/dist/react/hooks/use-drafts.d.ts +25 -0
  111. package/dist/react/hooks/use-drafts.d.ts.map +1 -0
  112. package/dist/react/hooks/use-drafts.js +99 -0
  113. package/dist/react/hooks/use-drafts.js.map +1 -0
  114. package/dist/react/index.d.ts +19 -0
  115. package/dist/react/index.d.ts.map +1 -0
  116. package/dist/react/index.js +52 -0
  117. package/dist/react/index.js.map +1 -0
  118. package/dist/react/lib/utils.d.ts +3 -0
  119. package/dist/react/lib/utils.d.ts.map +1 -0
  120. package/dist/react/lib/utils.js +9 -0
  121. package/dist/react/lib/utils.js.map +1 -0
  122. package/dist/server/auth/index.d.ts +18 -0
  123. package/dist/server/auth/index.d.ts.map +1 -0
  124. package/dist/server/auth/index.js +50 -0
  125. package/dist/server/auth/index.js.map +1 -0
  126. package/dist/server/auth/magic-link.d.ts +10 -0
  127. package/dist/server/auth/magic-link.d.ts.map +1 -0
  128. package/dist/server/auth/magic-link.js +94 -0
  129. package/dist/server/auth/magic-link.js.map +1 -0
  130. package/dist/server/auth/oauth.d.ts +6 -0
  131. package/dist/server/auth/oauth.d.ts.map +1 -0
  132. package/dist/server/auth/oauth.js +90 -0
  133. package/dist/server/auth/oauth.js.map +1 -0
  134. package/dist/server/auth/public.d.ts +7 -0
  135. package/dist/server/auth/public.d.ts.map +1 -0
  136. package/dist/server/auth/public.js +43 -0
  137. package/dist/server/auth/public.js.map +1 -0
  138. package/dist/server/index.d.ts +12 -0
  139. package/dist/server/index.d.ts.map +1 -0
  140. package/dist/server/index.js +107 -0
  141. package/dist/server/index.js.map +1 -0
  142. package/dist/server/middleware/auth.d.ts +20 -0
  143. package/dist/server/middleware/auth.d.ts.map +1 -0
  144. package/dist/server/middleware/auth.js +49 -0
  145. package/dist/server/middleware/auth.js.map +1 -0
  146. package/dist/server/routes/auth.d.ts +3 -0
  147. package/dist/server/routes/auth.d.ts.map +1 -0
  148. package/dist/server/routes/auth.js +105 -0
  149. package/dist/server/routes/auth.js.map +1 -0
  150. package/dist/server/routes/docs.d.ts +3 -0
  151. package/dist/server/routes/docs.d.ts.map +1 -0
  152. package/dist/server/routes/docs.js +58 -0
  153. package/dist/server/routes/docs.js.map +1 -0
  154. package/dist/server/routes/drafts.d.ts +3 -0
  155. package/dist/server/routes/drafts.d.ts.map +1 -0
  156. package/dist/server/routes/drafts.js +264 -0
  157. package/dist/server/routes/drafts.js.map +1 -0
  158. package/dist/server/routes/index.d.ts +4 -0
  159. package/dist/server/routes/index.d.ts.map +1 -0
  160. package/dist/server/routes/index.js +13 -0
  161. package/dist/server/routes/index.js.map +1 -0
  162. package/dist/server/storage/index.d.ts +40 -0
  163. package/dist/server/storage/index.d.ts.map +1 -0
  164. package/dist/server/storage/index.js +199 -0
  165. package/dist/server/storage/index.js.map +1 -0
  166. package/package.json +109 -0
  167. package/templates/.env.example +20 -0
  168. package/templates/docs.config.js +21 -0
package/README.md ADDED
@@ -0,0 +1,129 @@
1
+ # DocPush
2
+
3
+ Self-hosted, Git-backed collaborative documentation platform.
4
+
5
+ ## Features
6
+
7
+ - 📝 **Git-backed** - All docs stored in your GitHub repo
8
+ - 🔐 **Flexible Auth** - Public, magic link, or OAuth
9
+ - ✏️ **Draft System** - Branch-based editing with approval workflow
10
+ - 💬 **Comments** - Collaborative review process
11
+ - ⚛️ **React Components** - Headless UI components for your app
12
+
13
+ ## Quick Start
14
+
15
+ ```bash
16
+ # Install
17
+ npm install @shahadpichen/docpush
18
+
19
+ # Initialize
20
+ npx @shahadpichen/docpush init
21
+
22
+ # Configure docs.config.js and .env
23
+
24
+ # Start
25
+ npx @shahadpichen/docpush start
26
+ ```
27
+
28
+ ## Configuration
29
+
30
+ Create `docs.config.js`:
31
+
32
+ ```javascript
33
+ module.exports = {
34
+ github: {
35
+ owner: "your-username",
36
+ repo: "your-repo",
37
+ branch: "main",
38
+ docsPath: "docs",
39
+ },
40
+ auth: {
41
+ mode: "public",
42
+ adminPassword: "your-admin-password",
43
+ },
44
+ admins: {
45
+ emails: ["admin@example.com"],
46
+ },
47
+ };
48
+ ```
49
+
50
+ Create `.env`:
51
+
52
+ ```
53
+ GITHUB_TOKEN=ghp_your_token
54
+ APP_URL=http://localhost:3000
55
+ SESSION_SECRET=your-secret
56
+ ```
57
+
58
+ ## Auth Modes
59
+
60
+ ### Public Mode
61
+
62
+ Anyone can submit drafts, admin approves.
63
+
64
+ ```javascript
65
+ auth: {
66
+ mode: 'public',
67
+ adminPassword: 'admin123',
68
+ }
69
+ ```
70
+
71
+ ### Domain-Restricted Mode
72
+
73
+ Only users with allowed email domains can edit.
74
+
75
+ ```javascript
76
+ auth: {
77
+ mode: 'domain-restricted',
78
+ allowedDomains: ['company.com'],
79
+ emailFrom: 'docs@company.com',
80
+ }
81
+ ```
82
+
83
+ ### OAuth Mode
84
+
85
+ GitHub/Google sign-in.
86
+
87
+ ```javascript
88
+ auth: {
89
+ mode: 'oauth',
90
+ providers: ['github', 'google'],
91
+ }
92
+ ```
93
+
94
+ ## React Components
95
+
96
+ Import components for your own UI:
97
+
98
+ ```tsx
99
+ import {
100
+ DocPushProvider,
101
+ DocsSidebar,
102
+ MarkdownViewer,
103
+ MarkdownEditor,
104
+ useDocs,
105
+ useDrafts,
106
+ } from "docpush/react";
107
+
108
+ function App() {
109
+ return (
110
+ <DocPushProvider config={{ apiUrl: "http://localhost:3000" }}>
111
+ <DocsPage />
112
+ </DocPushProvider>
113
+ );
114
+ }
115
+ ```
116
+
117
+ ## API Endpoints
118
+
119
+ | Endpoint | Description |
120
+ | ------------------------------ | ------------------ |
121
+ | `GET /api/docs/tree` | Get docs file tree |
122
+ | `GET /api/docs/:path` | Get doc content |
123
+ | `GET /api/drafts` | List drafts |
124
+ | `POST /api/drafts` | Create draft |
125
+ | `POST /api/drafts/:id/approve` | Approve draft |
126
+
127
+ ## License
128
+
129
+ MIT
@@ -0,0 +1,2 @@
1
+ export declare function initCommand(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AA+EA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAsCjD"}
@@ -0,0 +1,116 @@
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.initCommand = initCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const WELCOME_TEMPLATE = `# Welcome to Your Documentation
10
+
11
+ This is your first document! Edit it to get started.
12
+
13
+ ## Getting Started
14
+
15
+ 1. Edit files in the \`docs/\` folder
16
+ 2. Changes are saved as drafts (Git branches)
17
+ 3. Admins can approve drafts to publish
18
+
19
+ ## Configuration
20
+
21
+ Edit \`docs.config.js\` to configure:
22
+ - GitHub repository
23
+ - Authentication mode
24
+ - Admin users
25
+ `;
26
+ const CONFIG_TEMPLATE = `module.exports = {
27
+ // Your GitHub repository
28
+ github: {
29
+ owner: 'your-org', // TODO: Change to your GitHub org/username
30
+ repo: 'your-repo', // TODO: Change to your repository name
31
+ branch: 'main', // Main branch
32
+ docsPath: 'docs' // Path to docs folder
33
+ },
34
+
35
+ // Authentication mode
36
+ auth: {
37
+ mode: 'public', // Options: 'public' | 'domain-restricted' | 'oauth'
38
+ adminPassword: 'changeme' // TODO: Change this password! (for public mode)
39
+ },
40
+
41
+ // Admin users (for domain-restricted and oauth modes)
42
+ admins: {
43
+ emails: ['admin@example.com'] // TODO: Add your admin emails
44
+ },
45
+
46
+ // Optional: Branding
47
+ branding: {
48
+ name: 'Documentation',
49
+ // logo: '/logo.png'
50
+ }
51
+ };
52
+ `;
53
+ const ENV_TEMPLATE = `# Required
54
+ GITHUB_TOKEN=ghp_your_token_here
55
+ APP_URL=http://localhost:3000
56
+ SESSION_SECRET=generate-random-string-here-change-in-production
57
+
58
+ # Database (optional - uses SQLite if not provided)
59
+ # DATABASE_PATH=./docpush.db
60
+
61
+ # Auth - Domain Restricted (only if using this mode)
62
+ # RESEND_API_KEY=re_your_key_here
63
+
64
+ # Auth - OAuth (only if using this mode)
65
+ # GITHUB_CLIENT_ID=your_client_id
66
+ # GITHUB_CLIENT_SECRET=your_client_secret
67
+ # GOOGLE_CLIENT_ID=your_client_id
68
+ # GOOGLE_CLIENT_SECRET=your_client_secret
69
+
70
+ # Media - S3 (optional)
71
+ # S3_BUCKET=your-bucket
72
+ # AWS_REGION=us-east-1
73
+ # AWS_ACCESS_KEY_ID=your_key
74
+ # AWS_SECRET_ACCESS_KEY=your_secret
75
+
76
+ # Search - Algolia (optional but recommended)
77
+ # NEXT_PUBLIC_ALGOLIA_APP_ID=your_app_id
78
+ # NEXT_PUBLIC_ALGOLIA_SEARCH_KEY=your_search_only_api_key
79
+ # NEXT_PUBLIC_ALGOLIA_INDEX_NAME=your_index_name
80
+ `;
81
+ async function initCommand() {
82
+ console.log(chalk_1.default.blue('🚀 Initializing DocPush...\n'));
83
+ // 1. Create docs folder
84
+ await fs_extra_1.default.ensureDir('./docs');
85
+ await fs_extra_1.default.writeFile('./docs/welcome.md', WELCOME_TEMPLATE);
86
+ console.log(chalk_1.default.green('✓'), 'Created docs/ folder with welcome.md');
87
+ // 2. Create config file
88
+ if (!(await fs_extra_1.default.pathExists('./docs.config.js'))) {
89
+ await fs_extra_1.default.writeFile('./docs.config.js', CONFIG_TEMPLATE);
90
+ console.log(chalk_1.default.green('✓'), 'Created docs.config.js');
91
+ }
92
+ else {
93
+ console.log(chalk_1.default.yellow('⚠'), 'docs.config.js already exists, skipping');
94
+ }
95
+ // 3. Create .env.example
96
+ await fs_extra_1.default.writeFile('./.env.example', ENV_TEMPLATE);
97
+ console.log(chalk_1.default.green('✓'), 'Created .env.example');
98
+ // 4. Update package.json scripts
99
+ const pkgPath = './package.json';
100
+ if (await fs_extra_1.default.pathExists(pkgPath)) {
101
+ const pkg = await fs_extra_1.default.readJson(pkgPath);
102
+ pkg.scripts = {
103
+ ...pkg.scripts,
104
+ 'docs:dev': 'docpush start',
105
+ 'docs:build': 'docpush build',
106
+ };
107
+ await fs_extra_1.default.writeJson(pkgPath, pkg, { spaces: 2 });
108
+ console.log(chalk_1.default.green('✓'), 'Updated package.json scripts');
109
+ }
110
+ console.log(chalk_1.default.blue('\n📝 Next steps:'));
111
+ console.log(' 1. Copy .env.example to .env and fill in values');
112
+ console.log(' 2. Edit docs.config.js with your GitHub repo');
113
+ console.log(' 3. Create a GitHub Personal Access Token with "repo" scope');
114
+ console.log(' 4. Run: npm run docs:dev\n');
115
+ }
116
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":";;;;;AA+EA,kCAsCC;AApHD,kDAA0B;AAC1B,wDAA0B;AAE1B,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;CAgBxB,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BvB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BpB,CAAC;AAEK,KAAK,UAAU,WAAW;IAC/B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAExD,wBAAwB;IACxB,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,kBAAE,CAAC,SAAS,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,sCAAsC,CAAC,CAAC;IAEtE,wBAAwB;IACxB,IAAI,CAAC,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC;QAC/C,MAAM,kBAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,yCAAyC,CAAC,CAAC;IAC5E,CAAC;IAED,yBAAyB;IACzB,MAAM,kBAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,sBAAsB,CAAC,CAAC;IAEtD,iCAAiC;IACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC;IACjC,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvC,GAAG,CAAC,OAAO,GAAG;YACZ,GAAG,GAAG,CAAC,OAAO;YACd,UAAU,EAAE,eAAe;YAC3B,YAAY,EAAE,eAAe;SAC9B,CAAC;QACF,MAAM,kBAAE,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,8BAA8B,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function startCommand(options: {
2
+ port: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB3E"}
@@ -0,0 +1,58 @@
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.startCommand = startCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const dotenv_1 = require("dotenv");
42
+ async function startCommand(options) {
43
+ // Load .env file from current working directory
44
+ (0, dotenv_1.config)();
45
+ const port = Number.parseInt(options.port);
46
+ console.log(chalk_1.default.blue('🚀 Starting DocPush...\n'));
47
+ // Dynamically import and start the server
48
+ try {
49
+ const { startServer } = await Promise.resolve().then(() => __importStar(require('../../server')));
50
+ await startServer(port);
51
+ }
52
+ catch (error) {
53
+ const message = error instanceof Error ? error.message : 'Unknown error';
54
+ console.error(chalk_1.default.red('❌ Failed to start server:'), message);
55
+ process.exit(1);
56
+ }
57
+ }
58
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,oCAiBC;AApBD,kDAA0B;AAC1B,mCAAgC;AAEzB,KAAK,UAAU,YAAY,CAAC,OAAyB;IAC1D,gDAAgD;IAChD,IAAA,eAAM,GAAE,CAAC;IAET,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAEpD,0CAA0C;IAC1C,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,GAAG,wDAAa,cAAc,GAAC,CAAC;QACrD,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACzE,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const init_1 = require("./commands/init");
6
+ const start_1 = require("./commands/start");
7
+ const program = new commander_1.Command();
8
+ program
9
+ .name('docpush')
10
+ .description('Self-hosted, Git-backed collaborative documentation platform')
11
+ .version('1.0.0');
12
+ program
13
+ .command('init')
14
+ .description('Initialize DocPush in the current directory')
15
+ .action(init_1.initCommand);
16
+ program
17
+ .command('start')
18
+ .description('Start the DocPush development server')
19
+ .option('-p, --port <port>', 'Port to run on', '3000')
20
+ .action(start_1.startCommand);
21
+ program.parse();
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,0CAA8C;AAC9C,4CAAgD;AAEhD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,kBAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,CAAC;KACrD,MAAM,CAAC,oBAAY,CAAC,CAAC;AAExB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { loadConfig, resetConfigCache, configSchema, validateEnv } from './loader';
2
+ export type { DocsConfig } from './loader';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACnF,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateEnv = exports.configSchema = exports.resetConfigCache = exports.loadConfig = void 0;
4
+ var loader_1 = require("./loader");
5
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return loader_1.loadConfig; } });
6
+ Object.defineProperty(exports, "resetConfigCache", { enumerable: true, get: function () { return loader_1.resetConfigCache; } });
7
+ Object.defineProperty(exports, "configSchema", { enumerable: true, get: function () { return loader_1.configSchema; } });
8
+ Object.defineProperty(exports, "validateEnv", { enumerable: true, get: function () { return loader_1.validateEnv; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/config/index.ts"],"names":[],"mappings":";;;AAAA,mCAAmF;AAA1E,oGAAA,UAAU,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAAE,sGAAA,YAAY,OAAA;AAAE,qGAAA,WAAW,OAAA"}
@@ -0,0 +1,6 @@
1
+ import { type DocsConfig } from './schema';
2
+ export declare function loadConfig(configPath?: string): Promise<DocsConfig>;
3
+ export declare function resetConfigCache(): void;
4
+ export { configSchema, type DocsConfig } from './schema';
5
+ export { validateEnv } from './schema';
6
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/config/loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAgB,MAAM,UAAU,CAAC;AAIzD,wBAAsB,UAAU,CAAC,UAAU,SAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,CA+BrF;AAGD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAGD,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,50 @@
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.validateEnv = exports.configSchema = void 0;
7
+ exports.loadConfig = loadConfig;
8
+ exports.resetConfigCache = resetConfigCache;
9
+ const node_fs_1 = __importDefault(require("node:fs"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const schema_1 = require("./schema");
12
+ let cachedConfig = null;
13
+ async function loadConfig(configPath = './docs.config.js') {
14
+ if (cachedConfig)
15
+ return cachedConfig;
16
+ const fullPath = node_path_1.default.resolve(process.cwd(), configPath);
17
+ if (!node_fs_1.default.existsSync(fullPath)) {
18
+ throw new Error('docs.config.js not found. Run: npx docpush init');
19
+ }
20
+ try {
21
+ // Clear require cache to pick up changes
22
+ delete require.cache[require.resolve(fullPath)];
23
+ // Dynamic require - works in Node.js
24
+ const userConfig = require(fullPath);
25
+ // Validate with Zod
26
+ cachedConfig = schema_1.configSchema.parse(userConfig);
27
+ return cachedConfig;
28
+ }
29
+ catch (error) {
30
+ if (error instanceof Error && error.name === 'ZodError') {
31
+ console.error('Configuration validation failed:');
32
+ const zodError = error;
33
+ zodError.errors.forEach((err) => {
34
+ console.error(` - ${err.path.join('.')}: ${err.message}`);
35
+ });
36
+ throw new Error('Invalid configuration');
37
+ }
38
+ throw error;
39
+ }
40
+ }
41
+ // Reset cache (useful for testing)
42
+ function resetConfigCache() {
43
+ cachedConfig = null;
44
+ }
45
+ // Re-export schema and types
46
+ var schema_2 = require("./schema");
47
+ Object.defineProperty(exports, "configSchema", { enumerable: true, get: function () { return schema_2.configSchema; } });
48
+ var schema_3 = require("./schema");
49
+ Object.defineProperty(exports, "validateEnv", { enumerable: true, get: function () { return schema_3.validateEnv; } });
50
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/config/loader.ts"],"names":[],"mappings":";;;;;;AAMA,gCA+BC;AAGD,4CAEC;AA1CD,sDAAyB;AACzB,0DAA6B;AAC7B,qCAAyD;AAEzD,IAAI,YAAY,GAAsB,IAAI,CAAC;AAEpC,KAAK,UAAU,UAAU,CAAC,UAAU,GAAG,kBAAkB;IAC9D,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,MAAM,QAAQ,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IAEzD,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,CAAC;QACH,yCAAyC;QACzC,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEhD,qCAAqC;QACrC,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAErC,oBAAoB;QACpB,YAAY,GAAG,qBAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAE9C,OAAO,YAAY,CAAC;IACtB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,KAA0E,CAAC;YAC5F,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC9B,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,SAAgB,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,6BAA6B;AAC7B,mCAAyD;AAAhD,sGAAA,YAAY,OAAA;AACrB,mCAAuC;AAA9B,qGAAA,WAAW,OAAA"}
@@ -0,0 +1,134 @@
1
+ import { z } from 'zod';
2
+ export declare const configSchema: z.ZodObject<{
3
+ github: z.ZodObject<{
4
+ owner: z.ZodString;
5
+ repo: z.ZodString;
6
+ branch: z.ZodDefault<z.ZodString>;
7
+ docsPath: z.ZodDefault<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ owner: string;
10
+ repo: string;
11
+ branch: string;
12
+ docsPath: string;
13
+ }, {
14
+ owner: string;
15
+ repo: string;
16
+ branch?: string | undefined;
17
+ docsPath?: string | undefined;
18
+ }>;
19
+ auth: z.ZodDiscriminatedUnion<"mode", [z.ZodObject<{
20
+ mode: z.ZodLiteral<"public">;
21
+ adminPassword: z.ZodString;
22
+ }, "strip", z.ZodTypeAny, {
23
+ mode: "public";
24
+ adminPassword: string;
25
+ }, {
26
+ mode: "public";
27
+ adminPassword: string;
28
+ }>, z.ZodObject<{
29
+ mode: z.ZodLiteral<"domain-restricted">;
30
+ allowedDomains: z.ZodArray<z.ZodString, "many">;
31
+ emailFrom: z.ZodString;
32
+ }, "strip", z.ZodTypeAny, {
33
+ mode: "domain-restricted";
34
+ allowedDomains: string[];
35
+ emailFrom: string;
36
+ }, {
37
+ mode: "domain-restricted";
38
+ allowedDomains: string[];
39
+ emailFrom: string;
40
+ }>, z.ZodObject<{
41
+ mode: z.ZodLiteral<"oauth">;
42
+ providers: z.ZodArray<z.ZodEnum<["github", "google"]>, "many">;
43
+ allowedDomains: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
44
+ }, "strip", z.ZodTypeAny, {
45
+ mode: "oauth";
46
+ providers: ("github" | "google")[];
47
+ allowedDomains?: string[] | undefined;
48
+ }, {
49
+ mode: "oauth";
50
+ providers: ("github" | "google")[];
51
+ allowedDomains?: string[] | undefined;
52
+ }>]>;
53
+ admins: z.ZodObject<{
54
+ emails: z.ZodArray<z.ZodString, "many">;
55
+ }, "strip", z.ZodTypeAny, {
56
+ emails: string[];
57
+ }, {
58
+ emails: string[];
59
+ }>;
60
+ branding: z.ZodOptional<z.ZodObject<{
61
+ name: z.ZodDefault<z.ZodString>;
62
+ logo: z.ZodOptional<z.ZodString>;
63
+ }, "strip", z.ZodTypeAny, {
64
+ name: string;
65
+ logo?: string | undefined;
66
+ }, {
67
+ name?: string | undefined;
68
+ logo?: string | undefined;
69
+ }>>;
70
+ }, "strip", z.ZodTypeAny, {
71
+ github: {
72
+ owner: string;
73
+ repo: string;
74
+ branch: string;
75
+ docsPath: string;
76
+ };
77
+ auth: {
78
+ mode: "public";
79
+ adminPassword: string;
80
+ } | {
81
+ mode: "domain-restricted";
82
+ allowedDomains: string[];
83
+ emailFrom: string;
84
+ } | {
85
+ mode: "oauth";
86
+ providers: ("github" | "google")[];
87
+ allowedDomains?: string[] | undefined;
88
+ };
89
+ admins: {
90
+ emails: string[];
91
+ };
92
+ branding?: {
93
+ name: string;
94
+ logo?: string | undefined;
95
+ } | undefined;
96
+ }, {
97
+ github: {
98
+ owner: string;
99
+ repo: string;
100
+ branch?: string | undefined;
101
+ docsPath?: string | undefined;
102
+ };
103
+ auth: {
104
+ mode: "public";
105
+ adminPassword: string;
106
+ } | {
107
+ mode: "domain-restricted";
108
+ allowedDomains: string[];
109
+ emailFrom: string;
110
+ } | {
111
+ mode: "oauth";
112
+ providers: ("github" | "google")[];
113
+ allowedDomains?: string[] | undefined;
114
+ };
115
+ admins: {
116
+ emails: string[];
117
+ };
118
+ branding?: {
119
+ name?: string | undefined;
120
+ logo?: string | undefined;
121
+ } | undefined;
122
+ }>;
123
+ export type DocsConfig = z.infer<typeof configSchema>;
124
+ interface EnvValidationResult {
125
+ valid: boolean;
126
+ missing: string[];
127
+ warnings: string[];
128
+ }
129
+ /**
130
+ * Validate environment variables with detailed feedback
131
+ */
132
+ export declare function validateEnv(config?: DocsConfig): EnvValidationResult;
133
+ export {};
134
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/core/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoBxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BvB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEtD,UAAU,mBAAmB;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,mBAAmB,CA+DpE"}