@better-openclaw/core 1.0.24 → 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 -20
- package/dist/bare-metal-partition.test.cjs.map +1 -1
- package/dist/bare-metal-partition.test.mjs +2 -2
- package/dist/composer.cjs +4 -0
- 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 +1 -1
- 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 -53
- package/dist/composer.test.cjs.map +1 -1
- package/dist/composer.test.mjs +2 -2
- 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 +2 -2
- package/dist/generate.mjs +3 -3
- package/dist/generate.test.cjs +55 -55
- package/dist/generate.test.cjs.map +1 -1
- package/dist/generate.test.mjs +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.test.cjs +27 -27
- package/dist/generators/clone-repos.test.cjs.map +1 -1
- package/dist/generators/clone-repos.test.mjs +1 -1
- 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/scripts.test.cjs +39 -39
- package/dist/generators/scripts.test.cjs.map +1 -1
- package/dist/generators/scripts.test.mjs +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 +20 -4
- package/dist/index.d.cts +5 -4
- package/dist/index.d.mts +5 -4
- package/dist/index.mjs +7 -6
- 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.test.cjs +14 -14
- package/dist/presets/registry.test.cjs.map +1 -1
- package/dist/presets/registry.test.mjs +1 -1
- package/dist/resolver.test.cjs +95 -95
- package/dist/resolver.test.cjs.map +1 -1
- package/dist/resolver.test.mjs +1 -1
- package/dist/{schema-eX44HhRp.d.mts → schema-CKBRu-Rt.d.cts} +295 -2
- package/dist/schema-CKBRu-Rt.d.cts.map +1 -0
- package/dist/{schema-tn5RK8CM.d.cts → schema-Dn-_Jpb6.d.mts} +295 -2
- package/dist/schema-Dn-_Jpb6.d.mts.map +1 -0
- package/dist/schema.cjs +138 -1
- 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 +130 -2
- 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/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/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/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/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/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.test.cjs +36 -36
- package/dist/services/registry.test.cjs.map +1 -1
- package/dist/services/registry.test.mjs +1 -1
- package/dist/{vi.2VT5v0um-C_jmO7m2.mjs → test.CTcmp4Su-ClCHJ3FA.mjs} +6793 -6403
- package/dist/test.CTcmp4Su-ClCHJ3FA.mjs.map +1 -0
- package/dist/{vi.2VT5v0um-iVBt6Fyq.cjs → test.CTcmp4Su-DlzTarwH.cjs} +6793 -6403
- package/dist/test.CTcmp4Su-DlzTarwH.cjs.map +1 -0
- package/dist/track-analytics.test.cjs +28 -28
- package/dist/track-analytics.test.cjs.map +1 -1
- package/dist/track-analytics.test.mjs +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +10 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +10 -2
- package/dist/types.d.mts.map +1 -1
- 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.test.cjs +37 -37
- package/dist/version-manager.test.cjs.map +1 -1
- package/dist/version-manager.test.mjs +1 -1
- package/package.json +4 -4
- package/src/__snapshots__/composer.snapshot.test.ts.snap +5 -0
- package/src/addon-stack.test.ts +490 -0
- package/src/addon-stack.ts +998 -0
- package/src/composer.ts +4 -4
- package/src/index.ts +20 -2
- package/src/schema.ts +183 -0
- package/src/services/definitions/browserless.ts +3 -0
- package/src/services/definitions/convex.ts +31 -0
- package/src/services/definitions/grafana.ts +9 -0
- package/src/services/definitions/meilisearch.ts +9 -0
- package/src/services/definitions/minio.ts +2 -0
- package/src/services/definitions/n8n.ts +9 -0
- package/src/services/definitions/ollama.ts +2 -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/types.ts +18 -0
- package/dist/schema-eX44HhRp.d.mts.map +0 -1
- package/dist/schema-tn5RK8CM.d.cts.map +0 -1
- package/dist/vi.2VT5v0um-C_jmO7m2.mjs.map +0 -1
- package/dist/vi.2VT5v0um-iVBt6Fyq.cjs.map +0 -1
|
@@ -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 { generateCloneScripts } from "./clone-repos.mjs";
|
|
3
3
|
//#region src/generators/clone-repos.test.ts
|
|
4
4
|
/** Minimal resolved output with no services */
|
|
@@ -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)", () => {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const
|
|
1
|
+
const require_test_CTcmp4Su = require("../test.CTcmp4Su-DlzTarwH.cjs");
|
|
2
2
|
const require_generators_scripts = require("./scripts.cjs");
|
|
3
3
|
//#region src/generators/scripts.test.ts
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
require_test_CTcmp4Su.describe("generateScripts", () => {
|
|
5
|
+
require_test_CTcmp4Su.it("generates all 10 expected scripts (5 bash + 5 PowerShell)", () => {
|
|
6
6
|
const result = require_generators_scripts.generateScripts();
|
|
7
7
|
for (const script of [
|
|
8
8
|
"scripts/start.sh",
|
|
@@ -16,67 +16,67 @@ require_vi_2VT5v0um.describe("generateScripts", () => {
|
|
|
16
16
|
"scripts/backup.ps1",
|
|
17
17
|
"scripts/status.ps1"
|
|
18
18
|
]) {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
require_test_CTcmp4Su.globalExpect(result).toHaveProperty(script);
|
|
20
|
+
require_test_CTcmp4Su.globalExpect(result[script].length).toBeGreaterThan(0);
|
|
21
21
|
}
|
|
22
22
|
});
|
|
23
|
-
|
|
23
|
+
require_test_CTcmp4Su.it("start.sh calls docker compose up", () => {
|
|
24
24
|
const result = require_generators_scripts.generateScripts();
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/start.sh"]).toContain("docker compose");
|
|
26
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/start.sh"]).toContain("up");
|
|
27
27
|
});
|
|
28
|
-
|
|
28
|
+
require_test_CTcmp4Su.it("stop.sh calls docker compose down", () => {
|
|
29
29
|
const result = require_generators_scripts.generateScripts();
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/stop.sh"]).toContain("docker compose");
|
|
31
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/stop.sh"]).toContain("down");
|
|
32
32
|
});
|
|
33
|
-
|
|
33
|
+
require_test_CTcmp4Su.it("update.sh calls docker compose pull", () => {
|
|
34
34
|
const result = require_generators_scripts.generateScripts();
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/update.sh"]).toContain("docker compose");
|
|
36
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/update.sh"]).toContain("pull");
|
|
37
37
|
});
|
|
38
|
-
|
|
38
|
+
require_test_CTcmp4Su.it("backup.sh references volumes or backup", () => {
|
|
39
39
|
const backup = require_generators_scripts.generateScripts()["scripts/backup.sh"];
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
require_test_CTcmp4Su.globalExpect(backup).toBeDefined();
|
|
41
|
+
require_test_CTcmp4Su.globalExpect(backup.length).toBeGreaterThan(50);
|
|
42
42
|
});
|
|
43
|
-
|
|
43
|
+
require_test_CTcmp4Su.it("status.sh calls docker compose ps", () => {
|
|
44
44
|
const result = require_generators_scripts.generateScripts();
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/status.sh"]).toContain("docker compose");
|
|
46
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/status.sh"]).toContain("ps");
|
|
47
47
|
});
|
|
48
|
-
|
|
48
|
+
require_test_CTcmp4Su.it("all bash scripts start with shebang", () => {
|
|
49
49
|
const result = require_generators_scripts.generateScripts();
|
|
50
|
-
for (const [path, content] of Object.entries(result)) if (path.endsWith(".sh"))
|
|
50
|
+
for (const [path, content] of Object.entries(result)) if (path.endsWith(".sh")) require_test_CTcmp4Su.globalExpect(content.startsWith("#!/")).toBe(true);
|
|
51
51
|
});
|
|
52
|
-
|
|
52
|
+
require_test_CTcmp4Su.it("all PowerShell scripts start with #Requires", () => {
|
|
53
53
|
const result = require_generators_scripts.generateScripts();
|
|
54
|
-
for (const [path, content] of Object.entries(result)) if (path.endsWith(".ps1"))
|
|
54
|
+
for (const [path, content] of Object.entries(result)) if (path.endsWith(".ps1")) require_test_CTcmp4Su.globalExpect(content.startsWith("#Requires")).toBe(true);
|
|
55
55
|
});
|
|
56
|
-
|
|
56
|
+
require_test_CTcmp4Su.it("start.ps1 calls docker compose up", () => {
|
|
57
57
|
const result = require_generators_scripts.generateScripts();
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/start.ps1"]).toContain("docker compose");
|
|
59
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/start.ps1"]).toContain("up");
|
|
60
60
|
});
|
|
61
|
-
|
|
61
|
+
require_test_CTcmp4Su.it("stop.ps1 calls docker compose down", () => {
|
|
62
62
|
const result = require_generators_scripts.generateScripts();
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/stop.ps1"]).toContain("docker compose");
|
|
64
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/stop.ps1"]).toContain("down");
|
|
65
65
|
});
|
|
66
|
-
|
|
66
|
+
require_test_CTcmp4Su.it("update.ps1 calls docker compose pull", () => {
|
|
67
67
|
const result = require_generators_scripts.generateScripts();
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/update.ps1"]).toContain("docker compose");
|
|
69
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/update.ps1"]).toContain("pull");
|
|
70
70
|
});
|
|
71
|
-
|
|
71
|
+
require_test_CTcmp4Su.it("backup.ps1 references volumes or backup", () => {
|
|
72
72
|
const backup = require_generators_scripts.generateScripts()["scripts/backup.ps1"];
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
require_test_CTcmp4Su.globalExpect(backup).toBeDefined();
|
|
74
|
+
require_test_CTcmp4Su.globalExpect(backup.length).toBeGreaterThan(50);
|
|
75
75
|
});
|
|
76
|
-
|
|
76
|
+
require_test_CTcmp4Su.it("status.ps1 calls docker compose ps", () => {
|
|
77
77
|
const result = require_generators_scripts.generateScripts();
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/status.ps1"]).toContain("docker compose");
|
|
79
|
+
require_test_CTcmp4Su.globalExpect(result["scripts/status.ps1"]).toContain("ps");
|
|
80
80
|
});
|
|
81
81
|
});
|
|
82
82
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts.test.cjs","names":["describe","generateScripts"],"sources":["../../src/generators/scripts.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateScripts } from \"./scripts.js\";\n\ndescribe(\"generateScripts\", () => {\n\tit(\"generates all 10 expected scripts (5 bash + 5 PowerShell)\", () => {\n\t\tconst result = generateScripts();\n\n\t\tconst expectedScripts = [\n\t\t\t\"scripts/start.sh\",\n\t\t\t\"scripts/stop.sh\",\n\t\t\t\"scripts/update.sh\",\n\t\t\t\"scripts/backup.sh\",\n\t\t\t\"scripts/status.sh\",\n\t\t\t\"scripts/start.ps1\",\n\t\t\t\"scripts/stop.ps1\",\n\t\t\t\"scripts/update.ps1\",\n\t\t\t\"scripts/backup.ps1\",\n\t\t\t\"scripts/status.ps1\",\n\t\t];\n\n\t\tfor (const script of expectedScripts) {\n\t\t\texpect(result).toHaveProperty(script);\n\t\t\texpect(result[script]!.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"start.sh calls docker compose up\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/start.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/start.sh\"]).toContain(\"up\");\n\t});\n\n\tit(\"stop.sh calls docker compose down\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/stop.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/stop.sh\"]).toContain(\"down\");\n\t});\n\n\tit(\"update.sh calls docker compose pull\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/update.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/update.sh\"]).toContain(\"pull\");\n\t});\n\n\tit(\"backup.sh references volumes or backup\", () => {\n\t\tconst result = generateScripts();\n\t\tconst backup = result[\"scripts/backup.sh\"]!;\n\t\texpect(backup).toBeDefined();\n\t\texpect(backup.length).toBeGreaterThan(50);\n\t});\n\n\tit(\"status.sh calls docker compose ps\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/status.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/status.sh\"]).toContain(\"ps\");\n\t});\n\n\tit(\"all bash scripts start with shebang\", () => {\n\t\tconst result = generateScripts();\n\n\t\tfor (const [path, content] of Object.entries(result)) {\n\t\t\tif (path.endsWith(\".sh\")) {\n\t\t\t\texpect(content.startsWith(\"#!/\")).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"all PowerShell scripts start with #Requires\", () => {\n\t\tconst result = generateScripts();\n\n\t\tfor (const [path, content] of Object.entries(result)) {\n\t\t\tif (path.endsWith(\".ps1\")) {\n\t\t\t\texpect(content.startsWith(\"#Requires\")).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"start.ps1 calls docker compose up\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/start.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/start.ps1\"]).toContain(\"up\");\n\t});\n\n\tit(\"stop.ps1 calls docker compose down\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/stop.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/stop.ps1\"]).toContain(\"down\");\n\t});\n\n\tit(\"update.ps1 calls docker compose pull\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/update.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/update.ps1\"]).toContain(\"pull\");\n\t});\n\n\tit(\"backup.ps1 references volumes or backup\", () => {\n\t\tconst result = generateScripts();\n\t\tconst backup = result[\"scripts/backup.ps1\"]!;\n\t\texpect(backup).toBeDefined();\n\t\texpect(backup.length).toBeGreaterThan(50);\n\t});\n\n\tit(\"status.ps1 calls docker compose ps\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/status.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/status.ps1\"]).toContain(\"ps\");\n\t});\n});\n"],"mappings":";;;AAGAA,
|
|
1
|
+
{"version":3,"file":"scripts.test.cjs","names":["describe","generateScripts"],"sources":["../../src/generators/scripts.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateScripts } from \"./scripts.js\";\n\ndescribe(\"generateScripts\", () => {\n\tit(\"generates all 10 expected scripts (5 bash + 5 PowerShell)\", () => {\n\t\tconst result = generateScripts();\n\n\t\tconst expectedScripts = [\n\t\t\t\"scripts/start.sh\",\n\t\t\t\"scripts/stop.sh\",\n\t\t\t\"scripts/update.sh\",\n\t\t\t\"scripts/backup.sh\",\n\t\t\t\"scripts/status.sh\",\n\t\t\t\"scripts/start.ps1\",\n\t\t\t\"scripts/stop.ps1\",\n\t\t\t\"scripts/update.ps1\",\n\t\t\t\"scripts/backup.ps1\",\n\t\t\t\"scripts/status.ps1\",\n\t\t];\n\n\t\tfor (const script of expectedScripts) {\n\t\t\texpect(result).toHaveProperty(script);\n\t\t\texpect(result[script]!.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"start.sh calls docker compose up\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/start.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/start.sh\"]).toContain(\"up\");\n\t});\n\n\tit(\"stop.sh calls docker compose down\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/stop.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/stop.sh\"]).toContain(\"down\");\n\t});\n\n\tit(\"update.sh calls docker compose pull\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/update.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/update.sh\"]).toContain(\"pull\");\n\t});\n\n\tit(\"backup.sh references volumes or backup\", () => {\n\t\tconst result = generateScripts();\n\t\tconst backup = result[\"scripts/backup.sh\"]!;\n\t\texpect(backup).toBeDefined();\n\t\texpect(backup.length).toBeGreaterThan(50);\n\t});\n\n\tit(\"status.sh calls docker compose ps\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/status.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/status.sh\"]).toContain(\"ps\");\n\t});\n\n\tit(\"all bash scripts start with shebang\", () => {\n\t\tconst result = generateScripts();\n\n\t\tfor (const [path, content] of Object.entries(result)) {\n\t\t\tif (path.endsWith(\".sh\")) {\n\t\t\t\texpect(content.startsWith(\"#!/\")).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"all PowerShell scripts start with #Requires\", () => {\n\t\tconst result = generateScripts();\n\n\t\tfor (const [path, content] of Object.entries(result)) {\n\t\t\tif (path.endsWith(\".ps1\")) {\n\t\t\t\texpect(content.startsWith(\"#Requires\")).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"start.ps1 calls docker compose up\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/start.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/start.ps1\"]).toContain(\"up\");\n\t});\n\n\tit(\"stop.ps1 calls docker compose down\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/stop.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/stop.ps1\"]).toContain(\"down\");\n\t});\n\n\tit(\"update.ps1 calls docker compose pull\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/update.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/update.ps1\"]).toContain(\"pull\");\n\t});\n\n\tit(\"backup.ps1 references volumes or backup\", () => {\n\t\tconst result = generateScripts();\n\t\tconst backup = result[\"scripts/backup.ps1\"]!;\n\t\texpect(backup).toBeDefined();\n\t\texpect(backup.length).toBeGreaterThan(50);\n\t});\n\n\tit(\"status.ps1 calls docker compose ps\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/status.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/status.ps1\"]).toContain(\"ps\");\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 { generateScripts } from "./scripts.mjs";
|
|
3
3
|
//#region src/generators/scripts.test.ts
|
|
4
4
|
describe("generateScripts", () => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const require_test_CTcmp4Su = require("../test.CTcmp4Su-DlzTarwH.cjs");
|
|
2
2
|
const require_resolver = require("../resolver.cjs");
|
|
3
3
|
const require_generators_traefik = require("./traefik.cjs");
|
|
4
4
|
//#region src/generators/traefik.test.ts
|
|
@@ -10,56 +10,56 @@ function resolveWith(services) {
|
|
|
10
10
|
gpu: false
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
require_test_CTcmp4Su.describe("generateTraefikConfig", () => {
|
|
14
14
|
const domain = "example.com";
|
|
15
|
-
|
|
15
|
+
require_test_CTcmp4Su.it("generates static config with domain email and entrypoints", () => {
|
|
16
16
|
const { staticConfig } = require_generators_traefik.generateTraefikConfig(resolveWith(["redis"]), domain);
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
require_test_CTcmp4Su.globalExpect(staticConfig).toContain("admin@example.com");
|
|
18
|
+
require_test_CTcmp4Su.globalExpect(staticConfig).toContain("address: \":80\"");
|
|
19
|
+
require_test_CTcmp4Su.globalExpect(staticConfig).toContain("address: \":443\"");
|
|
20
|
+
require_test_CTcmp4Su.globalExpect(staticConfig).toContain("exposedByDefault: false");
|
|
21
|
+
require_test_CTcmp4Su.globalExpect(staticConfig).toContain("openclaw-network");
|
|
22
22
|
});
|
|
23
|
-
|
|
23
|
+
require_test_CTcmp4Su.it("generates labels for services with exposed ports", () => {
|
|
24
24
|
const { serviceLabels } = require_generators_traefik.generateTraefikConfig(resolveWith(["redis"]), domain);
|
|
25
25
|
const redisLabels = serviceLabels.get("redis");
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
require_test_CTcmp4Su.globalExpect(redisLabels).toBeDefined();
|
|
27
|
+
require_test_CTcmp4Su.globalExpect(redisLabels["traefik.enable"]).toBe("true");
|
|
28
|
+
require_test_CTcmp4Su.globalExpect(redisLabels["traefik.http.routers.redis.rule"]).toBe("Host(`redis.example.com`)");
|
|
29
|
+
require_test_CTcmp4Su.globalExpect(redisLabels["traefik.http.routers.redis.entrypoints"]).toBe("websecure");
|
|
30
|
+
require_test_CTcmp4Su.globalExpect(redisLabels["traefik.http.routers.redis.tls.certresolver"]).toBe("letsencrypt");
|
|
31
|
+
require_test_CTcmp4Su.globalExpect(redisLabels["traefik.http.services.redis.loadbalancer.server.port"]).toBe("6379");
|
|
32
32
|
});
|
|
33
|
-
|
|
33
|
+
require_test_CTcmp4Su.it("generates HTTP to HTTPS redirect labels", () => {
|
|
34
34
|
const { serviceLabels } = require_generators_traefik.generateTraefikConfig(resolveWith(["redis"]), domain);
|
|
35
35
|
const redisLabels = serviceLabels.get("redis");
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
require_test_CTcmp4Su.globalExpect(redisLabels["traefik.http.routers.redis-http.entrypoints"]).toBe("web");
|
|
37
|
+
require_test_CTcmp4Su.globalExpect(redisLabels["traefik.http.routers.redis-http.middlewares"]).toBe("redirect-to-https");
|
|
38
38
|
});
|
|
39
|
-
|
|
39
|
+
require_test_CTcmp4Su.it("assigns root domain to gateway", () => {
|
|
40
40
|
const { serviceLabels } = require_generators_traefik.generateTraefikConfig(resolveWith(["redis"]), domain);
|
|
41
41
|
const gwLabels = serviceLabels.get("openclaw-gateway");
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
require_test_CTcmp4Su.globalExpect(gwLabels).toBeDefined();
|
|
43
|
+
require_test_CTcmp4Su.globalExpect(gwLabels["traefik.http.routers.gateway.rule"]).toBe("Host(`example.com`)");
|
|
44
|
+
require_test_CTcmp4Su.globalExpect(gwLabels["traefik.http.services.gateway.loadbalancer.server.port"]).toBe("18789");
|
|
45
45
|
});
|
|
46
|
-
|
|
46
|
+
require_test_CTcmp4Su.it("adds global redirect middleware on traefik service", () => {
|
|
47
47
|
const { serviceLabels } = require_generators_traefik.generateTraefikConfig(resolveWith(["redis"]), domain);
|
|
48
48
|
const traefikLabels = serviceLabels.get("traefik");
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
require_test_CTcmp4Su.globalExpect(traefikLabels).toBeDefined();
|
|
50
|
+
require_test_CTcmp4Su.globalExpect(traefikLabels["traefik.http.middlewares.redirect-to-https.redirectscheme.scheme"]).toBe("https");
|
|
51
|
+
require_test_CTcmp4Su.globalExpect(traefikLabels["traefik.http.middlewares.redirect-to-https.redirectscheme.permanent"]).toBe("true");
|
|
52
52
|
});
|
|
53
|
-
|
|
53
|
+
require_test_CTcmp4Su.it("skips proxy services and services without exposed ports", () => {
|
|
54
54
|
const { serviceLabels } = require_generators_traefik.generateTraefikConfig(resolveWith(["redis", "ffmpeg"]), domain);
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
require_test_CTcmp4Su.globalExpect(serviceLabels.has("ffmpeg")).toBe(false);
|
|
56
|
+
require_test_CTcmp4Su.globalExpect(serviceLabels.get("traefik")["traefik.http.routers.traefik.rule"]).toBeUndefined();
|
|
57
57
|
});
|
|
58
|
-
|
|
58
|
+
require_test_CTcmp4Su.it("sanitizes service names with hyphens in router names", () => {
|
|
59
59
|
const { serviceLabels } = require_generators_traefik.generateTraefikConfig(resolveWith(["open-webui"]), domain);
|
|
60
60
|
const labels = serviceLabels.get("open-webui");
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
require_test_CTcmp4Su.globalExpect(labels).toBeDefined();
|
|
62
|
+
require_test_CTcmp4Su.globalExpect(labels["traefik.http.routers.openwebui.rule"]).toBe("Host(`open-webui.example.com`)");
|
|
63
63
|
});
|
|
64
64
|
});
|
|
65
65
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traefik.test.cjs","names":["resolve","describe","generateTraefikConfig"],"sources":["../../src/generators/traefik.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { resolve } from \"../resolver.js\";\nimport type { ResolverOutput } from \"../types.js\";\nimport { generateTraefikConfig } from \"./traefik.js\";\n\nfunction resolveWith(services: string[]): ResolverOutput {\n\treturn resolve({ services, skillPacks: [], proxy: \"traefik\", gpu: false });\n}\n\ndescribe(\"generateTraefikConfig\", () => {\n\tconst domain = \"example.com\";\n\n\tit(\"generates static config with domain email and entrypoints\", () => {\n\t\tconst resolved = resolveWith([\"redis\"]);\n\t\tconst { staticConfig } = generateTraefikConfig(resolved, domain);\n\n\t\texpect(staticConfig).toContain(\"admin@example.com\");\n\t\texpect(staticConfig).toContain('address: \":80\"');\n\t\texpect(staticConfig).toContain('address: \":443\"');\n\t\texpect(staticConfig).toContain(\"exposedByDefault: false\");\n\t\texpect(staticConfig).toContain(\"openclaw-network\");\n\t});\n\n\tit(\"generates labels for services with exposed ports\", () => {\n\t\tconst resolved = resolveWith([\"redis\"]);\n\t\tconst { serviceLabels } = generateTraefikConfig(resolved, domain);\n\n\t\tconst redisLabels = serviceLabels.get(\"redis\");\n\t\texpect(redisLabels).toBeDefined();\n\t\texpect(redisLabels![\"traefik.enable\"]).toBe(\"true\");\n\t\texpect(redisLabels![\"traefik.http.routers.redis.rule\"]).toBe(\"Host(`redis.example.com`)\");\n\t\texpect(redisLabels![\"traefik.http.routers.redis.entrypoints\"]).toBe(\"websecure\");\n\t\texpect(redisLabels![\"traefik.http.routers.redis.tls.certresolver\"]).toBe(\"letsencrypt\");\n\t\texpect(redisLabels![\"traefik.http.services.redis.loadbalancer.server.port\"]).toBe(\"6379\");\n\t});\n\n\tit(\"generates HTTP to HTTPS redirect labels\", () => {\n\t\tconst resolved = resolveWith([\"redis\"]);\n\t\tconst { serviceLabels } = generateTraefikConfig(resolved, domain);\n\n\t\tconst redisLabels = serviceLabels.get(\"redis\")!;\n\t\texpect(redisLabels[\"traefik.http.routers.redis-http.entrypoints\"]).toBe(\"web\");\n\t\texpect(redisLabels[\"traefik.http.routers.redis-http.middlewares\"]).toBe(\"redirect-to-https\");\n\t});\n\n\tit(\"assigns root domain to gateway\", () => {\n\t\tconst resolved = resolveWith([\"redis\"]);\n\t\tconst { serviceLabels } = generateTraefikConfig(resolved, domain);\n\n\t\tconst gwLabels = serviceLabels.get(\"openclaw-gateway\");\n\t\texpect(gwLabels).toBeDefined();\n\t\texpect(gwLabels![\"traefik.http.routers.gateway.rule\"]).toBe(\"Host(`example.com`)\");\n\t\texpect(gwLabels![\"traefik.http.services.gateway.loadbalancer.server.port\"]).toBe(\"18789\");\n\t});\n\n\tit(\"adds global redirect middleware on traefik service\", () => {\n\t\tconst resolved = resolveWith([\"redis\"]);\n\t\tconst { serviceLabels } = generateTraefikConfig(resolved, domain);\n\n\t\tconst traefikLabels = serviceLabels.get(\"traefik\");\n\t\texpect(traefikLabels).toBeDefined();\n\t\texpect(traefikLabels![\"traefik.http.middlewares.redirect-to-https.redirectscheme.scheme\"]).toBe(\n\t\t\t\"https\",\n\t\t);\n\t\texpect(\n\t\t\ttraefikLabels![\"traefik.http.middlewares.redirect-to-https.redirectscheme.permanent\"],\n\t\t).toBe(\"true\");\n\t});\n\n\tit(\"skips proxy services and services without exposed ports\", () => {\n\t\tconst resolved = resolveWith([\"redis\", \"ffmpeg\"]);\n\t\tconst { serviceLabels } = generateTraefikConfig(resolved, domain);\n\n\t\t// ffmpeg has no exposed ports\n\t\texpect(serviceLabels.has(\"ffmpeg\")).toBe(false);\n\t\t// traefik itself is handled separately (not as a regular service)\n\t\texpect(serviceLabels.get(\"traefik\")![\"traefik.http.routers.traefik.rule\"]).toBeUndefined();\n\t});\n\n\tit(\"sanitizes service names with hyphens in router names\", () => {\n\t\tconst resolved = resolveWith([\"open-webui\"]);\n\t\tconst { serviceLabels } = generateTraefikConfig(resolved, domain);\n\n\t\tconst labels = serviceLabels.get(\"open-webui\");\n\t\texpect(labels).toBeDefined();\n\t\t// Router name has hyphens removed\n\t\texpect(labels![\"traefik.http.routers.openwebui.rule\"]).toBe(\"Host(`open-webui.example.com`)\");\n\t});\n});\n"],"mappings":";;;;AAKA,SAAS,YAAY,UAAoC;AACxD,QAAOA,iBAAAA,QAAQ;EAAE;EAAU,YAAY,EAAE;EAAE,OAAO;EAAW,KAAK;EAAO,CAAC;;AAG3EC,
|
|
1
|
+
{"version":3,"file":"traefik.test.cjs","names":["resolve","describe","generateTraefikConfig"],"sources":["../../src/generators/traefik.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { resolve } from \"../resolver.js\";\nimport type { ResolverOutput } from \"../types.js\";\nimport { generateTraefikConfig } from \"./traefik.js\";\n\nfunction resolveWith(services: string[]): ResolverOutput {\n\treturn resolve({ services, skillPacks: [], proxy: \"traefik\", gpu: false });\n}\n\ndescribe(\"generateTraefikConfig\", () => {\n\tconst domain = \"example.com\";\n\n\tit(\"generates static config with domain email and entrypoints\", () => {\n\t\tconst resolved = resolveWith([\"redis\"]);\n\t\tconst { staticConfig } = generateTraefikConfig(resolved, domain);\n\n\t\texpect(staticConfig).toContain(\"admin@example.com\");\n\t\texpect(staticConfig).toContain('address: \":80\"');\n\t\texpect(staticConfig).toContain('address: \":443\"');\n\t\texpect(staticConfig).toContain(\"exposedByDefault: false\");\n\t\texpect(staticConfig).toContain(\"openclaw-network\");\n\t});\n\n\tit(\"generates labels for services with exposed ports\", () => {\n\t\tconst resolved = resolveWith([\"redis\"]);\n\t\tconst { serviceLabels } = generateTraefikConfig(resolved, domain);\n\n\t\tconst redisLabels = serviceLabels.get(\"redis\");\n\t\texpect(redisLabels).toBeDefined();\n\t\texpect(redisLabels![\"traefik.enable\"]).toBe(\"true\");\n\t\texpect(redisLabels![\"traefik.http.routers.redis.rule\"]).toBe(\"Host(`redis.example.com`)\");\n\t\texpect(redisLabels![\"traefik.http.routers.redis.entrypoints\"]).toBe(\"websecure\");\n\t\texpect(redisLabels![\"traefik.http.routers.redis.tls.certresolver\"]).toBe(\"letsencrypt\");\n\t\texpect(redisLabels![\"traefik.http.services.redis.loadbalancer.server.port\"]).toBe(\"6379\");\n\t});\n\n\tit(\"generates HTTP to HTTPS redirect labels\", () => {\n\t\tconst resolved = resolveWith([\"redis\"]);\n\t\tconst { serviceLabels } = generateTraefikConfig(resolved, domain);\n\n\t\tconst redisLabels = serviceLabels.get(\"redis\")!;\n\t\texpect(redisLabels[\"traefik.http.routers.redis-http.entrypoints\"]).toBe(\"web\");\n\t\texpect(redisLabels[\"traefik.http.routers.redis-http.middlewares\"]).toBe(\"redirect-to-https\");\n\t});\n\n\tit(\"assigns root domain to gateway\", () => {\n\t\tconst resolved = resolveWith([\"redis\"]);\n\t\tconst { serviceLabels } = generateTraefikConfig(resolved, domain);\n\n\t\tconst gwLabels = serviceLabels.get(\"openclaw-gateway\");\n\t\texpect(gwLabels).toBeDefined();\n\t\texpect(gwLabels![\"traefik.http.routers.gateway.rule\"]).toBe(\"Host(`example.com`)\");\n\t\texpect(gwLabels![\"traefik.http.services.gateway.loadbalancer.server.port\"]).toBe(\"18789\");\n\t});\n\n\tit(\"adds global redirect middleware on traefik service\", () => {\n\t\tconst resolved = resolveWith([\"redis\"]);\n\t\tconst { serviceLabels } = generateTraefikConfig(resolved, domain);\n\n\t\tconst traefikLabels = serviceLabels.get(\"traefik\");\n\t\texpect(traefikLabels).toBeDefined();\n\t\texpect(traefikLabels![\"traefik.http.middlewares.redirect-to-https.redirectscheme.scheme\"]).toBe(\n\t\t\t\"https\",\n\t\t);\n\t\texpect(\n\t\t\ttraefikLabels![\"traefik.http.middlewares.redirect-to-https.redirectscheme.permanent\"],\n\t\t).toBe(\"true\");\n\t});\n\n\tit(\"skips proxy services and services without exposed ports\", () => {\n\t\tconst resolved = resolveWith([\"redis\", \"ffmpeg\"]);\n\t\tconst { serviceLabels } = generateTraefikConfig(resolved, domain);\n\n\t\t// ffmpeg has no exposed ports\n\t\texpect(serviceLabels.has(\"ffmpeg\")).toBe(false);\n\t\t// traefik itself is handled separately (not as a regular service)\n\t\texpect(serviceLabels.get(\"traefik\")![\"traefik.http.routers.traefik.rule\"]).toBeUndefined();\n\t});\n\n\tit(\"sanitizes service names with hyphens in router names\", () => {\n\t\tconst resolved = resolveWith([\"open-webui\"]);\n\t\tconst { serviceLabels } = generateTraefikConfig(resolved, domain);\n\n\t\tconst labels = serviceLabels.get(\"open-webui\");\n\t\texpect(labels).toBeDefined();\n\t\t// Router name has hyphens removed\n\t\texpect(labels![\"traefik.http.routers.openwebui.rule\"]).toBe(\"Host(`open-webui.example.com`)\");\n\t});\n});\n"],"mappings":";;;;AAKA,SAAS,YAAY,UAAoC;AACxD,QAAOA,iBAAAA,QAAQ;EAAE;EAAU,YAAY,EAAE;EAAE,OAAO;EAAW,KAAK;EAAO,CAAC;;AAG3EC,sBAAAA,SAAS,+BAA+B;CACvC,MAAM,SAAS;AAEf,uBAAA,GAAG,mEAAmE;EAErE,MAAM,EAAE,iBAAiBC,2BAAAA,sBADR,YAAY,CAAC,QAAQ,CAAC,EACkB,OAAO;AAEhE,wBAAA,aAAO,aAAa,CAAC,UAAU,oBAAoB;AACnD,wBAAA,aAAO,aAAa,CAAC,UAAU,mBAAiB;AAChD,wBAAA,aAAO,aAAa,CAAC,UAAU,oBAAkB;AACjD,wBAAA,aAAO,aAAa,CAAC,UAAU,0BAA0B;AACzD,wBAAA,aAAO,aAAa,CAAC,UAAU,mBAAmB;GACjD;AAEF,uBAAA,GAAG,0DAA0D;EAE5D,MAAM,EAAE,kBAAkBA,2BAAAA,sBADT,YAAY,CAAC,QAAQ,CAAC,EACmB,OAAO;EAEjE,MAAM,cAAc,cAAc,IAAI,QAAQ;AAC9C,wBAAA,aAAO,YAAY,CAAC,aAAa;AACjC,wBAAA,aAAO,YAAa,kBAAkB,CAAC,KAAK,OAAO;AACnD,wBAAA,aAAO,YAAa,mCAAmC,CAAC,KAAK,4BAA4B;AACzF,wBAAA,aAAO,YAAa,0CAA0C,CAAC,KAAK,YAAY;AAChF,wBAAA,aAAO,YAAa,+CAA+C,CAAC,KAAK,cAAc;AACvF,wBAAA,aAAO,YAAa,wDAAwD,CAAC,KAAK,OAAO;GACxF;AAEF,uBAAA,GAAG,iDAAiD;EAEnD,MAAM,EAAE,kBAAkBA,2BAAAA,sBADT,YAAY,CAAC,QAAQ,CAAC,EACmB,OAAO;EAEjE,MAAM,cAAc,cAAc,IAAI,QAAQ;AAC9C,wBAAA,aAAO,YAAY,+CAA+C,CAAC,KAAK,MAAM;AAC9E,wBAAA,aAAO,YAAY,+CAA+C,CAAC,KAAK,oBAAoB;GAC3F;AAEF,uBAAA,GAAG,wCAAwC;EAE1C,MAAM,EAAE,kBAAkBA,2BAAAA,sBADT,YAAY,CAAC,QAAQ,CAAC,EACmB,OAAO;EAEjE,MAAM,WAAW,cAAc,IAAI,mBAAmB;AACtD,wBAAA,aAAO,SAAS,CAAC,aAAa;AAC9B,wBAAA,aAAO,SAAU,qCAAqC,CAAC,KAAK,sBAAsB;AAClF,wBAAA,aAAO,SAAU,0DAA0D,CAAC,KAAK,QAAQ;GACxF;AAEF,uBAAA,GAAG,4DAA4D;EAE9D,MAAM,EAAE,kBAAkBA,2BAAAA,sBADT,YAAY,CAAC,QAAQ,CAAC,EACmB,OAAO;EAEjE,MAAM,gBAAgB,cAAc,IAAI,UAAU;AAClD,wBAAA,aAAO,cAAc,CAAC,aAAa;AACnC,wBAAA,aAAO,cAAe,oEAAoE,CAAC,KAC1F,QACA;AACD,wBAAA,aACC,cAAe,uEACf,CAAC,KAAK,OAAO;GACb;AAEF,uBAAA,GAAG,iEAAiE;EAEnE,MAAM,EAAE,kBAAkBA,2BAAAA,sBADT,YAAY,CAAC,SAAS,SAAS,CAAC,EACS,OAAO;AAGjE,wBAAA,aAAO,cAAc,IAAI,SAAS,CAAC,CAAC,KAAK,MAAM;AAE/C,wBAAA,aAAO,cAAc,IAAI,UAAU,CAAE,qCAAqC,CAAC,eAAe;GACzF;AAEF,uBAAA,GAAG,8DAA8D;EAEhE,MAAM,EAAE,kBAAkBA,2BAAAA,sBADT,YAAY,CAAC,aAAa,CAAC,EACc,OAAO;EAEjE,MAAM,SAAS,cAAc,IAAI,aAAa;AAC9C,wBAAA,aAAO,OAAO,CAAC,aAAa;AAE5B,wBAAA,aAAO,OAAQ,uCAAuC,CAAC,KAAK,iCAAiC;GAC5F;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 { resolve } from "../resolver.mjs";
|
|
3
3
|
import { generateTraefikConfig } from "./traefik.mjs";
|
|
4
4
|
//#region src/generators/traefik.test.ts
|