@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.
Files changed (2) hide show
  1. package/main.js +68 -32
  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,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 ask(rl, question) {
9550
- return new Promise((resolve2, reject) => {
9551
- try {
9552
- rl.question(question, (answer) => resolve2(answer.trim()));
9553
- } catch (err) {
9554
- if (err.code === "ERR_USE_AFTER_CLOSE") {
9555
- reject(new Error("INPUT_CLOSED"));
9556
- } else {
9557
- reject(err);
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(rl, label, items, display) {
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
- while (true) {
9567
- 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}): `);
9568
9595
  const idx = parseInt(answer, 10) - 1;
9569
- if (idx >= 0 && idx < items.length)
9570
- return items[idx];
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(rl, label, items, display) {
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(rl, `Enter comma-separated numbers or 0 for all: `);
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, output: process.stdout });
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(rl, "Select organisation:", allOrgs, (o) => `${o.name} (${o.id})`);
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(rl, "Select organisation:", adminOrgs, (o) => `${o.name} (${o.id})`);
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(rl, "\nProject name: ");
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
- rl,
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
- rl,
9664
- "Select processing tier (default: L \u2014 Large):",
9699
+ ask,
9700
+ "Select processing tier:",
9665
9701
  [
9666
- { value: "l", label: "L \u2014 Large (default)" },
9667
- { value: "m", label: "M \u2014 Medium" },
9668
- { 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") }
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
- rl,
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
- rl,
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(rl, `
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
- rl,
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(rl, "\nCreate project? (Y/n): ");
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qaecy/cue-cli",
3
- "version": "0.0.42",
3
+ "version": "0.0.43",
4
4
  "description": "Cue CLI for QAECY platform",
5
5
  "main": "main.js",
6
6
  "bin": {