@styleflow.app/flowpress-deploy 1.0.0-beta.3 → 1.0.0-beta.30
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 +156 -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 +128 -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 +31 -0
- package/dist/ops/media.d.ts.map +1 -0
- package/dist/ops/media.js +74 -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,17 @@
|
|
|
1
|
+
# syntax=docker/dockerfile:1.7
|
|
2
|
+
FROM caddy:2.10-alpine
|
|
3
|
+
RUN apk add --no-cache libcap && setcap -r /usr/bin/caddy && apk del libcap \
|
|
4
|
+
&& find / -xdev -perm /6000 -type f -exec chmod a-s {} + 2>/dev/null
|
|
5
|
+
COPY --from=flowpress /web-static/Caddyfile /etc/caddy/Caddyfile
|
|
6
|
+
ARG DIST_DIR
|
|
7
|
+
COPY $DIST_DIR/ /srv/site/
|
|
8
|
+
RUN test -f /srv/site/.container/routes.caddy && caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
|
|
9
|
+
ARG RELEASE_SHA=unknown
|
|
10
|
+
ARG FRONTEND_BUILD_ID=unknown
|
|
11
|
+
ENV RELEASE_SHA=$RELEASE_SHA
|
|
12
|
+
LABEL org.opencontainers.image.revision=$RELEASE_SHA
|
|
13
|
+
LABEL app.flowpress.build-id=$FRONTEND_BUILD_ID
|
|
14
|
+
USER 65534:65534
|
|
15
|
+
EXPOSE 8080
|
|
16
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 CMD wget -q -O /dev/null http://127.0.0.1:8080/healthz.json || exit 1
|
|
17
|
+
CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function prepareDevelopmentSafelist(output: any, fallback: any): {
|
|
2
|
+
source: string;
|
|
3
|
+
};
|
|
4
|
+
export function waitForHttp(url: any, options?: {}): Promise<any>;
|
|
5
|
+
export function refreshGeneratedFile(options: any): Promise<{
|
|
6
|
+
source: string;
|
|
7
|
+
warning?: undefined;
|
|
8
|
+
} | {
|
|
9
|
+
source: string;
|
|
10
|
+
warning: string;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=development.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"development.d.ts","sourceRoot":"","sources":["../src/development.js"],"names":[],"mappings":"AAKA;;EAIC;AAED,kEAyBC;AAGD;;;;;;GAqBC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
// Development must not scan every remote WordPress route before opening the
|
|
4
|
+
// server. Strict builds still refresh the complete safelist from the CMS.
|
|
5
|
+
export function prepareDevelopmentSafelist(output, fallback) {
|
|
6
|
+
const cached = existsSync(output) && readFileSync(output, "utf8").trim();
|
|
7
|
+
if (!cached)
|
|
8
|
+
writeFileSync(output, fallback);
|
|
9
|
+
return { source: cached ? "cache" : "structural" };
|
|
10
|
+
}
|
|
11
|
+
export async function waitForHttp(url, options = {}) {
|
|
12
|
+
const timeoutMs = options.timeoutMs ?? 60_000;
|
|
13
|
+
const intervalMs = options.intervalMs ?? 500;
|
|
14
|
+
const fetchImplementation = options.fetchImplementation ?? fetch;
|
|
15
|
+
const deadline = Date.now() + timeoutMs;
|
|
16
|
+
let lastError;
|
|
17
|
+
do {
|
|
18
|
+
try {
|
|
19
|
+
const response = await fetchImplementation(url, {
|
|
20
|
+
redirect: "manual",
|
|
21
|
+
signal: AbortSignal.timeout(Math.min(5_000, timeoutMs))
|
|
22
|
+
});
|
|
23
|
+
if (response.status > 0)
|
|
24
|
+
return response;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
lastError = error;
|
|
28
|
+
}
|
|
29
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
30
|
+
} while (Date.now() < deadline);
|
|
31
|
+
throw new Error(`Timed out waiting for ${url}.`, lastError === undefined ? undefined : { cause: lastError });
|
|
32
|
+
}
|
|
33
|
+
export async function refreshGeneratedFile(options) {
|
|
34
|
+
try {
|
|
35
|
+
const generated = await options.generate();
|
|
36
|
+
await writeFile(options.outputPath, generated);
|
|
37
|
+
return { source: "cms" };
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (options.mode === "strict")
|
|
41
|
+
throw error;
|
|
42
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
43
|
+
const existing = await readFile(options.outputPath, "utf8").catch(() => "");
|
|
44
|
+
if (existing.trim()) {
|
|
45
|
+
return {
|
|
46
|
+
source: "cache",
|
|
47
|
+
warning: `CMS unavailable; preserved generated cache. ${message}`
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
await writeFile(options.outputPath, options.structuralFallback);
|
|
51
|
+
return {
|
|
52
|
+
source: "structural",
|
|
53
|
+
warning: `CMS unavailable; wrote structural fallback. ${message}`
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=development.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"development.js","sourceRoot":"","sources":["../src/development.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-fetch.d.ts","sourceRoot":"","sources":["../src/node-fetch.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,eAAO,MAAM,cAAc,EAAE,OAAO,KAgBnC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Fetch adapter for proxies running on Node, whose fetch decompresses bodies. */
|
|
2
|
+
export const nodeProxyFetch = async (input, init) => {
|
|
3
|
+
const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : undefined));
|
|
4
|
+
headers.set("accept-encoding", "identity");
|
|
5
|
+
const response = await fetch(input, { ...init, headers });
|
|
6
|
+
const encoding = response.headers.get("content-encoding")?.trim().toLowerCase();
|
|
7
|
+
const method = init?.method ?? (input instanceof Request ? input.method : "GET");
|
|
8
|
+
if (method === "HEAD" || !response.body || !encoding || !/^(gzip|deflate|br)$/.test(encoding))
|
|
9
|
+
return response;
|
|
10
|
+
// A server ignoring identity negotiation must not label decoded bytes as gzip.
|
|
11
|
+
if (response.status === 206) {
|
|
12
|
+
await response.body.cancel();
|
|
13
|
+
throw new Error("Encoded partial media response cannot be proxied safely.");
|
|
14
|
+
}
|
|
15
|
+
const decodedHeaders = new Headers(response.headers);
|
|
16
|
+
decodedHeaders.delete("content-encoding");
|
|
17
|
+
decodedHeaders.delete("content-length");
|
|
18
|
+
return new Response(response.body, { status: response.status, statusText: response.statusText, headers: decodedHeaders });
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=node-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-fetch.js","sourceRoot":"","sources":["../src/node-fetch.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,CAAC,MAAM,cAAc,GAAiB,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IAChE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChF,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjF,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/G,+EAA+E;IAC/E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACrD,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC1C,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACxC,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;AAC5H,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function sharedRuntimeRegistryPolicy(api: any, project: any, { apply }?: {
|
|
2
|
+
apply?: boolean | undefined;
|
|
3
|
+
}): Promise<string[]>;
|
|
4
|
+
export function provisionRegistry(root: any, manifest: any, { file, apply }?: {
|
|
5
|
+
apply?: boolean | undefined;
|
|
6
|
+
}): Promise<{
|
|
7
|
+
changes: string[];
|
|
8
|
+
applied: boolean;
|
|
9
|
+
credentials?: undefined;
|
|
10
|
+
} | {
|
|
11
|
+
changes: string[];
|
|
12
|
+
applied: boolean;
|
|
13
|
+
credentials: string;
|
|
14
|
+
}>;
|
|
15
|
+
export function provisionDns(root: any, manifest: any, name: any, { file, apply }?: {
|
|
16
|
+
apply?: boolean | undefined;
|
|
17
|
+
}): Promise<{
|
|
18
|
+
host: string;
|
|
19
|
+
exists: boolean;
|
|
20
|
+
applied: boolean;
|
|
21
|
+
target: any;
|
|
22
|
+
frontendChanged: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/ops/bootstrap.js"],"names":[],"mappings":"AAIA;;sBAwBC;AAED;;;;;;;;;;GAoFC;AACD;;;;;;;;GAqBC"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { identity, operatorEnvironment, platformConfig, publicPlatform, writeJson, readJson } from "./config.js";
|
|
4
|
+
export async function sharedRuntimeRegistryPolicy(api, project, { apply = false } = {}) {
|
|
5
|
+
if (project.name !== "flowpress")
|
|
6
|
+
throw new Error("Shared runtime policies only apply to the flowpress project.");
|
|
7
|
+
const changes = [], id = project.project_id;
|
|
8
|
+
const quota = (await api("GET", "/quotas?page_size=100")).find(item => item.ref?.name === "flowpress");
|
|
9
|
+
if (quota && quota.hard.storage !== -1 && quota.hard.storage < 8 * 1024 ** 3) {
|
|
10
|
+
changes.push("Raise shared FlowPress registry quota to 8 GiB");
|
|
11
|
+
if (apply)
|
|
12
|
+
await api("PUT", "/quotas/" + quota.id, { hard: { ...quota.hard, storage: 8 * 1024 ** 3 } });
|
|
13
|
+
}
|
|
14
|
+
const metadata = await api("GET", "/projects/" + id);
|
|
15
|
+
const selectors = { tag_selectors: [{ kind: "doublestar", decoration: "matches", pattern: "runtime-*" }], scope_selectors: { repository: [{ kind: "doublestar", decoration: "repoMatches", pattern: "{local-cms,local-web}" }] } };
|
|
16
|
+
const retention = metadata.metadata?.retention_id && await api("GET", "/retentions/" + metadata.metadata.retention_id);
|
|
17
|
+
if (retention && !retention.rules.some(item => item.template === "always" && item.tag_selectors?.some(tag => tag.pattern === "runtime-*"))) {
|
|
18
|
+
changes.push("Protect published shared runtime versions from retention");
|
|
19
|
+
if (apply) {
|
|
20
|
+
retention.rules.push({ priority: 0, disabled: false, action: "retain", template: "always", ...selectors });
|
|
21
|
+
await api("PUT", "/retentions/" + metadata.metadata.retention_id, retention);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const immutable = await api("GET", "/projects/" + id + "/immutabletagrules");
|
|
25
|
+
if (!immutable.some(item => !item.disabled && item.tag_selectors?.some(tag => tag.pattern === "runtime-*"))) {
|
|
26
|
+
changes.push("Make shared runtime version tags immutable");
|
|
27
|
+
if (apply)
|
|
28
|
+
await api("POST", "/projects/" + id + "/immutabletagrules", { disabled: false, action: "immutable", template: "immutable_template", ...selectors });
|
|
29
|
+
}
|
|
30
|
+
return changes;
|
|
31
|
+
}
|
|
32
|
+
export async function provisionRegistry(root, manifest, { file, apply = false } = {}) {
|
|
33
|
+
const platform = platformConfig(root, manifest, file), operator = operatorEnvironment(root);
|
|
34
|
+
const username = operator.HARBOR_ADMIN_USER, password = operator.HARBOR_ADMIN_PASSWORD;
|
|
35
|
+
if (!username || !password || !operator.HARBOR_API_URL)
|
|
36
|
+
throw new Error("Set private HARBOR_API_URL/HARBOR_ADMIN_USER/HARBOR_ADMIN_PASSWORD.");
|
|
37
|
+
const api = async (method, path, body) => {
|
|
38
|
+
const response = await fetch(operator.HARBOR_API_URL.replace(/\/$/, "") + "/api/v2.0" + path, {
|
|
39
|
+
method, redirect: "error", signal: AbortSignal.timeout(30000),
|
|
40
|
+
headers: { authorization: "Basic " + Buffer.from(username + ":" + password).toString("base64"), "content-type": "application/json" },
|
|
41
|
+
...(body ? { body: JSON.stringify(body) } : {}),
|
|
42
|
+
});
|
|
43
|
+
if (!response.ok)
|
|
44
|
+
throw new Error("Harbor " + method + " " + path + " refused (HTTP " + response.status + ").");
|
|
45
|
+
const text = await response.text();
|
|
46
|
+
return text ? JSON.parse(text) : {};
|
|
47
|
+
};
|
|
48
|
+
const projects = [platform.registryProject, "flowpress"];
|
|
49
|
+
const changes = [];
|
|
50
|
+
const existing = await api("GET", "/projects?page_size=100");
|
|
51
|
+
for (const name of projects) {
|
|
52
|
+
if (!/^[a-z0-9][a-z0-9_.-]+$/.test(name))
|
|
53
|
+
throw new Error("Invalid Harbor project.");
|
|
54
|
+
if (!existing.some(project => project.name === name)) {
|
|
55
|
+
changes.push("Create private Harbor project " + name);
|
|
56
|
+
if (apply)
|
|
57
|
+
await api("POST", "/projects", { project_name: name, public: false, storage_limit: (name === "flowpress" ? 8 : 5) * 1024 ** 3 });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!apply) {
|
|
61
|
+
const shared = existing.find(project => project.name === "flowpress");
|
|
62
|
+
if (shared)
|
|
63
|
+
changes.push(...await sharedRuntimeRegistryPolicy(api, shared));
|
|
64
|
+
return { changes, applied: false };
|
|
65
|
+
}
|
|
66
|
+
const current = await api("GET", "/projects?page_size=100");
|
|
67
|
+
const robots = await api("GET", "/robots?page_size=100");
|
|
68
|
+
const privateFile = join(root, ".secrets/registry-created.json");
|
|
69
|
+
const created = readJson(privateFile, {});
|
|
70
|
+
for (const name of projects) {
|
|
71
|
+
const project = current.find(item => item.name === name);
|
|
72
|
+
const robotName = name + "-ci";
|
|
73
|
+
const expected = "robot$" + robotName;
|
|
74
|
+
if (!robots.some(robot => robot.name === expected)) {
|
|
75
|
+
const robot = await api("POST", "/robots", {
|
|
76
|
+
name: robotName, description: "FlowPress build/push for " + name, duration: 365, level: "system",
|
|
77
|
+
permissions: [{ kind: "project", namespace: name, access: [{ resource: "repository", action: "pull" }, { resource: "repository", action: "push" }] },
|
|
78
|
+
...(name === "flowpress" ? [] : [{ kind: "project", namespace: "flowpress", access: [{ resource: "repository", action: "pull" }] }])],
|
|
79
|
+
});
|
|
80
|
+
created[name] = { name: robot.name, secret: robot.secret };
|
|
81
|
+
writeJson(privateFile, created, 0o600);
|
|
82
|
+
}
|
|
83
|
+
const existingRobot = robots.find(robot => robot.name === expected);
|
|
84
|
+
if (name !== "flowpress" && existingRobot) {
|
|
85
|
+
const detail = await api("GET", "/robots/" + existingRobot.id);
|
|
86
|
+
if (!detail.permissions.some(permission => permission.namespace === "flowpress")) {
|
|
87
|
+
detail.permissions.push({ kind: "project", namespace: "flowpress", access: [{ resource: "repository", action: "pull" }] });
|
|
88
|
+
await api("PUT", "/robots/" + existingRobot.id, { name: detail.name, level: detail.level, description: detail.description, duration: detail.duration, disable: detail.disable, permissions: detail.permissions });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const metadata = await api("GET", "/projects/" + project.project_id);
|
|
92
|
+
if (metadata.metadata?.retention_id) {
|
|
93
|
+
const retention = await api("GET", "/retentions/" + metadata.metadata.retention_id);
|
|
94
|
+
const selector = retention.rules?.flatMap(rule => rule.tag_selectors || []).find(item => item.pattern === "{staging,production,preview,latest}");
|
|
95
|
+
if (selector) {
|
|
96
|
+
selector.pattern = "{staging,production,preview,latest,staging-previous,production-previous,preview-previous}";
|
|
97
|
+
await api("PUT", "/retentions/" + metadata.metadata.retention_id, retention);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (!metadata.metadata?.retention_id)
|
|
101
|
+
await api("POST", "/retentions", {
|
|
102
|
+
algorithm: "or", scope: { level: "project", ref: project.project_id },
|
|
103
|
+
trigger: { kind: "Schedule", settings: { cron: "0 0 1 * * *" } },
|
|
104
|
+
rules: [
|
|
105
|
+
{ id: 0, priority: 0, disabled: false, action: "retain", template: "always", tag_selectors: [{ kind: "doublestar", decoration: "matches", pattern: "{staging,production,preview,latest,staging-previous,production-previous,preview-previous}" }], scope_selectors: { repository: [{ kind: "doublestar", decoration: "repoMatches", pattern: "**" }] } },
|
|
106
|
+
{ id: 0, priority: 0, disabled: false, action: "retain", template: "latestPushedK", params: { latestPushedK: 3 }, tag_selectors: [{ kind: "doublestar", decoration: "matches", pattern: "**" }], scope_selectors: { repository: [{ kind: "doublestar", decoration: "repoMatches", pattern: "**" }] } },
|
|
107
|
+
],
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
changes.push(...await sharedRuntimeRegistryPolicy(api, current.find(project => project.name === "flowpress"), { apply: true }));
|
|
111
|
+
// Add pull scope without replacing permissions belonging to existing installations.
|
|
112
|
+
const nodes = robots.find(robot => robot.name === "robot$nodes-pull");
|
|
113
|
+
if (!nodes)
|
|
114
|
+
throw new Error("The existing nodes-pull robot was not found.");
|
|
115
|
+
const detail = await api("GET", "/robots/" + nodes.id);
|
|
116
|
+
let changed = false;
|
|
117
|
+
for (const name of projects)
|
|
118
|
+
if (!detail.permissions.some(permission => permission.namespace === name)) {
|
|
119
|
+
detail.permissions.push({ kind: "project", namespace: name, access: [{ resource: "repository", action: "pull" }] });
|
|
120
|
+
changed = true;
|
|
121
|
+
}
|
|
122
|
+
if (changed)
|
|
123
|
+
await api("PUT", "/robots/" + nodes.id, { name: detail.name, level: detail.level, description: detail.description, duration: detail.duration, disable: detail.disable, permissions: detail.permissions });
|
|
124
|
+
if (Object.keys(created).length)
|
|
125
|
+
writeJson(privateFile, created, 0o600);
|
|
126
|
+
return { changes, applied: true, credentials: Object.keys(created).length ? ".secrets/registry-created.json" : "existing" };
|
|
127
|
+
}
|
|
128
|
+
export async function provisionDns(root, manifest, name, { file, apply = false } = {}) {
|
|
129
|
+
const target = manifest.environments[name];
|
|
130
|
+
if (!target?.publish.includes("cms"))
|
|
131
|
+
throw new Error("CMS publication is disabled.");
|
|
132
|
+
const platform = platformConfig(root, manifest, file), operator = operatorEnvironment(root);
|
|
133
|
+
const { coolifyClient } = await import("./coolify.js");
|
|
134
|
+
const server = await coolifyClient(platform.coolifyUrl, operator.COOLIFY_TOKEN)("GET", "/servers/" + platform.serverUuid);
|
|
135
|
+
const host = new URL(target.backendUrl).hostname;
|
|
136
|
+
const api = async (method, path, body) => {
|
|
137
|
+
const res = await fetch("https://api.cloudflare.com/client/v4" + path, { method, redirect: "error", signal: AbortSignal.timeout(30000), headers: { authorization: "Bearer " + operator.CLOUDFLARE_API_TOKEN, "content-type": "application/json" }, ...(body ? { body: JSON.stringify(body) } : {}) });
|
|
138
|
+
const data = await res.json();
|
|
139
|
+
if (!res.ok || !data.success)
|
|
140
|
+
throw new Error("DNS API refused " + method + " (HTTP " + res.status + ").");
|
|
141
|
+
return data.result;
|
|
142
|
+
};
|
|
143
|
+
let zone;
|
|
144
|
+
const labels = host.split(".");
|
|
145
|
+
for (let offset = 0; offset < labels.length - 1 && !zone; offset++)
|
|
146
|
+
zone = (await api("GET", "/zones?name=" + labels.slice(offset).join(".")))[0];
|
|
147
|
+
if (!zone)
|
|
148
|
+
throw new Error("No accessible DNS zone for the staging backend.");
|
|
149
|
+
const existing = await api("GET", "/zones/" + zone.id + "/dns_records?name=" + host);
|
|
150
|
+
if (existing.length && !existing.some(item => item.type === "A" && item.content === server.ip))
|
|
151
|
+
throw new Error("An existing DNS record has a different target; no record was changed.");
|
|
152
|
+
if (!existing.length && apply)
|
|
153
|
+
await api("POST", "/zones/" + zone.id + "/dns_records", { type: "A", name: host, content: server.ip, proxied: true, ttl: 1, comment: "FlowPress staging backend" });
|
|
154
|
+
return { host, exists: Boolean(existing.length), applied: apply, target: server.ip, frontendChanged: false };
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/ops/bootstrap.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export function registryLogin(platform: any, operator: any): void;
|
|
2
|
+
export function inspectDigest(image: any): any;
|
|
3
|
+
export function buildDestination({ push, load }?: {
|
|
4
|
+
push?: boolean | undefined;
|
|
5
|
+
load?: boolean | undefined;
|
|
6
|
+
}): "--push" | "--load";
|
|
7
|
+
export function buildBase(root: any, platform: any, { push, load }?: {
|
|
8
|
+
push?: boolean | undefined;
|
|
9
|
+
load?: boolean | undefined;
|
|
10
|
+
}): {
|
|
11
|
+
image: string;
|
|
12
|
+
};
|
|
13
|
+
export function frontendBuild(root: any, manifest: any, name: any, { sha, buildId }: {
|
|
14
|
+
sha: any;
|
|
15
|
+
buildId: any;
|
|
16
|
+
}): {
|
|
17
|
+
env: Record<string, string>;
|
|
18
|
+
dist: string;
|
|
19
|
+
};
|
|
20
|
+
export function build(root: any, manifest: any, name: any, component: any, { sha, buildId, push, load, file, skipFrontend }?: {
|
|
21
|
+
push?: boolean | undefined;
|
|
22
|
+
load?: boolean | undefined;
|
|
23
|
+
skipFrontend?: boolean | undefined;
|
|
24
|
+
}): Promise<{
|
|
25
|
+
component: any;
|
|
26
|
+
environment: any;
|
|
27
|
+
repository: string;
|
|
28
|
+
tag: string;
|
|
29
|
+
digest: string;
|
|
30
|
+
sha: any;
|
|
31
|
+
pushed: boolean;
|
|
32
|
+
reused: boolean;
|
|
33
|
+
} | {
|
|
34
|
+
component: any;
|
|
35
|
+
environment: any;
|
|
36
|
+
repository: string;
|
|
37
|
+
tag: string;
|
|
38
|
+
digest: any;
|
|
39
|
+
sha: any;
|
|
40
|
+
buildId: any;
|
|
41
|
+
pushed: boolean;
|
|
42
|
+
}>;
|
|
43
|
+
export const packageRoot: string;
|
|
44
|
+
export const containers: string;
|
|
45
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/ops/build.js"],"names":[],"mappings":"AAYA,kEAGC;AACD,+CAKC;AACD;;;wBAGC;AACD;;;;;EAOC;AACD;;;;;;EAqBC;AACD;;;;;;;;;;;;;;;;;;;;;;GAgDC;AA9FD,iCAA6E;AAC7E,gCAA0D"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { withoutMediaCredentials } from "./media-config.js";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { allowedComponents, identity, imageRepository, loadState, operatorEnvironment, platformConfig, readJson, releaseTag, targetConfig, writeJson } from "./config.js";
|
|
6
|
+
import { manifestEnvironment, resolveFrontendEnvironment, shellEnvironment } from "./environment.js";
|
|
7
|
+
import { buildRoutesCaddy } from "./static-config.js";
|
|
8
|
+
import { capture, run } from "./process.js";
|
|
9
|
+
import { existingDigest } from "./registry.js";
|
|
10
|
+
export const packageRoot = fileURLToPath(new URL("../../", import.meta.url));
|
|
11
|
+
export const containers = join(packageRoot, "containers");
|
|
12
|
+
export function registryLogin(platform, operator) {
|
|
13
|
+
if (!operator.REGISTRY_USERNAME || !operator.REGISTRY_PASSWORD)
|
|
14
|
+
throw new Error("Missing registry push/pull credentials.");
|
|
15
|
+
capture("docker", ["login", platform.registry, "--username", operator.REGISTRY_USERNAME, "--password-stdin"], { input: operator.REGISTRY_PASSWORD + "\n" });
|
|
16
|
+
}
|
|
17
|
+
export function inspectDigest(image) {
|
|
18
|
+
const result = capture("docker", ["buildx", "imagetools", "inspect", image, "--format", "{{json .Manifest}}"]);
|
|
19
|
+
const digest = JSON.parse(result).digest;
|
|
20
|
+
if (!/^sha256:[a-f0-9]{64}$/.test(digest || ""))
|
|
21
|
+
throw new Error("Registry returned no valid manifest digest.");
|
|
22
|
+
return digest;
|
|
23
|
+
}
|
|
24
|
+
export function buildDestination({ push = false, load = false } = {}) {
|
|
25
|
+
if (push === load)
|
|
26
|
+
throw new Error("Choose exactly one build destination: --push for CI/registry or --load for a local image test.");
|
|
27
|
+
return push ? "--push" : "--load";
|
|
28
|
+
}
|
|
29
|
+
export function buildBase(root, platform, { push = false, load = false } = {}) {
|
|
30
|
+
const destination = buildDestination({ push, load });
|
|
31
|
+
const version = readJson(join(packageRoot, "package.json")).version;
|
|
32
|
+
const image = platform.registry + "/flowpress/php-runtime:" + version;
|
|
33
|
+
if (push)
|
|
34
|
+
registryLogin(platform, operatorEnvironment(root));
|
|
35
|
+
run("docker", ["buildx", "build", "--platform", "linux/amd64", "--file", join(containers, "php-runtime", "Dockerfile"), "--tag", image, destination, containers]);
|
|
36
|
+
return { image: push ? image.slice(0, image.lastIndexOf(":")) + "@" + inspectDigest(image) : image };
|
|
37
|
+
}
|
|
38
|
+
export function frontendBuild(root, manifest, name, { sha, buildId }) {
|
|
39
|
+
const values = manifestEnvironment(root, name, { ...process.env, RELEASE_SHA: sha, FRONTEND_BUILD_ID: buildId });
|
|
40
|
+
const env = resolveFrontendEnvironment(values, target => manifestEnvironment(root, target, {}));
|
|
41
|
+
const web = readJson(join(root, "apps/web/package.json"));
|
|
42
|
+
const childEnv = withoutMediaCredentials({ ...process.env, ...shellEnvironment(env), RELEASE_SHA: sha, FRONTEND_BUILD_ID: buildId });
|
|
43
|
+
const dist = resolve(root, env.SF_DIST_DIR);
|
|
44
|
+
if (!dist.startsWith(root + "/"))
|
|
45
|
+
throw new Error("Build output must stay inside the project.");
|
|
46
|
+
run("pnpm", ["styleflow:build"], { cwd: root, env: childEnv });
|
|
47
|
+
run("pnpm", ["--filter", web.name, "build"], { cwd: root, env: childEnv });
|
|
48
|
+
if (env.ASTRO_OUTPUT_MODE === "static") {
|
|
49
|
+
if (!existsSync(join(dist, "index.html")))
|
|
50
|
+
throw new Error("Static build has no index.html.");
|
|
51
|
+
const read = name => existsSync(join(dist, name)) ? readFileSync(join(dist, name), "utf8") : "";
|
|
52
|
+
mkdirSync(join(dist, ".container"), { recursive: true });
|
|
53
|
+
writeFileSync(join(dist, ".container", "routes.caddy"), buildRoutesCaddy({
|
|
54
|
+
redirects: read("_redirects"), headers: read("_headers"),
|
|
55
|
+
media: env.FLOWPRESS_MEDIA && env.FLOWPRESS_MEDIA !== env.BACKEND_URL ? env.FLOWPRESS_MEDIA : env.BACKEND_URL + "/app/uploads",
|
|
56
|
+
backend: env.BACKEND_URL,
|
|
57
|
+
}));
|
|
58
|
+
writeJson(join(dist, "healthz.json"), { status: "ok", release: sha, buildId, environment: name, output: "static", backendTarget: env.FRONTEND_BACKEND_TARGET });
|
|
59
|
+
}
|
|
60
|
+
return { env, dist: env.SF_DIST_DIR };
|
|
61
|
+
}
|
|
62
|
+
export async function build(root, manifest, name, component, { sha, buildId, push = false, load = false, file, skipFrontend = false } = {}) {
|
|
63
|
+
const destination = buildDestination({ push, load });
|
|
64
|
+
const target = targetConfig(manifest, name);
|
|
65
|
+
const supported = component === "cms" ? ["backend", "headless-static", "headless-ssr"] : null;
|
|
66
|
+
if (supported && !supported.includes(target.profile || manifest.profile))
|
|
67
|
+
throw new Error("Profile does not contain a CMS.");
|
|
68
|
+
if (!["cms", "web-static", "web-ssr"].includes(component))
|
|
69
|
+
throw new Error("Unknown component.");
|
|
70
|
+
if (push)
|
|
71
|
+
allowedComponents(manifest, name, [component]);
|
|
72
|
+
const platform = platformConfig(root, manifest, file);
|
|
73
|
+
const project = identity(root);
|
|
74
|
+
const revision = sha || capture("git", ["rev-parse", "HEAD"], { cwd: root });
|
|
75
|
+
const id = buildId || String(Date.now());
|
|
76
|
+
const tag = releaseTag(component, name, revision, id);
|
|
77
|
+
const repository = imageRepository(platform, project.slug, component);
|
|
78
|
+
const operator = operatorEnvironment(root);
|
|
79
|
+
if (push)
|
|
80
|
+
registryLogin(platform, operator);
|
|
81
|
+
mkdirSync(join(root, ".local/flowpress"), { recursive: true, mode: 0o700 });
|
|
82
|
+
if (push && component === "cms") {
|
|
83
|
+
const digest = await existingDigest(repository + ":" + tag, operator);
|
|
84
|
+
if (digest) {
|
|
85
|
+
const result = { component, environment: name, repository, tag, digest, sha: revision, pushed: true, reused: true };
|
|
86
|
+
writeJson(join(root, ".local/flowpress", "release-" + name + "-" + component + ".json"), result, 0o600);
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const metadata = join(root, ".local/flowpress", "build-" + name + "-" + component + ".json");
|
|
91
|
+
const args = ["buildx", "build", "--platform", "linux/amd64", "--file", join(containers, component, "Dockerfile"),
|
|
92
|
+
"--build-context", "flowpress=" + containers, "--tag", repository + ":" + tag,
|
|
93
|
+
"--build-arg", "RELEASE_SHA=" + revision, "--metadata-file", metadata, destination,
|
|
94
|
+
"--label", "io.flowpress.managed=true", "--label", "io.flowpress.kind=application", "--label", "io.flowpress.project=" + project.slug];
|
|
95
|
+
if (component !== "cms")
|
|
96
|
+
args.push("--build-arg", "FRONTEND_BUILD_ID=" + id);
|
|
97
|
+
if (component === "cms") {
|
|
98
|
+
if (!platform.phpImage)
|
|
99
|
+
throw new Error("Build and pin the shared PHP runtime first.");
|
|
100
|
+
args.push("--build-arg", "FLOWPRESS_PHP_IMAGE=" + platform.phpImage);
|
|
101
|
+
const authFile = join(root, "apps/cms/auth.json");
|
|
102
|
+
const composerAuth = operator.COMPOSER_AUTH || (existsSync(authFile) ? readFileSync(authFile, "utf8") : "");
|
|
103
|
+
if (!composerAuth)
|
|
104
|
+
throw new Error("COMPOSER_AUTH or private apps/cms/auth.json is required.");
|
|
105
|
+
args.push("--secret", "id=composer_auth,env=COMPOSER_AUTH");
|
|
106
|
+
run("docker", [...args, "."], { cwd: root, env: { ...process.env, COMPOSER_AUTH: composerAuth } });
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
const frontend = skipFrontend ? { dist: manifestEnvironment(root, name).SF_DIST_DIR } : frontendBuild(root, manifest, name, { sha: revision, buildId: id });
|
|
110
|
+
const web = readJson(join(root, "apps/web/package.json"));
|
|
111
|
+
args.push("--build-arg", "DIST_DIR=" + frontend.dist, "--build-arg", "WEB_PACKAGE=" + web.name);
|
|
112
|
+
run("docker", [...args, "."], { cwd: root });
|
|
113
|
+
}
|
|
114
|
+
const digest = push ? inspectDigest(repository + ":" + tag) : undefined;
|
|
115
|
+
const result = { component, environment: name, repository, tag, digest, sha: revision, buildId: component === "cms" ? undefined : id, pushed: push };
|
|
116
|
+
writeJson(join(root, ".local/flowpress", "release-" + name + "-" + component + ".json"), result, 0o600);
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/ops/build.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function checkProject(root: any, kind: any): {
|
|
2
|
+
features: any;
|
|
3
|
+
valid: boolean;
|
|
4
|
+
} | {
|
|
5
|
+
phpFiles: number;
|
|
6
|
+
checks?: undefined;
|
|
7
|
+
manifest?: undefined;
|
|
8
|
+
} | {
|
|
9
|
+
checks: string[];
|
|
10
|
+
manifest: string;
|
|
11
|
+
phpFiles?: undefined;
|
|
12
|
+
};
|
|
13
|
+
export const projectChecks: string[];
|
|
14
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/ops/check.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;EAwBC;AAzBD,qCAAwN"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
2
|
+
import { join, extname } from "node:path";
|
|
3
|
+
import { readJson, readManifest } from "./config.js";
|
|
4
|
+
import { checkFeatures } from "./features.js";
|
|
5
|
+
import { run } from "./process.js";
|
|
6
|
+
export const projectChecks = ["styleflow:validate", "styleflow:build", "components:check", "features:check", "check:boundaries", "check:forbidden", "check:php", "typecheck", "test", "web:check", "test:static-build"];
|
|
7
|
+
export function checkProject(root, kind) {
|
|
8
|
+
if (kind === "features") {
|
|
9
|
+
return checkFeatures(root);
|
|
10
|
+
}
|
|
11
|
+
if (kind === "php") {
|
|
12
|
+
const files = [];
|
|
13
|
+
function collect(path) {
|
|
14
|
+
if (!existsSync(path))
|
|
15
|
+
return;
|
|
16
|
+
if (statSync(path).isFile()) {
|
|
17
|
+
if (extname(path) === ".php")
|
|
18
|
+
files.push(path);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
for (const item of readdirSync(path))
|
|
22
|
+
if (!["vendor", "node_modules", "dist"].includes(item))
|
|
23
|
+
collect(join(path, item));
|
|
24
|
+
}
|
|
25
|
+
for (const name of ["check-updates.php", "config", "project", "tests", "web/index.php", "web/wp-config.php", "web/app/mu-plugins/bedrock-autoloader.php"])
|
|
26
|
+
collect(join(root, "apps/cms", name));
|
|
27
|
+
for (const file of files)
|
|
28
|
+
run("php", ["-l", file], { stdio: "pipe", encoding: "utf8" });
|
|
29
|
+
return { phpFiles: files.length };
|
|
30
|
+
}
|
|
31
|
+
if (kind)
|
|
32
|
+
throw new Error("Use check [features|php].");
|
|
33
|
+
readManifest(root);
|
|
34
|
+
const scripts = readJson(join(root, "package.json")).scripts || {};
|
|
35
|
+
const selected = projectChecks.filter(key => scripts[key]);
|
|
36
|
+
for (const key of selected) {
|
|
37
|
+
console.info("[check] " + key);
|
|
38
|
+
run("pnpm", ["run", key], { cwd: root });
|
|
39
|
+
}
|
|
40
|
+
return { checks: selected, manifest: "valid" };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/ops/check.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;AACxN,MAAM,UAAU,YAAY,CAAC,IAAI,EAAE,IAAI;IACrC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,SAAS,OAAO,CAAC,IAAI;YACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO;YAC9B,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBAAC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM;oBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACxF,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1H,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,2CAA2C,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;QACjM,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACxF,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACpC,CAAC;IACD,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACvD,YAAY,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;IACnE,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;QAC/B,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/ops/cli.js"],"names":[],"mappings":""}
|