@styleflow.app/flowpress-deploy 1.0.0-beta.3 → 1.0.0-beta.4
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 +13 -0
- package/README.md +5 -0
- 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.php +37 -0
- package/containers/cms/smtp.php +13 -0
- package/containers/cms/vhost.conf +58 -0
- package/containers/cms/wp-cli.yml +1 -0
- package/containers/php-runtime/Dockerfile +21 -0
- package/containers/web-ssr/Dockerfile +25 -0
- package/containers/web-ssr/Dockerfile.dockerignore +10 -0
- package/containers/web-static/Caddyfile +40 -0
- package/containers/web-static/Dockerfile +15 -0
- package/containers/web-static/Dockerfile.dockerignore +7 -0
- package/dist/ops/bootstrap.d.ts +21 -0
- package/dist/ops/bootstrap.d.ts.map +1 -0
- package/dist/ops/bootstrap.js +106 -0
- package/dist/ops/bootstrap.js.map +1 -0
- package/dist/ops/build.d.ts +30 -0
- package/dist/ops/build.d.ts.map +1 -0
- package/dist/ops/build.js +99 -0
- package/dist/ops/build.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 +137 -0
- package/dist/ops/cli.js.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 +163 -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 +27 -0
- package/dist/ops/data.d.ts.map +1 -0
- package/dist/ops/data.js +145 -0
- package/dist/ops/data.js.map +1 -0
- package/dist/ops/deploy.d.ts +18 -0
- package/dist/ops/deploy.d.ts.map +1 -0
- package/dist/ops/deploy.js +92 -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.d.ts +29 -0
- package/dist/ops/environment.d.ts.map +1 -0
- package/dist/ops/environment.js +159 -0
- package/dist/ops/environment.js.map +1 -0
- package/dist/ops/health.d.ts +25 -0
- package/dist/ops/health.d.ts.map +1 -0
- package/dist/ops/health.js +22 -0
- package/dist/ops/health.js.map +1 -0
- package/dist/ops/monitor.d.ts +23 -0
- package/dist/ops/monitor.d.ts.map +1 -0
- package/dist/ops/monitor.js +142 -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 +48 -0
- package/dist/ops/process.js.map +1 -0
- package/dist/ops/provision.d.ts +38 -0
- package/dist/ops/provision.d.ts.map +1 -0
- package/dist/ops/provision.js +251 -0
- package/dist/ops/provision.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/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 +96 -0
- package/dist/ops/static-config.js.map +1 -0
- package/flowpress-deploy.php +2 -2
- package/package.json +26 -6
- package/schema/deployment.schema.json +45 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { allowedComponents, identity, imageRepository, loadState, operatorEnvironment, platformConfig, readJson, releaseTag, targetConfig, writeJson } from "./config.js";
|
|
5
|
+
import { manifestEnvironment, resolveFrontendEnvironment, shellEnvironment } from "./environment.js";
|
|
6
|
+
import { buildRoutesCaddy } from "./static-config.js";
|
|
7
|
+
import { capture, run } from "./process.js";
|
|
8
|
+
export const packageRoot = fileURLToPath(new URL("../../", import.meta.url));
|
|
9
|
+
export const containers = join(packageRoot, "containers");
|
|
10
|
+
export function registryLogin(platform, operator) {
|
|
11
|
+
if (!operator.REGISTRY_USERNAME || !operator.REGISTRY_PASSWORD)
|
|
12
|
+
throw new Error("Missing registry push/pull credentials.");
|
|
13
|
+
capture("docker", ["login", platform.registry, "--username", operator.REGISTRY_USERNAME, "--password-stdin"], { input: operator.REGISTRY_PASSWORD + "\n" });
|
|
14
|
+
}
|
|
15
|
+
export function inspectDigest(image) {
|
|
16
|
+
const result = capture("docker", ["buildx", "imagetools", "inspect", image, "--format", "{{json .Manifest}}"]);
|
|
17
|
+
const digest = JSON.parse(result).digest;
|
|
18
|
+
if (!/^sha256:[a-f0-9]{64}$/.test(digest || ""))
|
|
19
|
+
throw new Error("Registry returned no valid manifest digest.");
|
|
20
|
+
return digest;
|
|
21
|
+
}
|
|
22
|
+
export function buildBase(root, platform, { push = false } = {}) {
|
|
23
|
+
const version = readJson(join(packageRoot, "package.json")).version;
|
|
24
|
+
const image = platform.registry + "/flowpress/php-runtime:" + version;
|
|
25
|
+
if (push)
|
|
26
|
+
registryLogin(platform, operatorEnvironment(root));
|
|
27
|
+
run("docker", ["buildx", "build", "--platform", "linux/amd64", "--file", join(containers, "php-runtime", "Dockerfile"), "--tag", image, push ? "--push" : "--load", containers]);
|
|
28
|
+
return { image: push ? image.slice(0, image.lastIndexOf(":")) + "@" + inspectDigest(image) : image };
|
|
29
|
+
}
|
|
30
|
+
export function frontendBuild(root, manifest, name, { sha, buildId }) {
|
|
31
|
+
const values = manifestEnvironment(root, name, { ...process.env, RELEASE_SHA: sha, FRONTEND_BUILD_ID: buildId });
|
|
32
|
+
const env = resolveFrontendEnvironment(values, target => manifestEnvironment(root, target, {}));
|
|
33
|
+
const web = readJson(join(root, "apps/web/package.json"));
|
|
34
|
+
const childEnv = { ...process.env, ...shellEnvironment(env), RELEASE_SHA: sha, FRONTEND_BUILD_ID: buildId };
|
|
35
|
+
const dist = resolve(root, env.SF_DIST_DIR);
|
|
36
|
+
if (!dist.startsWith(root + "/"))
|
|
37
|
+
throw new Error("Build output must stay inside the project.");
|
|
38
|
+
run("pnpm", ["styleflow:build"], { cwd: root, env: childEnv });
|
|
39
|
+
run("pnpm", ["--filter", web.name, "build"], { cwd: root, env: childEnv });
|
|
40
|
+
if (env.ASTRO_OUTPUT_MODE === "static") {
|
|
41
|
+
if (!existsSync(join(dist, "index.html")))
|
|
42
|
+
throw new Error("Static build has no index.html.");
|
|
43
|
+
const read = name => existsSync(join(dist, name)) ? readFileSync(join(dist, name), "utf8") : "";
|
|
44
|
+
mkdirSync(join(dist, ".container"), { recursive: true });
|
|
45
|
+
writeFileSync(join(dist, ".container", "routes.caddy"), buildRoutesCaddy({
|
|
46
|
+
redirects: read("_redirects"), headers: read("_headers"),
|
|
47
|
+
media: manifest.media === "local" ? env.BACKEND_URL + "/app/uploads" : env.FLOWPRESS_MEDIA,
|
|
48
|
+
backend: env.BACKEND_URL,
|
|
49
|
+
}));
|
|
50
|
+
writeJson(join(dist, "healthz.json"), { status: "ok", release: sha, buildId, environment: name, output: "static", backendTarget: env.FRONTEND_BACKEND_TARGET });
|
|
51
|
+
}
|
|
52
|
+
return { env, dist: env.SF_DIST_DIR };
|
|
53
|
+
}
|
|
54
|
+
export function build(root, manifest, name, component, { sha, buildId, push = false, file, skipFrontend = false } = {}) {
|
|
55
|
+
const target = targetConfig(manifest, name);
|
|
56
|
+
const supported = component === "cms" ? ["backend", "headless-static", "headless-ssr"] : null;
|
|
57
|
+
if (supported && !supported.includes(target.profile || manifest.profile))
|
|
58
|
+
throw new Error("Profile does not contain a CMS.");
|
|
59
|
+
if (!["cms", "web-static", "web-ssr"].includes(component))
|
|
60
|
+
throw new Error("Unknown component.");
|
|
61
|
+
if (push)
|
|
62
|
+
allowedComponents(manifest, name, [component]);
|
|
63
|
+
const platform = platformConfig(root, manifest, file);
|
|
64
|
+
const project = identity(root);
|
|
65
|
+
const revision = sha || capture("git", ["rev-parse", "HEAD"], { cwd: root });
|
|
66
|
+
const id = buildId || String(Date.now());
|
|
67
|
+
const tag = releaseTag(component, name, revision, id);
|
|
68
|
+
const repository = imageRepository(platform, project.slug, component);
|
|
69
|
+
const operator = operatorEnvironment(root);
|
|
70
|
+
if (push)
|
|
71
|
+
registryLogin(platform, operator);
|
|
72
|
+
mkdirSync(join(root, ".local/flowpress"), { recursive: true, mode: 0o700 });
|
|
73
|
+
const metadata = join(root, ".local/flowpress", "build-" + name + "-" + component + ".json");
|
|
74
|
+
const args = ["buildx", "build", "--platform", "linux/amd64", "--file", join(containers, component, "Dockerfile"),
|
|
75
|
+
"--build-context", "flowpress=" + containers, "--tag", repository + ":" + tag,
|
|
76
|
+
"--build-arg", "RELEASE_SHA=" + revision, "--metadata-file", metadata, push ? "--push" : "--load"];
|
|
77
|
+
if (component === "cms") {
|
|
78
|
+
if (!platform.phpImage)
|
|
79
|
+
throw new Error("Build and pin the shared PHP runtime first.");
|
|
80
|
+
args.push("--build-arg", "FLOWPRESS_PHP_IMAGE=" + platform.phpImage);
|
|
81
|
+
const authFile = join(root, "apps/cms/auth.json");
|
|
82
|
+
const composerAuth = operator.COMPOSER_AUTH || (existsSync(authFile) ? readFileSync(authFile, "utf8") : "");
|
|
83
|
+
if (!composerAuth)
|
|
84
|
+
throw new Error("COMPOSER_AUTH or private apps/cms/auth.json is required.");
|
|
85
|
+
args.push("--secret", "id=composer_auth,env=COMPOSER_AUTH");
|
|
86
|
+
run("docker", [...args, "."], { cwd: root, env: { ...process.env, COMPOSER_AUTH: composerAuth } });
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const frontend = skipFrontend ? { dist: manifestEnvironment(root, name).SF_DIST_DIR } : frontendBuild(root, manifest, name, { sha: revision, buildId: id });
|
|
90
|
+
const web = readJson(join(root, "apps/web/package.json"));
|
|
91
|
+
args.push("--build-arg", "DIST_DIR=" + frontend.dist, "--build-arg", "WEB_PACKAGE=" + web.name);
|
|
92
|
+
run("docker", [...args, "."], { cwd: root });
|
|
93
|
+
}
|
|
94
|
+
const digest = push ? inspectDigest(repository + ":" + tag) : undefined;
|
|
95
|
+
const result = { component, environment: name, repository, tag, digest, sha: revision, buildId: component === "cms" ? undefined : id, pushed: push };
|
|
96
|
+
writeJson(join(root, ".local/flowpress", "release-" + name + "-" + component + ".json"), result, 0o600);
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/ops/cli.js"],"names":[],"mappings":""}
|
package/dist/ops/cli.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { allowedComponents, identity, loadState, operatorEnvironment, platformConfig, projectRoot, readManifest, saveState } from "./config.js";
|
|
3
|
+
import { argValue, containerFor, shellQuote, ssh } from "./process.js";
|
|
4
|
+
import { build, buildBase, frontendBuild } from "./build.js";
|
|
5
|
+
import { deploy } from "./deploy.js";
|
|
6
|
+
import { provision, provisionPlatform } from "./provision.js";
|
|
7
|
+
import { pullSource, prepareData, pushData, pushUploads } from "./data.js";
|
|
8
|
+
import { backupRun, backupVerify, status } from "./monitor.js";
|
|
9
|
+
import { coolifyClient } from "./coolify.js";
|
|
10
|
+
import { release, editorialCommit } from "./release.js";
|
|
11
|
+
import { readFileSync, appendFileSync } from "node:fs";
|
|
12
|
+
import { provisionRegistry, provisionDns } from "./bootstrap.js";
|
|
13
|
+
const args = process.argv.slice(2);
|
|
14
|
+
const [command, name, component] = args;
|
|
15
|
+
function help() {
|
|
16
|
+
return "FlowPress Ops\n\n"
|
|
17
|
+
+ " flowpress-ops plan|provision <environment> [component] [--apply]\n"
|
|
18
|
+
+ " flowpress-ops platform plan|provision|build-base [--apply] [--push]\n"
|
|
19
|
+
+ " flowpress-ops registry [--apply] | dns <environment> [--apply]\n"
|
|
20
|
+
+ " flowpress-ops build <environment> <cms|web-static|web-ssr> [--push] [--sha SHA]\n"
|
|
21
|
+
+ " flowpress-ops frontend <environment> [--sha SHA] [--build-id ID]\n"
|
|
22
|
+
+ " flowpress-ops deploy|rollback <environment> <component>\n"
|
|
23
|
+
+ " flowpress-ops release <environment> [component] [--editorial]\n"
|
|
24
|
+
+ " flowpress-ops db pull <source> | prepare <environment> --from FILE | push <environment> --from FILE\n"
|
|
25
|
+
+ " flowpress-ops uploads <environment> --from ARCHIVE\n"
|
|
26
|
+
+ " flowpress-ops backup run|verify <environment>\n"
|
|
27
|
+
+ " flowpress-ops preview start|stop [--backend staging|production]\n"
|
|
28
|
+
+ " flowpress-ops status [environment] [--check] [--json]\n"
|
|
29
|
+
+ " flowpress-ops logs <environment> [component]\n\n"
|
|
30
|
+
+ "Provisioning is read-only without --apply. Publish lists are enforced by every remote write.\n";
|
|
31
|
+
}
|
|
32
|
+
async function main() {
|
|
33
|
+
if (!command || ["--help", "-h"].includes(command)) {
|
|
34
|
+
console.log(help());
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const root = projectRoot(), manifest = readManifest(root);
|
|
38
|
+
const file = argValue(args, "--platform-file");
|
|
39
|
+
let result;
|
|
40
|
+
if (command === "plan" || command === "provision") {
|
|
41
|
+
result = await provision(root, manifest, name, { file, apply: command === "provision" && args.includes("--apply"), components: component && !component.startsWith("--") ? [component] : [] });
|
|
42
|
+
}
|
|
43
|
+
else if (command === "platform") {
|
|
44
|
+
if (name === "build-base")
|
|
45
|
+
result = buildBase(root, platformConfig(root, manifest, file), { push: args.includes("--push") });
|
|
46
|
+
else if (["plan", "provision"].includes(name))
|
|
47
|
+
result = await provisionPlatform(root, manifest, { file, apply: name === "provision" && args.includes("--apply") });
|
|
48
|
+
else
|
|
49
|
+
throw new Error("Use platform plan|provision|build-base.");
|
|
50
|
+
}
|
|
51
|
+
else if (command === "registry") {
|
|
52
|
+
result = await provisionRegistry(root, manifest, { file, apply: args.includes("--apply") });
|
|
53
|
+
}
|
|
54
|
+
else if (command === "dns") {
|
|
55
|
+
result = await provisionDns(root, manifest, name, { file, apply: args.includes("--apply") });
|
|
56
|
+
}
|
|
57
|
+
else if (command === "build") {
|
|
58
|
+
result = build(root, manifest, name, component, { file, push: args.includes("--push"), sha: argValue(args, "--sha"), buildId: argValue(args, "--build-id"), skipFrontend: args.includes("--skip-frontend") });
|
|
59
|
+
}
|
|
60
|
+
else if (command === "frontend") {
|
|
61
|
+
result = frontendBuild(root, manifest, name, { sha: argValue(args, "--sha") || (await import("./process.js")).capture("git", ["rev-parse", "HEAD"], { cwd: root }), buildId: argValue(args, "--build-id") || String(Date.now()) });
|
|
62
|
+
result = { environment: name, output: result.dist };
|
|
63
|
+
}
|
|
64
|
+
else if (command === "deploy" || command === "rollback") {
|
|
65
|
+
result = await deploy(root, manifest, name, component, { rollback: command === "rollback" });
|
|
66
|
+
}
|
|
67
|
+
else if (command === "release") {
|
|
68
|
+
result = await release(root, manifest, name, { component: component && !component.startsWith("--") ? component : undefined, sha: argValue(args, "--sha"), buildId: argValue(args, "--build-id"), editorial: args.includes("--editorial") });
|
|
69
|
+
}
|
|
70
|
+
else if (command === "editorial") {
|
|
71
|
+
const event = JSON.parse(readFileSync(process.env.GITHUB_EVENT_PATH, "utf8"));
|
|
72
|
+
result = await editorialCommit(root, manifest, event.client_payload);
|
|
73
|
+
if (process.env.GITHUB_OUTPUT)
|
|
74
|
+
appendFileSync(process.env.GITHUB_OUTPUT, "sha=" + result.sha + "\ntarget=" + result.request.target + "\n");
|
|
75
|
+
}
|
|
76
|
+
else if (command === "db") {
|
|
77
|
+
const target = component;
|
|
78
|
+
if (name === "pull")
|
|
79
|
+
result = await pullSource(root, manifest, target);
|
|
80
|
+
else if (name === "prepare")
|
|
81
|
+
result = await prepareData(root, manifest, target, { file: argValue(args, "--from"), source: argValue(args, "--source") || "production", image: argValue(args, "--image") });
|
|
82
|
+
else if (name === "push")
|
|
83
|
+
result = await pushData(root, manifest, target, argValue(args, "--from"));
|
|
84
|
+
else
|
|
85
|
+
throw new Error("Use db pull|prepare|push.");
|
|
86
|
+
}
|
|
87
|
+
else if (command === "uploads")
|
|
88
|
+
result = await pushUploads(root, manifest, name, argValue(args, "--from"));
|
|
89
|
+
else if (command === "backup")
|
|
90
|
+
result = await (name === "run" ? backupRun : name === "verify" ? backupVerify : () => { throw new Error("Use backup run|verify."); })(root, manifest, component);
|
|
91
|
+
else if (command === "status") {
|
|
92
|
+
result = await status(root, manifest, name && !name.startsWith("--") ? name : undefined);
|
|
93
|
+
if (args.includes("--check") && !result.ok)
|
|
94
|
+
process.exitCode = 1;
|
|
95
|
+
}
|
|
96
|
+
else if (command === "logs") {
|
|
97
|
+
const state = loadState(root, name), app = state.apps?.[component || "cms"];
|
|
98
|
+
if (!app?.uuid)
|
|
99
|
+
throw new Error("Component not provisioned.");
|
|
100
|
+
console.log(ssh(state.platform, "docker logs --tail 100 " + shellQuote(containerFor(state.platform, app.uuid))));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
else if (command === "preview") {
|
|
104
|
+
allowedComponents(manifest, "preview", ["web-ssr"]);
|
|
105
|
+
const target = manifest.environments.preview;
|
|
106
|
+
if (argValue(args, "--backend") && argValue(args, "--backend") !== target.backend)
|
|
107
|
+
throw new Error("Update the manifest backend before starting preview.");
|
|
108
|
+
if (!["start", "stop"].includes(name))
|
|
109
|
+
throw new Error("Use preview start|stop.");
|
|
110
|
+
const state = loadState(root, "preview"), app = state.apps?.["web-ssr"];
|
|
111
|
+
if (!app?.uuid)
|
|
112
|
+
throw new Error("Provision preview first.");
|
|
113
|
+
if (name === "start") {
|
|
114
|
+
if (!app.current)
|
|
115
|
+
throw new Error("Build and deploy preview once before starting it.");
|
|
116
|
+
result = await deploy(root, manifest, "preview", "web-ssr", { release: app.current });
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
const api = coolifyClient(state.platform.coolifyUrl, operatorEnvironment(root).COOLIFY_TOKEN);
|
|
120
|
+
await api("POST", "/applications/" + app.uuid + "/stop");
|
|
121
|
+
result = { preview: "stopped", dataPreserved: true };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else
|
|
125
|
+
throw new Error("Unknown command. Use --help.");
|
|
126
|
+
if (args.includes("--json"))
|
|
127
|
+
console.log(JSON.stringify(result, null, 2));
|
|
128
|
+
else {
|
|
129
|
+
console.log("FlowPress: " + command + (name ? " " + name : ""));
|
|
130
|
+
console.log(JSON.stringify(result, null, 2));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
main().catch(error => {
|
|
134
|
+
console.error("FlowPress: " + error.message);
|
|
135
|
+
process.exitCode = 1;
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/ops/cli.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function projectRoot(start?: string): string;
|
|
2
|
+
export function readJson(file: any, fallback?: undefined): any;
|
|
3
|
+
export function writeJson(file: any, value: any, mode?: number): void;
|
|
4
|
+
export function readEnv(file: any): import("dotenv").DotenvParseOutput;
|
|
5
|
+
export function origin(value: any, label: any): string;
|
|
6
|
+
export function assertManifest(value: any): any;
|
|
7
|
+
export function readManifest(root?: string): any;
|
|
8
|
+
export function targetConfig(manifest: any, name: any): any;
|
|
9
|
+
export function allowedComponents(manifest: any, name: any, requested?: any[]): any;
|
|
10
|
+
export function identity(root?: string): {
|
|
11
|
+
slug: string;
|
|
12
|
+
displayName: any;
|
|
13
|
+
repository: any;
|
|
14
|
+
};
|
|
15
|
+
export function statePath(root: any, name: any): string;
|
|
16
|
+
export function loadState(root: any, name: any): any;
|
|
17
|
+
export function saveState(root: any, name: any, state: any): void;
|
|
18
|
+
export function platformConfig(root: any, manifest: any, file: any): any;
|
|
19
|
+
export function publicPlatform(id: any, platform: any): {
|
|
20
|
+
id: any;
|
|
21
|
+
coolifyUrl: any;
|
|
22
|
+
serverUuid: any;
|
|
23
|
+
ssh: any;
|
|
24
|
+
network: any;
|
|
25
|
+
subnet: any;
|
|
26
|
+
registry: any;
|
|
27
|
+
registryProject: any;
|
|
28
|
+
backupStorageUuid: any;
|
|
29
|
+
poolUuid: any;
|
|
30
|
+
destinationUuid: any;
|
|
31
|
+
phpImage: any;
|
|
32
|
+
};
|
|
33
|
+
export function databaseIdentity(slug: any, name: any): {
|
|
34
|
+
DB_NAME: string;
|
|
35
|
+
DB_USER: string;
|
|
36
|
+
};
|
|
37
|
+
export function ensureSecrets(root: any, name: any, slug: any): {
|
|
38
|
+
DB_NAME: string;
|
|
39
|
+
DB_USER: string;
|
|
40
|
+
};
|
|
41
|
+
export function operatorEnvironment(root: any): {
|
|
42
|
+
[x: string]: string | undefined;
|
|
43
|
+
};
|
|
44
|
+
export function imageRepository(platform: any, slug: any, component: any): string;
|
|
45
|
+
export function releaseTag(component: any, name: any, sha: any, buildId: any): string;
|
|
46
|
+
export const profiles: Readonly<{
|
|
47
|
+
backend: string[];
|
|
48
|
+
static: string[];
|
|
49
|
+
"headless-static": string[];
|
|
50
|
+
"headless-ssr": string[];
|
|
51
|
+
}>;
|
|
52
|
+
export const environments: string[];
|
|
53
|
+
export const saltKeys: string[];
|
|
54
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/ops/config.js"],"names":[],"mappings":"AAaA,oDAQC;AACD,+DAGC;AACD,sEAKC;AACD,uEAEC;AACD,uDAOC;AACD,gDAmBC;AACD,iDAEC;AACD,4DAGC;AACD,oFAMC;AACD;;;;EAMC;AACD,wDAA+F;AAC/F,qDAAqF;AACrF,kEAAyF;AACzF,yEAYC;AACD;;;;;;;;;;;;;EAGC;AACD;;;EAGC;AAED;;;EASC;AACD;;EAEC;AACD,kFAGC;AACD,sFAKC;AA7HD;;;;;GAKG;AACH,oCAA0E;AAgG1E,gCAAuJ"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { existsSync, readFileSync, mkdirSync, writeFileSync, renameSync } from "node:fs";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { parse as parseYaml } from "yaml";
|
|
5
|
+
import { parse as parseEnv } from "dotenv";
|
|
6
|
+
export const profiles = Object.freeze({
|
|
7
|
+
backend: ["cms"],
|
|
8
|
+
static: ["web-static"],
|
|
9
|
+
"headless-static": ["cms", "web-static"],
|
|
10
|
+
"headless-ssr": ["cms", "web-ssr"],
|
|
11
|
+
});
|
|
12
|
+
export const environments = ["local", "staging", "production", "preview"];
|
|
13
|
+
export function projectRoot(start = process.env.FLOWPRESS_PROJECT_ROOT || process.cwd()) {
|
|
14
|
+
let root = resolve(start);
|
|
15
|
+
while (!existsSync(join(root, "flowpress.deploy.yaml")) && !existsSync(join(root, "pnpm-workspace.yaml"))) {
|
|
16
|
+
const parent = dirname(root);
|
|
17
|
+
if (parent === root)
|
|
18
|
+
throw new Error("Run this command inside a FlowPress project.");
|
|
19
|
+
root = parent;
|
|
20
|
+
}
|
|
21
|
+
return root;
|
|
22
|
+
}
|
|
23
|
+
export function readJson(file, fallback = undefined) {
|
|
24
|
+
if (!existsSync(file))
|
|
25
|
+
return fallback;
|
|
26
|
+
return JSON.parse(readFileSync(file, "utf8"));
|
|
27
|
+
}
|
|
28
|
+
export function writeJson(file, value, mode = 0o644) {
|
|
29
|
+
mkdirSync(dirname(file), { recursive: true, mode: 0o700 });
|
|
30
|
+
const temporary = file + ".tmp-" + process.pid;
|
|
31
|
+
writeFileSync(temporary, JSON.stringify(value, null, 2) + "\n", { mode });
|
|
32
|
+
renameSync(temporary, file);
|
|
33
|
+
}
|
|
34
|
+
export function readEnv(file) {
|
|
35
|
+
return existsSync(file) ? parseEnv(readFileSync(file)) : {};
|
|
36
|
+
}
|
|
37
|
+
export function origin(value, label) {
|
|
38
|
+
let url;
|
|
39
|
+
try {
|
|
40
|
+
url = new URL(value);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
throw new Error(label + " must be an absolute HTTP(S) URL.");
|
|
44
|
+
}
|
|
45
|
+
if (!["https:", "http:"].includes(url.protocol) || url.username || url.password || url.search || url.hash || url.pathname !== "/") {
|
|
46
|
+
throw new Error(label + " must be an origin without credentials, path, query or fragment.");
|
|
47
|
+
}
|
|
48
|
+
return url.origin;
|
|
49
|
+
}
|
|
50
|
+
export function assertManifest(value) {
|
|
51
|
+
if (!value || value.schemaVersion !== 1 || !profiles[value.profile])
|
|
52
|
+
throw new Error("Expected deployment schemaVersion 1 and a supported profile.");
|
|
53
|
+
if (typeof value.platform !== "string" || !/^[a-z0-9][a-z0-9-]*$/.test(value.platform))
|
|
54
|
+
throw new Error("Invalid platform identifier.");
|
|
55
|
+
if (value.database !== "shared" || !["local", "s3"].includes(value.media))
|
|
56
|
+
throw new Error("Use database: shared and media: local|s3.");
|
|
57
|
+
if (!value.environments || typeof value.environments !== "object")
|
|
58
|
+
throw new Error("Missing environments.");
|
|
59
|
+
for (const [name, target] of Object.entries(value.environments)) {
|
|
60
|
+
if (!environments.includes(name))
|
|
61
|
+
throw new Error("Unsupported environment: " + name);
|
|
62
|
+
const components = name === "preview" ? ["web-ssr"] : profiles[target.profile || value.profile];
|
|
63
|
+
if (!components)
|
|
64
|
+
throw new Error("Unsupported profile for " + name);
|
|
65
|
+
if (!Array.isArray(target.publish) || target.publish.some(component => !components.includes(component)) || new Set(target.publish).size !== target.publish.length) {
|
|
66
|
+
throw new Error("Explicit publish list required for " + name + "; select components from " + components.join(", "));
|
|
67
|
+
}
|
|
68
|
+
for (const key of ["backendUrl", "frontendUrl"])
|
|
69
|
+
if (target[key])
|
|
70
|
+
origin(target[key], name + "." + key);
|
|
71
|
+
if (target.publish.includes("cms") && !target.backendUrl)
|
|
72
|
+
throw new Error(name + " CMS requires backendUrl.");
|
|
73
|
+
if (target.publish.some(component => component !== "cms") && !target.frontendUrl)
|
|
74
|
+
throw new Error(name + " frontend requires frontendUrl.");
|
|
75
|
+
if (name === "preview" && (target.mode !== "on-demand" || !["staging", "production"].includes(target.backend)))
|
|
76
|
+
throw new Error("Preview requires mode: on-demand and backend: staging|production.");
|
|
77
|
+
if (target.backend && !value.environments[target.backend])
|
|
78
|
+
throw new Error("Unknown backend reference: " + target.backend);
|
|
79
|
+
}
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
export function readManifest(root = projectRoot()) {
|
|
83
|
+
return assertManifest(parseYaml(readFileSync(join(root, "flowpress.deploy.yaml"), "utf8"), { uniqueKeys: true, maxAliasCount: 0 }));
|
|
84
|
+
}
|
|
85
|
+
export function targetConfig(manifest, name) {
|
|
86
|
+
if (!environments.includes(name) || !manifest.environments[name])
|
|
87
|
+
throw new Error("Environment not configured: " + name);
|
|
88
|
+
return manifest.environments[name];
|
|
89
|
+
}
|
|
90
|
+
export function allowedComponents(manifest, name, requested = []) {
|
|
91
|
+
const target = targetConfig(manifest, name);
|
|
92
|
+
const selected = requested.length ? requested : target.publish;
|
|
93
|
+
if (!selected.length)
|
|
94
|
+
throw new Error("Publication is disabled for " + name + ".");
|
|
95
|
+
for (const component of selected)
|
|
96
|
+
if (!target.publish.includes(component))
|
|
97
|
+
throw new Error("Publication of " + component + " is disabled for " + name + ".");
|
|
98
|
+
return selected;
|
|
99
|
+
}
|
|
100
|
+
export function identity(root = projectRoot()) {
|
|
101
|
+
const config = readJson(join(root, "flowpress.config.json"));
|
|
102
|
+
const pkg = readJson(join(root, "package.json"), {});
|
|
103
|
+
const slug = config?.project?.slug || pkg.name;
|
|
104
|
+
if (typeof slug !== "string" || !/^[a-z0-9][a-z0-9.-]*$/.test(slug))
|
|
105
|
+
throw new Error("A safe project slug is required.");
|
|
106
|
+
return { slug, displayName: config?.project?.displayName || slug, repository: config?.repository?.slug };
|
|
107
|
+
}
|
|
108
|
+
export function statePath(root, name) { return join(root, "deploy", "state", name + ".json"); }
|
|
109
|
+
export function loadState(root, name) { return readJson(statePath(root, name), {}); }
|
|
110
|
+
export function saveState(root, name, state) { writeJson(statePath(root, name), state); }
|
|
111
|
+
export function platformConfig(root, manifest, file) {
|
|
112
|
+
if (file || process.env.FLOWPRESS_PLATFORMS_FILE) {
|
|
113
|
+
const catalog = parseYaml(readFileSync(file || process.env.FLOWPRESS_PLATFORMS_FILE, "utf8"));
|
|
114
|
+
const platform = catalog.platforms?.[manifest.platform];
|
|
115
|
+
if (!platform)
|
|
116
|
+
throw new Error("Platform not found: " + manifest.platform);
|
|
117
|
+
return { ...platform, registryProject: manifest.registryProject || identity(root).slug };
|
|
118
|
+
}
|
|
119
|
+
for (const name of Object.keys(manifest.environments)) {
|
|
120
|
+
const state = loadState(root, name);
|
|
121
|
+
if (state.platform?.id === manifest.platform)
|
|
122
|
+
return { ...state.platform, registryProject: manifest.registryProject || identity(root).slug };
|
|
123
|
+
}
|
|
124
|
+
throw new Error("Set FLOWPRESS_PLATFORMS_FILE for initial provisioning.");
|
|
125
|
+
}
|
|
126
|
+
export function publicPlatform(id, platform) {
|
|
127
|
+
const { coolifyUrl, serverUuid, ssh, network, subnet, registry, registryProject, backupStorageUuid, poolUuid, destinationUuid, phpImage } = platform;
|
|
128
|
+
return { id, coolifyUrl, serverUuid, ssh, network, subnet, registry, registryProject, backupStorageUuid, poolUuid, destinationUuid, phpImage };
|
|
129
|
+
}
|
|
130
|
+
export function databaseIdentity(slug, name) {
|
|
131
|
+
const hash = createHash("sha256").update(slug + ":" + name).digest("hex").slice(0, 16);
|
|
132
|
+
return { DB_NAME: "fp" + hash, DB_USER: "fp" + hash };
|
|
133
|
+
}
|
|
134
|
+
export const saltKeys = ["AUTH_KEY", "SECURE_AUTH_KEY", "LOGGED_IN_KEY", "NONCE_KEY", "AUTH_SALT", "SECURE_AUTH_SALT", "LOGGED_IN_SALT", "NONCE_SALT"];
|
|
135
|
+
export function ensureSecrets(root, name, slug) {
|
|
136
|
+
const file = join(root, ".secrets", name + ".env");
|
|
137
|
+
const current = readEnv(file);
|
|
138
|
+
const values = { ...databaseIdentity(slug, name), ...current };
|
|
139
|
+
for (const key of [...saltKeys, "DB_PASSWORD", "CMS_BUILD_CALLBACK_TOKEN"])
|
|
140
|
+
values[key] ||= randomBytes(32).toString("hex");
|
|
141
|
+
values.DB_PREFIX ||= "fp_";
|
|
142
|
+
mkdirSync(dirname(file), { recursive: true, mode: 0o700 });
|
|
143
|
+
writeFileSync(file, Object.entries(values).map(([key, value]) => key + "=" + JSON.stringify(value)).join("\n") + "\n", { mode: 0o600 });
|
|
144
|
+
return values;
|
|
145
|
+
}
|
|
146
|
+
export function operatorEnvironment(root) {
|
|
147
|
+
return { ...readEnv(join(root, ".secrets", "ops.env")), ...process.env };
|
|
148
|
+
}
|
|
149
|
+
export function imageRepository(platform, slug, component) {
|
|
150
|
+
if (!/^[a-z0-9][a-z0-9.-]*$/.test(slug) || !["cms", "web-static", "web-ssr"].includes(component))
|
|
151
|
+
throw new Error("Invalid image identity.");
|
|
152
|
+
return platform.registry + "/" + platform.registryProject + "/" + slug + "-" + component;
|
|
153
|
+
}
|
|
154
|
+
export function releaseTag(component, name, sha, buildId) {
|
|
155
|
+
if (!/^[a-f0-9]{40}$/.test(sha))
|
|
156
|
+
throw new Error("Expected a full commit SHA.");
|
|
157
|
+
if (component === "cms")
|
|
158
|
+
return "sha-" + sha;
|
|
159
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9.-]{0,63}$/.test(buildId || ""))
|
|
160
|
+
throw new Error("A safe frontend build ID is required.");
|
|
161
|
+
return name + "-" + sha + "-" + buildId;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/ops/config.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coolify.d.ts","sourceRoot":"","sources":["../../src/ops/coolify.js"],"names":[],"mappings":"AACA,0DAGgC,WAAM,EAAE,SAAI,EAAE,SAAI,kBA8BjD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Minimal Coolify v4 REST client (reachable only through the tailnet).
|
|
2
|
+
export function coolifyClient(baseUrl, token) {
|
|
3
|
+
if (!token)
|
|
4
|
+
throw new Error("Missing Coolify API token (COOLIFY_TOKEN).");
|
|
5
|
+
const api = `${baseUrl.replace(/\/+$/, "")}/api/v1`;
|
|
6
|
+
return async function request(method, path, body) {
|
|
7
|
+
for (let attempt = 0;; attempt++) {
|
|
8
|
+
try {
|
|
9
|
+
const response = await fetch(`${api}${path}`, {
|
|
10
|
+
method,
|
|
11
|
+
signal: AbortSignal.timeout(30_000),
|
|
12
|
+
headers: {
|
|
13
|
+
accept: "application/json",
|
|
14
|
+
authorization: `Bearer ${token}`,
|
|
15
|
+
...(body ? { "content-type": "application/json" } : {}),
|
|
16
|
+
},
|
|
17
|
+
...(body ? { body: JSON.stringify(body) } : {}),
|
|
18
|
+
});
|
|
19
|
+
const text = await response.text();
|
|
20
|
+
let data;
|
|
21
|
+
try {
|
|
22
|
+
data = text ? JSON.parse(text) : {};
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
data = { message: text.slice(0, 300) };
|
|
26
|
+
}
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
const details = data?.message ? String(data.message).replace(/Bearer\s+\S+/g, "[redacted]").slice(0, 160) : "Request refused";
|
|
29
|
+
const error = new Error(`${method} ${path.split("?")[0]} -> HTTP ${response.status}: ${details}`);
|
|
30
|
+
error.status = response.status;
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const transient = error.status === undefined || error.status >= 500 || error.status === 429;
|
|
37
|
+
if (method !== "GET" || !transient || attempt >= 2)
|
|
38
|
+
throw error;
|
|
39
|
+
await new Promise((resolve) => setTimeout(resolve, 2000 * (attempt + 1)));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=coolify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coolify.js","sourceRoot":"","sources":["../../src/ops/coolify.js"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,OAAO,EAAE,KAAK;IAC1C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC;IACpD,OAAO,KAAK,UAAU,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI;QAC9C,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,EAAE,EAAE;oBAC5C,MAAM;oBACN,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;oBACnC,OAAO,EAAE;wBACP,MAAM,EAAE,kBAAkB;wBAC1B,aAAa,EAAE,UAAU,KAAK,EAAE;wBAChC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACxD;oBACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChD,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,IAAI,IAAI,CAAC;gBACT,IAAI,CAAC;oBAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gBAAC,CAAC;gBAC9F,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;oBAC9H,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;oBAClG,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;oBAC/B,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC;gBAC5F,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC;oBAAE,MAAM,KAAK,CAAC;gBAChE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function safeArchiveEntries(entries: any): void;
|
|
2
|
+
export function pullSource(root: any, manifest: any, sourceName: any): Promise<{
|
|
3
|
+
source: any;
|
|
4
|
+
createdAt: string;
|
|
5
|
+
dump: string;
|
|
6
|
+
archive: string;
|
|
7
|
+
sha256: string;
|
|
8
|
+
}>;
|
|
9
|
+
export function prepareData(root: any, manifest: any, name: any, { file, image, source }: {
|
|
10
|
+
file: any;
|
|
11
|
+
image: any;
|
|
12
|
+
source?: string | undefined;
|
|
13
|
+
}): Promise<{
|
|
14
|
+
file: string;
|
|
15
|
+
counts: any;
|
|
16
|
+
prefix: any;
|
|
17
|
+
}>;
|
|
18
|
+
export function pushData(root: any, manifest: any, name: any, file: any): Promise<{
|
|
19
|
+
environment: any;
|
|
20
|
+
imported: boolean;
|
|
21
|
+
database: any;
|
|
22
|
+
}>;
|
|
23
|
+
export function pushUploads(root: any, manifest: any, name: any, archive: any): Promise<{
|
|
24
|
+
environment: any;
|
|
25
|
+
uploadsCopied: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/ops/data.js"],"names":[],"mappings":"AAUA,uDAEC;AACD;;;;;;GAeC;AAUD;;;;;;;;GAoDC;AACD;;;;GAiBC;AACD;;;GAWC"}
|