@saltcorn/cli 1.1.0-beta.0 → 1.1.0-beta.10
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/README.md +48 -47
- package/npm-shrinkwrap.json +2407 -549
- package/oclif.manifest.json +8 -1
- package/package.json +9 -10
- package/src/commands/backup.js +31 -0
- package/src/commands/dev/release.js +23 -13
- package/src/commands/restore.js +27 -0
package/oclif.manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.1.0-beta.
|
|
2
|
+
"version": "1.1.0-beta.10",
|
|
3
3
|
"commands": {
|
|
4
4
|
"add-schema": {
|
|
5
5
|
"id": "add-schema",
|
|
@@ -53,6 +53,13 @@
|
|
|
53
53
|
"description": "Backup tenant in saltcorn zip format",
|
|
54
54
|
"multiple": false
|
|
55
55
|
},
|
|
56
|
+
"all_tenants": {
|
|
57
|
+
"name": "all_tenants",
|
|
58
|
+
"type": "boolean",
|
|
59
|
+
"char": "a",
|
|
60
|
+
"description": "Backup all tenants in saltcorn zip format",
|
|
61
|
+
"allowNo": false
|
|
62
|
+
},
|
|
56
63
|
"zip": {
|
|
57
64
|
"name": "zip",
|
|
58
65
|
"type": "boolean",
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@saltcorn/cli",
|
|
3
3
|
"description": "Command-line interface for Saltcorn, open-source no-code platform",
|
|
4
4
|
"homepage": "https://saltcorn.com",
|
|
5
|
-
"version": "1.1.0-beta.
|
|
5
|
+
"version": "1.1.0-beta.10",
|
|
6
6
|
"author": "Tom Nielsen @glutamate",
|
|
7
7
|
"bin": {
|
|
8
8
|
"saltcorn": "./bin/saltcorn"
|
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@oclif/core": "^2.16.0",
|
|
13
13
|
"@oclif/plugin-plugins": "^3.9.4",
|
|
14
|
-
"@saltcorn/admin-models": "1.1.0-beta.
|
|
15
|
-
"@saltcorn/common-code": "1.1.0-beta.
|
|
16
|
-
"@saltcorn/data": "1.1.0-beta.
|
|
17
|
-
"@saltcorn/mobile-app": "1.1.0-beta.
|
|
18
|
-
"@saltcorn/mobile-builder": "1.1.0-beta.
|
|
19
|
-
"@saltcorn/plugins-loader": "1.1.0-beta.
|
|
20
|
-
"@saltcorn/server": "1.1.0-beta.
|
|
14
|
+
"@saltcorn/admin-models": "1.1.0-beta.10",
|
|
15
|
+
"@saltcorn/common-code": "1.1.0-beta.10",
|
|
16
|
+
"@saltcorn/data": "1.1.0-beta.10",
|
|
17
|
+
"@saltcorn/mobile-app": "1.1.0-beta.10",
|
|
18
|
+
"@saltcorn/mobile-builder": "1.1.0-beta.10",
|
|
19
|
+
"@saltcorn/plugins-loader": "1.1.0-beta.10",
|
|
20
|
+
"@saltcorn/server": "1.1.0-beta.10",
|
|
21
21
|
"contractis": "^0.1.0",
|
|
22
22
|
"dateformat": "^3.0.3",
|
|
23
23
|
"inquirer": "^7.3.3",
|
|
@@ -57,9 +57,8 @@
|
|
|
57
57
|
"repository": "github:saltcorn/saltcorn",
|
|
58
58
|
"scripts": {
|
|
59
59
|
"postpack": "rm -f oclif.manifest.json",
|
|
60
|
-
"
|
|
60
|
+
"manifest": "oclif manifest && oclif readme",
|
|
61
61
|
"test": "echo NO TESTS",
|
|
62
|
-
"version": "oclif readme && git add README.md",
|
|
63
62
|
"tsc": "echo \"Error: no TypeScript support yet\"",
|
|
64
63
|
"clean": "echo \"Error: no TypeScript support yet\""
|
|
65
64
|
},
|
package/src/commands/backup.js
CHANGED
|
@@ -11,6 +11,7 @@ const { getConnectObject } = require("@saltcorn/data/db/connect");
|
|
|
11
11
|
const day = dateFormat(new Date(), "yyyymmdd");
|
|
12
12
|
const connobj = getConnectObject();
|
|
13
13
|
const { init_some_tenants } = require("../common");
|
|
14
|
+
const fs = require("fs");
|
|
14
15
|
|
|
15
16
|
const pgdb = connobj.database;
|
|
16
17
|
|
|
@@ -45,6 +46,32 @@ class BackupCommand extends Command {
|
|
|
45
46
|
const fnm = await create_backup(flags.output);
|
|
46
47
|
console.log(fnm);
|
|
47
48
|
});
|
|
49
|
+
} else if (flags.all_tenants) {
|
|
50
|
+
const db = require("@saltcorn/data/db");
|
|
51
|
+
|
|
52
|
+
const { create_backup } = require("@saltcorn/admin-models/models/backup");
|
|
53
|
+
const { loadAllPlugins } = require("@saltcorn/server/load_plugins");
|
|
54
|
+
const { eachTenant } = require("@saltcorn/admin-models/models/tenant");
|
|
55
|
+
const { init_multi_tenant } = require("@saltcorn/data/db/state");
|
|
56
|
+
let nten = 0,
|
|
57
|
+
nerr = 0;
|
|
58
|
+
const domain_files = {};
|
|
59
|
+
await eachTenant(async () => {
|
|
60
|
+
try {
|
|
61
|
+
nten += 1;
|
|
62
|
+
const domain = db.getTenantSchema();
|
|
63
|
+
await init_multi_tenant(loadAllPlugins, undefined, [domain]);
|
|
64
|
+
console.log("Backup tenant", domain);
|
|
65
|
+
const fnm = await create_backup(flags.output);
|
|
66
|
+
console.log(fnm);
|
|
67
|
+
domain_files[domain] = fnm;
|
|
68
|
+
} catch (e) {
|
|
69
|
+
nerr += 1;
|
|
70
|
+
console.error(e);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
fs.writeFileSync("domain_files.json", JSON.stringify(domain_files));
|
|
74
|
+
console.log("done backup all tenants", nerr, "/", nten, "errors");
|
|
48
75
|
} else if (flags.zip) {
|
|
49
76
|
// zip the saltcorn backup
|
|
50
77
|
const { create_backup } = require("@saltcorn/admin-models/models/backup");
|
|
@@ -115,6 +142,10 @@ BackupCommand.flags = {
|
|
|
115
142
|
char: "t",
|
|
116
143
|
description: "Backup tenant in saltcorn zip format",
|
|
117
144
|
}),
|
|
145
|
+
all_tenants: Flags.boolean({
|
|
146
|
+
char: "a",
|
|
147
|
+
description: "Backup all tenants in saltcorn zip format",
|
|
148
|
+
}),
|
|
118
149
|
zip: Flags.boolean({
|
|
119
150
|
char: "z",
|
|
120
151
|
description: "Backup public in saltcorn zip format",
|
|
@@ -102,21 +102,19 @@ class ReleaseCommand extends Command {
|
|
|
102
102
|
const tags = !tags0 ? [] : Array.isArray(tags0) ? tags0 : [tags0];
|
|
103
103
|
if (flags.tag) tags.push(flags.tag);
|
|
104
104
|
const firstTag = tags[0];
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
[
|
|
108
|
-
"publish",
|
|
109
|
-
"--access=public",
|
|
110
|
-
...(firstTag ? [`--tag ${firstTag}`] : []),
|
|
111
|
-
],
|
|
112
|
-
{
|
|
113
|
-
stdio: "inherit",
|
|
114
|
-
cwd: `packages/${dir}/`,
|
|
115
|
-
}
|
|
105
|
+
console.log(
|
|
106
|
+
`packages/${dir}$ npm publish ${firstTag ? `--tag ${firstTag}` : ""}`
|
|
116
107
|
);
|
|
108
|
+
spawnSync("npm", ["publish", ...(firstTag ? ["--tag", firstTag] : [])], {
|
|
109
|
+
stdio: "inherit",
|
|
110
|
+
cwd: `packages/${dir}/`,
|
|
111
|
+
});
|
|
117
112
|
tags.shift();
|
|
118
113
|
for (const tag of tags) {
|
|
119
114
|
await sleep(3000);
|
|
115
|
+
console.log(
|
|
116
|
+
`packages/${dir}$ npm dist-tag add @saltcorn/cli@${version} ${tag}`
|
|
117
|
+
);
|
|
120
118
|
spawnSync("npm", ["dist-tag", "add", `@saltcorn/cli@${version}`, tag], {
|
|
121
119
|
stdio: "inherit",
|
|
122
120
|
cwd: `packages/${dir}/`,
|
|
@@ -158,12 +156,24 @@ class ReleaseCommand extends Command {
|
|
|
158
156
|
stdio: "inherit",
|
|
159
157
|
cwd: `packages/saltcorn-cli/`,
|
|
160
158
|
});
|
|
159
|
+
spawnSync("npm", ["install", "--legacy-peer-deps"], {
|
|
160
|
+
stdio: "inherit",
|
|
161
|
+
cwd: `packages/saltcorn-cli/`,
|
|
162
|
+
});
|
|
163
|
+
spawnSync("npm", ["run", "manifest"], {
|
|
164
|
+
stdio: "inherit",
|
|
165
|
+
cwd: `packages/saltcorn-cli/`,
|
|
166
|
+
});
|
|
167
|
+
spawnSync("npm", ["install", "--legacy-peer-deps"], {
|
|
168
|
+
stdio: "inherit",
|
|
169
|
+
cwd: ".",
|
|
170
|
+
});
|
|
161
171
|
// do not run 'audit fix' on full point releases, only on -beta.x, -rc.x etc
|
|
162
|
-
if (version.includes("-"))
|
|
172
|
+
/*if (version.includes("-"))
|
|
163
173
|
spawnSync("npm", ["audit", "fix"], {
|
|
164
174
|
stdio: "inherit",
|
|
165
175
|
cwd: `packages/saltcorn-cli/`,
|
|
166
|
-
})
|
|
176
|
+
});*/
|
|
167
177
|
await publish("saltcorn-cli", "next");
|
|
168
178
|
fs.writeFileSync(`package.json`, JSON.stringify(rootPackageJson, null, 2));
|
|
169
179
|
// update Dockerfile
|
package/src/commands/restore.js
CHANGED
|
@@ -6,6 +6,7 @@ const { Command, Flags, Args } = require("@oclif/core");
|
|
|
6
6
|
const { spawnSync } = require("child_process");
|
|
7
7
|
const path = require("path");
|
|
8
8
|
const { maybe_as_tenant } = require("../common");
|
|
9
|
+
const fs = require("fs");
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* RestoreCommand Class
|
|
@@ -72,6 +73,32 @@ class RestoreCommand extends Command {
|
|
|
72
73
|
case ".zip":
|
|
73
74
|
this.zip_restore(args.file, flags.tenant);
|
|
74
75
|
break;
|
|
76
|
+
case ".json":
|
|
77
|
+
if (!args.file.includes("domain_files.json")) {
|
|
78
|
+
console.error("unknown filetype: " + path.extname(args.file));
|
|
79
|
+
this.exit(1);
|
|
80
|
+
}
|
|
81
|
+
const fileConts = fs.readFileSync(args.file);
|
|
82
|
+
const domain_files = JSON.parse(fileConts);
|
|
83
|
+
const {
|
|
84
|
+
insertTenant,
|
|
85
|
+
getAllTenants,
|
|
86
|
+
switchToTenant,
|
|
87
|
+
} = require("@saltcorn/admin-models/models/tenant");
|
|
88
|
+
const { add_tenant } = require("@saltcorn/data/db/state");
|
|
89
|
+
|
|
90
|
+
let existing_tenants = new Set(await getAllTenants());
|
|
91
|
+
existing_tenants.add("public");
|
|
92
|
+
for (const [tenant, fnm] of Object.entries(domain_files)) {
|
|
93
|
+
console.log("restore", tenant, "from", fnm);
|
|
94
|
+
if (!existing_tenants.has(tenant)) {
|
|
95
|
+
const tenrow = await insertTenant(tenant);
|
|
96
|
+
add_tenant(tenant);
|
|
97
|
+
await switchToTenant(tenrow);
|
|
98
|
+
}
|
|
99
|
+
await this.zip_restore(fnm, tenant === "public" ? undefined : tenant);
|
|
100
|
+
}
|
|
101
|
+
break;
|
|
75
102
|
default:
|
|
76
103
|
console.error("unknown filetype: " + path.extname(args.file));
|
|
77
104
|
this.exit(1);
|