import { createRule } from '../utils/index.js'; import { createStoreChecker } from './reference-helpers/svelte-store.js'; export default createRule('require-store-reactive-access', { meta: { docs: { description: 'disallow to use of the store itself as an operand. Need to use $ prefix or get function.', category: 'Possible Errors', recommended: true }, fixable: 'code', schema: [], messages: { usingRawStoreInText: 'Use the $ prefix or the get function to access reactive values instead of accessing the raw store.' }, type: 'problem' }, create(context) { if (!context.sourceCode.parserServices.isSvelte) { return {}; } const isStore = createStoreChecker(context); /** Verify for expression node */ function verifyExpression(node, options) { if (!node) return; if (isStore(node, { consistent: options?.consistent })) { context.report({ node, messageId: 'usingRawStoreInText', fix: node.type === 'Identifier' && !options?.disableFix ? (fixer) => fixer.insertTextBefore(node, '$') : null }); } } return { SvelteMustacheTag(node) { if (canAcceptStoreMustache(node)) { return; } // Check for

{store}

, etc. verifyExpression(node.expression); }, SvelteShorthandAttribute(node) { if (canAcceptStoreAttributeElement(node.parent.parent)) { return; } // Check for

verifyExpression(node.value, { disableFix: true }); }, SvelteSpreadAttribute(node) { // Check for verifyExpression(node.argument); }, SvelteDirective(node) { if (node.kind === 'Action' || node.kind === 'Animation' || node.kind === 'Transition') { if (node.key.name.type !== 'Identifier') { return; } // Check for