diff --git a/package.json b/package.json index f44747c..338c44e 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "lint": "eslint ./src/ --fix", "prettier": "prettier --write src/", "prepare": "husky", - "semantic-release": "semantic-release", + "semantic-release": "node ./repo-scripts/release.ts", "test:watch": "jest --watch", "test": "jest --coverage", "typecheck": "tsc --noEmit", @@ -85,51 +85,6 @@ "lint-staged": { "*.ts": "eslint --cache --cache-location .eslintcache --fix" }, - "release": { - "branches": [ - "main", - "beta" - ], - "plugins": [ - [ - "@semantic-release/commit-analyzer", - { - "preset": "conventionalcommits", - "releaseRules": [ - { - "type": "build", - "scope": "deps", - "release": "patch" - } - ] - } - ], - [ - "@semantic-release/release-notes-generator", - { - "preset": "conventionalcommits", - "presetConfig": { - "types": [ - { - "type": "feat", - "section": "Features" - }, - { - "type": "fix", - "section": "Bug Fixes" - }, - { - "type": "build", - "section": "Dependencies and Other Build Updates", - "hidden": false - } - ] - } - } - ], - "@semantic-release/npm" - ] - }, "volta": { "node": "20.11.0" }, diff --git a/repo-scripts/release.ts b/repo-scripts/release.ts new file mode 100644 index 0000000..4f8c825 --- /dev/null +++ b/repo-scripts/release.ts @@ -0,0 +1,113 @@ +import semanticRelease from 'semantic-release'; + +try { + const result = await semanticRelease( + { + // Core options + branches: [ + '+([0-9])?(.{+([0-9]),x}).x', + 'master', + 'main', + 'next', + 'next-major', + { name: 'beta', prerelease: true }, + { name: 'alpha', prerelease: true }, + ], + /* repositoryUrl: 'https://github.com/me/my-package.git', + // Shareable config + extends: 'my-shareable-config', + // Plugin options + githubUrl: 'https://my-ghe.com', + githubApiPathPrefix: '/api-prefix', */ + plugins: [ + [ + '@semantic-release/commit-analyzer', + { + preset: 'conventionalcommits', + releaseRules: [ + { + type: 'build', + scope: 'deps', + release: 'patch', + }, + ], + }, + ], + [ + '@semantic-release/release-notes-generator', + { + preset: 'conventionalcommits', + presetConfig: { + types: [ + { + type: 'feat', + section: 'Features', + }, + { + type: 'fix', + section: 'Bug Fixes', + }, + { + type: 'build', + section: 'Dependencies and Other Build Updates', + hidden: false, + }, + ], + }, + }, + ], + '@semantic-release/npm', + [ + '@semantic-release/github', + { + successComment: + ":tada: This ${issue.pull_request ? 'pull request' : 'issue'} is included in version ${nextRelease.version}", + }, + ], + [ + '@semantic-release/git', + { + assets: ['package.json', 'package-lock.json'], + message: + 'chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}', + }, + ], + ], + } + /* { + // Run semantic-release from `/path/to/git/repo/root` without having to change local process `cwd` with `process.chdir()` + cwd: '/path/to/git/repo/root', + // Pass the variable `MY_ENV_VAR` to semantic-release without having to modify the local `process.env` + env: { ...process.env, MY_ENV_VAR: 'MY_ENV_VAR_VALUE' }, + // Store stdout and stderr to use later instead of writing to `process.stdout` and `process.stderr` + stdout: stdoutBuffer, + stderr: stderrBuffer, + }, */ + ); + + if (result) { + const { lastRelease, commits, nextRelease, releases } = result; + + console.log( + `Published ${nextRelease.type} release version ${nextRelease.version} containing ${commits.length} commits.` + ); + + if (lastRelease.version) { + console.log(`The last release was "${lastRelease.version}".`); + } + + for (const release of releases) { + console.log( + `The release was published with plugin "${release.pluginName}".` + ); + } + } else { + console.log('No release published.'); + } + + // Get stdout and stderr content + /* const logs = stdoutBuffer.getContentsAsString('utf8'); + const errors = stderrBuffer.getContentsAsString('utf8'); */ +} catch (err) { + console.error('The automated release failed with %O', err); +} diff --git a/tsconfig.json b/tsconfig.json index 9583839..b4afb51 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,17 +5,17 @@ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "ES2022", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ - "module": "ES2022", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + "target": "ES2022" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "ES2022" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, // "lib": ["ES2022"], /* Specify library files to be included in the compilation. */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ // "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./lib/", /* Redirect output structure to the directory. */ + "outDir": "./lib/" /* Redirect output structure to the directory. */, // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ // "composite": true, /* Enable project compilation */ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ @@ -26,7 +26,7 @@ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ + "strict": true /* Enable all strict type-checking options. */, // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ @@ -44,14 +44,14 @@ // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ /* Module Resolution Options */ - "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "typeRoots": [], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ @@ -66,8 +66,15 @@ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ /* Advanced Options */ - "skipLibCheck": true, /* Skip type checking of declaration files. */ - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ }, - "include": ["src/*.ts", "test/*.ts", "bin/*.ts", "src/__mocks__/*.ts", "jest.config.ts"] -} \ No newline at end of file + "include": [ + "src/*.ts", + "test/*.ts", + "bin/*.ts", + "repo-scripts/*.ts", + "src/__mocks__/*.ts", + "jest.config.ts" + ] +}