Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions maintenance/projects/senna/.eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ module.exports = {
rules: {
'@liferay/no-abbreviations': 'off',
'@liferay/no-it-should': 'warn',
'@liferay/no-use-strict-in-module': 'off',
'curly': 'warn',
'default-case': 'warn',
'no-console': 'warn',
Expand Down
2 changes: 2 additions & 0 deletions projects/eslint-plugin/configs/general.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,14 @@ const config = {
'@liferay/imports-first': 'error',
'@liferay/no-abbreviations': 'error',
'@liferay/no-absolute-import': 'error',
'@liferay/no-anonymous-exports': 'error',
'@liferay/no-duplicate-imports': 'error',
'@liferay/no-dynamic-require': 'error',
'@liferay/no-get-data-attribute': 'error',
'@liferay/no-it-should': 'error',
'@liferay/no-length-jsx-expression': 'error',
'@liferay/no-require-and-call': 'error',
'@liferay/no-use-strict-in-module': 'error',
'@liferay/padded-test-blocks': 'error',
'@liferay/ref-name-suffix': 'error',
'@liferay/sort-import-destructures': 'error',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Prefer exporting named functions (no-anonymous-exports)

To improve debugging and readability, it is preferable to export named functions to that they can be located in a callstack.

## Rule Details

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

```js
export const x = () => {};

export default () => {};
```

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

```js
export function x() {}

export default function x() {}
```

## See also

- https://github.com/liferay/liferay-frontend-projects/issues/25
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Disallow 'use strict' in es modules (no-use-strict-in-module)

You never need `'use strict'` in an ES module ([spec](http://www.ecma-international.org/ecma-262/6.0/#sec-strict-mode-code)). We can infer if file is an esmodule if it uses export/import syntax.

## Rule Details

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

```js
'use strict';

export default () => {};
```

```js
'use strict';

import foo from 'bar';
```

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

```js
import foo from 'bar';
//...
```

```js
//...
export default foo;
```

```js
//...
export foo;
```

## Further Reading

- [Initial motivation for this rule](https://github.com/liferay/liferay-frontend-projects/issues/20).
2 changes: 2 additions & 0 deletions projects/eslint-plugin/rules/general/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ module.exports = {
'imports-first': require('./lib/rules/imports-first'),
'no-abbreviations': require('./lib/rules/no-abbreviations'),
'no-absolute-import': require('./lib/rules/no-absolute-import'),
'no-anonymous-exports': require('./lib/rules/no-anonymous-exports'),
'no-arrow': require('./lib/rules/no-arrow'),
'no-duplicate-class-names': require('./lib/rules/no-duplicate-class-names'),
'no-duplicate-imports': require('./lib/rules/no-duplicate-imports'),
Expand All @@ -21,6 +22,7 @@ module.exports = {
'no-it-should': require('./lib/rules/no-it-should'),
'no-length-jsx-expression': require('./lib/rules/no-length-jsx-expression'),
'no-require-and-call': require('./lib/rules/no-require-and-call'),
'no-use-strict-in-module': require('./lib/rules/no-use-strict-in-module'),
'padded-test-blocks': require('./lib/rules/padded-test-blocks'),
'ref-name-suffix': require('./lib/rules/ref-name-suffix'),
'sort-class-names': require('./lib/rules/sort-class-names'),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/**
* SPDX-FileCopyrightText: © 2021 Liferay, Inc. <https://liferay.com>
* SPDX-License-Identifier: MIT
*/

module.exports = {
create(context) {
return {
ExportDefaultDeclaration(node) {
if (
node.declaration &&
node.declaration.type === 'ArrowFunctionExpression'
) {
context.report({
message:
"Use named function for export. Example: 'function fooBar() {}'",
node,
});
}
},
ExportNamedDeclaration(node) {
if (
node.declaration &&
node.declaration.type === 'VariableDeclaration' &&
node.declaration.declarations &&
node.declaration.declarations[0] &&
node.declaration.declarations[0].init &&
node.declaration.declarations[0].init.type ===
'ArrowFunctionExpression'
) {
context.report({
message:
"Use named function for export instead of arrow function. Example: 'function fooBar() {}'",
node,
});
}
},
};
},
meta: {
category: 'Best Practices',
description: 'Prefer exporting named functions',
recommended: false,
url: 'https://github.com/liferay/liferay-frontend-projects/issues/25',
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/**
* SPDX-FileCopyrightText: © 2021 Liferay, Inc. <https://liferay.com>
* SPDX-License-Identifier: MIT
*/

const message = `'use strict' is unnecessary inside of modules`;

module.exports = {
create(context) {
const useStrictExpressions = [];
let esModule;

const checkEsModule = () => {
if (!esModule) {
esModule = true;
}
};

return {
'ExportDefaultDeclaration': checkEsModule,
'ExportNamedDeclaration': checkEsModule,
'ExpressionStatement'(node) {
if (
node.expression.type === 'Literal' &&
node.expression.value === 'use strict'
) {
useStrictExpressions.push(node.expression);
}
},
'ImportDeclaration': checkEsModule,
'ImportNamespaceSpecifier': checkEsModule,
'Program:exit': () => {
if (esModule) {
useStrictExpressions.forEach((expression) => {
context.report({
message,
node: expression,
});
});
}
},
};
},

meta: {
docs: {
category: 'Best Practices',
description: message,
recommended: false,
url:
'https://github.com/liferay/liferay-frontend-projects/issues/20',
},
fixable: 'code',
schema: [],
type: 'problem',
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/**
* SPDX-FileCopyrightText: © 2017 Liferay, Inc. <https://liferay.com>
* SPDX-License-Identifier: MIT
*/

const MultiTester = require('../../../../../scripts/MultiTester');
const rule = require('../../../lib/rules/no-anonymous-exports');

const parserOptions = {
parserOptions: {
ecmaVersion: 6,
sourceType: 'module',
},
};

const ruleTester = new MultiTester(parserOptions);

ruleTester.run('no-anonymous-exports', rule, {
invalid: [
{
code: `export const test = () => {}`,
errors: [
{
message:
"Use named function for export instead of arrow function. Example: 'function fooBar() {}'",
type: 'ExportNamedDeclaration',
},
],
},
{
code: `export default () => {}`,
errors: [
{
message:
"Use named function for export. Example: 'function fooBar() {}'",
type: 'ExportDefaultDeclaration',
},
],
},
],
valid: [
{
code: `
export function test() {}
export default function fooBar() {}
`,
},
],
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
/**
* SPDX-FileCopyrightText: © 2017 Liferay, Inc. <https://liferay.com>
* SPDX-License-Identifier: MIT
*/

const MultiTester = require('../../../../../scripts/MultiTester');
const rule = require('../../../lib/rules/no-use-strict-in-module');

const parserOptions = {
parserOptions: {
ecmaVersion: 6,
sourceType: 'module',
},
};

const ruleTester = new MultiTester(parserOptions);

ruleTester.run('no-use-strict-in-module', rule, {
invalid: [
{
code: `
'use strict'

import {test} from 'test';
`,
errors: [
{
message: `'use strict' is unnecessary inside of modules`,
type: 'Literal',
},
],
},
{
code: `
'use strict'

function test() {
'use strict'

return 'test';
}
export default test;
`,
errors: [
{
message: `'use strict' is unnecessary inside of modules`,
type: 'Literal',
},
{
message: `'use strict' is unnecessary inside of modules`,
type: 'Literal',
},
],
},
{
code: `
'use strict'

function test() {}
export {test};
`,
errors: [
{
message: `'use strict' is unnecessary inside of modules`,
type: 'Literal',
},
],
},
],

valid: [
{
code: `
import {test} from 'test';
`,
},
{
code: `
'use strict'

module.export = function test() {}
`,
},
{
code: `
'use strict'

console.log('foo');
`,
},
],
});
4 changes: 2 additions & 2 deletions projects/js-toolkit/packages/dev-server/src/reload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ function setupLiveSession(): void {
const CLOSE_BODY_TAG = '</body>';
const RELOAD_SNIPPET = `<script>(${setupLiveSession.toString()})();</script>`;

export default (content: string): string => {
export default function (content: string): string {
return content.replace(
CLOSE_BODY_TAG,
`${RELOAD_SNIPPET}${CLOSE_BODY_TAG}`
);
};
}