import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; const autocomplete = readFileSync('static/js/mention-autocomplete.js', 'utf8') .replace(/^import \{ t \} from "@rustpad\/i18n";$/m, 'const t = (key, params, fallback) => fallback;'); const autocompleteModule = await import('data:text/javascript;base64,' + Buffer.from(autocomplete).toString('base64')); const navigation = readFileSync('static/js/mention-navigation.js', 'utf8') .replace(/^import \{ t \} from "@rustpad\/i18n";$/m, 'const t = (key, params, fallback) => fallback;') .replace(/^import \{ normalizeMentionUsers \} from "@rustpad\/mention-autocomplete";$/m, `const normalizeMentionUsers = ${autocompleteModule.normalizeMentionUsers.toString()};`); const { collectMentionOccurrences } = await import('data:text/javascript;base64,' + Buffer.from(navigation).toString('base64')); const users = [ {nickname:'Dominik',color:'#1256aa',email:'private@example.org'}, {nickname:'dOMINIK',color:'#abc123'}, {nickname:'Dora',color:'#dd00dd'}, {nickname:'Ala+Dev',color:'#123abc'}, ]; function matches(source, options) { return collectMentionOccurrences(source, users, options); } function valid(source, options) { return matches(source, options).map(mention => source.slice(mention.start, mention.end)); } assert.deepEqual(valid('Tu @Dominik, @Dora oraz @dominik.'), ['@Dominik', '@Dora', '@dominik']); assert.deepEqual(valid('Przykład @DominiK @Ala+Dev, @Dominik'), ['@DominiK', '@Ala+Dev', '@Dominik']); assert.deepEqual(valid('john@Dominik.org a@Dora @@Dominik @Dominika @Other'), []); assert.deepEqual(valid('`@Dominik` i @Dora [@Dominik](https://example.org) oraz https://example.org/@Dora'), ['@Dora']); assert.deepEqual(valid('[file=secret@Dominik,key] i [image=image@Dora] oraz @Dominik'), ['@Dominik']); assert.deepEqual(valid('```sh\n@Dominik\n```\nPo @Dora\n~~~\n@Dora\n~~~\n@Dominik'), ['@Dora', '@Dominik']); assert.deepEqual(valid(' ```js\n@Dominik\n ```\n@Dominik'), ['@Dominik']); assert.deepEqual(valid('````rust\n@Dominik\n```\n@Dora\n````\n@Dora'), ['@Dora']); assert.deepEqual(valid('@Dora', { markdown:false }), ['@Dora']); assert.deepEqual(valid('```\n@Dominik\n```', { markdown:false }), ['@Dominik']); const source = '🙂 @Dominik\nDrugi @Dora i @Dominik'; const items = matches(source); assert.deepEqual(items.map(item=>item.start), [source.indexOf('@Dominik'),source.indexOf('@Dora'),source.lastIndexOf('@Dominik')]); assert.deepEqual(items.map(item=>item.sourceLine), [1,2,2]); assert.ok(items.every(item => !Object.hasOwn(item, 'email'))); assert.equal(collectMentionOccurrences('Hej @Dominik', []).length, 0); console.log('PASS: mention navigation positions, permissions, Markdown exclusions, UTF-16, code fences');