@hailer/app-sdk 2.0.0-beta-2 → 2.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/lib/app-sdk.js +2 -2
- package/lib/app-sdk.js.map +3 -3
- package/lib/modules/app.d.ts +8 -4
- package/lib/modules/product-installed.d.ts +40 -0
- package/lib/modules/product-version.d.ts +38 -0
- package/lib/modules/product.d.ts +4 -4
- package/lib/modules/public/product-version.d.ts +16 -0
- package/lib/modules/public/product.d.ts +2 -2
- package/lib/modules/public/version.d.ts +16 -0
- package/lib/modules/version.d.ts +16 -0
- package/lib/modules/workspace.d.ts +4 -2
- package/lib/src/constants.d.ts +7 -0
- package/lib/src/hailer-api.d.ts +92 -0
- package/lib/{index.js → src/index.d.ts} +0 -1
- package/lib/src/modules/activity/kanban.d.ts +36 -0
- package/lib/src/modules/activity.d.ts +83 -0
- package/lib/src/modules/app.d.ts +12 -0
- package/lib/src/modules/insight.d.ts +36 -0
- package/lib/src/modules/network.d.ts +14 -0
- package/lib/src/modules/permission.d.ts +9 -0
- package/lib/src/modules/process.d.ts +38 -0
- package/lib/src/modules/product-installed.d.ts +40 -0
- package/lib/src/modules/product-version.d.ts +16 -0
- package/lib/src/modules/product.d.ts +104 -0
- package/lib/src/modules/public/app.d.ts +17 -0
- package/lib/src/modules/public/form.d.ts +31 -0
- package/lib/src/modules/public/insight.d.ts +30 -0
- package/lib/src/modules/public/product-version.d.ts +16 -0
- package/lib/src/modules/public/product.d.ts +27 -0
- package/lib/src/modules/public.d.ts +22 -0
- package/lib/src/modules/ui/activity.d.ts +30 -0
- package/lib/src/modules/ui/files.d.ts +18 -0
- package/lib/src/modules/ui/snackbar.d.ts +18 -0
- package/lib/src/modules/ui.d.ts +17 -0
- package/lib/src/modules/user.d.ts +36 -0
- package/lib/src/modules/workflow.d.ts +24 -0
- package/lib/src/types.d.ts +381 -0
- package/lib/tools/publish.cjs +219 -183
- package/lib/tools/publish.cjs.map +7 -0
- package/lib/types.d.ts +9 -3
- package/lib/version.d.ts +0 -0
- package/package.json +2 -2
- package/lib/constants.js +0 -3
- package/lib/hailer-api.js +0 -147
- package/lib/modules/activity/kanban.js +0 -88
- package/lib/modules/activity.js +0 -170
- package/lib/modules/insight.js +0 -73
- package/lib/modules/network.js +0 -74
- package/lib/modules/process.js +0 -104
- package/lib/modules/public/form.js +0 -117
- package/lib/modules/public/insight.js +0 -114
- package/lib/modules/team.d.ts +0 -17
- package/lib/modules/ui/activity.js +0 -72
- package/lib/modules/ui.js +0 -10
- package/lib/modules/user.js +0 -133
- package/lib/public-api.d.ts +0 -16
- package/lib/public-api.js +0 -13
- package/lib/tools/minimal-password-prompt.d.ts +0 -1
- package/lib/tools/minimal-password-prompt.js +0 -50
- package/lib/types.js +0 -28
package/lib/tools/publish.cjs
CHANGED
|
@@ -1,197 +1,233 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (let key of __getOwnPropNames(from))
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
+
}
|
|
14
|
+
return to;
|
|
15
|
+
};
|
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
|
|
25
|
+
// tools/publish.ts
|
|
26
|
+
var import_cli = require("@hailer/cli");
|
|
27
|
+
var request = __toESM(require("request"));
|
|
28
|
+
var import_fs = require("fs");
|
|
29
|
+
|
|
30
|
+
// tools/minimal-password-prompt.ts
|
|
31
|
+
var stdin = process.stdin;
|
|
32
|
+
var stdout = process.stdout;
|
|
33
|
+
var captureStdin = (onData) => {
|
|
34
|
+
stdin.setEncoding("utf-8");
|
|
35
|
+
stdin.setRawMode(true);
|
|
36
|
+
stdin.on("data", onData);
|
|
37
|
+
stdin.resume();
|
|
38
|
+
};
|
|
39
|
+
var releaseStdin = (onData) => {
|
|
40
|
+
stdin.pause();
|
|
41
|
+
stdin.removeListener("data", onData);
|
|
42
|
+
stdin.setRawMode(false);
|
|
43
|
+
stdout.write("\n");
|
|
44
|
+
};
|
|
45
|
+
var prompt = (question, ctrlcExits = true) => new Promise((resolve, reject) => {
|
|
46
|
+
let input = "";
|
|
47
|
+
const onData = (data) => {
|
|
48
|
+
switch (data) {
|
|
49
|
+
case "\n":
|
|
50
|
+
case "\r":
|
|
51
|
+
case "":
|
|
52
|
+
releaseStdin(onData);
|
|
53
|
+
resolve(input);
|
|
54
|
+
break;
|
|
55
|
+
case "":
|
|
56
|
+
releaseStdin(onData);
|
|
57
|
+
if (ctrlcExits) {
|
|
58
|
+
process.exit();
|
|
59
|
+
} else {
|
|
60
|
+
reject(new Error("Ctrl+C"));
|
|
61
|
+
}
|
|
62
|
+
break;
|
|
63
|
+
case "\b":
|
|
64
|
+
case "\x7F":
|
|
65
|
+
input = input.slice(0, -1);
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
input += data;
|
|
7
69
|
}
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
70
|
+
;
|
|
71
|
+
};
|
|
72
|
+
captureStdin(onData);
|
|
73
|
+
stdout.write(question);
|
|
17
74
|
});
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
const cli_1 = require("@hailer/cli");
|
|
27
|
-
const request = __importStar(require("request"));
|
|
28
|
-
const fs_1 = require("fs");
|
|
29
|
-
const minimal_password_prompt_1 = require("minimal-password-prompt");
|
|
30
|
-
const util_1 = require("util");
|
|
31
|
-
const readline_1 = require("readline");
|
|
75
|
+
|
|
76
|
+
// tools/publish.ts
|
|
77
|
+
var import_util = require("util");
|
|
78
|
+
var import_readline = require("readline");
|
|
32
79
|
if (!process.env.EMAIL && !process.env.LOCAL) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
80
|
+
console.log("Please set environment variable EMAIL to Hailer user name.");
|
|
81
|
+
console.log("");
|
|
82
|
+
console.log("Usage:");
|
|
83
|
+
console.log(" EMAIL=user.name@mail.com npm run publish-production");
|
|
84
|
+
process.exit(10);
|
|
38
85
|
}
|
|
39
86
|
(async () => {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
87
|
+
let email = process.env.EMAIL;
|
|
88
|
+
let password = process.env.LOCAL || await prompt("enter password for " + email + ": ");
|
|
89
|
+
const market = process.env.MARKET === "true";
|
|
90
|
+
const appPackageFile = process.argv[2];
|
|
91
|
+
const mode = process.argv[3];
|
|
92
|
+
let host = process.env.HOST || "https://localhost:9443";
|
|
93
|
+
switch (mode) {
|
|
94
|
+
case "--development":
|
|
95
|
+
host = process.env.HOST || "https://testapi.hailer.biz";
|
|
96
|
+
break;
|
|
97
|
+
case "--staging":
|
|
98
|
+
host = process.env.HOST || "https://api.hailer.biz";
|
|
99
|
+
break;
|
|
100
|
+
case "--production":
|
|
101
|
+
host = process.env.HOST || "https://api.hailer.com";
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
if (process.env.LOCAL || mode === "--local") {
|
|
105
|
+
console.log("Overriding credentials with local settings!");
|
|
106
|
+
email = "el@hailero.es";
|
|
107
|
+
password = "el@hailero.es";
|
|
108
|
+
host = process.env.HOST || "https://api.hailer.local.gd";
|
|
109
|
+
}
|
|
110
|
+
const cli = await import_cli.Client.create({ host, username: email, password }).catch(
|
|
111
|
+
(error) => {
|
|
112
|
+
if (error.msg === "Invalid Login Data") {
|
|
113
|
+
console.log("Invalid username or password when logging into Hailer.");
|
|
114
|
+
} else {
|
|
115
|
+
console.log("Hailer Cli Error:", error);
|
|
116
|
+
}
|
|
117
|
+
process.exit(8);
|
|
58
118
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
119
|
+
);
|
|
120
|
+
if (!appPackageFile?.endsWith(".tgz")) {
|
|
121
|
+
console.log("Failed getting .tgz file, found:", appPackageFile);
|
|
122
|
+
process.exit(7);
|
|
123
|
+
}
|
|
124
|
+
const manifest = JSON.parse((0, import_fs.readFileSync)("./dist/manifest.json").toString());
|
|
125
|
+
const content = (0, import_fs.readFileSync)(appPackageFile);
|
|
126
|
+
const info = await cli.request("v2.core.init", [["network", "networks", "apps"]]);
|
|
127
|
+
if (market) {
|
|
128
|
+
if (!manifest.version) {
|
|
129
|
+
manifest.version = "";
|
|
130
|
+
manifest.versionDescription = "";
|
|
131
|
+
const updatedManifestContent = JSON.stringify(manifest, null, 2);
|
|
132
|
+
(0, import_fs.writeFileSync)("./public/manifest.json", updatedManifestContent, "utf-8");
|
|
133
|
+
console.log("");
|
|
134
|
+
console.log("Please set version & versionDescription in file public/manifest.json! You have added MARKET=true in your publish string.");
|
|
135
|
+
console.log("");
|
|
136
|
+
process.exit(10);
|
|
64
137
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
138
|
+
}
|
|
139
|
+
const getAppById = (manifestAppId) => {
|
|
140
|
+
for (const appMap of Object.values(info.apps)) {
|
|
141
|
+
for (const [appId, app2] of Object.entries(appMap)) {
|
|
142
|
+
if (appId === manifestAppId) {
|
|
143
|
+
return app2;
|
|
71
144
|
}
|
|
72
|
-
|
|
73
|
-
});
|
|
74
|
-
if (!appPackageFile?.endsWith('.tgz')) {
|
|
75
|
-
console.log('Failed getting .tgz file, found:', appPackageFile);
|
|
76
|
-
process.exit(7);
|
|
145
|
+
}
|
|
77
146
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
147
|
+
return null;
|
|
148
|
+
};
|
|
149
|
+
const app = getAppById(manifest.appId);
|
|
150
|
+
if (!app) {
|
|
151
|
+
console.log("The app was not found using this user:", email);
|
|
152
|
+
process.exit(2);
|
|
153
|
+
}
|
|
154
|
+
const personalApp = !app.cid;
|
|
155
|
+
console.log("Publishing App");
|
|
156
|
+
console.log(" Id:", manifest.appId);
|
|
157
|
+
console.log(" Name:", app.name);
|
|
158
|
+
if (personalApp) {
|
|
159
|
+
console.log(" Workspace: any (personal app)");
|
|
160
|
+
} else {
|
|
161
|
+
console.log(" Workspace:", info.networks[app.cid]?.name, "(" + app.cid + ")");
|
|
162
|
+
}
|
|
163
|
+
console.log(" Environment:", host);
|
|
164
|
+
console.log();
|
|
165
|
+
if (market) {
|
|
166
|
+
console.log(" Note: Also publishing app to Hailer market");
|
|
167
|
+
}
|
|
168
|
+
const promptOverwriteQuestion = async () => {
|
|
169
|
+
if (process.argv.includes("--yes")) {
|
|
170
|
+
return true;
|
|
96
171
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
172
|
+
return new Promise((resolve) => {
|
|
173
|
+
const rl = (0, import_readline.createInterface)(process.stdin, process.stdout);
|
|
174
|
+
rl.setPrompt("Overwrite the app? (Y/n): ");
|
|
175
|
+
rl.prompt();
|
|
176
|
+
rl.on("line", (line) => {
|
|
177
|
+
if (line.trim().toLocaleLowerCase().startsWith("n")) {
|
|
178
|
+
resolve(false);
|
|
179
|
+
} else {
|
|
180
|
+
resolve(true);
|
|
104
181
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
uri: host + '/app/publish',
|
|
153
|
-
headers: { hlrkey: cli.sessionKey },
|
|
154
|
-
formData: {
|
|
155
|
-
file: {
|
|
156
|
-
value: content,
|
|
157
|
-
options: {
|
|
158
|
-
filename: appPackageFile,
|
|
159
|
-
}
|
|
160
|
-
},
|
|
161
|
-
appId: manifest.appId,
|
|
162
|
-
// Market code
|
|
163
|
-
publishMarket: market.toString(),
|
|
164
|
-
}
|
|
165
|
-
}, function (error, resp, body) {
|
|
166
|
-
if (error) {
|
|
167
|
-
console.log('Publish error uploading file:', error);
|
|
168
|
-
process.exit(9);
|
|
169
|
-
}
|
|
170
|
-
let response;
|
|
171
|
-
let infoMarket = '';
|
|
172
|
-
try {
|
|
173
|
-
response = JSON.parse(body);
|
|
174
|
-
// Market code
|
|
175
|
-
if (response.manifest && response.manifest.targetId) {
|
|
176
|
-
infoMarket = 'Note! Use targetId in public/manifest.json file when creating the product in market!';
|
|
177
|
-
// Write targetId to manifest.json
|
|
178
|
-
manifest.targetId = response.manifest.targetId;
|
|
179
|
-
// Convert the modified object back to JSON
|
|
180
|
-
const updatedManifestContent = JSON.stringify(manifest, null, 2);
|
|
181
|
-
// Write the updated JSON content back to manifest.json
|
|
182
|
-
(0, fs_1.writeFileSync)('./public/manifest.json', updatedManifestContent, 'utf-8');
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
catch (error) {
|
|
186
|
-
// ingore
|
|
187
|
-
}
|
|
188
|
-
console.log('App info:', (0, util_1.inspect)(response, { depth: 10, colors: true }));
|
|
189
|
-
console.log();
|
|
190
|
-
console.log(infoMarket);
|
|
191
|
-
console.log();
|
|
192
|
-
console.log('Published successfully!');
|
|
193
|
-
resolve();
|
|
194
|
-
});
|
|
182
|
+
rl.close();
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
};
|
|
186
|
+
const shouldOverwrite = await promptOverwriteQuestion();
|
|
187
|
+
if (!shouldOverwrite) {
|
|
188
|
+
console.log("Aborted publishing app.");
|
|
189
|
+
process.exit(0);
|
|
190
|
+
}
|
|
191
|
+
await new Promise((resolve, reject) => {
|
|
192
|
+
request.post({
|
|
193
|
+
uri: host + "/app/publish",
|
|
194
|
+
headers: { hlrkey: cli.sessionKey },
|
|
195
|
+
formData: {
|
|
196
|
+
file: {
|
|
197
|
+
value: content,
|
|
198
|
+
options: {
|
|
199
|
+
filename: appPackageFile
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
appId: manifest.appId,
|
|
203
|
+
// Market code
|
|
204
|
+
publishMarket: market.toString()
|
|
205
|
+
}
|
|
206
|
+
}, function(error, resp, body) {
|
|
207
|
+
if (error) {
|
|
208
|
+
console.log("Publish error uploading file:", error);
|
|
209
|
+
process.exit(9);
|
|
210
|
+
}
|
|
211
|
+
let response;
|
|
212
|
+
let infoMarket = "";
|
|
213
|
+
try {
|
|
214
|
+
response = JSON.parse(body);
|
|
215
|
+
if (response.manifest && response.manifest.targetId) {
|
|
216
|
+
infoMarket = "Note! Use targetId in public/manifest.json file when creating the product in market!";
|
|
217
|
+
manifest.targetId = response.manifest.targetId;
|
|
218
|
+
const updatedManifestContent = JSON.stringify(manifest, null, 2);
|
|
219
|
+
(0, import_fs.writeFileSync)("./public/manifest.json", updatedManifestContent, "utf-8");
|
|
220
|
+
}
|
|
221
|
+
} catch (error2) {
|
|
222
|
+
}
|
|
223
|
+
console.log("App info:", (0, import_util.inspect)(response, { depth: 10, colors: true }));
|
|
224
|
+
console.log();
|
|
225
|
+
console.log(infoMarket);
|
|
226
|
+
console.log();
|
|
227
|
+
console.log("Published successfully!");
|
|
228
|
+
resolve();
|
|
195
229
|
});
|
|
196
|
-
|
|
230
|
+
});
|
|
231
|
+
cli.disconnect();
|
|
197
232
|
})();
|
|
233
|
+
//# sourceMappingURL=publish.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../tools/publish.ts", "../../tools/minimal-password-prompt.ts"],
|
|
4
|
+
"sourcesContent": ["import { Client } from '@hailer/cli';\nimport * as request from 'request';\nimport { readFileSync, writeFileSync } from 'fs';\nimport { prompt } from './minimal-password-prompt';\nimport { inspect } from 'util';\nimport { createInterface } from 'readline';\n\nif (!process.env.EMAIL && !process.env.LOCAL) {\n console.log('Please set environment variable EMAIL to Hailer user name.');\n console.log('');\n console.log('Usage:');\n console.log(' EMAIL=user.name@mail.com npm run publish-production');\n process.exit(10);\n}\n\n(async () => {\n\n let email = process.env.EMAIL;\n let password = process.env.LOCAL || await prompt('enter password for ' + email + ': ');\n\n // Market code\n const market = process.env.MARKET === 'true';\n\n const appPackageFile = process.argv[2];\n\n /** Alternatives: `--development` | `--staging` | `--production` */\n const mode = process.argv[3];\n\n let host = process.env.HOST || 'https://localhost:9443';\n\n switch (mode) {\n case '--development':\n host = process.env.HOST || 'https://testapi.hailer.biz';\n break;\n case '--staging':\n host = process.env.HOST || 'https://api.hailer.biz';\n break;\n case '--production':\n host = process.env.HOST || 'https://api.hailer.com';\n break;\n }\n\n if (process.env.LOCAL || mode === '--local') {\n console.log('Overriding credentials with local settings!');\n email = 'el@hailero.es';\n password = 'el@hailero.es';\n host = process.env.HOST || 'https://api.hailer.local.gd';\n }\n\n const cli = await Client.create({ host, username: email, password }).catch(\n (error) => {\n if (error.msg === 'Invalid Login Data') {\n console.log('Invalid username or password when logging into Hailer.');\n } else {\n console.log('Hailer Cli Error:', error);\n }\n\n process.exit(8);\n }\n );\n\n if (!appPackageFile?.endsWith('.tgz')) {\n console.log('Failed getting .tgz file, found:', appPackageFile);\n process.exit(7);\n }\n\n const manifest = JSON.parse(readFileSync('./dist/manifest.json').toString());\n const content = readFileSync(appPackageFile);\n const info = await cli.request('v2.core.init', [['network', 'networks', 'apps']]);\n\n // Market code\n if (market) {\n // Check if version exist in manifest.json. If not, add empty version and let user fill it in\n if (!manifest.version) {\n manifest.version = '';\n manifest.versionDescription = '';\n\n // Convert the modified object back to JSON\n const updatedManifestContent = JSON.stringify(manifest, null, 2);\n \n // Write the updated JSON content back to manifest.json\n writeFileSync('./public/manifest.json', updatedManifestContent, 'utf-8');\n\n console.log('');\n console.log('Please set version & versionDescription in file public/manifest.json! You have added MARKET=true in your publish string.');\n console.log('');\n process.exit(10);\n }\n }\n\n const getAppById = (manifestAppId: string): { _id: string, name: string, cid: string } | null => {\n for (const appMap of Object.values(info.apps)) {\n for (const [appId, app] of Object.entries(appMap as any)) {\n if (appId === manifestAppId) {\n return app as any;\n }\n }\n }\n\n return null;\n }\n\n const app = getAppById(manifest.appId);\n\n if (!app) {\n console.log('The app was not found using this user:', email);\n process.exit(2);\n }\n\n const personalApp = !app.cid;\n\n console.log('Publishing App');\n console.log(' Id:', manifest.appId);\n console.log(' Name:', app.name);\n if (personalApp) {\n console.log(' Workspace: any (personal app)');\n } else {\n console.log(' Workspace:', info.networks[app.cid]?.name, '(' + app.cid + ')');\n }\n console.log(' Environment:', host);\n console.log();\n\n // Market code\n if (market) {\n console.log(' Note: Also publishing app to Hailer market');\n }\n\n /** Default to publish (yes) */\n const promptOverwriteQuestion = async () => {\n if (process.argv.includes('--yes')) {\n return true;\n }\n\n return new Promise<boolean>(resolve => {\n const rl = createInterface(process.stdin, process.stdout);\n\n rl.setPrompt('Overwrite the app? (Y/n): ');\n rl.prompt();\n rl.on('line', (line) => {\n if (line.trim().toLocaleLowerCase().startsWith('n')) {\n resolve(false);\n } else {\n resolve(true);\n }\n rl.close();\n });\n });\n }\n\n const shouldOverwrite = await promptOverwriteQuestion();\n\n if (!shouldOverwrite) {\n console.log('Aborted publishing app.');\n process.exit(0);\n }\n\n await new Promise<void>((resolve, reject) => {\n request.post({\n uri: host + '/app/publish',\n headers: { hlrkey: cli.sessionKey },\n formData: {\n file: {\n value: content,\n options: {\n filename: appPackageFile,\n }\n },\n appId: manifest.appId,\n // Market code\n publishMarket: market.toString(),\n }\n }, function (error, resp, body) {\n if (error) {\n console.log('Publish error uploading file:', error);\n process.exit(9);\n }\n\n let response;\n let infoMarket = '';\n\n try {\n response = JSON.parse(body);\n\n // Market code\n if (response.manifest && response.manifest.targetId) {\n infoMarket = 'Note! Use targetId in public/manifest.json file when creating the product in market!';\n // Write targetId to manifest.json\n manifest.targetId = response.manifest.targetId;\n\n // Convert the modified object back to JSON\n const updatedManifestContent = JSON.stringify(manifest, null, 2);\n \n // Write the updated JSON content back to manifest.json\n writeFileSync('./public/manifest.json', updatedManifestContent, 'utf-8');\n }\n } catch (error) {\n // ingore\n }\n\n console.log('App info:', inspect(response, { depth: 10, colors: true }));\n console.log();\n console.log(infoMarket);\n console.log();\n console.log('Published successfully!');\n resolve();\n });\n });\n\n cli.disconnect();\n})();\n", "// Re-written to TypeScript to fix typing issue, see: https://www.npmjs.com/package/minimal-password-prompt/v/1.1.0\n\nconst stdin = process.stdin;\nconst stdout = process.stdout;\n\nconst captureStdin = (onData: (data: string) => void) => {\n stdin.setEncoding('utf-8');\n stdin.setRawMode(true);\n stdin.on('data', onData);\n stdin.resume();\n};\n\nconst releaseStdin = (onData: (data: string) => void) => {\n stdin.pause();\n stdin.removeListener('data', onData);\n stdin.setRawMode(false);\n stdout.write('\\n');\n};\n\nexport const prompt = (question: string, ctrlcExits = true): Promise<string> => (\n new Promise((resolve, reject) => {\n let input = '';\n const onData = (data: string) => {\n switch (data) {\n case '\\u000A': // \\n\n case '\\u000D': // \\r\n case '\\u0004': // Ctrl+D\n releaseStdin(onData);\n resolve(input);\n break;\n case '\\u0003': // Ctrl+C\n releaseStdin(onData);\n if (ctrlcExits) { // exit or raise error\n process.exit();\n } else {\n reject(new Error('Ctrl+C'));\n }\n break;\n case '\\u0008': // Backspace\n case '\\u007F': // Delete\n input = input.slice(0, -1);\n break;\n default: // any other\n input += data;\n };\n };\n captureStdin(onData);\n stdout.write(question);\n })\n);\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iBAAuB;AACvB,cAAyB;AACzB,gBAA4C;;;ACA5C,IAAM,QAAQ,QAAQ;AACtB,IAAM,SAAS,QAAQ;AAEvB,IAAM,eAAe,CAAC,WAAmC;AACrD,QAAM,YAAY,OAAO;AACzB,QAAM,WAAW,IAAI;AACrB,QAAM,GAAG,QAAQ,MAAM;AACvB,QAAM,OAAO;AACjB;AAEA,IAAM,eAAe,CAAC,WAAmC;AACrD,QAAM,MAAM;AACZ,QAAM,eAAe,QAAQ,MAAM;AACnC,QAAM,WAAW,KAAK;AACtB,SAAO,MAAM,IAAI;AACrB;AAEO,IAAM,SAAS,CAAC,UAAkB,aAAa,SAClD,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC7B,MAAI,QAAQ;AACZ,QAAM,SAAS,CAAC,SAAiB;AAC7B,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,qBAAa,MAAM;AACnB,gBAAQ,KAAK;AACb;AAAA,MACJ,KAAK;AACD,qBAAa,MAAM;AACnB,YAAI,YAAY;AACZ,kBAAQ,KAAK;AAAA,QACjB,OAAO;AACH,iBAAO,IAAI,MAAM,QAAQ,CAAC;AAAA,QAC9B;AACA;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AACD,gBAAQ,MAAM,MAAM,GAAG,EAAE;AACzB;AAAA,MACJ;AACI,iBAAS;AAAA,IACjB;AAAC;AAAA,EACL;AACA,eAAa,MAAM;AACnB,SAAO,MAAM,QAAQ;AACzB,CAAC;;;AD5CL,kBAAwB;AACxB,sBAAgC;AAEhC,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,IAAI,OAAO;AAC1C,UAAQ,IAAI,4DAA4D;AACxE,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,QAAQ;AACpB,UAAQ,IAAI,uDAAuD;AACnE,UAAQ,KAAK,EAAE;AACnB;AAAA,CAEC,YAAY;AAET,MAAI,QAAQ,QAAQ,IAAI;AACxB,MAAI,WAAW,QAAQ,IAAI,SAAS,MAAM,OAAO,wBAAwB,QAAQ,IAAI;AAGrF,QAAM,SAAS,QAAQ,IAAI,WAAW;AAEtC,QAAM,iBAAiB,QAAQ,KAAK,CAAC;AAGrC,QAAM,OAAO,QAAQ,KAAK,CAAC;AAE3B,MAAI,OAAO,QAAQ,IAAI,QAAQ;AAE/B,UAAQ,MAAM;AAAA,IACd,KAAK;AACD,aAAO,QAAQ,IAAI,QAAQ;AAC3B;AAAA,IACA,KAAK;AACL,aAAO,QAAQ,IAAI,QAAQ;AAC3B;AAAA,IACJ,KAAK;AACD,aAAO,QAAQ,IAAI,QAAQ;AAC3B;AAAA,EACJ;AAEA,MAAI,QAAQ,IAAI,SAAS,SAAS,WAAW;AACzC,YAAQ,IAAI,6CAA6C;AACzD,YAAQ;AACR,eAAW;AACX,WAAO,QAAQ,IAAI,QAAQ;AAAA,EAC/B;AAEA,QAAM,MAAM,MAAM,kBAAO,OAAO,EAAE,MAAM,UAAU,OAAO,SAAS,CAAC,EAAE;AAAA,IACjE,CAAC,UAAU;AACP,UAAI,MAAM,QAAQ,sBAAsB;AACpC,gBAAQ,IAAI,wDAAwD;AAAA,MACxE,OAAO;AACH,gBAAQ,IAAI,qBAAqB,KAAK;AAAA,MAC1C;AAEA,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAEA,MAAI,CAAC,gBAAgB,SAAS,MAAM,GAAG;AACnC,YAAQ,IAAI,oCAAoC,cAAc;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,QAAM,WAAW,KAAK,UAAM,wBAAa,sBAAsB,EAAE,SAAS,CAAC;AAC3E,QAAM,cAAU,wBAAa,cAAc;AAC3C,QAAM,OAAO,MAAM,IAAI,QAAQ,gBAAgB,CAAC,CAAC,WAAW,YAAY,MAAM,CAAC,CAAC;AAGhF,MAAI,QAAQ;AAER,QAAI,CAAC,SAAS,SAAS;AACnB,eAAS,UAAU;AACnB,eAAS,qBAAqB;AAG9B,YAAM,yBAAyB,KAAK,UAAU,UAAU,MAAM,CAAC;AAG/D,mCAAc,0BAA0B,wBAAwB,OAAO;AAEvE,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,0HAA0H;AACtI,cAAQ,IAAI,EAAE;AACd,cAAQ,KAAK,EAAE;AAAA,IACnB;AAAA,EACJ;AAEA,QAAM,aAAa,CAAC,kBAA6E;AAC7F,eAAW,UAAU,OAAO,OAAO,KAAK,IAAI,GAAG;AAC3C,iBAAW,CAAC,OAAOA,IAAG,KAAK,OAAO,QAAQ,MAAa,GAAG;AACtD,YAAI,UAAU,eAAe;AACzB,iBAAOA;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAEA,QAAM,MAAM,WAAW,SAAS,KAAK;AAErC,MAAI,CAAC,KAAK;AACN,YAAQ,IAAI,0CAA0C,KAAK;AAC3D,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,QAAM,cAAc,CAAC,IAAI;AAEzB,UAAQ,IAAI,gBAAgB;AAC5B,UAAQ,IAAI,SAAS,SAAS,KAAK;AACnC,UAAQ,IAAI,WAAW,IAAI,IAAI;AAC/B,MAAI,aAAa;AACb,YAAQ,IAAI,iCAAiC;AAAA,EACjD,OAAO;AACH,YAAQ,IAAI,gBAAgB,KAAK,SAAS,IAAI,GAAG,GAAG,MAAM,MAAM,IAAI,MAAM,GAAG;AAAA,EACjF;AACA,UAAQ,IAAI,kBAAkB,IAAI;AAClC,UAAQ,IAAI;AAGZ,MAAI,QAAQ;AACR,YAAQ,IAAI,8CAA8C;AAAA,EAC9D;AAGA,QAAM,0BAA0B,YAAY;AACxC,QAAI,QAAQ,KAAK,SAAS,OAAO,GAAG;AAChC,aAAO;AAAA,IACX;AAEA,WAAO,IAAI,QAAiB,aAAW;AACnC,YAAM,SAAK,iCAAgB,QAAQ,OAAO,QAAQ,MAAM;AAExD,SAAG,UAAU,4BAA4B;AACzC,SAAG,OAAO;AACV,SAAG,GAAG,QAAQ,CAAC,SAAS;AACpB,YAAI,KAAK,KAAK,EAAE,kBAAkB,EAAE,WAAW,GAAG,GAAG;AACjD,kBAAQ,KAAK;AAAA,QACjB,OAAO;AACH,kBAAQ,IAAI;AAAA,QAChB;AACA,WAAG,MAAM;AAAA,MACb,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AAEA,QAAM,kBAAkB,MAAM,wBAAwB;AAEtD,MAAI,CAAC,iBAAiB;AAClB,YAAQ,IAAI,yBAAyB;AACrC,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AACzC,IAAQ,aAAK;AAAA,MACT,KAAK,OAAO;AAAA,MACZ,SAAS,EAAE,QAAQ,IAAI,WAAW;AAAA,MAClC,UAAU;AAAA,QACN,MAAM;AAAA,UACF,OAAO;AAAA,UACP,SAAS;AAAA,YACL,UAAU;AAAA,UACd;AAAA,QACJ;AAAA,QACA,OAAO,SAAS;AAAA;AAAA,QAEhB,eAAe,OAAO,SAAS;AAAA,MACnC;AAAA,IACJ,GAAG,SAAU,OAAO,MAAM,MAAM;AAC5B,UAAI,OAAO;AACP,gBAAQ,IAAI,iCAAiC,KAAK;AAClD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AAEA,UAAI;AACJ,UAAI,aAAa;AAEjB,UAAI;AACA,mBAAW,KAAK,MAAM,IAAI;AAG1B,YAAI,SAAS,YAAY,SAAS,SAAS,UAAU;AACjD,uBAAa;AAEb,mBAAS,WAAW,SAAS,SAAS;AAGtC,gBAAM,yBAAyB,KAAK,UAAU,UAAU,MAAM,CAAC;AAG/D,uCAAc,0BAA0B,wBAAwB,OAAO;AAAA,QAC3E;AAAA,MACJ,SAASC,QAAO;AAAA,MAEhB;AAEA,cAAQ,IAAI,iBAAa,qBAAQ,UAAU,EAAE,OAAO,IAAI,QAAQ,KAAK,CAAC,CAAC;AACvE,cAAQ,IAAI;AACZ,cAAQ,IAAI,UAAU;AACtB,cAAQ,IAAI;AACZ,cAAQ,IAAI,yBAAyB;AACrC,cAAQ;AAAA,IACZ,CAAC;AAAA,EACL,CAAC;AAED,MAAI,WAAW;AACnB,GAAG;",
|
|
6
|
+
"names": ["app", "error"]
|
|
7
|
+
}
|
package/lib/types.d.ts
CHANGED
|
@@ -408,18 +408,24 @@ export interface Signal {
|
|
|
408
408
|
}
|
|
409
409
|
export interface Product extends ProductType {
|
|
410
410
|
_id: string;
|
|
411
|
-
targetId
|
|
411
|
+
targetId?: string;
|
|
412
412
|
name: string;
|
|
413
413
|
description?: string;
|
|
414
414
|
icon?: string;
|
|
415
415
|
images?: string[];
|
|
416
416
|
externalUrl?: string;
|
|
417
417
|
publisher?: string;
|
|
418
|
+
ctaLabel: string;
|
|
419
|
+
ctaLink: string;
|
|
418
420
|
/** Available or not in app store */
|
|
419
421
|
public?: boolean;
|
|
420
|
-
|
|
422
|
+
cid?: string;
|
|
421
423
|
uid: string;
|
|
422
424
|
}
|
|
425
|
+
export interface ProductListResponse {
|
|
426
|
+
products: Product[];
|
|
427
|
+
totalCount: number;
|
|
428
|
+
}
|
|
423
429
|
export interface ProductSearchOption {
|
|
424
430
|
limit?: number;
|
|
425
431
|
skip?: number;
|
|
@@ -434,7 +440,7 @@ export interface ProductSearchFilter extends ProductType {
|
|
|
434
440
|
uid?: string;
|
|
435
441
|
}
|
|
436
442
|
export interface ProductType {
|
|
437
|
-
type?: 'app' | 'template' | '
|
|
443
|
+
type?: 'app' | 'template' | 'integration' | 'expert' | 'ai-agent';
|
|
438
444
|
}
|
|
439
445
|
export interface ProductVersion {
|
|
440
446
|
_id: string;
|
package/lib/version.d.ts
ADDED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hailer/app-sdk",
|
|
3
|
-
"version": "2.0.0-beta-
|
|
3
|
+
"version": "2.0.0-beta-4",
|
|
4
4
|
"description": "SDK for building Hailer Apps",
|
|
5
5
|
"author": "",
|
|
6
6
|
"license": "ISC",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"./lib/**/*"
|
|
12
12
|
],
|
|
13
13
|
"scripts": {
|
|
14
|
-
"build": "
|
|
14
|
+
"build": "esbuild tools/publish.ts --platform=node --packages=external --bundle --format=cjs --sourcemap --outfile=lib/tools/publish.cjs && tsc && esbuild src/index.ts --bundle --format=esm --minify --sourcemap --outfile=lib/app-sdk.js",
|
|
15
15
|
"prepublishOnly": "npm run build",
|
|
16
16
|
"watch": "concurrently --kill-others \"npm run watch-tsc\" \"npm run watch-esbuild\"",
|
|
17
17
|
"watch-tsc": "tsc --watch",
|
package/lib/constants.js
DELETED