@styleflow.app/flowpress-deploy 1.0.0-beta.3 → 1.0.0-beta.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/CHANGELOG.md +162 -0
  2. package/README.md +5 -0
  3. package/composer.json +1 -1
  4. package/containers/cms/Dockerfile +35 -0
  5. package/containers/cms/Dockerfile.dockerignore +20 -0
  6. package/containers/cms/healthz.php +17 -0
  7. package/containers/cms/install-languages.sh +16 -0
  8. package/containers/cms/mpm.conf +10 -0
  9. package/containers/cms/php.ini +16 -0
  10. package/containers/cms/sanitize-integrations.php +14 -0
  11. package/containers/cms/sanitize.php +40 -0
  12. package/containers/cms/smtp.php +13 -0
  13. package/containers/cms/vhost.conf +61 -0
  14. package/containers/cms/wp-cli.yml +1 -0
  15. package/containers/local/cms/Dockerfile +18 -0
  16. package/containers/local/cms/entrypoint.sh +7 -0
  17. package/containers/local/cms/php.ini +8 -0
  18. package/containers/local/cms/vhost.conf +14 -0
  19. package/containers/local/runtimes.json +14 -0
  20. package/containers/local/web/Dockerfile +8 -0
  21. package/containers/local/web/entrypoint.sh +21 -0
  22. package/containers/php-runtime/Dockerfile +21 -0
  23. package/containers/web-ssr/Dockerfile +27 -0
  24. package/containers/web-ssr/Dockerfile.dockerignore +10 -0
  25. package/containers/web-static/Caddyfile +40 -0
  26. package/containers/web-static/Dockerfile +17 -0
  27. package/containers/web-static/Dockerfile.dockerignore +7 -0
  28. package/dist/development.d.ts +12 -0
  29. package/dist/development.d.ts.map +1 -0
  30. package/dist/development.js +57 -0
  31. package/dist/development.js.map +1 -0
  32. package/dist/node-fetch.d.ts +3 -0
  33. package/dist/node-fetch.d.ts.map +1 -0
  34. package/dist/node-fetch.js +20 -0
  35. package/dist/node-fetch.js.map +1 -0
  36. package/dist/ops/bootstrap.d.ts +24 -0
  37. package/dist/ops/bootstrap.d.ts.map +1 -0
  38. package/dist/ops/bootstrap.js +156 -0
  39. package/dist/ops/bootstrap.js.map +1 -0
  40. package/dist/ops/build.d.ts +45 -0
  41. package/dist/ops/build.d.ts.map +1 -0
  42. package/dist/ops/build.js +119 -0
  43. package/dist/ops/build.js.map +1 -0
  44. package/dist/ops/check.d.ts +14 -0
  45. package/dist/ops/check.d.ts.map +1 -0
  46. package/dist/ops/check.js +42 -0
  47. package/dist/ops/check.js.map +1 -0
  48. package/dist/ops/cli.d.ts +3 -0
  49. package/dist/ops/cli.d.ts.map +1 -0
  50. package/dist/ops/cli.js +198 -0
  51. package/dist/ops/cli.js.map +1 -0
  52. package/dist/ops/cms-migrate.d.ts +14 -0
  53. package/dist/ops/cms-migrate.d.ts.map +1 -0
  54. package/dist/ops/cms-migrate.js +133 -0
  55. package/dist/ops/cms-migrate.js.map +1 -0
  56. package/dist/ops/cms-template/command.d.mts +19 -0
  57. package/dist/ops/cms-template/command.d.mts.map +1 -0
  58. package/dist/ops/cms-template/command.mjs +145 -0
  59. package/dist/ops/cms-template/command.mjs.map +1 -0
  60. package/dist/ops/cms-template/confirm.d.mts +11 -0
  61. package/dist/ops/cms-template/confirm.d.mts.map +1 -0
  62. package/dist/ops/cms-template/confirm.mjs +18 -0
  63. package/dist/ops/cms-template/confirm.mjs.map +1 -0
  64. package/dist/ops/cms-template/entry.d.mts +2 -0
  65. package/dist/ops/cms-template/entry.d.mts.map +1 -0
  66. package/dist/ops/cms-template/entry.mjs +22 -0
  67. package/dist/ops/cms-template/entry.mjs.map +1 -0
  68. package/dist/ops/cms-template/git.d.mts +7 -0
  69. package/dist/ops/cms-template/git.d.mts.map +1 -0
  70. package/dist/ops/cms-template/git.mjs +22 -0
  71. package/dist/ops/cms-template/git.mjs.map +1 -0
  72. package/dist/ops/cms-template/plan.d.mts +7 -0
  73. package/dist/ops/cms-template/plan.d.mts.map +1 -0
  74. package/dist/ops/cms-template/plan.mjs +54 -0
  75. package/dist/ops/cms-template/plan.mjs.map +1 -0
  76. package/dist/ops/cms-template/store.d.mts +21 -0
  77. package/dist/ops/cms-template/store.d.mts.map +1 -0
  78. package/dist/ops/cms-template/store.mjs +184 -0
  79. package/dist/ops/cms-template/store.mjs.map +1 -0
  80. package/dist/ops/cms-template/target.d.mts +15 -0
  81. package/dist/ops/cms-template/target.d.mts.map +1 -0
  82. package/dist/ops/cms-template/target.mjs +24 -0
  83. package/dist/ops/cms-template/target.mjs.map +1 -0
  84. package/dist/ops/cms-template/transport.d.mts +26 -0
  85. package/dist/ops/cms-template/transport.d.mts.map +1 -0
  86. package/dist/ops/cms-template/transport.mjs +115 -0
  87. package/dist/ops/cms-template/transport.mjs.map +1 -0
  88. package/dist/ops/config.d.ts +54 -0
  89. package/dist/ops/config.d.ts.map +1 -0
  90. package/dist/ops/config.js +221 -0
  91. package/dist/ops/config.js.map +1 -0
  92. package/dist/ops/coolify.d.ts +2 -0
  93. package/dist/ops/coolify.d.ts.map +1 -0
  94. package/dist/ops/coolify.js +44 -0
  95. package/dist/ops/coolify.js.map +1 -0
  96. package/dist/ops/data.d.ts +31 -0
  97. package/dist/ops/data.d.ts.map +1 -0
  98. package/dist/ops/data.js +165 -0
  99. package/dist/ops/data.js.map +1 -0
  100. package/dist/ops/deploy.d.ts +38 -0
  101. package/dist/ops/deploy.d.ts.map +1 -0
  102. package/dist/ops/deploy.js +127 -0
  103. package/dist/ops/deploy.js.map +1 -0
  104. package/dist/ops/editorial.d.ts +23 -0
  105. package/dist/ops/editorial.d.ts.map +1 -0
  106. package/dist/ops/editorial.js +79 -0
  107. package/dist/ops/editorial.js.map +1 -0
  108. package/dist/ops/environment-files.d.ts +9 -0
  109. package/dist/ops/environment-files.d.ts.map +1 -0
  110. package/dist/ops/environment-files.js +127 -0
  111. package/dist/ops/environment-files.js.map +1 -0
  112. package/dist/ops/environment.d.ts +31 -0
  113. package/dist/ops/environment.d.ts.map +1 -0
  114. package/dist/ops/environment.js +165 -0
  115. package/dist/ops/environment.js.map +1 -0
  116. package/dist/ops/features.d.ts +12 -0
  117. package/dist/ops/features.d.ts.map +1 -0
  118. package/dist/ops/features.js +71 -0
  119. package/dist/ops/features.js.map +1 -0
  120. package/dist/ops/health.d.ts +26 -0
  121. package/dist/ops/health.d.ts.map +1 -0
  122. package/dist/ops/health.js +27 -0
  123. package/dist/ops/health.js.map +1 -0
  124. package/dist/ops/local.d.ts +198 -0
  125. package/dist/ops/local.d.ts.map +1 -0
  126. package/dist/ops/local.js +187 -0
  127. package/dist/ops/local.js.map +1 -0
  128. package/dist/ops/media-config.d.ts +61 -0
  129. package/dist/ops/media-config.d.ts.map +1 -0
  130. package/dist/ops/media-config.js +96 -0
  131. package/dist/ops/media-config.js.map +1 -0
  132. package/dist/ops/media.d.ts +47 -0
  133. package/dist/ops/media.d.ts.map +1 -0
  134. package/dist/ops/media.js +81 -0
  135. package/dist/ops/media.js.map +1 -0
  136. package/dist/ops/monitor.d.ts +25 -0
  137. package/dist/ops/monitor.d.ts.map +1 -0
  138. package/dist/ops/monitor.js +143 -0
  139. package/dist/ops/monitor.js.map +1 -0
  140. package/dist/ops/process.d.ts +9 -0
  141. package/dist/ops/process.d.ts.map +1 -0
  142. package/dist/ops/process.js +56 -0
  143. package/dist/ops/process.js.map +1 -0
  144. package/dist/ops/provision.d.ts +41 -0
  145. package/dist/ops/provision.d.ts.map +1 -0
  146. package/dist/ops/provision.js +268 -0
  147. package/dist/ops/provision.js.map +1 -0
  148. package/dist/ops/registry.d.ts +14 -0
  149. package/dist/ops/registry.d.ts.map +1 -0
  150. package/dist/ops/registry.js +112 -0
  151. package/dist/ops/registry.js.map +1 -0
  152. package/dist/ops/release.d.ts +26 -0
  153. package/dist/ops/release.d.ts.map +1 -0
  154. package/dist/ops/release.js +79 -0
  155. package/dist/ops/release.js.map +1 -0
  156. package/dist/ops/runtimes.d.ts +16 -0
  157. package/dist/ops/runtimes.d.ts.map +1 -0
  158. package/dist/ops/runtimes.js +70 -0
  159. package/dist/ops/runtimes.js.map +1 -0
  160. package/dist/ops/s3.d.ts +8 -0
  161. package/dist/ops/s3.d.ts.map +1 -0
  162. package/dist/ops/s3.js +38 -0
  163. package/dist/ops/s3.js.map +1 -0
  164. package/dist/ops/static-config.d.ts +14 -0
  165. package/dist/ops/static-config.d.ts.map +1 -0
  166. package/dist/ops/static-config.js +92 -0
  167. package/dist/ops/static-config.js.map +1 -0
  168. package/dist/ops/storage.d.ts +39 -0
  169. package/dist/ops/storage.d.ts.map +1 -0
  170. package/dist/ops/storage.js +108 -0
  171. package/dist/ops/storage.js.map +1 -0
  172. package/flowpress-deploy.php +2 -2
  173. package/includes/pilot-aliases.php +69 -0
  174. package/package.json +43 -6
  175. package/schema/deployment.schema.json +306 -0
@@ -0,0 +1,127 @@
1
+ import { mediaEnvironment, mediaConfiguration } from "./media-config.js";
2
+ import { chmodSync, copyFileSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { randomBytes } from "node:crypto";
5
+ import { assertManifest, identity, readEnv, readManifest, saltKeys } from "./config.js";
6
+ const derived = new Set(["APP_ENV", "PROJECT_NAME", "PROJECT_SLUG", "ASTRO_OUTPUT_MODE", "SITE_URL", "SITE_ALIASES_JSON", "BACKEND_URL", "BACKEND_GRAPHQL_URL", "WP_ENV", "WP_HOME", "WP_SITEURL", "FLOWPRESS_RUNTIME_POLICY", "FLOWPRESS_MEDIA_STORAGE", "FLOWPRESS_MEDIA", "FLOWPRESS_MAIL_MODE", "SF_STATIC_TARGETS_JSON", "SF_DIST_DIR", "FLOWPRESS_FRONTENDS_JSON", "FLOWPRESS_FRONTEND_VIEW_ID", "FLOWPRESS_FRONTEND_REDIRECT_ID"]);
7
+ for (const key of ["FLOWPRESS_MEDIA_PROVIDER", "FLOWPRESS_MEDIA_SHARED", "FLOWPRESS_MEDIA_PREFIX"])
8
+ derived.add(key);
9
+ const legacy = /^(CLOUDFLARE_|CF_|BACKEND_DEPLOY_|DEPLOY_BRANCH_MAP_JSON$)/;
10
+ const credential = /(?:PASSWORD|SECRET|TOKEN|AUTH_KEY|NONCE_KEY|LOGGED_IN_KEY|SALT|COMPOSER_AUTH|WP_USER|^ADVMO_.*_KEY$)/;
11
+ function envValue(value) {
12
+ const text = String(value);
13
+ if (!text || /^[a-zA-Z0-9_./:@?&=,+%-]+$/.test(text))
14
+ return text;
15
+ // dotenv does not decode JSON's escaped double quotes. JSON settings must
16
+ // retain their literal quotes so Node and PHP read the same JSON value.
17
+ if (!text.includes("'") && !/[\r\n]/.test(text))
18
+ return "'" + text + "'";
19
+ if (!/["\\\r\n]/.test(text))
20
+ return '"' + text + '"';
21
+ return JSON.stringify(text);
22
+ }
23
+ const serialize = (values, original = {}) => Object.entries(values).filter(([, value]) => value !== undefined).sort(([a], [b]) => a.localeCompare(b)).map(([key, value]) => original[key] || key + "=" + envValue(value)).join("\n") + "\n";
24
+ // The manifest owns endpoints; each file retains only its own custom settings
25
+ // and credentials. A remote environment never inherits the local file.
26
+ export function synchronizeEnvironmentFiles(root, { apply = false, localSecrets = false, manifest = readManifest(root) } = {}) {
27
+ assertManifest(manifest);
28
+ const project = identity(root).slug;
29
+ const localExample = readEnv(join(root, ".env.example"));
30
+ const ports = manifest.development?.ports || {};
31
+ const port = String(ports.web || localExample.LOCAL_ASTRO_PORT || "4321");
32
+ const changed = [], backupRoot = join(root, ".local/flowpress-environment-backup");
33
+ function backup(relative) {
34
+ const file = join(root, relative), backup = join(backupRoot, relative);
35
+ if (existsSync(file) && !existsSync(backup)) {
36
+ mkdirSync(dirname(backup), { recursive: true, mode: 0o700 });
37
+ copyFileSync(file, backup);
38
+ chmodSync(backup, 0o600);
39
+ }
40
+ }
41
+ function write(relative, content, mode) {
42
+ const file = join(root, relative);
43
+ if (existsSync(file) && readFileSync(file, "utf8") === content)
44
+ return;
45
+ changed.push(relative);
46
+ if (apply) {
47
+ backup(relative);
48
+ writeFileSync(file, content, { mode });
49
+ chmodSync(file, mode);
50
+ }
51
+ }
52
+ for (const [name, target] of Object.entries(manifest.environments)) {
53
+ const source = manifest.environments[target.backend || name];
54
+ const backend = target.backendUrl || source.backendUrl;
55
+ const frontend = target.frontendUrl || backend;
56
+ const publicFile = name === "local" ? ".env.example" : ".env." + name + ".example";
57
+ const privateFile = name === "local" ? ".env" : ".env." + name;
58
+ const frontends = Object.entries(manifest.environments).filter(([id, item]) => item.frontendUrl && (name === "local" || id !== "local")).map(([id, item]) => ({ id, url: item.frontendUrl, aliases: item.aliases || [], indexing: id === "production" ? "index" : "noindex" }));
59
+ const configured = {
60
+ APP_ENV: name, PROJECT_NAME: project, PROJECT_SLUG: project,
61
+ ASTRO_OUTPUT_MODE: name === "local" || name === "preview" || (target.profile || manifest.profile) === "headless-ssr" ? "server" : "static",
62
+ SITE_URL: frontend, SITE_ALIASES_JSON: JSON.stringify(target.aliases || []),
63
+ BACKEND_URL: backend, BACKEND_GRAPHQL_URL: source.graphqlUrl || (backend ? backend + "/index.php?graphql" : undefined),
64
+ WP_ENV: name === "local" ? "development" : name === "production" ? "production" : "staging",
65
+ WP_HOME: backend, WP_SITEURL: backend ? backend + "/wp" : undefined,
66
+ FLOWPRESS_RUNTIME_POLICY: "container", FLOWPRESS_MEDIA_STORAGE: mediaConfiguration(manifest, name).storage,
67
+ FLOWPRESS_MEDIA: source.mediaUrl || "", FLOWPRESS_MAIL_MODE: name === "production" ? target.mail || "disabled" : target.mail === "capture" ? "capture" : "disabled",
68
+ SF_STATIC_TARGETS_JSON: target.publish.includes("web-static") ? JSON.stringify([name]) : "[]",
69
+ SF_DIST_DIR: "apps/web/dist-" + name,
70
+ FLOWPRESS_FRONTENDS_JSON: JSON.stringify(frontends), FLOWPRESS_FRONTEND_VIEW_ID: name, FLOWPRESS_FRONTEND_REDIRECT_ID: name,
71
+ };
72
+ function normalize(values, publicExample) {
73
+ const kept = Object.fromEntries(Object.entries(values).filter(([key]) => !derived.has(key) && !legacy.test(key)
74
+ && !(name !== "local" && (key.startsWith("LOCAL_") || key === "DB_HOST"))));
75
+ // Examples describe configuration, never carry live credentials.
76
+ if (publicExample)
77
+ for (const key of Object.keys(kept))
78
+ if (credential.test(key) || key.startsWith("ADVMO_"))
79
+ kept[key] = "";
80
+ const result = { ...configured, ...kept, ...mediaEnvironment(manifest, name, publicExample ? {} : values).values };
81
+ result.FRONTEND_BACKEND_TARGET = target.backend || (name === "local" ? values.FRONTEND_BACKEND_TARGET || "local" : name);
82
+ result.FLOWPRESS_COMPOSITION_MODE = values.FLOWPRESS_COMPOSITION_MODE || "site-editor";
83
+ result.LOCAL_ASTRO_PORT = port;
84
+ if (!target.publish.includes("web-static"))
85
+ result.CMS_GITHUB_DISPATCH_TOKEN = "";
86
+ if (name === "local") {
87
+ result.LOCAL_BACKEND_HTTP_PORT = String(ports.cms || values.LOCAL_BACKEND_HTTP_PORT || "8080");
88
+ result.LOCAL_HTTPS_PORT = String(ports.https || new URL(frontend).port || "443");
89
+ result.LOCAL_DB_PORT = String(ports.database || values.LOCAL_DB_PORT || "3306");
90
+ result.DB_HOST = "db:3306";
91
+ if (localSecrets && !publicExample) {
92
+ result.DB_NAME ||= project.replace(/[^a-z0-9]/g, "_");
93
+ result.DB_USER ||= "flowpress";
94
+ result.DB_PREFIX ||= "fp_";
95
+ for (const key of [...saltKeys, "DB_PASSWORD", "DB_ROOT_PASSWORD", "CMS_BUILD_CALLBACK_TOKEN"]) {
96
+ if (!result[key] || /^(GENERATE_|CHANGE_ME)/.test(result[key]))
97
+ result[key] = randomBytes(32).toString("hex");
98
+ }
99
+ }
100
+ }
101
+ return result;
102
+ }
103
+ const example = normalize(readEnv(join(root, publicFile)), true);
104
+ write(publicFile, "# URL e identità sincronizzati da flowpress.deploy.yaml: pnpm ops env sync --apply\n" + serialize(example), 0o644);
105
+ const current = readEnv(join(root, privateFile));
106
+ // No values or secret files from other environments are copied here.
107
+ const settings = normalize({ ...example, ...current }, false);
108
+ const original = {};
109
+ if (existsSync(join(root, privateFile)))
110
+ for (const line of readFileSync(join(root, privateFile), "utf8").split("\n")) {
111
+ const key = line.match(/^([A-Z][A-Z0-9_]*)=/)?.[1];
112
+ if (key && !derived.has(key) && current[key] === settings[key] && !/[\r\n]/.test(current[key]))
113
+ original[key] = line;
114
+ }
115
+ write(privateFile, "# Impostazioni e segreti privati di " + name + ". Non versionare.\n" + serialize(settings, original), 0o600);
116
+ }
117
+ for (const relative of [".env.dev.example", ".env.dev"])
118
+ if (existsSync(join(root, relative))) {
119
+ changed.push(relative);
120
+ if (apply) {
121
+ backup(relative);
122
+ unlinkSync(join(root, relative));
123
+ }
124
+ }
125
+ return { changed, applied: apply };
126
+ }
127
+ //# sourceMappingURL=environment-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-files.js","sourceRoot":"","sources":["../../src/ops/environment-files.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export function required(env: any, key: any): string;
2
+ export function requiredUrl(env: any, key: any): string;
3
+ export function json(env: any, key: any, fallback: any): any;
4
+ export function port(env: any, key: any): number;
5
+ export function shellEnvironment(env: any): {
6
+ [k: string]: any;
7
+ };
8
+ export function siteOrigins(env: any): string[];
9
+ export function siteHostnames(env: any): string[];
10
+ export function resolveMediaUrl(env: any): string;
11
+ export function localizeFrontendUrl(value: any, env: any): any;
12
+ /** @returns {Record<string, string>} */
13
+ export function manifestEnvironment(root: any, name: any, inherited?: {}): Record<string, string>;
14
+ export function loadEnvironment(name?: string, root?: string, inherited?: NodeJS.ProcessEnv): Record<string, string>;
15
+ /** @returns {Record<string, string>} */
16
+ export function resolveFrontendEnvironment(env: any, loadTargetEnvironment?: (target: any) => Record<string, string>): Record<string, string>;
17
+ export function loadFrontendEnvironment(): Record<string, string>;
18
+ export function cmsEnvironment(root: any, name: any): {
19
+ DB_HOST: string;
20
+ DISABLE_WP_CRON: string;
21
+ FORCE_SSL_ADMIN: string;
22
+ DISALLOW_FILE_MODS: string;
23
+ };
24
+ export const repoRoot: string;
25
+ export namespace frontendBackendTargets {
26
+ let local: string[];
27
+ let staging: string[];
28
+ let preview: string[];
29
+ let production: string[];
30
+ }
31
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/ops/environment.js"],"names":[],"mappings":"AAOA,qDAIC;AACD,wDAMC;AACD,6DAIC;AACD,iDAIC;AACD;;EAA0I;AAC1I,gDAOC;AACD,kDAAqG;AACrG,kDAIC;AACD,+DAKC;AACD,wCAAwC;AACxC,2EADc,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2CnC;AACD,qHAGC;AACD,wCAAwC;AACxC,8EAAwE,WAAM,8BADhE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBnC;AACD,kEAAmG;AACnG;;;;;EAaC;AA5HD,8BAAoG"}
@@ -0,0 +1,165 @@
1
+ import { mediaEnvironment, mediaCredentialKeys, withoutMediaCredentials } from "./media-config.js";
2
+ import { join } from "node:path";
3
+ import { expand } from "dotenv-expand";
4
+ import { projectRoot, readEnv, readManifest, targetConfig, loadState, saltKeys } from "./config.js";
5
+ export const repoRoot = (() => { try {
6
+ return projectRoot();
7
+ }
8
+ catch {
9
+ return process.cwd();
10
+ } })();
11
+ export const frontendBackendTargets = { local: ["local", "staging", "production"], staging: ["staging", "production"], preview: ["production", "staging"], production: ["production"] };
12
+ export function required(env, key) {
13
+ const value = String(env[key] ?? "").trim();
14
+ if (!value)
15
+ throw new Error("Missing required environment variable " + key + ".");
16
+ return value;
17
+ }
18
+ export function requiredUrl(env, key) {
19
+ const value = required(env, key);
20
+ let url;
21
+ try {
22
+ url = new URL(value);
23
+ }
24
+ catch {
25
+ throw new Error(key + " must be an absolute HTTP(S) URL.");
26
+ }
27
+ if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.hash)
28
+ throw new Error("Invalid " + key + ".");
29
+ return value;
30
+ }
31
+ export function json(env, key, fallback) {
32
+ const value = String(env[key] ?? "").trim();
33
+ if (!value)
34
+ return fallback;
35
+ try {
36
+ return JSON.parse(value);
37
+ }
38
+ catch {
39
+ throw new Error(key + " must contain valid JSON.");
40
+ }
41
+ }
42
+ export function port(env, key) {
43
+ const value = Number(required(env, key));
44
+ if (!Number.isInteger(value) || value < 1 || value > 65535)
45
+ throw new Error("Invalid TCP port: " + key);
46
+ return value;
47
+ }
48
+ export function shellEnvironment(env) { return Object.fromEntries(Object.entries(env).filter(([, value]) => typeof value === "string")); }
49
+ export function siteOrigins(env) {
50
+ const values = [requiredUrl(env, "SITE_URL"), ...json(env, "SITE_ALIASES_JSON", [])];
51
+ return [...new Set(values.map(value => {
52
+ const url = new URL(value);
53
+ if (!["https:", "http:"].includes(url.protocol) || url.username || url.password || url.pathname !== "/" || url.search || url.hash)
54
+ throw new Error("Site URLs must be origins.");
55
+ return url.origin;
56
+ }))];
57
+ }
58
+ export function siteHostnames(env) { return siteOrigins(env).map(value => new URL(value).hostname); }
59
+ export function resolveMediaUrl(env) {
60
+ const value = requiredUrl(env, String(env.FLOWPRESS_MEDIA ?? "").trim() ? "FLOWPRESS_MEDIA" : "BACKEND_URL");
61
+ if (new URL(value).search)
62
+ throw new Error("Media URL cannot contain a query.");
63
+ return value.replace(/\/+$/, "");
64
+ }
65
+ export function localizeFrontendUrl(value, env) {
66
+ let url;
67
+ try {
68
+ url = new URL(value);
69
+ }
70
+ catch {
71
+ return value;
72
+ }
73
+ return json(env, "FRONTEND_BACKEND_TARGET_ORIGINS_JSON", []).includes(url.origin)
74
+ ? new URL(url.pathname + url.search + url.hash, requiredUrl(env, "SITE_URL")).href : value;
75
+ }
76
+ /** @returns {Record<string, string>} */
77
+ export function manifestEnvironment(root, name, inherited = {}) {
78
+ const manifest = readManifest(root);
79
+ const target = targetConfig(manifest, name);
80
+ const source = manifest.environments[target.backend || name] || target;
81
+ const existing = {
82
+ ...readEnv(join(root, name === "local" ? ".env.example" : ".env." + name + ".example")),
83
+ ...readEnv(join(root, name === "local" ? ".env" : ".env." + name)),
84
+ ...readEnv(join(root, ".secrets", name + ".env")),
85
+ };
86
+ const profile = target.profile || manifest.profile;
87
+ const backend = target.backendUrl || source.backendUrl;
88
+ const frontend = target.frontendUrl || existing.SITE_URL || backend;
89
+ const values = {
90
+ ...existing,
91
+ ...inherited,
92
+ APP_ENV: name,
93
+ ASTRO_OUTPUT_MODE: inherited.ASTRO_OUTPUT_MODE || (name === "local" || name === "preview" || profile === "headless-ssr" ? "server" : "static"),
94
+ SITE_URL: inherited.SITE_URL || frontend,
95
+ BACKEND_URL: inherited.BACKEND_URL || backend,
96
+ BACKEND_GRAPHQL_URL: inherited.BACKEND_GRAPHQL_URL || source.graphqlUrl || backend + "/index.php?graphql",
97
+ WP_HOME: backend,
98
+ WP_SITEURL: backend + "/wp",
99
+ WP_ENV: name === "local" ? "development" : name === "production" ? "production" : "staging",
100
+ FLOWPRESS_RUNTIME_POLICY: "container",
101
+ FLOWPRESS_MEDIA_STORAGE: "local",
102
+ FLOWPRESS_MEDIA: source.mediaUrl || "",
103
+ SF_STATIC_TARGETS_JSON: target.publish.includes("web-static") ? JSON.stringify([name]) : "[]",
104
+ CMS_GITHUB_DISPATCH_TOKEN: target.publish.includes("web-static") ? (existing.CMS_GITHUB_DISPATCH_TOKEN || "") : "",
105
+ FLOWPRESS_MAIL_MODE: name === "production" ? (target.mail || "disabled") : (target.mail === "capture" ? "capture" : "disabled"),
106
+ FRONTEND_BACKEND_TARGET: inherited.FRONTEND_BACKEND_TARGET || target.backend || (name === "local" ? existing.FRONTEND_BACKEND_TARGET : undefined) || name,
107
+ SF_DIST_DIR: inherited.SF_DIST_DIR || "apps/web/dist-" + name,
108
+ };
109
+ if (!values.PROJECT_NAME)
110
+ values.PROJECT_NAME = manifest.project || readEnv(join(root, ".env.example")).PROJECT_NAME;
111
+ if (!values.PROJECT_SLUG)
112
+ values.PROJECT_SLUG = values.PROJECT_NAME;
113
+ const frontends = Object.entries(manifest.environments).filter(([id, item]) => item.frontendUrl && (name === "local" || id !== "local")).map(([id, item]) => ({ id, url: item.frontendUrl, aliases: item.aliases || [], indexing: id === "production" ? "index" : "noindex" }));
114
+ values.FLOWPRESS_FRONTENDS_JSON = inherited.FLOWPRESS_FRONTENDS_JSON || JSON.stringify(frontends);
115
+ values.FLOWPRESS_FRONTEND_VIEW_ID = inherited.FLOWPRESS_FRONTEND_VIEW_ID || name;
116
+ values.FLOWPRESS_FRONTEND_REDIRECT_ID = inherited.FLOWPRESS_FRONTEND_REDIRECT_ID || name;
117
+ values.SITE_ALIASES_JSON = inherited.SITE_ALIASES_JSON || JSON.stringify(target.aliases || []);
118
+ // Expansion is limited to this environment. The local file never supplies remote secrets.
119
+ const expanded = expand({ parsed: shellEnvironment(values), processEnv: {} }).parsed;
120
+ return { ...withoutMediaCredentials(expanded), ...mediaEnvironment(manifest, name, expanded).values };
121
+ }
122
+ export function loadEnvironment(name = "", root = repoRoot, inherited = process.env) {
123
+ const selected = name || inherited.APP_ENV || readEnv(join(root, ".env")).APP_ENV || "local";
124
+ return manifestEnvironment(root, selected, inherited);
125
+ }
126
+ /** @returns {Record<string, string>} */
127
+ export function resolveFrontendEnvironment(env, loadTargetEnvironment = target => manifestEnvironment(repoRoot, target)) {
128
+ const name = required(env, "APP_ENV");
129
+ const allowed = frontendBackendTargets[name];
130
+ const target = String(env.FRONTEND_BACKEND_TARGET || name);
131
+ if (!allowed?.includes(target))
132
+ throw new Error("Invalid frontend backend target for " + name + ": " + target);
133
+ if (target === name)
134
+ return { ...withoutMediaCredentials(env), FLOWPRESS_MEDIA: resolveMediaUrl(env), FRONTEND_BACKEND_TARGET_ORIGINS_JSON: "[]" };
135
+ const source = loadTargetEnvironment(target);
136
+ if (source.APP_ENV !== target)
137
+ throw new Error("Backend environment identity mismatch.");
138
+ return {
139
+ ...withoutMediaCredentials(env),
140
+ BACKEND_URL: requiredUrl(source, "BACKEND_URL"),
141
+ BACKEND_GRAPHQL_URL: requiredUrl(source, "BACKEND_GRAPHQL_URL"),
142
+ FLOWPRESS_MEDIA: resolveMediaUrl(source),
143
+ FRONTEND_BACKEND_TARGET_ORIGINS_JSON: JSON.stringify(siteOrigins(source)),
144
+ };
145
+ }
146
+ export function loadFrontendEnvironment() { return resolveFrontendEnvironment(loadEnvironment()); }
147
+ export function cmsEnvironment(root, name) {
148
+ const values = manifestEnvironment(root, name);
149
+ const state = loadState(root, name);
150
+ if (!state.platform?.poolUuid)
151
+ throw new Error("Provision the shared database binding first.");
152
+ const keys = ["APP_ENV", "PROJECT_NAME", "PROJECT_SLUG", "SITE_URL", "SITE_ALIASES_JSON", "BACKEND_URL", "BACKEND_GRAPHQL_URL", "WP_HOME", "WP_SITEURL", "WP_ENV", "DB_NAME", "DB_USER", "DB_PASSWORD", "DB_PREFIX", ...saltKeys,
153
+ "FLOWPRESS_RUNTIME_POLICY", "FLOWPRESS_MEDIA_STORAGE", "FLOWPRESS_MAIL_MODE", "FLOWPRESS_MEDIA", "FLOWPRESS_COMPOSITION_MODE", "FLOWPRESS_FRONTENDS_JSON", "FLOWPRESS_FRONTEND_VIEW_ID", "FLOWPRESS_FRONTEND_REDIRECT_ID", "SF_STATIC_TARGETS_JSON", "CMS_BUILD_CALLBACK_TOKEN", "CMS_GITHUB_DISPATCH_TOKEN", "GITHUB_REPOSITORY_SLUG",
154
+ "FLOWPRESS_RESERVED_AREA_ENABLED", "FLOWPRESS_TRACKING_ENABLED", "FLOWPRESS_GTM_CONTAINER_ID", "FLOWPRESS_IUBENDA_SITE_ID", "FLOWPRESS_IUBENDA_COOKIE_POLICY_ID", "FLOWPRESS_IUBENDA_PRIVACY_POLICY_ID", "GOOGLE_MAPS_API_KEY", "STAGING_MAIL_TO"];
155
+ if (values.FLOWPRESS_MAIL_MODE === "smtp")
156
+ keys.push("SMTP_HOST", "SMTP_PORT", "SMTP_ENCRYPTION", "SMTP_USER", "SMTP_PASSWORD", "SMTP_FROM", "SMTP_FROM_NAME");
157
+ mediaEnvironment(readManifest(root), name, values, { strict: true });
158
+ keys.push("FLOWPRESS_MEDIA_PROVIDER", "FLOWPRESS_MEDIA_SHARED", "FLOWPRESS_MEDIA_PREFIX");
159
+ if (values.FLOWPRESS_MEDIA_STORAGE === "s3")
160
+ keys.push(...mediaCredentialKeys(values.FLOWPRESS_MEDIA_PROVIDER));
161
+ for (const key of ["DB_NAME", "DB_USER", "DB_PASSWORD", "DB_PREFIX", ...saltKeys])
162
+ required(values, key);
163
+ return { ...Object.fromEntries(keys.filter(key => values[key] !== undefined).map(key => [key, String(values[key])])), DB_HOST: state.platform.poolUuid + ":3306", DISABLE_WP_CRON: "true", FORCE_SSL_ADMIN: "true", DISALLOW_FILE_MODS: "true" };
164
+ }
165
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/ops/environment.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export function featurePackages(id: any): {
2
+ npm: string;
3
+ composer: string;
4
+ };
5
+ export function readFeatures(root: any): any;
6
+ export function checkFeatures(root: any, id: any): {
7
+ features: any;
8
+ valid: boolean;
9
+ };
10
+ export function featureCommand(root: any, args: any, execute?: typeof run): any;
11
+ import { run } from "./process.js";
12
+ //# sourceMappingURL=features.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../src/ops/features.js"],"names":[],"mappings":"AAIA;;;EAGC;AACD,6CAUC;AACD;;;EAQC;AACD,gFAyBC;oBAnDmB,cAAc"}
@@ -0,0 +1,71 @@
1
+ import { existsSync, readFileSync, writeFileSync, rmSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { run } from "./process.js";
4
+ export function featurePackages(id) {
5
+ if (!/^[a-z][a-z0-9-]*$/.test(id || ""))
6
+ throw new Error("Invalid FlowPress feature id.");
7
+ return { npm: "@styleflow.app/flowpress-" + id, composer: "flowpress/" + id };
8
+ }
9
+ export function readFeatures(root) {
10
+ const value = JSON.parse(readFileSync(join(root, "flowpress.features.json"), "utf8"));
11
+ if (value.schemaVersion !== 1 || !Array.isArray(value.features))
12
+ throw new Error("Invalid feature manifest.");
13
+ const ids = new Set();
14
+ for (const entry of value.features) {
15
+ const packages = featurePackages(entry.id);
16
+ if (ids.has(entry.id) || packages.npm !== entry.npm || packages.composer !== entry.composer || !/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(entry.version))
17
+ throw new Error("Invalid or duplicate feature entry: " + entry.id);
18
+ ids.add(entry.id);
19
+ }
20
+ return value;
21
+ }
22
+ export function checkFeatures(root, id) {
23
+ const manifest = readFeatures(root);
24
+ const entries = manifest.features.filter(entry => id ? entry.id === id : entry.enabled);
25
+ if (id && !entries.length)
26
+ throw new Error("Feature not installed: " + id);
27
+ const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
28
+ const composer = JSON.parse(readFileSync(join(root, "apps/cms/composer.json"), "utf8"));
29
+ for (const entry of entries)
30
+ if ((pkg.dependencies?.[entry.npm] || pkg.devDependencies?.[entry.npm]) !== entry.version || composer.require?.[entry.composer] !== entry.version)
31
+ throw new Error("Feature " + entry.id + " dependencies do not match its exact manifest version.");
32
+ return { features: entries.map(entry => entry.id), valid: true };
33
+ }
34
+ export function featureCommand(root, args, execute = run) {
35
+ const [action, id] = args;
36
+ if (action === "check")
37
+ return checkFeatures(root, id);
38
+ const manifest = readFeatures(root);
39
+ if (action === "list")
40
+ return manifest;
41
+ if (!["install", "remove"].includes(action))
42
+ throw new Error("Use feature list|check|install|remove [id] [--version <exact>].");
43
+ const packages = featurePackages(id);
44
+ const index = args.indexOf("--version");
45
+ const version = index < 0 ? "" : args[index + 1];
46
+ if (action === "install" && !/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(version || ""))
47
+ throw new Error("Feature versions must be exact immutable versions.");
48
+ if (action === "remove" && !manifest.features.some(entry => entry.id === id))
49
+ throw new Error("Feature not installed: " + id);
50
+ const files = ["package.json", "pnpm-lock.yaml", "apps/cms/composer.json", "apps/cms/composer.lock", "flowpress.features.json"];
51
+ const before = new Map(files.map(file => [join(root, file), existsSync(join(root, file)) ? readFileSync(join(root, file)) : null]));
52
+ try {
53
+ execute("pnpm", action === "install" ? ["add", "--workspace-root", "--save-exact", packages.npm + "@" + version] : ["remove", "--workspace-root", packages.npm], { cwd: root });
54
+ execute("composer", action === "install" ? ["require", packages.composer + ":" + version, "--no-interaction"] : ["remove", packages.composer, "--no-interaction"], { cwd: join(root, "apps/cms") });
55
+ const features = manifest.features.filter(entry => entry.id !== id);
56
+ if (action === "install")
57
+ features.push({ id, version, ...packages, enabled: true });
58
+ writeFileSync(join(root, "flowpress.features.json"), JSON.stringify({ schemaVersion: 1, features: features.sort((a, b) => a.id.localeCompare(b.id)) }, null, 2) + "\n");
59
+ checkFeatures(root);
60
+ return { feature: id, action };
61
+ }
62
+ catch (error) {
63
+ for (const [path, content] of before)
64
+ if (content === null)
65
+ rmSync(path, { force: true });
66
+ else
67
+ writeFileSync(path, content);
68
+ throw error;
69
+ }
70
+ }
71
+ //# sourceMappingURL=features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/ops/features.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export function providerTimestamp(value: any): number;
2
+ export function backupHealth({ executions, objects, maxAgeHours, now }: {
3
+ executions?: never[] | undefined;
4
+ objects: any;
5
+ maxAgeHours: any;
6
+ now?: number | undefined;
7
+ }): {
8
+ ok: boolean;
9
+ lastAttempt: {
10
+ status: any;
11
+ created_at: any;
12
+ } | null;
13
+ lastSuccess: {
14
+ status: any;
15
+ created_at: any;
16
+ } | null;
17
+ latestObject: any;
18
+ ageHours: number | null;
19
+ maxAgeHours: any;
20
+ issues: string[];
21
+ };
22
+ export namespace backupMaxAgeHours {
23
+ let daily: number;
24
+ let weekly: number;
25
+ }
26
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/ops/health.js"],"names":[],"mappings":"AAAA,sDAGC;AAID;;;;;;;;;;;;;;;;;;;EAeC"}
@@ -0,0 +1,27 @@
1
+ export function providerTimestamp(value) {
2
+ if (typeof value !== "string")
3
+ return NaN;
4
+ return Date.parse(/(?:Z|[+-]\d{2}:\d{2})$/i.test(value) ? value : value + "Z");
5
+ }
6
+ export const backupMaxAgeHours = { daily: 36, weekly: 8 * 24 };
7
+ export function backupHealth({ executions = [], objects, maxAgeHours, now = Date.now() }) {
8
+ const sorted = [...executions].sort((a, b) => Date.parse(b.created_at) - Date.parse(a.created_at));
9
+ const lastAttempt = sorted[0] ?? null;
10
+ const lastSuccess = sorted.find((item) => item.status === "success") ?? null;
11
+ const latestObject = objects === undefined ? null : [...objects].filter((item) => item.size > 0)
12
+ .sort((a, b) => Date.parse(b.modified) - Date.parse(a.modified))[0] ?? null;
13
+ const timestamp = latestObject?.modified || lastSuccess?.created_at;
14
+ const ageHours = timestamp ? (now - Date.parse(timestamp)) / 3_600_000 : null;
15
+ const issues = [];
16
+ if (!timestamp)
17
+ issues.push("no successful backup");
18
+ if (ageHours !== null && (!Number.isFinite(ageHours) || ageHours > maxAgeHours || ageHours < -1))
19
+ issues.push("backup stale or invalid timestamp");
20
+ if (lastAttempt && !["success", "running", "in_progress", "in-progress"].includes(lastAttempt.status))
21
+ issues.push("last backup attempt failed");
22
+ if (objects !== undefined && !latestObject)
23
+ issues.push("no nonempty offsite backup object");
24
+ const summary = (attempt) => attempt ? { status: attempt.status, created_at: attempt.created_at } : null;
25
+ return { ok: !issues.length, lastAttempt: summary(lastAttempt), lastSuccess: summary(lastSuccess), latestObject, ageHours, maxAgeHours, issues };
26
+ }
27
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/ops/health.js"],"names":[],"mappings":"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"}