@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.
- package/CHANGELOG.md +162 -0
- package/README.md +5 -0
- package/composer.json +1 -1
- package/containers/cms/Dockerfile +35 -0
- package/containers/cms/Dockerfile.dockerignore +20 -0
- package/containers/cms/healthz.php +17 -0
- package/containers/cms/install-languages.sh +16 -0
- package/containers/cms/mpm.conf +10 -0
- package/containers/cms/php.ini +16 -0
- package/containers/cms/sanitize-integrations.php +14 -0
- package/containers/cms/sanitize.php +40 -0
- package/containers/cms/smtp.php +13 -0
- package/containers/cms/vhost.conf +61 -0
- package/containers/cms/wp-cli.yml +1 -0
- package/containers/local/cms/Dockerfile +18 -0
- package/containers/local/cms/entrypoint.sh +7 -0
- package/containers/local/cms/php.ini +8 -0
- package/containers/local/cms/vhost.conf +14 -0
- package/containers/local/runtimes.json +14 -0
- package/containers/local/web/Dockerfile +8 -0
- package/containers/local/web/entrypoint.sh +21 -0
- package/containers/php-runtime/Dockerfile +21 -0
- package/containers/web-ssr/Dockerfile +27 -0
- package/containers/web-ssr/Dockerfile.dockerignore +10 -0
- package/containers/web-static/Caddyfile +40 -0
- package/containers/web-static/Dockerfile +17 -0
- package/containers/web-static/Dockerfile.dockerignore +7 -0
- package/dist/development.d.ts +12 -0
- package/dist/development.d.ts.map +1 -0
- package/dist/development.js +57 -0
- package/dist/development.js.map +1 -0
- package/dist/node-fetch.d.ts +3 -0
- package/dist/node-fetch.d.ts.map +1 -0
- package/dist/node-fetch.js +20 -0
- package/dist/node-fetch.js.map +1 -0
- package/dist/ops/bootstrap.d.ts +24 -0
- package/dist/ops/bootstrap.d.ts.map +1 -0
- package/dist/ops/bootstrap.js +156 -0
- package/dist/ops/bootstrap.js.map +1 -0
- package/dist/ops/build.d.ts +45 -0
- package/dist/ops/build.d.ts.map +1 -0
- package/dist/ops/build.js +119 -0
- package/dist/ops/build.js.map +1 -0
- package/dist/ops/check.d.ts +14 -0
- package/dist/ops/check.d.ts.map +1 -0
- package/dist/ops/check.js +42 -0
- package/dist/ops/check.js.map +1 -0
- package/dist/ops/cli.d.ts +3 -0
- package/dist/ops/cli.d.ts.map +1 -0
- package/dist/ops/cli.js +198 -0
- package/dist/ops/cli.js.map +1 -0
- package/dist/ops/cms-migrate.d.ts +14 -0
- package/dist/ops/cms-migrate.d.ts.map +1 -0
- package/dist/ops/cms-migrate.js +133 -0
- package/dist/ops/cms-migrate.js.map +1 -0
- package/dist/ops/cms-template/command.d.mts +19 -0
- package/dist/ops/cms-template/command.d.mts.map +1 -0
- package/dist/ops/cms-template/command.mjs +145 -0
- package/dist/ops/cms-template/command.mjs.map +1 -0
- package/dist/ops/cms-template/confirm.d.mts +11 -0
- package/dist/ops/cms-template/confirm.d.mts.map +1 -0
- package/dist/ops/cms-template/confirm.mjs +18 -0
- package/dist/ops/cms-template/confirm.mjs.map +1 -0
- package/dist/ops/cms-template/entry.d.mts +2 -0
- package/dist/ops/cms-template/entry.d.mts.map +1 -0
- package/dist/ops/cms-template/entry.mjs +22 -0
- package/dist/ops/cms-template/entry.mjs.map +1 -0
- package/dist/ops/cms-template/git.d.mts +7 -0
- package/dist/ops/cms-template/git.d.mts.map +1 -0
- package/dist/ops/cms-template/git.mjs +22 -0
- package/dist/ops/cms-template/git.mjs.map +1 -0
- package/dist/ops/cms-template/plan.d.mts +7 -0
- package/dist/ops/cms-template/plan.d.mts.map +1 -0
- package/dist/ops/cms-template/plan.mjs +54 -0
- package/dist/ops/cms-template/plan.mjs.map +1 -0
- package/dist/ops/cms-template/store.d.mts +21 -0
- package/dist/ops/cms-template/store.d.mts.map +1 -0
- package/dist/ops/cms-template/store.mjs +184 -0
- package/dist/ops/cms-template/store.mjs.map +1 -0
- package/dist/ops/cms-template/target.d.mts +15 -0
- package/dist/ops/cms-template/target.d.mts.map +1 -0
- package/dist/ops/cms-template/target.mjs +24 -0
- package/dist/ops/cms-template/target.mjs.map +1 -0
- package/dist/ops/cms-template/transport.d.mts +26 -0
- package/dist/ops/cms-template/transport.d.mts.map +1 -0
- package/dist/ops/cms-template/transport.mjs +115 -0
- package/dist/ops/cms-template/transport.mjs.map +1 -0
- package/dist/ops/config.d.ts +54 -0
- package/dist/ops/config.d.ts.map +1 -0
- package/dist/ops/config.js +221 -0
- package/dist/ops/config.js.map +1 -0
- package/dist/ops/coolify.d.ts +2 -0
- package/dist/ops/coolify.d.ts.map +1 -0
- package/dist/ops/coolify.js +44 -0
- package/dist/ops/coolify.js.map +1 -0
- package/dist/ops/data.d.ts +31 -0
- package/dist/ops/data.d.ts.map +1 -0
- package/dist/ops/data.js +165 -0
- package/dist/ops/data.js.map +1 -0
- package/dist/ops/deploy.d.ts +38 -0
- package/dist/ops/deploy.d.ts.map +1 -0
- package/dist/ops/deploy.js +127 -0
- package/dist/ops/deploy.js.map +1 -0
- package/dist/ops/editorial.d.ts +23 -0
- package/dist/ops/editorial.d.ts.map +1 -0
- package/dist/ops/editorial.js +79 -0
- package/dist/ops/editorial.js.map +1 -0
- package/dist/ops/environment-files.d.ts +9 -0
- package/dist/ops/environment-files.d.ts.map +1 -0
- package/dist/ops/environment-files.js +127 -0
- package/dist/ops/environment-files.js.map +1 -0
- package/dist/ops/environment.d.ts +31 -0
- package/dist/ops/environment.d.ts.map +1 -0
- package/dist/ops/environment.js +165 -0
- package/dist/ops/environment.js.map +1 -0
- package/dist/ops/features.d.ts +12 -0
- package/dist/ops/features.d.ts.map +1 -0
- package/dist/ops/features.js +71 -0
- package/dist/ops/features.js.map +1 -0
- package/dist/ops/health.d.ts +26 -0
- package/dist/ops/health.d.ts.map +1 -0
- package/dist/ops/health.js +27 -0
- package/dist/ops/health.js.map +1 -0
- package/dist/ops/local.d.ts +198 -0
- package/dist/ops/local.d.ts.map +1 -0
- package/dist/ops/local.js +187 -0
- package/dist/ops/local.js.map +1 -0
- package/dist/ops/media-config.d.ts +61 -0
- package/dist/ops/media-config.d.ts.map +1 -0
- package/dist/ops/media-config.js +96 -0
- package/dist/ops/media-config.js.map +1 -0
- package/dist/ops/media.d.ts +47 -0
- package/dist/ops/media.d.ts.map +1 -0
- package/dist/ops/media.js +81 -0
- package/dist/ops/media.js.map +1 -0
- package/dist/ops/monitor.d.ts +25 -0
- package/dist/ops/monitor.d.ts.map +1 -0
- package/dist/ops/monitor.js +143 -0
- package/dist/ops/monitor.js.map +1 -0
- package/dist/ops/process.d.ts +9 -0
- package/dist/ops/process.d.ts.map +1 -0
- package/dist/ops/process.js +56 -0
- package/dist/ops/process.js.map +1 -0
- package/dist/ops/provision.d.ts +41 -0
- package/dist/ops/provision.d.ts.map +1 -0
- package/dist/ops/provision.js +268 -0
- package/dist/ops/provision.js.map +1 -0
- package/dist/ops/registry.d.ts +14 -0
- package/dist/ops/registry.d.ts.map +1 -0
- package/dist/ops/registry.js +112 -0
- package/dist/ops/registry.js.map +1 -0
- package/dist/ops/release.d.ts +26 -0
- package/dist/ops/release.d.ts.map +1 -0
- package/dist/ops/release.js +79 -0
- package/dist/ops/release.js.map +1 -0
- package/dist/ops/runtimes.d.ts +16 -0
- package/dist/ops/runtimes.d.ts.map +1 -0
- package/dist/ops/runtimes.js +70 -0
- package/dist/ops/runtimes.js.map +1 -0
- package/dist/ops/s3.d.ts +8 -0
- package/dist/ops/s3.d.ts.map +1 -0
- package/dist/ops/s3.js +38 -0
- package/dist/ops/s3.js.map +1 -0
- package/dist/ops/static-config.d.ts +14 -0
- package/dist/ops/static-config.d.ts.map +1 -0
- package/dist/ops/static-config.js +92 -0
- package/dist/ops/static-config.js.map +1 -0
- package/dist/ops/storage.d.ts +39 -0
- package/dist/ops/storage.d.ts.map +1 -0
- package/dist/ops/storage.js +108 -0
- package/dist/ops/storage.js.map +1 -0
- package/flowpress-deploy.php +2 -2
- package/includes/pilot-aliases.php +69 -0
- package/package.json +43 -6
- 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":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,MAAM,UAAU,eAAe,CAAC,EAAE;IAChC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC1F,OAAO,EAAE,GAAG,EAAE,2BAA2B,GAAG,EAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,EAAE,EAAE,CAAC;AAChF,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,IAAI;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,yBAAyB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACtF,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC9G,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IACtB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9N,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,IAAI,EAAE,EAAE;IACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxF,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;IAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACxF,KAAK,MAAM,KAAK,IAAI,OAAO;QAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,EAAE,GAAG,wDAAwD,CAAC,CAAC;IAClR,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACnE,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,GAAG;IACtD,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1B,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IACvC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IAChI,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC9J,IAAI,MAAM,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;IAC9H,MAAM,KAAK,GAAG,CAAC,cAAc,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yBAAyB,CAAC,CAAC;IAChI,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpI,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAChL,OAAO,CAAC,UAAU,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,GAAG,GAAG,GAAG,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;QACpM,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,IAAI,MAAM,KAAK,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACrF,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,yBAAyB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACxK,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM;YAAE,IAAI,OAAO,KAAK,IAAI;gBAAE,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;;gBAAM,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7H,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -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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"}
|