website refactor

This commit is contained in:
2026-01-16 11:51:12 +01:00
parent 63dfa58bcb
commit 0208334c59
49 changed files with 525 additions and 89 deletions

13
adapters/.eslintrc.json Normal file
View File

@@ -0,0 +1,13 @@
{
"extends": [
"../.eslintrc.json",
"plugin:gridpilot-adapters-rules/recommended"
],
"plugins": [
"gridpilot-adapters-rules"
],
"rules": {
"gridpilot-adapters-rules/no-index-files": "error",
"gridpilot-adapters-rules/adapter-naming": "error"
}
}

View File

@@ -0,0 +1,37 @@
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'Enforce adapter naming conventions',
category: 'Architecture',
recommended: true,
},
fixable: null,
schema: [],
messages: {
invalidNaming: 'Adapter classes should end with "Adapter", "Repository", "Service", or "Entity". Found: {{name}}',
},
},
create(context) {
return {
ClassDeclaration(node) {
const filename = context.getFilename();
if (!filename.includes('adapters/')) return;
const name = node.id.name;
const isValidName = /(.+)(Adapter|Repository|Service|Entity|Mapper|Schema|Guard|Module|Controller)$/.test(name);
if (!isValidName) {
context.report({
node,
messageId: 'invalidNaming',
data: {
name,
},
});
}
},
};
},
};

View File

@@ -0,0 +1,18 @@
const noIndexFiles = require('./no-index-files');
const adapterNaming = require('./adapter-naming');
module.exports = {
rules: {
'no-index-files': noIndexFiles,
'adapter-naming': adapterNaming,
},
configs: {
recommended: {
plugins: ['gridpilot-adapters-rules'],
rules: {
'gridpilot-adapters-rules/no-index-files': 'error',
'gridpilot-adapters-rules/adapter-naming': 'error',
},
},
},
};

View File

@@ -0,0 +1,35 @@
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'Ban index.ts files in Adapters - use explicit imports instead',
category: 'Best Practices',
recommended: true,
},
fixable: null,
schema: [],
messages: {
indexFile: 'Index files are banned in adapters. Use explicit imports. Example: Instead of "import { foo } from "./", use "import { foo } from "./foo".',
},
},
create(context) {
const filename = context.getFilename();
const isIndexFile = /(^|\/|\\)index\.ts$/.test(filename);
// Allow root index.ts if any
const allowedPaths = [
'adapters/index.ts',
];
if (isIndexFile && !allowedPaths.some(path => filename.endsWith(path))) {
context.report({
node: null,
loc: { line: 1, column: 0 },
messageId: 'indexFile',
});
}
return {};
},
};

View File

@@ -0,0 +1,8 @@
{
"name": "eslint-plugin-gridpilot-adapters-rules",
"version": "0.1.0",
"main": "index.js",
"peerDependencies": {
"eslint": ">=8.0.0"
}
}

13
apps/api/.eslintrc.json Normal file
View File

@@ -0,0 +1,13 @@
{
"extends": [
"../../.eslintrc.json",
"plugin:gridpilot-api-rules/recommended"
],
"plugins": [
"gridpilot-api-rules"
],
"rules": {
"gridpilot-api-rules/no-index-files": "error",
"gridpilot-api-rules/controller-location": "error"
}
}

View File

@@ -0,0 +1,52 @@
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'Enforce that API controllers only call Use Cases or Application Services',
category: 'Architecture',
recommended: true,
},
fixable: null,
schema: [],
messages: {
forbiddenCall: 'Controllers should only call Use Cases or Application Services. Forbidden call to "{{name}}".',
},
},
create(context) {
return {
ClassDeclaration(node) {
const isController = node.decorators && node.decorators.some(d =>
d.expression.type === 'CallExpression' &&
d.expression.callee.name === 'Controller'
);
if (!isController) return;
// Check constructor for injected dependencies
const constructor = node.body.body.find(m => m.kind === 'constructor');
if (constructor) {
constructor.value.params.forEach(param => {
if (param.type === 'TSParameterProperty') {
const typeAnnotation = param.parameter.typeAnnotation;
if (typeAnnotation && typeAnnotation.typeAnnotation.type === 'TSTypeReference') {
const typeName = typeAnnotation.typeAnnotation.typeName.name;
const isValidDependency = /UseCase$/.test(typeName) || /Service$/.test(typeName) || /Logger$/.test(typeName) || /Module$/.test(typeName);
if (!isValidDependency) {
context.report({
node: param,
messageId: 'forbiddenCall',
data: {
name: typeName,
},
});
}
}
}
});
}
},
};
},
};

View File

@@ -0,0 +1,46 @@
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'Enforce that API services do not use repositories directly',
category: 'Architecture',
recommended: true,
},
fixable: null,
schema: [],
messages: {
forbiddenRepository: 'API Services should not use repositories directly. Use Cases should handle data access. Forbidden use of "{{name}}".',
},
},
create(context) {
return {
ClassDeclaration(node) {
const isService = node.id.name.endsWith('Service');
if (!isService) return;
// Check constructor for injected repositories
const constructor = node.body.body.find(m => m.kind === 'constructor');
if (constructor) {
constructor.value.params.forEach(param => {
if (param.type === 'TSParameterProperty') {
const typeAnnotation = param.parameter.typeAnnotation;
if (typeAnnotation && typeAnnotation.typeAnnotation.type === 'TSTypeReference') {
const typeName = typeAnnotation.typeAnnotation.typeName.name;
if (typeName.endsWith('Repository')) {
context.report({
node: param,
messageId: 'forbiddenRepository',
data: {
name: typeName,
},
});
}
}
}
});
}
},
};
},
};

View File

@@ -0,0 +1,41 @@
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'Enforce controller location in apps/api',
category: 'Architecture',
recommended: true,
},
fixable: null,
schema: [],
messages: {
invalidLocation: 'Controllers must be located in "src/domain/<feature>/" or "src/features/". Found: {{location}}',
},
},
create(context) {
return {
ClassDeclaration(node) {
const isController = node.decorators && node.decorators.some(d =>
d.expression.type === 'CallExpression' &&
d.expression.callee.name === 'Controller'
);
if (isController) {
const filename = context.getFilename();
const isValidLocation = /apps\/api\/src\/(domain\/[^/]+\/|features\/)/.test(filename);
if (!isValidLocation) {
context.report({
node,
messageId: 'invalidLocation',
data: {
location: filename,
},
});
}
}
},
};
},
};

View File

@@ -0,0 +1,24 @@
const noIndexFiles = require('./no-index-files');
const controllerLocation = require('./controller-location');
const apiControllerRules = require('./api-controller-rules');
const apiServiceRules = require('./api-service-rules');
module.exports = {
rules: {
'no-index-files': noIndexFiles,
'controller-location': controllerLocation,
'api-controller-rules': apiControllerRules,
'api-service-rules': apiServiceRules,
},
configs: {
recommended: {
plugins: ['gridpilot-api-rules'],
rules: {
'gridpilot-api-rules/no-index-files': 'error',
'gridpilot-api-rules/controller-location': 'error',
'gridpilot-api-rules/api-controller-rules': 'error',
'gridpilot-api-rules/api-service-rules': 'error',
},
},
},
};

View File

@@ -0,0 +1,36 @@
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'Ban index.ts files in API - use explicit imports instead',
category: 'Best Practices',
recommended: true,
},
fixable: null,
schema: [],
messages: {
indexFile: 'Index files are banned in apps/api. Use explicit imports. Example: Instead of "import { foo } from "./", use "import { foo } from "./foo".',
},
},
create(context) {
const filename = context.getFilename();
const isIndexFile = /(^|\/|\\)index\.ts$/.test(filename);
// Allow root index.ts
const allowedPaths = [
'apps/api/index.ts',
'apps/api/src/index.ts',
];
if (isIndexFile && !allowedPaths.some(path => filename.endsWith(path))) {
context.report({
node: null,
loc: { line: 1, column: 0 },
messageId: 'indexFile',
});
}
return {};
},
};

View File

@@ -0,0 +1,8 @@
{
"name": "eslint-plugin-gridpilot-api-rules",
"version": "0.1.0",
"main": "index.js",
"peerDependencies": {
"eslint": ">=8.0.0"
}
}

View File

@@ -17,6 +17,7 @@
"license": "ISC",
"devDependencies": {
"@nestjs/testing": "^10.4.20",
"eslint-plugin-gridpilot-api-rules": "file:eslint-rules",
"ts-node-dev": "^2.0.0",
"tsconfig-paths": "^3.15.0"
},

13
core/.eslintrc.json Normal file
View File

@@ -0,0 +1,13 @@
{
"extends": [
"../.eslintrc.json",
"plugin:gridpilot-core-rules/recommended"
],
"plugins": [
"gridpilot-core-rules"
],
"rules": {
"gridpilot-core-rules/no-index-files": "error",
"gridpilot-core-rules/no-framework-imports": "error"
}
}

View File

@@ -0,0 +1,37 @@
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'Enforce that Core Domain does not depend on Application layer',
category: 'Architecture',
recommended: true,
},
fixable: null,
schema: [],
messages: {
forbiddenImport: 'Domain layer should not depend on Application layer. Forbidden import from "{{source}}".',
},
},
create(context) {
const filename = context.getFilename();
const isDomainFile = filename.includes('/domain/');
if (!isDomainFile) return {};
return {
ImportDeclaration(node) {
const source = node.source.value;
if (source.includes('/application/')) {
context.report({
node,
messageId: 'forbiddenImport',
data: {
source,
},
});
}
},
};
},
};

View File

@@ -0,0 +1,21 @@
const noIndexFiles = require('./no-index-files');
const noFrameworkImports = require('./no-framework-imports');
const domainNoApplication = require('./domain-no-application');
module.exports = {
rules: {
'no-index-files': noIndexFiles,
'no-framework-imports': noFrameworkImports,
'domain-no-application': domainNoApplication,
},
configs: {
recommended: {
plugins: ['gridpilot-core-rules'],
rules: {
'gridpilot-core-rules/no-index-files': 'error',
'gridpilot-core-rules/no-framework-imports': 'error',
'gridpilot-core-rules/domain-no-application': 'error',
},
},
},
};

View File

@@ -0,0 +1,39 @@
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'Ban framework imports in Core',
category: 'Architecture',
recommended: true,
},
fixable: null,
schema: [],
messages: {
frameworkImport: 'Core must be framework-free. Forbidden import from "{{source}}".',
},
},
create(context) {
const forbiddenPatterns = [
/^@nestjs\//,
/^express/,
/^react/,
/^next\//,
];
return {
ImportDeclaration(node) {
const source = node.source.value;
if (forbiddenPatterns.some(pattern => pattern.test(source))) {
context.report({
node,
messageId: 'frameworkImport',
data: {
source,
},
});
}
},
};
},
};

View File

@@ -0,0 +1,35 @@
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'Ban index.ts files in Core - use explicit imports instead',
category: 'Best Practices',
recommended: true,
},
fixable: null,
schema: [],
messages: {
indexFile: 'Index files are banned in core. Use explicit imports. Example: Instead of "import { foo } from "./", use "import { foo } from "./foo".',
},
},
create(context) {
const filename = context.getFilename();
const isIndexFile = /(^|\/|\\)index\.ts$/.test(filename);
// Allow root index.ts if any
const allowedPaths = [
'core/index.ts',
];
if (isIndexFile && !allowedPaths.some(path => filename.endsWith(path))) {
context.report({
node: null,
loc: { line: 1, column: 0 },
messageId: 'indexFile',
});
}
return {};
},
};

View File

@@ -0,0 +1,8 @@
{
"name": "eslint-plugin-gridpilot-core-rules",
"version": "0.1.0",
"main": "index.js",
"peerDependencies": {
"eslint": ">=8.0.0"
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

99
package-lock.json generated
View File

@@ -50,6 +50,8 @@
"eslint": "^8.0.0",
"eslint-import-resolver-typescript": "2.7.1",
"eslint-plugin-boundaries": "^5.3.1",
"eslint-plugin-gridpilot-adapters-rules": "file:adapters/eslint-rules",
"eslint-plugin-gridpilot-core-rules": "file:core/eslint-rules",
"eslint-plugin-import": "^2.32.0",
"faker": "^6.6.6",
"glob": "^13.0.0",
@@ -68,6 +70,14 @@
"node": ">=20.0.0"
}
},
"adapters/eslint-rules": {
"name": "eslint-plugin-gridpilot-adapters-rules",
"version": "0.1.0",
"dev": true,
"peerDependencies": {
"eslint": ">=8.0.0"
}
},
"apps/api": {
"name": "@gridpilot/api",
"version": "1.0.0",
@@ -90,10 +100,19 @@
},
"devDependencies": {
"@nestjs/testing": "^10.4.20",
"eslint-plugin-gridpilot-api-rules": "file:eslint-rules",
"ts-node-dev": "^2.0.0",
"tsconfig-paths": "^3.15.0"
}
},
"apps/api/eslint-rules": {
"name": "eslint-plugin-gridpilot-api-rules",
"version": "0.1.0",
"dev": true,
"peerDependencies": {
"eslint": ">=8.0.0"
}
},
"apps/api/node_modules/reflect-metadata": {
"version": "0.1.14",
"license": "Apache-2.0"
@@ -779,6 +798,13 @@
"uuid": "dist/esm/bin/uuid"
}
},
"core/eslint-rules": {
"name": "eslint-plugin-gridpilot-core-rules",
"version": "0.1.0",
"peerDependencies": {
"eslint": ">=8.0.0"
}
},
"core/social": {},
"node_modules/@adobe/css-tools": {
"version": "4.4.4",
@@ -2025,7 +2051,6 @@
"version": "4.9.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
"integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
"dev": true,
"license": "MIT",
"dependencies": {
"eslint-visitor-keys": "^3.4.3"
@@ -2044,7 +2069,6 @@
"version": "4.12.2",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
"integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@@ -2054,7 +2078,6 @@
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
"integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"ajv": "^6.12.4",
@@ -2078,7 +2101,6 @@
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@@ -2089,7 +2111,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -2102,7 +2123,6 @@
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
"integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -2148,7 +2168,6 @@
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
"integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
"deprecated": "Use @eslint/config-array instead",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@humanwhocodes/object-schema": "^2.0.3",
@@ -2163,7 +2182,6 @@
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@@ -2174,7 +2192,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -2187,7 +2204,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=12.22"
@@ -2202,7 +2218,6 @@
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
"deprecated": "Use @eslint/object-schema instead",
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/@img/colour": {
@@ -5055,7 +5070,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
"dev": true,
"license": "ISC"
},
"node_modules/@unrs/resolver-binding-android-arm-eabi": {
@@ -5553,7 +5567,6 @@
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"devOptional": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@@ -5566,7 +5579,6 @@
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
@@ -5629,7 +5641,6 @@
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
@@ -6699,7 +6710,6 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -7463,7 +7473,6 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true,
"license": "MIT"
},
"node_modules/deepmerge": {
@@ -7651,7 +7660,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"esutils": "^2.0.2"
@@ -8222,7 +8230,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"devOptional": true,
"license": "MIT",
"engines": {
"node": ">=10"
@@ -8257,7 +8264,6 @@
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
"integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
@@ -8509,6 +8515,18 @@
"eslint": ">=6.0.0"
}
},
"node_modules/eslint-plugin-gridpilot-adapters-rules": {
"resolved": "adapters/eslint-rules",
"link": true
},
"node_modules/eslint-plugin-gridpilot-api-rules": {
"resolved": "apps/api/eslint-rules",
"link": true
},
"node_modules/eslint-plugin-gridpilot-core-rules": {
"resolved": "core/eslint-rules",
"link": true
},
"node_modules/eslint-plugin-gridpilot-rules": {
"resolved": "apps/website/eslint-rules",
"link": true
@@ -8815,7 +8833,6 @@
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
"integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"esrecurse": "^4.3.0",
@@ -8832,7 +8849,6 @@
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -8845,7 +8861,6 @@
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@@ -8856,7 +8871,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -8869,7 +8883,6 @@
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
"integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"acorn": "^8.9.0",
@@ -8900,7 +8913,6 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
"integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"estraverse": "^5.1.0"
@@ -8913,7 +8925,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"estraverse": "^5.2.0"
@@ -9018,7 +9029,6 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true,
"license": "MIT"
},
"node_modules/fast-fifo": {
@@ -9061,14 +9071,12 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true,
"license": "MIT"
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
"dev": true,
"license": "MIT"
},
"node_modules/fast-safe-stringify": {
@@ -9148,7 +9156,6 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"license": "MIT",
"dependencies": {
"flat-cache": "^3.0.4"
@@ -9198,7 +9205,6 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"license": "MIT",
"dependencies": {
"locate-path": "^6.0.0",
@@ -9228,7 +9234,6 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
"integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"dev": true,
"license": "MIT",
"dependencies": {
"flatted": "^3.2.9",
@@ -9243,7 +9248,6 @@
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
"integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
"dev": true,
"license": "ISC"
},
"node_modules/for-each": {
@@ -9758,7 +9762,6 @@
"version": "13.24.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
"integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"type-fest": "^0.20.2"
@@ -9774,7 +9777,6 @@
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=10"
@@ -9868,7 +9870,6 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
"dev": true,
"license": "MIT"
},
"node_modules/handlebars": {
@@ -10236,7 +10237,6 @@
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
@@ -10246,7 +10246,6 @@
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
"integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"parent-module": "^1.0.0",
@@ -10263,7 +10262,6 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"devOptional": true,
"license": "MIT",
"engines": {
"node": ">=0.8.19"
@@ -10693,7 +10691,6 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -11150,14 +11147,12 @@
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true,
"license": "MIT"
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true,
"license": "MIT"
},
"node_modules/json-stringify-safe": {
@@ -11268,7 +11263,6 @@
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1",
@@ -11326,7 +11320,6 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
"license": "MIT",
"dependencies": {
"p-locate": "^5.0.0"
@@ -11348,7 +11341,6 @@
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.mergewith": {
@@ -12089,7 +12081,6 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true,
"license": "MIT"
},
"node_modules/negotiator": {
@@ -12649,7 +12640,6 @@
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
"license": "MIT",
"dependencies": {
"deep-is": "^0.1.3",
@@ -12694,7 +12684,6 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"yocto-queue": "^0.1.0"
@@ -12710,7 +12699,6 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
"p-limit": "^3.0.2"
@@ -12828,7 +12816,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
"license": "MIT",
"dependencies": {
"callsites": "^3.0.0"
@@ -12921,7 +12908,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -13466,7 +13452,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8.0"
@@ -13694,7 +13679,6 @@
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -14251,7 +14235,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
@@ -15495,7 +15478,6 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -15825,7 +15807,6 @@
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true,
"license": "MIT"
},
"node_modules/thenify": {
@@ -16806,7 +16787,6 @@
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1"
@@ -17346,7 +17326,6 @@
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"punycode": "^2.1.0"
@@ -17855,7 +17834,6 @@
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -18055,7 +18033,6 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"

View File

@@ -38,6 +38,8 @@
"eslint": "^8.0.0",
"eslint-import-resolver-typescript": "2.7.1",
"eslint-plugin-boundaries": "^5.3.1",
"eslint-plugin-gridpilot-adapters-rules": "file:adapters/eslint-rules",
"eslint-plugin-gridpilot-core-rules": "file:core/eslint-rules",
"eslint-plugin-import": "^2.32.0",
"faker": "^6.6.6",
"glob": "^13.0.0",