UNPKG

create-react-native-library

Version:
169 lines (167 loc) 4.69 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AVAILABLE_TOOLS = void 0; exports.configureTools = configureTools; var _fsExtra = _interopRequireDefault(require("fs-extra")); var _nodePath = _interopRequireDefault(require("node:path")); var _template = require("../template"); var _sortObjectKeys = _interopRequireDefault(require("./sortObjectKeys")); var _constants = require("../constants"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const ESLINT = { name: 'ESLint with Prettier', description: 'Lint and format code', package: { scripts: { lint: 'eslint "**/*.{js,ts,tsx}"' }, prettier: { quoteProps: 'consistent', singleQuote: true, tabWidth: 2, trailingComma: 'es5', useTabs: false }, devDependencies: { '@eslint/compat': '^1.3.2', '@eslint/eslintrc': '^3.3.1', '@eslint/js': '^9.35.0', '@react-native/eslint-config': _constants.SUPPORTED_REACT_NATIVE_VERSION, 'eslint-config-prettier': '^10.1.8', 'eslint-plugin-prettier': '^5.5.4', 'eslint': '^9.35.0', 'prettier': '^2.8.8' } } }; const LEFTHOOK = { name: 'Lefthook with Commitlint', description: 'Manage Git hooks and lint commit messages', package: { commitlint: { extends: ['@commitlint/config-conventional'] }, devDependencies: { '@commitlint/config-conventional': '^19.8.1', 'commitlint': '^19.8.1', 'lefthook': '^2.0.3' } } }; const RELEASE_IT = { name: 'Release It', description: 'Automate versioning and package publishing tasks', package: { 'scripts': { release: 'release-it --only-version' }, 'release-it': { git: { // eslint-disable-next-line no-template-curly-in-string commitMessage: 'chore: release ${version}', // eslint-disable-next-line no-template-curly-in-string tagName: 'v${version}' }, npm: { publish: true }, github: { release: true }, plugins: { '@release-it/conventional-changelog': { preset: { name: 'angular' } } } }, 'devDependencies': { 'release-it': '^19.0.4', '@release-it/conventional-changelog': '^10.0.1' } } }; const JEST = { name: 'Jest', description: 'Test JavaScript and TypeScript code', package: { scripts: { test: 'jest' }, jest: { preset: 'react-native', modulePathIgnorePatterns: ['<rootDir>/example/node_modules', '<rootDir>/lib/'] }, devDependencies: { '@types/jest': '^29.5.14', 'jest': '^29.7.0' } } }; const TURBOREPO = { name: 'Turborepo', description: 'Cache build outputs on CI', package: { devDependencies: { turbo: '^2.5.6' } } }; const AVAILABLE_TOOLS = exports.AVAILABLE_TOOLS = { 'eslint': ESLINT, 'jest': JEST, 'lefthook': LEFTHOOK, 'release-it': RELEASE_IT }; const REQUIRED_TOOLS = { turborepo: TURBOREPO }; const ALL_TOOLS = { ...AVAILABLE_TOOLS, ...REQUIRED_TOOLS }; async function configureTools({ tools, config, root, packageJson }) { for (const key of [...tools, // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion ...Object.keys(REQUIRED_TOOLS)]) { if (!(key in ALL_TOOLS)) { throw new Error(`Invalid tool '${key}'. Available tools are: ${Object.keys(AVAILABLE_TOOLS).join(', ')}.`); } // @ts-expect-error: We checked the key above const tool = ALL_TOOLS[key]; if (tool.condition && !tool.condition(config)) { continue; } const files = _nodePath.default.resolve(__dirname, `../../templates/tools/${key}`); if (_fsExtra.default.existsSync(files)) { await (0, _template.applyTemplate)(config, files, root); } for (const [key, value] of Object.entries(tool.package)) { if (typeof value === 'object' && value !== null && !Array.isArray(value)) { if (typeof packageJson[key] === 'object' || packageJson[key] == null) { packageJson[key] = { ...packageJson[key], ...value }; if (key === 'dependencies' || key === 'devDependencies' || key === 'peerDependencies') { // @ts-expect-error: We know they are objects here packageJson[key] = (0, _sortObjectKeys.default)(packageJson[key]); } } else { throw new Error(`Cannot merge '${key}' field because it is not an object (got '${String(packageJson[key])}').`); } } else { packageJson[key] = value; } } } } //# sourceMappingURL=configureTools.js.map