Skip to content
This repository has been archived by the owner on Aug 18, 2020. It is now read-only.

Commit

Permalink
create typescript namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
cartogram committed Aug 5, 2018
1 parent 33927af commit eab32ae
Show file tree
Hide file tree
Showing 9 changed files with 151 additions and 8 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,6 @@ This plugin provides the following custom rules, which are included as appropria
- [prefer-class-properties](docs/rules/prefer-class-properties.md): Prefer class properties to assignment of literals in constructors.
- [prefer-early-return](docs/rules/prefer-early-return.md): Prefer early returns over full-body conditional wrapping in function declarations.
- [prefer-module-scope-constants](docs/rules/prefer-module-scope-constants.md): Prefer that screaming snake case variables always be defined using `const`, and always appear at module scope.
- [prefer-pascal-case-enums](docs/rules/prefer-pascal-case-enums.md): Prefer TypeScript enums be defined using pascal case.
- [prefer-singular-enums](docs/rules/prefer-singular-enums.md): Prefer TypeScript enums be singular.
- [prefer-twine](docs/rules/prefer-twine.md): Prefer Twine over Bindings as the name for twine imports.
- [react-initialize-state](docs/rules/react-initialize-state.md): Require that React component state be initialized when it has a non-empty type.
- [react-prefer-private-members](docs/rules/react-prefer-private-members.md): Prefer all non-React-specific members be marked private in React class components.
Expand All @@ -136,6 +134,8 @@ This plugin provides the following custom rules, which are included as appropria
- [sinon-no-restricted-features](docs/rules/sinon-no-restricted-features.md): Restrict the use of specified sinon features.
- [sinon-prefer-meaningful-assertions](docs/rules/sinon-prefer-meaningful-assertions.md): Require the use of meaningful sinon assertions through sinon.assert or sinon-chai.
- [strict-component-boundaries](docs/rules/strict-component-boundaries.md): Prevent module imports between components.
- [typescipt/prefer-pascal-case-enums](docs/rules/typescipt/prefer-pascal-case-enums.md): Prefer TypeScript enums be defined using pascal case.
- [typescipt/prefer-singular-enums](docs/rules/typescipt/prefer-singular-enums.md): Prefer TypeScript enums be singular.
- [webpack/no-unnamed-dynamic-imports](docs/rules/webpack/no-unnamed-dynamic-imports.md): Require that all dynamic imports contain a `webpackChunkName` comment.

## Creating New Rules
Expand Down
33 changes: 33 additions & 0 deletions docs/rules/typescript/prefer-pascal-case-enums.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Enforce pascal case when naming enums. (prefer-pascal-case-enums)

Provides consistency when naming [Enums](https://www.typescriptlang.org/docs/handbook/enums.html) within TypeScript code.

## Rule Details

This rule enforces all TypeScript Enums to be in pascal case. An error will occur if another capitalization rule is used (such as snake case or lowercase) when naming TypeScript Enums.

Examples of **incorrect** code for this rule:

```ts
enum sortorder {
most_recent,
LEAST_RECENT,
newest,
OLDEST
}
```

Examples of **correct** code for this rule:

```ts
enum SortOrder {
MostRecent,
LeastRecent,
Newest,
Oldest
}
```

## When Not To Use It

If you have established coding standards using a different naming convention for TypeScript Enums, you can safely disable this rule.
31 changes: 31 additions & 0 deletions docs/rules/typescript/prefer-singular-enums.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Prefer singular TypeScript enums. (prefer-singular-enums)

Provides consistency when naming [enums](https://www.typescriptlang.org/docs/handbook/enums.html) within TypeScript code.

## Rule Details

This rule enforces all TypeScript enums to be singular. An error will occur if the enum is defined with a pluralized name.

Examples of **incorrect** code for this rule:

```ts
enum Pages {
Products,
Orders,
Discounts,
}
```

Examples of **correct** code for this rule:

```ts
enum Page {
Products,
Orders,
Discounts,
}
```

## When Not To Use It

If you have established coding standards using a different naming convention for TypeScript enums, you can safely disable this rule.
4 changes: 2 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ module.exports = {
'prefer-class-properties': require('./lib/rules/prefer-class-properties'),
'prefer-early-return': require('./lib/rules/prefer-early-return'),
'prefer-module-scope-constants': require('./lib/rules/prefer-module-scope-constants'),
'prefer-pascal-case-enums': require('./lib/rules/prefer-pascal-case-enums'),
'prefer-singular-enums': require('./lib/rules/prefer-singular-enums'),
'prefer-twine': require('./lib/rules/prefer-twine'),
'react-initialize-state': require('./lib/rules/react-initialize-state'),
'react-prefer-private-members': require('./lib/rules/react-prefer-private-members'),
Expand All @@ -25,6 +23,8 @@ module.exports = {
'sinon-no-restricted-features': require('./lib/rules/sinon-no-restricted-features'),
'sinon-prefer-meaningful-assertions': require('./lib/rules/sinon-prefer-meaningful-assertions'),
'strict-component-boundaries': require('./lib/rules/strict-component-boundaries'),
'typescript/prefer-pascal-case-enums': require('./lib/rules/typescript/prefer-pascal-case-enums'),
'typescript/prefer-singular-enums': require('./lib/rules/typescript/prefer-singular-enums'),
'webpack/no-unnamed-dynamic-imports': require('./lib/rules/webpack/no-unnamed-dynamic-imports'),
},

Expand Down
4 changes: 2 additions & 2 deletions lib/config/rules/typescript.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,8 @@ module.exports = {
'getter-return': 'off',

// Prefer TypeScript enums be defined using pascal case
'shopify/prefer-pascal-case-enums': 'error',
'shopify/typescript/prefer-pascal-case-enums': 'error',
// Prefer TypeScript enums be defined using singular names
'shopify/prefer-singular-enums': 'error',
'shopify/typescript/prefer-singular-enums': 'error',
// Prefer Twine over Bindings as the name for twine imports.
};
46 changes: 46 additions & 0 deletions lib/rules/typescript/prefer-pascal-case-enums.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
const pascalCase = require('pascal-case');

module.exports = {
meta: {
docs: {
description: 'Enforce pascal case when naming enums.',
category: 'Stylistic Issues',
recommended: false,
uri:
'https://github.com/Shopify/eslint-plugin-shopify/blob/master/docs/rules/typescript/prefer-pascal-case-enums.md',
},
fixable: null,
},
create(context) {
function report(node) {
const {name} = node;

context.report({
node,
message: `Enum '{{name}}' should use pascal case.`,
data: {name},
});
}

return {
Identifier(node) {
if (
node.parent.type !== 'TSEnumMember' &&
node.parent.type !== 'TSEnumDeclaration'
) {
return;
}

if (isPascalCase(node)) {
return;
}

report(node);
},
};
},
};

function isPascalCase({name}) {
return name === pascalCase(name);
}
33 changes: 33 additions & 0 deletions lib/rules/typescript/prefer-singular-enums.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
const pluralize = require('pluralize');

module.exports = {
meta: {
docs: {
description: 'Prefer singular TypeScript enums.',
category: 'Stylistic Issues',
recommended: false,
uri:
'https://github.com/Shopify/eslint-plugin-shopify/blob/master/docs/rules/typescript/prefer-singular-enums.md',
},
fixable: null,
},
create(context) {
return {
TSEnumDeclaration(node) {
const {
id: {name},
} = node;

if (pluralize.isSingular(name)) {
return;
}

context.report({
node,
message: `Enum '{{name}}' should be singular.`,
data: {name},
});
},
};
},
};
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const {RuleTester} = require('eslint');

const rule = require('../../../lib/rules/prefer-pascal-case-enums');
const rule = require('../../../../lib/rules/typescript/prefer-pascal-case-enums');

const ruleTester = new RuleTester();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const {RuleTester} = require('eslint');

const rule = require('../../../lib/rules/prefer-singular-enums');
const rule = require('../../../../lib/rules/typescript/prefer-singular-enums');

const ruleTester = new RuleTester();

Expand Down

0 comments on commit eab32ae

Please sign in to comment.