draken 0.1.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 (63) hide show
  1. package/README.md +108 -0
  2. package/dist/auth/middleware.d.ts +23 -0
  3. package/dist/auth/middleware.d.ts.map +1 -0
  4. package/dist/auth/middleware.js +117 -0
  5. package/dist/auth/middleware.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +70 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/db/queries.d.ts +16 -0
  11. package/dist/db/queries.d.ts.map +1 -0
  12. package/dist/db/queries.js +91 -0
  13. package/dist/db/queries.js.map +1 -0
  14. package/dist/db/schema.d.ts +4 -0
  15. package/dist/db/schema.d.ts.map +1 -0
  16. package/dist/db/schema.js +71 -0
  17. package/dist/db/schema.js.map +1 -0
  18. package/dist/docker/dockerfile.d.ts +5 -0
  19. package/dist/docker/dockerfile.d.ts.map +1 -0
  20. package/dist/docker/dockerfile.js +32 -0
  21. package/dist/docker/dockerfile.js.map +1 -0
  22. package/dist/docker/manager.d.ts +42 -0
  23. package/dist/docker/manager.d.ts.map +1 -0
  24. package/dist/docker/manager.js +311 -0
  25. package/dist/docker/manager.js.map +1 -0
  26. package/dist/git/status.d.ts +36 -0
  27. package/dist/git/status.d.ts.map +1 -0
  28. package/dist/git/status.js +213 -0
  29. package/dist/git/status.js.map +1 -0
  30. package/dist/routes/auth.d.ts +3 -0
  31. package/dist/routes/auth.d.ts.map +1 -0
  32. package/dist/routes/auth.js +49 -0
  33. package/dist/routes/auth.js.map +1 -0
  34. package/dist/routes/browse.d.ts +3 -0
  35. package/dist/routes/browse.d.ts.map +1 -0
  36. package/dist/routes/browse.js +49 -0
  37. package/dist/routes/browse.js.map +1 -0
  38. package/dist/routes/git.d.ts +3 -0
  39. package/dist/routes/git.d.ts.map +1 -0
  40. package/dist/routes/git.js +135 -0
  41. package/dist/routes/git.js.map +1 -0
  42. package/dist/routes/projects.d.ts +3 -0
  43. package/dist/routes/projects.d.ts.map +1 -0
  44. package/dist/routes/projects.js +149 -0
  45. package/dist/routes/projects.js.map +1 -0
  46. package/dist/routes/tasks.d.ts +3 -0
  47. package/dist/routes/tasks.d.ts.map +1 -0
  48. package/dist/routes/tasks.js +313 -0
  49. package/dist/routes/tasks.js.map +1 -0
  50. package/dist/server.d.ts +2 -0
  51. package/dist/server.d.ts.map +1 -0
  52. package/dist/server.js +60 -0
  53. package/dist/server.js.map +1 -0
  54. package/dist/types.d.ts +32 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +3 -0
  57. package/dist/types.js.map +1 -0
  58. package/draken.dockerfile.template +18 -0
  59. package/package.json +59 -0
  60. package/public/assets/index-B_sRrhlE.css +1 -0
  61. package/public/assets/index-DHRickdD.js +235 -0
  62. package/public/draken.svg +13 -0
  63. package/public/index.html +18 -0
@@ -0,0 +1,49 @@
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
+ const express_1 = require("express");
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const router = (0, express_1.Router)();
11
+ router.get('/', (req, res) => {
12
+ const requestedPath = req.query.path || os_1.default.homedir();
13
+ try {
14
+ // Resolve to absolute path
15
+ const absolutePath = path_1.default.resolve(requestedPath);
16
+ // Check if path exists and is a directory
17
+ if (!fs_1.default.existsSync(absolutePath)) {
18
+ return res.status(404).json({ error: 'Path not found' });
19
+ }
20
+ const stats = fs_1.default.statSync(absolutePath);
21
+ if (!stats.isDirectory()) {
22
+ return res.status(400).json({ error: 'Path is not a directory' });
23
+ }
24
+ // Read directory contents
25
+ const entries = fs_1.default.readdirSync(absolutePath, { withFileTypes: true });
26
+ const directories = entries
27
+ .filter(entry => entry.isDirectory() && !entry.name.startsWith('.'))
28
+ .map(entry => ({
29
+ name: entry.name,
30
+ path: path_1.default.join(absolutePath, entry.name),
31
+ isDirectory: true,
32
+ }))
33
+ .sort((a, b) => a.name.localeCompare(b.name));
34
+ // Get parent directory
35
+ const parentPath = path_1.default.dirname(absolutePath);
36
+ const hasParent = parentPath !== absolutePath;
37
+ res.json({
38
+ currentPath: absolutePath,
39
+ parentPath: hasParent ? parentPath : null,
40
+ entries: directories,
41
+ });
42
+ }
43
+ catch (err) {
44
+ console.error('Browse error:', err);
45
+ res.status(500).json({ error: 'Failed to browse directory' });
46
+ }
47
+ });
48
+ exports.default = router;
49
+ //# sourceMappingURL=browse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browse.js","sourceRoot":"","sources":["../../src/routes/browse.ts"],"names":[],"mappings":";;;;;AAAA,qCAAoD;AACpD,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAGpB,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAC9C,MAAM,aAAa,GAAI,GAAG,CAAC,KAAK,CAAC,IAAe,IAAI,YAAE,CAAC,OAAO,EAAE,CAAC;IAEjE,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,YAAY,GAAG,cAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAEjD,0CAA0C;QAC1C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,KAAK,GAAG,YAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,0BAA0B;QAC1B,MAAM,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtE,MAAM,WAAW,GAAqB,OAAO;aAC1C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aACnE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC;YACzC,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEhD,uBAAuB;QACvB,MAAM,UAAU,GAAG,cAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,UAAU,KAAK,YAAY,CAAC;QAE9C,GAAG,CAAC,IAAI,CAAC;YACP,WAAW,EAAE,YAAY;YACzB,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;YACzC,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACpC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,kBAAe,MAAM,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/routes/git.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAgJxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,135 @@
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
+ const express_1 = require("express");
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const queries_1 = require("../db/queries");
10
+ const status_1 = require("../git/status");
11
+ const router = (0, express_1.Router)();
12
+ // Max file size to read (100KB)
13
+ const MAX_FILE_SIZE = 100 * 1024;
14
+ // Get git status for a project
15
+ router.get('/:projectId/status', async (req, res) => {
16
+ try {
17
+ const projectId = parseInt(req.params.projectId, 10);
18
+ const project = (0, queries_1.getProjectById)(projectId);
19
+ if (!project) {
20
+ return res.status(404).json({ error: 'Project not found' });
21
+ }
22
+ const status = await (0, status_1.getGitStatus)(project.path);
23
+ res.json(status);
24
+ }
25
+ catch (err) {
26
+ console.error('Error getting git status:', err);
27
+ res.status(500).json({ error: 'Failed to get git status' });
28
+ }
29
+ });
30
+ // Get git diff for a project
31
+ router.get('/:projectId/diff', async (req, res) => {
32
+ try {
33
+ const projectId = parseInt(req.params.projectId, 10);
34
+ const staged = req.query.staged === 'true';
35
+ const project = (0, queries_1.getProjectById)(projectId);
36
+ if (!project) {
37
+ return res.status(404).json({ error: 'Project not found' });
38
+ }
39
+ const diff = await (0, status_1.getGitDiff)(project.path, staged);
40
+ res.json({ diff });
41
+ }
42
+ catch (err) {
43
+ console.error('Error getting git diff:', err);
44
+ res.status(500).json({ error: 'Failed to get git diff' });
45
+ }
46
+ });
47
+ // Get both staged and unstaged diffs
48
+ router.get('/:projectId/diffs', async (req, res) => {
49
+ try {
50
+ const projectId = parseInt(req.params.projectId, 10);
51
+ const project = (0, queries_1.getProjectById)(projectId);
52
+ if (!project) {
53
+ return res.status(404).json({ error: 'Project not found' });
54
+ }
55
+ const diffs = await (0, status_1.getGitDiffs)(project.path);
56
+ res.json(diffs);
57
+ }
58
+ catch (err) {
59
+ console.error('Error getting git diffs:', err);
60
+ res.status(500).json({ error: 'Failed to get git diffs' });
61
+ }
62
+ });
63
+ // Get old/new content for file diff comparison
64
+ router.get('/:projectId/file-diff', async (req, res) => {
65
+ try {
66
+ const projectId = parseInt(req.params.projectId, 10);
67
+ const filePath = req.query.path;
68
+ const staged = req.query.staged === 'true';
69
+ if (!filePath) {
70
+ return res.status(400).json({ error: 'File path is required' });
71
+ }
72
+ const project = (0, queries_1.getProjectById)(projectId);
73
+ if (!project) {
74
+ return res.status(404).json({ error: 'Project not found' });
75
+ }
76
+ // Prevent path traversal
77
+ const fullPath = path_1.default.join(project.path, filePath);
78
+ if (!fullPath.startsWith(project.path)) {
79
+ return res.status(403).json({ error: 'Access denied' });
80
+ }
81
+ const diffContent = await (0, status_1.getFileDiffContent)(project.path, filePath, staged);
82
+ res.json(diffContent);
83
+ }
84
+ catch (err) {
85
+ console.error('Error getting file diff content:', err);
86
+ res.status(500).json({ error: 'Failed to get file diff content' });
87
+ }
88
+ });
89
+ // Get content of a specific file (for untracked files)
90
+ router.get('/:projectId/file', (req, res) => {
91
+ try {
92
+ const projectId = parseInt(req.params.projectId, 10);
93
+ const filePath = req.query.path;
94
+ if (!filePath) {
95
+ return res.status(400).json({ error: 'File path is required' });
96
+ }
97
+ const project = (0, queries_1.getProjectById)(projectId);
98
+ if (!project) {
99
+ return res.status(404).json({ error: 'Project not found' });
100
+ }
101
+ // Prevent path traversal
102
+ const fullPath = path_1.default.join(project.path, filePath);
103
+ if (!fullPath.startsWith(project.path)) {
104
+ return res.status(403).json({ error: 'Access denied' });
105
+ }
106
+ // Check if file exists and is not too large
107
+ if (!fs_1.default.existsSync(fullPath)) {
108
+ return res.status(404).json({ error: 'File not found' });
109
+ }
110
+ const stat = fs_1.default.statSync(fullPath);
111
+ if (stat.isDirectory()) {
112
+ return res.json({ content: null, isDirectory: true });
113
+ }
114
+ if (stat.size > MAX_FILE_SIZE) {
115
+ return res.json({ content: null, tooLarge: true, size: stat.size });
116
+ }
117
+ // Check if it's a binary file (simple heuristic)
118
+ const buffer = Buffer.alloc(512);
119
+ const fd = fs_1.default.openSync(fullPath, 'r');
120
+ fs_1.default.readSync(fd, buffer, 0, 512, 0);
121
+ fs_1.default.closeSync(fd);
122
+ const isBinary = buffer.includes(0);
123
+ if (isBinary) {
124
+ return res.json({ content: null, isBinary: true });
125
+ }
126
+ const content = fs_1.default.readFileSync(fullPath, 'utf-8');
127
+ res.json({ content });
128
+ }
129
+ catch (err) {
130
+ console.error('Error reading file:', err);
131
+ res.status(500).json({ error: 'Failed to read file' });
132
+ }
133
+ });
134
+ exports.default = router;
135
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/routes/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"AAcA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA6JxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,149 @@
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
+ const express_1 = require("express");
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const queries_1 = require("../db/queries");
10
+ const dockerfile_1 = require("../docker/dockerfile");
11
+ const manager_1 = require("../docker/manager");
12
+ const router = (0, express_1.Router)();
13
+ // Get all projects
14
+ router.get('/', (_req, res) => {
15
+ try {
16
+ const projects = (0, queries_1.getAllProjects)();
17
+ // Update dockerfile status for each project
18
+ projects.forEach(project => {
19
+ const exists = (0, dockerfile_1.dockerfileExists)(project.path);
20
+ if (exists !== !!project.dockerfile_exists) {
21
+ (0, queries_1.updateProjectDockerfileStatus)(project.id, exists);
22
+ project.dockerfile_exists = exists ? 1 : 0;
23
+ }
24
+ });
25
+ res.json(projects);
26
+ }
27
+ catch (err) {
28
+ console.error('Error fetching projects:', err);
29
+ res.status(500).json({ error: 'Failed to fetch projects' });
30
+ }
31
+ });
32
+ // Get single project
33
+ router.get('/:id', (req, res) => {
34
+ try {
35
+ const id = parseInt(req.params.id, 10);
36
+ const project = (0, queries_1.getProjectById)(id);
37
+ if (!project) {
38
+ return res.status(404).json({ error: 'Project not found' });
39
+ }
40
+ // Update dockerfile status
41
+ const exists = (0, dockerfile_1.dockerfileExists)(project.path);
42
+ if (exists !== !!project.dockerfile_exists) {
43
+ (0, queries_1.updateProjectDockerfileStatus)(project.id, exists);
44
+ project.dockerfile_exists = exists ? 1 : 0;
45
+ }
46
+ res.json(project);
47
+ }
48
+ catch (err) {
49
+ console.error('Error fetching project:', err);
50
+ res.status(500).json({ error: 'Failed to fetch project' });
51
+ }
52
+ });
53
+ // Create new project
54
+ router.post('/', (req, res) => {
55
+ try {
56
+ const { path: projectPath, name } = req.body;
57
+ if (!projectPath) {
58
+ return res.status(400).json({ error: 'Path is required' });
59
+ }
60
+ // Validate path exists
61
+ if (!fs_1.default.existsSync(projectPath)) {
62
+ return res.status(400).json({ error: 'Path does not exist' });
63
+ }
64
+ // Use folder name as project name if not provided
65
+ const projectName = name || path_1.default.basename(projectPath);
66
+ const project = (0, queries_1.createProject)(projectName, projectPath);
67
+ // Check if dockerfile exists
68
+ const exists = (0, dockerfile_1.dockerfileExists)(projectPath);
69
+ if (exists) {
70
+ (0, queries_1.updateProjectDockerfileStatus)(project.id, true);
71
+ project.dockerfile_exists = 1;
72
+ }
73
+ res.status(201).json(project);
74
+ }
75
+ catch (err) {
76
+ const error = err;
77
+ console.error('Error creating project:', err);
78
+ if (error.code === 'SQLITE_CONSTRAINT_UNIQUE') {
79
+ return res.status(409).json({ error: 'Project with this path already exists' });
80
+ }
81
+ res.status(500).json({ error: 'Failed to create project' });
82
+ }
83
+ });
84
+ // Delete project
85
+ router.delete('/:id', (req, res) => {
86
+ try {
87
+ const id = parseInt(req.params.id, 10);
88
+ const deleted = (0, queries_1.deleteProject)(id);
89
+ if (!deleted) {
90
+ return res.status(404).json({ error: 'Project not found' });
91
+ }
92
+ res.status(204).send();
93
+ }
94
+ catch (err) {
95
+ console.error('Error deleting project:', err);
96
+ res.status(500).json({ error: 'Failed to delete project' });
97
+ }
98
+ });
99
+ // Get dockerfile status
100
+ router.get('/:id/dockerfile', (req, res) => {
101
+ try {
102
+ const id = parseInt(req.params.id, 10);
103
+ const project = (0, queries_1.getProjectById)(id);
104
+ if (!project) {
105
+ return res.status(404).json({ error: 'Project not found' });
106
+ }
107
+ const exists = (0, dockerfile_1.dockerfileExists)(project.path);
108
+ const content = exists ? (0, dockerfile_1.getDockerfileContent)(project.path) : null;
109
+ // Update status in DB if changed
110
+ if (exists !== !!project.dockerfile_exists) {
111
+ (0, queries_1.updateProjectDockerfileStatus)(project.id, exists);
112
+ }
113
+ res.json({ exists, content });
114
+ }
115
+ catch (err) {
116
+ console.error('Error checking dockerfile:', err);
117
+ res.status(500).json({ error: 'Failed to check dockerfile' });
118
+ }
119
+ });
120
+ // Generate dockerfile
121
+ router.post('/:id/generate-dockerfile', async (req, res) => {
122
+ try {
123
+ const id = parseInt(req.params.id, 10);
124
+ const project = (0, queries_1.getProjectById)(id);
125
+ if (!project) {
126
+ return res.status(404).json({ error: 'Project not found' });
127
+ }
128
+ // Generate dockerfile from template
129
+ (0, dockerfile_1.generateDockerfile)(project.path);
130
+ (0, queries_1.updateProjectDockerfileStatus)(project.id, true);
131
+ // Build the Docker image
132
+ try {
133
+ await (0, manager_1.buildProjectImage)(project.path, project.id);
134
+ }
135
+ catch (buildErr) {
136
+ console.error('Error building Docker image:', buildErr);
137
+ // Dockerfile was created, but image build failed - still return success
138
+ // The image will be built on first task run
139
+ }
140
+ const content = (0, dockerfile_1.getDockerfileContent)(project.path);
141
+ res.json({ exists: true, content });
142
+ }
143
+ catch (err) {
144
+ console.error('Error generating dockerfile:', err);
145
+ res.status(500).json({ error: 'Failed to generate dockerfile' });
146
+ }
147
+ });
148
+ exports.default = router;
149
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/routes/tasks.ts"],"names":[],"mappings":"AAsBA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAsWxB,eAAe,MAAM,CAAC"}