@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.
Files changed (175) hide show
  1. package/CHANGELOG.md +156 -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 +128 -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 +31 -0
  133. package/dist/ops/media.d.ts.map +1 -0
  134. package/dist/ops/media.js +74 -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,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,7 @@
1
+ .git
2
+ node_modules
3
+ .env*
4
+ .secrets
5
+ .local
6
+ apps/cms
7
+ docs
@@ -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,3 @@
1
+ /** Fetch adapter for proxies running on Node, whose fetch decompresses bodies. */
2
+ export declare const nodeProxyFetch: typeof fetch;
3
+ //# sourceMappingURL=node-fetch.d.ts.map
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/ops/cli.js"],"names":[],"mappings":""}