mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2025-12-19 17:58:48 +00:00
135 lines
3.4 KiB
JavaScript
135 lines
3.4 KiB
JavaScript
// Copyright 2025 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
const rule = require('./file-suffix.js');
|
|
const RuleTester = require('eslint').RuleTester;
|
|
|
|
// avoid triggering mocha's global leak detection
|
|
require('@typescript-eslint/parser');
|
|
|
|
const ruleTester = new RuleTester({
|
|
parser: require.resolve('@typescript-eslint/parser'),
|
|
parserOptions: {
|
|
ecmaVersion: 2018,
|
|
sourceType: 'module',
|
|
},
|
|
});
|
|
|
|
ruleTester.run('file-suffix', rule, {
|
|
valid: [
|
|
// Allowed references
|
|
...[
|
|
['std', '', ['std']],
|
|
['dom', 'window.addEventListener();', ['std', 'dom']],
|
|
['node', 'require("node:fs");', ['std', 'node']],
|
|
[
|
|
'preload',
|
|
'import { ipcRenderer } from "electron";',
|
|
['std', 'node', 'preload'],
|
|
],
|
|
[
|
|
'main',
|
|
'import { autoUpdater } from "electron";',
|
|
['std', 'node', 'main'],
|
|
],
|
|
]
|
|
.map(([fileSuffix, requiredLine, depSuffixes]) => {
|
|
return depSuffixes.map(depSuffix => {
|
|
return {
|
|
name: `importing ${depSuffix} from ${fileSuffix}`,
|
|
filename: `a.${fileSuffix}.ts`,
|
|
code: `
|
|
import { x } from './b.${depSuffix}.js';
|
|
${requiredLine}
|
|
`,
|
|
globals: {
|
|
window: 'writable',
|
|
require: 'readable',
|
|
},
|
|
};
|
|
});
|
|
})
|
|
.flat(),
|
|
|
|
{
|
|
name: 'type import should have no effect',
|
|
filename: 'a.std.ts',
|
|
code: `import type { ReadonlyDeep } from './b.dom.js'`,
|
|
},
|
|
],
|
|
invalid: [
|
|
// Disallowed references
|
|
...[
|
|
['std', ['dom', 'node', 'preload', 'main']],
|
|
['dom', ['node', 'preload', 'main']],
|
|
['node', ['preload', 'main']],
|
|
['preload', ['main']],
|
|
['main', ['dom', 'preload']],
|
|
]
|
|
.map(([fileSuffix, depSuffixes]) => {
|
|
return depSuffixes.map(depSuffix => {
|
|
return {
|
|
name: `importing ${depSuffix} from ${fileSuffix}`,
|
|
filename: `a.${fileSuffix}.ts`,
|
|
code: `import { x } from './b.${depSuffix}.js'`,
|
|
errors: [
|
|
{
|
|
message: `Invalid suffix ${fileSuffix}, expected: ${depSuffix}`,
|
|
type: 'Program',
|
|
},
|
|
],
|
|
};
|
|
});
|
|
})
|
|
.flat(),
|
|
|
|
...['dom', 'node', 'preload', 'main'].map(suffix => {
|
|
return {
|
|
name: `no ${suffix} imports`,
|
|
filename: `a.${suffix}.ts`,
|
|
code: '',
|
|
errors: [
|
|
{
|
|
message: `Invalid suffix ${suffix}, expected: std`,
|
|
type: 'Program',
|
|
},
|
|
],
|
|
};
|
|
}),
|
|
|
|
// Invalid imports
|
|
{
|
|
name: 'preload in main',
|
|
filename: 'a.main.ts',
|
|
code: `
|
|
import { autoUpdater } from 'electron';
|
|
import './b.preload.js';
|
|
`,
|
|
errors: [
|
|
{
|
|
message: 'Invalid import/reference for suffix: main',
|
|
type: 'ImportDeclaration',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'main in preload',
|
|
filename: 'a.preload.ts',
|
|
code: `
|
|
import { ipcRenderer } from 'electron';
|
|
import './b.main.js';
|
|
`,
|
|
errors: [
|
|
{
|
|
message: 'Invalid suffix preload, expected: main',
|
|
type: 'Program',
|
|
},
|
|
{
|
|
message: 'Invalid import/reference for suffix: main',
|
|
type: 'ImportSpecifier',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
});
|