189 lines
8.3 KiB
JavaScript
189 lines
8.3 KiB
JavaScript
/**
|
|
* GridPilot ESLint Rules Plugin
|
|
*
|
|
* Comprehensive architectural guardrails converted to ESLint rules
|
|
*
|
|
* Usage in .eslintrc.json:
|
|
* {
|
|
* "plugins": ["gridpilot-rules"],
|
|
* "rules": {
|
|
* "gridpilot-rules/presenter-contract": "error",
|
|
* "gridpilot-rules/rsc-no-container-manager": "error",
|
|
* ...
|
|
* }
|
|
* }
|
|
*/
|
|
|
|
const presenterContract = require('./presenter-contract');
|
|
const rscBoundaryRules = require('./rsc-boundary-rules');
|
|
const templatePurityRules = require('./template-purity-rules');
|
|
const displayObjectRules = require('./display-object-rules');
|
|
const pageQueryRules = require('./page-query-rules');
|
|
const servicesRules = require('./services-rules');
|
|
const clientOnlyRules = require('./client-only-rules');
|
|
const writeBoundaryRules = require('./write-boundary-rules');
|
|
const modelTaxonomyRules = require('./model-taxonomy-rules');
|
|
const filenameRules = require('./filename-rules');
|
|
const componentNoDataManipulation = require('./component-no-data-manipulation');
|
|
const presenterPurity = require('./presenter-purity');
|
|
|
|
module.exports = {
|
|
rules: {
|
|
// Presenter Contract
|
|
'presenter-contract': presenterContract,
|
|
'presenter-purity': presenterPurity,
|
|
|
|
// RSC Boundary Rules
|
|
'rsc-no-container-manager': rscBoundaryRules['no-container-manager-in-server'],
|
|
'rsc-no-page-data-fetcher': rscBoundaryRules['no-page-data-fetcher-fetch-in-server'],
|
|
'rsc-no-view-models': rscBoundaryRules['no-view-models-in-server'],
|
|
'rsc-no-presenters': rscBoundaryRules['no-presenters-in-server'],
|
|
'rsc-no-intl': rscBoundaryRules['no-intl-in-presentation'],
|
|
'rsc-no-sorting-filtering': rscBoundaryRules['no-sorting-filtering-in-server'],
|
|
'rsc-no-display-objects': rscBoundaryRules['no-display-objects-in-server'],
|
|
'rsc-no-unsafe-services': rscBoundaryRules['no-unsafe-services-in-server'],
|
|
'rsc-no-di': rscBoundaryRules['no-di-in-server'],
|
|
'rsc-no-local-helpers': rscBoundaryRules['no-local-helpers-in-server'],
|
|
'rsc-no-object-construction': rscBoundaryRules['no-object-construction-in-server'],
|
|
'rsc-no-container-manager-calls': rscBoundaryRules['no-container-manager-calls-in-server'],
|
|
|
|
// Template Purity Rules
|
|
'template-no-direct-mutations': templatePurityRules['no-view-models-in-templates'],
|
|
'template-no-side-effects': templatePurityRules['no-state-hooks-in-templates'],
|
|
'template-no-async-render': templatePurityRules['no-computations-in-templates'],
|
|
'template-no-external-state': templatePurityRules['no-restricted-imports-in-templates'],
|
|
'template-no-global-objects': templatePurityRules['no-invalid-template-signature'],
|
|
'template-no-mutation-props': templatePurityRules['no-template-helper-exports'],
|
|
'template-no-unsafe-html': templatePurityRules['invalid-template-filename'],
|
|
|
|
// Display Object Rules
|
|
'display-no-domain-models': displayObjectRules['no-io-in-display-objects'],
|
|
'display-no-business-logic': displayObjectRules['no-non-class-display-exports'],
|
|
|
|
// Page Query Rules
|
|
'page-query-no-null-returns': pageQueryRules['no-null-returns-in-page-queries'],
|
|
'page-query-filename': pageQueryRules['invalid-page-query-filename'],
|
|
'page-query-contract': pageQueryRules['pagequery-must-implement-contract'],
|
|
'page-query-execute': pageQueryRules['pagequery-must-have-execute'],
|
|
'page-query-return-type': pageQueryRules['pagequery-execute-return-type'],
|
|
|
|
// Services Rules
|
|
'services-must-be-marked': servicesRules['services-must-be-marked'],
|
|
'services-no-external-api': servicesRules['no-external-api-in-services'],
|
|
'services-must-be-pure': servicesRules['services-must-be-pure'],
|
|
|
|
// Client-Only Rules
|
|
'client-only-no-server-code': clientOnlyRules['no-server-code-in-client-only'],
|
|
'client-only-must-have-directive': clientOnlyRules['client-only-must-have-directive'],
|
|
|
|
// Write Boundary Rules
|
|
'write-boundary-no-direct-mutations': writeBoundaryRules['no-direct-mutations-in-write-boundaries'],
|
|
'write-boundary-must-use-repository': writeBoundaryRules['write-boundaries-must-use-repository'],
|
|
|
|
// Model Taxonomy Rules
|
|
'model-no-domain-in-display': modelTaxonomyRules['no-domain-models-in-display-objects'],
|
|
'model-no-display-in-domain': modelTaxonomyRules['no-display-objects-in-domain-models'],
|
|
|
|
// Filename Rules
|
|
'filename-presenter-match': filenameRules['presenter-filename-must-match-class'],
|
|
'filename-service-match': filenameRules['service-filename-must-match-function'],
|
|
|
|
// Component Data Manipulation Rules
|
|
'component-no-data-manipulation': componentNoDataManipulation,
|
|
},
|
|
|
|
// Configurations for different use cases
|
|
configs: {
|
|
// Recommended: All rules enabled
|
|
recommended: {
|
|
plugins: ['gridpilot-rules'],
|
|
rules: {
|
|
// Presenter
|
|
'gridpilot-rules/presenter-contract': 'error',
|
|
|
|
// RSC Boundary
|
|
'gridpilot-rules/rsc-no-container-manager': 'error',
|
|
'gridpilot-rules/rsc-no-page-data-fetcher': 'error',
|
|
'gridpilot-rules/rsc-no-view-models': 'error',
|
|
'gridpilot-rules/rsc-no-presenters': 'error',
|
|
'gridpilot-rules/rsc-no-intl': 'error',
|
|
'gridpilot-rules/rsc-no-sorting-filtering': 'error',
|
|
'gridpilot-rules/rsc-no-display-objects': 'error',
|
|
'gridpilot-rules/rsc-no-unsafe-services': 'error',
|
|
'gridpilot-rules/rsc-no-di': 'error',
|
|
'gridpilot-rules/rsc-no-local-helpers': 'error',
|
|
'gridpilot-rules/rsc-no-object-construction': 'error',
|
|
'gridpilot-rules/rsc-no-container-manager-calls': 'error',
|
|
|
|
// Template Purity
|
|
'gridpilot-rules/template-no-direct-mutations': 'error',
|
|
'gridpilot-rules/template-no-side-effects': 'error',
|
|
'gridpilot-rules/template-no-async-render': 'error',
|
|
'gridpilot-rules/template-no-external-state': 'error',
|
|
'gridpilot-rules/template-no-global-objects': 'error',
|
|
'gridpilot-rules/template-no-mutation-props': 'error',
|
|
'gridpilot-rules/template-no-unsafe-html': 'error',
|
|
|
|
// Display Objects
|
|
'gridpilot-rules/display-no-domain-models': 'error',
|
|
'gridpilot-rules/display-no-business-logic': 'error',
|
|
|
|
// Page Queries
|
|
'gridpilot-rules/page-query-no-null-returns': 'error',
|
|
'gridpilot-rules/page-query-filename': 'error',
|
|
'gridpilot-rules/page-query-contract': 'error',
|
|
'gridpilot-rules/page-query-execute': 'error',
|
|
'gridpilot-rules/page-query-return-type': 'error',
|
|
|
|
// Services
|
|
'gridpilot-rules/services-must-be-marked': 'error',
|
|
'gridpilot-rules/services-no-external-api': 'error',
|
|
'gridpilot-rules/services-must-be-pure': 'error',
|
|
|
|
// Client-Only
|
|
'gridpilot-rules/client-only-no-server-code': 'error',
|
|
'gridpilot-rules/client-only-must-have-directive': 'error',
|
|
|
|
// Write Boundaries
|
|
'gridpilot-rules/write-boundary-no-direct-mutations': 'error',
|
|
'gridpilot-rules/write-boundary-must-use-repository': 'error',
|
|
|
|
// Model Taxonomy
|
|
'gridpilot-rules/model-no-domain-in-display': 'error',
|
|
'gridpilot-rules/model-no-display-in-domain': 'error',
|
|
|
|
// Filename
|
|
'gridpilot-rules/filename-presenter-match': 'error',
|
|
'gridpilot-rules/filename-service-match': 'error',
|
|
},
|
|
},
|
|
|
|
// Presenter-only: Just the presenter rules
|
|
presenters: {
|
|
plugins: ['gridpilot-rules'],
|
|
rules: {
|
|
'gridpilot-rules/presenter-contract': 'error',
|
|
'gridpilot-rules/filename-presenter-match': 'error',
|
|
},
|
|
},
|
|
|
|
// RSC-only: Just RSC boundary rules
|
|
rsc: {
|
|
plugins: ['gridpilot-rules'],
|
|
rules: {
|
|
'gridpilot-rules/rsc-no-container-manager': 'error',
|
|
'gridpilot-rules/rsc-no-page-data-fetcher': 'error',
|
|
'gridpilot-rules/rsc-no-view-models': 'error',
|
|
'gridpilot-rules/rsc-no-presenters': 'error',
|
|
'gridpilot-rules/rsc-no-intl': 'error',
|
|
'gridpilot-rules/rsc-no-sorting-filtering': 'error',
|
|
'gridpilot-rules/rsc-no-display-objects': 'error',
|
|
'gridpilot-rules/rsc-no-unsafe-services': 'error',
|
|
'gridpilot-rules/rsc-no-di': 'error',
|
|
'gridpilot-rules/rsc-no-local-helpers': 'error',
|
|
'gridpilot-rules/rsc-no-object-construction': 'error',
|
|
'gridpilot-rules/rsc-no-container-manager-calls': 'error',
|
|
},
|
|
},
|
|
},
|
|
}; |