@vkontakte/vkui-codemods 0.0.3
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/README.md +63 -0
- package/dist/cli.js +113 -0
- package/dist/codemod-helpers.js +76 -0
- package/dist/getAvailableCodemods.js +19 -0
- package/dist/helpers/logger.js +30 -0
- package/dist/index.js +193 -0
- package/dist/report.js +13 -0
- package/dist/transforms/accordion.js +25 -0
- package/dist/transforms/action-sheet-item.js +33 -0
- package/dist/transforms/action-sheet.js +45 -0
- package/dist/transforms/alert.js +48 -0
- package/dist/transforms/appearance-provider.js +19 -0
- package/dist/transforms/banner.js +22 -0
- package/dist/transforms/calendar-range.js +21 -0
- package/dist/transforms/calendar.js +23 -0
- package/dist/transforms/chip.js +17 -0
- package/dist/transforms/chips-input.js +17 -0
- package/dist/transforms/config-provider.js +68 -0
- package/dist/transforms/content-card.js +19 -0
- package/dist/transforms/custom-scroll-view.js +26 -0
- package/dist/transforms/date-input.js +25 -0
- package/dist/transforms/date-range-input.js +29 -0
- package/dist/transforms/fixed-layout.js +32 -0
- package/dist/transforms/forbid-imports.js +25 -0
- package/dist/transforms/form-item.js +23 -0
- package/dist/transforms/gradient-prop-change.js +29 -0
- package/dist/transforms/horizontal-cell-show-more.js +22 -0
- package/dist/transforms/modal-card.js +32 -0
- package/dist/transforms/modal-page-header.js +32 -0
- package/dist/transforms/pagination.js +31 -0
- package/dist/transforms/panel-header-content.js +32 -0
- package/dist/transforms/popover.js +118 -0
- package/dist/transforms/popper.js +95 -0
- package/dist/transforms/range-slider.js +49 -0
- package/dist/transforms/rich-tooltip.js +24 -0
- package/dist/transforms/search.js +18 -0
- package/dist/transforms/simple-cell.js +47 -0
- package/dist/transforms/split-col.js +33 -0
- package/dist/transforms/tappable.js +30 -0
- package/dist/transforms/text-tooltip.js +139 -0
- package/dist/transforms/tooltip.js +162 -0
- package/dist/transforms/typography.js +68 -0
- package/dist/transforms/users-stack.js +33 -0
- package/dist/transforms/visually-hidden-input.js +42 -0
- package/dist/types.js +2 -0
- package/package.json +44 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
|
+
if (ar || !(i in from)) {
|
|
5
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
6
|
+
ar[i] = from[i];
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.parser = void 0;
|
|
13
|
+
var codemod_helpers_1 = require("../codemod-helpers");
|
|
14
|
+
exports.parser = 'tsx';
|
|
15
|
+
var componentName = 'Tooltip';
|
|
16
|
+
var componentNameTo = 'OnboardingTooltip';
|
|
17
|
+
var ATTRIBUTE_REPLACER = {
|
|
18
|
+
isShown: {
|
|
19
|
+
keyTo: 'shown',
|
|
20
|
+
},
|
|
21
|
+
offsetY: {
|
|
22
|
+
keyTo: 'offsetByMainAxis',
|
|
23
|
+
},
|
|
24
|
+
offsetX: {
|
|
25
|
+
keyTo: 'offsetByCrossAxis',
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
var CORNER_OFFSET = { from: 'cornerOffset', to: 'arrowOffset' };
|
|
29
|
+
var CORNER_ABSOLUTE_OFFSET = { from: 'cornerAbsoluteOffset', to: 'isStaticArrowOffset' };
|
|
30
|
+
var PLACEMENT = 'placement';
|
|
31
|
+
var ALIGN_X = { from: 'alignX', to: PLACEMENT };
|
|
32
|
+
var ALIGN_Y = { from: 'alignY', to: PLACEMENT };
|
|
33
|
+
var isStringLiteral = function (v) {
|
|
34
|
+
return v ? v.type === 'StringLiteral' : false;
|
|
35
|
+
};
|
|
36
|
+
function mapAlignX(x) {
|
|
37
|
+
switch (x) {
|
|
38
|
+
case 'left':
|
|
39
|
+
return 'start';
|
|
40
|
+
case 'right':
|
|
41
|
+
return 'end';
|
|
42
|
+
default:
|
|
43
|
+
return '';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
var replaceAttribute = function (j, attributeReplacer, attribute) {
|
|
47
|
+
var foundFix = attributeReplacer.getReplacers(attribute.node.name.name);
|
|
48
|
+
if (foundFix) {
|
|
49
|
+
var value = attribute.node.value;
|
|
50
|
+
j(attribute).replaceWith(j.jsxAttribute(j.jsxIdentifier(foundFix.keyTo()), foundFix.valueTo(value)));
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
function transformer(file, api, options) {
|
|
54
|
+
var alias = options.alias;
|
|
55
|
+
var j = api.jscodeshift;
|
|
56
|
+
var source = j(file.source);
|
|
57
|
+
var localName = (0, codemod_helpers_1.getImportInfo)(j, file, componentName, alias).localName;
|
|
58
|
+
var attributeReplacer = (0, codemod_helpers_1.createAttributeManipulator)(ATTRIBUTE_REPLACER, api);
|
|
59
|
+
var needRename = true;
|
|
60
|
+
// подменяем импорт
|
|
61
|
+
source
|
|
62
|
+
.find(j.ImportDeclaration)
|
|
63
|
+
.filter(function (path) { return path.node.source.value === alias; })
|
|
64
|
+
.find(j.ImportSpecifier, { imported: { name: componentName } })
|
|
65
|
+
.forEach(function (path) {
|
|
66
|
+
j(path).replaceWith(function (path) {
|
|
67
|
+
if (path.node.local && path.node.local.name !== path.node.imported.name) {
|
|
68
|
+
needRename = false;
|
|
69
|
+
}
|
|
70
|
+
return j.importSpecifier(j.jsxIdentifier(componentNameTo), needRename ? null : path.node.local);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
// переименовываем без проблемные св-ва
|
|
74
|
+
source
|
|
75
|
+
.find(j.JSXOpeningElement)
|
|
76
|
+
.filter(function (path) { return path.value.name.type === 'JSXIdentifier' && path.value.name.name === localName; })
|
|
77
|
+
.find(j.JSXAttribute, function (attribute) { return attributeReplacer.has(attribute.name.name); })
|
|
78
|
+
.forEach(function (attribute) {
|
|
79
|
+
replaceAttribute(j, attributeReplacer, attribute);
|
|
80
|
+
});
|
|
81
|
+
source.findJSXElements(localName).forEach(function (element) {
|
|
82
|
+
// меняем название компонента в JSX на переименованный в импорте (если нужно)
|
|
83
|
+
j(element).replaceWith(function (path) {
|
|
84
|
+
var renamedLocalName = needRename ? componentNameTo : localName;
|
|
85
|
+
return j.jsxElement(j.jsxOpeningElement(j.jsxIdentifier(renamedLocalName), path.node.openingElement.attributes, path.node.closingElement ? false : true), path.node.closingElement ? j.jsxClosingElement(j.jsxIdentifier(renamedLocalName)) : null, path.node.children);
|
|
86
|
+
});
|
|
87
|
+
// разрешаем arrowOffsets
|
|
88
|
+
var _a = [
|
|
89
|
+
j(element)
|
|
90
|
+
.find(j.JSXAttribute, function (attribute) { return attribute.name.name === CORNER_OFFSET.from; })
|
|
91
|
+
.at(0),
|
|
92
|
+
j(element)
|
|
93
|
+
.find(j.JSXAttribute, function (attribute) { return attribute.name.name === CORNER_ABSOLUTE_OFFSET.from; })
|
|
94
|
+
.at(0),
|
|
95
|
+
], cornerOffsetAttr = _a[0], cornerAbsoluteOffsetAttr = _a[1];
|
|
96
|
+
if (cornerOffsetAttr.length === 1 && cornerAbsoluteOffsetAttr.length === 0) {
|
|
97
|
+
cornerOffsetAttr.forEach(function (attribute) {
|
|
98
|
+
j(attribute).replaceWith(j.jsxAttribute(j.jsxIdentifier(CORNER_OFFSET.to), attribute.node.value));
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else if (cornerOffsetAttr.length === 0 && cornerAbsoluteOffsetAttr.length === 1) {
|
|
102
|
+
var valueByCornerAbsolute_1;
|
|
103
|
+
cornerAbsoluteOffsetAttr.forEach(function (attribute) {
|
|
104
|
+
valueByCornerAbsolute_1 = attribute.node.value;
|
|
105
|
+
j(attribute).replaceWith(j.jsxAttribute(j.jsxIdentifier(CORNER_ABSOLUTE_OFFSET.to)));
|
|
106
|
+
});
|
|
107
|
+
// добавляем новое св-во
|
|
108
|
+
var prevAttributes = element.node.openingElement.attributes || [];
|
|
109
|
+
element.node.openingElement.attributes = __spreadArray(__spreadArray([], prevAttributes, true), [
|
|
110
|
+
j.jsxAttribute(j.jsxIdentifier(CORNER_OFFSET.to), valueByCornerAbsolute_1),
|
|
111
|
+
], false);
|
|
112
|
+
}
|
|
113
|
+
else if (cornerOffsetAttr.length === 1 && cornerAbsoluteOffsetAttr.length === 1) {
|
|
114
|
+
var valueByCornerAbsolute_2;
|
|
115
|
+
cornerAbsoluteOffsetAttr.forEach(function (attribute) {
|
|
116
|
+
valueByCornerAbsolute_2 = attribute.node.value;
|
|
117
|
+
j(attribute).replaceWith(j.jsxAttribute(j.jsxIdentifier(CORNER_ABSOLUTE_OFFSET.to)));
|
|
118
|
+
});
|
|
119
|
+
cornerOffsetAttr.forEach(function (attribute) {
|
|
120
|
+
j(attribute).replaceWith(j.jsxAttribute(j.jsxIdentifier(CORNER_OFFSET.to), valueByCornerAbsolute_2));
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
// разрешаем alignX/alignY/placement
|
|
124
|
+
var placementAttr = j(element).find(j.JSXAttribute, function (attribute) { return attribute.name.name === PLACEMENT; });
|
|
125
|
+
var alignX;
|
|
126
|
+
var alignY;
|
|
127
|
+
j(element)
|
|
128
|
+
.find(j.JSXAttribute, function (attribute) { return attribute.name.name === ALIGN_X.from; })
|
|
129
|
+
.forEach(function (attribute) {
|
|
130
|
+
alignX = attribute.node.value;
|
|
131
|
+
j(attribute).remove();
|
|
132
|
+
});
|
|
133
|
+
j(element)
|
|
134
|
+
.find(j.JSXAttribute, function (attribute) { return attribute.name.name === ALIGN_Y.from; })
|
|
135
|
+
.forEach(function (attribute) {
|
|
136
|
+
alignY = attribute.node.value;
|
|
137
|
+
j(attribute).remove();
|
|
138
|
+
});
|
|
139
|
+
if (placementAttr.length === 0) {
|
|
140
|
+
var placement = void 0;
|
|
141
|
+
if (isStringLiteral(alignX) && !isStringLiteral(alignY)) {
|
|
142
|
+
var convertedAlignX = mapAlignX(alignX.value);
|
|
143
|
+
placement = "bottom-".concat(convertedAlignX);
|
|
144
|
+
}
|
|
145
|
+
else if (!isStringLiteral(alignX) && isStringLiteral(alignY)) {
|
|
146
|
+
placement = "".concat(alignY.value, "-start");
|
|
147
|
+
}
|
|
148
|
+
else if (isStringLiteral(alignX) && isStringLiteral(alignY)) {
|
|
149
|
+
var convertedAlignX = mapAlignX(alignX.value);
|
|
150
|
+
placement = "".concat(alignY.value, "-").concat(convertedAlignX);
|
|
151
|
+
}
|
|
152
|
+
if (placement) {
|
|
153
|
+
var prevAttributes = element.node.openingElement.attributes || [];
|
|
154
|
+
element.node.openingElement.attributes = __spreadArray(__spreadArray([], prevAttributes, true), [
|
|
155
|
+
j.jsxAttribute(j.jsxIdentifier(PLACEMENT), j.stringLiteral(placement)),
|
|
156
|
+
], false);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
return source.toSource();
|
|
161
|
+
}
|
|
162
|
+
exports.default = transformer;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
var chalk_1 = __importDefault(require("chalk"));
|
|
7
|
+
var codemod_helpers_1 = require("../codemod-helpers");
|
|
8
|
+
var report_1 = require("../report");
|
|
9
|
+
function transformer(file, api, options) {
|
|
10
|
+
var alias = options.alias;
|
|
11
|
+
var j = api.jscodeshift;
|
|
12
|
+
var source = j(file.source);
|
|
13
|
+
var componentLocalNames = ['Title', 'Headline', 'Subhead'].map(function (name) {
|
|
14
|
+
var localName = (0, codemod_helpers_1.getImportInfo)(j, file, name, alias).localName;
|
|
15
|
+
return localName;
|
|
16
|
+
});
|
|
17
|
+
source
|
|
18
|
+
.find(j.JSXOpeningElement)
|
|
19
|
+
.filter(function (path) {
|
|
20
|
+
return path.value.name.type === 'JSXIdentifier' &&
|
|
21
|
+
componentLocalNames.includes(path.value.name.name);
|
|
22
|
+
})
|
|
23
|
+
.forEach(function (path) {
|
|
24
|
+
var componentAttribute = j(path).find(j.JSXAttribute, { name: { name: 'Component' } });
|
|
25
|
+
if (componentAttribute.length > 0) {
|
|
26
|
+
var componentValue = componentAttribute.get('value');
|
|
27
|
+
if (componentValue.value &&
|
|
28
|
+
(componentValue.value.type === 'StringLiteral' ||
|
|
29
|
+
componentValue.value.type === 'Literal') &&
|
|
30
|
+
componentValue.value.value === 'span') {
|
|
31
|
+
componentAttribute.remove();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
var newValue = void 0;
|
|
36
|
+
var componentName = path.node.name.type === 'JSXIdentifier' && path.node.name.name;
|
|
37
|
+
switch (componentName) {
|
|
38
|
+
case componentLocalNames[1]:
|
|
39
|
+
newValue = 'h4';
|
|
40
|
+
break;
|
|
41
|
+
case componentLocalNames[2]:
|
|
42
|
+
newValue = 'h5';
|
|
43
|
+
break;
|
|
44
|
+
case componentLocalNames[0]:
|
|
45
|
+
var levelAttribute = j(path).find(j.JSXAttribute, { name: { name: 'level' } });
|
|
46
|
+
if (levelAttribute.length === 0) {
|
|
47
|
+
newValue = 'h1';
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
var att = levelAttribute.get(0);
|
|
51
|
+
if (att.node.value &&
|
|
52
|
+
(att.node.value.type === 'StringLiteral' || att.node.value.type === 'Literal')) {
|
|
53
|
+
newValue = "h".concat(att.node.value.value);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
(0, report_1.report)(api, ": prop ".concat(chalk_1.default.white.bgBlue('Component'), " has been changed in ").concat(chalk_1.default.white.bgBlue(componentLocalNames), " component. Manual changes required."));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
path.node.attributes &&
|
|
62
|
+
newValue &&
|
|
63
|
+
path.node.attributes.push(j.jsxAttribute(j.jsxIdentifier('Component'), j.stringLiteral(newValue)));
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return source.toSource();
|
|
67
|
+
}
|
|
68
|
+
exports.default = transformer;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parser = void 0;
|
|
7
|
+
var chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
var codemod_helpers_1 = require("../codemod-helpers");
|
|
9
|
+
var report_1 = require("../report");
|
|
10
|
+
exports.parser = 'tsx';
|
|
11
|
+
function transformer(file, api, options) {
|
|
12
|
+
var alias = options.alias;
|
|
13
|
+
var j = api.jscodeshift;
|
|
14
|
+
var source = j(file.source);
|
|
15
|
+
var localName = (0, codemod_helpers_1.getImportInfo)(j, file, 'UsersStack', alias).localName;
|
|
16
|
+
source
|
|
17
|
+
.find(j.JSXOpeningElement)
|
|
18
|
+
.filter(function (path) { return path.value.name.type === 'JSXIdentifier' && path.value.name.name === localName; })
|
|
19
|
+
.find(j.JSXAttribute)
|
|
20
|
+
.filter(function (attribute) { return attribute.node.name.name === 'layout'; })
|
|
21
|
+
.forEach(function (attribute) {
|
|
22
|
+
var node = attribute.node;
|
|
23
|
+
if (node.value && node.value.type === 'StringLiteral') {
|
|
24
|
+
var newValue = node.value.value === 'vertical' ? 'column' : 'row';
|
|
25
|
+
j(attribute).replaceWith(j.jsxAttribute(j.jsxIdentifier('direction'), j.stringLiteral(newValue)));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
(0, report_1.report)(api, ": ".concat(chalk_1.default.white.bgBlue('layout'), " prop in ").concat(chalk_1.default.white.bgBlue('UsersStack'), " component is no longer available. Manual changes required."));
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return source.toSource();
|
|
32
|
+
}
|
|
33
|
+
exports.default = transformer;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
|
+
if (ar || !(i in from)) {
|
|
5
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
6
|
+
ar[i] = from[i];
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.parser = void 0;
|
|
13
|
+
exports.parser = 'tsx';
|
|
14
|
+
function transformer(file, api, options) {
|
|
15
|
+
var alias = options.alias;
|
|
16
|
+
var j = api.jscodeshift;
|
|
17
|
+
var source = j(file.source);
|
|
18
|
+
var localImportName = 'VisuallyHiddenInput';
|
|
19
|
+
var needRename = true;
|
|
20
|
+
var componentImport = source
|
|
21
|
+
.find(j.ImportDeclaration)
|
|
22
|
+
.filter(function (path) { return path.node.source.value === alias; })
|
|
23
|
+
.find(j.ImportSpecifier)
|
|
24
|
+
.filter(function (path) { return path.node.imported.name === 'VisuallyHiddenInput'; })
|
|
25
|
+
.at(0);
|
|
26
|
+
componentImport.forEach(function (path) {
|
|
27
|
+
if (path.node.local && path.node.local.name !== path.node.imported.name) {
|
|
28
|
+
localImportName = path.node.local.name;
|
|
29
|
+
needRename = false;
|
|
30
|
+
}
|
|
31
|
+
j(path).replaceWith(function (path) {
|
|
32
|
+
return j.importSpecifier(j.identifier('VisuallyHidden'), needRename ? null : path.node.local);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
source.findJSXElements(localImportName).replaceWith(function (path) {
|
|
36
|
+
localImportName = needRename ? 'VisuallyHidden' : localImportName;
|
|
37
|
+
var props = path.node.openingElement.attributes;
|
|
38
|
+
return j.jsxElement(j.jsxOpeningElement(j.jsxIdentifier(localImportName), __spreadArray([j.jsxAttribute(j.jsxIdentifier('Component'), j.stringLiteral('input'))], (props || []), true), path.node.closingElement ? false : true), path.node.closingElement ? j.jsxClosingElement(j.jsxIdentifier(localImportName)) : null, path.node.children);
|
|
39
|
+
});
|
|
40
|
+
return source.toSource();
|
|
41
|
+
}
|
|
42
|
+
exports.default = transformer;
|
package/dist/types.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vkontakte/vkui-codemods",
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"description": "Codemods for automatic VKUI major version upgrade",
|
|
5
|
+
"repository": "https://github.com/VKCOM/VKUI",
|
|
6
|
+
"homepage": "https://vkcom.github.io/VKUI/",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"bin": "./dist/index.js",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"engines": {
|
|
13
|
+
"yarn": "^1.21.1",
|
|
14
|
+
"node": ">16.0.0"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"chalk": "^4.1.2",
|
|
18
|
+
"commander": "^11.0.0",
|
|
19
|
+
"cross-spawn": "^7.0.3",
|
|
20
|
+
"jscodeshift": "^0.13.1",
|
|
21
|
+
"prompts": "^2.4.2",
|
|
22
|
+
"typescript": "^5.3.2"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@swc/core": "^1.3.100",
|
|
26
|
+
"@swc/jest": "^0.2.29",
|
|
27
|
+
"@types/cross-spawn": "^6.0.6",
|
|
28
|
+
"@types/jest": "^29.5.10",
|
|
29
|
+
"@types/jscodeshift": "^0.11.11",
|
|
30
|
+
"@types/node": "^20.10.0",
|
|
31
|
+
"@types/prompts": "^2.4.2",
|
|
32
|
+
"jest": "^29.7.0",
|
|
33
|
+
"ts-node": "^10.9.1"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc",
|
|
37
|
+
"test": "jest",
|
|
38
|
+
"test:ci": "yarn test",
|
|
39
|
+
"migrate": "jscodeshift"
|
|
40
|
+
},
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
}
|
|
44
|
+
}
|