Bladeren bron

Friendly node version errors

KernelDeimos 1 jaar geleden
bovenliggende
commit
4a2fa5a29f
1 gewijzigde bestanden met toevoegingen van 68 en 16 verwijderingen
  1. 68 16
      run-selfhosted.js

+ 68 - 16
run-selfhosted.js

@@ -1,18 +1,70 @@
-import backend from '@heyputer/backend';
+// node version check
+{
+    // JUST AN AESTHETIC THING
+    // It's really hard to see the error message without using
+    // the surrounding_box function to highlight its location.
+    // The implementation of this in packages/backend might not
+    // work in older versions of node, so we instead re-implement
+    // it here.
+    const surrounding_box = (col, lines) => {
+        const lengths = lines.map(line => line.length);
 
-const {
-    Kernel,
-    CoreModule,
-    DatabaseModule,
-    PuterDriversModule,
-    LocalDiskStorageModule,
-    SelfhostedModule,
-} = backend;
+        const max_length = Math.max(...lengths);
+        const c = str => `\x1b[${col}m${str}\x1b[0m`;
+        const bar = c(Array(max_length + 4).fill('━').join(''));
+        for ( let i = 0 ; i < lines.length ; i++ ) {
+            while ( lines[i].length < max_length ) {
+                lines[i] += ' ';
+            }
+            lines[i] = `${c('┃ ')} ${lines[i]} ${c(' ┃')}`;
+        }
+        lines.unshift(`${c('┏')}${bar}${c('┓')}`);
+        lines.push(`${c('┗')}${bar}${c('┛')}`);
+    };
+
+    // Keeping track of WHY certain versions don't work
+    const ver_info = [
+        { under: 14, reasons: ['optional chaining is not available'] },
+        { under: 16, reasons: ['diskusage package ABI mismatch'] },
+    ];
+
+    const lowest_allowed = Math.max(...ver_info.map(r => r.under));
+
+    // ACTUAL VERSION CHECK
+    const [major, minor] = process.versions.node.split('.').map(Number);
+    if ( major < lowest_allowed ) {
+        const lines = [];
+        lines.push(`Please use a version of Node.js ${lowest_allowed} or newer.`);
+        lines.push(`Issues with node ${process.versions.node}:`);
+        // We also show the user the reasons in case they want to know
+        for ( const { under, reasons } of ver_info ) {
+            if ( major < under ) {
+                lines.push(`  - ${reasons.join(', ')}`);
+            }
+        }
+        surrounding_box('31;1', lines);
+        console.error(lines.join('\n'));
+        process.exit(1);
+    }
+}
+
+(async () => {
+    const {
+        Kernel,
+        CoreModule,
+        DatabaseModule,
+        PuterDriversModule,
+        LocalDiskStorageModule,
+        SelfhostedModule
+    } = (await import('@heyputer/backend')).default;
+
+    console.log('kerne', Kernel);
+    const k = new Kernel();
+    k.add_module(new CoreModule());
+    k.add_module(new DatabaseModule());
+    k.add_module(new PuterDriversModule());
+    k.add_module(new LocalDiskStorageModule());
+    k.add_module(new SelfhostedModule()),
+    k.boot();
+})();
 
-const k = new Kernel();
-k.add_module(new CoreModule());
-k.add_module(new DatabaseModule());
-k.add_module(new PuterDriversModule());
-k.add_module(new LocalDiskStorageModule());
-k.add_module(new SelfhostedModule()),
-k.boot();