@atlaskit/eslint-plugin-platform 2.7.1 → 2.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 +14 -0
- package/dist/cjs/index.js +17 -9
- package/dist/cjs/rules/constants.js +1 -1
- package/dist/cjs/rules/ensure-critical-dependency-resolutions/index.js +5 -5
- package/dist/cjs/rules/ensure-no-private-dependencies/index.js +48 -66
- package/dist/cjs/rules/feature-gating/inline-usage/index.js +14 -3
- package/dist/cjs/rules/feature-gating/no-alias/index.js +1 -1
- package/dist/cjs/rules/feature-gating/no-module-level-eval/index.js +1 -1
- package/dist/cjs/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
- package/dist/cjs/rules/feature-gating/no-preconditioning/index.js +4 -1
- package/dist/cjs/rules/feature-gating/prefer-fg/index.js +1 -1
- package/dist/cjs/rules/feature-gating/static-feature-flags/index.js +2 -2
- package/dist/cjs/rules/feature-gating/use-recommended-utils/index.js +1 -1
- package/dist/cjs/rules/feature-gating/valid-gate-name/index.js +60 -0
- package/dist/cjs/rules/import/no-barrel-entry-imports/index.js +871 -0
- package/dist/cjs/rules/import/no-barrel-entry-jest-mock/index.js +1384 -0
- package/dist/cjs/rules/import/no-conversation-assistant-barrel-imports/index.js +43 -0
- package/dist/cjs/rules/import/no-jest-mock-barrel-files/index.js +1401 -0
- package/dist/cjs/rules/import/no-relative-barrel-file-imports/index.js +777 -0
- package/dist/cjs/rules/import/shared/barrel-parsing.js +511 -0
- package/dist/cjs/rules/import/shared/file-system.js +186 -0
- package/dist/cjs/rules/import/shared/jest-utils.js +191 -0
- package/dist/cjs/rules/import/shared/package-registry.js +263 -0
- package/dist/cjs/rules/import/shared/package-resolution.js +185 -0
- package/dist/cjs/rules/import/shared/perf.js +89 -0
- package/dist/cjs/rules/import/shared/types.js +67 -0
- package/dist/cjs/rules/no-invalid-storybook-decorator-usage/index.js +1 -1
- package/dist/cjs/rules/no-sparse-checkout/index.js +1 -1
- package/dist/cjs/rules/prefer-crypto-random-uuid/index.js +87 -0
- package/dist/cjs/rules/use-entrypoints-in-examples/index.js +1 -1
- package/dist/es2019/index.js +17 -9
- package/dist/es2019/rules/constants.js +1 -1
- package/dist/es2019/rules/ensure-critical-dependency-resolutions/index.js +5 -5
- package/dist/es2019/rules/ensure-no-private-dependencies/index.js +10 -9
- package/dist/es2019/rules/feature-gating/inline-usage/index.js +14 -3
- package/dist/es2019/rules/feature-gating/no-alias/index.js +1 -1
- package/dist/es2019/rules/feature-gating/no-module-level-eval/index.js +1 -1
- package/dist/es2019/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
- package/dist/es2019/rules/feature-gating/no-preconditioning/index.js +4 -1
- package/dist/es2019/rules/feature-gating/prefer-fg/index.js +1 -1
- package/dist/es2019/rules/feature-gating/static-feature-flags/index.js +2 -2
- package/dist/es2019/rules/feature-gating/use-recommended-utils/index.js +1 -1
- package/dist/es2019/rules/feature-gating/valid-gate-name/index.js +52 -0
- package/dist/es2019/rules/import/no-barrel-entry-imports/index.js +801 -0
- package/dist/es2019/rules/import/no-barrel-entry-jest-mock/index.js +1113 -0
- package/dist/es2019/rules/import/no-conversation-assistant-barrel-imports/index.js +37 -0
- package/dist/es2019/rules/import/no-jest-mock-barrel-files/index.js +1179 -0
- package/dist/es2019/rules/import/no-relative-barrel-file-imports/index.js +738 -0
- package/dist/es2019/rules/import/shared/barrel-parsing.js +433 -0
- package/dist/es2019/rules/import/shared/file-system.js +174 -0
- package/dist/es2019/rules/import/shared/jest-utils.js +159 -0
- package/dist/es2019/rules/import/shared/package-registry.js +240 -0
- package/dist/es2019/rules/import/shared/package-resolution.js +161 -0
- package/dist/es2019/rules/import/shared/perf.js +83 -0
- package/dist/es2019/rules/import/shared/types.js +57 -0
- package/dist/es2019/rules/no-invalid-storybook-decorator-usage/index.js +1 -1
- package/dist/es2019/rules/no-sparse-checkout/index.js +1 -1
- package/dist/es2019/rules/prefer-crypto-random-uuid/index.js +81 -0
- package/dist/es2019/rules/use-entrypoints-in-examples/index.js +1 -1
- package/dist/esm/index.js +17 -9
- package/dist/esm/rules/constants.js +1 -1
- package/dist/esm/rules/ensure-critical-dependency-resolutions/index.js +5 -5
- package/dist/esm/rules/ensure-no-private-dependencies/index.js +48 -65
- package/dist/esm/rules/feature-gating/inline-usage/index.js +14 -3
- package/dist/esm/rules/feature-gating/no-alias/index.js +1 -1
- package/dist/esm/rules/feature-gating/no-module-level-eval/index.js +1 -1
- package/dist/esm/rules/feature-gating/no-module-level-eval-nav4/index.js +1 -1
- package/dist/esm/rules/feature-gating/no-preconditioning/index.js +4 -1
- package/dist/esm/rules/feature-gating/prefer-fg/index.js +1 -1
- package/dist/esm/rules/feature-gating/static-feature-flags/index.js +2 -2
- package/dist/esm/rules/feature-gating/use-recommended-utils/index.js +1 -1
- package/dist/esm/rules/feature-gating/valid-gate-name/index.js +53 -0
- package/dist/esm/rules/import/no-barrel-entry-imports/index.js +864 -0
- package/dist/esm/rules/import/no-barrel-entry-jest-mock/index.js +1375 -0
- package/dist/esm/rules/import/no-conversation-assistant-barrel-imports/index.js +37 -0
- package/dist/esm/rules/import/no-jest-mock-barrel-files/index.js +1391 -0
- package/dist/esm/rules/import/no-relative-barrel-file-imports/index.js +770 -0
- package/dist/esm/rules/import/shared/barrel-parsing.js +500 -0
- package/dist/esm/rules/import/shared/file-system.js +176 -0
- package/dist/esm/rules/import/shared/jest-utils.js +179 -0
- package/dist/esm/rules/import/shared/package-registry.js +256 -0
- package/dist/esm/rules/import/shared/package-resolution.js +175 -0
- package/dist/esm/rules/import/shared/perf.js +80 -0
- package/dist/esm/rules/import/shared/types.js +61 -0
- package/dist/esm/rules/no-invalid-storybook-decorator-usage/index.js +1 -1
- package/dist/esm/rules/no-sparse-checkout/index.js +1 -1
- package/dist/esm/rules/prefer-crypto-random-uuid/index.js +81 -0
- package/dist/esm/rules/use-entrypoints-in-examples/index.js +1 -1
- package/dist/types/index.d.ts +18 -16
- package/dist/types/rules/import/no-barrel-entry-imports/index.d.ts +9 -0
- package/dist/types/rules/import/no-barrel-entry-jest-mock/index.d.ts +9 -0
- package/dist/types/rules/import/no-conversation-assistant-barrel-imports/index.d.ts +3 -0
- package/dist/types/rules/import/no-jest-mock-barrel-files/index.d.ts +22 -0
- package/dist/types/rules/import/no-relative-barrel-file-imports/index.d.ts +5 -0
- package/dist/types/rules/import/shared/barrel-parsing.d.ts +30 -0
- package/dist/types/rules/import/shared/file-system.d.ts +38 -0
- package/dist/types/rules/import/shared/jest-utils.d.ts +47 -0
- package/dist/types/rules/import/shared/package-registry.d.ts +26 -0
- package/dist/types/rules/import/shared/package-resolution.d.ts +38 -0
- package/dist/types/rules/import/shared/perf.d.ts +13 -0
- package/dist/types/rules/import/shared/types.d.ts +131 -0
- package/dist/types/rules/prefer-crypto-random-uuid/index.d.ts +3 -0
- package/dist/types-ts4.5/index.d.ts +18 -28
- package/dist/types-ts4.5/rules/import/no-barrel-entry-imports/index.d.ts +9 -0
- package/dist/types-ts4.5/rules/import/no-barrel-entry-jest-mock/index.d.ts +9 -0
- package/dist/types-ts4.5/rules/import/no-jest-mock-barrel-files/index.d.ts +22 -0
- package/dist/types-ts4.5/rules/import/no-relative-barrel-file-imports/index.d.ts +5 -0
- package/dist/types-ts4.5/rules/import/shared/barrel-parsing.d.ts +30 -0
- package/dist/types-ts4.5/rules/import/shared/file-system.d.ts +38 -0
- package/dist/types-ts4.5/rules/import/shared/jest-utils.d.ts +47 -0
- package/dist/types-ts4.5/rules/import/shared/package-registry.d.ts +26 -0
- package/dist/types-ts4.5/rules/import/shared/package-resolution.d.ts +38 -0
- package/dist/types-ts4.5/rules/import/shared/perf.d.ts +13 -0
- package/dist/types-ts4.5/rules/import/shared/types.d.ts +131 -0
- package/package.json +4 -5
- package/dist/cjs/rules/ensure-feature-flag-prefix/index.js +0 -75
- package/dist/cjs/rules/ensure-native-and-af-exports-synced/index.js +0 -158
- package/dist/es2019/rules/ensure-feature-flag-prefix/index.js +0 -65
- package/dist/es2019/rules/ensure-native-and-af-exports-synced/index.js +0 -146
- package/dist/esm/rules/ensure-feature-flag-prefix/index.js +0 -69
- package/dist/esm/rules/ensure-native-and-af-exports-synced/index.js +0 -151
- /package/dist/types/rules/{ensure-native-and-af-exports-synced → feature-gating/valid-gate-name}/index.d.ts +0 -0
- /package/dist/types-ts4.5/rules/{ensure-feature-flag-prefix → feature-gating/valid-gate-name}/index.d.ts +0 -0
- /package/dist/types-ts4.5/rules/{ensure-native-and-af-exports-synced → import/no-conversation-assistant-barrel-imports}/index.d.ts +0 -0
- /package/dist/{types/rules/ensure-feature-flag-prefix → types-ts4.5/rules/prefer-crypto-random-uuid}/index.d.ts +0 -0
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _registrationUtils = require("../util/registration-utils");
|
|
8
|
-
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
9
|
-
|
|
10
|
-
var rule = {
|
|
11
|
-
meta: {
|
|
12
|
-
docs: {
|
|
13
|
-
url: 'http://go/pff-eslint',
|
|
14
|
-
recommended: false
|
|
15
|
-
},
|
|
16
|
-
type: 'problem',
|
|
17
|
-
messages: {
|
|
18
|
-
featureFlagIncorrectPrefix: "Is this a LaunchDarkly feature flag? It needs a prefix so Confluence picks it up: [{{ allowedPrefixes }}]. Statsig feature gates don't need a prefix."
|
|
19
|
-
},
|
|
20
|
-
hasSuggestions: true,
|
|
21
|
-
schema: [{
|
|
22
|
-
type: 'object',
|
|
23
|
-
properties: {
|
|
24
|
-
allowedPrefixes: {
|
|
25
|
-
type: 'array',
|
|
26
|
-
items: [{
|
|
27
|
-
type: 'string'
|
|
28
|
-
}]
|
|
29
|
-
}
|
|
30
|
-
},
|
|
31
|
-
required: ['allowedPrefixes']
|
|
32
|
-
}]
|
|
33
|
-
},
|
|
34
|
-
create: function create(context) {
|
|
35
|
-
var _ref2, _context$options;
|
|
36
|
-
var _ref = (_ref2 = (_context$options = context.options) === null || _context$options === void 0 ? void 0 : _context$options[0]) !== null && _ref2 !== void 0 ? _ref2 : {},
|
|
37
|
-
allowedPrefixes = _ref.allowedPrefixes;
|
|
38
|
-
return Object.fromEntries(Object.keys(_registrationUtils.getterIdentifierToFlagTypeMap).map(function (getterIdentifier) {
|
|
39
|
-
return ["CallExpression[callee.name=/".concat(getterIdentifier, "/]"), function (node) {
|
|
40
|
-
// to make typescript happy
|
|
41
|
-
if (node.type === 'CallExpression') {
|
|
42
|
-
var args = node.arguments;
|
|
43
|
-
var filename = context.getFilename();
|
|
44
|
-
var _getMetadataForFilena = (0, _registrationUtils.getMetadataForFilename)(filename),
|
|
45
|
-
packageJson = _getMetadataForFilena.pkgJson;
|
|
46
|
-
var platformFeatureFlags = packageJson['platform-feature-flags'];
|
|
47
|
-
|
|
48
|
-
// existence of registration section is done in 'ensure-feature-flag-registration'
|
|
49
|
-
if (!platformFeatureFlags) {
|
|
50
|
-
return {};
|
|
51
|
-
}
|
|
52
|
-
if (args.length === 1 && args[0].type === 'Literal' && args[0].raw) {
|
|
53
|
-
var featureFlag = args[0].value;
|
|
54
|
-
if (!allowedPrefixes.some(function (prefix) {
|
|
55
|
-
return featureFlag.startsWith(prefix);
|
|
56
|
-
})) {
|
|
57
|
-
return context.report({
|
|
58
|
-
node: args[0],
|
|
59
|
-
messageId: 'featureFlagIncorrectPrefix',
|
|
60
|
-
data: {
|
|
61
|
-
allowedPrefixes: allowedPrefixes.map(function (p) {
|
|
62
|
-
return "".concat(p);
|
|
63
|
-
}).join(','),
|
|
64
|
-
featureFlag: featureFlag
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return {};
|
|
71
|
-
}];
|
|
72
|
-
}));
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
var _default = exports.default = rule;
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.default = void 0;
|
|
8
|
-
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
9
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
-
var _path = _interopRequireDefault(require("path"));
|
|
12
|
-
var _registrationUtils = require("../util/registration-utils");
|
|
13
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
14
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
15
|
-
var exportsValidationExceptions = {
|
|
16
|
-
'@af/yarn-workspace': {
|
|
17
|
-
ignoredAfExportKeys: ['./lock-parser']
|
|
18
|
-
},
|
|
19
|
-
'@atlaskit/tokens': {
|
|
20
|
-
ignoredAfExportKeys: ['./babel-plugin']
|
|
21
|
-
},
|
|
22
|
-
'@atlaskit/storybook-addon-design-system': {
|
|
23
|
-
ignoredAfExportKeys: ['.']
|
|
24
|
-
},
|
|
25
|
-
'@atlassian/react-async': {
|
|
26
|
-
ignoredAfExportKeys: ['./mock']
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
var rule = {
|
|
30
|
-
meta: {
|
|
31
|
-
docs: {
|
|
32
|
-
recommended: false
|
|
33
|
-
},
|
|
34
|
-
type: 'problem',
|
|
35
|
-
messages: {
|
|
36
|
-
missingExportsProperty: "The exports property must be defined for {{pkgName}}; it most likely can just be a duplicate of the \"af:exports\" property. See http://go/eslint-exports for details",
|
|
37
|
-
missingExportsKey: "Missing package.json exports key \"{{expectedKey}}\" in {{pkgName}}. The exports entry should be \"{{expectedKey}}\": \"{{expectedValue}}\". See http://go/eslint-exports for details",
|
|
38
|
-
unexpectedExportsKey: "Unexpected package.json exports key \"{{key}}\" in {{pkgName}}. The exports entry should be \"{{expectedKey}}\": \"{{expectedValue}}\". See http://go/eslint-exports for details",
|
|
39
|
-
unexpectedExportsValue: "Unexpected package.json exports value in {{pkgName}} for the \"{{key}}\" key. The exports entry should be \"{{key}}\": \"{{expectedValue}}\". See http://go/eslint-exports for details"
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
create: function create(context) {
|
|
43
|
-
var fileName = context.getFilename();
|
|
44
|
-
if (!fileName.endsWith('package.json')) {
|
|
45
|
-
return {};
|
|
46
|
-
}
|
|
47
|
-
var _getMetadataForFilena = (0, _registrationUtils.getMetadataForFilename)(fileName),
|
|
48
|
-
packageJson = _getMetadataForFilena.pkgJson;
|
|
49
|
-
var pkgName = packageJson.name;
|
|
50
|
-
if (!pkgName || !packageJson['af:exports']) {
|
|
51
|
-
return {};
|
|
52
|
-
}
|
|
53
|
-
if (!packageJson['exports']) {
|
|
54
|
-
context.report({
|
|
55
|
-
node: context.getSourceCode().ast,
|
|
56
|
-
messageId: 'missingExportsProperty',
|
|
57
|
-
data: {
|
|
58
|
-
pkgName: pkgName
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
return {};
|
|
62
|
-
}
|
|
63
|
-
var afExports = packageJson['af:exports'];
|
|
64
|
-
var nativeExports = packageJson['exports'];
|
|
65
|
-
return {
|
|
66
|
-
Program: function Program(node) {
|
|
67
|
-
for (var _i = 0, _Object$entries = Object.entries(afExports); _i < _Object$entries.length; _i++) {
|
|
68
|
-
var _exportsValidationExc;
|
|
69
|
-
var _Object$entries$_i = (0, _slicedToArray2.default)(_Object$entries[_i], 2),
|
|
70
|
-
afExportsKey = _Object$entries$_i[0],
|
|
71
|
-
afExportsValue = _Object$entries$_i[1];
|
|
72
|
-
if ((_exportsValidationExc = exportsValidationExceptions[pkgName]) !== null && _exportsValidationExc !== void 0 && _exportsValidationExc.ignoredAfExportKeys.includes(afExportsKey)) {
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
var exportKeyViolations = getExportKeyViolation(afExportsKey, afExportsValue, nativeExports);
|
|
76
|
-
if (exportKeyViolations) {
|
|
77
|
-
context.report({
|
|
78
|
-
data: _objectSpread(_objectSpread({}, exportKeyViolations), {}, {
|
|
79
|
-
key: afExportsKey,
|
|
80
|
-
pkgName: pkgName
|
|
81
|
-
}),
|
|
82
|
-
node: node,
|
|
83
|
-
messageId: exportKeyViolations.messageId
|
|
84
|
-
});
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
var exportValueViolations = getExportValueViolation(afExportsKey, afExportsValue, nativeExports);
|
|
88
|
-
if (exportValueViolations) {
|
|
89
|
-
context.report({
|
|
90
|
-
data: _objectSpread(_objectSpread({}, exportValueViolations), {}, {
|
|
91
|
-
pkgName: pkgName
|
|
92
|
-
}),
|
|
93
|
-
node: node,
|
|
94
|
-
messageId: 'unexpectedExportsValue'
|
|
95
|
-
});
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
function getExportKeyViolation(afExportsKey, afExportsValue, nativeExports) {
|
|
104
|
-
var afExportsValueHasExtension = _path.default.extname(afExportsValue) !== '';
|
|
105
|
-
if (afExportsValueHasExtension && !nativeExports.hasOwnProperty(afExportsKey)) {
|
|
106
|
-
return {
|
|
107
|
-
messageId: 'missingExportsKey',
|
|
108
|
-
expectedKey: afExportsKey,
|
|
109
|
-
expectedValue: afExportsValue
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
if (!afExportsValueHasExtension && nativeExports.hasOwnProperty(afExportsKey)) {
|
|
113
|
-
return {
|
|
114
|
-
messageId: 'unexpectedExportsKey',
|
|
115
|
-
expectedKey: "".concat(afExportsKey, "/*"),
|
|
116
|
-
expectedValue: "".concat(afExportsValue, "/*")
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
if (!afExportsValueHasExtension && !nativeExports.hasOwnProperty("".concat(afExportsKey, "/*"))) {
|
|
120
|
-
return {
|
|
121
|
-
messageId: 'missingExportsKey',
|
|
122
|
-
expectedKey: "".concat(afExportsKey, "/*"),
|
|
123
|
-
expectedValue: "".concat(afExportsValue, "/*")
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
function getNativeExportsValue(afExportsKey, afExportsValueHasExtension, nativeExports) {
|
|
128
|
-
var nativeExportsKey = afExportsValueHasExtension ? afExportsKey : "".concat(afExportsKey, "/*");
|
|
129
|
-
if ((0, _typeof2.default)(nativeExports[nativeExportsKey]) === 'object') {
|
|
130
|
-
return nativeExports[nativeExportsKey].default;
|
|
131
|
-
}
|
|
132
|
-
return nativeExports[nativeExportsKey];
|
|
133
|
-
}
|
|
134
|
-
function getExportValueViolation(afExportsKey, afExportsValue, nativeExports) {
|
|
135
|
-
var afExportsValueHasExtension = _path.default.extname(afExportsValue) !== '';
|
|
136
|
-
var nativeExportsValue = getNativeExportsValue(afExportsKey, afExportsValueHasExtension, nativeExports);
|
|
137
|
-
|
|
138
|
-
// Some entrypoints have been updated to an index.js file that registers ts-node
|
|
139
|
-
// Use path.basename to get the file name to see if it is equal to 'index.js'
|
|
140
|
-
if (afExportsValueHasExtension && _path.default.basename(nativeExportsValue) === 'index.js') {
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
if (afExportsValueHasExtension && nativeExportsValue !== afExportsValue) {
|
|
144
|
-
return {
|
|
145
|
-
key: afExportsKey,
|
|
146
|
-
expectedValue: afExportsValue
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// af:exports entrypoints without a file extension export the whole directory so check to ensure the exports value includes the wildcard
|
|
151
|
-
if (!afExportsValueHasExtension && !nativeExportsValue.startsWith("".concat(afExportsValue, "/*"))) {
|
|
152
|
-
return {
|
|
153
|
-
key: "".concat(afExportsKey, "/*"),
|
|
154
|
-
expectedValue: "".concat(afExportsValue, "/*")
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
var _default = exports.default = rule;
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
-
|
|
3
|
-
import { getMetadataForFilename, getterIdentifierToFlagTypeMap } from '../util/registration-utils';
|
|
4
|
-
const rule = {
|
|
5
|
-
meta: {
|
|
6
|
-
docs: {
|
|
7
|
-
url: 'http://go/pff-eslint',
|
|
8
|
-
recommended: false
|
|
9
|
-
},
|
|
10
|
-
type: 'problem',
|
|
11
|
-
messages: {
|
|
12
|
-
featureFlagIncorrectPrefix: `Is this a LaunchDarkly feature flag? It needs a prefix so Confluence picks it up: [{{ allowedPrefixes }}]. Statsig feature gates don't need a prefix.`
|
|
13
|
-
},
|
|
14
|
-
hasSuggestions: true,
|
|
15
|
-
schema: [{
|
|
16
|
-
type: 'object',
|
|
17
|
-
properties: {
|
|
18
|
-
allowedPrefixes: {
|
|
19
|
-
type: 'array',
|
|
20
|
-
items: [{
|
|
21
|
-
type: 'string'
|
|
22
|
-
}]
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
required: ['allowedPrefixes']
|
|
26
|
-
}]
|
|
27
|
-
},
|
|
28
|
-
create(context) {
|
|
29
|
-
var _ref, _context$options;
|
|
30
|
-
const {
|
|
31
|
-
allowedPrefixes
|
|
32
|
-
} = (_ref = (_context$options = context.options) === null || _context$options === void 0 ? void 0 : _context$options[0]) !== null && _ref !== void 0 ? _ref : {};
|
|
33
|
-
return Object.fromEntries(Object.keys(getterIdentifierToFlagTypeMap).map(getterIdentifier => [`CallExpression[callee.name=/${getterIdentifier}/]`, node => {
|
|
34
|
-
// to make typescript happy
|
|
35
|
-
if (node.type === 'CallExpression') {
|
|
36
|
-
const args = node.arguments;
|
|
37
|
-
const filename = context.getFilename();
|
|
38
|
-
const {
|
|
39
|
-
pkgJson: packageJson
|
|
40
|
-
} = getMetadataForFilename(filename);
|
|
41
|
-
const platformFeatureFlags = packageJson['platform-feature-flags'];
|
|
42
|
-
|
|
43
|
-
// existence of registration section is done in 'ensure-feature-flag-registration'
|
|
44
|
-
if (!platformFeatureFlags) {
|
|
45
|
-
return {};
|
|
46
|
-
}
|
|
47
|
-
if (args.length === 1 && args[0].type === 'Literal' && args[0].raw) {
|
|
48
|
-
const featureFlag = args[0].value;
|
|
49
|
-
if (!allowedPrefixes.some(prefix => featureFlag.startsWith(prefix))) {
|
|
50
|
-
return context.report({
|
|
51
|
-
node: args[0],
|
|
52
|
-
messageId: 'featureFlagIncorrectPrefix',
|
|
53
|
-
data: {
|
|
54
|
-
allowedPrefixes: allowedPrefixes.map(p => `${p}`).join(','),
|
|
55
|
-
featureFlag
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return {};
|
|
62
|
-
}]));
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
export default rule;
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import { getMetadataForFilename } from '../util/registration-utils';
|
|
3
|
-
const exportsValidationExceptions = {
|
|
4
|
-
'@af/yarn-workspace': {
|
|
5
|
-
ignoredAfExportKeys: ['./lock-parser']
|
|
6
|
-
},
|
|
7
|
-
'@atlaskit/tokens': {
|
|
8
|
-
ignoredAfExportKeys: ['./babel-plugin']
|
|
9
|
-
},
|
|
10
|
-
'@atlaskit/storybook-addon-design-system': {
|
|
11
|
-
ignoredAfExportKeys: ['.']
|
|
12
|
-
},
|
|
13
|
-
'@atlassian/react-async': {
|
|
14
|
-
ignoredAfExportKeys: ['./mock']
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
const rule = {
|
|
18
|
-
meta: {
|
|
19
|
-
docs: {
|
|
20
|
-
recommended: false
|
|
21
|
-
},
|
|
22
|
-
type: 'problem',
|
|
23
|
-
messages: {
|
|
24
|
-
missingExportsProperty: `The exports property must be defined for {{pkgName}}; it most likely can just be a duplicate of the "af:exports" property. See http://go/eslint-exports for details`,
|
|
25
|
-
missingExportsKey: `Missing package.json exports key "{{expectedKey}}" in {{pkgName}}. The exports entry should be "{{expectedKey}}": "{{expectedValue}}". See http://go/eslint-exports for details`,
|
|
26
|
-
unexpectedExportsKey: `Unexpected package.json exports key "{{key}}" in {{pkgName}}. The exports entry should be "{{expectedKey}}": "{{expectedValue}}". See http://go/eslint-exports for details`,
|
|
27
|
-
unexpectedExportsValue: `Unexpected package.json exports value in {{pkgName}} for the "{{key}}" key. The exports entry should be "{{key}}": "{{expectedValue}}". See http://go/eslint-exports for details`
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
create(context) {
|
|
31
|
-
const fileName = context.getFilename();
|
|
32
|
-
if (!fileName.endsWith('package.json')) {
|
|
33
|
-
return {};
|
|
34
|
-
}
|
|
35
|
-
const {
|
|
36
|
-
pkgJson: packageJson
|
|
37
|
-
} = getMetadataForFilename(fileName);
|
|
38
|
-
const pkgName = packageJson.name;
|
|
39
|
-
if (!pkgName || !packageJson['af:exports']) {
|
|
40
|
-
return {};
|
|
41
|
-
}
|
|
42
|
-
if (!packageJson['exports']) {
|
|
43
|
-
context.report({
|
|
44
|
-
node: context.getSourceCode().ast,
|
|
45
|
-
messageId: 'missingExportsProperty',
|
|
46
|
-
data: {
|
|
47
|
-
pkgName
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
return {};
|
|
51
|
-
}
|
|
52
|
-
const afExports = packageJson['af:exports'];
|
|
53
|
-
const nativeExports = packageJson['exports'];
|
|
54
|
-
return {
|
|
55
|
-
Program(node) {
|
|
56
|
-
for (const [afExportsKey, afExportsValue] of Object.entries(afExports)) {
|
|
57
|
-
var _exportsValidationExc;
|
|
58
|
-
if ((_exportsValidationExc = exportsValidationExceptions[pkgName]) !== null && _exportsValidationExc !== void 0 && _exportsValidationExc.ignoredAfExportKeys.includes(afExportsKey)) {
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
const exportKeyViolations = getExportKeyViolation(afExportsKey, afExportsValue, nativeExports);
|
|
62
|
-
if (exportKeyViolations) {
|
|
63
|
-
context.report({
|
|
64
|
-
data: {
|
|
65
|
-
...exportKeyViolations,
|
|
66
|
-
key: afExportsKey,
|
|
67
|
-
pkgName
|
|
68
|
-
},
|
|
69
|
-
node,
|
|
70
|
-
messageId: exportKeyViolations.messageId
|
|
71
|
-
});
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
const exportValueViolations = getExportValueViolation(afExportsKey, afExportsValue, nativeExports);
|
|
75
|
-
if (exportValueViolations) {
|
|
76
|
-
context.report({
|
|
77
|
-
data: {
|
|
78
|
-
...exportValueViolations,
|
|
79
|
-
pkgName
|
|
80
|
-
},
|
|
81
|
-
node,
|
|
82
|
-
messageId: 'unexpectedExportsValue'
|
|
83
|
-
});
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
function getExportKeyViolation(afExportsKey, afExportsValue, nativeExports) {
|
|
92
|
-
const afExportsValueHasExtension = path.extname(afExportsValue) !== '';
|
|
93
|
-
if (afExportsValueHasExtension && !nativeExports.hasOwnProperty(afExportsKey)) {
|
|
94
|
-
return {
|
|
95
|
-
messageId: 'missingExportsKey',
|
|
96
|
-
expectedKey: afExportsKey,
|
|
97
|
-
expectedValue: afExportsValue
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
if (!afExportsValueHasExtension && nativeExports.hasOwnProperty(afExportsKey)) {
|
|
101
|
-
return {
|
|
102
|
-
messageId: 'unexpectedExportsKey',
|
|
103
|
-
expectedKey: `${afExportsKey}/*`,
|
|
104
|
-
expectedValue: `${afExportsValue}/*`
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
if (!afExportsValueHasExtension && !nativeExports.hasOwnProperty(`${afExportsKey}/*`)) {
|
|
108
|
-
return {
|
|
109
|
-
messageId: 'missingExportsKey',
|
|
110
|
-
expectedKey: `${afExportsKey}/*`,
|
|
111
|
-
expectedValue: `${afExportsValue}/*`
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
function getNativeExportsValue(afExportsKey, afExportsValueHasExtension, nativeExports) {
|
|
116
|
-
const nativeExportsKey = afExportsValueHasExtension ? afExportsKey : `${afExportsKey}/*`;
|
|
117
|
-
if (typeof nativeExports[nativeExportsKey] === 'object') {
|
|
118
|
-
return nativeExports[nativeExportsKey].default;
|
|
119
|
-
}
|
|
120
|
-
return nativeExports[nativeExportsKey];
|
|
121
|
-
}
|
|
122
|
-
function getExportValueViolation(afExportsKey, afExportsValue, nativeExports) {
|
|
123
|
-
const afExportsValueHasExtension = path.extname(afExportsValue) !== '';
|
|
124
|
-
const nativeExportsValue = getNativeExportsValue(afExportsKey, afExportsValueHasExtension, nativeExports);
|
|
125
|
-
|
|
126
|
-
// Some entrypoints have been updated to an index.js file that registers ts-node
|
|
127
|
-
// Use path.basename to get the file name to see if it is equal to 'index.js'
|
|
128
|
-
if (afExportsValueHasExtension && path.basename(nativeExportsValue) === 'index.js') {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
if (afExportsValueHasExtension && nativeExportsValue !== afExportsValue) {
|
|
132
|
-
return {
|
|
133
|
-
key: afExportsKey,
|
|
134
|
-
expectedValue: afExportsValue
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// af:exports entrypoints without a file extension export the whole directory so check to ensure the exports value includes the wildcard
|
|
139
|
-
if (!afExportsValueHasExtension && !nativeExportsValue.startsWith(`${afExportsValue}/*`)) {
|
|
140
|
-
return {
|
|
141
|
-
key: `${afExportsKey}/*`,
|
|
142
|
-
expectedValue: `${afExportsValue}/*`
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
export default rule;
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
|
-
|
|
3
|
-
import { getMetadataForFilename, getterIdentifierToFlagTypeMap } from '../util/registration-utils';
|
|
4
|
-
var rule = {
|
|
5
|
-
meta: {
|
|
6
|
-
docs: {
|
|
7
|
-
url: 'http://go/pff-eslint',
|
|
8
|
-
recommended: false
|
|
9
|
-
},
|
|
10
|
-
type: 'problem',
|
|
11
|
-
messages: {
|
|
12
|
-
featureFlagIncorrectPrefix: "Is this a LaunchDarkly feature flag? It needs a prefix so Confluence picks it up: [{{ allowedPrefixes }}]. Statsig feature gates don't need a prefix."
|
|
13
|
-
},
|
|
14
|
-
hasSuggestions: true,
|
|
15
|
-
schema: [{
|
|
16
|
-
type: 'object',
|
|
17
|
-
properties: {
|
|
18
|
-
allowedPrefixes: {
|
|
19
|
-
type: 'array',
|
|
20
|
-
items: [{
|
|
21
|
-
type: 'string'
|
|
22
|
-
}]
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
required: ['allowedPrefixes']
|
|
26
|
-
}]
|
|
27
|
-
},
|
|
28
|
-
create: function create(context) {
|
|
29
|
-
var _ref2, _context$options;
|
|
30
|
-
var _ref = (_ref2 = (_context$options = context.options) === null || _context$options === void 0 ? void 0 : _context$options[0]) !== null && _ref2 !== void 0 ? _ref2 : {},
|
|
31
|
-
allowedPrefixes = _ref.allowedPrefixes;
|
|
32
|
-
return Object.fromEntries(Object.keys(getterIdentifierToFlagTypeMap).map(function (getterIdentifier) {
|
|
33
|
-
return ["CallExpression[callee.name=/".concat(getterIdentifier, "/]"), function (node) {
|
|
34
|
-
// to make typescript happy
|
|
35
|
-
if (node.type === 'CallExpression') {
|
|
36
|
-
var args = node.arguments;
|
|
37
|
-
var filename = context.getFilename();
|
|
38
|
-
var _getMetadataForFilena = getMetadataForFilename(filename),
|
|
39
|
-
packageJson = _getMetadataForFilena.pkgJson;
|
|
40
|
-
var platformFeatureFlags = packageJson['platform-feature-flags'];
|
|
41
|
-
|
|
42
|
-
// existence of registration section is done in 'ensure-feature-flag-registration'
|
|
43
|
-
if (!platformFeatureFlags) {
|
|
44
|
-
return {};
|
|
45
|
-
}
|
|
46
|
-
if (args.length === 1 && args[0].type === 'Literal' && args[0].raw) {
|
|
47
|
-
var featureFlag = args[0].value;
|
|
48
|
-
if (!allowedPrefixes.some(function (prefix) {
|
|
49
|
-
return featureFlag.startsWith(prefix);
|
|
50
|
-
})) {
|
|
51
|
-
return context.report({
|
|
52
|
-
node: args[0],
|
|
53
|
-
messageId: 'featureFlagIncorrectPrefix',
|
|
54
|
-
data: {
|
|
55
|
-
allowedPrefixes: allowedPrefixes.map(function (p) {
|
|
56
|
-
return "".concat(p);
|
|
57
|
-
}).join(','),
|
|
58
|
-
featureFlag: featureFlag
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return {};
|
|
65
|
-
}];
|
|
66
|
-
}));
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
export default rule;
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import _typeof from "@babel/runtime/helpers/typeof";
|
|
2
|
-
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
|
-
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
4
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
5
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
6
|
-
import path from 'path';
|
|
7
|
-
import { getMetadataForFilename } from '../util/registration-utils';
|
|
8
|
-
var exportsValidationExceptions = {
|
|
9
|
-
'@af/yarn-workspace': {
|
|
10
|
-
ignoredAfExportKeys: ['./lock-parser']
|
|
11
|
-
},
|
|
12
|
-
'@atlaskit/tokens': {
|
|
13
|
-
ignoredAfExportKeys: ['./babel-plugin']
|
|
14
|
-
},
|
|
15
|
-
'@atlaskit/storybook-addon-design-system': {
|
|
16
|
-
ignoredAfExportKeys: ['.']
|
|
17
|
-
},
|
|
18
|
-
'@atlassian/react-async': {
|
|
19
|
-
ignoredAfExportKeys: ['./mock']
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
var rule = {
|
|
23
|
-
meta: {
|
|
24
|
-
docs: {
|
|
25
|
-
recommended: false
|
|
26
|
-
},
|
|
27
|
-
type: 'problem',
|
|
28
|
-
messages: {
|
|
29
|
-
missingExportsProperty: "The exports property must be defined for {{pkgName}}; it most likely can just be a duplicate of the \"af:exports\" property. See http://go/eslint-exports for details",
|
|
30
|
-
missingExportsKey: "Missing package.json exports key \"{{expectedKey}}\" in {{pkgName}}. The exports entry should be \"{{expectedKey}}\": \"{{expectedValue}}\". See http://go/eslint-exports for details",
|
|
31
|
-
unexpectedExportsKey: "Unexpected package.json exports key \"{{key}}\" in {{pkgName}}. The exports entry should be \"{{expectedKey}}\": \"{{expectedValue}}\". See http://go/eslint-exports for details",
|
|
32
|
-
unexpectedExportsValue: "Unexpected package.json exports value in {{pkgName}} for the \"{{key}}\" key. The exports entry should be \"{{key}}\": \"{{expectedValue}}\". See http://go/eslint-exports for details"
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
create: function create(context) {
|
|
36
|
-
var fileName = context.getFilename();
|
|
37
|
-
if (!fileName.endsWith('package.json')) {
|
|
38
|
-
return {};
|
|
39
|
-
}
|
|
40
|
-
var _getMetadataForFilena = getMetadataForFilename(fileName),
|
|
41
|
-
packageJson = _getMetadataForFilena.pkgJson;
|
|
42
|
-
var pkgName = packageJson.name;
|
|
43
|
-
if (!pkgName || !packageJson['af:exports']) {
|
|
44
|
-
return {};
|
|
45
|
-
}
|
|
46
|
-
if (!packageJson['exports']) {
|
|
47
|
-
context.report({
|
|
48
|
-
node: context.getSourceCode().ast,
|
|
49
|
-
messageId: 'missingExportsProperty',
|
|
50
|
-
data: {
|
|
51
|
-
pkgName: pkgName
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
return {};
|
|
55
|
-
}
|
|
56
|
-
var afExports = packageJson['af:exports'];
|
|
57
|
-
var nativeExports = packageJson['exports'];
|
|
58
|
-
return {
|
|
59
|
-
Program: function Program(node) {
|
|
60
|
-
for (var _i = 0, _Object$entries = Object.entries(afExports); _i < _Object$entries.length; _i++) {
|
|
61
|
-
var _exportsValidationExc;
|
|
62
|
-
var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
|
|
63
|
-
afExportsKey = _Object$entries$_i[0],
|
|
64
|
-
afExportsValue = _Object$entries$_i[1];
|
|
65
|
-
if ((_exportsValidationExc = exportsValidationExceptions[pkgName]) !== null && _exportsValidationExc !== void 0 && _exportsValidationExc.ignoredAfExportKeys.includes(afExportsKey)) {
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
var exportKeyViolations = getExportKeyViolation(afExportsKey, afExportsValue, nativeExports);
|
|
69
|
-
if (exportKeyViolations) {
|
|
70
|
-
context.report({
|
|
71
|
-
data: _objectSpread(_objectSpread({}, exportKeyViolations), {}, {
|
|
72
|
-
key: afExportsKey,
|
|
73
|
-
pkgName: pkgName
|
|
74
|
-
}),
|
|
75
|
-
node: node,
|
|
76
|
-
messageId: exportKeyViolations.messageId
|
|
77
|
-
});
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
var exportValueViolations = getExportValueViolation(afExportsKey, afExportsValue, nativeExports);
|
|
81
|
-
if (exportValueViolations) {
|
|
82
|
-
context.report({
|
|
83
|
-
data: _objectSpread(_objectSpread({}, exportValueViolations), {}, {
|
|
84
|
-
pkgName: pkgName
|
|
85
|
-
}),
|
|
86
|
-
node: node,
|
|
87
|
-
messageId: 'unexpectedExportsValue'
|
|
88
|
-
});
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
function getExportKeyViolation(afExportsKey, afExportsValue, nativeExports) {
|
|
97
|
-
var afExportsValueHasExtension = path.extname(afExportsValue) !== '';
|
|
98
|
-
if (afExportsValueHasExtension && !nativeExports.hasOwnProperty(afExportsKey)) {
|
|
99
|
-
return {
|
|
100
|
-
messageId: 'missingExportsKey',
|
|
101
|
-
expectedKey: afExportsKey,
|
|
102
|
-
expectedValue: afExportsValue
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
if (!afExportsValueHasExtension && nativeExports.hasOwnProperty(afExportsKey)) {
|
|
106
|
-
return {
|
|
107
|
-
messageId: 'unexpectedExportsKey',
|
|
108
|
-
expectedKey: "".concat(afExportsKey, "/*"),
|
|
109
|
-
expectedValue: "".concat(afExportsValue, "/*")
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
if (!afExportsValueHasExtension && !nativeExports.hasOwnProperty("".concat(afExportsKey, "/*"))) {
|
|
113
|
-
return {
|
|
114
|
-
messageId: 'missingExportsKey',
|
|
115
|
-
expectedKey: "".concat(afExportsKey, "/*"),
|
|
116
|
-
expectedValue: "".concat(afExportsValue, "/*")
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
function getNativeExportsValue(afExportsKey, afExportsValueHasExtension, nativeExports) {
|
|
121
|
-
var nativeExportsKey = afExportsValueHasExtension ? afExportsKey : "".concat(afExportsKey, "/*");
|
|
122
|
-
if (_typeof(nativeExports[nativeExportsKey]) === 'object') {
|
|
123
|
-
return nativeExports[nativeExportsKey].default;
|
|
124
|
-
}
|
|
125
|
-
return nativeExports[nativeExportsKey];
|
|
126
|
-
}
|
|
127
|
-
function getExportValueViolation(afExportsKey, afExportsValue, nativeExports) {
|
|
128
|
-
var afExportsValueHasExtension = path.extname(afExportsValue) !== '';
|
|
129
|
-
var nativeExportsValue = getNativeExportsValue(afExportsKey, afExportsValueHasExtension, nativeExports);
|
|
130
|
-
|
|
131
|
-
// Some entrypoints have been updated to an index.js file that registers ts-node
|
|
132
|
-
// Use path.basename to get the file name to see if it is equal to 'index.js'
|
|
133
|
-
if (afExportsValueHasExtension && path.basename(nativeExportsValue) === 'index.js') {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
if (afExportsValueHasExtension && nativeExportsValue !== afExportsValue) {
|
|
137
|
-
return {
|
|
138
|
-
key: afExportsKey,
|
|
139
|
-
expectedValue: afExportsValue
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// af:exports entrypoints without a file extension export the whole directory so check to ensure the exports value includes the wildcard
|
|
144
|
-
if (!afExportsValueHasExtension && !nativeExportsValue.startsWith("".concat(afExportsValue, "/*"))) {
|
|
145
|
-
return {
|
|
146
|
-
key: "".concat(afExportsKey, "/*"),
|
|
147
|
-
expectedValue: "".concat(afExportsValue, "/*")
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
export default rule;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|