Comments (6)
Upgrade to nodejs v12.18.3 and resolved the issue.
from angular-eslint.
Still having the issue when running ng lint, I first thought is as the node version.
Let me know if there is something I can try to help if this is a bug or if it's my configuration.
tsconfig.eslint.json
{ "extends": "./tsconfig.base.json", "include": ["src/**/*.ts", "projects/**/*.ts"] }
angular.json
"lint": {
"builder": "@angular-eslint/builder:lint",
"options": {
"eslintConfig": ".eslintrc.js",
"tsConfig": ['./tsconfig.eslint.json'],
"exclude": [
"**/node_modules/**"
]
}
}
from angular-eslint.
running ng lint as node --max_old_space_size=8048 ./node_modules/@angular/cli/bin/ng lint helped.
Now, I'm facing another issue which I cannot seem to fix it. I'm getting the following error
**preprocess: ERROR could not parse @Component() metadata**
from angular-eslint.
If I comment out the override rules for files: ['*.component.html'] and files: ['*.component.ts'] and run ng lint it hangs.
module.exports = {
env: {
'browser': true,
'es6': true,
'serviceworker': true
},
ignorePatterns: ['**/*.js'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:@typescript-eslint/recommended-requiring-type-checking',
'plugin:@angular-eslint/recommended',
'prettier',
'prettier/@typescript-eslint'
],
parser: '@typescript-eslint/parser',
plugins: [
'@typescript-eslint',
'@angular-eslint',
'@angular-eslint/template',
'prettier'
],
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
project: ['./tsconfig.**.json'],
tsconfigRootDir: __dirname,
warnOnUnsupportedTypeScriptVersion: false
},
rules: {
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/prefer-includes': 'off',
'prettier/prettier': [
'error', {
'parser': 'typescript',
'semi': true,
'singleQuote': true,
'tabWidth': 2,
'trailingComma': 'none',
'bracketSpacing': true,
'jsxBracketSameLine': false,
'endOfLine': 'auto',
}
],
},
overrides: [{
files: ['*.ts'],
extends: [
'plugin:@typescript-eslint/recommended-requiring-type-checking',
'plugin:@angular-eslint/recommended',
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
project: ['./tsconfig.**.json', './projects/*/tsconfig.**.json'],
tsconfigRootDir: __dirname,
warnOnUnsupportedTypeScriptVersion: false
},
plugins: ['@typescript-eslint', '@angular-eslint'],
rules: {
'max-len': ['error', {
'code': 240
}
],
'@angular-eslint/component-class-suffix': 'error',
'@angular-eslint/directive-selector': [
'error', {
type: 'attribute',
prefix: 'app',
style: 'camelCase'
},
],
'@angular-eslint/contextual-lifecycle': 'error',
'@angular-eslint/directive-class-suffix': 'error',
'@angular-eslint/component-selector': [
'error', {
type: 'element',
prefix: 'app',
style: 'kebab-case'
},
],
'@angular-eslint/no-conflicting-lifecycle': 'error',
'@angular-eslint/no-host-metadata-property': 'error',
'@angular-eslint/no-input-rename': 'off',
'@angular-eslint/no-inputs-metadata-property': 'error',
'@angular-eslint/no-output-native': 'off',
'@angular-eslint/no-output-on-prefix': 'off',
'@angular-eslint/no-output-rename': 'off',
'@angular-eslint/no-outputs-metadata-property': 'error',
'@angular-eslint/template/banana-in-box': 'off',
'@angular-eslint/template/no-negated-async': 'off',
'@angular-eslint/use-lifecycle-interface': 'error',
'@angular-eslint/use-pipe-transform-interface': 'error',
'@typescript-eslint/array-type': 'off',
'@typescript-eslint/ban-types': [
'warn', {
types: {
Object: {
message: 'Avoid using the `Object` type. Did you mean `object`?',
},
Function: {
message: 'Avoid using the `Function` type. Prefer a specific function type, like `() => void`.',
},
Boolean: {
message: 'Avoid using the `Boolean` type. Did you mean `boolean`?',
},
Number: {
message: 'Avoid using the `Number` type. Did you mean `number`?',
},
String: {
message: 'Avoid using the `String` type. Did you mean `string`?',
},
Symbol: {
message: 'Avoid using the `Symbol` type. Did you mean `symbol`?',
},
},
},
],
'@typescript-eslint/consistent-type-definitions': 'error',
'@typescript-eslint/dot-notation': 'off',
'@typescript-eslint/explicit-member-accessibility': [
'off', {
accessibility: 'explicit',
},
],
'@typescript-eslint/interface-name-prefix': 'off',
'@typescript-eslint/member-delimiter-style': [
'off', {
multiline: {
delimiter: 'none',
requireLast: true,
},
singleline: {
delimiter: 'semi',
requireLast: false,
},
},
],
'@typescript-eslint/member-ordering': 'off',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-non-null-assertion': 'error',
'@typescript-eslint/no-parameter-properties': 'off',
'@typescript-eslint/no-unused-expressions': 'error',
'@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/prefer-for-of': 'off',
'@typescript-eslint/prefer-function-type': 'off',
'@typescript-eslint/semi': ['off', null],
'@typescript-eslint/triple-slash-reference': [
'error', {
path: 'always',
types: 'prefer-import',
lib: 'always',
},
],
'@typescript-eslint/type-annotation-spacing': 'off',
'@typescript-eslint/unified-signatures': 'error',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/await-thenable': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/unbound-method': 'off',
'@typescript-eslint/no-namespace': 'off',
'@typescript-eslint/no-unsafe-assignment': 'off',
'@typescript-eslint/no-unsafe-member-access': 'off',
'@typescript-eslint/no-unsafe-call': 'off',
'@typescript-eslint/no-floating-promises': 'off',
'@typescript-eslint/no-unsafe-return': 'off',
'no-debugger': 'error',
'no-empty': 'off',
'no-eval': 'error',
'no-fallthrough': 'error',
'no-invalid-this': 'off',
'no-irregular-whitespace': 'off',
'no-new-wrappers': 'error',
'no-restricted-imports': [
'error', {
'paths': [
'rxjs/Rx',
'rxjs/internal/operators',
'rxjs/internal'
]
}
],
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/no-unused-expressions': 'off',
'@typescript-eslint/camelcase': 'off',
'@typescript-eslint/restrict-plus-operands': 'off',
'@angular-eslint/component-selector': 'off'
}
}, {
files: ['*.d.ts', '*.svg.ts', '**/iav/**/*.ts', '**/iav/**/*.js'],
parser: '@typescript-eslint/parser',
plugins: ['@angular-eslint/template'],
processor: '@angular-eslint/template/extract-inline-html',
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
project: ['./tsconfig.**.json'],
tsconfigRootDir: __dirname
},
rules: {
'max-len': ['error', {
'code': 500
}
],
'no-redeclare': 'off',
'no-undef': 'off',
'no-prototype-builtins': 'off',
'no-var': 'off',
'no-inner-declarations': 'off',
'@typescript-eslint/no-empty-interface': 'off',
'@typescript-eslint/no-namespace': 'off',
'@typescript-eslint/consistent-type-assertions': 'off',
'@typescript-eslint/unified-signatures': 'off',
'no-dupe-class-members': 'off',
'prefer-spread': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@angular-eslint/component-selector': 'off',
'@typescript-eslint/prefer-namespace-keyword': 'off',
'@typescript-eslint/no-inferrable-types': 'off',
'@typescript-eslint/prefer-string-starts-ends-with': 'off',
'@typescript-eslint/prefer-includes': 'off',
'prettier/prettier': 'off',
'prefer-const': 'off'
}
// }, {
// files: ['*.component.ts'],
// parser: '@typescript-eslint/parser',
// plugins: ['@angular-eslint/template',
// 'prettier',
// ],
// processor: '@angular-eslint/template/extract-inline-html',
// parserOptions: {
// ecmaVersion: 2020,
// sourceType: 'module',
// project: ['./tsconfig.**.json'],
// tsconfigRootDir: __dirname
// },
// rules: {
// '@angular-eslint/component-selector': 'off'
// }
}, {
// prettier
"files": ["*.ts", "*.json"],
"extends": ["plugin:prettier/recommended"]
}
// , {
// files: ['*.component.html'],
// parser: '@angular-eslint/template-parser',
// plugins: ['@angular-eslint/template'],
// parserOptions: {
// ecmaVersion: 2020,
// sourceType: 'module',
// project: ['./tsconfig.**.json'],
// tsconfigRootDir: __dirname,
// warnOnUnsupportedTypeScriptVersion: false
// },
// rules: {
// '@angular-eslint/template/banana-in-a-box': 'off',
// '@angular-eslint/template/cyclomatic-complexity': 'off',
// '@angular-eslint/template/no-call-expression': 'off',
// '@angular-eslint/template/no-negated-async': 'off',
// '@typescript-eslint/no-misused-promises': 'off',
// '@typescript-eslint/no-unnecessary-type-assertion': 'off',
// '@typescript-eslint/await-thenable': 'off',
// '@typescript-eslint/prefer-regexp-exec': 'off',
// '@typescript-eslint/prefer-string-starts-ends-with': 'off',
// '@typescript-eslint/require-await': 'off',
// '@typescript-eslint/unbound-method': 'off',
// '@typescript-eslint/no-floating-promises': 'off',
// '@typescript-eslint/no-implied-eval': 'off',
// '@typescript-eslint/no-unsafe-assignment': 'off',
// '@typescript-eslint/no-unsafe-call': 'off',
// '@typescript-eslint/no-unsafe-member-access': 'off',
// '@typescript-eslint/no-unsafe-return': 'off',
// '@typescript-eslint/restrict-plus-operands': 'off',
// '@typescript-eslint/restrict-template-expressions': 'off',
// '@angular-eslint/template/i18n': [
// 'error', {
// 'checkId': false,
// 'checkText': true,
// 'checkAttributes': true,
// 'ignoreAttributes': [
// 'field',
// 'identifier'
// ]
// }
// ]
// }
// }
]
};
from angular-eslint.
Here's my work eslintrc.js file and configuration that is working,
package.json
"scripts": {
....
"lint": "node --max_old_space_size=10240 ./node_modules/@angular/cli/bin/ng lint",
}
angular.json
"lint": {
"builder": "@angular-eslint/builder:lint",
"options": {
"eslintConfig": ".eslintrc.js",
"tsConfig": ['./tsconfig.eslint.json'],
"exclude": [
"**/node_modules/**"
]
}
}
.eslintrc.js I had to comment out the override for files: ['*.component.ts'] in order to get lint to work
module.exports = {
env: {
'browser': true,
'es6': true,
'serviceworker': true
},
ignorePatterns: ['**/*.js'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:@typescript-eslint/recommended-requiring-type-checking',
'plugin:@angular-eslint/recommended',
'prettier',
'prettier/@typescript-eslint'
],
parser: '@typescript-eslint/parser',
plugins: [
'@typescript-eslint',
'@angular-eslint',
'@angular-eslint/template',
'prettier'
],
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
project: ['./tsconfig.**.json'],
tsconfigRootDir: __dirname,
warnOnUnsupportedTypeScriptVersion: false
},
rules: {
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/prefer-includes': 'off',
// 'prettier/prettier': 'off',
'prettier/prettier': [
'error', {
printWidth: 200,
trailingComma: "none",
singleQuote: true,
bracketSpacing: true,
jsxBracketSameLine: false,
parser: "typescript",
useTabs: false,
tabWidth: 2,
arrowParens: "always",
endOfLine: "auto",
htmlWhitespaceSensitivity: "ignore",
insertPragma: false,
jsxSingleQuote: false,
proseWrap: "preserve",
quoteProps: "as-needed",
requirePragma: false,
semi: true,
overrides: [{
files: ".json",
options: {
parser: "json"
}
}, {
files: "*.html",
options: {
parser: "angular"
}
}, {
files: "*.ts",
options: {
parser: "typescript"
}
}
]
}
],
},
overrides: [{
files: ['*.ts'],
extends: [
'plugin:@typescript-eslint/recommended-requiring-type-checking',
'plugin:@angular-eslint/recommended',
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
project: ['./tsconfig.**.json', './projects/*/tsconfig.**.json'],
tsconfigRootDir: __dirname,
warnOnUnsupportedTypeScriptVersion: false
},
plugins: ['@typescript-eslint', '@angular-eslint'],
rules: {
'max-len': ['error', {
'code': 180,
"comments": 240,
"ignoreUrls": true,
"ignoreComments": true,
"ignoreStrings": true,
"ignoreTrailingComments": true,
"ignoreTemplateLiterals": true,
"ignoreRegExpLiterals": true
}
],
'@angular-eslint/component-class-suffix': 'error',
'@angular-eslint/directive-selector': [
'error', {
type: 'attribute',
prefix: 'app',
style: 'camelCase'
},
],
'@angular-eslint/contextual-lifecycle': 'error',
'@angular-eslint/directive-class-suffix': 'error',
'@angular-eslint/component-selector': [
'error', {
type: 'element',
prefix: 'app',
style: 'kebab-case'
},
],
'@angular-eslint/no-conflicting-lifecycle': 'error',
'@angular-eslint/no-host-metadata-property': 'error',
'@angular-eslint/no-input-rename': 'off',
'@angular-eslint/no-inputs-metadata-property': 'error',
'@angular-eslint/no-output-native': 'off',
'@angular-eslint/no-output-on-prefix': 'off',
'@angular-eslint/no-output-rename': 'off',
'@angular-eslint/no-outputs-metadata-property': 'error',
'@angular-eslint/template/banana-in-box': 'off',
'@angular-eslint/template/no-negated-async': 'off',
'@angular-eslint/use-lifecycle-interface': 'error',
'@angular-eslint/use-pipe-transform-interface': 'error',
'@typescript-eslint/array-type': 'off',
'@typescript-eslint/ban-types': [
'off', {
types: {
Object: {
message: 'Avoid using the `Object` type. Did you mean `object`?',
},
Function: {
message: 'Avoid using the `Function` type. Prefer a specific function type, like `() => void`.',
},
Boolean: {
message: 'Avoid using the `Boolean` type. Did you mean `boolean`?',
},
Number: {
message: 'Avoid using the `Number` type. Did you mean `number`?',
},
String: {
message: 'Avoid using the `String` type. Did you mean `string`?',
},
Symbol: {
message: 'Avoid using the `Symbol` type. Did you mean `symbol`?',
},
},
},
],
'@typescript-eslint/consistent-type-definitions': 'error',
'@typescript-eslint/dot-notation': 'off',
'@typescript-eslint/explicit-member-accessibility': [
'off', {
accessibility: 'explicit',
},
],
'@typescript-eslint/interface-name-prefix': 'off',
'@typescript-eslint/member-delimiter-style': [
'off', {
multiline: {
delimiter: 'none',
requireLast: true,
},
singleline: {
delimiter: 'semi',
requireLast: false,
},
},
],
'@typescript-eslint/member-ordering': 'off',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-non-null-assertion': 'error',
'@typescript-eslint/no-parameter-properties': 'off',
'@typescript-eslint/no-unused-expressions': 'error',
'@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/prefer-for-of': 'off',
'@typescript-eslint/prefer-function-type': 'off',
'@typescript-eslint/semi': ['off', null],
'@typescript-eslint/triple-slash-reference': [
'error', {
path: 'always',
types: 'prefer-import',
lib: 'always',
},
],
'@typescript-eslint/type-annotation-spacing': 'off',
'@typescript-eslint/unified-signatures': 'error',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/await-thenable': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/unbound-method': 'off',
'@typescript-eslint/no-namespace': 'off',
'@typescript-eslint/no-unsafe-assignment': 'off',
'@typescript-eslint/no-unsafe-member-access': 'off',
'@typescript-eslint/no-unsafe-call': 'off',
'@typescript-eslint/no-floating-promises': 'off',
'@typescript-eslint/no-unsafe-return': 'off',
'no-debugger': 'error',
'no-empty': 'off',
'no-eval': 'error',
'no-fallthrough': 'error',
'no-invalid-this': 'off',
'no-irregular-whitespace': 'off',
'no-new-wrappers': 'error',
'no-useless-escape': 'off',
'no-restricted-imports': [
'error', {
'paths': [
'rxjs/Rx',
'rxjs/internal/operators',
'rxjs/internal'
]
}
],
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/no-unused-expressions': 'off',
'@typescript-eslint/camelcase': 'off',
'@typescript-eslint/restrict-plus-operands': 'off',
'@angular-eslint/component-selector': 'off',
'@angular-eslint/directive-selector': 'off',
'@typescript-eslint/restrict-template-expressions': 'off',
}
}, {
files: ['*.d.ts', '*.svg.ts', '**/iav/**/*.ts', '**/iav/**/*.js'],
parser: '@typescript-eslint/parser',
plugins: ['@angular-eslint/template'],
processor: '@angular-eslint/template/extract-inline-html',
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
project: ['./tsconfig.**.json'],
tsconfigRootDir: __dirname
},
rules: {
'max-len': ['error', {
'code': 500
}
],
'no-redeclare': 'off',
'no-undef': 'off',
'no-prototype-builtins': 'off',
'no-var': 'off',
'no-inner-declarations': 'off',
'@typescript-eslint/no-empty-interface': 'off',
'@typescript-eslint/no-namespace': 'off',
'@typescript-eslint/consistent-type-assertions': 'off',
'@typescript-eslint/unified-signatures': 'off',
'no-dupe-class-members': 'off',
'prefer-spread': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@angular-eslint/component-selector': 'off',
'@typescript-eslint/prefer-namespace-keyword': 'off',
'@typescript-eslint/no-inferrable-types': 'off',
'@typescript-eslint/prefer-string-starts-ends-with': 'off',
'@typescript-eslint/prefer-includes': 'off',
'prettier/prettier': 'off',
'prefer-const': 'off'
}
// }, {
// files: ['*.component.ts'],
// parser: '@typescript-eslint/parser',
// plugins: ['@angular-eslint/template',
// 'prettier',
// ],
// processor: '@angular-eslint/template/extract-inline-html',
// parserOptions: {
// ecmaVersion: 2020,
// sourceType: 'module',
// project: ['./tsconfig.**.json'],
// tsconfigRootDir: __dirname
// },
// rules: {
// '@angular-eslint/component-selector': 'off'
// }
}, {
files: ['*.component.html'],
parser: '@angular-eslint/template-parser',
plugins: ['@angular-eslint/template'],
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
project: ['./tsconfig.**.json'],
tsconfigRootDir: __dirname,
warnOnUnsupportedTypeScriptVersion: false
},
rules: {
'@angular-eslint/template/banana-in-a-box': 'off',
'@angular-eslint/template/cyclomatic-complexity': 'off',
'@angular-eslint/template/no-call-expression': 'off',
'@angular-eslint/template/no-negated-async': 'off',
'@typescript-eslint/no-misused-promises': 'off',
'@typescript-eslint/no-unnecessary-type-assertion': 'off',
'@typescript-eslint/await-thenable': 'off',
'@typescript-eslint/prefer-regexp-exec': 'off',
'@typescript-eslint/prefer-string-starts-ends-with': 'off',
'@typescript-eslint/require-await': 'off',
'@typescript-eslint/unbound-method': 'off',
'@typescript-eslint/no-floating-promises': 'off',
'@typescript-eslint/no-implied-eval': 'off',
'@typescript-eslint/no-unsafe-assignment': 'off',
'@typescript-eslint/no-unsafe-call': 'off',
'@typescript-eslint/no-unsafe-member-access': 'off',
'@typescript-eslint/no-unsafe-return': 'off',
'@typescript-eslint/restrict-plus-operands': 'off',
'@typescript-eslint/restrict-template-expressions': 'off',
'prettier/prettier': 'off',
}
}
]
};
from angular-eslint.
I'm sorry about the OOM issues @kambbado - please can you migrate to v0.2.0-beta.1
? It was added in #120
It is a major change to address specifically the issues you have mentioned. You will see that the integration-tests now include lots of separate projects (and you can also see in there how different the config now is).
There is a schematic available now in that same PR to take a current Angular CLI project and convert it to the appropriate configuration.
If you still have issues with v0.2.0-beta.1
please open a fresh issue with as much information as possible.
Thanks all 🙏
from angular-eslint.
Related Issues (20)
- Update the list of native event names
- [no-call-expression] False negative with the new control flow syntax HOT 2
- [prefer-self-closing-tags] closes ng-container with
- [@angular-eslint/template/no-any] does not throw error for property binding with square bracket notation
- [prefer-self-closing-tags] autofix removes comment between element tags
- [alt-text] input element with all types should have check HOT 2
- [prefer-readonly-signals] New rule for checking that signals are defined as readonly
- [consistent-type-imports] new rule request
- [developer-preview] New rule to avoid dev preview HOT 1
- latest 16.x @angular-eslint/builder incompatible with eslint 8.56: "Unknown options: reportUnusedDisableDirectives" HOT 2
- [no-input-rename] support signal input/model
- [attributes-order] Fixer mangles code when valueless structural directives are present in final position. HOT 4
- [@typescript-eslint/array-type] Definition for rule '@typescript-eslint/array-type' was not found HOT 3
- Error: The `convert-tslint-to-eslint` schematic is no longer supported. HOT 3
- [attributes-order] angular input binding without brackets considered as attribute binding HOT 1
- [no-attributes-combination] new rule request
- [@angular-eslint/template/attributes-order] doc is missing the info what is default for `alphabetical` HOT 1
- Error in Angular-ESLint Integration: Unique Name Issue in Monorepo Project HOT 4
- [no-signal-compare?] new rule request to prevent comparing signals via < or > HOT 2
- Is there a linting role for detecting duplicated imports? HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from angular-eslint.