@atlaskit/eslint-plugin-platform 0.7.4 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/rules/ensure-valid-workspace-protocol-usage/index.js +65 -0
- package/dist/cjs/rules/no-module-level-eval-nav4/index.js +1 -1
- package/dist/es2019/index.js +2 -0
- package/dist/es2019/rules/ensure-valid-workspace-protocol-usage/index.js +59 -0
- package/dist/es2019/rules/no-module-level-eval-nav4/index.js +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/rules/ensure-valid-workspace-protocol-usage/index.js +59 -0
- package/dist/esm/rules/no-module-level-eval-nav4/index.js +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/rules/ensure-valid-workspace-protocol-usage/index.d.ts +3 -0
- package/dist/types-ts4.5/index.d.ts +1 -0
- package/dist/types-ts4.5/rules/ensure-valid-workspace-protocol-usage/index.d.ts +3 -0
- package/package.json +1 -1
- package/src/index.tsx +2 -0
- package/src/rules/ensure-valid-workspace-protocol-usage/__tests__/unit/rule.test.ts +99 -0
- package/src/rules/ensure-valid-workspace-protocol-usage/index.ts +67 -0
- package/src/rules/no-module-level-eval-nav4/index.tsx +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @atlaskit/eslint-plugin-platform
|
|
2
2
|
|
|
3
|
+
## 0.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#143784](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/143784)
|
|
8
|
+
[`dd1180ff23e22`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/dd1180ff23e22) -
|
|
9
|
+
Created new rule `@atlaskit/platform/ensure-valid-workspace-protocol-usage` which validates the
|
|
10
|
+
yarn workspace protocol is only used in private packages.
|
|
11
|
+
|
|
12
|
+
## 0.7.5
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- [#131612](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/131612)
|
|
17
|
+
[`898640d108441`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/898640d108441) -
|
|
18
|
+
Add other nav4 functions to the lint rule for no-module-level-eval-nav4
|
|
19
|
+
|
|
3
20
|
## 0.7.4
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
package/dist/cjs/index.js
CHANGED
|
@@ -15,6 +15,7 @@ var _noDuplicateDependencies = _interopRequireDefault(require("./rules/no-duplic
|
|
|
15
15
|
var _noInvalidFeatureFlagUsage = _interopRequireDefault(require("./rules/no-invalid-feature-flag-usage"));
|
|
16
16
|
var _ensureFeatureFlagPrefix = _interopRequireDefault(require("./rules/ensure-feature-flag-prefix"));
|
|
17
17
|
var _ensureCriticalDependencyResolutions = _interopRequireDefault(require("./rules/ensure-critical-dependency-resolutions"));
|
|
18
|
+
var _ensureValidWorkspaceProtocolUsage = _interopRequireDefault(require("./rules/ensure-valid-workspace-protocol-usage"));
|
|
18
19
|
var _noInvalidStorybookDecoratorUsage = _interopRequireDefault(require("./rules/no-invalid-storybook-decorator-usage"));
|
|
19
20
|
var _ensurePublishValid = _interopRequireDefault(require("./rules/ensure-publish-valid"));
|
|
20
21
|
var _ensureNativeAndAfExportsSynced = _interopRequireDefault(require("./rules/ensure-native-and-af-exports-synced"));
|
|
@@ -35,6 +36,7 @@ var rules = exports.rules = {
|
|
|
35
36
|
'ensure-test-runner-nested-count': _ensureTestRunnerNestedCount.default,
|
|
36
37
|
'ensure-atlassian-team': _ensureAtlassianTeam.default,
|
|
37
38
|
'ensure-critical-dependency-resolutions': _ensureCriticalDependencyResolutions.default,
|
|
39
|
+
'ensure-valid-workspace-protocol-usage': _ensureValidWorkspaceProtocolUsage.default,
|
|
38
40
|
'no-duplicate-dependencies': _noDuplicateDependencies.default,
|
|
39
41
|
'no-invalid-feature-flag-usage': _noInvalidFeatureFlagUsage.default,
|
|
40
42
|
'no-pre-post-install-scripts': _noPrePostInstalls.default,
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _handleAstObject = require("../util/handle-ast-object");
|
|
8
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
9
|
+
|
|
10
|
+
var workspaceProtocolRegex = /^workspace:[\^~\*]$/;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Checks if the workspace protocol is used in either dependencies or devDependencies
|
|
14
|
+
*/
|
|
15
|
+
function checkIsWorkspaceProtocolUsed(node) {
|
|
16
|
+
var dependencies = (0, _handleAstObject.getObjectPropertyAsObject)(node, 'dependencies');
|
|
17
|
+
var devDependencies = (0, _handleAstObject.getObjectPropertyAsObject)(node, 'devDependencies');
|
|
18
|
+
return [dependencies, devDependencies].some(function (obj) {
|
|
19
|
+
return obj !== null && obj.properties.some(function (p) {
|
|
20
|
+
if (p.type === 'Property' && p.value.type === 'Literal') {
|
|
21
|
+
return typeof p.value.value === 'string' && workspaceProtocolRegex.test(p.value.value);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
var rule = {
|
|
27
|
+
meta: {
|
|
28
|
+
type: 'problem',
|
|
29
|
+
docs: {
|
|
30
|
+
description: "Ensures the workspace protocol is only used in private packages.",
|
|
31
|
+
recommended: true
|
|
32
|
+
},
|
|
33
|
+
hasSuggestions: false,
|
|
34
|
+
messages: {
|
|
35
|
+
invalidWorkspaceProtocolUsage: "The workspace protocol can not be used in public packages."
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
create: function create(context) {
|
|
39
|
+
var fileName = context.getFilename();
|
|
40
|
+
return {
|
|
41
|
+
ObjectExpression: function ObjectExpression(node) {
|
|
42
|
+
if (!fileName.endsWith('package.json') || node.type !== 'ObjectExpression') {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Exit early if we are linting a private package
|
|
47
|
+
var isPrivatePackage = (0, _handleAstObject.getObjectPropertyAsLiteral)(node, 'private') === true;
|
|
48
|
+
if (isPrivatePackage) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Check if the workspace protocol is used in either dependencies or devDependencies
|
|
53
|
+
var isWorkspaceProtocolused = checkIsWorkspaceProtocolUsed(node);
|
|
54
|
+
if (!isWorkspaceProtocolused) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
return context.report({
|
|
58
|
+
node: node,
|
|
59
|
+
messageId: 'invalidWorkspaceProtocolUsage'
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
var _default = exports.default = rule;
|
|
@@ -15,7 +15,7 @@ var featureLibraryFunctions = new Set([
|
|
|
15
15
|
*
|
|
16
16
|
* Slack thread: https://atlassian.slack.com/archives/CFGLH1ZS8/p1726449739284819
|
|
17
17
|
*/
|
|
18
|
-
'isVisualRefreshEnabled', 'getWillShowNav4']);
|
|
18
|
+
'isVisualRefreshEnabled', 'getMetaBoolean', 'getNav4Rollout', 'getWillShowNav3', 'getWillShowNav4', 'getWillShowNav4UserOptIn', 'getWillShowNav4UserOptOut']);
|
|
19
19
|
var isInFunctionLevel = function isInFunctionLevel(context) {
|
|
20
20
|
var scope = context.getScope();
|
|
21
21
|
while (((_scope = scope) === null || _scope === void 0 ? void 0 : _scope.type) !== 'module' && ((_scope2 = scope) === null || _scope2 === void 0 ? void 0 : _scope2.type) !== 'global') {
|
package/dist/es2019/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import noDuplicateDependencies from './rules/no-duplicate-dependencies';
|
|
|
9
9
|
import noInvalidFeatureFlagUsage from './rules/no-invalid-feature-flag-usage';
|
|
10
10
|
import ensureFeatureFlagPrefix from './rules/ensure-feature-flag-prefix';
|
|
11
11
|
import ensureCriticalDependencyResolutions from './rules/ensure-critical-dependency-resolutions';
|
|
12
|
+
import ensureValidWorkspaceProtocolUsage from './rules/ensure-valid-workspace-protocol-usage';
|
|
12
13
|
import noInvalidStorybookDecoratorUsage from './rules/no-invalid-storybook-decorator-usage';
|
|
13
14
|
import ensurePublishValid from './rules/ensure-publish-valid';
|
|
14
15
|
import ensureNativeAndAfExportsSynced from './rules/ensure-native-and-af-exports-synced';
|
|
@@ -27,6 +28,7 @@ export const rules = {
|
|
|
27
28
|
'ensure-test-runner-nested-count': ensureTestRunnerNestedCount,
|
|
28
29
|
'ensure-atlassian-team': ensureAtlassianTeam,
|
|
29
30
|
'ensure-critical-dependency-resolutions': ensureCriticalDependencyResolutions,
|
|
31
|
+
'ensure-valid-workspace-protocol-usage': ensureValidWorkspaceProtocolUsage,
|
|
30
32
|
'no-duplicate-dependencies': noDuplicateDependencies,
|
|
31
33
|
'no-invalid-feature-flag-usage': noInvalidFeatureFlagUsage,
|
|
32
34
|
'no-pre-post-install-scripts': noPreAndPostInstallScripts,
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
+
|
|
3
|
+
import { getObjectPropertyAsObject, getObjectPropertyAsLiteral } from '../util/handle-ast-object';
|
|
4
|
+
const workspaceProtocolRegex = /^workspace:[\^~\*]$/;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Checks if the workspace protocol is used in either dependencies or devDependencies
|
|
8
|
+
*/
|
|
9
|
+
function checkIsWorkspaceProtocolUsed(node) {
|
|
10
|
+
const dependencies = getObjectPropertyAsObject(node, 'dependencies');
|
|
11
|
+
const devDependencies = getObjectPropertyAsObject(node, 'devDependencies');
|
|
12
|
+
return [dependencies, devDependencies].some(obj => {
|
|
13
|
+
return obj !== null && obj.properties.some(p => {
|
|
14
|
+
if (p.type === 'Property' && p.value.type === 'Literal') {
|
|
15
|
+
return typeof p.value.value === 'string' && workspaceProtocolRegex.test(p.value.value);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
const rule = {
|
|
21
|
+
meta: {
|
|
22
|
+
type: 'problem',
|
|
23
|
+
docs: {
|
|
24
|
+
description: `Ensures the workspace protocol is only used in private packages.`,
|
|
25
|
+
recommended: true
|
|
26
|
+
},
|
|
27
|
+
hasSuggestions: false,
|
|
28
|
+
messages: {
|
|
29
|
+
invalidWorkspaceProtocolUsage: `The workspace protocol can not be used in public packages.`
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
create(context) {
|
|
33
|
+
const fileName = context.getFilename();
|
|
34
|
+
return {
|
|
35
|
+
ObjectExpression: node => {
|
|
36
|
+
if (!fileName.endsWith('package.json') || node.type !== 'ObjectExpression') {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Exit early if we are linting a private package
|
|
41
|
+
const isPrivatePackage = getObjectPropertyAsLiteral(node, 'private') === true;
|
|
42
|
+
if (isPrivatePackage) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Check if the workspace protocol is used in either dependencies or devDependencies
|
|
47
|
+
const isWorkspaceProtocolused = checkIsWorkspaceProtocolUsed(node);
|
|
48
|
+
if (!isWorkspaceProtocolused) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
return context.report({
|
|
52
|
+
node,
|
|
53
|
+
messageId: 'invalidWorkspaceProtocolUsage'
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
export default rule;
|
|
@@ -9,7 +9,7 @@ const featureLibraryFunctions = new Set([
|
|
|
9
9
|
*
|
|
10
10
|
* Slack thread: https://atlassian.slack.com/archives/CFGLH1ZS8/p1726449739284819
|
|
11
11
|
*/
|
|
12
|
-
'isVisualRefreshEnabled', 'getWillShowNav4']);
|
|
12
|
+
'isVisualRefreshEnabled', 'getMetaBoolean', 'getNav4Rollout', 'getWillShowNav3', 'getWillShowNav4', 'getWillShowNav4UserOptIn', 'getWillShowNav4UserOptOut']);
|
|
13
13
|
const isInFunctionLevel = context => {
|
|
14
14
|
let scope = context.getScope();
|
|
15
15
|
while (((_scope = scope) === null || _scope === void 0 ? void 0 : _scope.type) !== 'module' && ((_scope2 = scope) === null || _scope2 === void 0 ? void 0 : _scope2.type) !== 'global') {
|
package/dist/esm/index.js
CHANGED
|
@@ -12,6 +12,7 @@ import noDuplicateDependencies from './rules/no-duplicate-dependencies';
|
|
|
12
12
|
import noInvalidFeatureFlagUsage from './rules/no-invalid-feature-flag-usage';
|
|
13
13
|
import ensureFeatureFlagPrefix from './rules/ensure-feature-flag-prefix';
|
|
14
14
|
import ensureCriticalDependencyResolutions from './rules/ensure-critical-dependency-resolutions';
|
|
15
|
+
import ensureValidWorkspaceProtocolUsage from './rules/ensure-valid-workspace-protocol-usage';
|
|
15
16
|
import noInvalidStorybookDecoratorUsage from './rules/no-invalid-storybook-decorator-usage';
|
|
16
17
|
import ensurePublishValid from './rules/ensure-publish-valid';
|
|
17
18
|
import ensureNativeAndAfExportsSynced from './rules/ensure-native-and-af-exports-synced';
|
|
@@ -30,6 +31,7 @@ export var rules = {
|
|
|
30
31
|
'ensure-test-runner-nested-count': ensureTestRunnerNestedCount,
|
|
31
32
|
'ensure-atlassian-team': ensureAtlassianTeam,
|
|
32
33
|
'ensure-critical-dependency-resolutions': ensureCriticalDependencyResolutions,
|
|
34
|
+
'ensure-valid-workspace-protocol-usage': ensureValidWorkspaceProtocolUsage,
|
|
33
35
|
'no-duplicate-dependencies': noDuplicateDependencies,
|
|
34
36
|
'no-invalid-feature-flag-usage': noInvalidFeatureFlagUsage,
|
|
35
37
|
'no-pre-post-install-scripts': noPreAndPostInstallScripts,
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
+
|
|
3
|
+
import { getObjectPropertyAsObject, getObjectPropertyAsLiteral } from '../util/handle-ast-object';
|
|
4
|
+
var workspaceProtocolRegex = /^workspace:[\^~\*]$/;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Checks if the workspace protocol is used in either dependencies or devDependencies
|
|
8
|
+
*/
|
|
9
|
+
function checkIsWorkspaceProtocolUsed(node) {
|
|
10
|
+
var dependencies = getObjectPropertyAsObject(node, 'dependencies');
|
|
11
|
+
var devDependencies = getObjectPropertyAsObject(node, 'devDependencies');
|
|
12
|
+
return [dependencies, devDependencies].some(function (obj) {
|
|
13
|
+
return obj !== null && obj.properties.some(function (p) {
|
|
14
|
+
if (p.type === 'Property' && p.value.type === 'Literal') {
|
|
15
|
+
return typeof p.value.value === 'string' && workspaceProtocolRegex.test(p.value.value);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
var rule = {
|
|
21
|
+
meta: {
|
|
22
|
+
type: 'problem',
|
|
23
|
+
docs: {
|
|
24
|
+
description: "Ensures the workspace protocol is only used in private packages.",
|
|
25
|
+
recommended: true
|
|
26
|
+
},
|
|
27
|
+
hasSuggestions: false,
|
|
28
|
+
messages: {
|
|
29
|
+
invalidWorkspaceProtocolUsage: "The workspace protocol can not be used in public packages."
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
create: function create(context) {
|
|
33
|
+
var fileName = context.getFilename();
|
|
34
|
+
return {
|
|
35
|
+
ObjectExpression: function ObjectExpression(node) {
|
|
36
|
+
if (!fileName.endsWith('package.json') || node.type !== 'ObjectExpression') {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Exit early if we are linting a private package
|
|
41
|
+
var isPrivatePackage = getObjectPropertyAsLiteral(node, 'private') === true;
|
|
42
|
+
if (isPrivatePackage) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Check if the workspace protocol is used in either dependencies or devDependencies
|
|
47
|
+
var isWorkspaceProtocolused = checkIsWorkspaceProtocolUsed(node);
|
|
48
|
+
if (!isWorkspaceProtocolused) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
return context.report({
|
|
52
|
+
node: node,
|
|
53
|
+
messageId: 'invalidWorkspaceProtocolUsage'
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
export default rule;
|
|
@@ -9,7 +9,7 @@ var featureLibraryFunctions = new Set([
|
|
|
9
9
|
*
|
|
10
10
|
* Slack thread: https://atlassian.slack.com/archives/CFGLH1ZS8/p1726449739284819
|
|
11
11
|
*/
|
|
12
|
-
'isVisualRefreshEnabled', 'getWillShowNav4']);
|
|
12
|
+
'isVisualRefreshEnabled', 'getMetaBoolean', 'getNav4Rollout', 'getWillShowNav3', 'getWillShowNav4', 'getWillShowNav4UserOptIn', 'getWillShowNav4UserOptOut']);
|
|
13
13
|
var isInFunctionLevel = function isInFunctionLevel(context) {
|
|
14
14
|
var scope = context.getScope();
|
|
15
15
|
while (((_scope = scope) === null || _scope === void 0 ? void 0 : _scope.type) !== 'module' && ((_scope2 = scope) === null || _scope2 === void 0 ? void 0 : _scope2.type) !== 'global') {
|
package/dist/types/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export declare const rules: {
|
|
|
6
6
|
'ensure-test-runner-nested-count': import("eslint").Rule.RuleModule;
|
|
7
7
|
'ensure-atlassian-team': import("eslint").Rule.RuleModule;
|
|
8
8
|
'ensure-critical-dependency-resolutions': import("eslint").Rule.RuleModule;
|
|
9
|
+
'ensure-valid-workspace-protocol-usage': import("eslint").Rule.RuleModule;
|
|
9
10
|
'no-duplicate-dependencies': import("eslint").Rule.RuleModule;
|
|
10
11
|
'no-invalid-feature-flag-usage': import("eslint").Rule.RuleModule;
|
|
11
12
|
'no-pre-post-install-scripts': import("eslint").Rule.RuleModule;
|
|
@@ -6,6 +6,7 @@ export declare const rules: {
|
|
|
6
6
|
'ensure-test-runner-nested-count': import("eslint").Rule.RuleModule;
|
|
7
7
|
'ensure-atlassian-team': import("eslint").Rule.RuleModule;
|
|
8
8
|
'ensure-critical-dependency-resolutions': import("eslint").Rule.RuleModule;
|
|
9
|
+
'ensure-valid-workspace-protocol-usage': import("eslint").Rule.RuleModule;
|
|
9
10
|
'no-duplicate-dependencies': import("eslint").Rule.RuleModule;
|
|
10
11
|
'no-invalid-feature-flag-usage': import("eslint").Rule.RuleModule;
|
|
11
12
|
'no-pre-post-install-scripts': import("eslint").Rule.RuleModule;
|
package/package.json
CHANGED
package/src/index.tsx
CHANGED
|
@@ -9,6 +9,7 @@ import noDuplicateDependencies from './rules/no-duplicate-dependencies';
|
|
|
9
9
|
import noInvalidFeatureFlagUsage from './rules/no-invalid-feature-flag-usage';
|
|
10
10
|
import ensureFeatureFlagPrefix from './rules/ensure-feature-flag-prefix';
|
|
11
11
|
import ensureCriticalDependencyResolutions from './rules/ensure-critical-dependency-resolutions';
|
|
12
|
+
import ensureValidWorkspaceProtocolUsage from './rules/ensure-valid-workspace-protocol-usage';
|
|
12
13
|
import noInvalidStorybookDecoratorUsage from './rules/no-invalid-storybook-decorator-usage';
|
|
13
14
|
import ensurePublishValid from './rules/ensure-publish-valid';
|
|
14
15
|
import ensureNativeAndAfExportsSynced from './rules/ensure-native-and-af-exports-synced';
|
|
@@ -28,6 +29,7 @@ export const rules = {
|
|
|
28
29
|
'ensure-test-runner-nested-count': ensureTestRunnerNestedCount,
|
|
29
30
|
'ensure-atlassian-team': ensureAtlassianTeam,
|
|
30
31
|
'ensure-critical-dependency-resolutions': ensureCriticalDependencyResolutions,
|
|
32
|
+
'ensure-valid-workspace-protocol-usage': ensureValidWorkspaceProtocolUsage,
|
|
31
33
|
'no-duplicate-dependencies': noDuplicateDependencies,
|
|
32
34
|
'no-invalid-feature-flag-usage': noInvalidFeatureFlagUsage,
|
|
33
35
|
'no-pre-post-install-scripts': noPreAndPostInstallScripts,
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { tester } from '../../../../__tests__/utils/_tester';
|
|
2
|
+
import rule from '../../index';
|
|
3
|
+
|
|
4
|
+
const cwd = process.cwd();
|
|
5
|
+
|
|
6
|
+
describe('test ensure-valid-workspace-protocol-usage rule', () => {
|
|
7
|
+
tester.run('ensure-valid-workspace-protocol-usage', rule, {
|
|
8
|
+
// Workspace protocol is allowed in private packages as dependencies
|
|
9
|
+
valid: [
|
|
10
|
+
{
|
|
11
|
+
code: `const foo = {
|
|
12
|
+
"private": true,
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@atlaskit/button": "workspace:^",
|
|
15
|
+
"@atlaskit/primitives": "workspace:*",
|
|
16
|
+
"@atlaskit/tokens": "workspace:*"
|
|
17
|
+
}
|
|
18
|
+
}`,
|
|
19
|
+
filename: `${cwd}/packages/foo/package.json`,
|
|
20
|
+
},
|
|
21
|
+
// Workspace protocol is allowed in private packages as devDependencies
|
|
22
|
+
{
|
|
23
|
+
code: `const foo = {
|
|
24
|
+
"private": true,
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@atlaskit/button": "workspace:^",
|
|
27
|
+
"@atlaskit/primitives": "workspace:^"
|
|
28
|
+
}
|
|
29
|
+
}`,
|
|
30
|
+
filename: `${cwd}/packages/foo/package.json`,
|
|
31
|
+
},
|
|
32
|
+
// Workspace protocol is allowed in private packages dependencies and devDependencies
|
|
33
|
+
{
|
|
34
|
+
code: `const foo = {
|
|
35
|
+
"private": true,
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@atlaskit/button": "workspace:^",
|
|
38
|
+
"@atlaskit/primitives": "workspace:^"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@atlaskit/button": "workspace:^",
|
|
42
|
+
"@atlaskit/primitives": "workspace:^"
|
|
43
|
+
}
|
|
44
|
+
}`,
|
|
45
|
+
filename: `${cwd}/packages/foo/package.json`,
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
invalid: [
|
|
49
|
+
// Workspace protocol is not allowed in public packages as dependencies
|
|
50
|
+
{
|
|
51
|
+
code: `const foo = {
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@atlaskit/button": "workspace:^",
|
|
54
|
+
"@atlaskit/primitives": "workspace:*",
|
|
55
|
+
"@atlaskit/tokens": "workspace:*"
|
|
56
|
+
}
|
|
57
|
+
}`,
|
|
58
|
+
filename: `${cwd}/packages/foo/package.json`,
|
|
59
|
+
errors: [
|
|
60
|
+
{
|
|
61
|
+
messageId: 'invalidWorkspaceProtocolUsage',
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
// Workspace protocol is not allowed in public packages as devDependencies
|
|
66
|
+
{
|
|
67
|
+
code: `const foo = {
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@atlaskit/button": "workspace:^",
|
|
70
|
+
"@atlaskit/primitives": "^1.0.0"
|
|
71
|
+
}
|
|
72
|
+
}`,
|
|
73
|
+
filename: `${cwd}/packages/foo/package.json`,
|
|
74
|
+
errors: [
|
|
75
|
+
{
|
|
76
|
+
messageId: 'invalidWorkspaceProtocolUsage',
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
// Workspace protocol is not allowed in public packages as dependencies and devDependencies
|
|
81
|
+
{
|
|
82
|
+
code: `const foo = {
|
|
83
|
+
"dependencies": {
|
|
84
|
+
"@atlaskit/button": "workspace:^"
|
|
85
|
+
},
|
|
86
|
+
"devDependencies": {
|
|
87
|
+
"@atlaskit/primitives": "workspace:^"
|
|
88
|
+
}
|
|
89
|
+
}`,
|
|
90
|
+
filename: `${cwd}/packages/foo/package.json`,
|
|
91
|
+
errors: [
|
|
92
|
+
{
|
|
93
|
+
messageId: 'invalidWorkspaceProtocolUsage',
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
+
import type { Rule } from 'eslint';
|
|
3
|
+
import type { ObjectExpression } from 'estree';
|
|
4
|
+
import { getObjectPropertyAsObject, getObjectPropertyAsLiteral } from '../util/handle-ast-object';
|
|
5
|
+
|
|
6
|
+
const workspaceProtocolRegex = /^workspace:[\^~\*]$/;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Checks if the workspace protocol is used in either dependencies or devDependencies
|
|
10
|
+
*/
|
|
11
|
+
function checkIsWorkspaceProtocolUsed(node: ObjectExpression) {
|
|
12
|
+
const dependencies = getObjectPropertyAsObject(node, 'dependencies');
|
|
13
|
+
const devDependencies = getObjectPropertyAsObject(node, 'devDependencies');
|
|
14
|
+
return [dependencies, devDependencies].some((obj) => {
|
|
15
|
+
return (
|
|
16
|
+
obj !== null &&
|
|
17
|
+
obj.properties.some((p) => {
|
|
18
|
+
if (p.type === 'Property' && p.value.type === 'Literal') {
|
|
19
|
+
return typeof p.value.value === 'string' && workspaceProtocolRegex.test(p.value.value);
|
|
20
|
+
}
|
|
21
|
+
})
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const rule: Rule.RuleModule = {
|
|
27
|
+
meta: {
|
|
28
|
+
type: 'problem',
|
|
29
|
+
docs: {
|
|
30
|
+
description: `Ensures the workspace protocol is only used in private packages.`,
|
|
31
|
+
recommended: true,
|
|
32
|
+
},
|
|
33
|
+
hasSuggestions: false,
|
|
34
|
+
messages: {
|
|
35
|
+
invalidWorkspaceProtocolUsage: `The workspace protocol can not be used in public packages.`,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
create(context) {
|
|
39
|
+
const fileName = context.getFilename();
|
|
40
|
+
return {
|
|
41
|
+
ObjectExpression: (node: Rule.Node) => {
|
|
42
|
+
if (!fileName.endsWith('package.json') || node.type !== 'ObjectExpression') {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Exit early if we are linting a private package
|
|
47
|
+
const isPrivatePackage = getObjectPropertyAsLiteral(node, 'private') === true;
|
|
48
|
+
if (isPrivatePackage) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Check if the workspace protocol is used in either dependencies or devDependencies
|
|
53
|
+
const isWorkspaceProtocolused = checkIsWorkspaceProtocolUsed(node);
|
|
54
|
+
if (!isWorkspaceProtocolused) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return context.report({
|
|
59
|
+
node,
|
|
60
|
+
messageId: 'invalidWorkspaceProtocolUsage',
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export default rule;
|
|
@@ -13,7 +13,12 @@ const featureLibraryFunctions = new Set([
|
|
|
13
13
|
* Slack thread: https://atlassian.slack.com/archives/CFGLH1ZS8/p1726449739284819
|
|
14
14
|
*/
|
|
15
15
|
'isVisualRefreshEnabled',
|
|
16
|
+
'getMetaBoolean',
|
|
17
|
+
'getNav4Rollout',
|
|
18
|
+
'getWillShowNav3',
|
|
16
19
|
'getWillShowNav4',
|
|
20
|
+
'getWillShowNav4UserOptIn',
|
|
21
|
+
'getWillShowNav4UserOptOut',
|
|
17
22
|
]);
|
|
18
23
|
|
|
19
24
|
const isInFunctionLevel = (context: Rule.RuleContext) => {
|