@better-openclaw/core 1.0.23 → 1.0.25
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.
- package/dist/addon-stack.cjs +673 -0
- package/dist/addon-stack.cjs.map +1 -0
- package/dist/addon-stack.d.cts +23 -0
- package/dist/addon-stack.d.cts.map +1 -0
- package/dist/addon-stack.d.mts +23 -0
- package/dist/addon-stack.d.mts.map +1 -0
- package/dist/addon-stack.mjs +671 -0
- package/dist/addon-stack.mjs.map +1 -0
- package/dist/addon-stack.test.cjs +349 -0
- package/dist/addon-stack.test.cjs.map +1 -0
- package/dist/addon-stack.test.d.cts +1 -0
- package/dist/addon-stack.test.d.mts +1 -0
- package/dist/addon-stack.test.mjs +349 -0
- package/dist/addon-stack.test.mjs.map +1 -0
- package/dist/bare-metal-partition.test.cjs +20 -21
- package/dist/bare-metal-partition.test.cjs.map +1 -1
- package/dist/bare-metal-partition.test.mjs +4 -5
- package/dist/bare-metal-partition.test.mjs.map +1 -1
- package/dist/composer.cjs +17 -1
- package/dist/composer.cjs.map +1 -1
- package/dist/composer.d.cts +24 -1
- package/dist/composer.d.cts.map +1 -1
- package/dist/composer.d.mts +24 -1
- package/dist/composer.d.mts.map +1 -1
- package/dist/composer.mjs +14 -2
- package/dist/composer.mjs.map +1 -1
- package/dist/composer.snapshot.test.cjs +20 -20
- package/dist/composer.snapshot.test.cjs.map +1 -1
- package/dist/composer.snapshot.test.mjs +2 -2
- package/dist/composer.test.cjs +53 -52
- package/dist/composer.test.cjs.map +1 -1
- package/dist/composer.test.mjs +4 -3
- package/dist/composer.test.mjs.map +1 -1
- package/dist/deployers/strip-host-ports.test.cjs +26 -26
- package/dist/deployers/strip-host-ports.test.cjs.map +1 -1
- package/dist/deployers/strip-host-ports.test.mjs +1 -1
- package/dist/generate.cjs +8 -4
- package/dist/generate.cjs.map +1 -1
- package/dist/generate.d.cts.map +1 -1
- package/dist/generate.d.mts.map +1 -1
- package/dist/generate.mjs +9 -5
- package/dist/generate.mjs.map +1 -1
- package/dist/generate.test.cjs +55 -55
- package/dist/generate.test.cjs.map +1 -1
- package/dist/generate.test.mjs +2 -2
- package/dist/generate.test.mjs.map +1 -1
- package/dist/generators/bare-metal-install.test.cjs +18 -18
- package/dist/generators/bare-metal-install.test.cjs.map +1 -1
- package/dist/generators/bare-metal-install.test.mjs +1 -1
- package/dist/generators/caddy.test.cjs +13 -13
- package/dist/generators/caddy.test.cjs.map +1 -1
- package/dist/generators/caddy.test.mjs +1 -1
- package/dist/generators/clone-repos.cjs +140 -0
- package/dist/generators/clone-repos.cjs.map +1 -0
- package/dist/generators/clone-repos.d.cts +11 -0
- package/dist/generators/clone-repos.d.cts.map +1 -0
- package/dist/generators/clone-repos.d.mts +11 -0
- package/dist/generators/clone-repos.d.mts.map +1 -0
- package/dist/generators/clone-repos.mjs +139 -0
- package/dist/generators/clone-repos.mjs.map +1 -0
- package/dist/generators/clone-repos.test.cjs +140 -0
- package/dist/generators/clone-repos.test.cjs.map +1 -0
- package/dist/generators/clone-repos.test.d.cts +1 -0
- package/dist/generators/clone-repos.test.d.mts +1 -0
- package/dist/generators/clone-repos.test.mjs +141 -0
- package/dist/generators/clone-repos.test.mjs.map +1 -0
- package/dist/generators/env.test.cjs +17 -17
- package/dist/generators/env.test.cjs.map +1 -1
- package/dist/generators/env.test.mjs +1 -1
- package/dist/generators/health-check.test.cjs +39 -39
- package/dist/generators/health-check.test.cjs.map +1 -1
- package/dist/generators/health-check.test.mjs +1 -1
- package/dist/generators/postgres-init.cjs +20 -0
- package/dist/generators/postgres-init.cjs.map +1 -1
- package/dist/generators/postgres-init.d.cts.map +1 -1
- package/dist/generators/postgres-init.d.mts.map +1 -1
- package/dist/generators/postgres-init.mjs +20 -0
- package/dist/generators/postgres-init.mjs.map +1 -1
- package/dist/generators/scripts.cjs +332 -3
- package/dist/generators/scripts.cjs.map +1 -1
- package/dist/generators/scripts.d.cts +3 -1
- package/dist/generators/scripts.d.cts.map +1 -1
- package/dist/generators/scripts.d.mts +3 -1
- package/dist/generators/scripts.d.mts.map +1 -1
- package/dist/generators/scripts.mjs +332 -3
- package/dist/generators/scripts.mjs.map +1 -1
- package/dist/generators/scripts.test.cjs +57 -23
- package/dist/generators/scripts.test.cjs.map +1 -1
- package/dist/generators/scripts.test.mjs +39 -5
- package/dist/generators/scripts.test.mjs.map +1 -1
- package/dist/generators/stack-manifest.cjs +1 -0
- package/dist/generators/stack-manifest.cjs.map +1 -1
- package/dist/generators/stack-manifest.d.cts +3 -2
- package/dist/generators/stack-manifest.d.cts.map +1 -1
- package/dist/generators/stack-manifest.d.mts +3 -2
- package/dist/generators/stack-manifest.d.mts.map +1 -1
- package/dist/generators/stack-manifest.mjs +1 -0
- package/dist/generators/stack-manifest.mjs.map +1 -1
- package/dist/generators/traefik.test.cjs +32 -32
- package/dist/generators/traefik.test.cjs.map +1 -1
- package/dist/generators/traefik.test.mjs +1 -1
- package/dist/index.cjs +28 -5
- package/dist/index.d.cts +7 -4
- package/dist/index.d.mts +7 -4
- package/dist/index.mjs +10 -7
- package/dist/migrations.test.cjs +16 -16
- package/dist/migrations.test.cjs.map +1 -1
- package/dist/migrations.test.mjs +1 -1
- package/dist/presets/registry.cjs.map +1 -1
- package/dist/presets/registry.d.cts.map +1 -1
- package/dist/presets/registry.d.mts.map +1 -1
- package/dist/presets/registry.mjs.map +1 -1
- package/dist/presets/registry.test.cjs +14 -14
- package/dist/presets/registry.test.cjs.map +1 -1
- package/dist/presets/registry.test.mjs +1 -1
- package/dist/resolver.cjs +8 -0
- package/dist/resolver.cjs.map +1 -1
- package/dist/resolver.mjs +9 -1
- package/dist/resolver.mjs.map +1 -1
- package/dist/resolver.test.cjs +125 -90
- package/dist/resolver.test.cjs.map +1 -1
- package/dist/resolver.test.mjs +47 -12
- package/dist/resolver.test.mjs.map +1 -1
- package/dist/{schema-B4c64P8N.d.cts → schema-CKBRu-Rt.d.cts} +355 -8
- package/dist/schema-CKBRu-Rt.d.cts.map +1 -0
- package/dist/{schema-CXNhYci1.d.mts → schema-Dn-_Jpb6.d.mts} +355 -8
- package/dist/schema-Dn-_Jpb6.d.mts.map +1 -0
- package/dist/schema.cjs +160 -5
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +2 -2
- package/dist/schema.d.mts +2 -2
- package/dist/schema.mjs +150 -6
- package/dist/schema.mjs.map +1 -1
- package/dist/schema.test.cjs +86 -86
- package/dist/schema.test.cjs.map +1 -1
- package/dist/schema.test.mjs +1 -1
- package/dist/services/definitions/apptension-saas.cjs +87 -0
- package/dist/services/definitions/apptension-saas.cjs.map +1 -0
- package/dist/services/definitions/apptension-saas.d.cts +7 -0
- package/dist/services/definitions/apptension-saas.d.cts.map +1 -0
- package/dist/services/definitions/apptension-saas.d.mts +7 -0
- package/dist/services/definitions/apptension-saas.d.mts.map +1 -0
- package/dist/services/definitions/apptension-saas.mjs +86 -0
- package/dist/services/definitions/apptension-saas.mjs.map +1 -0
- package/dist/services/definitions/boxyhq-saas.cjs +88 -0
- package/dist/services/definitions/boxyhq-saas.cjs.map +1 -0
- package/dist/services/definitions/boxyhq-saas.d.cts +7 -0
- package/dist/services/definitions/boxyhq-saas.d.cts.map +1 -0
- package/dist/services/definitions/boxyhq-saas.d.mts +7 -0
- package/dist/services/definitions/boxyhq-saas.d.mts.map +1 -0
- package/dist/services/definitions/boxyhq-saas.mjs +87 -0
- package/dist/services/definitions/boxyhq-saas.mjs.map +1 -0
- package/dist/services/definitions/browserless.cjs +4 -1
- package/dist/services/definitions/browserless.cjs.map +1 -1
- package/dist/services/definitions/browserless.mjs +4 -1
- package/dist/services/definitions/browserless.mjs.map +1 -1
- package/dist/services/definitions/cmsaas-starter.cjs +86 -0
- package/dist/services/definitions/cmsaas-starter.cjs.map +1 -0
- package/dist/services/definitions/cmsaas-starter.d.cts +7 -0
- package/dist/services/definitions/cmsaas-starter.d.cts.map +1 -0
- package/dist/services/definitions/cmsaas-starter.d.mts +7 -0
- package/dist/services/definitions/cmsaas-starter.d.mts.map +1 -0
- package/dist/services/definitions/cmsaas-starter.mjs +85 -0
- package/dist/services/definitions/cmsaas-starter.mjs.map +1 -0
- package/dist/services/definitions/convex.cjs +43 -1
- package/dist/services/definitions/convex.cjs.map +1 -1
- package/dist/services/definitions/convex.mjs +43 -1
- package/dist/services/definitions/convex.mjs.map +1 -1
- package/dist/services/definitions/grafana.cjs +11 -1
- package/dist/services/definitions/grafana.cjs.map +1 -1
- package/dist/services/definitions/grafana.mjs +11 -1
- package/dist/services/definitions/grafana.mjs.map +1 -1
- package/dist/services/definitions/index.cjs +51 -36
- package/dist/services/definitions/index.cjs.map +1 -1
- package/dist/services/definitions/index.d.cts +30 -25
- package/dist/services/definitions/index.d.cts.map +1 -1
- package/dist/services/definitions/index.d.mts +30 -25
- package/dist/services/definitions/index.d.mts.map +1 -1
- package/dist/services/definitions/index.mjs +47 -37
- package/dist/services/definitions/index.mjs.map +1 -1
- package/dist/services/definitions/ixartz-saas.cjs +88 -0
- package/dist/services/definitions/ixartz-saas.cjs.map +1 -0
- package/dist/services/definitions/ixartz-saas.d.cts +7 -0
- package/dist/services/definitions/ixartz-saas.d.cts.map +1 -0
- package/dist/services/definitions/ixartz-saas.d.mts +7 -0
- package/dist/services/definitions/ixartz-saas.d.mts.map +1 -0
- package/dist/services/definitions/ixartz-saas.mjs +87 -0
- package/dist/services/definitions/ixartz-saas.mjs.map +1 -0
- package/dist/services/definitions/meilisearch.cjs +11 -1
- package/dist/services/definitions/meilisearch.cjs.map +1 -1
- package/dist/services/definitions/meilisearch.mjs +11 -1
- package/dist/services/definitions/meilisearch.mjs.map +1 -1
- package/dist/services/definitions/minio.cjs +3 -1
- package/dist/services/definitions/minio.cjs.map +1 -1
- package/dist/services/definitions/minio.mjs +3 -1
- package/dist/services/definitions/minio.mjs.map +1 -1
- package/dist/services/definitions/mission-control.cjs +16 -2
- package/dist/services/definitions/mission-control.cjs.map +1 -1
- package/dist/services/definitions/mission-control.mjs +16 -2
- package/dist/services/definitions/mission-control.mjs.map +1 -1
- package/dist/services/definitions/n8n.cjs +11 -1
- package/dist/services/definitions/n8n.cjs.map +1 -1
- package/dist/services/definitions/n8n.mjs +11 -1
- package/dist/services/definitions/n8n.mjs.map +1 -1
- package/dist/services/definitions/ollama.cjs +3 -1
- package/dist/services/definitions/ollama.cjs.map +1 -1
- package/dist/services/definitions/ollama.mjs +3 -1
- package/dist/services/definitions/ollama.mjs.map +1 -1
- package/dist/services/definitions/open-saas.cjs +81 -0
- package/dist/services/definitions/open-saas.cjs.map +1 -0
- package/dist/services/definitions/open-saas.d.cts +7 -0
- package/dist/services/definitions/open-saas.d.cts.map +1 -0
- package/dist/services/definitions/open-saas.d.mts +7 -0
- package/dist/services/definitions/open-saas.d.mts.map +1 -0
- package/dist/services/definitions/open-saas.mjs +80 -0
- package/dist/services/definitions/open-saas.mjs.map +1 -0
- package/dist/services/definitions/qdrant.cjs +3 -1
- package/dist/services/definitions/qdrant.cjs.map +1 -1
- package/dist/services/definitions/qdrant.mjs +3 -1
- package/dist/services/definitions/qdrant.mjs.map +1 -1
- package/dist/services/definitions/searxng.cjs +8 -1
- package/dist/services/definitions/searxng.cjs.map +1 -1
- package/dist/services/definitions/searxng.mjs +8 -1
- package/dist/services/definitions/searxng.mjs.map +1 -1
- package/dist/services/definitions/uptime-kuma.cjs +8 -1
- package/dist/services/definitions/uptime-kuma.cjs.map +1 -1
- package/dist/services/definitions/uptime-kuma.mjs +8 -1
- package/dist/services/definitions/uptime-kuma.mjs.map +1 -1
- package/dist/services/registry.cjs +3 -0
- package/dist/services/registry.cjs.map +1 -1
- package/dist/services/registry.d.cts.map +1 -1
- package/dist/services/registry.d.mts.map +1 -1
- package/dist/services/registry.mjs +3 -0
- package/dist/services/registry.mjs.map +1 -1
- package/dist/services/registry.test.cjs +40 -33
- package/dist/services/registry.test.cjs.map +1 -1
- package/dist/services/registry.test.mjs +8 -1
- package/dist/services/registry.test.mjs.map +1 -1
- package/dist/{skill-manifest-BVUXU0__.mjs → skill-manifest-6XhrhWsG.mjs} +49 -1
- package/dist/{skill-manifest--IgY9REK.cjs.map → skill-manifest-6XhrhWsG.mjs.map} +1 -1
- package/dist/{skill-manifest--IgY9REK.cjs → skill-manifest-B8znSsym.cjs} +49 -1
- package/dist/{skill-manifest-BVUXU0__.mjs.map → skill-manifest-B8znSsym.cjs.map} +1 -1
- package/dist/skills/registry.cjs +3 -3
- package/dist/skills/registry.cjs.map +1 -1
- package/dist/skills/registry.mjs +3 -3
- package/dist/skills/registry.mjs.map +1 -1
- package/dist/skills/skill-manifest.cjs +1 -1
- package/dist/skills/skill-manifest.mjs +1 -1
- package/dist/{vi.2VT5v0um-DvC3SVNc.mjs → test.CTcmp4Su-ClCHJ3FA.mjs} +6793 -6403
- package/dist/test.CTcmp4Su-ClCHJ3FA.mjs.map +1 -0
- package/dist/{vi.2VT5v0um-CRqXre87.cjs → test.CTcmp4Su-DlzTarwH.cjs} +6793 -6403
- package/dist/test.CTcmp4Su-DlzTarwH.cjs.map +1 -0
- package/dist/track-analytics.cjs +50 -0
- package/dist/track-analytics.cjs.map +1 -0
- package/dist/track-analytics.d.cts +34 -0
- package/dist/track-analytics.d.cts.map +1 -0
- package/dist/track-analytics.d.mts +34 -0
- package/dist/track-analytics.d.mts.map +1 -0
- package/dist/track-analytics.mjs +48 -0
- package/dist/track-analytics.mjs.map +1 -0
- package/dist/track-analytics.test.cjs +91 -0
- package/dist/track-analytics.test.cjs.map +1 -0
- package/dist/track-analytics.test.d.cts +1 -0
- package/dist/track-analytics.test.d.mts +1 -0
- package/dist/track-analytics.test.mjs +92 -0
- package/dist/track-analytics.test.mjs.map +1 -0
- package/dist/types.cjs +7 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +12 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +12 -2
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +7 -0
- package/dist/types.mjs.map +1 -1
- package/dist/validator.test.cjs +15 -15
- package/dist/validator.test.cjs.map +1 -1
- package/dist/validator.test.mjs +2 -2
- package/dist/version-manager.cjs +1 -1
- package/dist/version-manager.cjs.map +1 -1
- package/dist/version-manager.mjs +1 -1
- package/dist/version-manager.mjs.map +1 -1
- package/dist/version-manager.test.cjs +40 -38
- package/dist/version-manager.test.cjs.map +1 -1
- package/dist/version-manager.test.mjs +7 -5
- package/dist/version-manager.test.mjs.map +1 -1
- package/package.json +4 -4
- package/src/__snapshots__/composer.snapshot.test.ts.snap +160 -0
- package/src/addon-stack.test.ts +490 -0
- package/src/addon-stack.ts +998 -0
- package/src/bare-metal-partition.test.ts +4 -3
- package/src/composer.test.ts +4 -2
- package/src/composer.ts +24 -5
- package/src/generate.test.ts +2 -1
- package/src/generate.ts +10 -1
- package/src/generators/clone-repos.test.ts +154 -0
- package/src/generators/clone-repos.ts +159 -0
- package/src/generators/postgres-init.ts +17 -0
- package/src/generators/scripts.test.ts +52 -4
- package/src/generators/scripts.ts +351 -3
- package/src/generators/stack-manifest.ts +4 -2
- package/src/index.ts +28 -2
- package/src/presets/registry.ts +241 -329
- package/src/resolver.test.ts +53 -15
- package/src/resolver.ts +13 -1
- package/src/schema.ts +216 -4
- package/src/services/definitions/apptension-saas.ts +84 -0
- package/src/services/definitions/boxyhq-saas.ts +84 -0
- package/src/services/definitions/browserless.ts +3 -0
- package/src/services/definitions/cmsaas-starter.ts +84 -0
- package/src/services/definitions/convex.ts +31 -0
- package/src/services/definitions/grafana.ts +9 -0
- package/src/services/definitions/index.ts +90 -70
- package/src/services/definitions/ixartz-saas.ts +84 -0
- package/src/services/definitions/meilisearch.ts +9 -0
- package/src/services/definitions/minio.ts +2 -0
- package/src/services/definitions/mission-control.ts +19 -2
- package/src/services/definitions/n8n.ts +9 -0
- package/src/services/definitions/ollama.ts +2 -0
- package/src/services/definitions/open-saas.ts +79 -0
- package/src/services/definitions/qdrant.ts +2 -0
- package/src/services/definitions/searxng.ts +3 -0
- package/src/services/definitions/uptime-kuma.ts +3 -0
- package/src/services/registry.test.ts +8 -0
- package/src/services/registry.ts +7 -0
- package/src/skills/manifest.json +64 -0
- package/src/skills/registry.ts +3 -3
- package/src/track-analytics.test.ts +82 -0
- package/src/track-analytics.ts +76 -0
- package/src/types.ts +29 -0
- package/src/version-manager.test.ts +10 -5
- package/src/version-manager.ts +1 -1
- package/dist/schema-B4c64P8N.d.cts.map +0 -1
- package/dist/schema-CXNhYci1.d.mts.map +0 -1
- package/dist/vi.2VT5v0um-CRqXre87.cjs.map +0 -1
- package/dist/vi.2VT5v0um-DvC3SVNc.mjs.map +0 -1
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
const require_test_CTcmp4Su = require("../test.CTcmp4Su-DlzTarwH.cjs");
|
|
2
|
+
const require_generators_clone_repos = require("./clone-repos.cjs");
|
|
3
|
+
//#region src/generators/clone-repos.test.ts
|
|
4
|
+
/** Minimal resolved output with no services */
|
|
5
|
+
function emptyResolved() {
|
|
6
|
+
return {
|
|
7
|
+
services: [],
|
|
8
|
+
addedDependencies: [],
|
|
9
|
+
removedConflicts: [],
|
|
10
|
+
warnings: [],
|
|
11
|
+
errors: [],
|
|
12
|
+
isValid: true,
|
|
13
|
+
estimatedMemoryMB: 0,
|
|
14
|
+
aiProviders: [],
|
|
15
|
+
gsdRuntimes: []
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Create a resolved output with image-based services only */
|
|
19
|
+
function imageOnlyResolved() {
|
|
20
|
+
return {
|
|
21
|
+
...emptyResolved(),
|
|
22
|
+
services: [{
|
|
23
|
+
definition: {
|
|
24
|
+
id: "redis",
|
|
25
|
+
name: "Redis",
|
|
26
|
+
description: "In-memory cache",
|
|
27
|
+
category: "database",
|
|
28
|
+
icon: "🔴",
|
|
29
|
+
image: "redis",
|
|
30
|
+
imageTag: "7-alpine",
|
|
31
|
+
ports: [],
|
|
32
|
+
volumes: [],
|
|
33
|
+
environment: [],
|
|
34
|
+
dependsOn: [],
|
|
35
|
+
restartPolicy: "unless-stopped",
|
|
36
|
+
networks: ["openclaw-network"],
|
|
37
|
+
skills: [],
|
|
38
|
+
openclawEnvVars: [],
|
|
39
|
+
docsUrl: "https://redis.io",
|
|
40
|
+
tags: [],
|
|
41
|
+
maturity: "stable",
|
|
42
|
+
requires: [],
|
|
43
|
+
recommends: [],
|
|
44
|
+
conflictsWith: [],
|
|
45
|
+
gpuRequired: false
|
|
46
|
+
},
|
|
47
|
+
addedBy: "user"
|
|
48
|
+
}]
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Create a resolved output with a git-based service */
|
|
52
|
+
function gitServiceResolved() {
|
|
53
|
+
return {
|
|
54
|
+
...emptyResolved(),
|
|
55
|
+
services: [{
|
|
56
|
+
definition: {
|
|
57
|
+
id: "open-saas",
|
|
58
|
+
name: "Open SaaS",
|
|
59
|
+
description: "SaaS boilerplate",
|
|
60
|
+
category: "saas-boilerplate",
|
|
61
|
+
icon: "🚀",
|
|
62
|
+
gitSource: {
|
|
63
|
+
repoUrl: "https://github.com/wasp-lang/open-saas.git",
|
|
64
|
+
branch: "main",
|
|
65
|
+
subdirectory: "template",
|
|
66
|
+
postCloneCommands: ["cp .env.example .env"]
|
|
67
|
+
},
|
|
68
|
+
buildContext: {
|
|
69
|
+
dockerfile: "Dockerfile",
|
|
70
|
+
context: "."
|
|
71
|
+
},
|
|
72
|
+
ports: [{
|
|
73
|
+
host: 3100,
|
|
74
|
+
container: 3e3,
|
|
75
|
+
description: "Web app",
|
|
76
|
+
exposed: true
|
|
77
|
+
}],
|
|
78
|
+
volumes: [],
|
|
79
|
+
environment: [],
|
|
80
|
+
dependsOn: [],
|
|
81
|
+
restartPolicy: "unless-stopped",
|
|
82
|
+
networks: ["openclaw-network"],
|
|
83
|
+
skills: [],
|
|
84
|
+
openclawEnvVars: [],
|
|
85
|
+
docsUrl: "https://opensaas.sh/docs",
|
|
86
|
+
tags: [],
|
|
87
|
+
maturity: "beta",
|
|
88
|
+
requires: [],
|
|
89
|
+
recommends: [],
|
|
90
|
+
conflictsWith: [],
|
|
91
|
+
gpuRequired: false
|
|
92
|
+
},
|
|
93
|
+
addedBy: "user"
|
|
94
|
+
}]
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
require_test_CTcmp4Su.describe("generateCloneScripts", () => {
|
|
98
|
+
require_test_CTcmp4Su.it("returns empty object when no git-based services exist", () => {
|
|
99
|
+
require_test_CTcmp4Su.globalExpect(require_generators_clone_repos.generateCloneScripts(emptyResolved())).toEqual({});
|
|
100
|
+
});
|
|
101
|
+
require_test_CTcmp4Su.it("returns empty object when only image-based services exist", () => {
|
|
102
|
+
require_test_CTcmp4Su.globalExpect(require_generators_clone_repos.generateCloneScripts(imageOnlyResolved())).toEqual({});
|
|
103
|
+
});
|
|
104
|
+
require_test_CTcmp4Su.it("generates bash and PowerShell scripts for git-based services", () => {
|
|
105
|
+
const result = require_generators_clone_repos.generateCloneScripts(gitServiceResolved());
|
|
106
|
+
require_test_CTcmp4Su.globalExpect(Object.keys(result)).toHaveLength(2);
|
|
107
|
+
require_test_CTcmp4Su.globalExpect(result).toHaveProperty("scripts/clone-repos.sh");
|
|
108
|
+
require_test_CTcmp4Su.globalExpect(result).toHaveProperty("scripts/clone-repos.ps1");
|
|
109
|
+
});
|
|
110
|
+
require_test_CTcmp4Su.it("bash script contains clone command with repo URL", () => {
|
|
111
|
+
const bash = require_generators_clone_repos.generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
112
|
+
require_test_CTcmp4Su.globalExpect(bash).toContain("https://github.com/wasp-lang/open-saas.git");
|
|
113
|
+
require_test_CTcmp4Su.globalExpect(bash).toContain("\"open-saas\"");
|
|
114
|
+
require_test_CTcmp4Su.globalExpect(bash).toContain("\"main\"");
|
|
115
|
+
});
|
|
116
|
+
require_test_CTcmp4Su.it("bash script includes postCloneCommands", () => {
|
|
117
|
+
const bash = require_generators_clone_repos.generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
118
|
+
require_test_CTcmp4Su.globalExpect(bash).toContain("cp .env.example .env");
|
|
119
|
+
});
|
|
120
|
+
require_test_CTcmp4Su.it("bash script includes git check and idempotency logic", () => {
|
|
121
|
+
const bash = require_generators_clone_repos.generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
122
|
+
require_test_CTcmp4Su.globalExpect(bash).toContain("command -v git");
|
|
123
|
+
require_test_CTcmp4Su.globalExpect(bash).toContain("clone_or_update");
|
|
124
|
+
require_test_CTcmp4Su.globalExpect(bash).toContain("pull --ff-only");
|
|
125
|
+
require_test_CTcmp4Su.globalExpect(bash).toContain("git clone --depth 1");
|
|
126
|
+
});
|
|
127
|
+
require_test_CTcmp4Su.it("PowerShell script contains clone command with repo URL", () => {
|
|
128
|
+
const ps = require_generators_clone_repos.generateCloneScripts(gitServiceResolved())["scripts/clone-repos.ps1"];
|
|
129
|
+
require_test_CTcmp4Su.globalExpect(ps).toContain("https://github.com/wasp-lang/open-saas.git");
|
|
130
|
+
require_test_CTcmp4Su.globalExpect(ps).toContain("\"open-saas\"");
|
|
131
|
+
require_test_CTcmp4Su.globalExpect(ps).toContain("Clone-OrUpdate");
|
|
132
|
+
});
|
|
133
|
+
require_test_CTcmp4Su.it("bash script is executable (starts with shebang)", () => {
|
|
134
|
+
const bash = require_generators_clone_repos.generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
135
|
+
require_test_CTcmp4Su.globalExpect(bash).toMatch(/^#!/);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
//#endregion
|
|
139
|
+
|
|
140
|
+
//# sourceMappingURL=clone-repos.test.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone-repos.test.cjs","names":["describe","generateCloneScripts"],"sources":["../../src/generators/clone-repos.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateCloneScripts } from \"./clone-repos.js\";\nimport type { ResolverOutput } from \"../types.js\";\n\n/** Minimal resolved output with no services */\nfunction emptyResolved(): ResolverOutput {\n\treturn {\n\t\tservices: [],\n\t\taddedDependencies: [],\n\t\tremovedConflicts: [],\n\t\twarnings: [],\n\t\terrors: [],\n\t\tisValid: true,\n\t\testimatedMemoryMB: 0,\n\t\taiProviders: [],\n\t\tgsdRuntimes: [],\n\t};\n}\n\n/** Create a resolved output with image-based services only */\nfunction imageOnlyResolved(): ResolverOutput {\n\treturn {\n\t\t...emptyResolved(),\n\t\tservices: [\n\t\t\t{\n\t\t\t\tdefinition: {\n\t\t\t\t\tid: \"redis\",\n\t\t\t\t\tname: \"Redis\",\n\t\t\t\t\tdescription: \"In-memory cache\",\n\t\t\t\t\tcategory: \"database\",\n\t\t\t\t\ticon: \"🔴\",\n\t\t\t\t\timage: \"redis\",\n\t\t\t\t\timageTag: \"7-alpine\",\n\t\t\t\t\tports: [],\n\t\t\t\t\tvolumes: [],\n\t\t\t\t\tenvironment: [],\n\t\t\t\t\tdependsOn: [],\n\t\t\t\t\trestartPolicy: \"unless-stopped\",\n\t\t\t\t\tnetworks: [\"openclaw-network\"],\n\t\t\t\t\tskills: [],\n\t\t\t\t\topenclawEnvVars: [],\n\t\t\t\t\tdocsUrl: \"https://redis.io\",\n\t\t\t\t\ttags: [],\n\t\t\t\t\tmaturity: \"stable\",\n\t\t\t\t\trequires: [],\n\t\t\t\t\trecommends: [],\n\t\t\t\t\tconflictsWith: [],\n\t\t\t\t\tgpuRequired: false,\n\t\t\t\t},\n\t\t\t\taddedBy: \"user\",\n\t\t\t},\n\t\t],\n\t};\n}\n\n/** Create a resolved output with a git-based service */\nfunction gitServiceResolved(): ResolverOutput {\n\treturn {\n\t\t...emptyResolved(),\n\t\tservices: [\n\t\t\t{\n\t\t\t\tdefinition: {\n\t\t\t\t\tid: \"open-saas\",\n\t\t\t\t\tname: \"Open SaaS\",\n\t\t\t\t\tdescription: \"SaaS boilerplate\",\n\t\t\t\t\tcategory: \"saas-boilerplate\",\n\t\t\t\t\ticon: \"🚀\",\n\t\t\t\t\tgitSource: {\n\t\t\t\t\t\trepoUrl: \"https://github.com/wasp-lang/open-saas.git\",\n\t\t\t\t\t\tbranch: \"main\",\n\t\t\t\t\t\tsubdirectory: \"template\",\n\t\t\t\t\t\tpostCloneCommands: [\"cp .env.example .env\"],\n\t\t\t\t\t},\n\t\t\t\t\tbuildContext: {\n\t\t\t\t\t\tdockerfile: \"Dockerfile\",\n\t\t\t\t\t\tcontext: \".\",\n\t\t\t\t\t},\n\t\t\t\t\tports: [{ host: 3100, container: 3000, description: \"Web app\", exposed: true }],\n\t\t\t\t\tvolumes: [],\n\t\t\t\t\tenvironment: [],\n\t\t\t\t\tdependsOn: [],\n\t\t\t\t\trestartPolicy: \"unless-stopped\",\n\t\t\t\t\tnetworks: [\"openclaw-network\"],\n\t\t\t\t\tskills: [],\n\t\t\t\t\topenclawEnvVars: [],\n\t\t\t\t\tdocsUrl: \"https://opensaas.sh/docs\",\n\t\t\t\t\ttags: [],\n\t\t\t\t\tmaturity: \"beta\",\n\t\t\t\t\trequires: [],\n\t\t\t\t\trecommends: [],\n\t\t\t\t\tconflictsWith: [],\n\t\t\t\t\tgpuRequired: false,\n\t\t\t\t},\n\t\t\t\taddedBy: \"user\",\n\t\t\t},\n\t\t],\n\t};\n}\n\ndescribe(\"generateCloneScripts\", () => {\n\tit(\"returns empty object when no git-based services exist\", () => {\n\t\tconst result = generateCloneScripts(emptyResolved());\n\t\texpect(result).toEqual({});\n\t});\n\n\tit(\"returns empty object when only image-based services exist\", () => {\n\t\tconst result = generateCloneScripts(imageOnlyResolved());\n\t\texpect(result).toEqual({});\n\t});\n\n\tit(\"generates bash and PowerShell scripts for git-based services\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\texpect(Object.keys(result)).toHaveLength(2);\n\t\texpect(result).toHaveProperty(\"scripts/clone-repos.sh\");\n\t\texpect(result).toHaveProperty(\"scripts/clone-repos.ps1\");\n\t});\n\n\tit(\"bash script contains clone command with repo URL\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toContain(\"https://github.com/wasp-lang/open-saas.git\");\n\t\texpect(bash).toContain('\"open-saas\"');\n\t\texpect(bash).toContain('\"main\"');\n\t});\n\n\tit(\"bash script includes postCloneCommands\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toContain(\"cp .env.example .env\");\n\t});\n\n\tit(\"bash script includes git check and idempotency logic\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toContain(\"command -v git\");\n\t\texpect(bash).toContain(\"clone_or_update\");\n\t\texpect(bash).toContain(\"pull --ff-only\");\n\t\texpect(bash).toContain(\"git clone --depth 1\");\n\t});\n\n\tit(\"PowerShell script contains clone command with repo URL\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst ps = result[\"scripts/clone-repos.ps1\"];\n\t\texpect(ps).toContain(\"https://github.com/wasp-lang/open-saas.git\");\n\t\texpect(ps).toContain('\"open-saas\"');\n\t\texpect(ps).toContain(\"Clone-OrUpdate\");\n\t});\n\n\tit(\"bash script is executable (starts with shebang)\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toMatch(/^#!/);\n\t});\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { n as describe, r as it, t as globalExpect } from "../test.CTcmp4Su-ClCHJ3FA.mjs";
|
|
2
|
+
import { generateCloneScripts } from "./clone-repos.mjs";
|
|
3
|
+
//#region src/generators/clone-repos.test.ts
|
|
4
|
+
/** Minimal resolved output with no services */
|
|
5
|
+
function emptyResolved() {
|
|
6
|
+
return {
|
|
7
|
+
services: [],
|
|
8
|
+
addedDependencies: [],
|
|
9
|
+
removedConflicts: [],
|
|
10
|
+
warnings: [],
|
|
11
|
+
errors: [],
|
|
12
|
+
isValid: true,
|
|
13
|
+
estimatedMemoryMB: 0,
|
|
14
|
+
aiProviders: [],
|
|
15
|
+
gsdRuntimes: []
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Create a resolved output with image-based services only */
|
|
19
|
+
function imageOnlyResolved() {
|
|
20
|
+
return {
|
|
21
|
+
...emptyResolved(),
|
|
22
|
+
services: [{
|
|
23
|
+
definition: {
|
|
24
|
+
id: "redis",
|
|
25
|
+
name: "Redis",
|
|
26
|
+
description: "In-memory cache",
|
|
27
|
+
category: "database",
|
|
28
|
+
icon: "🔴",
|
|
29
|
+
image: "redis",
|
|
30
|
+
imageTag: "7-alpine",
|
|
31
|
+
ports: [],
|
|
32
|
+
volumes: [],
|
|
33
|
+
environment: [],
|
|
34
|
+
dependsOn: [],
|
|
35
|
+
restartPolicy: "unless-stopped",
|
|
36
|
+
networks: ["openclaw-network"],
|
|
37
|
+
skills: [],
|
|
38
|
+
openclawEnvVars: [],
|
|
39
|
+
docsUrl: "https://redis.io",
|
|
40
|
+
tags: [],
|
|
41
|
+
maturity: "stable",
|
|
42
|
+
requires: [],
|
|
43
|
+
recommends: [],
|
|
44
|
+
conflictsWith: [],
|
|
45
|
+
gpuRequired: false
|
|
46
|
+
},
|
|
47
|
+
addedBy: "user"
|
|
48
|
+
}]
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Create a resolved output with a git-based service */
|
|
52
|
+
function gitServiceResolved() {
|
|
53
|
+
return {
|
|
54
|
+
...emptyResolved(),
|
|
55
|
+
services: [{
|
|
56
|
+
definition: {
|
|
57
|
+
id: "open-saas",
|
|
58
|
+
name: "Open SaaS",
|
|
59
|
+
description: "SaaS boilerplate",
|
|
60
|
+
category: "saas-boilerplate",
|
|
61
|
+
icon: "🚀",
|
|
62
|
+
gitSource: {
|
|
63
|
+
repoUrl: "https://github.com/wasp-lang/open-saas.git",
|
|
64
|
+
branch: "main",
|
|
65
|
+
subdirectory: "template",
|
|
66
|
+
postCloneCommands: ["cp .env.example .env"]
|
|
67
|
+
},
|
|
68
|
+
buildContext: {
|
|
69
|
+
dockerfile: "Dockerfile",
|
|
70
|
+
context: "."
|
|
71
|
+
},
|
|
72
|
+
ports: [{
|
|
73
|
+
host: 3100,
|
|
74
|
+
container: 3e3,
|
|
75
|
+
description: "Web app",
|
|
76
|
+
exposed: true
|
|
77
|
+
}],
|
|
78
|
+
volumes: [],
|
|
79
|
+
environment: [],
|
|
80
|
+
dependsOn: [],
|
|
81
|
+
restartPolicy: "unless-stopped",
|
|
82
|
+
networks: ["openclaw-network"],
|
|
83
|
+
skills: [],
|
|
84
|
+
openclawEnvVars: [],
|
|
85
|
+
docsUrl: "https://opensaas.sh/docs",
|
|
86
|
+
tags: [],
|
|
87
|
+
maturity: "beta",
|
|
88
|
+
requires: [],
|
|
89
|
+
recommends: [],
|
|
90
|
+
conflictsWith: [],
|
|
91
|
+
gpuRequired: false
|
|
92
|
+
},
|
|
93
|
+
addedBy: "user"
|
|
94
|
+
}]
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
describe("generateCloneScripts", () => {
|
|
98
|
+
it("returns empty object when no git-based services exist", () => {
|
|
99
|
+
globalExpect(generateCloneScripts(emptyResolved())).toEqual({});
|
|
100
|
+
});
|
|
101
|
+
it("returns empty object when only image-based services exist", () => {
|
|
102
|
+
globalExpect(generateCloneScripts(imageOnlyResolved())).toEqual({});
|
|
103
|
+
});
|
|
104
|
+
it("generates bash and PowerShell scripts for git-based services", () => {
|
|
105
|
+
const result = generateCloneScripts(gitServiceResolved());
|
|
106
|
+
globalExpect(Object.keys(result)).toHaveLength(2);
|
|
107
|
+
globalExpect(result).toHaveProperty("scripts/clone-repos.sh");
|
|
108
|
+
globalExpect(result).toHaveProperty("scripts/clone-repos.ps1");
|
|
109
|
+
});
|
|
110
|
+
it("bash script contains clone command with repo URL", () => {
|
|
111
|
+
const bash = generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
112
|
+
globalExpect(bash).toContain("https://github.com/wasp-lang/open-saas.git");
|
|
113
|
+
globalExpect(bash).toContain("\"open-saas\"");
|
|
114
|
+
globalExpect(bash).toContain("\"main\"");
|
|
115
|
+
});
|
|
116
|
+
it("bash script includes postCloneCommands", () => {
|
|
117
|
+
const bash = generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
118
|
+
globalExpect(bash).toContain("cp .env.example .env");
|
|
119
|
+
});
|
|
120
|
+
it("bash script includes git check and idempotency logic", () => {
|
|
121
|
+
const bash = generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
122
|
+
globalExpect(bash).toContain("command -v git");
|
|
123
|
+
globalExpect(bash).toContain("clone_or_update");
|
|
124
|
+
globalExpect(bash).toContain("pull --ff-only");
|
|
125
|
+
globalExpect(bash).toContain("git clone --depth 1");
|
|
126
|
+
});
|
|
127
|
+
it("PowerShell script contains clone command with repo URL", () => {
|
|
128
|
+
const ps = generateCloneScripts(gitServiceResolved())["scripts/clone-repos.ps1"];
|
|
129
|
+
globalExpect(ps).toContain("https://github.com/wasp-lang/open-saas.git");
|
|
130
|
+
globalExpect(ps).toContain("\"open-saas\"");
|
|
131
|
+
globalExpect(ps).toContain("Clone-OrUpdate");
|
|
132
|
+
});
|
|
133
|
+
it("bash script is executable (starts with shebang)", () => {
|
|
134
|
+
const bash = generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
135
|
+
globalExpect(bash).toMatch(/^#!/);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
//#endregion
|
|
139
|
+
export {};
|
|
140
|
+
|
|
141
|
+
//# sourceMappingURL=clone-repos.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone-repos.test.mjs","names":[],"sources":["../../src/generators/clone-repos.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateCloneScripts } from \"./clone-repos.js\";\nimport type { ResolverOutput } from \"../types.js\";\n\n/** Minimal resolved output with no services */\nfunction emptyResolved(): ResolverOutput {\n\treturn {\n\t\tservices: [],\n\t\taddedDependencies: [],\n\t\tremovedConflicts: [],\n\t\twarnings: [],\n\t\terrors: [],\n\t\tisValid: true,\n\t\testimatedMemoryMB: 0,\n\t\taiProviders: [],\n\t\tgsdRuntimes: [],\n\t};\n}\n\n/** Create a resolved output with image-based services only */\nfunction imageOnlyResolved(): ResolverOutput {\n\treturn {\n\t\t...emptyResolved(),\n\t\tservices: [\n\t\t\t{\n\t\t\t\tdefinition: {\n\t\t\t\t\tid: \"redis\",\n\t\t\t\t\tname: \"Redis\",\n\t\t\t\t\tdescription: \"In-memory cache\",\n\t\t\t\t\tcategory: \"database\",\n\t\t\t\t\ticon: \"🔴\",\n\t\t\t\t\timage: \"redis\",\n\t\t\t\t\timageTag: \"7-alpine\",\n\t\t\t\t\tports: [],\n\t\t\t\t\tvolumes: [],\n\t\t\t\t\tenvironment: [],\n\t\t\t\t\tdependsOn: [],\n\t\t\t\t\trestartPolicy: \"unless-stopped\",\n\t\t\t\t\tnetworks: [\"openclaw-network\"],\n\t\t\t\t\tskills: [],\n\t\t\t\t\topenclawEnvVars: [],\n\t\t\t\t\tdocsUrl: \"https://redis.io\",\n\t\t\t\t\ttags: [],\n\t\t\t\t\tmaturity: \"stable\",\n\t\t\t\t\trequires: [],\n\t\t\t\t\trecommends: [],\n\t\t\t\t\tconflictsWith: [],\n\t\t\t\t\tgpuRequired: false,\n\t\t\t\t},\n\t\t\t\taddedBy: \"user\",\n\t\t\t},\n\t\t],\n\t};\n}\n\n/** Create a resolved output with a git-based service */\nfunction gitServiceResolved(): ResolverOutput {\n\treturn {\n\t\t...emptyResolved(),\n\t\tservices: [\n\t\t\t{\n\t\t\t\tdefinition: {\n\t\t\t\t\tid: \"open-saas\",\n\t\t\t\t\tname: \"Open SaaS\",\n\t\t\t\t\tdescription: \"SaaS boilerplate\",\n\t\t\t\t\tcategory: \"saas-boilerplate\",\n\t\t\t\t\ticon: \"🚀\",\n\t\t\t\t\tgitSource: {\n\t\t\t\t\t\trepoUrl: \"https://github.com/wasp-lang/open-saas.git\",\n\t\t\t\t\t\tbranch: \"main\",\n\t\t\t\t\t\tsubdirectory: \"template\",\n\t\t\t\t\t\tpostCloneCommands: [\"cp .env.example .env\"],\n\t\t\t\t\t},\n\t\t\t\t\tbuildContext: {\n\t\t\t\t\t\tdockerfile: \"Dockerfile\",\n\t\t\t\t\t\tcontext: \".\",\n\t\t\t\t\t},\n\t\t\t\t\tports: [{ host: 3100, container: 3000, description: \"Web app\", exposed: true }],\n\t\t\t\t\tvolumes: [],\n\t\t\t\t\tenvironment: [],\n\t\t\t\t\tdependsOn: [],\n\t\t\t\t\trestartPolicy: \"unless-stopped\",\n\t\t\t\t\tnetworks: [\"openclaw-network\"],\n\t\t\t\t\tskills: [],\n\t\t\t\t\topenclawEnvVars: [],\n\t\t\t\t\tdocsUrl: \"https://opensaas.sh/docs\",\n\t\t\t\t\ttags: [],\n\t\t\t\t\tmaturity: \"beta\",\n\t\t\t\t\trequires: [],\n\t\t\t\t\trecommends: [],\n\t\t\t\t\tconflictsWith: [],\n\t\t\t\t\tgpuRequired: false,\n\t\t\t\t},\n\t\t\t\taddedBy: \"user\",\n\t\t\t},\n\t\t],\n\t};\n}\n\ndescribe(\"generateCloneScripts\", () => {\n\tit(\"returns empty object when no git-based services exist\", () => {\n\t\tconst result = generateCloneScripts(emptyResolved());\n\t\texpect(result).toEqual({});\n\t});\n\n\tit(\"returns empty object when only image-based services exist\", () => {\n\t\tconst result = generateCloneScripts(imageOnlyResolved());\n\t\texpect(result).toEqual({});\n\t});\n\n\tit(\"generates bash and PowerShell scripts for git-based services\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\texpect(Object.keys(result)).toHaveLength(2);\n\t\texpect(result).toHaveProperty(\"scripts/clone-repos.sh\");\n\t\texpect(result).toHaveProperty(\"scripts/clone-repos.ps1\");\n\t});\n\n\tit(\"bash script contains clone command with repo URL\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toContain(\"https://github.com/wasp-lang/open-saas.git\");\n\t\texpect(bash).toContain('\"open-saas\"');\n\t\texpect(bash).toContain('\"main\"');\n\t});\n\n\tit(\"bash script includes postCloneCommands\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toContain(\"cp .env.example .env\");\n\t});\n\n\tit(\"bash script includes git check and idempotency logic\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toContain(\"command -v git\");\n\t\texpect(bash).toContain(\"clone_or_update\");\n\t\texpect(bash).toContain(\"pull --ff-only\");\n\t\texpect(bash).toContain(\"git clone --depth 1\");\n\t});\n\n\tit(\"PowerShell script contains clone command with repo URL\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst ps = result[\"scripts/clone-repos.ps1\"];\n\t\texpect(ps).toContain(\"https://github.com/wasp-lang/open-saas.git\");\n\t\texpect(ps).toContain('\"open-saas\"');\n\t\texpect(ps).toContain(\"Clone-OrUpdate\");\n\t});\n\n\tit(\"bash script is executable (starts with shebang)\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toMatch(/^#!/);\n\t});\n});\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const
|
|
1
|
+
const require_test_CTcmp4Su = require("../test.CTcmp4Su-DlzTarwH.cjs");
|
|
2
2
|
const require_generate = require("../generate.cjs");
|
|
3
3
|
//#region src/generators/env.test.ts
|
|
4
|
-
|
|
4
|
+
require_test_CTcmp4Su.describe("generateEnvFiles (via generate)", () => {
|
|
5
5
|
const baseInput = {
|
|
6
6
|
projectName: "env-test",
|
|
7
7
|
services: ["redis"],
|
|
@@ -13,22 +13,22 @@ require_vi_2VT5v0um.describe("generateEnvFiles (via generate)", () => {
|
|
|
13
13
|
generateSecrets: true,
|
|
14
14
|
openclawVersion: "latest"
|
|
15
15
|
};
|
|
16
|
-
|
|
16
|
+
require_test_CTcmp4Su.it("generates .env and .env.example files", () => {
|
|
17
17
|
const result = require_generate.generate(baseInput);
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
require_test_CTcmp4Su.globalExpect(result.files).toHaveProperty(".env");
|
|
19
|
+
require_test_CTcmp4Su.globalExpect(result.files).toHaveProperty(".env.example");
|
|
20
20
|
});
|
|
21
|
-
|
|
21
|
+
require_test_CTcmp4Su.it(".env.example has empty values for secrets", () => {
|
|
22
22
|
const envExample = require_generate.generate(baseInput).files[".env.example"];
|
|
23
|
-
|
|
23
|
+
require_test_CTcmp4Su.globalExpect(envExample).toContain("REDIS_PASSWORD=");
|
|
24
24
|
});
|
|
25
|
-
|
|
25
|
+
require_test_CTcmp4Su.it(".env has populated secret values when generateSecrets is true", () => {
|
|
26
26
|
const redisLine = require_generate.generate(baseInput).files[".env"].split("\n").find((l) => l.startsWith("REDIS_PASSWORD="));
|
|
27
|
-
|
|
27
|
+
require_test_CTcmp4Su.globalExpect(redisLine).toBeDefined();
|
|
28
28
|
const value = redisLine.split("=")[1];
|
|
29
|
-
|
|
29
|
+
require_test_CTcmp4Su.globalExpect(value.length).toBeGreaterThan(0);
|
|
30
30
|
});
|
|
31
|
-
|
|
31
|
+
require_test_CTcmp4Su.it("env files contain service-specific variables", () => {
|
|
32
32
|
const env = require_generate.generate({
|
|
33
33
|
...baseInput,
|
|
34
34
|
services: [
|
|
@@ -37,20 +37,20 @@ require_vi_2VT5v0um.describe("generateEnvFiles (via generate)", () => {
|
|
|
37
37
|
"n8n"
|
|
38
38
|
]
|
|
39
39
|
}).files[".env"];
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
require_test_CTcmp4Su.globalExpect(env).toContain("REDIS_PASSWORD");
|
|
41
|
+
require_test_CTcmp4Su.globalExpect(env).toContain("POSTGRES_PASSWORD");
|
|
42
42
|
});
|
|
43
|
-
|
|
43
|
+
require_test_CTcmp4Su.it("env files group variables by service with comments", () => {
|
|
44
44
|
const envExample = require_generate.generate(baseInput).files[".env.example"];
|
|
45
|
-
|
|
45
|
+
require_test_CTcmp4Su.globalExpect(envExample).toContain("#");
|
|
46
46
|
});
|
|
47
|
-
|
|
47
|
+
require_test_CTcmp4Su.it(".env references domain when proxy is set", () => {
|
|
48
48
|
const env = require_generate.generate({
|
|
49
49
|
...baseInput,
|
|
50
50
|
proxy: "caddy",
|
|
51
51
|
domain: "example.com"
|
|
52
52
|
}).files[".env"];
|
|
53
|
-
|
|
53
|
+
require_test_CTcmp4Su.globalExpect(env).toContain("example.com");
|
|
54
54
|
});
|
|
55
55
|
});
|
|
56
56
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.test.cjs","names":["describe","generate"],"sources":["../../src/generators/env.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generate } from \"../generate.js\";\n\ndescribe(\"generateEnvFiles (via generate)\", () => {\n\tconst baseInput = {\n\t\tprojectName: \"env-test\",\n\t\tservices: [\"redis\"],\n\t\tskillPacks: [] as string[],\n\t\tproxy: \"none\" as const,\n\t\tgpu: false,\n\t\tplatform: \"linux/amd64\" as const,\n\t\tdeployment: \"local\" as const,\n\t\tgenerateSecrets: true,\n\t\topenclawVersion: \"latest\",\n\t};\n\n\tit(\"generates .env and .env.example files\", () => {\n\t\tconst result = generate(baseInput);\n\n\t\texpect(result.files).toHaveProperty(\".env\");\n\t\texpect(result.files).toHaveProperty(\".env.example\");\n\t});\n\n\tit(\".env.example has empty values for secrets\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst envExample = result.files[\".env.example\"]!;\n\n\t\t// .env.example should have placeholder empty values for secrets\n\t\texpect(envExample).toContain(\"REDIS_PASSWORD=\");\n\t});\n\n\tit(\".env has populated secret values when generateSecrets is true\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst env = result.files[\".env\"]!;\n\n\t\t// Find REDIS_PASSWORD line and check it has a value\n\t\tconst redisLine = env.split(\"\\n\").find((l) => l.startsWith(\"REDIS_PASSWORD=\"));\n\t\texpect(redisLine).toBeDefined();\n\t\t// Value should not be empty\n\t\tconst value = redisLine!.split(\"=\")[1];\n\t\texpect(value!.length).toBeGreaterThan(0);\n\t});\n\n\tit(\"env files contain service-specific variables\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tservices: [\"redis\", \"postgresql\", \"n8n\"],\n\t\t});\n\t\tconst env = result.files[\".env\"]!;\n\n\t\texpect(env).toContain(\"REDIS_PASSWORD\");\n\t\texpect(env).toContain(\"POSTGRES_PASSWORD\");\n\t});\n\n\tit(\"env files group variables by service with comments\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst envExample = result.files[\".env.example\"]!;\n\n\t\t// Should have comment sections\n\t\texpect(envExample).toContain(\"#\");\n\t});\n\n\tit(\".env references domain when proxy is set\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"example.com\",\n\t\t});\n\t\tconst env = result.files[\".env\"]!;\n\n\t\texpect(env).toContain(\"example.com\");\n\t});\n});\n"],"mappings":";;;AAGAA,
|
|
1
|
+
{"version":3,"file":"env.test.cjs","names":["describe","generate"],"sources":["../../src/generators/env.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generate } from \"../generate.js\";\n\ndescribe(\"generateEnvFiles (via generate)\", () => {\n\tconst baseInput = {\n\t\tprojectName: \"env-test\",\n\t\tservices: [\"redis\"],\n\t\tskillPacks: [] as string[],\n\t\tproxy: \"none\" as const,\n\t\tgpu: false,\n\t\tplatform: \"linux/amd64\" as const,\n\t\tdeployment: \"local\" as const,\n\t\tgenerateSecrets: true,\n\t\topenclawVersion: \"latest\",\n\t};\n\n\tit(\"generates .env and .env.example files\", () => {\n\t\tconst result = generate(baseInput);\n\n\t\texpect(result.files).toHaveProperty(\".env\");\n\t\texpect(result.files).toHaveProperty(\".env.example\");\n\t});\n\n\tit(\".env.example has empty values for secrets\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst envExample = result.files[\".env.example\"]!;\n\n\t\t// .env.example should have placeholder empty values for secrets\n\t\texpect(envExample).toContain(\"REDIS_PASSWORD=\");\n\t});\n\n\tit(\".env has populated secret values when generateSecrets is true\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst env = result.files[\".env\"]!;\n\n\t\t// Find REDIS_PASSWORD line and check it has a value\n\t\tconst redisLine = env.split(\"\\n\").find((l) => l.startsWith(\"REDIS_PASSWORD=\"));\n\t\texpect(redisLine).toBeDefined();\n\t\t// Value should not be empty\n\t\tconst value = redisLine!.split(\"=\")[1];\n\t\texpect(value!.length).toBeGreaterThan(0);\n\t});\n\n\tit(\"env files contain service-specific variables\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tservices: [\"redis\", \"postgresql\", \"n8n\"],\n\t\t});\n\t\tconst env = result.files[\".env\"]!;\n\n\t\texpect(env).toContain(\"REDIS_PASSWORD\");\n\t\texpect(env).toContain(\"POSTGRES_PASSWORD\");\n\t});\n\n\tit(\"env files group variables by service with comments\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst envExample = result.files[\".env.example\"]!;\n\n\t\t// Should have comment sections\n\t\texpect(envExample).toContain(\"#\");\n\t});\n\n\tit(\".env references domain when proxy is set\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"example.com\",\n\t\t});\n\t\tconst env = result.files[\".env\"]!;\n\n\t\texpect(env).toContain(\"example.com\");\n\t});\n});\n"],"mappings":";;;AAGAA,sBAAAA,SAAS,yCAAyC;CACjD,MAAM,YAAY;EACjB,aAAa;EACb,UAAU,CAAC,QAAQ;EACnB,YAAY,EAAE;EACd,OAAO;EACP,KAAK;EACL,UAAU;EACV,YAAY;EACZ,iBAAiB;EACjB,iBAAiB;EACjB;AAED,uBAAA,GAAG,+CAA+C;EACjD,MAAM,SAASC,iBAAAA,SAAS,UAAU;AAElC,wBAAA,aAAO,OAAO,MAAM,CAAC,eAAe,OAAO;AAC3C,wBAAA,aAAO,OAAO,MAAM,CAAC,eAAe,eAAe;GAClD;AAEF,uBAAA,GAAG,mDAAmD;EAErD,MAAM,aADSA,iBAAAA,SAAS,UAAU,CACR,MAAM;AAGhC,wBAAA,aAAO,WAAW,CAAC,UAAU,kBAAkB;GAC9C;AAEF,uBAAA,GAAG,uEAAuE;EAKzE,MAAM,YAJSA,iBAAAA,SAAS,UAAU,CACf,MAAM,QAGH,MAAM,KAAK,CAAC,MAAM,MAAM,EAAE,WAAW,kBAAkB,CAAC;AAC9E,wBAAA,aAAO,UAAU,CAAC,aAAa;EAE/B,MAAM,QAAQ,UAAW,MAAM,IAAI,CAAC;AACpC,wBAAA,aAAO,MAAO,OAAO,CAAC,gBAAgB,EAAE;GACvC;AAEF,uBAAA,GAAG,sDAAsD;EAKxD,MAAM,MAJSA,iBAAAA,SAAS;GACvB,GAAG;GACH,UAAU;IAAC;IAAS;IAAc;IAAM;GACxC,CAAC,CACiB,MAAM;AAEzB,wBAAA,aAAO,IAAI,CAAC,UAAU,iBAAiB;AACvC,wBAAA,aAAO,IAAI,CAAC,UAAU,oBAAoB;GACzC;AAEF,uBAAA,GAAG,4DAA4D;EAE9D,MAAM,aADSA,iBAAAA,SAAS,UAAU,CACR,MAAM;AAGhC,wBAAA,aAAO,WAAW,CAAC,UAAU,IAAI;GAChC;AAEF,uBAAA,GAAG,kDAAkD;EAMpD,MAAM,MALSA,iBAAAA,SAAS;GACvB,GAAG;GACH,OAAO;GACP,QAAQ;GACR,CAAC,CACiB,MAAM;AAEzB,wBAAA,aAAO,IAAI,CAAC,UAAU,cAAc;GACnC;EACD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as describe, r as it, t as globalExpect } from "../
|
|
1
|
+
import { n as describe, r as it, t as globalExpect } from "../test.CTcmp4Su-ClCHJ3FA.mjs";
|
|
2
2
|
import { generate } from "../generate.mjs";
|
|
3
3
|
//#region src/generators/env.test.ts
|
|
4
4
|
describe("generateEnvFiles (via generate)", () => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const
|
|
1
|
+
const require_test_CTcmp4Su = require("../test.CTcmp4Su-DlzTarwH.cjs");
|
|
2
2
|
const require_generate = require("../generate.cjs");
|
|
3
3
|
//#region src/generators/health-check.test.ts
|
|
4
|
-
|
|
4
|
+
require_test_CTcmp4Su.describe("generateHealthCheck (via generate)", () => {
|
|
5
5
|
const baseInput = {
|
|
6
6
|
projectName: "health-test",
|
|
7
7
|
services: ["redis", "postgresql"],
|
|
@@ -13,69 +13,69 @@ require_vi_2VT5v0um.describe("generateHealthCheck (via generate)", () => {
|
|
|
13
13
|
generateSecrets: true,
|
|
14
14
|
openclawVersion: "latest"
|
|
15
15
|
};
|
|
16
|
-
|
|
16
|
+
require_test_CTcmp4Su.it("generates health-check.sh and health-check.ps1", () => {
|
|
17
17
|
const result = require_generate.generate(baseInput);
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
require_test_CTcmp4Su.globalExpect(result.files).toHaveProperty("scripts/health-check.sh");
|
|
19
|
+
require_test_CTcmp4Su.globalExpect(result.files).toHaveProperty("scripts/health-check.ps1");
|
|
20
20
|
});
|
|
21
|
-
|
|
21
|
+
require_test_CTcmp4Su.it("health-check.sh contains project name", () => {
|
|
22
22
|
const sh = require_generate.generate(baseInput).files["scripts/health-check.sh"];
|
|
23
|
-
|
|
23
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("health-test");
|
|
24
24
|
});
|
|
25
|
-
|
|
25
|
+
require_test_CTcmp4Su.it("health-check.sh contains service-specific checks for each resolved service", () => {
|
|
26
26
|
const sh = require_generate.generate(baseInput).files["scripts/health-check.sh"];
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("redis");
|
|
28
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("postgresql");
|
|
29
29
|
});
|
|
30
|
-
|
|
30
|
+
require_test_CTcmp4Su.it("health-check.sh includes port checks for exposed ports", () => {
|
|
31
31
|
const sh = require_generate.generate(baseInput).files["scripts/health-check.sh"];
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("6379");
|
|
33
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("5432");
|
|
34
34
|
});
|
|
35
|
-
|
|
35
|
+
require_test_CTcmp4Su.it("health-check.sh has usage/help docs", () => {
|
|
36
36
|
const sh = require_generate.generate(baseInput).files["scripts/health-check.sh"];
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("--quick");
|
|
38
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("--json");
|
|
39
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("--verbose");
|
|
40
40
|
});
|
|
41
|
-
|
|
41
|
+
require_test_CTcmp4Su.it("health-check.sh starts with shebang", () => {
|
|
42
42
|
const sh = require_generate.generate(baseInput).files["scripts/health-check.sh"];
|
|
43
|
-
|
|
43
|
+
require_test_CTcmp4Su.globalExpect(sh.startsWith("#!/usr/bin/env bash")).toBe(true);
|
|
44
44
|
});
|
|
45
|
-
|
|
45
|
+
require_test_CTcmp4Su.it("health-check.ps1 contains project name", () => {
|
|
46
46
|
const ps1 = require_generate.generate(baseInput).files["scripts/health-check.ps1"];
|
|
47
|
-
|
|
47
|
+
require_test_CTcmp4Su.globalExpect(ps1).toContain("health-test");
|
|
48
48
|
});
|
|
49
|
-
|
|
49
|
+
require_test_CTcmp4Su.it("health-check.ps1 contains service checks", () => {
|
|
50
50
|
const ps1 = require_generate.generate(baseInput).files["scripts/health-check.ps1"];
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
require_test_CTcmp4Su.globalExpect(ps1).toContain("redis");
|
|
52
|
+
require_test_CTcmp4Su.globalExpect(ps1).toContain("postgresql");
|
|
53
53
|
});
|
|
54
|
-
|
|
54
|
+
require_test_CTcmp4Su.it("health-check.ps1 includes PowerShell-style parameters", () => {
|
|
55
55
|
const ps1 = require_generate.generate(baseInput).files["scripts/health-check.ps1"];
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
require_test_CTcmp4Su.globalExpect(ps1).toContain("[switch]$Quick");
|
|
57
|
+
require_test_CTcmp4Su.globalExpect(ps1).toContain("[switch]$Json");
|
|
58
58
|
});
|
|
59
|
-
|
|
59
|
+
require_test_CTcmp4Su.it("health check scripts include all resolved services including dependencies", () => {
|
|
60
60
|
const sh = require_generate.generate({
|
|
61
61
|
...baseInput,
|
|
62
62
|
services: ["postiz"]
|
|
63
63
|
}).files["scripts/health-check.sh"];
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("postiz");
|
|
65
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("redis");
|
|
66
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("postgresql");
|
|
67
67
|
});
|
|
68
|
-
|
|
68
|
+
require_test_CTcmp4Su.it("health check script includes health check commands when service defines one", () => {
|
|
69
69
|
const sh = require_generate.generate(baseInput).files["scripts/health-check.sh"];
|
|
70
|
-
|
|
70
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("check_health_cmd");
|
|
71
71
|
});
|
|
72
|
-
|
|
72
|
+
require_test_CTcmp4Su.it("health check scripts contain the phase structure", () => {
|
|
73
73
|
const sh = require_generate.generate(baseInput).files["scripts/health-check.sh"];
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
74
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("Phase 1");
|
|
75
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("phase_environment");
|
|
76
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("check_container");
|
|
77
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("check_port");
|
|
78
|
+
require_test_CTcmp4Su.globalExpect(sh).toContain("phase_logs");
|
|
79
79
|
});
|
|
80
80
|
});
|
|
81
81
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-check.test.cjs","names":["describe","generate"],"sources":["../../src/generators/health-check.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generate } from \"../generate.js\";\n\ndescribe(\"generateHealthCheck (via generate)\", () => {\n\tconst baseInput = {\n\t\tprojectName: \"health-test\",\n\t\tservices: [\"redis\", \"postgresql\"],\n\t\tskillPacks: [] as string[],\n\t\tproxy: \"none\" as const,\n\t\tgpu: false,\n\t\tplatform: \"linux/amd64\" as const,\n\t\tdeployment: \"local\" as const,\n\t\tgenerateSecrets: true,\n\t\topenclawVersion: \"latest\",\n\t};\n\n\tit(\"generates health-check.sh and health-check.ps1\", () => {\n\t\tconst result = generate(baseInput);\n\n\t\texpect(result.files).toHaveProperty(\"scripts/health-check.sh\");\n\t\texpect(result.files).toHaveProperty(\"scripts/health-check.ps1\");\n\t});\n\n\tit(\"health-check.sh contains project name\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"health-test\");\n\t});\n\n\tit(\"health-check.sh contains service-specific checks for each resolved service\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"redis\");\n\t\texpect(sh).toContain(\"postgresql\");\n\t});\n\n\tit(\"health-check.sh includes port checks for exposed ports\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\t// Redis exposes port 6379, PostgreSQL exposes 5432\n\t\texpect(sh).toContain(\"6379\");\n\t\texpect(sh).toContain(\"5432\");\n\t});\n\n\tit(\"health-check.sh has usage/help docs\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"--quick\");\n\t\texpect(sh).toContain(\"--json\");\n\t\texpect(sh).toContain(\"--verbose\");\n\t});\n\n\tit(\"health-check.sh starts with shebang\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh.startsWith(\"#!/usr/bin/env bash\")).toBe(true);\n\t});\n\n\tit(\"health-check.ps1 contains project name\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"health-test\");\n\t});\n\n\tit(\"health-check.ps1 contains service checks\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"redis\");\n\t\texpect(ps1).toContain(\"postgresql\");\n\t});\n\n\tit(\"health-check.ps1 includes PowerShell-style parameters\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"[switch]$Quick\");\n\t\texpect(ps1).toContain(\"[switch]$Json\");\n\t});\n\n\tit(\"health check scripts include all resolved services including dependencies\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tservices: [\"postiz\"], // postiz depends on redis and postgresql\n\t\t});\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"postiz\");\n\t\t// Dependencies should be auto-resolved and included\n\t\texpect(sh).toContain(\"redis\");\n\t\texpect(sh).toContain(\"postgresql\");\n\t});\n\n\tit(\"health check script includes health check commands when service defines one\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\t// Redis has a healthcheck command (redis-cli ping)\n\t\texpect(sh).toContain(\"check_health_cmd\");\n\t});\n\n\tit(\"health check scripts contain the phase structure\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"Phase 1\");\n\t\texpect(sh).toContain(\"phase_environment\");\n\t\texpect(sh).toContain(\"check_container\");\n\t\texpect(sh).toContain(\"check_port\");\n\t\texpect(sh).toContain(\"phase_logs\");\n\t});\n});\n"],"mappings":";;;AAGAA,
|
|
1
|
+
{"version":3,"file":"health-check.test.cjs","names":["describe","generate"],"sources":["../../src/generators/health-check.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generate } from \"../generate.js\";\n\ndescribe(\"generateHealthCheck (via generate)\", () => {\n\tconst baseInput = {\n\t\tprojectName: \"health-test\",\n\t\tservices: [\"redis\", \"postgresql\"],\n\t\tskillPacks: [] as string[],\n\t\tproxy: \"none\" as const,\n\t\tgpu: false,\n\t\tplatform: \"linux/amd64\" as const,\n\t\tdeployment: \"local\" as const,\n\t\tgenerateSecrets: true,\n\t\topenclawVersion: \"latest\",\n\t};\n\n\tit(\"generates health-check.sh and health-check.ps1\", () => {\n\t\tconst result = generate(baseInput);\n\n\t\texpect(result.files).toHaveProperty(\"scripts/health-check.sh\");\n\t\texpect(result.files).toHaveProperty(\"scripts/health-check.ps1\");\n\t});\n\n\tit(\"health-check.sh contains project name\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"health-test\");\n\t});\n\n\tit(\"health-check.sh contains service-specific checks for each resolved service\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"redis\");\n\t\texpect(sh).toContain(\"postgresql\");\n\t});\n\n\tit(\"health-check.sh includes port checks for exposed ports\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\t// Redis exposes port 6379, PostgreSQL exposes 5432\n\t\texpect(sh).toContain(\"6379\");\n\t\texpect(sh).toContain(\"5432\");\n\t});\n\n\tit(\"health-check.sh has usage/help docs\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"--quick\");\n\t\texpect(sh).toContain(\"--json\");\n\t\texpect(sh).toContain(\"--verbose\");\n\t});\n\n\tit(\"health-check.sh starts with shebang\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh.startsWith(\"#!/usr/bin/env bash\")).toBe(true);\n\t});\n\n\tit(\"health-check.ps1 contains project name\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"health-test\");\n\t});\n\n\tit(\"health-check.ps1 contains service checks\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"redis\");\n\t\texpect(ps1).toContain(\"postgresql\");\n\t});\n\n\tit(\"health-check.ps1 includes PowerShell-style parameters\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst ps1 = result.files[\"scripts/health-check.ps1\"]!;\n\n\t\texpect(ps1).toContain(\"[switch]$Quick\");\n\t\texpect(ps1).toContain(\"[switch]$Json\");\n\t});\n\n\tit(\"health check scripts include all resolved services including dependencies\", () => {\n\t\tconst result = generate({\n\t\t\t...baseInput,\n\t\t\tservices: [\"postiz\"], // postiz depends on redis and postgresql\n\t\t});\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"postiz\");\n\t\t// Dependencies should be auto-resolved and included\n\t\texpect(sh).toContain(\"redis\");\n\t\texpect(sh).toContain(\"postgresql\");\n\t});\n\n\tit(\"health check script includes health check commands when service defines one\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\t// Redis has a healthcheck command (redis-cli ping)\n\t\texpect(sh).toContain(\"check_health_cmd\");\n\t});\n\n\tit(\"health check scripts contain the phase structure\", () => {\n\t\tconst result = generate(baseInput);\n\t\tconst sh = result.files[\"scripts/health-check.sh\"]!;\n\n\t\texpect(sh).toContain(\"Phase 1\");\n\t\texpect(sh).toContain(\"phase_environment\");\n\t\texpect(sh).toContain(\"check_container\");\n\t\texpect(sh).toContain(\"check_port\");\n\t\texpect(sh).toContain(\"phase_logs\");\n\t});\n});\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as describe, r as it, t as globalExpect } from "../
|
|
1
|
+
import { n as describe, r as it, t as globalExpect } from "../test.CTcmp4Su-ClCHJ3FA.mjs";
|
|
2
2
|
import { generate } from "../generate.mjs";
|
|
3
3
|
//#region src/generators/health-check.test.ts
|
|
4
4
|
describe("generateHealthCheck (via generate)", () => {
|
|
@@ -124,6 +124,26 @@ const DB_REQUIREMENTS = {
|
|
|
124
124
|
dbName: "nextcloud",
|
|
125
125
|
dbUser: "nextcloud",
|
|
126
126
|
passwordEnvVar: "NEXTCLOUD_DB_PASSWORD"
|
|
127
|
+
},
|
|
128
|
+
"open-saas": {
|
|
129
|
+
dbName: "opensaas",
|
|
130
|
+
dbUser: "opensaas",
|
|
131
|
+
passwordEnvVar: "OPENSAAS_DB_PASSWORD"
|
|
132
|
+
},
|
|
133
|
+
"apptension-saas": {
|
|
134
|
+
dbName: "apptensionsaas",
|
|
135
|
+
dbUser: "apptensionsaas",
|
|
136
|
+
passwordEnvVar: "APPTENSION_SAAS_DB_PASSWORD"
|
|
137
|
+
},
|
|
138
|
+
"boxyhq-saas": {
|
|
139
|
+
dbName: "boxyhqsaas",
|
|
140
|
+
dbUser: "boxyhqsaas",
|
|
141
|
+
passwordEnvVar: "BOXYHQ_SAAS_DB_PASSWORD"
|
|
142
|
+
},
|
|
143
|
+
"ixartz-saas": {
|
|
144
|
+
dbName: "ixartzsaas",
|
|
145
|
+
dbUser: "ixartzsaas",
|
|
146
|
+
passwordEnvVar: "IXARTZ_SAAS_DB_PASSWORD"
|
|
127
147
|
}
|
|
128
148
|
};
|
|
129
149
|
/**
|