Generator-emitted scaffold (pnpm turbo gen core-package realtime) plus the story-00-precedent coverage repairs (coverage provider devDep, symbols.ts exclude + tested allowlist mirror) and three minimal tests covering generator-emitted realtime code the template suite misses. Squash of 31d85e0 + review-fix cf11b38. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016j8z4VHjedXDTjEDNg7qHK
40 lines
1.2 KiB
JavaScript
40 lines
1.2 KiB
JavaScript
// packages/core-eslint/rules/no-direct-socket-io.js
|
|
const ALLOWED = [
|
|
/\/packages\/core-realtime\/src\//,
|
|
/\/apps\/[^/]+\/server\.ts$/,
|
|
/\/apps\/[^/]+\/src\/.*\.test\.ts$/,
|
|
];
|
|
|
|
export default {
|
|
meta: {
|
|
type: "problem",
|
|
docs: {
|
|
description:
|
|
"Block direct socket.io imports outside core-realtime + app servers",
|
|
},
|
|
messages: {
|
|
noDirectSocketIO:
|
|
'Import from "@repo/core-realtime" instead of "socket.io". Direct imports allowed only in packages/core-realtime/src/ and apps/*/server.ts.',
|
|
noDirectSocketIOClient:
|
|
'Use the realtime helpers from "@repo/core-realtime" / "@repo/core-testing/instrumentation" instead of "socket.io-client".',
|
|
},
|
|
schema: [],
|
|
},
|
|
create(context) {
|
|
const filename = context.filename ?? context.getFilename();
|
|
const allowed = ALLOWED.some((re) => re.test(filename));
|
|
if (allowed) return {};
|
|
|
|
return {
|
|
ImportDeclaration(node) {
|
|
const source = node.source.value;
|
|
if (source === "socket.io") {
|
|
context.report({ node, messageId: "noDirectSocketIO" });
|
|
} else if (source === "socket.io-client") {
|
|
context.report({ node, messageId: "noDirectSocketIOClient" });
|
|
}
|
|
},
|
|
};
|
|
},
|
|
};
|