/** * Enforces that every src/pages-v2/**.vue page declares * definePage({ meta: { layout: 'OrganizerLayoutV2' } }) * (or 'PortalLayoutV2' for src/pages-v2/portal/**). Without this a v2 * page silently falls back to the `default` layout — a no-error * wrong-shell bug. RFC-WS-GUI-REDESIGN AD-G2. */ 'use strict' module.exports = { meta: { type: 'problem', docs: { description: 'require definePage layout meta on pages-v2' }, messages: { missing: 'pages-v2 page must call definePage({ meta: { layout: ... } }).', wrongLayout: 'pages-v2 layout must be {{expected}} (got {{actual}}).', }, schema: [], }, create(context) { const filename = (context.filename || context.getFilename() || '').replace(/\\/g, '/') if (!filename.includes('src/pages-v2/')) return {} const expected = filename.includes('src/pages-v2/portal/') ? 'PortalLayoutV2' : 'OrganizerLayoutV2' let sawDefinePage = false return { CallExpression(node) { if (node.callee.type !== 'Identifier' || node.callee.name !== 'definePage') return sawDefinePage = true const arg = node.arguments[0] const metaProp = arg && arg.type === 'ObjectExpression' ? arg.properties.find(p => p.key && p.key.name === 'meta') : null const layoutProp = metaProp && metaProp.value.type === 'ObjectExpression' ? metaProp.value.properties.find(p => p.key && p.key.name === 'layout') : null if (!layoutProp || layoutProp.value.value !== expected) { context.report({ node, messageId: 'wrongLayout', data: { expected, actual: layoutProp ? String(layoutProp.value.value) : 'none' }, }) } }, 'Program:exit': function (node) { if (!sawDefinePage) context.report({ node, messageId: 'missing' }) }, } }, }