@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.
Files changed (2) hide show
  1. package/main.js +76 -24
  2. 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 ask(rl, question) {
9550
- return new Promise((resolve2) => rl.question(question, (answer) => resolve2(answer.trim())));
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(rl, label, items, display) {
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
- while (true) {
9557
- const answer = await ask(rl, `Enter number (1-${items.length}): `);
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
- return items[idx];
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(rl, label, items, display) {
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(rl, `Enter comma-separated numbers or 0 for all: `);
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, output: process.stdout });
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(rl, "Select organisation:", allOrgs, (o) => `${o.name} (${o.id})`);
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(rl, "Select organisation:", adminOrgs, (o) => `${o.name} (${o.id})`);
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(rl, "\nProject name: ");
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
- rl,
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
- rl,
9654
- "Select processing tier (default: L \u2014 Large):",
9699
+ ask,
9700
+ "Select processing tier:",
9655
9701
  [
9656
- { value: "l", label: "L \u2014 Large (default)" },
9657
- { value: "m", label: "M \u2014 Medium" },
9658
- { value: "s", label: "S \u2014 Small" }
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
- rl,
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
- rl,
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(rl, `
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
- rl,
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(rl, "\nCreate project? (Y/n): ");
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qaecy/cue-cli",
3
- "version": "0.0.41",
3
+ "version": "0.0.43",
4
4
  "description": "Cue CLI for QAECY platform",
5
5
  "main": "main.js",
6
6
  "bin": {