import { RuleTester } from '@typescript-eslint/rule-tester'; import { PackageNameConventionRule } from './package-name-convention.js'; const ruleTester = new RuleTester(); ruleTester.run('package-name-convention', PackageNameConventionRule, { valid: [ { name: 'valid unscoped package name', filename: 'package.json', code: '{ "name": "n8n-nodes-example", "version": "1.0.0" }', }, { name: 'valid unscoped package name with dashes', filename: 'package.json', code: '{ "name": "n8n-nodes-my-service", "version": "1.0.0" }', }, { name: 'valid scoped package name', filename: 'package.json', code: '{ "name": "@mycompany/n8n-nodes-example", "version": "1.0.0" }', }, { name: 'valid scoped package name with dashes', filename: 'package.json', code: '{ "name": "@author/n8n-nodes-service", "version": "1.0.0" }', }, { name: 'non-package.json file ignored', filename: 'some-config.json', code: '{ "name": "my-config", "type": "config" }', }, { name: 'nested name fields should be ignored - only top-level name matters', filename: 'package.json', code: `{ "name": "n8n-nodes-example", "version": "1.0.0", "dependencies": { "name": "invalid-nested-name" }, "scripts": { "name": "another-invalid-name" }, "author": { "name": "John Doe" } }`, }, { name: 'deeply nested name fields should be ignored', filename: 'package.json', code: `{ "name": "@author/n8n-nodes-service", "version": "1.0.0", "config": { "nested": { "deeply": { "name": "very-invalid-name" } } }, "repository": { "type": "git", "url": "https://github.com/user/repo", "directory": { "name": "bad-name" } } }`, }, ], invalid: [ { name: 'invalid package name - generic', filename: 'package.json', code: '{ "name": "my-package", "version": "1.0.0" }', errors: [ { messageId: 'invalidPackageName', data: { packageName: 'my-package' }, suggestions: [ { messageId: 'renameTo', data: { suggestedName: 'n8n-nodes-my-package' }, output: '{ "name": "n8n-nodes-my-package", "version": "1.0.0" }', }, ], }, ], }, { name: 'invalid package name - missing nodes', filename: 'package.json', code: '{ "name": "n8n-example", "version": "1.0.0" }', errors: [ { messageId: 'invalidPackageName', data: { packageName: 'n8n-example' }, suggestions: [ { messageId: 'renameTo', data: { suggestedName: 'n8n-nodes-example' }, output: '{ "name": "n8n-nodes-example", "version": "1.0.0" }', }, ], }, ], }, { name: 'invalid scoped package name', filename: 'package.json', code: '{ "name": "@company/example-nodes", "version": "1.0.0" }', errors: [ { messageId: 'invalidPackageName', data: { packageName: '@company/example-nodes' }, suggestions: [ { messageId: 'renameTo', data: { suggestedName: '@company/n8n-nodes-example' }, output: '{ "name": "@company/n8n-nodes-example", "version": "1.0.0" }', }, ], }, ], }, { name: 'invalid package name - wrong order', filename: 'package.json', code: '{ "name": "nodes-n8n-example", "version": "1.0.0" }', errors: [ { messageId: 'invalidPackageName', data: { packageName: 'nodes-n8n-example' }, suggestions: [ { messageId: 'renameTo', data: { suggestedName: 'n8n-nodes-example' }, output: '{ "name": "n8n-nodes-example", "version": "1.0.0" }', }, ], }, ], }, { name: 'empty package name', filename: 'package.json', code: '{ "name": "", "version": "1.0.0" }', errors: [ { messageId: 'invalidPackageName', data: { packageName: '' }, suggestions: [], }, ], }, { name: 'incomplete package name with missing suffix', filename: 'package.json', code: '{ "name": "n8n-nodes-", "version": "1.0.0" }', errors: [ { messageId: 'invalidPackageName', data: { packageName: 'n8n-nodes-' }, suggestions: [], }, ], }, { name: 'incomplete scoped package name with missing suffix', filename: 'package.json', code: '{ "name": "@company/n8n-nodes-", "version": "1.0.0" }', errors: [ { messageId: 'invalidPackageName', data: { packageName: '@company/n8n-nodes-' }, suggestions: [], }, ], }, { name: 'missing name property', filename: 'package.json', code: '{ "version": "1.0.0", "description": "test" }', errors: [ { messageId: 'missingName', }, ], }, { name: 'default placeholder name', filename: 'package.json', code: '{ "name": "n8n-nodes-<...>", "version": "1.0.0" }', errors: [ { messageId: 'defaultPlaceholderName', data: { packageName: 'n8n-nodes-<...>' }, }, ], }, { name: 'name containing default placeholder', filename: 'package.json', code: '{ "name": "@company/n8n-nodes-<...>", "version": "1.0.0" }', errors: [ { messageId: 'defaultPlaceholderName', data: { packageName: '@company/n8n-nodes-<...>' }, }, ], }, ], });