progmaskinen 1.0.0-beta.1 → 1.0.0

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/lib/installer.mjs +46 -5
  2. package/package.json +1 -1
package/lib/installer.mjs CHANGED
@@ -84,14 +84,37 @@ const HJAELP = `Progmaskinen: henter og installerer Progmaskinen.
84
84
  npx progmaskinen --prerelease tag også forhåndsudgivelser (kun til test)
85
85
  `;
86
86
 
87
- function spoerg(stdin, stdout, tekst) {
87
+ /**
88
+ * Smider alt, der allerede ligger i stdin (fx et linjeskift fra npx' "Ok to proceed? (y)"), før et spørgsmål stilles,
89
+ * så spørgsmålet altid venter på en linje, brugeren skriver efter at have set det.
90
+ */
91
+ function tomStdin(stdin, ms = 200) {
92
+ return new Promise((ok) => {
93
+ const kast = () => {};
94
+ stdin.on('data', kast);
95
+ stdin.resume();
96
+ setTimeout(() => {
97
+ stdin.off('data', kast);
98
+ stdin.pause();
99
+ ok();
100
+ }, ms);
101
+ });
102
+ }
103
+
104
+ async function spoerg(stdin, stdout, tekst) {
105
+ if (stdin.isTTY) await tomStdin(stdin);
88
106
  return new Promise((ok) => {
89
107
  const rl = createInterface({ input: stdin, output: stdout });
108
+ let svaret = false;
109
+ // Løftet løses først med svaret; rl.close() udløser 'close', som ellers ville løse det med '' først.
90
110
  rl.question(tekst, (svar) => {
91
- rl.close();
111
+ svaret = true;
92
112
  ok(svar.trim());
113
+ rl.close();
114
+ });
115
+ rl.on('close', () => {
116
+ if (!svaret) ok(''); // stdin blev lukket (EOF) uden et svar
93
117
  });
94
- rl.on('close', () => ok(''));
95
118
  });
96
119
  }
97
120
 
@@ -207,8 +230,26 @@ export async function koer({ argv = [], env = process.env, stdin = process.stdin
207
230
  let mappe;
208
231
  if (valg.mappe) mappe = udvidSti(valg.mappe, env);
209
232
  else if (stdin.isTTY && stdout.isTTY) {
210
- const svar = await spoerg(stdin, stdout, `Progmaskinen lægges i ${forslag}\nTryk Enter for at bruge den, eller skriv en anden mappe: `);
211
- mappe = svar ? udvidSti(svar, env) : forslag;
233
+ let tekst = `Progmaskinen lægges i ${forslag}\nTryk Enter for at bruge den, eller skriv en anden mappe: `;
234
+ for (;;) {
235
+ const svar = await spoerg(stdin, stdout, tekst);
236
+ if (!svar) {
237
+ mappe = forslag;
238
+ break;
239
+ }
240
+ const valgt = udvidSti(svar, env);
241
+ skriv(`Du har valgt: ${valgt}`);
242
+ if (valgt === forslag) {
243
+ mappe = valgt;
244
+ break;
245
+ }
246
+ const ok = (await spoerg(stdin, stdout, 'Er det rigtigt? (j/n) ')).toLowerCase();
247
+ if (ok === 'j' || ok === 'ja') {
248
+ mappe = valgt;
249
+ break;
250
+ }
251
+ tekst = 'Skriv den mappe, du vil bruge (eller tryk Enter for at bruge forslaget): ';
252
+ }
212
253
  } else {
213
254
  mappe = forslag;
214
255
  skriv(`Progmaskinen lægges i ${mappe}.`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "progmaskinen",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0",
4
4
  "description": "Henter og installerer Progmaskinen, træning til programmeringseksamen på HA(it.) 1. semester.",
5
5
  "type": "module",
6
6
  "bin": {