MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix !config for define

+2 -290
+1 -1
meson.build
··· 79 79 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 80 80 81 81 version_conf = configuration_data() 82 - version_conf.set('ANT_VERSION', '0.2.3.16') 82 + version_conf.set('ANT_VERSION', '0.2.3.17') 83 83 version_conf.set('ANT_GIT_HASH', git_hash) 84 84 version_conf.set('ANT_BUILD_DATE', build_date) 85 85
+1 -1
src/ant.c
··· 13391 13391 } 13392 13392 13393 13393 jsval_t prop_key = js_mkstr(js, prop_str, prop_len); 13394 - bool mark_const = !writable; 13394 + bool mark_const = !writable || !configurable; 13395 13395 mkprop(js, as_obj, prop_key, value, mark_const); 13396 13396 } 13397 13397 }
-178
tests/bench_radix3.js
··· 1 - import { Radix3 } from '../examples/server/radix3.js'; 2 - 3 - const router = new Radix3(); 4 - 5 - router.get('/', function () { 6 - return 'home'; 7 - }); 8 - router.get('/api', function () { 9 - return 'api'; 10 - }); 11 - router.get('/api/users', function () { 12 - return 'users'; 13 - }); 14 - router.get('/api/users/list', function () { 15 - return 'users list'; 16 - }); 17 - router.get('/api/posts', function () { 18 - return 'posts'; 19 - }); 20 - router.get('/api/posts/recent', function () { 21 - return 'recent posts'; 22 - }); 23 - router.get('/api/comments', function () { 24 - return 'comments'; 25 - }); 26 - router.get('/health', function () { 27 - return 'health'; 28 - }); 29 - router.get('/status', function () { 30 - return 'status'; 31 - }); 32 - router.get('/about', function () { 33 - return 'about'; 34 - }); 35 - router.get('/contact', function () { 36 - return 'contact'; 37 - }); 38 - router.get('/login', function () { 39 - return 'login'; 40 - }); 41 - router.get('/logout', function () { 42 - return 'logout'; 43 - }); 44 - router.get('/dashboard', function () { 45 - return 'dashboard'; 46 - }); 47 - router.get('/settings', function () { 48 - return 'settings'; 49 - }); 50 - 51 - // Parameterized routes 52 - router.get('/api/users/:id', function () { 53 - return 'user by id'; 54 - }); 55 - router.get('/api/users/:id/posts', function () { 56 - return 'user posts'; 57 - }); 58 - router.get('/api/users/:id/comments', function () { 59 - return 'user comments'; 60 - }); 61 - router.get('/api/posts/:id', function () { 62 - return 'post by id'; 63 - }); 64 - router.get('/api/posts/:id/comments', function () { 65 - return 'post comments'; 66 - }); 67 - router.get('/api/posts/:postId/comments/:commentId', function () { 68 - return 'specific comment'; 69 - }); 70 - router.get('/users/:userId/profile', function () { 71 - return 'user profile'; 72 - }); 73 - router.get('/products/:category/:id', function () { 74 - return 'product'; 75 - }); 76 - 77 - router.get('/static/*path', function () { 78 - return 'static file'; 79 - }); 80 - router.get('/assets/*file', function () { 81 - return 'asset file'; 82 - }); 83 - 84 - router.post('/api/users', function () { 85 - return 'create user'; 86 - }); 87 - router.put('/api/users/:id', function () { 88 - return 'update user'; 89 - }); 90 - router.delete('/api/users/:id', function () { 91 - return 'delete user'; 92 - }); 93 - router.patch('/api/users/:id', function () { 94 - return 'patch user'; 95 - }); 96 - 97 - console.log('Router tree:'); 98 - router.printTree(); 99 - console.log(''); 100 - 101 - const ITERATIONS = 100000; 102 - 103 - function bench(name, fn) { 104 - const start = performance.now(); 105 - for (let i = 0; i < ITERATIONS; i = i + 1) { 106 - fn(); 107 - } 108 - const end = performance.now(); 109 - 110 - const totalMs = end - start; 111 - const opsPerSec = Math.round(ITERATIONS / (totalMs / 1000)); 112 - const nsPerOp = Math.round((totalMs * 1000000) / ITERATIONS); 113 - 114 - console.log(name + ': ' + opsPerSec.toLocaleString() + ' ops/sec (' + nsPerOp + ' ns/op)'); 115 - } 116 - 117 - console.log('--- Static Route Lookup (' + ITERATIONS + ' iterations) ---'); 118 - bench('Lookup "/" (root)', function () { 119 - router.lookup('/'); 120 - }); 121 - bench('Lookup "/api" (short)', function () { 122 - router.lookup('/api'); 123 - }); 124 - bench('Lookup "/api/users" (medium)', function () { 125 - router.lookup('/api/users'); 126 - }); 127 - bench('Lookup "/api/posts/recent" (long)', function () { 128 - router.lookup('/api/posts/recent'); 129 - }); 130 - bench('Lookup "/dashboard" (single segment)', function () { 131 - router.lookup('/dashboard'); 132 - }); 133 - 134 - console.log('\n--- Parameterized Route Lookup (' + ITERATIONS + ' iterations) ---'); 135 - bench('Lookup "/api/users/123"', function () { 136 - router.lookup('/api/users/123'); 137 - }); 138 - bench('Lookup "/api/users/456/posts"', function () { 139 - router.lookup('/api/users/456/posts'); 140 - }); 141 - bench('Lookup "/api/posts/789/comments/42"', function () { 142 - router.lookup('/api/posts/789/comments/42'); 143 - }); 144 - bench('Lookup "/products/electronics/12345"', function () { 145 - router.lookup('/products/electronics/12345'); 146 - }); 147 - 148 - console.log('\n--- Wildcard Route Lookup (' + ITERATIONS + ' iterations) ---'); 149 - bench('Lookup "/static/css/style.css"', function () { 150 - router.lookup('/static/css/style.css'); 151 - }); 152 - bench('Lookup "/assets/images/logo.png"', function () { 153 - router.lookup('/assets/images/logo.png'); 154 - }); 155 - 156 - console.log('\n--- Different HTTP Methods (' + ITERATIONS + ' iterations) ---'); 157 - bench('GET /api/users/:id', function () { 158 - router.lookup('/api/users/123', 'GET'); 159 - }); 160 - bench('POST /api/users', function () { 161 - router.lookup('/api/users', 'POST'); 162 - }); 163 - bench('PUT /api/users/:id', function () { 164 - router.lookup('/api/users/123', 'PUT'); 165 - }); 166 - bench('DELETE /api/users/:id', function () { 167 - router.lookup('/api/users/123', 'DELETE'); 168 - }); 169 - 170 - console.log('\n--- Not Found Routes (' + ITERATIONS + ' iterations) ---'); 171 - bench('Lookup "/notfound"', function () { 172 - router.lookup('/notfound'); 173 - }); 174 - bench('Lookup "/api/unknown/path"', function () { 175 - router.lookup('/api/unknown/path'); 176 - }); 177 - 178 - console.log('\n=== Benchmark Complete ===');
-110
tests/test_strict_comprehensive.cjs
··· 1 - // Comprehensive Strict Mode Tests 2 - // Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode 3 - 4 - console.log("=== Strict Mode Comprehensive Tests ===\n"); 5 - 6 - // Test 1: Converting mistakes into errors 7 - console.log("Test 1: Assigning to undeclared variables"); 8 - try { 9 - "use strict"; 10 - eval("x = 3.14;"); 11 - console.log(" FAIL: Should throw ReferenceError"); 12 - } catch (e) { 13 - console.log(" PASS: " + e); 14 - } 15 - 16 - // Test 2: Octal literals 17 - console.log("\nTest 2: Legacy octal literals"); 18 - try { 19 - "use strict"; 20 - eval("let num = 0123;"); 21 - console.log(" FAIL: Should reject octal literals"); 22 - } catch (e) { 23 - console.log(" PASS: Octal literals rejected"); 24 - } 25 - 26 - // Test 3: Reserved words as identifiers 27 - console.log("\nTest 3: Future reserved words"); 28 - const reservedWords = ["implements", "interface", "package", "private", "protected", "public", "static"]; 29 - let passedReserved = 0; 30 - for (let i = 0; i < reservedWords.length; i++) { 31 - try { 32 - eval('"use strict"; let ' + reservedWords[i] + ' = 1;'); 33 - console.log(" FAIL: '" + reservedWords[i] + "' should be reserved"); 34 - } catch (e) { 35 - passedReserved++; 36 - } 37 - } 38 - console.log(" PASS: " + passedReserved + " of " + reservedWords.length + " reserved words blocked"); 39 - 40 - // Test 4: eval and arguments restrictions 41 - console.log("\nTest 4: eval and arguments restrictions"); 42 - try { 43 - "use strict"; 44 - eval("let eval = 5;"); 45 - console.log(" FAIL: Cannot assign to 'eval'"); 46 - } catch (e) { 47 - console.log(" PASS: Cannot use 'eval' as identifier"); 48 - } 49 - 50 - try { 51 - "use strict"; 52 - eval("let arguments = 10;"); 53 - console.log(" FAIL: Cannot assign to 'arguments'"); 54 - } catch (e) { 55 - console.log(" PASS: Cannot use 'arguments' as identifier"); 56 - } 57 - 58 - // Test 5: with statement 59 - console.log("\nTest 5: with statement"); 60 - try { 61 - "use strict"; 62 - eval("with ({}) {}"); 63 - console.log(" FAIL: with statement should be disallowed"); 64 - } catch (e) { 65 - console.log(" PASS: with statement blocked"); 66 - } 67 - 68 - // Test 6: Function parameter restrictions 69 - console.log("\nTest 6: Function parameter restrictions"); 70 - try { 71 - "use strict"; 72 - eval("function f(a, b, a) {}"); 73 - console.log(" FAIL: Duplicate parameters should be disallowed"); 74 - } catch (e) { 75 - console.log(" PASS: Duplicate parameters blocked"); 76 - } 77 - 78 - try { 79 - "use strict"; 80 - eval("function f(eval) {}"); 81 - console.log(" FAIL: 'eval' as parameter should be disallowed"); 82 - } catch (e) { 83 - console.log(" PASS: Cannot use 'eval' as parameter name"); 84 - } 85 - 86 - // Test 7: Strict mode in different contexts 87 - console.log("\nTest 7: Strict mode in different contexts"); 88 - 89 - // Script-level strict mode 90 - let scriptStrictWorks = false; 91 - try { 92 - eval('"use strict"; undeclared = 1;'); 93 - } catch (e) { 94 - scriptStrictWorks = true; 95 - } 96 - console.log(" " + (scriptStrictWorks ? "PASS" : "FAIL") + ": Script-level strict mode"); 97 - 98 - // Function-level strict mode 99 - function testFunctionStrict() { 100 - "use strict"; 101 - try { 102 - undeclared2 = 2; 103 - return false; 104 - } catch (e) { 105 - return true; 106 - } 107 - } 108 - console.log(" " + (testFunctionStrict() ? "PASS" : "FAIL") + ": Function-level strict mode"); 109 - 110 - console.log("\n=== All Tests Completed ===");