@qaecy/cue-cli 0.0.42 → 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 +68 -32
- 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,39 +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
|
-
|
|
9551
|
-
|
|
9552
|
-
|
|
9553
|
-
|
|
9554
|
-
|
|
9555
|
-
|
|
9556
|
-
|
|
9557
|
-
|
|
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());
|
|
9558
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"));
|
|
9559
9571
|
}
|
|
9560
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
|
+
};
|
|
9561
9587
|
}
|
|
9562
|
-
async function pickOne(
|
|
9588
|
+
async function pickOne(ask, label, items, display) {
|
|
9563
9589
|
console.log(`
|
|
9564
9590
|
${label}`);
|
|
9565
9591
|
items.forEach((item, i) => console.log(` ${i + 1}. ${display(item)}`));
|
|
9566
|
-
|
|
9567
|
-
|
|
9592
|
+
let selected = [];
|
|
9593
|
+
while (selected.length === 0 || items.length === 1) {
|
|
9594
|
+
const answer = await ask(`Enter number (1-${items.length}): `);
|
|
9568
9595
|
const idx = parseInt(answer, 10) - 1;
|
|
9569
|
-
if (idx >= 0 && idx < items.length)
|
|
9570
|
-
|
|
9596
|
+
if (idx >= 0 && idx < items.length) {
|
|
9597
|
+
selected = [items[idx]];
|
|
9598
|
+
break;
|
|
9599
|
+
}
|
|
9571
9600
|
console.log(" Invalid selection, try again.");
|
|
9572
9601
|
}
|
|
9602
|
+
return selected[0];
|
|
9573
9603
|
}
|
|
9574
|
-
async function pickMultipleOrAll(
|
|
9604
|
+
async function pickMultipleOrAll(ask, label, items, display) {
|
|
9575
9605
|
if (items.length === 0)
|
|
9576
9606
|
return [];
|
|
9577
9607
|
console.log(`
|
|
9578
9608
|
${label}`);
|
|
9579
9609
|
items.forEach((item, i) => console.log(` ${i + 1}. ${display(item)}`));
|
|
9580
9610
|
console.log(` 0. All`);
|
|
9581
|
-
const answer = await ask(
|
|
9611
|
+
const answer = await ask(`Enter comma-separated numbers or 0 for all: `);
|
|
9582
9612
|
if (answer === "0")
|
|
9583
9613
|
return items;
|
|
9584
9614
|
const indices = answer.split(",").map((s) => parseInt(s.trim(), 10) - 1).filter((i) => i >= 0 && i < items.length);
|
|
@@ -9586,7 +9616,8 @@ ${label}`);
|
|
|
9586
9616
|
}
|
|
9587
9617
|
async function createProjectHandler(options) {
|
|
9588
9618
|
const { emulators, verbose } = options;
|
|
9589
|
-
const rl = readline2.createInterface({ input: process.stdin,
|
|
9619
|
+
const rl = readline2.createInterface({ input: process.stdin, terminal: process.stdout.isTTY });
|
|
9620
|
+
const ask = createAsker(rl);
|
|
9590
9621
|
try {
|
|
9591
9622
|
const key = options.key ?? process.env.CUE_API_KEY;
|
|
9592
9623
|
if (!key) {
|
|
@@ -9623,7 +9654,7 @@ async function createProjectHandler(options) {
|
|
|
9623
9654
|
console.error("No organisations found on the platform.");
|
|
9624
9655
|
process.exit(1);
|
|
9625
9656
|
}
|
|
9626
|
-
const picked = await pickOne(
|
|
9657
|
+
const picked = await pickOne(ask, "Select organisation:", allOrgs, (o) => `${o.name} (${o.id})`);
|
|
9627
9658
|
orgId = picked.id;
|
|
9628
9659
|
orgName = picked.name;
|
|
9629
9660
|
callerIsOrgAdmin = picked.admins?.includes(user.uid) ?? false;
|
|
@@ -9637,7 +9668,7 @@ async function createProjectHandler(options) {
|
|
|
9637
9668
|
console.error("You are not an admin of any organisation. Cannot create a project.");
|
|
9638
9669
|
process.exit(1);
|
|
9639
9670
|
}
|
|
9640
|
-
const picked = await pickOne(
|
|
9671
|
+
const picked = await pickOne(ask, "Select organisation:", adminOrgs, (o) => `${o.name} (${o.id})`);
|
|
9641
9672
|
orgId = picked.id;
|
|
9642
9673
|
orgName = picked.name;
|
|
9643
9674
|
callerIsOrgAdmin = true;
|
|
@@ -9645,13 +9676,18 @@ async function createProjectHandler(options) {
|
|
|
9645
9676
|
}
|
|
9646
9677
|
console.log(`
|
|
9647
9678
|
Organisation: ${orgName} (${orgId})`);
|
|
9648
|
-
const projectName = await ask(
|
|
9679
|
+
const projectName = await ask("\nProject name: ");
|
|
9649
9680
|
if (!projectName) {
|
|
9650
9681
|
console.error("Project name is required.");
|
|
9651
9682
|
process.exit(1);
|
|
9652
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
|
+
};
|
|
9653
9689
|
const graphType = await pickOne(
|
|
9654
|
-
|
|
9690
|
+
ask,
|
|
9655
9691
|
"Select graph backend (default: QLever):",
|
|
9656
9692
|
[
|
|
9657
9693
|
{ value: "qlever", label: "QLever (recommended)" },
|
|
@@ -9660,12 +9696,12 @@ Organisation: ${orgName} (${orgId})`);
|
|
|
9660
9696
|
(item) => item.label
|
|
9661
9697
|
).then((item) => item.value);
|
|
9662
9698
|
const tier = await pickOne(
|
|
9663
|
-
|
|
9664
|
-
"Select processing tier
|
|
9699
|
+
ask,
|
|
9700
|
+
"Select processing tier:",
|
|
9665
9701
|
[
|
|
9666
|
-
{ value: "l", label: "
|
|
9667
|
-
{ value: "m", label: "
|
|
9668
|
-
{ 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") }
|
|
9669
9705
|
],
|
|
9670
9706
|
(item) => item.label
|
|
9671
9707
|
).then((item) => item.value);
|
|
@@ -9680,7 +9716,7 @@ Organisation: ${orgName} (${orgId})`);
|
|
|
9680
9716
|
}
|
|
9681
9717
|
while (selectedAdmins.length === 0) {
|
|
9682
9718
|
selectedAdmins = await pickMultipleOrAll(
|
|
9683
|
-
|
|
9719
|
+
ask,
|
|
9684
9720
|
"Select project admin(s) \u2014 at least one required:",
|
|
9685
9721
|
orgAdmins,
|
|
9686
9722
|
(m) => `${m.name} <${m.email}>`
|
|
@@ -9692,20 +9728,20 @@ Organisation: ${orgName} (${orgId})`);
|
|
|
9692
9728
|
const nonAdminMembers = orgMembers.filter((m) => !selectedAdmins.some((a5) => a5.uid === m.uid));
|
|
9693
9729
|
if (nonAdminMembers.length > 0) {
|
|
9694
9730
|
selectedMembers = await pickMultipleOrAll(
|
|
9695
|
-
|
|
9731
|
+
ask,
|
|
9696
9732
|
"Select project members:",
|
|
9697
9733
|
nonAdminMembers,
|
|
9698
9734
|
(m) => `${m.name} <${m.email}>${m.isAdmin ? " (org admin)" : ""}`
|
|
9699
9735
|
);
|
|
9700
9736
|
}
|
|
9701
9737
|
if (selectedMembers.length > 0) {
|
|
9702
|
-
const answer = await ask(
|
|
9738
|
+
const answer = await ask(`
|
|
9703
9739
|
Set all selected members as syncers as well? (Y/n): `);
|
|
9704
9740
|
if (answer.toLowerCase() !== "n") {
|
|
9705
9741
|
selectedSyncers = selectedMembers;
|
|
9706
9742
|
} else {
|
|
9707
9743
|
selectedSyncers = await pickMultipleOrAll(
|
|
9708
|
-
|
|
9744
|
+
ask,
|
|
9709
9745
|
"Select project syncers:",
|
|
9710
9746
|
selectedMembers,
|
|
9711
9747
|
(m) => `${m.name} <${m.email}>`
|
|
@@ -9725,7 +9761,7 @@ Set all selected members as syncers as well? (Y/n): `);
|
|
|
9725
9761
|
console.log(` Members : ${selectedMembers.length === 0 ? "(none)" : selectedMembers.map((m) => m.email).join(", ")}`);
|
|
9726
9762
|
console.log(` Syncers : ${selectedSyncers.length === 0 ? "(none)" : selectedSyncers.map((m) => m.email).join(", ")}`);
|
|
9727
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");
|
|
9728
|
-
const confirm = await ask(
|
|
9764
|
+
const confirm = await ask("\nCreate project? (Y/n): ");
|
|
9729
9765
|
if (confirm.toLowerCase() === "n") {
|
|
9730
9766
|
console.log("Aborted.");
|
|
9731
9767
|
process.exit(0);
|
|
@@ -9770,7 +9806,7 @@ Project created \u2705`);
|
|
|
9770
9806
|
console.log(` ID : ${created["id"]}`);
|
|
9771
9807
|
console.log(` Name : ${created["name"]}`);
|
|
9772
9808
|
} catch (err) {
|
|
9773
|
-
if (err.message === "INPUT_CLOSED") {
|
|
9809
|
+
if (err instanceof Error && err.message === "INPUT_CLOSED") {
|
|
9774
9810
|
console.error("Aborted: input stream closed before all prompts were answered.");
|
|
9775
9811
|
process.exit(1);
|
|
9776
9812
|
}
|