@saplo/cli 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 (96) hide show
  1. package/README.md +112 -0
  2. package/bin/dev.js +5 -0
  3. package/bin/run.js +5 -0
  4. package/dist/commands/deploy.d.ts +13 -0
  5. package/dist/commands/deploy.d.ts.map +1 -0
  6. package/dist/commands/deploy.js +206 -0
  7. package/dist/commands/deploy.js.map +1 -0
  8. package/dist/commands/domain/add.d.ts +13 -0
  9. package/dist/commands/domain/add.d.ts.map +1 -0
  10. package/dist/commands/domain/add.js +44 -0
  11. package/dist/commands/domain/add.js.map +1 -0
  12. package/dist/commands/domain/ls.d.ts +10 -0
  13. package/dist/commands/domain/ls.d.ts.map +1 -0
  14. package/dist/commands/domain/ls.js +32 -0
  15. package/dist/commands/domain/ls.js.map +1 -0
  16. package/dist/commands/domain/rm.d.ts +13 -0
  17. package/dist/commands/domain/rm.d.ts.map +1 -0
  18. package/dist/commands/domain/rm.js +29 -0
  19. package/dist/commands/domain/rm.js.map +1 -0
  20. package/dist/commands/env/index.d.ts +10 -0
  21. package/dist/commands/env/index.d.ts.map +1 -0
  22. package/dist/commands/env/index.js +34 -0
  23. package/dist/commands/env/index.js.map +1 -0
  24. package/dist/commands/env/pull.d.ts +12 -0
  25. package/dist/commands/env/pull.d.ts.map +1 -0
  26. package/dist/commands/env/pull.js +62 -0
  27. package/dist/commands/env/pull.js.map +1 -0
  28. package/dist/commands/env/rm.d.ts +14 -0
  29. package/dist/commands/env/rm.d.ts.map +1 -0
  30. package/dist/commands/env/rm.js +36 -0
  31. package/dist/commands/env/rm.js.map +1 -0
  32. package/dist/commands/env/set.d.ts +14 -0
  33. package/dist/commands/env/set.d.ts.map +1 -0
  34. package/dist/commands/env/set.js +47 -0
  35. package/dist/commands/env/set.js.map +1 -0
  36. package/dist/commands/init.d.ts +13 -0
  37. package/dist/commands/init.d.ts.map +1 -0
  38. package/dist/commands/init.js +144 -0
  39. package/dist/commands/init.js.map +1 -0
  40. package/dist/commands/link.d.ts +10 -0
  41. package/dist/commands/link.d.ts.map +1 -0
  42. package/dist/commands/link.js +86 -0
  43. package/dist/commands/link.js.map +1 -0
  44. package/dist/commands/login.d.ts +12 -0
  45. package/dist/commands/login.d.ts.map +1 -0
  46. package/dist/commands/login.js +83 -0
  47. package/dist/commands/login.js.map +1 -0
  48. package/dist/commands/logs.d.ts +13 -0
  49. package/dist/commands/logs.d.ts.map +1 -0
  50. package/dist/commands/logs.js +63 -0
  51. package/dist/commands/logs.js.map +1 -0
  52. package/dist/commands/open.d.ts +10 -0
  53. package/dist/commands/open.d.ts.map +1 -0
  54. package/dist/commands/open.js +42 -0
  55. package/dist/commands/open.js.map +1 -0
  56. package/dist/commands/rollback.d.ts +16 -0
  57. package/dist/commands/rollback.d.ts.map +1 -0
  58. package/dist/commands/rollback.js +51 -0
  59. package/dist/commands/rollback.js.map +1 -0
  60. package/dist/commands/status.d.ts +10 -0
  61. package/dist/commands/status.d.ts.map +1 -0
  62. package/dist/commands/status.js +63 -0
  63. package/dist/commands/status.js.map +1 -0
  64. package/dist/commands/whoami.d.ts +7 -0
  65. package/dist/commands/whoami.d.ts.map +1 -0
  66. package/dist/commands/whoami.js +26 -0
  67. package/dist/commands/whoami.js.map +1 -0
  68. package/dist/index.d.ts +2 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +2 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/lib/api.d.ts +68 -0
  73. package/dist/lib/api.d.ts.map +1 -0
  74. package/dist/lib/api.js +117 -0
  75. package/dist/lib/api.js.map +1 -0
  76. package/dist/lib/config.d.ts +16 -0
  77. package/dist/lib/config.d.ts.map +1 -0
  78. package/dist/lib/config.js +74 -0
  79. package/dist/lib/config.js.map +1 -0
  80. package/dist/lib/detect.d.ts +9 -0
  81. package/dist/lib/detect.d.ts.map +1 -0
  82. package/dist/lib/detect.js +293 -0
  83. package/dist/lib/detect.js.map +1 -0
  84. package/dist/lib/packager.d.ts +18 -0
  85. package/dist/lib/packager.d.ts.map +1 -0
  86. package/dist/lib/packager.js +139 -0
  87. package/dist/lib/packager.js.map +1 -0
  88. package/dist/lib/saplo-config.d.ts +50 -0
  89. package/dist/lib/saplo-config.d.ts.map +1 -0
  90. package/dist/lib/saplo-config.js +203 -0
  91. package/dist/lib/saplo-config.js.map +1 -0
  92. package/dist/lib/ws-logs.d.ts +6 -0
  93. package/dist/lib/ws-logs.d.ts.map +1 -0
  94. package/dist/lib/ws-logs.js +112 -0
  95. package/dist/lib/ws-logs.js.map +1 -0
  96. package/package.json +80 -0
@@ -0,0 +1,74 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ const SAPLO_DIR = join(homedir(), '.saplo');
5
+ const GLOBAL_CONFIG_PATH = join(SAPLO_DIR, 'config.json');
6
+ const DEFAULT_API_URL = 'https://api.saplo.pl';
7
+ // Old default that used to be stored in config files - treat as stale
8
+ const LEGACY_API_URL = 'https://panel.saplo.pl';
9
+ export function getGlobalConfig() {
10
+ if (!existsSync(GLOBAL_CONFIG_PATH)) {
11
+ return { api_url: DEFAULT_API_URL };
12
+ }
13
+ try {
14
+ const raw = readFileSync(GLOBAL_CONFIG_PATH, 'utf-8');
15
+ const stored = JSON.parse(raw);
16
+ // Migrate: if the stored api_url still points to the old panel host, replace it with the new default
17
+ if (!stored.api_url || stored.api_url === LEGACY_API_URL) {
18
+ stored.api_url = DEFAULT_API_URL;
19
+ }
20
+ return stored;
21
+ }
22
+ catch {
23
+ return { api_url: DEFAULT_API_URL };
24
+ }
25
+ }
26
+ export function saveGlobalConfig(config) {
27
+ if (!existsSync(SAPLO_DIR)) {
28
+ mkdirSync(SAPLO_DIR, { recursive: true, mode: 0o700 });
29
+ }
30
+ const existing = getGlobalConfig();
31
+ const merged = { ...existing, ...config, api_url: config.api_url ?? existing.api_url ?? DEFAULT_API_URL };
32
+ writeFileSync(GLOBAL_CONFIG_PATH, JSON.stringify(merged, null, 2), 'utf-8');
33
+ chmodSync(GLOBAL_CONFIG_PATH, 0o600);
34
+ }
35
+ export function clearToken() {
36
+ const config = getGlobalConfig();
37
+ delete config.token;
38
+ saveGlobalConfig(config);
39
+ }
40
+ export function getProjectConfig(cwd = process.cwd()) {
41
+ const path = join(cwd, '.saplo', 'project.json');
42
+ if (!existsSync(path))
43
+ return null;
44
+ try {
45
+ const raw = readFileSync(path, 'utf-8');
46
+ return JSON.parse(raw);
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ export function saveProjectConfig(config, cwd = process.cwd()) {
53
+ const dir = join(cwd, '.saplo');
54
+ if (!existsSync(dir)) {
55
+ mkdirSync(dir, { recursive: true });
56
+ }
57
+ const path = join(dir, 'project.json');
58
+ writeFileSync(path, JSON.stringify(config, null, 2), 'utf-8');
59
+ }
60
+ export function requireToken() {
61
+ const config = getGlobalConfig();
62
+ if (!config.token) {
63
+ throw new Error('Not logged in. Run: saplo login');
64
+ }
65
+ return config.token;
66
+ }
67
+ export function requireProjectConfig(cwd = process.cwd()) {
68
+ const config = getProjectConfig(cwd);
69
+ if (!config) {
70
+ throw new Error('No project linked. Run: saplo link or saplo init');
71
+ }
72
+ return config;
73
+ }
74
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { SaploConfig, Stack } from './saplo-config.js';
2
+ export interface DetectionResult {
3
+ stack: Stack;
4
+ config: Partial<SaploConfig>;
5
+ notes: string[];
6
+ }
7
+ export declare function detectStack(cwd: string): Stack | null;
8
+ export declare function detectProject(cwd: string, stack: Stack): DetectionResult;
9
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,WAAW,EAAE,KAAK,EAAC,MAAM,mBAAmB,CAAA;AAYzD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,CAAA;IACZ,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAkDD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAoBrD;AAuBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,eAAe,CA8LxE"}
@@ -0,0 +1,293 @@
1
+ // Autodetekcja projektu - skanuje katalog i generuje gotowy do deployu config.
2
+ // Cel: `saplo init` ma wyprodukowac dzialajacy saplo.yaml bez recznych poprawek.
3
+ import { randomBytes } from 'node:crypto';
4
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ // Losowy klucz dla DJANGO_SECRET_KEY - bez tego Django z DEBUG=False
7
+ // rzuca blad startu. 50 znakow z bezpiecznego alfabetu.
8
+ function generateDjangoSecretKey() {
9
+ const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
10
+ const bytes = randomBytes(50);
11
+ let key = '';
12
+ for (let i = 0; i < 50; i++)
13
+ key += chars[bytes[i] % chars.length];
14
+ return key;
15
+ }
16
+ function readPackageJson(cwd) {
17
+ try {
18
+ return JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf-8'));
19
+ }
20
+ catch {
21
+ return {};
22
+ }
23
+ }
24
+ function detectPackageManager(cwd) {
25
+ if (existsSync(join(cwd, 'pnpm-lock.yaml')))
26
+ return 'pnpm';
27
+ if (existsSync(join(cwd, 'yarn.lock')))
28
+ return 'yarn';
29
+ return 'npm';
30
+ }
31
+ function pmInstall(pm) {
32
+ if (pm === 'pnpm')
33
+ return 'pnpm install --frozen-lockfile';
34
+ if (pm === 'yarn')
35
+ return 'yarn install --frozen-lockfile';
36
+ return 'npm ci';
37
+ }
38
+ function pmRun(pm, script) {
39
+ if (pm === 'npm')
40
+ return `npm run ${script}`;
41
+ return `${pm} ${script}`;
42
+ }
43
+ // Django: znajdz katalog projektu zawierajacy wsgi.py (modul WSGI).
44
+ function detectDjangoWsgiModule(cwd) {
45
+ try {
46
+ for (const entry of readdirSync(cwd)) {
47
+ const full = join(cwd, entry);
48
+ if (!statSync(full).isDirectory())
49
+ continue;
50
+ if (existsSync(join(full, 'wsgi.py')))
51
+ return entry;
52
+ }
53
+ }
54
+ catch {
55
+ // ignoruj bledy odczytu katalogu
56
+ }
57
+ return null;
58
+ }
59
+ // Auto-wykrycie stacka na podstawie plikow w katalogu.
60
+ export function detectStack(cwd) {
61
+ if (existsSync(join(cwd, 'manage.py')))
62
+ return 'django';
63
+ if (existsSync(join(cwd, 'Dockerfile')))
64
+ return 'docker';
65
+ if (existsSync(join(cwd, 'package.json'))) {
66
+ const pkg = readPackageJson(cwd);
67
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
68
+ if (deps.next)
69
+ return 'nextjs';
70
+ if (deps.nuxt)
71
+ return 'nuxt';
72
+ if (deps['@sveltejs/kit'])
73
+ return 'sveltekit';
74
+ if (deps.astro)
75
+ return 'astro';
76
+ if (deps['@angular/core'])
77
+ return 'angular';
78
+ if (deps.vue || deps['@vue/cli-service'])
79
+ return 'vue';
80
+ if (deps.react || deps['react-dom'] || deps['react-scripts'])
81
+ return 'react';
82
+ if (deps.vite)
83
+ return 'static';
84
+ return 'node';
85
+ }
86
+ if (existsSync(join(cwd, 'index.html')))
87
+ return 'static';
88
+ return null;
89
+ }
90
+ // Wykryj output dir buildu frontendu (Vite=dist, CRA=build).
91
+ function detectFrontendOutput(cwd, pkg) {
92
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
93
+ if (deps['react-scripts'])
94
+ return 'build';
95
+ if (existsSync(join(cwd, 'vite.config.ts')) || existsSync(join(cwd, 'vite.config.js')) || deps.vite)
96
+ return 'dist';
97
+ return 'dist';
98
+ }
99
+ // Wykryj port z EXPOSE w Dockerfile.
100
+ function detectDockerPort(cwd) {
101
+ try {
102
+ const df = readFileSync(join(cwd, 'Dockerfile'), 'utf-8');
103
+ const m = df.match(/^\s*EXPOSE\s+(\d+)/im);
104
+ if (m)
105
+ return parseInt(m[1], 10);
106
+ }
107
+ catch {
108
+ // brak Dockerfile lub blad odczytu
109
+ }
110
+ return 8080;
111
+ }
112
+ // Glowna funkcja - zwraca gotowy config dla wykrytego/wybranego stacka.
113
+ export function detectProject(cwd, stack) {
114
+ const notes = [];
115
+ if (stack === 'django') {
116
+ const wsgiModule = detectDjangoWsgiModule(cwd);
117
+ const hasRequirements = existsSync(join(cwd, 'requirements.txt'));
118
+ const install = hasRequirements
119
+ ? 'pip install -r requirements.txt'
120
+ : 'pip install django gunicorn';
121
+ if (wsgiModule) {
122
+ notes.push(`Wykryto modul Django WSGI: ${wsgiModule}`);
123
+ }
124
+ else {
125
+ notes.push('Nie znaleziono */wsgi.py - popraw start.command recznie');
126
+ }
127
+ if (!hasRequirements) {
128
+ notes.push('Brak requirements.txt - install ustawiony na minimalny (django gunicorn)');
129
+ }
130
+ notes.push('Wygenerowano DJANGO_SECRET_KEY (env). Produkcyjnie przenies: saplo env set');
131
+ return {
132
+ stack,
133
+ notes,
134
+ config: {
135
+ runtime: { python: '3.13' },
136
+ build: {
137
+ install,
138
+ command: 'python manage.py collectstatic --noinput && python manage.py migrate --noinput',
139
+ },
140
+ start: {
141
+ command: `gunicorn ${wsgiModule ?? 'PROJEKT'}.wsgi:application -b 0.0.0.0:8000 -w 3`,
142
+ port: 8000,
143
+ healthcheck: '/',
144
+ },
145
+ env: {
146
+ DJANGO_DEBUG: 'False',
147
+ DJANGO_ALLOWED_HOSTS: '*',
148
+ DJANGO_SECRET_KEY: generateDjangoSecretKey(),
149
+ },
150
+ },
151
+ };
152
+ }
153
+ if (stack === 'nextjs') {
154
+ const pm = detectPackageManager(cwd);
155
+ const pkg = readPackageJson(cwd);
156
+ const hasStart = Boolean(pkg.scripts?.start);
157
+ notes.push(`Menedzer pakietow: ${pm}`);
158
+ if (!hasStart)
159
+ notes.push('Brak skryptu "start" w package.json - uzyto "next start"');
160
+ return {
161
+ stack,
162
+ notes,
163
+ config: {
164
+ runtime: { node: '22' },
165
+ build: { install: pmInstall(pm), command: pmRun(pm, 'build'), output: '.next' },
166
+ start: {
167
+ command: hasStart ? pmRun(pm, 'start') : 'npx next start -p 3000',
168
+ port: 3000,
169
+ healthcheck: '/',
170
+ },
171
+ env: {},
172
+ },
173
+ };
174
+ }
175
+ if (stack === 'react' || stack === 'static') {
176
+ const pm = detectPackageManager(cwd);
177
+ const pkg = readPackageJson(cwd);
178
+ const output = detectFrontendOutput(cwd, pkg);
179
+ notes.push(`Menedzer pakietow: ${pm}, katalog wyjsciowy: ${output}`);
180
+ return {
181
+ stack,
182
+ notes,
183
+ config: {
184
+ runtime: { node: '22' },
185
+ build: { install: pmInstall(pm), command: pmRun(pm, 'build'), output },
186
+ start: { port: 80 },
187
+ env: {},
188
+ },
189
+ };
190
+ }
191
+ if (stack === 'astro') {
192
+ const pm = detectPackageManager(cwd);
193
+ notes.push(`Menedzer pakietow: ${pm}`);
194
+ return {
195
+ stack,
196
+ notes,
197
+ config: {
198
+ runtime: { node: '22' },
199
+ build: { install: pmInstall(pm), command: pmRun(pm, 'build'), output: 'dist' },
200
+ start: { port: 80 },
201
+ env: {},
202
+ },
203
+ };
204
+ }
205
+ if (stack === 'angular') {
206
+ const pm = detectPackageManager(cwd);
207
+ notes.push(`Menedzer pakietow: ${pm} - Angular SPA (build statyczny)`);
208
+ return {
209
+ stack,
210
+ notes,
211
+ config: {
212
+ runtime: { node: '22' },
213
+ build: { install: pmInstall(pm), command: pmRun(pm, 'build') },
214
+ start: { port: 80 },
215
+ env: {},
216
+ },
217
+ };
218
+ }
219
+ if (stack === 'vue') {
220
+ const pm = detectPackageManager(cwd);
221
+ notes.push(`Menedzer pakietow: ${pm} - Vue/Vite SPA, build statyczny`);
222
+ return {
223
+ stack,
224
+ notes,
225
+ config: {
226
+ runtime: { node: '22' },
227
+ build: { install: pmInstall(pm), command: pmRun(pm, 'build'), output: 'dist' },
228
+ start: { port: 80 },
229
+ env: {},
230
+ },
231
+ };
232
+ }
233
+ if (stack === 'nuxt') {
234
+ const pm = detectPackageManager(cwd);
235
+ notes.push(`Menedzer pakietow: ${pm} - Nuxt 3 (Node SSR)`);
236
+ return {
237
+ stack,
238
+ notes,
239
+ config: {
240
+ runtime: { node: '22' },
241
+ build: { install: pmInstall(pm), command: pmRun(pm, 'build'), output: '.output' },
242
+ start: { command: 'node .output/server/index.mjs', port: 3000, healthcheck: '/' },
243
+ env: {},
244
+ },
245
+ };
246
+ }
247
+ if (stack === 'sveltekit') {
248
+ const pm = detectPackageManager(cwd);
249
+ notes.push(`Menedzer pakietow: ${pm} - SvelteKit (wymaga @sveltejs/adapter-node)`);
250
+ return {
251
+ stack,
252
+ notes,
253
+ config: {
254
+ runtime: { node: '22' },
255
+ build: { install: pmInstall(pm), command: pmRun(pm, 'build'), output: 'build' },
256
+ start: { command: 'node build/index.js', port: 3000, healthcheck: '/' },
257
+ env: {},
258
+ },
259
+ };
260
+ }
261
+ if (stack === 'node') {
262
+ const pm = detectPackageManager(cwd);
263
+ const pkg = readPackageJson(cwd);
264
+ const entry = pkg.main ?? 'index.js';
265
+ const startCmd = pkg.scripts?.start ? pmRun(pm, 'start') : `node ${entry}`;
266
+ notes.push(`Menedzer pakietow: ${pm}, start: ${startCmd}`);
267
+ return {
268
+ stack,
269
+ notes,
270
+ config: {
271
+ runtime: { node: '22' },
272
+ build: { install: pmInstall(pm), ...(pkg.scripts?.build ? { command: pmRun(pm, 'build') } : {}) },
273
+ start: { command: startCmd, port: 3000, healthcheck: '/' },
274
+ env: {},
275
+ },
276
+ };
277
+ }
278
+ if (stack === 'docker') {
279
+ const port = detectDockerPort(cwd);
280
+ notes.push(`Port z Dockerfile EXPOSE: ${port}`);
281
+ return {
282
+ stack,
283
+ notes,
284
+ config: {
285
+ build: {},
286
+ start: { port, healthcheck: '/' },
287
+ env: {},
288
+ },
289
+ };
290
+ }
291
+ return { stack, notes, config: {} };
292
+ }
293
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ declare const DEFAULT_IGNORE: string[];
2
+ declare const BUILD_OUTPUT_IGNORE: string[];
3
+ declare const ARCHIVE_IGNORE: string[];
4
+ declare function parseIgnoreFile(content: string): string[];
5
+ declare function matchesPattern(relativePath: string, pattern: string): boolean;
6
+ declare function shouldIgnore(relativePath: string, ignorePatterns: string[]): boolean;
7
+ export interface PackageResult {
8
+ tarballPath: string;
9
+ fileCount: number;
10
+ sizeBytes: number;
11
+ }
12
+ export interface PackageOptions {
13
+ prebuilt?: boolean;
14
+ }
15
+ export declare function packageDirectory(cwd?: string, opts?: PackageOptions): Promise<PackageResult>;
16
+ export declare function formatSize(bytes: number): string;
17
+ export { parseIgnoreFile, matchesPattern, shouldIgnore, DEFAULT_IGNORE, BUILD_OUTPUT_IGNORE, ARCHIVE_IGNORE };
18
+ //# sourceMappingURL=packager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packager.d.ts","sourceRoot":"","sources":["../../src/lib/packager.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,cAAc,UAsBnB,CAAA;AAGD,QAAA,MAAM,mBAAmB,UAOxB,CAAA;AAGD,QAAA,MAAM,cAAc,UAMnB,CAAA;AAED,iBAAS,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKlD;AAUD,iBAAS,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAwBtE;AAED,iBAAS,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAK7E;AAuBD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAsB,gBAAgB,CAAC,GAAG,GAAE,MAAsB,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA8BjH;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAGD,OAAO,EAAC,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAC,CAAA"}
@@ -0,0 +1,139 @@
1
+ import { existsSync, readFileSync, statSync } from 'node:fs';
2
+ import { join, relative, sep } from 'node:path';
3
+ import { tmpdir } from 'node:os';
4
+ import { randomBytes } from 'node:crypto';
5
+ import { readdir } from 'node:fs/promises';
6
+ import * as tar from 'tar';
7
+ const DEFAULT_IGNORE = [
8
+ 'node_modules',
9
+ '.git',
10
+ '.env',
11
+ '.env.local',
12
+ '.env.*.local',
13
+ '.env.development',
14
+ '.env.production',
15
+ '.env.test',
16
+ '*.log',
17
+ '.DS_Store',
18
+ '__pycache__',
19
+ '*.pyc',
20
+ '.venv',
21
+ 'venv',
22
+ '.tox',
23
+ 'coverage',
24
+ '.nyc_output',
25
+ '.cache',
26
+ 'tmp',
27
+ '.tmp',
28
+ 'saplo-cli',
29
+ ];
30
+ // Katalogi outputu buildu - ignorowane domyslnie, ale NIE przy prebuilt deploy.
31
+ const BUILD_OUTPUT_IGNORE = [
32
+ 'dist',
33
+ 'build',
34
+ '.next',
35
+ '.output',
36
+ '.svelte-kit',
37
+ '.astro',
38
+ ];
39
+ // Archiwa - ignorowane zawsze (nawet przy prebuilt).
40
+ const ARCHIVE_IGNORE = [
41
+ '*.zip',
42
+ '*.tar',
43
+ '*.tar.gz',
44
+ '*.tgz',
45
+ '.saplo',
46
+ ];
47
+ function parseIgnoreFile(content) {
48
+ return content
49
+ .split('\n')
50
+ .map((line) => line.trim())
51
+ .filter((line) => line && !line.startsWith('#'));
52
+ }
53
+ function loadSaploIgnore(cwd) {
54
+ const path = join(cwd, '.saploignore');
55
+ if (existsSync(path)) {
56
+ return parseIgnoreFile(readFileSync(path, 'utf-8'));
57
+ }
58
+ return [];
59
+ }
60
+ function matchesPattern(relativePath, pattern) {
61
+ // Normalize separators
62
+ const normPath = relativePath.split(sep).join('/');
63
+ // Wzorce glob "*.ext" - dopasuj WYLACZNIE po koncowce pliku.
64
+ // Wczesniej dodatkowe includes('/ext') bledne lapalo np. login.html
65
+ // dla wzorca *.log (bo '/login.html' zawiera '/log') - pomijalo pliki.
66
+ if (pattern.startsWith('*.')) {
67
+ const ext = pattern.slice(1);
68
+ return normPath.endsWith(ext);
69
+ }
70
+ // Handle directory prefix patterns (e.g. ".next/cache")
71
+ if (normPath === pattern || normPath.startsWith(pattern + '/')) {
72
+ return true;
73
+ }
74
+ // Match any path segment
75
+ const parts = normPath.split('/');
76
+ for (const part of parts) {
77
+ if (part === pattern)
78
+ return true;
79
+ }
80
+ return false;
81
+ }
82
+ function shouldIgnore(relativePath, ignorePatterns) {
83
+ for (const pattern of ignorePatterns) {
84
+ if (matchesPattern(relativePath, pattern))
85
+ return true;
86
+ }
87
+ return false;
88
+ }
89
+ async function collectFiles(dir, base, ignorePatterns) {
90
+ const entries = await readdir(dir, { withFileTypes: true });
91
+ const files = [];
92
+ for (const entry of entries) {
93
+ const fullPath = join(dir, entry.name);
94
+ const relPath = relative(base, fullPath);
95
+ if (shouldIgnore(relPath, ignorePatterns))
96
+ continue;
97
+ if (entry.isDirectory()) {
98
+ const subFiles = await collectFiles(fullPath, base, ignorePatterns);
99
+ files.push(...subFiles);
100
+ }
101
+ else if (entry.isFile() || entry.isSymbolicLink()) {
102
+ files.push(relPath);
103
+ }
104
+ }
105
+ return files;
106
+ }
107
+ export async function packageDirectory(cwd = process.cwd(), opts) {
108
+ const userIgnore = loadSaploIgnore(cwd);
109
+ const ignorePatterns = [
110
+ ...DEFAULT_IGNORE,
111
+ ...(opts?.prebuilt ? [] : BUILD_OUTPUT_IGNORE),
112
+ ...ARCHIVE_IGNORE,
113
+ ...userIgnore,
114
+ ];
115
+ const files = await collectFiles(cwd, cwd, ignorePatterns);
116
+ const tmpPath = join(tmpdir(), `saplo-${randomBytes(8).toString('hex')}.tar.gz`);
117
+ await tar.create({
118
+ gzip: true,
119
+ file: tmpPath,
120
+ cwd,
121
+ portable: true,
122
+ }, files);
123
+ const stat = statSync(tmpPath);
124
+ return {
125
+ tarballPath: tmpPath,
126
+ fileCount: files.length,
127
+ sizeBytes: stat.size,
128
+ };
129
+ }
130
+ export function formatSize(bytes) {
131
+ if (bytes < 1024)
132
+ return `${bytes} B`;
133
+ if (bytes < 1024 * 1024)
134
+ return `${(bytes / 1024).toFixed(1)} KB`;
135
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
136
+ }
137
+ // Re-export for testing
138
+ export { parseIgnoreFile, matchesPattern, shouldIgnore, DEFAULT_IGNORE, BUILD_OUTPUT_IGNORE, ARCHIVE_IGNORE };
139
+ //# sourceMappingURL=packager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packager.js","sourceRoot":"","sources":["../../src/lib/packager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ export type Stack = 'nextjs' | 'react' | 'vue' | 'nuxt' | 'sveltekit' | 'django' | 'static' | 'docker' | 'node' | 'astro' | 'angular';
2
+ export interface SaploConfig {
3
+ version: number;
4
+ name: string;
5
+ stack: Stack;
6
+ app_id?: number;
7
+ runtime?: {
8
+ node?: string;
9
+ python?: string;
10
+ php?: string;
11
+ };
12
+ build?: {
13
+ install?: string;
14
+ command?: string;
15
+ output?: string;
16
+ cache?: string[];
17
+ };
18
+ start?: {
19
+ command?: string;
20
+ port?: number;
21
+ healthcheck?: string;
22
+ workers?: number;
23
+ };
24
+ env?: Record<string, string>;
25
+ domains?: string[];
26
+ hooks?: {
27
+ pre_build?: string;
28
+ post_deploy?: string;
29
+ };
30
+ branches?: {
31
+ production?: string;
32
+ preview?: string;
33
+ };
34
+ resources?: {
35
+ ram_mb?: number;
36
+ ssd_gb?: number;
37
+ };
38
+ }
39
+ export declare class ConfigValidationError extends Error {
40
+ readonly field?: string | undefined;
41
+ constructor(message: string, field?: string | undefined);
42
+ }
43
+ export declare function parseSaploConfig(content: string): SaploConfig;
44
+ export declare function loadSaploConfig(cwd?: string): SaploConfig;
45
+ export declare function generateSaploYaml(config: Partial<SaploConfig> & {
46
+ name: string;
47
+ stack: Stack;
48
+ }): string;
49
+ export declare function getStackDefaults(stack: Stack): Partial<SaploConfig>;
50
+ //# sourceMappingURL=saplo-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saplo-config.d.ts","sourceRoot":"","sources":["../../src/lib/saplo-config.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;AAErI,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,KAAK,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CAAA;IAED,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KACjB,CAAA;IAED,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,CAAA;IAED,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAElB,KAAK,CAAC,EAAE;QACN,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;IAED,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,CAAA;IAED,SAAS,CAAC,EAAE;QACV,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAID,qBAAa,qBAAsB,SAAQ,KAAK;aAG5B,KAAK,CAAC,EAAE,MAAM;gBAD9B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,MAAM,YAAA;CAKjC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAmF7D;AAED,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAsB,GAAG,WAAW,CASxE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAC,GAAG,MAAM,CAsDrG;AAyDD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAEnE"}