@atlaskit/codemod-cli 0.11.4 → 0.12.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/cli.js +72 -75
- package/dist/cjs/filepath.js +29 -83
- package/dist/cjs/index.js +3 -6
- package/dist/cjs/main.js +165 -441
- package/dist/cjs/presets/css-to-design-tokens/css-to-design-tokens.js +44 -135
- package/dist/cjs/presets/css-to-design-tokens/utils/legacy-colors.js +3 -4
- package/dist/cjs/presets/css-to-design-tokens/utils/meta.js +6 -29
- package/dist/cjs/presets/index.js +2 -9
- package/dist/cjs/presets/styled-to-emotion/styled-to-emotion.js +13 -25
- package/dist/cjs/presets/theme-to-design-tokens/theme-to-design-tokens.js +34 -82
- package/dist/cjs/presets/theme-to-design-tokens/utils/ast-meta.js +14 -41
- package/dist/cjs/presets/theme-to-design-tokens/utils/ast.js +0 -2
- package/dist/cjs/presets/theme-to-design-tokens/utils/color.js +9 -28
- package/dist/cjs/presets/theme-to-design-tokens/utils/fuzzy-search.js +44 -106
- package/dist/cjs/presets/theme-to-design-tokens/utils/legacy-colors.js +3 -3
- package/dist/cjs/presets/theme-to-design-tokens/utils/named-colors.js +1 -1
- package/dist/cjs/presets/theme-to-design-tokens/utils/tokens.js +2 -22
- package/dist/cjs/sinceRef.js +36 -92
- package/dist/cjs/transforms.js +27 -72
- package/dist/cjs/types.js +2 -45
- package/dist/cjs/utils.js +7 -20
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/filepath.js +7 -5
- package/dist/es2019/main.js +17 -51
- package/dist/es2019/presets/css-to-design-tokens/css-to-design-tokens.js +19 -51
- package/dist/es2019/presets/css-to-design-tokens/utils/legacy-colors.js +0 -1
- package/dist/es2019/presets/css-to-design-tokens/utils/meta.js +0 -6
- package/dist/es2019/presets/index.js +1 -1
- package/dist/es2019/presets/styled-to-emotion/styled-to-emotion.js +1 -4
- package/dist/es2019/presets/theme-to-design-tokens/theme-to-design-tokens.js +4 -14
- package/dist/es2019/presets/theme-to-design-tokens/utils/ast-meta.js +2 -11
- package/dist/es2019/presets/theme-to-design-tokens/utils/color.js +2 -7
- package/dist/es2019/presets/theme-to-design-tokens/utils/fuzzy-search.js +38 -95
- package/dist/es2019/presets/theme-to-design-tokens/utils/tokens.js +0 -1
- package/dist/es2019/sinceRef.js +2 -11
- package/dist/es2019/transforms.js +3 -13
- package/dist/es2019/types.js +1 -0
- package/dist/es2019/utils.js +1 -12
- package/dist/es2019/version.json +1 -1
- package/dist/esm/cli.js +53 -57
- package/dist/esm/filepath.js +51 -63
- package/dist/esm/main.js +221 -322
- package/dist/esm/presets/css-to-design-tokens/css-to-design-tokens.js +33 -71
- package/dist/esm/presets/css-to-design-tokens/utils/legacy-colors.js +0 -1
- package/dist/esm/presets/css-to-design-tokens/utils/meta.js +0 -6
- package/dist/esm/presets/index.js +1 -1
- package/dist/esm/presets/styled-to-emotion/styled-to-emotion.js +1 -4
- package/dist/esm/presets/theme-to-design-tokens/theme-to-design-tokens.js +4 -15
- package/dist/esm/presets/theme-to-design-tokens/utils/ast-meta.js +2 -11
- package/dist/esm/presets/theme-to-design-tokens/utils/color.js +2 -7
- package/dist/esm/presets/theme-to-design-tokens/utils/fuzzy-search.js +38 -95
- package/dist/esm/presets/theme-to-design-tokens/utils/tokens.js +0 -1
- package/dist/esm/sinceRef.js +49 -65
- package/dist/esm/transforms.js +4 -14
- package/dist/esm/types.js +1 -11
- package/dist/esm/utils.js +1 -12
- package/dist/esm/version.json +1 -1
- package/package.json +2 -2
- package/tmp/api-report-tmp.d.ts +0 -66
package/dist/cjs/transforms.js
CHANGED
|
@@ -1,109 +1,64 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.parseTransformPath = exports.hasTransform = exports.getTransforms = exports.getTransformVersion = exports.getTransformPath = exports.getTransformModule = void 0;
|
|
9
|
-
|
|
10
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
|
-
|
|
12
8
|
var _path = _interopRequireDefault(require("path"));
|
|
13
|
-
|
|
14
9
|
var _glob = _interopRequireDefault(require("glob"));
|
|
15
|
-
|
|
16
10
|
var _semver = _interopRequireDefault(require("semver"));
|
|
17
|
-
|
|
18
11
|
var _presets = _interopRequireDefault(require("./presets"));
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return pkg.name;
|
|
23
|
-
}).join(','), ",}")] : ['@{atlaskit,atlassian,atlassiansox}', '*'];
|
|
24
|
-
return _path.default.join.apply(_path.default, [process.cwd(), 'node_modules'].concat(packageDirectory, ['codemods']));
|
|
12
|
+
const basePath = packages => {
|
|
13
|
+
const packageDirectory = packages && packages.length > 0 ? [`{${packages.map(pkg => pkg.name).join(',')},}`] : ['@{atlaskit,atlassian,atlassiansox}', '*'];
|
|
14
|
+
return _path.default.join(process.cwd(), 'node_modules', ...packageDirectory, 'codemods');
|
|
25
15
|
};
|
|
16
|
+
const hasTransform = transformPath => _glob.default.sync(transformPath).length > 0;
|
|
26
17
|
|
|
27
|
-
var hasTransform = function hasTransform(transformPath) {
|
|
28
|
-
return _glob.default.sync(transformPath).length > 0;
|
|
29
|
-
};
|
|
30
18
|
/** Retrieves transforms for `packages` if provided, otherwise all transforms including presets */
|
|
31
|
-
|
|
32
|
-
|
|
33
19
|
exports.hasTransform = hasTransform;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
var transforms = [_path.default.join(basePath(packages), '*.@(ts|tsx|js)'), _path.default.join(basePath(packages), '*', 'index.@(ts|tsx|js)')];
|
|
37
|
-
|
|
20
|
+
const getTransforms = packages => {
|
|
21
|
+
const transforms = [_path.default.join(basePath(packages), '*.@(ts|tsx|js)'), _path.default.join(basePath(packages), '*', 'index.@(ts|tsx|js)')];
|
|
38
22
|
if (!packages) {
|
|
39
|
-
transforms.unshift
|
|
23
|
+
transforms.unshift(..._presets.default);
|
|
40
24
|
}
|
|
41
|
-
|
|
42
|
-
return transforms.map(function (transform) {
|
|
43
|
-
return _glob.default.sync(transform);
|
|
44
|
-
}).reduce(function (acc, val) {
|
|
45
|
-
return acc.concat(val);
|
|
46
|
-
}, []).map(function (transform) {
|
|
47
|
-
return parseTransformPath(transform);
|
|
48
|
-
}).filter(filterTransforms(packages)).sort();
|
|
25
|
+
return transforms.map(transform => _glob.default.sync(transform)).reduce((acc, val) => acc.concat(val), []).map(transform => parseTransformPath(transform)).filter(filterTransforms(packages)).sort();
|
|
49
26
|
};
|
|
50
|
-
|
|
51
27
|
exports.getTransforms = getTransforms;
|
|
52
|
-
|
|
53
|
-
var parseTransformPath = function parseTransformPath(transformPath) {
|
|
54
|
-
return _path.default.parse(transformPath);
|
|
55
|
-
};
|
|
56
|
-
|
|
28
|
+
const parseTransformPath = transformPath => _path.default.parse(transformPath);
|
|
57
29
|
exports.parseTransformPath = parseTransformPath;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return "".concat(dir, "/").concat(base);
|
|
63
|
-
};
|
|
64
|
-
|
|
30
|
+
const getTransformPath = ({
|
|
31
|
+
dir,
|
|
32
|
+
base
|
|
33
|
+
}) => `${dir}/${base}`;
|
|
65
34
|
exports.getTransformPath = getTransformPath;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
35
|
+
const getTransformModule = transform => {
|
|
36
|
+
const pathSegments = transform.dir.split(_path.default.sep);
|
|
37
|
+
const nodeModulesIdx = pathSegments.indexOf('node_modules');
|
|
38
|
+
// pathSegments will be of the form [node_modules, '@atlaskit', 'avatar', 'codemods']
|
|
71
39
|
return pathSegments.slice(nodeModulesIdx + 1, nodeModulesIdx + 3).join('/');
|
|
72
40
|
};
|
|
73
|
-
|
|
74
41
|
exports.getTransformModule = getTransformModule;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
var transformName = transform.base;
|
|
78
|
-
|
|
42
|
+
const getTransformVersion = transform => {
|
|
43
|
+
let transformName = transform.base;
|
|
79
44
|
if (transformName.startsWith('index.')) {
|
|
80
|
-
|
|
45
|
+
const pathSegments = transform.dir.split(_path.default.sep);
|
|
81
46
|
transformName = pathSegments[pathSegments.length - 1];
|
|
82
47
|
}
|
|
83
|
-
|
|
84
48
|
return transformName.split('-')[0];
|
|
85
49
|
};
|
|
86
|
-
|
|
87
50
|
exports.getTransformVersion = getTransformVersion;
|
|
88
|
-
|
|
89
|
-
var filterTransforms = function filterTransforms(packages) {
|
|
51
|
+
const filterTransforms = packages => {
|
|
90
52
|
if (!packages || packages.length === 0) {
|
|
91
|
-
return
|
|
92
|
-
return true;
|
|
93
|
-
};
|
|
53
|
+
return () => true;
|
|
94
54
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
return function (transform) {
|
|
100
|
-
var transformVersion = getTransformVersion(transform);
|
|
101
|
-
var pkgVersion = packageMap.get(getTransformModule(transform));
|
|
102
|
-
|
|
55
|
+
const packageMap = new Map(packages.map(pkg => [pkg.name, pkg.version]));
|
|
56
|
+
return transform => {
|
|
57
|
+
const transformVersion = getTransformVersion(transform);
|
|
58
|
+
const pkgVersion = packageMap.get(getTransformModule(transform));
|
|
103
59
|
if (pkgVersion === undefined) {
|
|
104
|
-
throw Error(
|
|
60
|
+
throw Error(`No corresponding package found for transform "${transform.dir}/${transform.base}`);
|
|
105
61
|
}
|
|
106
|
-
|
|
107
62
|
if (transformVersion === 'next' || pkgVersion === null) {
|
|
108
63
|
return true;
|
|
109
64
|
} else if (_semver.default.valid(transformVersion)) {
|
package/dist/cjs/types.js
CHANGED
|
@@ -1,57 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
6
|
exports.ValidationError = exports.NoTransformsExistError = void 0;
|
|
9
|
-
|
|
10
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
11
|
-
|
|
12
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
13
|
-
|
|
14
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
15
|
-
|
|
16
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
17
|
-
|
|
18
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
19
|
-
|
|
20
|
-
var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
|
|
21
|
-
|
|
22
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
23
|
-
|
|
24
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
25
|
-
|
|
26
7
|
/** Converts required args to optional if they have a default
|
|
27
8
|
* Example: export type UserFlags = Default<Flags, keyof typeof defaultFlags>;
|
|
28
9
|
*/
|
|
29
|
-
var ValidationError = /*#__PURE__*/function (_Error) {
|
|
30
|
-
(0, _inherits2.default)(ValidationError, _Error);
|
|
31
|
-
|
|
32
|
-
var _super = _createSuper(ValidationError);
|
|
33
|
-
|
|
34
|
-
function ValidationError() {
|
|
35
|
-
(0, _classCallCheck2.default)(this, ValidationError);
|
|
36
|
-
return _super.apply(this, arguments);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return (0, _createClass2.default)(ValidationError);
|
|
40
|
-
}( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error));
|
|
41
10
|
|
|
11
|
+
class ValidationError extends Error {}
|
|
42
12
|
exports.ValidationError = ValidationError;
|
|
43
|
-
|
|
44
|
-
var NoTransformsExistError = /*#__PURE__*/function (_Error2) {
|
|
45
|
-
(0, _inherits2.default)(NoTransformsExistError, _Error2);
|
|
46
|
-
|
|
47
|
-
var _super2 = _createSuper(NoTransformsExistError);
|
|
48
|
-
|
|
49
|
-
function NoTransformsExistError() {
|
|
50
|
-
(0, _classCallCheck2.default)(this, NoTransformsExistError);
|
|
51
|
-
return _super2.apply(this, arguments);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return (0, _createClass2.default)(NoTransformsExistError);
|
|
55
|
-
}( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error));
|
|
56
|
-
|
|
13
|
+
class NoTransformsExistError extends Error {}
|
|
57
14
|
exports.NoTransformsExistError = NoTransformsExistError;
|
package/dist/cjs/utils.js
CHANGED
|
@@ -4,61 +4,48 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.fixLineEnding = void 0;
|
|
7
|
-
|
|
8
7
|
/* Utility functions to be used in codemod-cli. */
|
|
9
|
-
|
|
8
|
+
|
|
9
|
+
const returnLineEnding = source => {
|
|
10
10
|
var cr = source.split('\r').length;
|
|
11
11
|
var lf = source.split('\n').length;
|
|
12
12
|
var crlf = source.split('\r\n').length;
|
|
13
|
-
|
|
14
13
|
if (cr + lf === 0) {
|
|
15
14
|
return 'NONE';
|
|
16
15
|
}
|
|
17
|
-
|
|
18
16
|
if (crlf === cr && crlf === lf) {
|
|
19
17
|
return 'CRLF';
|
|
20
18
|
}
|
|
21
|
-
|
|
22
19
|
if (cr > lf) {
|
|
23
20
|
return 'CR';
|
|
24
21
|
} else {
|
|
25
22
|
return 'LF';
|
|
26
23
|
}
|
|
27
24
|
};
|
|
28
|
-
|
|
29
|
-
var getLineEndingRegex = function getLineEndingRegex(type) {
|
|
25
|
+
const getLineEndingRegex = type => {
|
|
30
26
|
if (['CR', 'LF', 'CRLF'].indexOf(type) === -1) {
|
|
31
27
|
throw new Error("Line ending '" + type + "' is not supported, use CR, LF or CRLF");
|
|
32
28
|
}
|
|
33
|
-
|
|
34
29
|
if (type === 'LF') {
|
|
35
30
|
return '\n';
|
|
36
31
|
}
|
|
37
|
-
|
|
38
32
|
if (type === 'CR') {
|
|
39
33
|
return '\r';
|
|
40
34
|
}
|
|
41
|
-
|
|
42
35
|
if (type === 'CRLF') {
|
|
43
36
|
return '\r\n';
|
|
44
37
|
}
|
|
45
38
|
};
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
var current = returnLineEnding(source);
|
|
49
|
-
|
|
39
|
+
const fixLineEnding = (source, lineEnding) => {
|
|
40
|
+
const current = returnLineEnding(source);
|
|
50
41
|
if (current === lineEnding) {
|
|
51
42
|
return source;
|
|
52
43
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
var regexLineEnding = getLineEndingRegex(lineEnding);
|
|
56
|
-
|
|
44
|
+
const regexCurrentLineEnding = getLineEndingRegex(current);
|
|
45
|
+
const regexLineEnding = getLineEndingRegex(lineEnding);
|
|
57
46
|
if (current && regexLineEnding && regexCurrentLineEnding) {
|
|
58
47
|
return source.replace(new RegExp(regexCurrentLineEnding, 'g'), regexLineEnding);
|
|
59
48
|
}
|
|
60
|
-
|
|
61
49
|
return source;
|
|
62
50
|
};
|
|
63
|
-
|
|
64
51
|
exports.fixLineEnding = fixLineEnding;
|
package/dist/cjs/version.json
CHANGED
package/dist/es2019/filepath.js
CHANGED
|
@@ -3,30 +3,32 @@ import { promises } from 'fs';
|
|
|
3
3
|
const {
|
|
4
4
|
readFile
|
|
5
5
|
} = promises;
|
|
6
|
-
/** Return products packages filePaths for running codemods from specified dependent package */
|
|
7
6
|
|
|
7
|
+
/** Return products packages filePaths for running codemods from specified dependent package */
|
|
8
8
|
export async function findDependentPackagePaths(crawlPaths, dependencyPackage) {
|
|
9
9
|
// Get file paths leading to package.jsons
|
|
10
10
|
const searchStrings = crawlPaths.map(crawlPath => {
|
|
11
11
|
//Replace leading './' due to bug with node-glob not properly ignoring files https://github.com/isaacs/node-glob/issues/309
|
|
12
12
|
return `${crawlPath.replace(/^\.\//, '')}/**/package.json`;
|
|
13
|
-
});
|
|
13
|
+
});
|
|
14
14
|
|
|
15
|
+
// Convert array into glob string
|
|
15
16
|
const globString = searchStrings.length > 1 ? `{${searchStrings.join(',')}}` : searchStrings[0];
|
|
16
17
|
const packageJsonPaths = glob.sync(globString, {
|
|
17
18
|
ignore: '**/node_modules/**',
|
|
18
19
|
nodir: true
|
|
19
20
|
});
|
|
20
21
|
let productPackageJsonPathPromises = packageJsonPaths.map(async filePath => {
|
|
21
|
-
const fileContents = readFile(filePath, 'utf8');
|
|
22
|
-
|
|
22
|
+
const fileContents = readFile(filePath, 'utf8');
|
|
23
|
+
// Grep for installedPackage
|
|
23
24
|
const isMatch = (await fileContents).toString().split(/\n/).some(function (line) {
|
|
24
25
|
return line.match(dependencyPackage);
|
|
25
26
|
});
|
|
26
27
|
return isMatch && filePath;
|
|
27
28
|
});
|
|
28
|
-
const productPackageJsonPaths = (await Promise.all(productPackageJsonPathPromises)).filter(path => path !== false);
|
|
29
|
+
const productPackageJsonPaths = (await Promise.all(productPackageJsonPathPromises)).filter(path => path !== false);
|
|
29
30
|
|
|
31
|
+
// Get directory
|
|
30
32
|
const productPackagePaths = productPackageJsonPaths.map(line => line.replace('/package.json', ''));
|
|
31
33
|
return productPackagePaths;
|
|
32
34
|
}
|
package/dist/es2019/main.js
CHANGED
|
@@ -3,40 +3,35 @@ import fs from 'fs';
|
|
|
3
3
|
import spawn from 'projector-spawn';
|
|
4
4
|
import { AutoComplete } from 'enquirer';
|
|
5
5
|
import semver from 'semver';
|
|
6
|
-
|
|
7
6
|
const jscodeshift = require.resolve('.bin/jscodeshift');
|
|
8
|
-
|
|
9
7
|
import { fixLineEnding } from './utils';
|
|
10
8
|
import { getTransforms, getTransformPath, hasTransform, parseTransformPath, getTransformModule } from './transforms';
|
|
11
9
|
import { ValidationError, NoTransformsExistError } from './types';
|
|
12
10
|
import { getPackagesSinceRef } from './sinceRef';
|
|
13
11
|
import { findDependentPackagePaths } from './filepath';
|
|
14
|
-
|
|
15
12
|
const applyTransformMeta = transforms => transforms.map(transform => {
|
|
16
13
|
const moduleMatch = transform.dir.match(/\/@atlaskit\/[^\/]+\//);
|
|
17
|
-
|
|
18
14
|
if (moduleMatch) {
|
|
19
15
|
const moduleName = moduleMatch[0].substring(1, moduleMatch[0].length - 1);
|
|
20
16
|
const transformName = transform.name === 'index' ? transform.dir.slice(transform.dir.lastIndexOf('/') + 1) : transform.name;
|
|
21
|
-
return {
|
|
17
|
+
return {
|
|
18
|
+
...transform,
|
|
22
19
|
id: `${moduleName}: ${transformName}`
|
|
23
20
|
};
|
|
24
21
|
}
|
|
25
|
-
|
|
26
22
|
const presetMatch = transform.dir.match(/\/codemod-cli\/.+\/presets/);
|
|
27
|
-
|
|
28
23
|
if (presetMatch) {
|
|
29
24
|
const transformName = transform.name === 'index' ? transform.dir.slice(transform.dir.lastIndexOf('/') + 1) : transform.name;
|
|
30
|
-
return {
|
|
25
|
+
return {
|
|
26
|
+
...transform,
|
|
31
27
|
id: `@atlaskit/codemod-cli: ${transformName}`
|
|
32
28
|
};
|
|
33
29
|
}
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
return {
|
|
31
|
+
...transform,
|
|
36
32
|
id: `${transform.dir}/${transform.name}`
|
|
37
33
|
};
|
|
38
34
|
});
|
|
39
|
-
|
|
40
35
|
const getTransformPrompt = async transforms => {
|
|
41
36
|
const transformMeta = applyTransformMeta(transforms);
|
|
42
37
|
return await new AutoComplete({
|
|
@@ -53,13 +48,11 @@ const getTransformPrompt = async transforms => {
|
|
|
53
48
|
}) => id === choice || dir === choice)
|
|
54
49
|
}).run();
|
|
55
50
|
};
|
|
56
|
-
|
|
57
51
|
const resolveTransform = async (flags, transforms) => {
|
|
58
52
|
if (flags.preset) {
|
|
59
53
|
const transform = transforms.find(({
|
|
60
54
|
name
|
|
61
55
|
}) => name === flags.preset);
|
|
62
|
-
|
|
63
56
|
if (!transform) {
|
|
64
57
|
console.warn(`No preset found for: ${chalk.bgRed(flags.preset)}`);
|
|
65
58
|
} else {
|
|
@@ -70,25 +63,20 @@ const resolveTransform = async (flags, transforms) => {
|
|
|
70
63
|
if (flags.transform && hasTransform(flags.transform)) {
|
|
71
64
|
return parseTransformPath(flags.transform);
|
|
72
65
|
}
|
|
73
|
-
|
|
74
66
|
if (flags.transform && !hasTransform(flags.transform)) {
|
|
75
67
|
console.warn(`No available transform found for: ${chalk.bgRed(flags.transform)}`);
|
|
76
68
|
}
|
|
77
|
-
|
|
78
69
|
return await getTransformPrompt(transforms);
|
|
79
70
|
};
|
|
80
|
-
|
|
81
71
|
const runTransform = async (filePaths, transform, flags) => {
|
|
82
72
|
const {
|
|
83
73
|
logger
|
|
84
74
|
} = flags;
|
|
85
75
|
logger.log(chalk.green(`Running transform '${chalk.bold(transform.name)}' over ${chalk.bold(filePaths.join(', '))}...`));
|
|
86
76
|
let codemodDirs = filePaths;
|
|
87
|
-
|
|
88
77
|
if (flags.filterPaths) {
|
|
89
78
|
logger.log(chalk.green(`Running filtering logic for module ${transform.module}...`));
|
|
90
79
|
codemodDirs = await findDependentPackagePaths(filePaths, transform.module);
|
|
91
|
-
|
|
92
80
|
if (codemodDirs.length === 0) {
|
|
93
81
|
// Fallback to non-filter logic if filtering returns no directories
|
|
94
82
|
logger.log(chalk.yellow(`Could not filter source paths for ${transform.module}, falling back to running over all specified paths. (See --no-filter-paths flag)`));
|
|
@@ -97,19 +85,18 @@ const runTransform = async (filePaths, transform, flags) => {
|
|
|
97
85
|
logger.log(chalk.green(`Running transform '${chalk.bold(transform.name)}' over filtered dirs ${chalk.bold(codemodDirs.join(', '))}...`));
|
|
98
86
|
}
|
|
99
87
|
}
|
|
100
|
-
|
|
101
88
|
logger.log(chalk.green(`Transforming files matching these extensions '${chalk.bold(flags.extensions)}'...`));
|
|
102
|
-
const transformPath = getTransformPath(transform);
|
|
89
|
+
const transformPath = getTransformPath(transform);
|
|
103
90
|
|
|
91
|
+
// Limit CPUs to 8 to prevent issues when running on CI with a large amount of cpus
|
|
104
92
|
const args = [`--transform=${transformPath}`, `--ignore-pattern=${flags.ignorePattern}`, `--parser=${flags.parser}`, `--extensions=${flags.extensions}`, '--cpus=8', ...codemodDirs];
|
|
105
|
-
|
|
106
93
|
if (flags.failOnError) {
|
|
107
94
|
args.unshift('--fail-on-error');
|
|
108
|
-
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// To avoid https://github.com/facebook/jscodeshift/issues/424 where the jscodeshift.js file is `CRLF` ending.
|
|
109
98
|
// The workaround to use only the `node_modules` indicated in this ticket will not work as we run this code as CLI in products repository
|
|
110
99
|
// that may not have jscodeshift installed.
|
|
111
|
-
|
|
112
|
-
|
|
113
100
|
const jscodeshiftContent = fs.readFileSync(jscodeshift, 'utf8');
|
|
114
101
|
const jscodeshiftContentNew = fixLineEnding(jscodeshiftContent, 'LF');
|
|
115
102
|
fs.writeFileSync(jscodeshift, jscodeshiftContentNew);
|
|
@@ -117,40 +104,32 @@ const runTransform = async (filePaths, transform, flags) => {
|
|
|
117
104
|
stdio: 'inherit'
|
|
118
105
|
});
|
|
119
106
|
};
|
|
120
|
-
|
|
121
107
|
const parsePkg = pkg => {
|
|
122
108
|
if (!pkg.startsWith('@')) {
|
|
123
109
|
throw new ValidationError('Package names must be fully qualified and begin with "@"');
|
|
124
110
|
}
|
|
125
|
-
|
|
126
111
|
let name = pkg;
|
|
127
112
|
let version = null;
|
|
128
113
|
const parts = pkg.split('@');
|
|
129
|
-
|
|
130
114
|
if (parts.length > 2) {
|
|
131
115
|
name = `@${parts[1]}`;
|
|
132
116
|
version = parts[parts.length - 1];
|
|
133
117
|
}
|
|
134
|
-
|
|
135
118
|
return {
|
|
136
119
|
name,
|
|
137
120
|
version
|
|
138
121
|
};
|
|
139
122
|
};
|
|
140
|
-
|
|
141
123
|
const parsePackagesFlag = packages => {
|
|
142
124
|
return packages.split(',').map(parsePkg);
|
|
143
125
|
};
|
|
144
|
-
|
|
145
126
|
const validatePackages = (packages, errorCallback) => {
|
|
146
127
|
if (!packages) {
|
|
147
128
|
return;
|
|
148
129
|
}
|
|
149
|
-
|
|
150
130
|
const errors = [];
|
|
151
131
|
const transformedPackages = packages.map(pkg => {
|
|
152
132
|
let version = null;
|
|
153
|
-
|
|
154
133
|
if (pkg.version != null) {
|
|
155
134
|
if (semver.validRange(pkg.version)) {
|
|
156
135
|
version = semver.valid(semver.minVersion(pkg.version));
|
|
@@ -158,26 +137,21 @@ const validatePackages = (packages, errorCallback) => {
|
|
|
158
137
|
errors.push(`Invalid version "${pkg.version}" for package "${pkg.name}"`);
|
|
159
138
|
}
|
|
160
139
|
}
|
|
161
|
-
|
|
162
|
-
|
|
140
|
+
return {
|
|
141
|
+
...pkg,
|
|
163
142
|
version
|
|
164
143
|
};
|
|
165
144
|
});
|
|
166
|
-
|
|
167
145
|
if (errors.length > 0) {
|
|
168
146
|
errorCallback && errorCallback(errors);
|
|
169
147
|
}
|
|
170
|
-
|
|
171
148
|
return transformedPackages;
|
|
172
149
|
};
|
|
173
|
-
|
|
174
150
|
const parseArgs = async (input, flags) => {
|
|
175
151
|
let packages;
|
|
176
|
-
|
|
177
152
|
if (!input[0]) {
|
|
178
153
|
throw new ValidationError('Please supply a path to the source files you wish to modify');
|
|
179
154
|
}
|
|
180
|
-
|
|
181
155
|
if (flags.packages) {
|
|
182
156
|
const unvalidatedPackages = parsePackagesFlag(flags.packages);
|
|
183
157
|
packages = validatePackages(unvalidatedPackages, errors => {
|
|
@@ -189,12 +163,10 @@ const parseArgs = async (input, flags) => {
|
|
|
189
163
|
throw new Error(`Detected invalid previous versions of packages upgraded since "${flags.sinceRef}". Previous versions must be valid semver.\n${errors.join('\n')}`);
|
|
190
164
|
});
|
|
191
165
|
}
|
|
192
|
-
|
|
193
166
|
return {
|
|
194
167
|
packages
|
|
195
168
|
};
|
|
196
169
|
};
|
|
197
|
-
|
|
198
170
|
const defaultFlags = {
|
|
199
171
|
parser: 'babel',
|
|
200
172
|
extensions: 'js',
|
|
@@ -202,7 +174,8 @@ const defaultFlags = {
|
|
|
202
174
|
logger: console
|
|
203
175
|
};
|
|
204
176
|
export default async function main(input, userFlags) {
|
|
205
|
-
const flags = {
|
|
177
|
+
const flags = {
|
|
178
|
+
...defaultFlags,
|
|
206
179
|
...userFlags
|
|
207
180
|
};
|
|
208
181
|
const logger = flags.logger;
|
|
@@ -213,36 +186,29 @@ export default async function main(input, userFlags) {
|
|
|
213
186
|
_PACKAGE_VERSION_ = '0.0.0-dev'
|
|
214
187
|
} = process.env;
|
|
215
188
|
logger.log(chalk.bgBlue(chalk.black(`📚 Atlassian-Frontend codemod library @ ${_PACKAGE_VERSION_} 📚`)));
|
|
216
|
-
|
|
217
189
|
if (packages && packages.length > 0) {
|
|
218
190
|
logger.log(chalk.gray(`Searching for codemods for newer versions of the following packages: ${packages.map(pkg => `${pkg.name}${pkg.version ? '@' + pkg.version : ''}`)}`));
|
|
219
191
|
}
|
|
220
|
-
|
|
221
192
|
const shouldHavePackages = flags.sinceRef || flags.packages && flags.packages.length > 0;
|
|
222
|
-
|
|
223
193
|
if (shouldHavePackages && (packages === null || packages === void 0 ? void 0 : packages.length) === 0) {
|
|
224
194
|
logger.log(chalk.gray(`Did not find updated packages, exiting`));
|
|
225
195
|
return {
|
|
226
196
|
transforms: []
|
|
227
197
|
};
|
|
228
198
|
}
|
|
229
|
-
|
|
230
199
|
const availableTransforms = getTransforms(packages);
|
|
231
|
-
|
|
232
200
|
if (availableTransforms.length === 0) {
|
|
233
201
|
throw new NoTransformsExistError('No codemods available. Please make sure you have the latest version of the packages you are trying to upgrade before running the codemod');
|
|
234
202
|
}
|
|
235
|
-
|
|
236
203
|
const transforms = packages ? availableTransforms : [await resolveTransform(flags, availableTransforms)];
|
|
237
|
-
const transformsWithModule = transforms.map(transform => ({
|
|
204
|
+
const transformsWithModule = transforms.map(transform => ({
|
|
205
|
+
...transform,
|
|
238
206
|
module: getTransformModule(transform)
|
|
239
207
|
}));
|
|
240
208
|
logger.log(chalk.cyan(`Running the following transforms \n${chalk.bold(transformsWithModule.map(transform => `${transform.module}: ${transform.name}`).join('\n'))}`));
|
|
241
|
-
|
|
242
209
|
for (const transform of transformsWithModule) {
|
|
243
210
|
await runTransform(input, transform, flags);
|
|
244
211
|
}
|
|
245
|
-
|
|
246
212
|
return {
|
|
247
213
|
transforms: transformsWithModule
|
|
248
214
|
};
|