@qaecy/cue-cli 0.0.41 → 0.0.43
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/main.js +76 -24
- package/package.json +1 -1
package/main.js
CHANGED
|
@@ -8347,6 +8347,9 @@ WHERE {
|
|
|
8347
8347
|
{ relativePath: file.relativePath, md5: file.md5, size: file.size, providerId, fileContentExists: false }
|
|
8348
8348
|
);
|
|
8349
8349
|
}
|
|
8350
|
+
async getTierNames() {
|
|
8351
|
+
return this._fetchTierNames();
|
|
8352
|
+
}
|
|
8350
8353
|
async _fetchTierNames() {
|
|
8351
8354
|
try {
|
|
8352
8355
|
const text = await this._blob.downloadPublic("tier-names.json");
|
|
@@ -9546,29 +9549,66 @@ Triples only in file 2 (${result.triplesOnlyInFile2.size}):`);
|
|
|
9546
9549
|
|
|
9547
9550
|
// apps/desktop/cue-cli/src/cue-cli-create-project.ts
|
|
9548
9551
|
var readline2 = __toESM(require("readline"));
|
|
9549
|
-
function
|
|
9550
|
-
|
|
9552
|
+
function createAsker(rl) {
|
|
9553
|
+
const lineQueue = [];
|
|
9554
|
+
const waiters = [];
|
|
9555
|
+
let closed = false;
|
|
9556
|
+
rl.on("line", (line) => {
|
|
9557
|
+
if (waiters.length > 0) {
|
|
9558
|
+
const waiter = waiters.shift();
|
|
9559
|
+
if (waiter) {
|
|
9560
|
+
process.stdout.write(line + "\n");
|
|
9561
|
+
waiter.resolve(line.trim());
|
|
9562
|
+
}
|
|
9563
|
+
} else {
|
|
9564
|
+
lineQueue.push(line);
|
|
9565
|
+
}
|
|
9566
|
+
});
|
|
9567
|
+
rl.on("close", () => {
|
|
9568
|
+
closed = true;
|
|
9569
|
+
for (const waiter of waiters.splice(0)) {
|
|
9570
|
+
waiter.reject(new Error("INPUT_CLOSED"));
|
|
9571
|
+
}
|
|
9572
|
+
});
|
|
9573
|
+
return (question) => {
|
|
9574
|
+
process.stdout.write(question);
|
|
9575
|
+
if (lineQueue.length > 0) {
|
|
9576
|
+
const answer = lineQueue.shift() ?? "";
|
|
9577
|
+
process.stdout.write(answer + "\n");
|
|
9578
|
+
return Promise.resolve(answer.trim());
|
|
9579
|
+
}
|
|
9580
|
+
if (closed) {
|
|
9581
|
+
return Promise.reject(new Error("INPUT_CLOSED"));
|
|
9582
|
+
}
|
|
9583
|
+
return new Promise((resolve2, reject) => {
|
|
9584
|
+
waiters.push({ resolve: resolve2, reject });
|
|
9585
|
+
});
|
|
9586
|
+
};
|
|
9551
9587
|
}
|
|
9552
|
-
async function pickOne(
|
|
9588
|
+
async function pickOne(ask, label, items, display) {
|
|
9553
9589
|
console.log(`
|
|
9554
9590
|
${label}`);
|
|
9555
9591
|
items.forEach((item, i) => console.log(` ${i + 1}. ${display(item)}`));
|
|
9556
|
-
|
|
9557
|
-
|
|
9592
|
+
let selected = [];
|
|
9593
|
+
while (selected.length === 0 || items.length === 1) {
|
|
9594
|
+
const answer = await ask(`Enter number (1-${items.length}): `);
|
|
9558
9595
|
const idx = parseInt(answer, 10) - 1;
|
|
9559
|
-
if (idx >= 0 && idx < items.length)
|
|
9560
|
-
|
|
9596
|
+
if (idx >= 0 && idx < items.length) {
|
|
9597
|
+
selected = [items[idx]];
|
|
9598
|
+
break;
|
|
9599
|
+
}
|
|
9561
9600
|
console.log(" Invalid selection, try again.");
|
|
9562
9601
|
}
|
|
9602
|
+
return selected[0];
|
|
9563
9603
|
}
|
|
9564
|
-
async function pickMultipleOrAll(
|
|
9604
|
+
async function pickMultipleOrAll(ask, label, items, display) {
|
|
9565
9605
|
if (items.length === 0)
|
|
9566
9606
|
return [];
|
|
9567
9607
|
console.log(`
|
|
9568
9608
|
${label}`);
|
|
9569
9609
|
items.forEach((item, i) => console.log(` ${i + 1}. ${display(item)}`));
|
|
9570
9610
|
console.log(` 0. All`);
|
|
9571
|
-
const answer = await ask(
|
|
9611
|
+
const answer = await ask(`Enter comma-separated numbers or 0 for all: `);
|
|
9572
9612
|
if (answer === "0")
|
|
9573
9613
|
return items;
|
|
9574
9614
|
const indices = answer.split(",").map((s) => parseInt(s.trim(), 10) - 1).filter((i) => i >= 0 && i < items.length);
|
|
@@ -9576,7 +9616,8 @@ ${label}`);
|
|
|
9576
9616
|
}
|
|
9577
9617
|
async function createProjectHandler(options) {
|
|
9578
9618
|
const { emulators, verbose } = options;
|
|
9579
|
-
const rl = readline2.createInterface({ input: process.stdin,
|
|
9619
|
+
const rl = readline2.createInterface({ input: process.stdin, terminal: process.stdout.isTTY });
|
|
9620
|
+
const ask = createAsker(rl);
|
|
9580
9621
|
try {
|
|
9581
9622
|
const key = options.key ?? process.env.CUE_API_KEY;
|
|
9582
9623
|
if (!key) {
|
|
@@ -9613,7 +9654,7 @@ async function createProjectHandler(options) {
|
|
|
9613
9654
|
console.error("No organisations found on the platform.");
|
|
9614
9655
|
process.exit(1);
|
|
9615
9656
|
}
|
|
9616
|
-
const picked = await pickOne(
|
|
9657
|
+
const picked = await pickOne(ask, "Select organisation:", allOrgs, (o) => `${o.name} (${o.id})`);
|
|
9617
9658
|
orgId = picked.id;
|
|
9618
9659
|
orgName = picked.name;
|
|
9619
9660
|
callerIsOrgAdmin = picked.admins?.includes(user.uid) ?? false;
|
|
@@ -9627,7 +9668,7 @@ async function createProjectHandler(options) {
|
|
|
9627
9668
|
console.error("You are not an admin of any organisation. Cannot create a project.");
|
|
9628
9669
|
process.exit(1);
|
|
9629
9670
|
}
|
|
9630
|
-
const picked = await pickOne(
|
|
9671
|
+
const picked = await pickOne(ask, "Select organisation:", adminOrgs, (o) => `${o.name} (${o.id})`);
|
|
9631
9672
|
orgId = picked.id;
|
|
9632
9673
|
orgName = picked.name;
|
|
9633
9674
|
callerIsOrgAdmin = true;
|
|
@@ -9635,13 +9676,18 @@ async function createProjectHandler(options) {
|
|
|
9635
9676
|
}
|
|
9636
9677
|
console.log(`
|
|
9637
9678
|
Organisation: ${orgName} (${orgId})`);
|
|
9638
|
-
const projectName = await ask(
|
|
9679
|
+
const projectName = await ask("\nProject name: ");
|
|
9639
9680
|
if (!projectName) {
|
|
9640
9681
|
console.error("Project name is required.");
|
|
9641
9682
|
process.exit(1);
|
|
9642
9683
|
}
|
|
9684
|
+
const tierNames = await cue.api.sync.getTierNames().catch(() => ({}));
|
|
9685
|
+
const tierLabel = (key2, fallback, isDefault = false) => {
|
|
9686
|
+
const name = tierNames[key2] ?? fallback;
|
|
9687
|
+
return isDefault ? `${name} (default)` : name;
|
|
9688
|
+
};
|
|
9643
9689
|
const graphType = await pickOne(
|
|
9644
|
-
|
|
9690
|
+
ask,
|
|
9645
9691
|
"Select graph backend (default: QLever):",
|
|
9646
9692
|
[
|
|
9647
9693
|
{ value: "qlever", label: "QLever (recommended)" },
|
|
@@ -9650,12 +9696,12 @@ Organisation: ${orgName} (${orgId})`);
|
|
|
9650
9696
|
(item) => item.label
|
|
9651
9697
|
).then((item) => item.value);
|
|
9652
9698
|
const tier = await pickOne(
|
|
9653
|
-
|
|
9654
|
-
"Select processing tier
|
|
9699
|
+
ask,
|
|
9700
|
+
"Select processing tier:",
|
|
9655
9701
|
[
|
|
9656
|
-
{ value: "l", label: "
|
|
9657
|
-
{ value: "m", label: "
|
|
9658
|
-
{ value: "s", label: "
|
|
9702
|
+
{ value: "l", label: tierLabel("l", "Large", true) },
|
|
9703
|
+
{ value: "m", label: tierLabel("m", "Medium") },
|
|
9704
|
+
{ value: "s", label: tierLabel("s", "Small") }
|
|
9659
9705
|
],
|
|
9660
9706
|
(item) => item.label
|
|
9661
9707
|
).then((item) => item.value);
|
|
@@ -9670,7 +9716,7 @@ Organisation: ${orgName} (${orgId})`);
|
|
|
9670
9716
|
}
|
|
9671
9717
|
while (selectedAdmins.length === 0) {
|
|
9672
9718
|
selectedAdmins = await pickMultipleOrAll(
|
|
9673
|
-
|
|
9719
|
+
ask,
|
|
9674
9720
|
"Select project admin(s) \u2014 at least one required:",
|
|
9675
9721
|
orgAdmins,
|
|
9676
9722
|
(m) => `${m.name} <${m.email}>`
|
|
@@ -9682,20 +9728,20 @@ Organisation: ${orgName} (${orgId})`);
|
|
|
9682
9728
|
const nonAdminMembers = orgMembers.filter((m) => !selectedAdmins.some((a5) => a5.uid === m.uid));
|
|
9683
9729
|
if (nonAdminMembers.length > 0) {
|
|
9684
9730
|
selectedMembers = await pickMultipleOrAll(
|
|
9685
|
-
|
|
9731
|
+
ask,
|
|
9686
9732
|
"Select project members:",
|
|
9687
9733
|
nonAdminMembers,
|
|
9688
9734
|
(m) => `${m.name} <${m.email}>${m.isAdmin ? " (org admin)" : ""}`
|
|
9689
9735
|
);
|
|
9690
9736
|
}
|
|
9691
9737
|
if (selectedMembers.length > 0) {
|
|
9692
|
-
const answer = await ask(
|
|
9738
|
+
const answer = await ask(`
|
|
9693
9739
|
Set all selected members as syncers as well? (Y/n): `);
|
|
9694
9740
|
if (answer.toLowerCase() !== "n") {
|
|
9695
9741
|
selectedSyncers = selectedMembers;
|
|
9696
9742
|
} else {
|
|
9697
9743
|
selectedSyncers = await pickMultipleOrAll(
|
|
9698
|
-
|
|
9744
|
+
ask,
|
|
9699
9745
|
"Select project syncers:",
|
|
9700
9746
|
selectedMembers,
|
|
9701
9747
|
(m) => `${m.name} <${m.email}>`
|
|
@@ -9715,7 +9761,7 @@ Set all selected members as syncers as well? (Y/n): `);
|
|
|
9715
9761
|
console.log(` Members : ${selectedMembers.length === 0 ? "(none)" : selectedMembers.map((m) => m.email).join(", ")}`);
|
|
9716
9762
|
console.log(` Syncers : ${selectedSyncers.length === 0 ? "(none)" : selectedSyncers.map((m) => m.email).join(", ")}`);
|
|
9717
9763
|
console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
|
|
9718
|
-
const confirm = await ask(
|
|
9764
|
+
const confirm = await ask("\nCreate project? (Y/n): ");
|
|
9719
9765
|
if (confirm.toLowerCase() === "n") {
|
|
9720
9766
|
console.log("Aborted.");
|
|
9721
9767
|
process.exit(0);
|
|
@@ -9759,6 +9805,12 @@ Set all selected members as syncers as well? (Y/n): `);
|
|
|
9759
9805
|
Project created \u2705`);
|
|
9760
9806
|
console.log(` ID : ${created["id"]}`);
|
|
9761
9807
|
console.log(` Name : ${created["name"]}`);
|
|
9808
|
+
} catch (err) {
|
|
9809
|
+
if (err instanceof Error && err.message === "INPUT_CLOSED") {
|
|
9810
|
+
console.error("Aborted: input stream closed before all prompts were answered.");
|
|
9811
|
+
process.exit(1);
|
|
9812
|
+
}
|
|
9813
|
+
throw err;
|
|
9762
9814
|
} finally {
|
|
9763
9815
|
rl.close();
|
|
9764
9816
|
}
|