import { createRule } from '../utils/index.js'; import { getSvelteVersion } from '../utils/svelte-context.js'; const EXPECTED_PROP_NAMES = ['data', 'errors', 'form', 'params', 'snapshot']; const EXPECTED_PROP_NAMES_SVELTE5 = [...EXPECTED_PROP_NAMES, 'children']; function checkProp(node, context, expectedPropNames) { if (node.id.type !== 'ObjectPattern') return; for (const p of node.id.properties) { if (p.type === 'Property' && p.key.type === 'Identifier' && !expectedPropNames.includes(p.key.name)) { context.report({ node: p.key, loc: p.key.loc, messageId: 'unexpected' }); } } } function isModuleScript(node) { // 'Program > SvelteScriptElement:exit': () => { isScript = false; }, // Svelte3,4 'ExportNamedDeclaration > VariableDeclaration > VariableDeclarator': (node) => { if (!isScript) return; // export let foo if (node.id.type === 'Identifier') { if (!expectedPropNames.includes(node.id.name)) { context.report({ node, loc: node.loc, messageId: 'unexpected' }); } return; } // export let { xxx, yyy } = zzz checkProp(node, context, expectedPropNames); }, // Svelte5 // let { foo, bar } = $props(); 'VariableDeclaration > VariableDeclarator': (node) => { if (!isScript) return; if (node.init?.type !== 'CallExpression' || node.init.callee?.type !== 'Identifier' || node.init.callee?.name !== '$props') { return; } checkProp(node, context, expectedPropNames); } }; } });