├── jest.setup.js ├── packages ├── monoo │ ├── README.md │ ├── tsconfig.json │ ├── src │ │ ├── index.ts │ │ ├── release │ │ │ ├── shared │ │ │ │ ├── index.ts │ │ │ │ ├── fetchPackageVersion.ts │ │ │ │ ├── fetch.ts │ │ │ │ └── logger.ts │ │ │ ├── changelog │ │ │ │ ├── pipelines │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── beautify.ts │ │ │ │ │ ├── normalize-commit-url.ts │ │ │ │ │ ├── shared.ts │ │ │ │ │ └── attach-author.ts │ │ │ │ ├── regexp.ts │ │ │ │ ├── index.ts │ │ │ │ └── helpers.ts │ │ │ ├── patch │ │ │ │ ├── helper.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── dev │ │ │ ├── types.ts │ │ │ └── index.ts │ │ └── cli.ts │ ├── bin │ │ └── cli.js │ ├── tsconfig.build.json │ └── package.json └── @monoo │ ├── shared │ ├── README.md │ ├── tsconfig.json │ ├── src │ │ ├── index.ts │ │ ├── terminal.ts │ │ ├── util.ts │ │ └── monorepo-builder.ts │ ├── tsconfig.build.json │ └── package.json │ └── types │ ├── README.md │ ├── tsconfig.json │ ├── src │ ├── lerna.ts │ ├── index.ts │ ├── use-config.ts │ ├── monorepo.ts │ └── monorepo-builder.ts │ ├── tsconfig.build.json │ └── package.json ├── .gitignore ├── .vscode └── settings.json ├── assets ├── workflow.png └── release-status.png ├── pnpm-workspace.yaml ├── tsconfig.json ├── lerna.json ├── tsconfig.test.json ├── tsconfig.build.json ├── __tests__ ├── changelog │ └── pipelines │ │ ├── __snapshots__ │ │ ├── normalize-commit-url.test.ts.snap │ │ ├── beutify.test.ts.snap │ │ └── attach-author.test.ts.snap │ │ ├── normalize-commit-url.test.ts │ │ ├── beutify.test.ts │ │ └── attach-author.test.ts └── release │ └── patch │ ├── helper.test.ts │ ├── __snapshots__ │ └── helper.test.ts.snap │ └── index.js ├── jest.config.js ├── .github └── workflows │ └── node.js.yml ├── package.json ├── LICENSE ├── CHANGELOG.md ├── README.md └── tsconfig.tsbuildinfo /jest.setup.js: -------------------------------------------------------------------------------- 1 | jest.setTimeout(100000); 2 | -------------------------------------------------------------------------------- /packages/monoo/README.md: -------------------------------------------------------------------------------- 1 | # @monoo/shared -------------------------------------------------------------------------------- /packages/@monoo/shared/README.md: -------------------------------------------------------------------------------- 1 | # @monoo/shared -------------------------------------------------------------------------------- /packages/@monoo/types/README.md: -------------------------------------------------------------------------------- 1 | # @monoo/types -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | lib 3 | **/tsconfig.build.tsbuildinfo -------------------------------------------------------------------------------- /packages/monoo/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json" 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "monoo" 4 | ] 5 | } -------------------------------------------------------------------------------- /assets/workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ulivz/monoo/HEAD/assets/workflow.png -------------------------------------------------------------------------------- /packages/monoo/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './dev'; 2 | export * from './release'; 3 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - "packages/monoo" 3 | - "packages/@monoo/*" 4 | -------------------------------------------------------------------------------- /packages/@monoo/shared/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json" 3 | } 4 | -------------------------------------------------------------------------------- /packages/@monoo/types/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.json" 3 | } 4 | -------------------------------------------------------------------------------- /assets/release-status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ulivz/monoo/HEAD/assets/release-status.png -------------------------------------------------------------------------------- /packages/monoo/bin/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require('../lib/cli').bootstrapCli(); 4 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.build.json", 3 | "compilerOptions": { 4 | "noEmit": true 5 | } 6 | } -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": [ 3 | "packages/monoo", 4 | "packages/@monoo/*" 5 | ], 6 | "version": "0.4.3" 7 | } -------------------------------------------------------------------------------- /packages/monoo/src/release/shared/index.ts: -------------------------------------------------------------------------------- 1 | export * from './fetchPackageVersion'; 2 | export * from './fetch'; 3 | export * from './logger'; 4 | -------------------------------------------------------------------------------- /packages/@monoo/types/src/lerna.ts: -------------------------------------------------------------------------------- 1 | export interface ILernaConfig { 2 | version: string; 3 | packages: string[]; 4 | [key: string]: unknown; 5 | } 6 | -------------------------------------------------------------------------------- /packages/@monoo/types/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-config'; 2 | export * from './monorepo'; 3 | export * from './monorepo-builder'; 4 | export * from './lerna'; 5 | -------------------------------------------------------------------------------- /packages/@monoo/types/src/use-config.ts: -------------------------------------------------------------------------------- 1 | export interface IUserConfig { 2 | b: { 3 | paths: Record; 4 | use: string; 5 | args: string; 6 | }; 7 | } 8 | -------------------------------------------------------------------------------- /packages/@monoo/shared/src/index.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | export { chalk }; 3 | export * from "./terminal"; 4 | export * from "./monorepo-builder"; 5 | export * from "./util"; 6 | -------------------------------------------------------------------------------- /packages/monoo/src/release/changelog/pipelines/index.ts: -------------------------------------------------------------------------------- 1 | export * from './beautify'; 2 | export * from './attach-author'; 3 | export * from './shared'; 4 | export * from './normalize-commit-url'; 5 | -------------------------------------------------------------------------------- /packages/monoo/src/release/changelog/regexp.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * A regexp to match commit 3 | */ 4 | export const COMMIT_RE = 5 | /\(\[([a-z0-9]{7})\]\(([^()]*)\)\)([^\n()[]]*)?(\[@(.*)\]\(.*\))?/gm; 6 | -------------------------------------------------------------------------------- /packages/monoo/src/dev/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { IMonorepoBuilderOptions } from '@monoo/types'; 5 | 6 | export interface IDOptions extends IMonorepoBuilderOptions {} 7 | -------------------------------------------------------------------------------- /packages/@monoo/shared/src/terminal.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import chalk from 'chalk'; 5 | 6 | export function styled(msg: string): string { 7 | return chalk.bold(chalk.blueBright(msg)); 8 | } 9 | -------------------------------------------------------------------------------- /packages/monoo/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.build.json", 3 | "compilerOptions": { 4 | "rootDir": "src", 5 | "outDir": "lib" 6 | }, 7 | "include": [ 8 | "src" 9 | ] 10 | } -------------------------------------------------------------------------------- /packages/@monoo/shared/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.build.json", 3 | "compilerOptions": { 4 | "rootDir": "src", 5 | "outDir": "lib" 6 | }, 7 | "include": [ 8 | "src" 9 | ] 10 | } -------------------------------------------------------------------------------- /packages/@monoo/types/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../tsconfig.build.json", 3 | "compilerOptions": { 4 | "rootDir": "src", 5 | "outDir": "lib" 6 | }, 7 | "include": [ 8 | "src" 9 | ] 10 | } -------------------------------------------------------------------------------- /tsconfig.test.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "noEmit": true, 6 | "noImplicitThis": false, 7 | "noImplicitAny": false, 8 | "moduleResolution": "node", 9 | "baseUrl": ".", 10 | "skipLibCheck": true 11 | }, 12 | "include": [ 13 | "__tests__", 14 | ], 15 | "exclude": [ 16 | "node_modules" 17 | ] 18 | } -------------------------------------------------------------------------------- /packages/monoo/src/release/shared/fetchPackageVersion.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { execa } from "@monoo/shared"; 5 | 6 | /** 7 | * Fetch package version 8 | */ 9 | export async function fetchPackageVersion(name: string, tag: string) { 10 | try { 11 | return ( 12 | await execa("npm", ["view", `${name}@${tag}`, "version"]) 13 | ).stdout.toString(); 14 | } catch (e) { 15 | // console.log(e); 16 | return "- (1st release)"; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "rootDir": ".", 4 | "baseUrl": "src", 5 | "module": "commonjs", 6 | "target": "es2016", 7 | "sourceMap": true, 8 | "declaration": true, 9 | "declarationMap": true, 10 | "noEmitOnError": true, 11 | "skipLibCheck": true, 12 | "esModuleInterop": true, 13 | "jsx": "react", 14 | "composite": true, 15 | "noEmit": false, 16 | "outDir": "" 17 | }, 18 | "exclude": ["node_modules", "lib"] 19 | } 20 | -------------------------------------------------------------------------------- /__tests__/changelog/pipelines/__snapshots__/normalize-commit-url.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`ChangelogProcessor4NormalizeCommitUrl default 1`] = ` 4 | "# [0.0.0](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 5 | 6 | ## [0.2.4](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 7 | 8 | 9 | ### Bug Fixes 10 | 11 | * \`--ignore-scripts\` description ([663a396](https://github.com/speedy/mono/commit/663a3963b63706d273068895f4dd79d6c70472c2)) 12 | 13 | " 14 | `; 15 | -------------------------------------------------------------------------------- /packages/@monoo/types/src/monorepo.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * A interface to describe a package under monorepo. 3 | */ 4 | 5 | export interface IPackageJSON { 6 | name: string; 7 | version: string; 8 | workspaces?: string[]; 9 | private?: boolean; 10 | [key:string]:any; 11 | } 12 | 13 | export interface IMonorepoPackage { 14 | key: string; 15 | relative: string; 16 | dir: string; 17 | name: string; 18 | version: string; 19 | packageJson: IPackageJSON; 20 | } 21 | 22 | export interface IMonorepoPackageWithRemoteInfo extends IMonorepoPackage { 23 | remoteVersion: string; 24 | } -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | globals: { 3 | "ts-jest": { 4 | diagnostics: false, 5 | tsconfig: "tsconfig.test.json", 6 | }, 7 | }, 8 | testEnvironment: "node", 9 | setupFilesAfterEnv: [`${__dirname}/jest.setup.js`], 10 | testMatch: ["**/(*.)+(spec|test).ts?(x)"], 11 | transform: { 12 | "^.+\\.(t|j)sx?$": "ts-jest", 13 | }, 14 | snapshotSerializers: ["jest-serializer-path"], 15 | coveragePathIgnorePatterns: ["/__tests__/", "/__fixtures__/", "/bin/"], 16 | collectCoverageFrom: ["packages/**/src/**/*.{ts,tsx}"], 17 | moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], 18 | }; 19 | -------------------------------------------------------------------------------- /packages/@monoo/types/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@monoo/types", 3 | "description": "Types for monoo", 4 | "version": "0.4.3", 5 | "main": "lib/index", 6 | "types": "lib/index", 7 | "files": [ 8 | "lib" 9 | ], 10 | "scripts": { 11 | "dev": "pnpm run build -w", 12 | "clean": "rimraf ./lib *.tsbuildinfo", 13 | "build": "tsc -b tsconfig.build.json", 14 | "prepublishOnly": "pnpm run build" 15 | }, 16 | "dependencies": { 17 | "@types/node": "16" 18 | }, 19 | "devDependencies": { 20 | "rimraf": "4.1.0" 21 | }, 22 | "publishConfig": { 23 | "registry": "https://registry.npmjs.org", 24 | "access": "public" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /packages/monoo/src/release/changelog/pipelines/beautify.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { TChangelogProcessor } from './shared'; 5 | 6 | /** 7 | * Remove top-level useless header 8 | * 9 | * @see https://github.com/conventional-changelog/conventional-changelog/issues/376 10 | * @param cwd 11 | * @param input 12 | * @returns 13 | */ 14 | export const ChangelogProcessor4Beautify: TChangelogProcessor = ( 15 | cwd, 16 | input, 17 | ) => { 18 | input = input.trim(); 19 | const changelogLines = input.split('\n'); 20 | if (/# \[((0|1)\.0\.0)?\]/.test(changelogLines[0])) { 21 | input = changelogLines.slice(1).join('\n').trim(); 22 | } 23 | return input; 24 | }; 25 | -------------------------------------------------------------------------------- /__tests__/changelog/pipelines/__snapshots__/beutify.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`ChangelogProcessor4Beautify remove 0.0.0 1`] = ` 4 | "## [0.2.4](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 5 | 6 | 7 | ### Bug Fixes 8 | 9 | * \`--ignore-scripts\` description ([663a396](https://github.com/speedy/mono/commits/663a3963b63706d273068895f4dd79d6c70472c2))" 10 | `; 11 | 12 | exports[`ChangelogProcessor4Beautify remove 1.0.0 1`] = `"## [0.5.22](https://github.com/foo/bar/compare/v0.5.21...v0.5.22) (2021-11-24)"`; 13 | 14 | exports[`ChangelogProcessor4Beautify remove empty header 1`] = `"## [0.1.1](https://github.com/foo/bar/compare/v0.1.0...v0.1.1) (2021-12-04)"`; 15 | -------------------------------------------------------------------------------- /packages/monoo/src/release/changelog/pipelines/normalize-commit-url.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { TChangelogProcessor } from './shared'; 5 | import { COMMIT_RE } from '../regexp'; 6 | 7 | /** 8 | * Normalize commit url 9 | * 10 | * @param cwd 11 | * @param input 12 | * @returns 13 | */ 14 | export const ChangelogProcessor4NormalizeCommitUrl: TChangelogProcessor = ( 15 | cwd, 16 | input, 17 | ) => { 18 | return input.replace( 19 | COMMIT_RE, 20 | ( 21 | m, 22 | s1 /* hash */, 23 | s2 /* url */, 24 | s3 /* white space */, 25 | s4 /* author part */, 26 | s5 /* author text */, 27 | ): string => { 28 | return m.replace('commits', 'commit'); 29 | }, 30 | ); 31 | }; 32 | -------------------------------------------------------------------------------- /packages/monoo/src/dev/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { chalk, MonorepoBuilder, styled } from "@monoo/shared"; 5 | import { IDOptions } from "./types"; 6 | 7 | /** 8 | * Quickly launch on-demand development build for monorepo. 9 | */ 10 | export function dev(opts: IDOptions = {}) { 11 | opts = { 12 | cwd: process.cwd(), 13 | ...opts, 14 | }; 15 | 16 | const builder = new MonorepoBuilder(opts); 17 | builder.bootstrap(); 18 | builder.watch(); 19 | builder.enableStdinFeature(); 20 | console.log(); 21 | console.log( 22 | ` ${styled(`[MONOO]`)} Development mode ${chalk.gray( 23 | `(modify code to create builder or enter ${styled( 24 | "n" 25 | )} to create builder manually.)` 26 | )}` 27 | ); 28 | console.log(); 29 | } 30 | -------------------------------------------------------------------------------- /__tests__/changelog/pipelines/normalize-commit-url.test.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { ChangelogProcessor4NormalizeCommitUrl } from '../../../src/release/changelog/pipelines/normalize-commit-url'; 5 | 6 | describe('ChangelogProcessor4NormalizeCommitUrl', () => { 7 | const input = `# [0.0.0](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 8 | 9 | ## [0.2.4](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 10 | 11 | 12 | ### Bug Fixes 13 | 14 | * \`--ignore-scripts\` description ([663a396](https://github.com/speedy/mono/commits/663a3963b63706d273068895f4dd79d6c70472c2)) 15 | 16 | `; 17 | 18 | it('default', () => { 19 | expect( 20 | ChangelogProcessor4NormalizeCommitUrl('', input, {}), 21 | ).toMatchSnapshot(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /__tests__/release/patch/helper.test.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { getVisibleReleaseStatusLog } from "../../../src/release/patch/helper"; 5 | import { NpmNS } from "../../../src/release/types"; 6 | 7 | it("getVisibleReleaseStatusLog", () => { 8 | const log = getVisibleReleaseStatusLog( 9 | [ 10 | { 11 | name: "@scope/foo", 12 | version: "2.1.2", 13 | }, 14 | { 15 | name: "@scope/bar", 16 | version: "2.1.1", 17 | }, 18 | { 19 | name: "@scope/baz", 20 | version: "2.1.2", 21 | }, 22 | { 23 | name: "@scope/qux", 24 | version: "2.1.1", 25 | }, 26 | ] as NpmNS.IRemotePackageInfo[], 27 | "2.1.2", 28 | "next" 29 | ); 30 | console.log(log); 31 | expect(require("strip-ansi")(log)).toMatchSnapshot(); 32 | }); 33 | -------------------------------------------------------------------------------- /__tests__/release/patch/__snapshots__/helper.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`getVisibleReleaseStatusLog 1`] = ` 4 | "╭───────────────────────────────────────────────────────────────────────────╮ 5 | │ │ 6 | │ Package Name Remote Version (tag: next) Published Expected Version │ 7 | │ @scope/foo 2.1.2 Yes - │ 8 | │ @scope/bar 2.1.1 NO 2.1.2 │ 9 | │ @scope/baz 2.1.2 Yes - │ 10 | │ @scope/qux 2.1.1 NO 2.1.2 │ 11 | │ │ 12 | ╰───────────────────────────────────────────────────────────────────────────╯" 13 | `; 14 | -------------------------------------------------------------------------------- /packages/monoo/src/release/shared/fetch.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies. 3 | */ 4 | 5 | import fetch, { RequestInit, Response } from 'node-fetch'; 6 | 7 | /** 8 | * Expose a wrapped fetch which handles network error. 9 | */ 10 | 11 | export function wfetch(url: string, options: RequestInit = {}) { 12 | return fetch(url, options).then(handleResponse, handleNetworkError); 13 | } 14 | 15 | /** 16 | * Response handler 17 | * 18 | * @param {Response} response 19 | * @returns {Promise>|never} 20 | */ 21 | 22 | function handleResponse(response: Response) { 23 | if (response.ok) { 24 | return response.json(); 25 | } 26 | return response.json().then((error) => { 27 | throw error; 28 | }); 29 | } 30 | 31 | /** 32 | * Network error handler 33 | * 34 | * @param {Error} error 35 | */ 36 | 37 | function handleNetworkError(error: Error) { 38 | throw error; 39 | } 40 | -------------------------------------------------------------------------------- /__tests__/release/patch/index.js: -------------------------------------------------------------------------------- 1 | const { 2 | getVisibleReleaseStatusLog, 3 | } = require("../../../lib/release/patch/helper"); 4 | const inquirer = require("inquirer"); 5 | 6 | (async function () { 7 | const log = getVisibleReleaseStatusLog( 8 | [ 9 | { 10 | name: "@scope/foo", 11 | version: "2.1.2", 12 | }, 13 | { 14 | name: "@scope/bar", 15 | version: "2.1.1", 16 | }, 17 | { 18 | name: "@scope/baz", 19 | version: "2.1.2", 20 | }, 21 | { 22 | name: "@scope/qux", 23 | version: "2.1.1", 24 | }, 25 | ], 26 | "2.1.2", 27 | "next" 28 | ); 29 | console.log(log); 30 | const { yes } = await inquirer.prompt([ 31 | { 32 | name: "yes", 33 | message: "Continue to patch", 34 | type: "list", 35 | choices: ["N", "Y"], 36 | }, 37 | ]); 38 | })(); 39 | -------------------------------------------------------------------------------- /packages/@monoo/shared/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@monoo/shared", 3 | "description": "Shared for monoo", 4 | "version": "0.4.3", 5 | "main": "lib/index", 6 | "types": "lib/index", 7 | "files": [ 8 | "lib" 9 | ], 10 | "scripts": { 11 | "dev": "pnpm run build -w", 12 | "clean": "rimraf ./lib *.tsbuildinfo", 13 | "build": "tsc -b tsconfig.build.json", 14 | "prepublishOnly": "pnpm run build" 15 | }, 16 | "dependencies": { 17 | "@monoo/types": "0.4.3", 18 | "@types/fs-extra": "8.1.0", 19 | "chalk": "2.4.1", 20 | "chokidar": "3.4.0", 21 | "execa": "^3.2.0", 22 | "fs-extra": "7.0.0", 23 | "globby": "^9.0.0", 24 | "shelljs": "0.8.4" 25 | }, 26 | "devDependencies": { 27 | "@types/shelljs": "0.8.8", 28 | "rimraf": "4.1.0" 29 | }, 30 | "publishConfig": { 31 | "registry": "https://registry.npmjs.org", 32 | "access": "public" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /packages/monoo/src/release/shared/logger.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { chalk } from "@monoo/shared"; 5 | 6 | const { name: ID } = require("../../../package.json"); 7 | 8 | const debug = require("debug")(ID); 9 | 10 | function error(msg: string) { 11 | return console.log( 12 | `${chalk.cyan("❯ ")}${chalk.gray(ID)} ${chalk.red("error")} ${msg}` 13 | ); 14 | } 15 | 16 | function info(msg: string) { 17 | return console.log(`${chalk.cyan("❯ ")}${chalk.gray(ID)} 💬 ${msg}`); 18 | } 19 | 20 | function warn(msg: string) { 21 | return console.log(`${chalk.cyan("❯ ")}${chalk.gray(ID)} ⚠️ ${msg}`); 22 | } 23 | 24 | function enableDebug() { 25 | require("debug").enable(ID); 26 | } 27 | 28 | function disableDebug() { 29 | require("debug").disable(ID); 30 | } 31 | 32 | const logger = { 33 | info, 34 | warn, 35 | error, 36 | debug, 37 | enableDebug, 38 | disableDebug, 39 | }; 40 | 41 | export { logger }; 42 | -------------------------------------------------------------------------------- /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [12.x, 14.x, 16.x] 20 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 21 | 22 | steps: 23 | - name: checkout 24 | uses: actions/checkout@v2 25 | 26 | - name: Install pnpm 27 | uses: pnpm/action-setup@v2.0.1 28 | with: 29 | version: 6.14.6 30 | 31 | - name: install 32 | run: npm run bootstrap 33 | 34 | - name: test 35 | run: npm run test 36 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "monoo", 3 | "description": "Monorepo development & continuous integration tooling.", 4 | "version": "0.3.4", 5 | "publishConfig": { 6 | "registry": "https://registry.npmjs.org", 7 | "access": "public" 8 | }, 9 | "scripts": { 10 | "bootstrap": "pnpm install --prefer-offline", 11 | "build": "pnpm run -r build", 12 | "clean": "pnpm run -r clean", 13 | "dev": "monoo d", 14 | "release": "monoo r --changelog --ignore-scripts --build", 15 | "prepublishOnly": "npm run clean && npm run build", 16 | "test": "jest", 17 | "cov": "jest --coverage" 18 | }, 19 | "devDependencies": { 20 | "monoo": "0.4.0", 21 | "@types/jest": "27.0.0", 22 | "jest": "27.3.1", 23 | "jest-cli": "27.3.1", 24 | "jest-serializer-path": "0.1.15" 25 | }, 26 | "repository": { 27 | "url": "git@github.com:ulivz/mono.git", 28 | "type": "git" 29 | }, 30 | "files": [ 31 | "bin", 32 | "lib", 33 | "!lib/*.tsbuildinfo", 34 | "!lib/*.map", 35 | "types", 36 | "*.d.ts" 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /packages/monoo/src/release/changelog/pipelines/shared.ts: -------------------------------------------------------------------------------- 1 | export type TChangelogProcessorOptions = object; 2 | 3 | export type TChangelogProcessor< 4 | T extends TChangelogProcessorOptions = TChangelogProcessorOptions, 5 | > = (cwd: string, input: string, options: T) => string; 6 | 7 | export type TChangelogProcessorTuple = [ 8 | TChangelogProcessor, 9 | TChangelogProcessorOptions, 10 | ]; 11 | 12 | export class ChangelogProcessor { 13 | constructor(private cwd: string, private input: string) {} 14 | 15 | private processorsTuple: TChangelogProcessorTuple[] = []; 16 | 17 | /** 18 | * Add a processor 19 | */ 20 | addProcessor( 21 | processor: T, 22 | options: Parameters['2'], 23 | ) { 24 | this.processorsTuple.push([processor, options]); 25 | } 26 | 27 | /** 28 | * Process and get final result 29 | */ 30 | process() { 31 | const { cwd, input } = this; 32 | return this.processorsTuple.reduce((memo, current) => { 33 | memo = current[0](cwd, memo, current[1]); 34 | return memo; 35 | }, input); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /packages/@monoo/types/src/monorepo-builder.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import type { ChildProcess } from 'child_process'; 5 | import { IMonorepoPackage } from './monorepo'; 6 | 7 | export interface IMonorepoBuilderOptions { 8 | cwd?: string; 9 | } 10 | 11 | export interface IMonorepoBuilderWatchOptions { 12 | exclude?: string[]; 13 | } 14 | 15 | export interface IMonorepoBuilderStdinOptions { 16 | exclude?: string[]; 17 | } 18 | 19 | /** 20 | * A map to store build processes. 21 | */ 22 | export interface MonorepoBuilderProcessPool { 23 | [key: string]: ChildProcess; 24 | } 25 | 26 | /** 27 | * A map to store build promise. 28 | */ 29 | export interface MonorepoBuilderPromisePool { 30 | [key: string]: Promise; 31 | } 32 | 33 | /** 34 | * Expose `IMonorepoBuilder` 35 | */ 36 | export interface IMonorepoBuilder { 37 | packages: IMonorepoPackage[]; 38 | createBuildProcess(pkg: IMonorepoPackage, script?: string): ChildProcess; 39 | bootstrap(): Promise; 40 | watch(watchOptions?: IMonorepoBuilderWatchOptions): void; 41 | enableStdinFeature(stdinOptions?: IMonorepoBuilderStdinOptions): void; 42 | } 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) ULIVZ (https://github.com/ulivz) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /packages/monoo/src/release/patch/helper.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import boxen, { BorderStyle } from "boxen"; 5 | import textTable from "text-table"; 6 | import stringWidth from "string-width"; 7 | import { IMonorepoPackageWithRemoteInfo } from '@monoo/types'; 8 | import { chalk } from '@monoo/shared'; 9 | 10 | /** 11 | * Get visible release status log 12 | */ 13 | export function getVisibleReleaseStatusLog( 14 | pkgs: IMonorepoPackageWithRemoteInfo[], 15 | currentVersion: string, 16 | currentTag: string 17 | ) { 18 | const table = pkgs.map((pkg) => { 19 | if (pkg.remoteVersion === currentVersion) { 20 | return [pkg.name, pkg.version, "Yes", "-"].map((v) => chalk.dim(v)); 21 | } 22 | 23 | return [ 24 | chalk.bold(chalk.red(pkg.name)), 25 | chalk.bold(chalk.red(pkg.remoteVersion)), 26 | chalk.bold(chalk.red("NO")), 27 | chalk.bold(chalk.red(currentVersion)), 28 | ]; 29 | }); 30 | 31 | table.unshift( 32 | [ 33 | "Package Name", 34 | `Remote Version (tag: ${currentTag})`, 35 | "Published", 36 | "Expected Version", 37 | ].map((v) => chalk.dim(v)) 38 | ); 39 | 40 | return boxen( 41 | textTable(table, { 42 | stringLength: stringWidth, 43 | }), 44 | { 45 | borderStyle: BorderStyle.Round, 46 | padding: 1, 47 | dimBorder: true, 48 | } 49 | ) 50 | } 51 | -------------------------------------------------------------------------------- /__tests__/changelog/pipelines/beutify.test.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { ChangelogProcessor4Beautify } from '../../../src/release/changelog/pipelines/beautify'; 5 | 6 | describe('ChangelogProcessor4Beautify', () => { 7 | 8 | it('remove 0.0.0', () => { 9 | const input = `# [0.0.0](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 10 | 11 | ## [0.2.4](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 12 | 13 | 14 | ### Bug Fixes 15 | 16 | * \`--ignore-scripts\` description ([663a396](https://github.com/speedy/mono/commits/663a3963b63706d273068895f4dd79d6c70472c2)) 17 | 18 | `; 19 | 20 | expect(ChangelogProcessor4Beautify('', input, {})).toMatchSnapshot(); 21 | }); 22 | 23 | it('remove 1.0.0', () => { 24 | const input = `# [1.0.0](https://github.com/foo/bar/compare/v0.5.22...v1.0.0) (2021-11-24) 25 | 26 | 27 | 28 | ## [0.5.22](https://github.com/foo/bar/compare/v0.5.21...v0.5.22) (2021-11-24) 29 | 30 | ` 31 | expect(ChangelogProcessor4Beautify('', input, {})).toMatchSnapshot(); 32 | }); 33 | 34 | it('remove empty header', () => { 35 | const input = `# [](https://github.com/foo/bar/compare/v0.1.1...v) (2021-12-04) 36 | 37 | 38 | 39 | ## [0.1.1](https://github.com/foo/bar/compare/v0.1.0...v0.1.1) (2021-12-04) 40 | ` 41 | expect(ChangelogProcessor4Beautify('', input, {})).toMatchSnapshot(); 42 | }); 43 | }); 44 | -------------------------------------------------------------------------------- /packages/monoo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "monoo", 3 | "description": "monoo cli", 4 | "version": "0.4.3", 5 | "main": "lib/index", 6 | "types": "lib/index", 7 | "files": [ 8 | "lib" 9 | ], 10 | "bin": { 11 | "monoo": "bin/cli.js" 12 | }, 13 | "scripts": { 14 | "dev": "pnpm run build -w", 15 | "clean": "rimraf ./lib *.tsbuildinfo", 16 | "build": "tsc -b tsconfig.build.json", 17 | "prepublishOnly": "pnpm run build" 18 | }, 19 | "dependencies": { 20 | "@monoo/shared": "0.4.3", 21 | "@monoo/types": "0.4.3", 22 | "@speedy-js/config-loader": "0.1.3", 23 | "boxen": "^4.1.0", 24 | "cac": "^6.5.10", 25 | "conventional-changelog": "^3.1.24", 26 | "conventional-changelog-cli": "^2.0.31", 27 | "debug": "^4.3.2", 28 | "inquirer": "^7.2.0", 29 | "lerna": "^4.0.0", 30 | "node-fetch": "^2.6.0", 31 | "semver": "^6.3.0", 32 | "string-width": "^4.2.0", 33 | "text-table": "^0.2.0", 34 | "tslib": "^2.3.1", 35 | "url-join": "^4.0.1" 36 | }, 37 | "devDependencies": { 38 | "@types/cors": "^2.8.9", 39 | "@types/express": "^4.17.6", 40 | "@types/inquirer": "^7.3.3", 41 | "@types/node-fetch": "^2.5.11", 42 | "@types/semver": "^6.2.0", 43 | "@types/string-width": "^4.0.1", 44 | "@types/text-table": "^0.2.2", 45 | "@types/url-join": "^4.0.1", 46 | "rimraf": "4.1.0", 47 | "strip-ansi": "6.0.1", 48 | "ts-jest": "27.0.7", 49 | "typescript": "4.5.2" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /packages/monoo/src/release/changelog/pipelines/attach-author.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { ChangelogNS } from '../../types'; 5 | import { TChangelogProcessor } from './shared'; 6 | import { getCommitHashAuthorMap } from '../helpers'; 7 | import { COMMIT_RE } from '../regexp'; 8 | 9 | export interface IDisplayAuthorOptions { 10 | getAuthorPage?(author: ChangelogNS.ICommitAuthor): string; 11 | displayType?: 'name' | 'email'; 12 | } 13 | 14 | export const ChangelogProcessor4AttachAuthor: TChangelogProcessor = 15 | (cwd, input, options = {}) => { 16 | const displayType = options.displayType ?? 'name'; 17 | const getAuthorPage = 18 | options.getAuthorPage ?? 19 | ((author: ChangelogNS.ICommitAuthor) => { 20 | return `https://github.com/${author.name}`; 21 | }); 22 | 23 | const hashAuthorMap = getCommitHashAuthorMap(cwd); 24 | const ret = input.replace( 25 | COMMIT_RE, 26 | ( 27 | m, 28 | s1 /* hash */, 29 | s2 /* url */, 30 | s3 /* white space */, 31 | s4 /* author part */, 32 | s5 /* author text */, 33 | ): string => { 34 | const author = hashAuthorMap[s1]; 35 | /** 36 | * s4 exists, do not need generate author 37 | */ 38 | if (!author || s4) { 39 | return m; 40 | } 41 | const dispalyName = 42 | displayType === 'name' ? author.name : author.emailName; 43 | const authorUrl = getAuthorPage(author); 44 | return `([${s1}](${s2})) [@${dispalyName}](${authorUrl})`; 45 | }, 46 | ); 47 | 48 | return ret; 49 | }; 50 | -------------------------------------------------------------------------------- /packages/monoo/src/release/changelog/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { existsSync, readFileSync, writeFileSync } from "fs"; 5 | import { join } from "path"; 6 | import { generateChangelog, createChangelogCommit } from "./helpers"; 7 | import { resolveLernaConfig, resolvePackageJson, gitPush } from "@monoo/shared"; 8 | import { ChangelogNS } from "../types"; 9 | import { 10 | ChangelogProcessor4Beautify, 11 | ChangelogProcessor4AttachAuthor, 12 | ChangelogProcessor4NormalizeCommitUrl, 13 | ChangelogProcessor, 14 | } from "./pipelines"; 15 | 16 | /** 17 | * Expose `changelog` 18 | */ 19 | export async function changelog(options: ChangelogNS.IOptions = {}) { 20 | options = { 21 | beautify: false, 22 | commit: false, 23 | gitPush: false, 24 | attachAuthor: false, 25 | authorNameType: "name", 26 | ...options, 27 | }; 28 | 29 | let { version } = options; 30 | 31 | if (!version) { 32 | try { 33 | const config = resolveLernaConfig(options.cwd); 34 | version = config?.data.version; 35 | } catch (e) { 36 | // dot not handle it for now 37 | } 38 | 39 | if (!version) { 40 | const pkgJson = resolvePackageJson(); 41 | version = pkgJson.version; 42 | } 43 | } 44 | 45 | const changelogPath = join(options.cwd, "CHANGELOG.md"); 46 | const isFirst = !existsSync(changelogPath); 47 | await generateChangelog(options.cwd, isFirst); 48 | 49 | let changelogContent = readFileSync(changelogPath, "utf-8"); 50 | 51 | const processor = new ChangelogProcessor(options.cwd, changelogContent); 52 | processor.addProcessor(ChangelogProcessor4NormalizeCommitUrl, {}); 53 | 54 | if (options.attachAuthor) { 55 | processor.addProcessor(ChangelogProcessor4AttachAuthor, { 56 | displayType: options.authorNameType, 57 | getAuthorPage: options.getAuthorPage, 58 | }); 59 | } 60 | 61 | if (options.beautify) { 62 | processor.addProcessor(ChangelogProcessor4Beautify, {}); 63 | } 64 | 65 | changelogContent = processor.process(); 66 | 67 | writeFileSync(changelogPath, changelogContent, "utf-8"); 68 | 69 | if (options.commit) { 70 | await createChangelogCommit(options.cwd, version); 71 | } 72 | 73 | if (options.gitPush) { 74 | await gitPush(); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /packages/monoo/src/cli.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import CAC from "cac"; 5 | import { chalk } from "@monoo/shared"; 6 | import { dev, release, patch, changelog } from "./index"; 7 | 8 | async function wrapCommand( 9 | command: Function, 10 | cliFlags: Record 11 | ) { 12 | cliFlags.cwd = cliFlags.cwd || process.cwd(); 13 | try { 14 | await command(cliFlags); 15 | } catch (e) { 16 | // console.log(e); 17 | console.log(); 18 | process.exitCode = 1; 19 | console.log(chalk.red((e as unknown as Error).message)); 20 | console.log(); 21 | } 22 | } 23 | 24 | /** 25 | * Bootstrap mono cli. 26 | */ 27 | export function bootstrapCli() { 28 | const cli = CAC(); 29 | const pkg = require("../package.json"); 30 | 31 | cli.option("--cwd ", "Current working directory."); 32 | 33 | cli 34 | .command("d", `Quickly launch on-demand development build for monorepo.`) 35 | .alias("dev") 36 | .action((opts) => { 37 | return wrapCommand(dev, opts); 38 | }); 39 | 40 | cli 41 | .command("r", `Release your monorepo.`) 42 | .option("--changelog", "Whether to generate changelog.") 43 | .option("--dry-run", "Preview execution.") 44 | .option("--runInBand", "Whether to publish package in series.") 45 | .option("--build [build]", "Execute custom build script before release.") 46 | .option( 47 | "--ignore-scripts", 48 | "Ignore npm scripts under release and patch process." 49 | ) 50 | .alias("release") 51 | .action((opts) => { 52 | opts = { 53 | changelog: true, 54 | ...opts, 55 | }; 56 | return wrapCommand(release, opts); 57 | }); 58 | 59 | cli 60 | .command("p", `Patch the failure of lerna release.`) 61 | .option("--version ", "Version (e.g. 1.0.0, 2.0.0-alpha.9)") 62 | .option("--tag ", "Tag (e.g. latest、next、beta)") 63 | .option("--runInBand", "Whether to publish package in series.") 64 | .option("--ignore-scripts", "Ignore npm scripts under patch process.") 65 | .alias("patch") 66 | .action((opts) => { 67 | return wrapCommand(patch, opts); 68 | }); 69 | 70 | cli 71 | .command("changelog", "Create changelog") 72 | .option( 73 | "--version ", 74 | 'Version (e.g. 1.0.0, 2.0.0-alpha.9), defaults to version in "lerna.json"' 75 | ) 76 | .option("--beautify", "beautify changelog or not, defaults to false") 77 | .option("--commit", "create git commit or not, defaults to false") 78 | .option("--gitPush", "execute git push or not, defaults to false") 79 | .option("--attachAuthor", "add author or not, defaults to false") 80 | .option( 81 | "--authorNameType ", 82 | "type of author name, available options: `name`, `email`, defaults to `name`" 83 | ) 84 | .action((opts) => { 85 | return wrapCommand(changelog, opts); 86 | }); 87 | 88 | cli.version(pkg.version); 89 | cli.help(); 90 | cli.parse(); 91 | } 92 | -------------------------------------------------------------------------------- /packages/monoo/src/release/changelog/helpers.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { execa } from '@monoo/shared'; 5 | import { ChangelogNS } from '../types'; 6 | 7 | /** 8 | * Create changelog 9 | * 10 | * @param {Boolean} isFirst first release or not. 11 | * @returns {Promise} 12 | */ 13 | 14 | export async function generateChangelog(cwd: string, isFirst = false) { 15 | await execa( 16 | require.resolve('conventional-changelog-cli/cli.js', { 17 | paths: [process.cwd(), ...module.paths], 18 | }), 19 | ['-p', 'angular', '-i', 'CHANGELOG.md', '-s', '-r', isFirst ? '0' : '2'], 20 | { 21 | stdio: 'inherit', 22 | }, 23 | ); 24 | } 25 | 26 | /** 27 | * Create a commit for changelog via a specific version. 28 | * 29 | * @param {String} version 30 | * @returns {Promise} 31 | */ 32 | 33 | export async function createChangelogCommit(cwd: string, version: string) { 34 | await execa('git', ['add', '-A'], { stdio: 'inherit' }); 35 | await execa('git', ['commit', '-m', `chore(all): ${version} changelog`], { 36 | stdio: 'inherit', 37 | }); 38 | } 39 | 40 | /** 41 | * Get commit author from commit hash 42 | * 43 | * @param cwd 44 | * @param hash 45 | * @returns 46 | */ 47 | export function getCommitAuthorFromCommitHash(cwd: string, hash: string) { 48 | const rest = execa.sync( 49 | 'git', 50 | ['--no-pager', 'show', '-s', '--pretty=%an', hash], 51 | { cwd }, 52 | ); 53 | return rest.stdout; 54 | } 55 | 56 | /** 57 | * Get commit author from commit hash 58 | * 59 | * @param cwd 60 | * @param hash 61 | * @returns 62 | */ 63 | export function getCommitAuthorFromHash( 64 | cwd: string, 65 | hash: string, 66 | ): ChangelogNS.ICommitAuthor { 67 | try { 68 | const rest = execa.sync( 69 | 'git', 70 | ['--no-pager', 'show', '-s', '--pretty=%an,%ae', hash], 71 | { cwd }, 72 | ); 73 | const [name, email] = rest.stdout.split(','); 74 | const emailName = email.slice(0, email.indexOf('@')); 75 | return { 76 | name, 77 | email, 78 | emailName, 79 | }; 80 | } catch (e) { 81 | return { 82 | name: 'N/A', 83 | email: 'N/A', 84 | emailName: 'N/A', 85 | }; 86 | } 87 | } 88 | 89 | /** 90 | * Get commit author from commit hash 91 | * 92 | * @param cwd 93 | * @param hash 94 | * @returns 95 | */ 96 | export function getCommitHashAuthorMap( 97 | cwd: string, 98 | ): Record { 99 | try { 100 | const rest = execa.sync( 101 | 'git', 102 | ['--no-pager', 'log', '--pretty=%h,%an,%ae'], 103 | { cwd }, 104 | ); 105 | const FALLBACK = 'N/A'; 106 | const result = rest.stdout 107 | .split('\n') 108 | .reduce>((memo, current) => { 109 | const [hash, name, email] = current.split(','); 110 | const emailName = email && email.slice(0, email.indexOf('@')); 111 | memo[hash.slice(0, 7)] = { 112 | name: name.replace(/\s/g, ' ') || FALLBACK, 113 | email: email || FALLBACK, 114 | emailName: emailName || FALLBACK, 115 | }; 116 | return memo; 117 | }, {}); 118 | return result; 119 | } catch (e) { 120 | return {}; 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [0.3.4](https://github.com/ulivz/mono/compare/v0.4.3...v0.3.4) (2023-02-25) 2 | 3 | 4 | 5 | ## [0.4.3](https://github.com/ulivz/mono/compare/v0.4.2...v0.4.3) (2023-02-25) 6 | 7 | 8 | ### Bug Fixes 9 | 10 | * `monoo dev` does not work ([988481b](https://github.com/ulivz/mono/commit/988481ba02bb0e2a37b77de461045ecb17d3c070)) 11 | * patch doesn't work ([e98faa0](https://github.com/ulivz/mono/commit/e98faa0a9608c96d24591839b03af6acb5c40594)) 12 | * patch release dir ([62eaffb](https://github.com/ulivz/mono/commit/62eaffbc19d6d7236c7776b05e39f530f2a774d2)) 13 | 14 | 15 | ### Features 16 | 17 | * do not patch private packages ([f4427df](https://github.com/ulivz/mono/commit/f4427df3df204077b4df662901cb411fe3ea037a)) 18 | * read monorepo workspaces from package.json ([959e29d](https://github.com/ulivz/mono/commit/959e29dd20f261224765fa8928d699b05426c4e3)) 19 | 20 | 21 | 22 | ## [0.3.4](https://github.com/ulivz/mono/compare/v0.4.1...v0.3.4) (2023-02-25) 23 | 24 | 25 | 26 | ## [0.4.1](https://github.com/ulivz/mono/compare/v0.4.0...v0.4.1) (2023-02-25) 27 | 28 | 29 | 30 | ## [0.3.4](https://github.com/ulivz/mono/compare/v0.3.3...v0.3.4) (2022-01-14) 31 | 32 | 33 | ### Features 34 | 35 | * do not attach user ([0385908](https://github.com/ulivz/mono/commit/0385908d1fe695778741ba36a022d0f680a2052a)) 36 | 37 | 38 | 39 | ## [0.3.3](https://github.com/ulivz/mono/compare/v0.3.2...v0.3.3) (2021-12-20) 40 | 41 | 42 | ### Features 43 | 44 | * **changelog:** handle all whitespace in user name ([0ee0a17](https://github.com/ulivz/mono/commit/0ee0a175bbfa1c79decd7c3d277b967c89d19723)) 45 | 46 | 47 | 48 | ## [0.3.2](https://github.com/ulivz/mono/compare/v0.3.1...v0.3.2) (2021-12-20) 49 | 50 | 51 | ### Features 52 | 53 | * **changelog:** using `name` to generate user's homepage page ([d6a6d08](https://github.com/ulivz/mono/commit/d6a6d080e252fcd70272424ff2652bc00b86e07d)) 54 | 55 | 56 | 57 | ## [0.3.1](https://github.com/ulivz/mono/compare/v0.3.0...v0.3.1) (2021-12-20) 58 | 59 | 60 | ### Bug Fixes 61 | 62 | * **changelog:** --authorNameType does not work ([c78ebe9](https://github.com/ulivz/mono/commit/c78ebe93614ae46de578bb0a0de155f5d97d19c9)) 63 | 64 | 65 | 66 | # [0.3.0](https://github.com/ulivz/mono/compare/v0.2.2...v0.3.0) (2021-12-20) 67 | 68 | 69 | ### Features 70 | 71 | * set default changelog authorNameType to name ([6417cc3](https://github.com/ulivz/mono/commit/6417cc3a711962c154bbe70dfab1b76196807c6a)) 72 | 73 | 74 | 75 | ## [0.2.2](https://github.com/ulivz/mono/compare/v0.2.1...v0.2.2) (2021-12-20) 76 | 77 | 78 | ### Features 79 | 80 | * rename to `@nomadland/mono` ([197080a](https://github.com/ulivz/mono/commit/197080ace46bf48fc36e5253610a17a06d87eafe)) 81 | 82 | 83 | 84 | ## [0.2.1](https://github.com/speedy-js/mono/compare/v0.2.0...v0.2.1) (2021-12-20) 85 | 86 | 87 | ### Bug Fixes 88 | 89 | * the "path" argument must be of type string. Received undefined ([#2](https://github.com/speedy-js/mono/issues/2)) ([80b84d7](https://github.com/speedy-js/mono/commit/80b84d722b53ea8f182814ba871c94d89c8e251e)) 90 | 91 | 92 | 93 | # [0.2.0](https://github.com/speedy-js/mono/compare/f891d6e12265eb12454fedc0d6b43a5b1846744c...v0.2.0) (2021-12-20) 94 | 95 | 96 | ### Features 97 | 98 | * 0.2 ([052e27f](https://github.com/speedy-js/mono/commit/052e27f6480b91ef539fb73d61bb05c8ffab1045)) 99 | * init ([f891d6e](https://github.com/speedy-js/mono/commit/f891d6e12265eb12454fedc0d6b43a5b1846744c)) -------------------------------------------------------------------------------- /__tests__/changelog/pipelines/attach-author.test.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { ChangelogProcessor4AttachAuthor } from '../../../src/release/changelog/pipelines/attach-author'; 5 | import { ChangelogNS } from '../../../src/release/types'; 6 | 7 | jest.mock(require.resolve('../../../src/release/changelog/helpers'), () => { 8 | const mockedAuthor: ChangelogNS.ICommitAuthor = { 9 | name: '', 10 | email: '', 11 | emailName: '', 12 | }; 13 | 14 | const mockedAuthor2: ChangelogNS.ICommitAuthor = { 15 | name: '', 16 | email: '', 17 | emailName: '', 18 | }; 19 | 20 | return { 21 | getCommitHashAuthorMap: () => { 22 | return { 23 | aaaaaaa: mockedAuthor, 24 | bbbbbbb: mockedAuthor, 25 | ccccccc: mockedAuthor2, 26 | ddddddd: mockedAuthor2, 27 | }; 28 | }, 29 | }; 30 | }); 31 | 32 | describe('ChangelogProcessor4AttachAuthor', () => { 33 | describe('update changelog without author', () => { 34 | const input = ` 35 | ## [0.2.4](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 36 | 37 | 38 | ### Bug Fixes 39 | 40 | * \`--ignore-scripts\` description ([aaaaaaa](https://github.com/speedy/mono/commits/663a3963b63706d273068895f4dd79d6c70472c2)) 41 | 42 | 43 | 44 | ## [0.2.3](https://github.com/speedy/mono/compare/v0.2.2...v0.2.3) (2021-10-20) 45 | 46 | 47 | ### Bug Fixes 48 | 49 | * The "path" argument must be of type string. Received undefined ([bbbbbbb](https://github.com/speedy/mono/commits/1a377bb70193547e2cf9faaa288fbf5fcdc4b66f)) 50 | `; 51 | 52 | it('default', () => { 53 | expect( 54 | ChangelogProcessor4AttachAuthor('', input, {}), 55 | ).toMatchSnapshot(); 56 | }); 57 | 58 | it('options - displayType', () => { 59 | expect( 60 | ChangelogProcessor4AttachAuthor('', input, { 61 | displayType: 'email', 62 | }), 63 | ).toMatchSnapshot(); 64 | }); 65 | 66 | it('options - getAuthorPage', () => { 67 | expect( 68 | ChangelogProcessor4AttachAuthor('', input, { 69 | getAuthorPage(author) { 70 | return `/page/to/author/${author.emailName}`; 71 | }, 72 | }), 73 | ).toMatchSnapshot(); 74 | }); 75 | }); 76 | 77 | describe('update changelog with author', () => { 78 | const input = ` 79 | ## [0.2.4](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 80 | 81 | 82 | ### Bug Fixes 83 | 84 | * \`--ignore-scripts\` description ([aaaaaaa](https://github.com/speedy/mono/commits/663a3963b63706d273068895f4dd79d6c70472c2)) 85 | 86 | 87 | 88 | ## [0.2.3](https://github.com/speedy/mono/compare/v0.2.2...v0.2.3) (2021-10-20) 89 | 90 | 91 | ### Bug Fixes 92 | 93 | * The "path" argument must be of type string. Received undefined ([bbbbbbb](https://github.com/speedy/mono/commits/1a377bb70193547e2cf9faaa288fbf5fcdc4b66f)) [@](https://github.com/) 94 | `; 95 | 96 | it('default', () => { 97 | expect( 98 | ChangelogProcessor4AttachAuthor('', input, {}), 99 | ).toMatchSnapshot(); 100 | }); 101 | 102 | it('options - displayType', () => { 103 | expect( 104 | ChangelogProcessor4AttachAuthor('', input, { 105 | displayType: 'email', 106 | }), 107 | ).toMatchSnapshot(); 108 | }); 109 | 110 | it('options - getAuthorPage', () => { 111 | expect( 112 | ChangelogProcessor4AttachAuthor('', input, { 113 | getAuthorPage(author) { 114 | return `/page/to/author/${author.emailName}`; 115 | }, 116 | }), 117 | ).toMatchSnapshot(); 118 | }); 119 | }); 120 | }); 121 | -------------------------------------------------------------------------------- /packages/monoo/src/release/patch/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { join } from "path"; 5 | import { readFileSync, writeFileSync } from "fs"; 6 | import inquirer from "inquirer"; 7 | import { fetchPackageVersion, logger } from "../shared"; 8 | import { PatchNS } from "../types"; 9 | import { getVisibleReleaseStatusLog } from "./helper"; 10 | import { IMonorepoPackageWithRemoteInfo } from "@monoo/types"; 11 | import { 12 | chalk, 13 | execa, 14 | resolveLernaConfig, 15 | loadMonorepoPackages, 16 | } from "@monoo/shared"; 17 | 18 | /** 19 | * Remove duplicate gitHead field when "lerna publish" fails. 20 | * 21 | * @param {String} path 22 | * @returns {void} 23 | */ 24 | 25 | export function removeGitHead(path: string) { 26 | const GIT_HEAD_REG = /,[\n\t\s]*"gitHead":\s"[^"]+"/; 27 | let content = readFileSync(path, "utf-8"); 28 | content = content.replace(GIT_HEAD_REG, ""); 29 | writeFileSync(path, content, "utf-8"); 30 | } 31 | 32 | /** 33 | * Enter a interactive cli to know the current situation of `lerna publish`. 34 | * 35 | * @param {String} cwd 36 | * @param {String} version 37 | * @param {String} tag 38 | * @returns {Promise} 39 | */ 40 | 41 | export async function patch(options: PatchNS.IOptions): Promise { 42 | const { cwd, tag, runInBand = false, ignoreScripts = false } = options; 43 | 44 | let { version } = options; 45 | 46 | logger.info("Patch Started"); 47 | 48 | if (!tag) { 49 | throw new Error('[MONOO] "tag" is required for "patch"'); 50 | } 51 | 52 | const lernaConfig = resolveLernaConfig(cwd).data; 53 | 54 | if (!version) { 55 | try { 56 | version = lernaConfig?.version; 57 | } catch (e) { 58 | // dot not handle it for now 59 | } 60 | } 61 | 62 | logger.info(`Version: ${chalk.cyan(version)}`); 63 | logger.info(`Tag: ${chalk.cyan(tag)}`); 64 | 65 | const pkgs = await loadMonorepoPackages(cwd, lernaConfig); 66 | pkgs.forEach((pkg) => removeGitHead(join(pkg.dir, "package.json"))); 67 | 68 | const remotePkgs: IMonorepoPackageWithRemoteInfo[] = ( 69 | await Promise.all( 70 | pkgs.map>(async (pkg) => { 71 | return { 72 | ...pkg, 73 | remoteVersion: await fetchPackageVersion(pkg.name, tag), 74 | }; 75 | }) 76 | ) 77 | ).filter((pkg) => !pkg.packageJson.private); 78 | 79 | if (remotePkgs.every((pkg) => pkg.remoteVersion === version)) { 80 | return console.log( 81 | `${chalk.cyan("❯ ")}${chalk.gray( 82 | "[MONOO]" 83 | )} Do not need "patch" since all packages've been published correctly! ` 84 | ); 85 | } 86 | 87 | const visibleReleaseStatusLog = getVisibleReleaseStatusLog( 88 | remotePkgs, 89 | version, 90 | tag 91 | ); 92 | 93 | console.log(visibleReleaseStatusLog); 94 | 95 | const { yes } = await inquirer.prompt([ 96 | { 97 | name: "yes", 98 | message: "Continue to patch", 99 | type: "list", 100 | choices: ["N", "Y"], 101 | }, 102 | ]); 103 | 104 | if (yes === "Y") { 105 | const patchedPkgs = remotePkgs.filter( 106 | (pkg) => pkg.remoteVersion !== version 107 | ); 108 | 109 | const releasePkg = async (pkg: IMonorepoPackageWithRemoteInfo) => { 110 | console.log(chalk.gray(`$ npm publish --tag ${tag} # ${pkg.dir}`)); 111 | const npmArgs = ["publish", "--tag", tag]; 112 | if (ignoreScripts) { 113 | npmArgs.push("--ignore-scripts"); 114 | } 115 | await execa("npm", npmArgs, { 116 | // silent: true, 117 | stdio: "inherit", 118 | cwd: pkg.dir, 119 | }); 120 | console.log(`+ ${pkg.name}@${version}\n`); 121 | }; 122 | 123 | if (runInBand) { 124 | for (const pkg of patchedPkgs) { 125 | await releasePkg(pkg); 126 | } 127 | } else { 128 | await Promise.all(patchedPkgs.map(releasePkg)); 129 | } 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /__tests__/changelog/pipelines/__snapshots__/attach-author.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`ChangelogProcessor4AttachAuthor update changelog with author default 1`] = ` 4 | " 5 | ## [0.2.4](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 6 | 7 | 8 | ### Bug Fixes 9 | 10 | * \`--ignore-scripts\` description ([aaaaaaa](https://github.com/speedy/mono/commits/663a3963b63706d273068895f4dd79d6c70472c2)) [@](https://github.com/) 11 | 12 | 13 | 14 | ## [0.2.3](https://github.com/speedy/mono/compare/v0.2.2...v0.2.3) (2021-10-20) 15 | 16 | 17 | ### Bug Fixes 18 | 19 | * The \\"path\\" argument must be of type string. Received undefined ([bbbbbbb](https://github.com/speedy/mono/commits/1a377bb70193547e2cf9faaa288fbf5fcdc4b66f)) [@](https://github.com/) 20 | " 21 | `; 22 | 23 | exports[`ChangelogProcessor4AttachAuthor update changelog with author options - displayType 1`] = ` 24 | " 25 | ## [0.2.4](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 26 | 27 | 28 | ### Bug Fixes 29 | 30 | * \`--ignore-scripts\` description ([aaaaaaa](https://github.com/speedy/mono/commits/663a3963b63706d273068895f4dd79d6c70472c2)) [@](https://github.com/) 31 | 32 | 33 | 34 | ## [0.2.3](https://github.com/speedy/mono/compare/v0.2.2...v0.2.3) (2021-10-20) 35 | 36 | 37 | ### Bug Fixes 38 | 39 | * The \\"path\\" argument must be of type string. Received undefined ([bbbbbbb](https://github.com/speedy/mono/commits/1a377bb70193547e2cf9faaa288fbf5fcdc4b66f)) [@](https://github.com/) 40 | " 41 | `; 42 | 43 | exports[`ChangelogProcessor4AttachAuthor update changelog with author options - getAuthorPage 1`] = ` 44 | " 45 | ## [0.2.4](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 46 | 47 | 48 | ### Bug Fixes 49 | 50 | * \`--ignore-scripts\` description ([aaaaaaa](https://github.com/speedy/mono/commits/663a3963b63706d273068895f4dd79d6c70472c2)) [@](/page/to/author/) 51 | 52 | 53 | 54 | ## [0.2.3](https://github.com/speedy/mono/compare/v0.2.2...v0.2.3) (2021-10-20) 55 | 56 | 57 | ### Bug Fixes 58 | 59 | * The \\"path\\" argument must be of type string. Received undefined ([bbbbbbb](https://github.com/speedy/mono/commits/1a377bb70193547e2cf9faaa288fbf5fcdc4b66f)) [@](https://github.com/) 60 | " 61 | `; 62 | 63 | exports[`ChangelogProcessor4AttachAuthor update changelog without author default 1`] = ` 64 | " 65 | ## [0.2.4](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 66 | 67 | 68 | ### Bug Fixes 69 | 70 | * \`--ignore-scripts\` description ([aaaaaaa](https://github.com/speedy/mono/commits/663a3963b63706d273068895f4dd79d6c70472c2)) [@](https://github.com/) 71 | 72 | 73 | 74 | ## [0.2.3](https://github.com/speedy/mono/compare/v0.2.2...v0.2.3) (2021-10-20) 75 | 76 | 77 | ### Bug Fixes 78 | 79 | * The \\"path\\" argument must be of type string. Received undefined ([bbbbbbb](https://github.com/speedy/mono/commits/1a377bb70193547e2cf9faaa288fbf5fcdc4b66f)) [@](https://github.com/) 80 | " 81 | `; 82 | 83 | exports[`ChangelogProcessor4AttachAuthor update changelog without author options - displayType 1`] = ` 84 | " 85 | ## [0.2.4](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 86 | 87 | 88 | ### Bug Fixes 89 | 90 | * \`--ignore-scripts\` description ([aaaaaaa](https://github.com/speedy/mono/commits/663a3963b63706d273068895f4dd79d6c70472c2)) [@](https://github.com/) 91 | 92 | 93 | 94 | ## [0.2.3](https://github.com/speedy/mono/compare/v0.2.2...v0.2.3) (2021-10-20) 95 | 96 | 97 | ### Bug Fixes 98 | 99 | * The \\"path\\" argument must be of type string. Received undefined ([bbbbbbb](https://github.com/speedy/mono/commits/1a377bb70193547e2cf9faaa288fbf5fcdc4b66f)) [@](https://github.com/) 100 | " 101 | `; 102 | 103 | exports[`ChangelogProcessor4AttachAuthor update changelog without author options - getAuthorPage 1`] = ` 104 | " 105 | ## [0.2.4](https://github.com/speedy/mono/compare/v0.2.3...v0.2.4) (2021-10-23) 106 | 107 | 108 | ### Bug Fixes 109 | 110 | * \`--ignore-scripts\` description ([aaaaaaa](https://github.com/speedy/mono/commits/663a3963b63706d273068895f4dd79d6c70472c2)) [@](/page/to/author/) 111 | 112 | 113 | 114 | ## [0.2.3](https://github.com/speedy/mono/compare/v0.2.2...v0.2.3) (2021-10-20) 115 | 116 | 117 | ### Bug Fixes 118 | 119 | * The \\"path\\" argument must be of type string. Received undefined ([bbbbbbb](https://github.com/speedy/mono/commits/1a377bb70193547e2cf9faaa288fbf5fcdc4b66f)) [@](/page/to/author/) 120 | " 121 | `; 122 | -------------------------------------------------------------------------------- /packages/@monoo/shared/src/util.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { existsSync, writeFileSync, unlinkSync } from "fs-extra"; 5 | import * as path from "path"; 6 | import globby from "globby"; 7 | import { IMonorepoPackage, ILernaConfig, IPackageJSON } from "@monoo/types"; 8 | import { join } from "path"; 9 | import execa from "execa"; 10 | 11 | export { execa }; 12 | 13 | const LERNA_CONFIG = "lerna.json"; 14 | const MONOO_CONFIG = "monoo.json"; 15 | 16 | /** 17 | * Git push 18 | * 19 | * @returns {Promise} 20 | */ 21 | 22 | export async function gitPush() { 23 | await execa("git", ["push"], { stdio: "inherit" }); 24 | } 25 | 26 | /** 27 | * Require json file with no cache 28 | * 29 | * @param {String} jsonPath 30 | * @returns {Promise} 31 | */ 32 | 33 | export function requireJson(jsonPath: string) { 34 | delete require.cache[jsonPath]; 35 | const json = require(jsonPath); 36 | return json; 37 | } 38 | 39 | /** 40 | * Safely require json file with no cache 41 | * 42 | * @param {String} jsonPath 43 | * @returns {Promise} 44 | */ 45 | export function safelyRequireJson(jsonPath: string) { 46 | if (existsSync(jsonPath)) { 47 | return requireJson(jsonPath); 48 | } 49 | return {}; 50 | } 51 | 52 | /** 53 | * Resolve content of `lerna.json` or `monoo.json` 54 | * 55 | * @param {String} cwd 56 | * @returns {Object} 57 | */ 58 | export function resolveLernaConfig(cwd = process.cwd()): { 59 | path: string; 60 | data: ILernaConfig; 61 | } | null { 62 | const lernaConfigPath = join(cwd, LERNA_CONFIG); 63 | if (existsSync(lernaConfigPath)) { 64 | return { 65 | path: lernaConfigPath, 66 | data: requireJson(lernaConfigPath), 67 | }; 68 | } 69 | const monoConfigPath = join(cwd, MONOO_CONFIG); 70 | if (existsSync(monoConfigPath)) { 71 | return { 72 | path: monoConfigPath, 73 | data: requireJson(monoConfigPath), 74 | }; 75 | } 76 | throw new Error(`Missing lerna.json or monoo.json`); 77 | } 78 | 79 | /** 80 | * Ensure lerna.json exists 81 | */ 82 | export function ensureLernaConfig(cwd: string) { 83 | const lernaConfig = resolveLernaConfig(cwd); 84 | if (lernaConfig.path.endsWith(MONOO_CONFIG)) { 85 | writeFileSync( 86 | join(cwd, LERNA_CONFIG), 87 | JSON.stringify(lernaConfig.data, null, 2) 88 | ); 89 | } 90 | } 91 | 92 | /** 93 | * Ensure that lerna.json does not exists when 'monoo.json' exists. 94 | */ 95 | export function cleanLernaConfig(cwd: string) { 96 | const monoConfigPath = join(cwd, MONOO_CONFIG); 97 | const lernaConfigPath = join(cwd, LERNA_CONFIG); 98 | if (existsSync(monoConfigPath)) { 99 | const lernaConfig = resolveLernaConfig(cwd); 100 | if (lernaConfig.path.endsWith(LERNA_CONFIG)) { 101 | writeFileSync(monoConfigPath, JSON.stringify(lernaConfig.data, null, 2)); 102 | unlinkSync(lernaConfigPath); 103 | } 104 | } 105 | } 106 | 107 | /** 108 | * 109 | * Resolve content of `lerna.json` 110 | * 111 | * @param {String} cwd 112 | * @returns {Object} 113 | */ 114 | export function resolvePackageJson(cwd = process.cwd()) { 115 | const pkgJsonPath = join(cwd, "package.json"); 116 | return safelyRequireJson(pkgJsonPath); 117 | } 118 | 119 | /** 120 | * Safely load package.json 121 | */ 122 | export function requirePkg(cwd: string): IPackageJSON { 123 | try { 124 | return require(`${cwd}/package.json`); 125 | } catch (_) { 126 | return {} as IPackageJSON; 127 | } 128 | } 129 | 130 | /** 131 | * Load monorepo. 132 | */ 133 | export function loadMonorepoPackages( 134 | cwd: string = process.cwd(), 135 | lernaConfig?: ILernaConfig 136 | ): IMonorepoPackage[] { 137 | if (!lernaConfig) { 138 | lernaConfig = resolveLernaConfig(cwd).data; 139 | } 140 | let packageDirs = lernaConfig.packages; 141 | if (!packageDirs) { 142 | const pkg = requirePkg(cwd); 143 | packageDirs = pkg.workspaces; 144 | } 145 | if (!Array.isArray(packageDirs)) { 146 | throw new Error(`Cannot resolve monorepo workspaces.`); 147 | } 148 | const packages = packageDirs.map((packageDir) => { 149 | return packageDir.replace(/$\//, "") + "/package.json"; 150 | }); 151 | const resolved = globby.sync(packages, { cwd, onlyFiles: true }); 152 | 153 | return resolved.map((relative) => { 154 | const dir = path.dirname(path.join(cwd, relative)); 155 | const key = relative.slice(relative.lastIndexOf("/") + 1); 156 | const packageJson = requirePkg(dir); 157 | const { name } = packageJson; 158 | const { version } = packageJson; 159 | return { 160 | key, 161 | relative, 162 | dir, 163 | name, 164 | version, 165 | packageJson, 166 | }; 167 | }); 168 | } 169 | -------------------------------------------------------------------------------- /packages/@monoo/shared/src/monorepo-builder.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import chokidar from 'chokidar'; 5 | import { ChildProcess } from 'child_process'; 6 | import chalk from 'chalk'; 7 | import shelljs from 'shelljs'; 8 | import { loadMonorepoPackages, styled } from '.'; 9 | import { 10 | IMonorepoPackage, 11 | IMonorepoBuilder, 12 | IMonorepoBuilderOptions, 13 | MonorepoBuilderProcessPool, 14 | MonorepoBuilderPromisePool, 15 | IMonorepoBuilderWatchOptions, 16 | IMonorepoBuilderStdinOptions, 17 | } from '@monoo/types'; 18 | 19 | /** 20 | * Expose `MonorepoBuilder` 21 | */ 22 | export class MonorepoBuilder implements IMonorepoBuilder { 23 | public buildProcessPool: MonorepoBuilderProcessPool; 24 | 25 | public buildPromisePool: MonorepoBuilderPromisePool; 26 | 27 | public pendingMessages: string[]; 28 | 29 | packages: IMonorepoPackage[]; 30 | 31 | constructor(private options: IMonorepoBuilderOptions) { 32 | this.buildProcessPool = {}; 33 | this.buildPromisePool = {}; 34 | this.pendingMessages = []; 35 | } 36 | 37 | /** 38 | * bootstrap builder 39 | */ 40 | async bootstrap() { 41 | this.packages = loadMonorepoPackages(this.options.cwd); 42 | console.log('this.packages', this.packages); 43 | } 44 | 45 | /** 46 | * Watch packages 47 | */ 48 | watch(options: IMonorepoBuilderWatchOptions = {}) { 49 | const watcher = chokidar.watch(this.options.cwd, { 50 | ignoreInitial: true, 51 | ignored: [/\/node_modules\//, /\/lib\//, /\/esm\//], 52 | }); 53 | 54 | const excludedPackages = options.exclude || []; 55 | 56 | const hanldeFileUpdate = async (file: string) => { 57 | const targetPkg = this.packages.find((pkg) => { 58 | return file.startsWith(`${pkg.dir}/src`); 59 | }); 60 | 61 | if (targetPkg && !excludedPackages.includes(targetPkg.name)) { 62 | this.createBuildProcess(targetPkg); 63 | } 64 | }; 65 | 66 | watcher.on('change', hanldeFileUpdate); 67 | } 68 | 69 | /** 70 | * Create a build process. 71 | * 72 | * @param pkg 73 | * @param script 74 | */ 75 | createBuildProcess(pkg: IMonorepoPackage, script?: string) { 76 | if (this.buildProcessPool[pkg.name]) { 77 | return; 78 | } 79 | 80 | if (!pkg.packageJson.scripts.dev) { 81 | console.log( 82 | chalk.bold( 83 | ` [WARN] ${styled(`[${pkg.name}]`)} does not have a dev script.`, 84 | ), 85 | ); 86 | return; 87 | } 88 | 89 | console.log( 90 | chalk.bold(` ${styled(`[${pkg.name}]`)} join the build process.`), 91 | ); 92 | 93 | const ps = shelljs.exec(script || 'npm run dev', { 94 | // @ts-ignore 95 | async: true, 96 | cwd: pkg.dir, 97 | stdio: [0, 1, 2, 'ipc'], 98 | }); 99 | 100 | if (typeof ps.code !== 'undefined' && ps.code !== 0) { 101 | console.log( 102 | chalk.bold(` [WARN] ${styled(`[${pkg.name}]`)} build failed.`), 103 | ); 104 | } 105 | 106 | this.buildProcessPool[pkg.name] = ps; 107 | return ps; 108 | } 109 | 110 | /** 111 | * watch process stdin 112 | */ 113 | enableStdinFeature(options: IMonorepoBuilderStdinOptions = {}) { 114 | const excludedPackages = options.exclude || []; 115 | 116 | process.stdin && 117 | process.stdin.on('data', async (chunk) => { 118 | const originalCommand = chunk.toString('utf-8') as string; 119 | let parsed = originalCommand.trim(); 120 | 121 | if (parsed === 'ps') { 122 | console.log( 123 | Object.keys(this.buildProcessPool) 124 | .map((pkgName) => { 125 | const ps = this.buildProcessPool[pkgName]; 126 | return `${chalk.gray(`${ps.pid}`)}\t${pkgName}`; 127 | }) 128 | .join('\n'), 129 | ); 130 | } 131 | 132 | this.pendingMessages.push(parsed); 133 | 134 | process.nextTick(async () => { 135 | if (this.pendingMessages.length !== 1) { 136 | this.pendingMessages = []; 137 | return; 138 | } 139 | 140 | parsed = this.pendingMessages[0]; 141 | this.pendingMessages = []; 142 | 143 | if (parsed === 'n') { 144 | const choices = this.packages 145 | .filter((pkg) => { 146 | return ( 147 | !this.buildProcessPool[pkg.name] && 148 | !this.buildPromisePool[pkg.name] && 149 | !excludedPackages.includes(pkg.name) 150 | ); 151 | }) 152 | .map((pkg) => { 153 | return { 154 | name: `${pkg.key} ${chalk.gray(`(${pkg.name}`)}`, 155 | value: pkg.name, 156 | }; 157 | }); 158 | 159 | const prompt = require('inquirer').prompt({ 160 | name: 'pkgName', 161 | message: 'Choose a package to build:', 162 | choices, 163 | type: 'list', 164 | default: choices[0], 165 | }); 166 | 167 | const { pkgName } = await prompt; 168 | /** 169 | * Fixes: https://github.com/SBoudrias/Inquirer.js/issues/894 170 | */ 171 | prompt.ui.close(); 172 | prompt.ui.rl.input.resume(); 173 | parsed = pkgName; 174 | } 175 | 176 | const matchedPkg = this.packages.find((pkg) => { 177 | return pkg.key === parsed || pkg.name === parsed; 178 | }); 179 | 180 | if (matchedPkg) { 181 | this.createBuildProcess(matchedPkg); 182 | } 183 | }); 184 | }); 185 | } 186 | 187 | /** 188 | * Handle process exit 189 | */ 190 | onProcessExit() { 191 | const exitHandler = () => { 192 | Object.keys(this.buildProcessPool).forEach((name) => { 193 | const ps = this.buildProcessPool[name] as ChildProcess; 194 | if (ps && ps.kill) { 195 | ps.kill(); 196 | console.log(`Exit sub process ${name}`); 197 | } 198 | }); 199 | process.removeListener('exit', exitHandler); 200 | process.removeListener('SIGINT', exitHandler); 201 | }; 202 | 203 | // do something when app is closing 204 | process.on('exit', exitHandler); 205 | 206 | // catches ctrl+c event 207 | process.on('SIGINT', exitHandler); 208 | } 209 | } 210 | -------------------------------------------------------------------------------- /packages/monoo/src/release/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import { 5 | chalk, 6 | execa, 7 | resolveLernaConfig, 8 | ensureLernaConfig, 9 | cleanLernaConfig, 10 | } from "@monoo/shared"; 11 | import semver, { ReleaseType } from "semver"; 12 | import inquirer from "inquirer"; 13 | import { patch } from "./patch"; 14 | import { logger } from "./shared"; 15 | import { ReleaseNS, ChangelogNS } from "./types"; 16 | import { changelog } from "./changelog"; 17 | import { ILernaConfig } from "@monoo/types"; 18 | 19 | export { patch, changelog }; 20 | 21 | /** 22 | * Select version and tag to be released. 23 | */ 24 | async function selectVersionAndTag(currentVersion: string) { 25 | const customItem = { name: "Custom", value: "custom" }; 26 | const bumps: ReleaseType[] = [ 27 | "patch", 28 | "minor", 29 | "major", 30 | "prerelease", 31 | "premajor", 32 | ]; 33 | const versions = bumps.reduce>((memo, bump) => { 34 | memo[bump] = semver.inc(currentVersion, bump); 35 | return memo; 36 | }, {}); 37 | 38 | const bumpChoices = bumps.map((b) => ({ 39 | name: `${b} (${versions[b]})`, 40 | value: b, 41 | })); 42 | 43 | function getVersion(answers: ReleaseNS.IPromptAnswers) { 44 | return answers.customVersion || versions[answers.bump]; 45 | } 46 | 47 | function getNpmTags(version: string) { 48 | if (isPreRelease(version)) { 49 | return ["next", "latest", "beta", customItem]; 50 | } 51 | return ["latest", "next", "beta", customItem]; 52 | } 53 | 54 | function isPreRelease(version: string) { 55 | return Boolean(semver.prerelease(version)); 56 | } 57 | 58 | const { bump, customVersion, npmTag, customNpmTag } = 59 | await inquirer.prompt([ 60 | { 61 | name: "bump", 62 | message: "Select release type:", 63 | type: "list", 64 | choices: [...bumpChoices, customItem], 65 | }, 66 | { 67 | name: "customVersion", 68 | message: "Input version:", 69 | type: "input", 70 | when: (answers) => answers.bump === "custom", 71 | }, 72 | { 73 | name: "npmTag", 74 | message: "Input npm tag:", 75 | type: "list", 76 | default: (answers: ReleaseNS.IPromptAnswers) => 77 | getNpmTags(getVersion(answers))[0], 78 | choices: (answers) => getNpmTags(getVersion(answers)), 79 | }, 80 | { 81 | name: "customNpmTag", 82 | message: "Input customized npm tag:", 83 | type: "input", 84 | when: (answers) => answers.npmTag === "custom", 85 | }, 86 | ]); 87 | 88 | const version = customVersion || versions[bump]; 89 | const tag = customNpmTag || npmTag; 90 | return { 91 | tag, 92 | version, 93 | }; 94 | } 95 | 96 | export async function release(options: ReleaseNS.IOptions) { 97 | if (options.dryRun) { 98 | logger.info(`[dry-run] enabled`); 99 | } 100 | 101 | const cwd = options.cwd ?? process.cwd(); 102 | 103 | const config = resolveLernaConfig(cwd); 104 | 105 | if (!config?.path) { 106 | throw new Error('"monoo.json" or "lerna.json" doesn\'t exist'); 107 | } 108 | 109 | const lernaConfig: ILernaConfig = config.data; 110 | 111 | if (lernaConfig.version === "independent") { 112 | throw new Error('"release" cannot be executed under "independent" mode'); 113 | } 114 | 115 | if (typeof options.ready === "function") { 116 | await options.ready({ cwd }); 117 | } 118 | 119 | logger.info(`${chalk.gray("Current version: ")}${lernaConfig.version}`); 120 | 121 | const { version, tag } = await selectVersionAndTag(lernaConfig.version); 122 | 123 | const { yes } = await inquirer.prompt([ 124 | { 125 | name: "yes", 126 | message: `Confirm releasing ${version} (${tag})?`, 127 | type: "list", 128 | choices: ["N", "Y"], 129 | }, 130 | ]); 131 | 132 | if (yes === "N") { 133 | logger.info("cancelled."); 134 | return; 135 | } 136 | 137 | /** 138 | * Set this env for subsequent build process. 139 | */ 140 | process.env.MONOO_RELEASE_VERSION = version; 141 | 142 | /** 143 | * Execute custom build script before release. 144 | */ 145 | if (options.build) { 146 | const buildScript = 147 | typeof options.build === "string" ? options.build : "npm run build"; 148 | if (options.dryRun) { 149 | logger.info("[dry-run] run build with: " + chalk.gray(buildScript)); 150 | } else { 151 | const [command, ...args] = buildScript.split(" "); 152 | await execa(command, args, { 153 | shell: true, 154 | cwd: options.cwd, 155 | stdio: "inherit", 156 | env: process.env, 157 | }); 158 | } 159 | } 160 | 161 | let releaseArguments: string[] = [ 162 | "publish", 163 | version, 164 | "--exact", 165 | "--force-publish", 166 | "--dist-tag", 167 | tag, 168 | ]; 169 | 170 | if (typeof options.modifyReleaseArguments === "function") { 171 | releaseArguments = options.modifyReleaseArguments({ 172 | arguments: releaseArguments, 173 | version, 174 | tag, 175 | }); 176 | } 177 | 178 | if (options.ignoreScripts) { 179 | releaseArguments.push("--ignore-scripts"); 180 | } 181 | 182 | ensureLernaConfig(cwd); 183 | 184 | const lernaPath = require.resolve("lerna/cli.js", { 185 | paths: [cwd, __dirname], 186 | }); 187 | if (options.dryRun) { 188 | logger.info("[dry-run] run publish with:"); 189 | logger.info( 190 | "[dry-run] " + chalk.gray(lernaPath + " " + releaseArguments.join(" ")) 191 | ); 192 | logger.info("[dry-run] enter patch process"); 193 | logger.info("[dry-run] finish patch process"); 194 | } else { 195 | try { 196 | await execa(lernaPath, releaseArguments, { 197 | stdio: "inherit", 198 | }); 199 | } catch (e) { 200 | console.log(e); 201 | 202 | await patch({ 203 | cwd, 204 | version, 205 | tag, 206 | runInBand: options.runInBand, 207 | ignoreScripts: options.ignoreScripts, 208 | }); 209 | } 210 | } 211 | 212 | if (typeof options.released === "function") { 213 | await options.released({ cwd, version, tag }); 214 | } 215 | 216 | cleanLernaConfig(cwd); 217 | 218 | if (options.changelog) { 219 | const changelogOptions: ChangelogNS.IOptions = { 220 | cwd, 221 | beautify: true, 222 | commit: true, 223 | gitPush: true, 224 | attachAuthor: false, 225 | authorNameType: "name", 226 | }; 227 | if (options.dryRun) { 228 | logger.info( 229 | "[dry-run] generate change with " + 230 | chalk.gray(JSON.stringify(changelogOptions, null, 2)) 231 | ); 232 | } else { 233 | await changelog(changelogOptions); 234 | } 235 | } 236 | } 237 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # monoo 2 | 3 | [![npm version](https://badgen.net/npm/v/monoo)](https://npm.im/monoo) 4 | 5 | Monorepo development & continuous integration tooling. 6 | 7 | ## Motivation 8 | 9 | When we released **_monorepo_**, a headache problem was that release flow failed but some packages had been published to NPM. At this time, you may discard current release, or publish manually one by one, but it's quite troublesome in a monorepo with a large number of packages. 10 | 11 | **mono** introduced a post `patch` process, it helps you to continue current release with visible release status. 12 | 13 | ![](./assets/workflow.png) 14 | 15 | 16 | ## Features 17 | 18 | - Restartable release flow, powered by a post `patch` release process with [visible release status](#a-complete-release-workflow). 19 | - Quickly launch on-demand development build for monorepo. 20 | - Generated changelog with author. 21 | 22 | ## Table of Contents 23 | 24 | - [monoo](#monoo) 25 | - [Motivation](#motivation) 26 | - [Features](#features) 27 | - [Table of Contents](#table-of-contents) 28 | - [Install](#install) 29 | - [Usage](#usage) 30 | - [A complete release workflow](#a-complete-release-workflow) 31 | - [Execute build after bump version](#execute-build-after-bump-version) 32 | - [Independent patch process](#independent-patch-process) 33 | - [Generate Changelog](#generate-changelog) 34 | - [Attach commit author](#attach-commit-author) 35 | - [Create commit](#create-commit) 36 | - [Auto push](#auto-push) 37 | - [On-demand development build](#on-demand-development-build) 38 | - [Commands](#commands) 39 | - [monoo release](#monoo-release) 40 | - [monoo patch](#monoo-patch) 41 | - [monoo changelog](#monoo-changelog) 42 | - [monoo dev](#monoo-dev) 43 | - [Projects Using MONOO](#projects-using-mono) 44 | - [FAQ](#faq) 45 | - [I don't use lerna, can I use it?](#i-dont-use-lerna-can-i-use-it) 46 | - [Author](#author) 47 | 48 | ## Install 49 | 50 | ```bash 51 | npm i -g monoo # globally 52 | npm i -D monoo # as devDependencies 53 | ``` 54 | 55 | ## Usage 56 | 57 | ### A complete release workflow 58 | 59 | If you had a monorepo as: 60 | 61 | ```bash 62 | . 63 | ├── lerna.json 64 | ├── package.json 65 | └── packages 66 |    ├── foo 67 |    ├── bar 68 |    ├── baz 69 |    └── qux 70 | ``` 71 | 72 | If current version is `2.1.1`, after a period of time, I decide to release a patch version with `latest` version, so I execute: 73 | 74 | ```bash 75 | monoo release 76 | ``` 77 | 78 | You'll receive a prompt log to choose a release version, and you selected `2.1.2` to continue. 79 | 80 | If release process got failed, you'll see a _**visible release status**_ under `patch` stage: 81 | 82 |

83 | 84 |

85 | 86 | Just select `Y` to finish release for all unpublished packages. 87 | 88 | ### Execute build after bump version 89 | 90 | You may execute `monoo release` after build packages, but if your build process generated assets that contains the version of each, you'll get a wrong version at final NPM assets, you can execute build after version is bumped: 91 | 92 | ```bash 93 | monoo release --build --ignore-scripts 94 | # Note that --ignore-scripts is required if you set `prepublishOnly` for sub packages. 95 | ``` 96 | 97 | ### Independent patch process 98 | 99 | Patch process has been integrated into [release flow](#a-complete-release-workflow), you can also use it separately: 100 | 101 | ```bash 102 | monoo patch --tag=latest # launch patch process with latest tag. 103 | ``` 104 | 105 | ### Generate Changelog 106 | 107 | Changelog process has been integrated into [release flow](#a-complete-release-workflow), You can also use it separately: 108 | 109 | ```bash 110 | monoo changelog # generate changelog 111 | ``` 112 | 113 | The equivalent command under release flow is: 114 | 115 | ``` 116 | monoo changelog --beautify --commit --gitPush --attachAuthor --authorNameType name 117 | ``` 118 | 119 | #### Attach commit author 120 | 121 | ```bash 122 | monoo changelog --attachAuthor 123 | ``` 124 | 125 | Commits under generated changelog will be attached with commit author: 126 | 127 | ```diff 128 | ### Bug Fixes 129 | 130 | -* **scope:** xx ([d1cfea5](...)) 131 | +* **scope:** xx ([d1cfea5](...)) [@ULIVZ](https://github.com/ulivz) 132 | ``` 133 | 134 | #### Create commit 135 | 136 | ```bash 137 | monoo changelog --commit 138 | ``` 139 | 140 | monoo will create a commit for generated changelog. 141 | 142 | #### Auto push 143 | 144 | ```bash 145 | monoo changelog --gitPush 146 | ``` 147 | 148 | monoo will create a push action to remote repository. 149 | 150 | ### On-demand development build 151 | 152 | using `lerna run dev` will launch all dev process for all packages, using `monoo dev` will launch a on-demand development build for monorepo. 153 | 154 | ```bash 155 | monoo dev 156 | ``` 157 | 158 | ## Commands 159 | 160 | ### monoo release 161 | 162 | Using `monoo release` to replace `lerna publish`: 163 | 164 | ```bash 165 | monoo release # standard release flow 166 | monoo release --no-changelog # do not generate changelog 167 | monoo release --ignore-scripts # ignore npm scripts under release process. 168 | monoo release --dry-run # preview execution 169 | ``` 170 | 171 | ### monoo patch 172 | 173 | ```bash 174 | monoo patch --tag laest # standard release flow 175 | monoo patch --tag next # launch patch process with next tag. 176 | monoo patch --tag latest --ignore-scripts # Ignore npm scripts under patch process. 177 | ``` 178 | 179 | ### monoo changelog 180 | 181 | ```bash 182 | monoo changelog 183 | monoo changelog --beautify # beautify changelog 184 | monoo changelog --commit # create a commit 185 | monoo changelog --gitPush # push to remote repository 186 | monoo changelog --attachAuthor # add author to generated changelog 187 | monoo changelog --authorNameType email # set display author to author's email 188 | monoo changelog --authorNameType name # set display author to author's name 189 | ``` 190 | 191 | Recommended composable flags: 192 | 193 | ```bash 194 | monoo changelog --beautify --commit --gitPush --attachAuthor --authorNameType name 195 | ``` 196 | 197 | ### monoo dev 198 | 199 | ```bash 200 | monoo dev # launch a on-demand development build for monorepo. 201 | ``` 202 | 203 | ## Projects Using MONOO 204 | 205 | Projects that use **MONOO**: 206 | 207 | - [VuePress](https://github.com/vuejs/vuepress): 📝 Minimalistic Vue-powered static site generator. 208 | - Many ByteDance projects. 209 | - Feel free to add yours here... 210 | 211 | ## FAQ 212 | 213 | ### I don't use lerna, can I use it? 214 | 215 | monoo leverage lerna under the hood, but you can still use it in other monorepo tool chains, such as rush. 216 | 217 | ## Author 218 | 219 | MIT © [ULIVZ](https://github.com/sponsors/ulivz) 220 | -------------------------------------------------------------------------------- /packages/monoo/src/release/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module dependencies 3 | */ 4 | import type { RequestInit } from "node-fetch"; 5 | import type urlJoin from "url-join"; 6 | import { IPackageJSON } from "@monoo/types" 7 | 8 | /** 9 | * Shared namespace 10 | */ 11 | export namespace SharedNS { 12 | export interface IOptions { 13 | cwd?: string; 14 | } 15 | } 16 | 17 | /** 18 | * Release namespace 19 | */ 20 | export namespace ReleaseNS { 21 | export interface IModifyReleaseArgumentsContext { 22 | arguments: string[]; 23 | version: string; 24 | tag: string; 25 | } 26 | 27 | export interface IReadyContext { 28 | cwd: string; 29 | } 30 | 31 | export interface IReleasedContext { 32 | cwd: string; 33 | version: string; 34 | tag: string; 35 | } 36 | 37 | export interface IPromptAnswers { 38 | bump: string; 39 | customVersion: string; 40 | npmTag: string; 41 | customNpmTag: string; 42 | } 43 | 44 | export interface IOptions extends SharedNS.IOptions { 45 | /** 46 | * Generate changelog or not. 47 | */ 48 | changelog?: boolean; 49 | /** 50 | * Run in band or not. 51 | */ 52 | runInBand?: boolean; 53 | /** 54 | * Ignore scripts, it will ignore the npm life cycle hooks (e.g. prepublishOnly). 55 | */ 56 | ignoreScripts?: boolean; 57 | /** 58 | * Execute custom build script before release. 59 | * 60 | * It is recommended to run topological build before actual publishing process, 61 | * and then ignore the build script (with `ignoreScripts`) of each package during 62 | * actual publishing release. 63 | */ 64 | build?: boolean | string; 65 | /** 66 | * Preview execution. 67 | */ 68 | dryRun?: boolean; 69 | /** 70 | * @deprecated 71 | */ 72 | ready?: (ctx: IReadyContext) => Promise; 73 | /** 74 | * @deprecated 75 | */ 76 | modifyReleaseArguments?: (ctx: IModifyReleaseArgumentsContext) => string[]; 77 | /** 78 | * @deprecated 79 | */ 80 | released?: (ctx: IReleasedContext) => Promise; 81 | } 82 | } 83 | 84 | /** 85 | * Run namespace 86 | */ 87 | export namespace RunNS { 88 | export interface IOptions extends SharedNS.IOptions { 89 | commands: string[]; 90 | runInBand: boolean; 91 | filter?(v: IPackageJSON): boolean; 92 | [key: string]: unknown; 93 | } 94 | } 95 | 96 | /** 97 | * Disttag namespace 98 | */ 99 | export namespace DistTagNS { 100 | export interface IOptions extends SharedNS.IOptions { 101 | distVersion: string; 102 | tag: string; 103 | } 104 | } 105 | 106 | /** 107 | * Path namespace 108 | */ 109 | export namespace PatchNS { 110 | export interface IOptions extends SharedNS.IOptions { 111 | version: string; 112 | tag: string; 113 | runInBand: boolean; 114 | ignoreScripts: boolean; 115 | } 116 | } 117 | 118 | /** 119 | * Dingding namespace 120 | */ 121 | export namespace DingdingNS { 122 | export interface IWebhook { 123 | name: string; 124 | webhook: string; 125 | secret: string; 126 | } 127 | 128 | export interface IOptions extends IWebhook { 129 | body?: { 130 | msgtype: "markdown"; 131 | markdown: { 132 | title: string; 133 | text: string; 134 | }; 135 | }; 136 | example?: boolean; 137 | } 138 | 139 | export interface IWebhookConfig { 140 | /** 141 | * Webhooks to post 142 | */ 143 | webhooks: DingdingNS.IWebhook[]; 144 | /** 145 | * Test webhook 146 | */ 147 | testWebhook?: DingdingNS.IWebhook; 148 | /** 149 | * Using test webhook or not 150 | */ 151 | test?: boolean; 152 | } 153 | } 154 | 155 | /** 156 | * Yuque namespace 157 | */ 158 | export namespace YuqueNS { 159 | /** 160 | * Transformer context 161 | */ 162 | export interface ITransformerContext { 163 | host: string; 164 | urlJoin: typeof urlJoin; 165 | transformerOptions: Record; 166 | options: IOptions; 167 | } 168 | 169 | /** 170 | * Post data 171 | */ 172 | export interface IYuquePostData { 173 | title: string; 174 | cover: string; 175 | description: string; 176 | custom_description: string; 177 | book: { 178 | namespace: string; 179 | user: { 180 | avatar_url: string; 181 | }; 182 | }; 183 | slug: string; 184 | } 185 | 186 | /** 187 | * Transformer 188 | */ 189 | export type Transformer = ( 190 | data: IYuquePostData, 191 | ctx: ITransformerContext 192 | ) => Record; 193 | 194 | /** 195 | * Options 196 | */ 197 | export interface IOptions 198 | extends SharedNS.IOptions, 199 | DingdingNS.IWebhookConfig { 200 | /** 201 | * Url of yuque post 202 | */ 203 | url?: string; 204 | /** 205 | * Host of yuque 206 | * @default 'https://yuque.antfin-inc.com/api/v2' 207 | */ 208 | host?: string; 209 | /** 210 | * Cover to post 211 | */ 212 | cover?: string; 213 | /** 214 | * Endpoint of yuque open api 215 | */ 216 | endpoint?: string; 217 | /** 218 | * Request options 219 | */ 220 | options?: Partial; 221 | /** 222 | * Transformer preset 223 | */ 224 | transformerPreset?: "dingding-actionCard"; 225 | /** 226 | * Transformer options 227 | */ 228 | transformerOptions?: Record; 229 | /** 230 | * Custom transformer 231 | */ 232 | transformer?: Transformer; 233 | /** 234 | * Log response 235 | */ 236 | log?: boolean; 237 | } 238 | } 239 | 240 | /** 241 | * changelog namespace 242 | */ 243 | export namespace ChangelogNS { 244 | export interface ICommitAuthorOptions { 245 | /** 246 | * Attach author to each changelog commit 247 | * 248 | * @default false 249 | */ 250 | attachAuthor?: boolean; 251 | /** 252 | * Type of author name 253 | * 254 | * @default 'name' 255 | */ 256 | authorNameType?: "name" | "email"; 257 | /** 258 | * Get author remote page 259 | * 260 | * @param author 261 | */ 262 | getAuthorPage?(author: ICommitAuthor): string; 263 | } 264 | 265 | export interface IOptions extends SharedNS.IOptions, ICommitAuthorOptions { 266 | /** 267 | * current Version 268 | * 269 | * @default version from lerna.json 270 | */ 271 | version?: string; 272 | /** 273 | * Beautify changelog, Remove top-level useless header 274 | * 275 | * @see https://github.com/conventional-changelog/conventional-changelog/issues/376 276 | * @default false 277 | */ 278 | beautify?: boolean; 279 | /** 280 | * Create changelog commit 281 | * 282 | * @default false 283 | */ 284 | commit?: boolean; 285 | /** 286 | * Create git push action 287 | * 288 | * @default false 289 | */ 290 | gitPush?: boolean; 291 | } 292 | /** 293 | * Commit author 294 | */ 295 | export interface ICommitAuthor { 296 | /** 297 | * Commit author name 298 | */ 299 | name: string; 300 | /** 301 | * Email name 302 | */ 303 | emailName: string; 304 | /** 305 | * Full email 306 | */ 307 | email: string; 308 | } 309 | } 310 | 311 | /** 312 | * PostChangelog namespace 313 | */ 314 | export namespace PostChangelogNS { 315 | /** 316 | * View all link 317 | */ 318 | export interface IViewAll { 319 | text: string; 320 | url: string; 321 | } 322 | /** 323 | * Options to infer changelog 324 | */ 325 | export interface IInferChangelogOptions 326 | extends SharedNS.IOptions, 327 | ChangelogNS.ICommitAuthorOptions { 328 | /** 329 | * Package name 330 | */ 331 | packageName: string; 332 | /** 333 | * changelog file name 334 | * 335 | * @default 'CHANGELOG.md' 336 | */ 337 | file?: string; 338 | /** 339 | * changelog preset, avilable presets: conventional-changelog、afx 340 | * 341 | * @default 'conventional-changelog' 342 | */ 343 | preset?: string; 344 | /** 345 | * custom changelog parser 346 | */ 347 | parser?: ( 348 | changelog: string, 349 | packageName: string 350 | ) => { 351 | title: string; 352 | content: string; 353 | }; 354 | /** 355 | * view all config 356 | */ 357 | viewAll?: IViewAll; 358 | } 359 | 360 | export interface IOptions 361 | extends IInferChangelogOptions, 362 | DingdingNS.IWebhookConfig { 363 | /** 364 | * Custom title, defaults to inferred title from changelog. 365 | */ 366 | title?: string; 367 | /** 368 | * Custom content, defaults to inferred content from changelog. 369 | */ 370 | content?: string; 371 | } 372 | } 373 | 374 | export type IConfig = ReleaseNS.IOptions & { 375 | verbose?: boolean; 376 | postChangelog?: PostChangelogNS.IOptions; 377 | yuque?: YuqueNS.IOptions; 378 | dingding?: DingdingNS.IOptions; 379 | patch?: PatchNS.IOptions; 380 | distTag?: DistTagNS.IOptions; 381 | run?: RunNS.IOptions; 382 | }; 383 | 384 | export function defineConfig(config: IConfig): IConfig { 385 | return config; 386 | } 387 | -------------------------------------------------------------------------------- /tsconfig.tsbuildinfo: -------------------------------------------------------------------------------- 1 | {"program":{"fileNames":["./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/.pnpm/typescript@4.5.2/node_modules/typescript/lib/lib.es2016.full.d.ts","./__tests__/changelog/pipelines/attach-author.test.ts","./__tests__/changelog/pipelines/beutify.test.ts","./__tests__/changelog/pipelines/normalize-commit-url.test.ts","./__tests__/release/patch/helper.test.ts","./packages/monoo/lib/index.d.ts","./node_modules/.pnpm/cac@6.7.12/node_modules/cac/dist/index.d.ts","./node_modules/.pnpm/chalk@2.4.2/node_modules/chalk/types/index.d.ts","./packages/monoo/src/dev/types.ts","./packages/monoo/src/dev/index.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/assert.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/assert/strict.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/globals.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/async_hooks.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/buffer.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/child_process.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/cluster.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/console.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/constants.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/crypto.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/dgram.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/dns.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/dns/promises.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/domain.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/events.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/fs.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/fs/promises.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/http.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/http2.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/https.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/inspector.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/module.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/net.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/os.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/path.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/perf_hooks.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/process.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/punycode.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/querystring.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/readline.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/repl.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/stream.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/stream/promises.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/stream/consumers.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/stream/web.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/string_decoder.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/timers.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/timers/promises.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/tls.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/trace_events.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/tty.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/url.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/util.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/v8.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/vm.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/wasi.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/worker_threads.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/zlib.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/globals.global.d.ts","./node_modules/.pnpm/@types+node@17.0.0/node_modules/@types/node/index.d.ts","./node_modules/.pnpm/execa@3.4.0/node_modules/execa/index.d.ts","./node_modules/.pnpm/@types+semver@6.2.3/node_modules/@types/semver/index.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/subscription.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/types.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/subscriber.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/operator.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/iif.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/throwerror.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/subject.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/connectableobservable.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/operators/groupby.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/symbol/observable.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/behaviorsubject.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/replaysubject.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/asyncsubject.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduler.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduler/action.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduler/asyncscheduler.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduler/asyncaction.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduler/asapscheduler.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduler/asap.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduler/async.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduler/queuescheduler.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduler/queue.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduler/animationframescheduler.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduler/animationframe.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduler/virtualtimescheduler.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/notification.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/util/pipe.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/util/noop.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/util/identity.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/util/isobservable.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/util/argumentoutofrangeerror.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/util/emptyerror.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/util/objectunsubscribederror.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/util/unsubscriptionerror.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/util/timeouterror.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/bindcallback.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/bindnodecallback.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/innersubscriber.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/outersubscriber.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/combinelatest.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/concat.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/defer.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/empty.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/forkjoin.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/from.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/fromevent.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/fromeventpattern.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/generate.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/interval.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/merge.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/never.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/of.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/onerrorresumenext.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/pairs.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/partition.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/race.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/range.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/timer.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/using.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/observable/zip.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/scheduled/scheduled.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/internal/config.d.ts","./node_modules/.pnpm/rxjs@6.6.7/node_modules/rxjs/index.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/objects/choice.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/objects/separator.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/objects/choices.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/utils/screen-manager.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/prompts/base.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/utils/paginator.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/prompts/checkbox.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/prompts/confirm.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/prompts/editor.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/prompts/expand.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/prompts/input.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/prompts/list.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/prompts/number.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/prompts/password.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/prompts/rawlist.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/utils/events.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/utils/readline.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/utils/utils.d.ts","./node_modules/.pnpm/@types+through@0.0.30/node_modules/@types/through/index.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/ui/baseui.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/ui/bottom-bar.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/lib/ui/prompt.d.ts","./node_modules/.pnpm/@types+inquirer@7.3.3/node_modules/@types/inquirer/index.d.ts","./packages/monoo/src/release/shared/fetchpackageversion.ts","./node_modules/.pnpm/form-data@3.0.1/node_modules/form-data/index.d.ts","./node_modules/.pnpm/@types+node-fetch@2.5.12/node_modules/@types/node-fetch/externals.d.ts","./node_modules/.pnpm/@types+node-fetch@2.5.12/node_modules/@types/node-fetch/index.d.ts","./packages/monoo/src/release/shared/fetch.ts","./packages/monoo/src/release/shared/logger.ts","./packages/monoo/src/release/shared/index.ts","./node_modules/.pnpm/@types+url-join@4.0.1/node_modules/@types/url-join/index.d.ts","./packages/monoo/src/release/types.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/basic.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/except.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/mutable.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/merge.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/merge-exclusive.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/require-at-least-one.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/require-exactly-one.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/partial-deep.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/readonly-deep.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/literal-union.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/promisable.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/opaque.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/set-optional.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/set-required.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/source/package-json.d.ts","./node_modules/.pnpm/type-fest@0.8.1/node_modules/type-fest/index.d.ts","./node_modules/.pnpm/cli-boxes@2.2.1/node_modules/cli-boxes/index.d.ts","./node_modules/.pnpm/boxen@4.2.0/node_modules/boxen/index.d.ts","./node_modules/.pnpm/@types+text-table@0.2.2/node_modules/@types/text-table/index.d.ts","./node_modules/.pnpm/string-width@4.2.3/node_modules/string-width/index.d.ts","./packages/monoo/src/release/patch/helper.ts","./packages/monoo/src/release/patch/index.ts","./packages/monoo/src/release/changelog/helpers.ts","./packages/monoo/src/release/changelog/pipelines/shared.ts","./packages/monoo/src/release/changelog/pipelines/beautify.ts","./packages/monoo/src/release/changelog/regexp.ts","./packages/monoo/src/release/changelog/pipelines/attach-author.ts","./packages/monoo/src/release/changelog/pipelines/normalize-commit-url.ts","./packages/monoo/src/release/changelog/pipelines/index.ts","./packages/monoo/src/release/changelog/index.ts","./packages/monoo/src/release/index.ts","./packages/monoo/src/index.ts","./packages/monoo/src/cli.ts","./packages/shared/lib/index.d.ts","./packages/shared/src/terminal.ts","./node_modules/.pnpm/chokidar@3.5.2/node_modules/chokidar/types/index.d.ts","./node_modules/.pnpm/@types+minimatch@3.0.5/node_modules/@types/minimatch/index.d.ts","./node_modules/.pnpm/@types+glob@7.2.0/node_modules/@types/glob/index.d.ts","./node_modules/.pnpm/@types+shelljs@0.8.9/node_modules/@types/shelljs/index.d.ts","./packages/types/src/use-config.ts","./packages/types/src/monorepo.ts","./packages/types/src/monorepo-builder.ts","./packages/types/src/lerna.ts","./packages/types/src/index.ts","./packages/shared/src/monorepo-builder.ts","./node_modules/.pnpm/@types+fs-extra@8.1.2/node_modules/@types/fs-extra/index.d.ts","./node_modules/.pnpm/fast-glob@2.2.7/node_modules/fast-glob/out/types/entries.d.ts","./node_modules/.pnpm/fast-glob@2.2.7/node_modules/fast-glob/out/types/patterns.d.ts","./node_modules/.pnpm/fast-glob@2.2.7/node_modules/fast-glob/out/managers/options.d.ts","./node_modules/.pnpm/fast-glob@2.2.7/node_modules/fast-glob/out/managers/tasks.d.ts","./node_modules/.pnpm/fast-glob@2.2.7/node_modules/fast-glob/index.d.ts","./node_modules/.pnpm/globby@9.2.0/node_modules/globby/index.d.ts","./packages/shared/src/util.ts","./packages/shared/src/index.ts","./packages/types/lib/index.d.ts","./node_modules/.pnpm/@babel+types@7.16.0/node_modules/@babel/types/lib/index.d.ts","./node_modules/.pnpm/@types+babel__generator@7.6.3/node_modules/@types/babel__generator/index.d.ts","./node_modules/.pnpm/@babel+parser@7.16.6/node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/.pnpm/@types+babel__template@7.4.1/node_modules/@types/babel__template/index.d.ts","./node_modules/.pnpm/@types+babel__traverse@7.14.2/node_modules/@types/babel__traverse/index.d.ts","./node_modules/.pnpm/@types+babel__core@7.1.17/node_modules/@types/babel__core/index.d.ts","./node_modules/.pnpm/@types+connect@3.4.35/node_modules/@types/connect/index.d.ts","./node_modules/.pnpm/@types+body-parser@1.19.2/node_modules/@types/body-parser/index.d.ts","./node_modules/.pnpm/@types+cors@2.8.12/node_modules/@types/cors/index.d.ts","./node_modules/.pnpm/@types+range-parser@1.2.4/node_modules/@types/range-parser/index.d.ts","./node_modules/.pnpm/@types+qs@6.9.7/node_modules/@types/qs/index.d.ts","./node_modules/.pnpm/@types+express-serve-static-core@4.17.26/node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/.pnpm/@types+mime@1.3.2/node_modules/@types/mime/index.d.ts","./node_modules/.pnpm/@types+serve-static@1.13.10/node_modules/@types/serve-static/index.d.ts","./node_modules/.pnpm/@types+express@4.17.13/node_modules/@types/express/index.d.ts","./node_modules/.pnpm/@types+graceful-fs@4.1.5/node_modules/@types/graceful-fs/index.d.ts","./node_modules/.pnpm/@types+istanbul-lib-coverage@2.0.3/node_modules/@types/istanbul-lib-coverage/index.d.ts","./node_modules/.pnpm/@types+istanbul-lib-report@3.0.0/node_modules/@types/istanbul-lib-report/index.d.ts","./node_modules/.pnpm/@types+istanbul-reports@3.0.1/node_modules/@types/istanbul-reports/index.d.ts","./node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/cleanupsemantic.d.ts","./node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/types.d.ts","./node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/difflines.d.ts","./node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/printdiffs.d.ts","./node_modules/.pnpm/jest-diff@26.6.2/node_modules/jest-diff/build/index.d.ts","./node_modules/.pnpm/pretty-format@26.6.2/node_modules/pretty-format/build/types.d.ts","./node_modules/.pnpm/pretty-format@26.6.2/node_modules/pretty-format/build/index.d.ts","./node_modules/.pnpm/@types+jest@27.0.0/node_modules/@types/jest/index.d.ts","./node_modules/.pnpm/@types+minimist@1.2.2/node_modules/@types/minimist/index.d.ts","./node_modules/.pnpm/@types+normalize-package-data@2.4.1/node_modules/@types/normalize-package-data/index.d.ts","./node_modules/.pnpm/@types+parse-json@4.0.0/node_modules/@types/parse-json/index.d.ts","./node_modules/.pnpm/@types+prettier@2.4.2/node_modules/@types/prettier/index.d.ts","./node_modules/.pnpm/@types+stack-utils@2.0.1/node_modules/@types/stack-utils/index.d.ts","./node_modules/.pnpm/@types+yargs-parser@20.2.1/node_modules/@types/yargs-parser/index.d.ts","./node_modules/.pnpm/@types+yargs@16.0.4/node_modules/@types/yargs/index.d.ts","./packages/monoo/src/monorepo-builder.ts","./packages/monoo/src/terminal.ts","./packages/monoo/src/util.ts","./packages/shared copy/lib/index.d.ts","./packages/shared copy/src/index.ts","./packages/shared copy/src/monorepo-builder.ts","./packages/shared copy/src/terminal.ts","./packages/shared copy/src/util.ts","./packages/shared/src/lerna.ts","./packages/shared/src/monorepo.ts","./packages/shared/src/server.ts","./packages/shared/src/use-config.ts","./packages/types copy/lib/index.d.ts","./packages/types copy/src/index.ts","./packages/types copy/src/lerna.ts","./packages/types copy/src/monorepo-builder.ts","./packages/types copy/src/monorepo.ts","./packages/types copy/src/server.ts","./packages/types copy/src/use-config.ts","./packages/types/src/server.ts","./packages/types/types/index.ts","./packages/types/types/lerna.ts","./packages/types/types/monorepo-builder.ts","./packages/types/types/monorepo.ts","./packages/types/types/server.ts","./packages/types/types/use-config.ts","./src/cli.ts","./src/dev/index.ts","./src/dev/types.ts","./src/index.ts","./src/release/changelog/helpers.ts","./src/release/changelog/index.ts","./src/release/changelog/pipelines/attach-author.ts","./src/release/changelog/pipelines/beautify.ts","./src/release/changelog/pipelines/index.ts","./src/release/changelog/pipelines/normalize-commit-url.ts","./src/release/changelog/pipelines/shared.ts","./src/release/changelog/regexp.ts","./src/release/index.ts","./src/release/patch/helper.ts","./src/release/patch/index.ts","./src/release/shared/fetch.ts","./src/release/shared/fetchpackageversion.ts","./src/release/shared/index.ts","./src/release/shared/logger.ts","./src/release/types.ts","./src/shared/index.ts","./src/shared/monorepo-builder.ts","./src/shared/terminal.ts","./src/shared/util.ts","./src/types/index.ts","./src/types/lerna.ts","./src/types/monorepo-builder.ts","./src/types/monorepo.ts","./src/types/server.ts","./src/types/use-config.ts"],"fileInfos":[{"version":"6adbf5efd0e374ff5f427a4f26a5a413e9734eee5067a0e86da69aea41910b52","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","e6b724280c694a9f588847f754198fb96c43d805f065c3a5b28bbc9594541c84","e21c071ca3e1b4a815d5f04a7475adcaeea5d64367e840dd0154096d705c3940","746d62152361558ea6d6115cf0da4dd10ede041d14882ede3568bce5dc4b4f1f","2cc028cd0bdb35b1b5eb723d84666a255933fffbea607f72cbd0c7c7b4bee144",{"version":"abba1071bfd89e55e88a054b0c851ea3e8a494c340d0f3fab19eb18f6afb0c9e","affectsGlobalScope":true},{"version":"927cb2b60048e1395b183bf74b2b80a75bdb1dbe384e1d9fac654313ea2fb136","affectsGlobalScope":true},{"version":"7fac8cb5fc820bc2a59ae11ef1c5b38d3832c6d0dfaec5acdb5569137d09a481","affectsGlobalScope":true},{"version":"097a57355ded99c68e6df1b738990448e0bf170e606707df5a7c0481ff2427cd","affectsGlobalScope":true},{"version":"d8996609230d17e90484a2dd58f22668f9a05a3bfe00bfb1d6271171e54a31fb","affectsGlobalScope":true},{"version":"43fb1d932e4966a39a41b464a12a81899d9ae5f2c829063f5571b6b87e6d2f9c","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"4378fc8122ec9d1a685b01eb66c46f62aba6b239ca7228bb6483bcf8259ee493","affectsGlobalScope":true},{"version":"0d5f52b3174bee6edb81260ebcd792692c32c81fd55499d69531496f3f2b25e7","affectsGlobalScope":true},{"version":"810627a82ac06fb5166da5ada4159c4ec11978dfbb0805fe804c86406dab8357","affectsGlobalScope":true},{"version":"62d80405c46c3f4c527ee657ae9d43fda65a0bf582292429aea1e69144a522a6","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"75ec0bdd727d887f1b79ed6619412ea72ba3c81d92d0787ccb64bab18d261f14","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"12a310447c5d23c7d0d5ca2af606e3bd08afda69100166730ab92c62999ebb9d","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"1b3fe904465430e030c93239a348f05e1be80640d91f2f004c3512c2c2c89f34","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"d071129cba6a5f2700be09c86c07ad2791ab67d4e5ed1eb301d6746c62745ea4","affectsGlobalScope":true},{"version":"6c55633c733c8378db65ac3da7a767c3cf2cf3057f0565a9124a16a3a2019e87","affectsGlobalScope":true},{"version":"fb4416144c1bf0323ccbc9afb0ab289c07312214e8820ad17d709498c865a3fe","affectsGlobalScope":true},{"version":"5b0ca94ec819d68d33da516306c15297acec88efeb0ae9e2b39f71dbd9685ef7","affectsGlobalScope":true},{"version":"e8c9f4e445a489991ca1a4232667de3ac36b07ba75ea335971fbeacf2d26fe67","affectsGlobalScope":true},{"version":"10bbdc1981b8d9310ee75bfac28ee0477bb2353e8529da8cff7cb26c409cb5e8","affectsGlobalScope":true},"2dfbb27de6bf0db1018122b054d26cf1fc47bc1979d096aec101b08a42c63b13",{"version":"425fe14cda7bbc89299c99b72070c732d3dfe6bc47ea064f13394208dbee8459","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"53083e95eaaa92d54c305485073e61ea7d74bb1e031a7c58798693c4617d81ba","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"d2195c154e924be1a013d0a762cd5a13fbed6723e54f155a009adfa7131d8497","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"16d481c9574350d6d7676cd8474a5186bfc1e06955348413598903ae87f5cb4b","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"c48fe105ed17b67196977449f8c70b0a845aba15234f2325e947478ea6ff8e52","994a9dc0817e0ffe64b9529828e003a3c495343d097e7a602027adf3cd606f71","091f417275a51ab3c47b949723e9e8a193012157ecc64a96e2d7b1505e82f395",{"version":"4242ed3c2779c8e900bd6b16a10fe92296d3964a4fe5619acc16845b885ea919","signature":"8d5298e0c8c0a77de308d425148389ce245fd7db2ab082eacf1a9952b2898a9f"},{"version":"e0e3efb334383bbcdb4af6fe148b877409e265121ef83e1765f82e20c65bdf95","signature":"239620b7ee9638fea18bd7c796cf479cc47bee33f57d57f8ed9866b89bc557eb"},"0cba3a5d7b81356222594442753cf90dd2892e5ccfe1d262aaca6896ba6c1380","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"92d63add669d18ebc349efbacd88966d6f2ccdddfb1b880b2db98ae3aa7bf7c4","affectsGlobalScope":true},"422dbb183fdced59425ca072c8bd09efaa77ce4e2ab928ec0d8a1ce062d2a45a",{"version":"2a801b0322994c3dd7f0ef30265d19b3dd3bae6d793596879166ed6219c3da68","affectsGlobalScope":true},"1dab5ab6bcf11de47ab9db295df8c4f1d92ffa750e8f095e88c71ce4c3299628","f71f46ccd5a90566f0a37b25b23bc4684381ab2180bdf6733f4e6624474e1894",{"version":"54e65985a3ee3cec182e6a555e20974ea936fc8b8d1738c14e8ed8a42bd921d4","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","bcc8caf03ee65fe8610d258752f255fbdddbb2e4de7b6c5628956a5a0d859ec8","34e5de87d983bc6aefef8b17658556e3157003e8d9555d3cb098c6bef0b5fbc8","cc0b61316c4f37393f1f9595e93b673f4184e9d07f4c127165a490ec4a928668","f27371653aded82b2b160f7a7033fb4a5b1534b6f6081ef7be1468f0f15327d3","c762cd6754b13a461c54b59d0ae0ab7aeef3c292c6cf889873f786ee4d8e75c9","f4ea7d5df644785bd9fbf419930cbaec118f0d8b4160037d2339b8e23c059e79",{"version":"c28e5baab1b53377c90d12970e207a2644bc3627840066449e37e2a59125d07e","affectsGlobalScope":true},"7a5459efa09ea82088234e6533a203d528c594b01787fb90fba148885a36e8b6","ae97e20f2e10dbeec193d6a2f9cd9a367a1e293e7d6b33b68bacea166afd7792","9eea308669d97080b8cf05dc3f1340435478e47c472017ce9d803921db074603","c7f145543fd443ba1e03050421c179c3fbd9dfe590905ec3530755a915cbe22e","bf73c576885408d4a176f44a9035d798827cc5020d58284cb18d7573430d9022","7ae078ca42a670445ae0c6a97c029cb83d143d62abd1730efb33f68f0b2c0e82",{"version":"e8b18c6385ff784228a6f369694fcf1a6b475355ba89090a88de13587a9391d5","affectsGlobalScope":true},"9f2edefec1509d5707b2de3a4d1f2af064ccfef02d050897d60adb5eead0c604","12eea70b5e11e924bb0543aea5eadc16ced318aa26001b453b0d561c2fd0bd1e","eafb9217aee34f5d7ebb42a5ed8f9b5881d2440c3d7b1d41667ce42806cf2cdd","1aee07ac9abb89ef59d2528541403f2a8f3c845167d7d2e3b4a44063ee29c395",{"version":"bd1a08e30569b0fb2f0b21035eb9b039871f68faa9b98accf847e9c878c5e0a9","affectsGlobalScope":true},"2a12d2da5ac4c4979401a3f6eaafa874747a37c365e4bc18aa2b171ae134d21b","002b837927b53f3714308ecd96f72ee8a053b8aeb28213d8ec6de23ed1608b66","1dc9c847473bb47279e398b22c740c83ea37a5c88bf66629666e3cf4c5b9f99c","a9e4a5a24bf2c44de4c98274975a1a705a0abbaad04df3557c2d3cd8b1727949","7185660ba7fe7c4221dcd443ffa32d1a786192548735692d98a40a90fa2867a4","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff",{"version":"806ef4cac3b3d9fa4a48d849c8e084d7c72fcd7b16d76e06049a9ed742ff79c0","affectsGlobalScope":true},"cfe724f7c694aab65a9bdd1acb05997848c504548c9d4c71645c187a091cfa2a","5f0ed51db151c2cdc4fa3bb0f44ce6066912ad001b607a34e65a96c52eb76248",{"version":"3345c276cab0e76dda86c0fb79104ff915a4580ba0f3e440870e183b1baec476","affectsGlobalScope":true},"664d8f2d59164f2e08c543981453893bc7e003e4dfd29651ce09db13e9457980","51919fe45a014b1c55c55ad334585dcc31ed4c3f846d39b9f44b6efaafdebc3a","f52fbf64c7e480271a9096763c4882d356b05cab05bf56a64e68a95313cd2ce2","59bdb65f28d7ce52ccfc906e9aaf422f8b8534b2d21c32a27d7819be5ad81df7","1835259a20b9fa6b1882931375b69ae5978195f2b139b4e0db51ec8319261649","b52cd693219a63dd21282ac99a7bf55f77cbe8a91f097968856419cc2e05f017","3aff9c8c36192e46a84afe7b926136d520487155154ab9ba982a8b544ea8fc95","a880cf8d85af2e4189c709b0fea613741649c0e40fffb4360ec70762563d5de0","85bbf436a15bbeda4db888be3062d47f99c66fd05d7c50f0f6473a9151b6a070","9f9c49c95ecd25e0cb2587751925976cf64fd184714cb11e213749c80cf0f927","f0c75c08a71f9212c93a719a25fb0320d53f2e50ca89a812640e08f8ad8c408c",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"267af67ea520cabd16402522756b19ac63d9e2c1c86e7c4d1ddeb991c32e12c9","9fec2ce3123b28bd6478a6daeae2b88c3b4e95cc36927e13c74157f14e0bf195","87352bb579421f6938177a53bb66e8514067b4872ccaa5fe08ddbca56364570c","6cb35d83d21a7e72bd00398c93302749bcd38349d0cc5e76ff3a90c6d1498a4d",{"version":"369dd7668d0e6c91550bce0c325f37ce6402e5dd40ecfca66fbb5283e23e559d","affectsGlobalScope":true},"2632057d8b983ee33295566088c080384d7d69a492bc60b008d6a6dfd3508d6b","4bf71cf2a94492fc71e97800bdf2bcb0a9a0fa5fce921c8fe42c67060780cbfa","0996ff06f64cb05b6dac158a6ada2e16f8c2ccd20f9ff6f3c3e871f1ba5fb6d9","5c492d01a19fea5ebfff9d27e786bc533e5078909521ca17ae41236f16f9686a","a6ee930b81c65ec79aca49025b797817dde6f2d2e9b0e0106f0844e18e2cc819","84fce15473e993e6b656db9dd3c9196b80f545647458e6621675e840fd700d29","7d5336ee766aa72dffb1cc2a515f61d18a4fb61b7a2757cbccfb7b286b783dfb","63e96248ab63f6e7a86e31aa3e654ed6de1c3f99e3b668e04800df05874e8b77","80da0f61195385d22b666408f6cccbc261c066d401611a286f07dfddf7764017","06a20cc7d937074863861ea1159ac783ff97b13952b4b5d1811c7d8ab5c94776","ab6de4af0e293eae73b67dad251af097d7bcc0b8b62de84e3674e831514cb056","18cbd79079af97af66c9c07c61b481fce14a4e7282eca078c474b40c970ba1d0","e7b45405689d87e745a217b648d3646fb47a6aaba9c8d775204de90c7ea9ff35","669b754ec246dd7471e19b655b73bda6c2ca5bb7ccb1a4dff44a9ae45b6a716a","bcfaca4a8ff50f57fd36df91fba5d34056883f213baff7192cbfc4d3805d2084","76a564b360b267502219a89514953058494713ee0923a63b2024e542c18b40e5","8f62cbd3afbd6a07bb8c934294b6bfbe437021b89e53a4da7de2648ecfc7af25","a20629551ed7923f35f7556c4c15d0c8b2ebe7afaa68ceaab079a1707ba64be2","d6de66600c97cd499526ddecea6e12166ab1c0e8d9bf36fb2339fd39c8b3372a","8e7a5b8f867b99cc8763c0b024068fb58e09f7da2c4810c12833e1ca6eb11c4f","a8932876de2e3138a5a27f9426b225a4d27f0ba0a1e2764ba20930b4c3faf4b9","df877050b04c29b9f8409aa10278d586825f511f0841d1ec41b6554f8362092b","027d600e00c5f5e1816c207854285d736f2f5fa28276e2829db746d5d6811ba1","5443113a16ef378446e08d6500bb48b35de582426459abdb5c9704f5c7d327d9","0fb581ecb53304a3c95bb930160b4fa610537470cce850371cbaad5a458ca0d9","7da4e290c009d7967343a7f8c3f145a3d2c157c62483362183ba9f637a536489","eb21ddc3a8136a12e69176531197def71dc28ffaf357b74d4bf83407bd845991","914560d0c4c6aa947cfe7489fe970c94ba25383c414bbe0168b44fd20dbf0df4","4fb3405055b54566dea2135845c3a776339e7e170d692401d97fd41ad9a20e5d","8d607832a6ef0eac30657173441367dd76c96bf7800d77193428b922e060c3af","20ff7207f0bb5cdde5fee8e83315ade7e5b8100cfa2087d20d39069a3d7d06f4","7ca4c534eab7cff43d81327e369a23464bc37ef38ce5337ceff24a42c6c84eb2","5252dec18a34078398be4e321dee884dc7f47930e5225262543a799b591b36d2","23caed4dff98bd28157d2b798b43f1dfefe727f18641648c01ce4e0e929a1630","f67e013d5374826596d7c23dbae1cdb14375a27cd72e16c5fb46a4b445059329","ea3401b70e2302683bbf4c18b69ef2292b60f4d8f8e6d920413b81fb7bde0f65","71afe26642c0fb86b9f8b1af4af5deb5181b43b6542a3ff2314871b53d04c749","0d7f01634e6234d84cf0106508efdb8ae00e5ed126eff9606d37b031ac1de654","f8d209086bad78af6bd7fef063c1ed449c815e6f8d36058115f222d9f788b848","3ad003278d569d1953779e2f838f7798f02e793f6a1eceac8e0065f1a202669b","fb2c5eceffcd918dbb86332afa0199f5e7b6cf6ee42809e930a827b28ef25afe","f664aaff6a981eeca68f1ff2d9fd21b6664f47bf45f3ae19874df5a6683a8d8a","ce066f85d73e09e9adbd0049bcf6471c7eefbfc2ec4b5692b5bcef1e36babd2a","09d302513cacfbcc54b67088739bd8ac1c3c57917f83f510b2d1adcb99fd7d2a","3faa54e978b92a6f726440c13fe3ab35993dc74d697c7709681dc1764a25219f","2bd0489e968925eb0c4c0fb12ef090be5165c86bd088e1e803102c38d4a717d8","88924207132b9ba339c1adb1ed3ea07e47b3149ff8a2e21a3ea1f91cee68589d","b8800b93d8ab532f8915be73f8195b9d4ef06376d8a82e8cdc17c400553172d6","d7d469703b78beba76d511957f8c8b534c3bbb02bea7ab4705c65ef573532fb8","74c8c3057669c03264263d911d0f82e876cef50b05be21c54fef23c900de0420","b303eda2ff2d582a9c3c5ecb708fb57355cdc25e8c8197a9f66d4d1bf09fda19","4e5dc89fa22ff43da3dee1db97d5add0591ebaff9e4adef6c8b6f0b41f0f60f0","ec4e82cb42a902fe83dc13153c7a260bee95684541f8d7ef26cb0629a2f4ca31","5f36e24cd92b0ff3e2a243685a8a780c9413941c36739f04b428cc4e15de629d","40a26494e6ab10a91851791169582ab77fed4fbd799518968177e7eefe08c7a9","208e125b45bc561765a74f6f1019d88e44e94678769824cf93726e1bac457961","b3985971de086ef3aa698ef19009a53527b72e65851b782dc188ac341a1e1390","c81d421aabb6113cd98b9d4f11e9a03273b363b841f294b457f37c15d513151d","30063e3a184ff31254bbafa782c78a2d6636943dfe59e1a34f451827fd7a68dc","c05d4cae0bceed02c9d013360d3e65658297acb1b7a90252fe366f2bf4f9ccc9","6f14b92848889abba03a474e0750f7350cc91fc190c107408ca48679a03975ae","a588d0765b1d18bf00a498b75a83e095aef75a9300b6c1e91cbf39e408f2fe2f","502bd3d3dd93b012e56864157c9ec3a3a53695fb05d1f42671f3e6314698a665","6b1b045b3e848a844ff1922ce2f82925f21d482bdeba5710883ab0c7df2c7e2b","8fac536b0b73249d9153424adafe49282c389a08163544917c18dfc1ddcbbd25","05a21cbb7cbe1ec502e7baca1f4846a4e860d96bad112f3e316b995ba99715b7","1eaee2b52f1c0e1848845a79050c1d06ae554d8050c35e3bf479f13d6ee19dd5","fd219904eea67c470dfebbaf44129b0db858207c3c3b55514bdc84de547b1687","4de232968f584b960b4101b4cdae593456aff149c5d0c70c2389248e9eb9fbac","9d6f6d1d788d8010417b914f4bad17be02645c6c5177a098dca97bee7561a0e1","c5430542eeebb207d651e8b00a08e4bb680c47ecb73dd388d8fa597a1fc5de5b","a6c5c9906262cf10549989c0061e5a44afdc1f61da77d5e09418a9ecea0018fe","1405d8968a5da39a3aed8c1701ca813d3284f51adb87b184337bb35402b077eb","33d63a317a3d2f2e06a10cf04a5caf7a781fe5f644a0dda5dfe81883c1ab2cca","ab60a5aea46b4fd3ee9d52ba0059d908f6f974cf4aba52a693f03361aa1adec0","7faa24bb6f24e79337fa302cc328d9f50ba3fb1af45a5aedcaa64e9b326a0bab","1a8f503c64bdb36308f245960d9e4acac4cf65d8b6bd0534f88230ebf0be7883","83c54a3b3e836d1773b8c23ff76ce6e0aae1a2209fc772b75e9de173fec9eac0","475e411f48f74c14b1f6e50cc244387a5cc8ce52340dddfae897c96e03f86527","948d08b7c693d1a4d0101bd2a48a2930e814811acde8f2a4c1226fd4a907cac0","656424ca784760c679bf2677d8aaf55d1cb8452cd0ac04bbe1c0f659f45f8c11","a2c1f4012459547d62116d724e7ec820bb2e6848da40ea0747bf160ffd99b283","0dc197e52512a7cbea4823cc33c23b0337af97bd59b38bf83be047f37cd8c9a8","492c93ade227fe4545fabb3035b9dd5d57d8b4fde322e5217fdaef20aa1b80a8","e84784554ccec0a03886acbd0b08dece208335465800bc3b5c9ab152c780a303",{"version":"51319155e8da91a5a0ad1ba4259a89c8dc08c4ee86ea5ce33cdf3a4e1a4ea52b","signature":"806c51572f09c5880c94c8e286eb0cd03dd7b77cbd5d0519a3f7c4a0a3e5300d"},"736097ddbb2903bef918bb3b5811ef1c9c5656f2a73bd39b22a91b9cc2525e50","208bb742e0f201470da121bc73847c74b62cff4172f38ae5949ae77d6c9c6b71","062bd2910098fc059ba93e347649b3e126c555f7b144033d21d3f8ef63d3e39b",{"version":"0c3170d8c4672659e8c3c4bbbfa07693228d8300b701be8ab42875169eae5e61","signature":"9ea2986edc5b5e110b9af6326161b0fa92ea7a09b46e898fd888d0c7ca74c05d"},{"version":"26fe75e26b04deb4db3d9433768dad16edd8fd59ed4b0a0892a45efc1a233be9","signature":"7961ad7e7b5000206197b25379c5ae24d1e04c0bbc97f8cdc8318a58a14bb3a1"},"4884e3da22590dc1ae28562660a6e636aa87a7b6ea0b243d08eb933c53c34f22","d9c5f8d21771758700d7b6eeef796700b99c643a5818195cf0d01bed98407df1",{"version":"f7bed9092c44e7cc09d350020bb153626764e0d66bb6e35f31455fe3724a463d","signature":"49bfcf3da0ff1b9eab2fc76487a162534ef15b4912028727eede5809f4f2ba11"},{"version":"fda9e5c2afd0920ead6baed40f164229ec8f93188b5c8df196594a54bb8fb5e3","affectsGlobalScope":true},"c58be3e560989a877531d3ff7c9e5db41c5dd9282480ccf197abfcc708a95b8d","91f23ddc3971b1c8938c638fb55601a339483953e1eb800675fa5b5e8113db72","50d22844db90a0dcd359afeb59dd1e9a384d977b4b363c880b4e65047237a29e","d33782b82eea0ee17b99ca563bd19b38259a3aaf096d306ceaf59cd4422629be","7f7f1420c69806e268ab7820cbe31a2dcb2f836f28b3d09132a2a95b4a454b80","f9ecf72f3842ae35faf3aa122a9c87a486446cb9084601695f9e6a2cdf0d3e4b","61046f12c3cfafd353d2d03febc96b441c1a0e3bb82a5a88de78cc1be9e10520","f4e7f5824ac7b35539efc3bef36b3e6be89603b88224cb5c0ad3526a454fc895","091af8276fbc70609a00e296840bd284a2fe29df282f0e8dae2de9f0a706685f","537aff717746703d2157ec563b5de4f6393ce9f69a84ae62b49e9b6c80b6e587","5a0c23174f822edd4a0c5f52308fd6cbdfcc5ef9c4279286cf7da548fd46cb1b","5d007514c3876ecc7326b898d1738eed7b77d6a3611d73f5c99fe37801dd48e6","85dff77bf599bd57135b34169d8f80914bbcdb52dfa9fb5fa2204b366363d519","8b108d831999b4c6b1df9c39cdcc57c059ef19219c441e5b61bca20aabb9f411","04c593214be9083f51ed93751bd556bfdc0737b0a4cdaf225b12a525df7fa0dc","34739077a773aee172bdace5082c5411e2089b62e586cd097ea55362f1a3b1de","0797b889b745051d706c17212d86e28c9e150e89597ab5a16f81bbb8af1367c8","0010173d7ce339de64a40603a5fd67950bc107e5983fb7521b52b221146ebfe1","08f234e8871dacf59e1f194fd83c11d002d8d4d488f7be138900755e3e637a24",{"version":"41a542ef90b51ebfac1fa9d4ed017c0eb271e48f14dc56240994c8fef72bd2fe","signature":"f58ef6ed8aa50fd1edf986f2393ea368cfd1ade5d5f3f32d1191ef5cb4ff0fe1"},{"version":"ae376e157e5be59cf1a80999a75f8e094472444f3acf65a2356e77130efef968","signature":"b0787a0b7b6e18ba5033c56b2694e0d1f784cf4652592f0d11274b88b2654b89"},{"version":"0cf9dbb2043455cfde14f8b678de426d2b0726649f51167545aaf34ffb576728","signature":"242876659ef38f3af5d7d010c906441b6c3c67fd5dd1deb1999f5c617cbfe46d"},{"version":"bd0eda7cb6f7b0fef86f28f517622fb874f7edf86de4eb511aa62fef27966b3c","signature":"df5b719a7dd8a493631028343a51a23b56234433e913a0f7016c7c7e86fd23f7"},{"version":"276c463030d8507113815bb38c4f8ddf34ad79e02cbd34a45f433e384b1b2415","signature":"8f742070157bfa0899efd65837f705510d20396b0518df7fdc1cd3b7ddb140e4"},{"version":"cd2db03853d6933789ba6075fd9209c6de67c56854cde00094ddb6af74fc70b2","signature":"978ff7d1693653daee32599f06ed43a7dc4452a9aea0e902bdb555cae12ef828"},{"version":"7a2a9ca033748be7e35be82c386d7d648fbb75be7a4c77922b2778a780ff9557","signature":"21e68577f2a97cce564668f4402a7af151611407d6b82b65f6d77562d50916f7"},{"version":"01bd30fd683794ccfc63ade33367978c46a58b570a3b7eab4e2167d763f20400","signature":"e8a9ac5bb2633df10634b9b4eb713c4d2821e7612de035ac5e8e03bae0f524d1"},"6a3d97cf48c1aa060ae8694fe4065283a8ebbf14e4f52775fa33aa3bc395b8c5",{"version":"3b6aec4aa2fd5e9ff44616a569f9edefc5d4caa16a54f494b40726b732bba2ee","signature":"69ba41f24e820e80f4b4e0f2bf601a644c3694f0394c320c45a65a31f7cbcba3"},{"version":"6bb9b0d04d9e0b545175dc7a6ca5d0c7b8c2b5f393ef398b4eb76eff67f21a8a","signature":"3c28b1a8a7b4fe0b2e71e2ca881bdc17f21570f9b28e50715316893d0aa80e2c"},"c1bfe891277f6c43bf3fea5f478a8e2fc05be663749352bb5d51419cb743d0ed",{"version":"de51adf280aae79893fbc4a5614ff50ae1f30e5986a4a256d36851a0ec666f47","signature":"84d309ce2278b4f9e8a63d47fd209e2c496d3e1eecc9445b6549090e3cb69d93"},"c48fe105ed17b67196977449f8c70b0a845aba15234f2325e947478ea6ff8e52",{"version":"0bbf0f214cd96cea59caa4a7f1a0c502855cddc2dd4cd3bd06dff97f610d41d7","signature":"17bc32200550978fc287a1a22d6f8b7e14510556518971c0c4ed468700296c26"},"ca7f76d3ea132bde53dca1a0f33cda95397d20c248e452c050773f01504d9802","8841e2aa774b89bd23302dede20663306dc1b9902431ac64b24be8b8d0e3f649","fd326577c62145816fe1acc306c734c2396487f76719d3785d4e825b34540b33","5b8476e49f360da8548e0acfbb77344291512db4453512c7b5ec8277f1c762c3",{"version":"fde6c2e0644314d56480a08f71d2bd33de72143fc4f967e020d8062b9b20c107","signature":"b295f39f7c21edb4199fcec320b6e173e699cca8abce22de7b1559179745efc7"},{"version":"8151d8ba9fa0df2c257ac9168ee45c93f1ac2d75c77cdc66fae2ac5ee2d36273","signature":"1c449eb4accbad8fbc43429165af049867d2b36101db09763a047c16019b2cad"},{"version":"17ae3ff1cbff9d14e7f5f004f849e92528ee2f7c7e025aa390599fa6a8e40d5d","signature":"2ceec21bab97e5c3924d1c8a3b24c615e2308ca3b3ca244e48b9ce6fe4bb15f5"},{"version":"56b67cf35f3a406520988c53cd540ca8d266d38fc1101c106bd2871be6147202","signature":"eb83ce7ed4279dae76b80b37d1b466986ed9fe3245afe71cea7d3d3d85b96886"},"bce19c54c4e8fb1e58890288fe9a1556fff6919abc720a5efe21f1998901e44b","6ce47c3cc0667516b5b9ba6e9602a7088d7b7027f3645f1d5c3784aab1ac5cf8","6de408de17cb0e3fa3a5e3d0f79bd104848d98dbfa72e92fddfa1a4aa3d8393c","b0f142ac40e82dd5cadfa8a96a10b2ccbcb069f2bd9ee7204125468c102db5f6","a9b37f09b4f3460366c9660327430fe04707c308b30894e484d571b17f62a645","3b40da7f2818457909c5d64b31fadfb61fc20cf7960ddfbb377d9b762b7acd34","f64852bbdeda44900455306b7196bc6d69f300c5cbeeda1751276a74bf9f8355","b68bae297ff867763063a36b9b6f7de7d18e07e7664aaf802b38db0580447891","ba8f7fdc64f8cf2852b71452f5d5f73908d6ec7f8b6b9734eca59195dbe5ebf3","6ec713840e5eec0d5710a223326372105f2a7adea5b41a60037175684701d0e6","2886d139ea75f2f3bebfc1540343703a127ee08737bd3d4c7b936a84abe583e6","c48fe105ed17b67196977449f8c70b0a845aba15234f2325e947478ea6ff8e52","272c2dac4baaf7fdd2d7efeef0fa2547af54cc21883c5e138b8c4d1661697a54","8dfed5c91ad36e69e6da6b7e49be929d4e19666db2b651aa839c485170a2902c","64b867c61effed7b5bc0cc06b3d8eac23b067a3fba581fc7d3c292fa593e6a45","93de1c6dab503f053efe8d304cb522bb3a89feab8c98f307a674a4fae04773e9","3b043cf9a81854a72963fdb57d1884fc4da1cf5be69b5e0a4c5b751e58cb6d88","80164ffebe1723a50e020a648e0623c026ff39be13c5cd45e6a82d0fcc06e2d0","6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","6fbd58e4015b9ae31ea977d4d549eb24a1102cc798b57ec5d70868b542c06612","16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc",{"version":"44f372b501e58c4a02bcdf4772d25a1239abd89339a19e7c25527aa0cbf37c32","affectsGlobalScope":true},"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","0b85cb069d0e427ba946e5eb2d86ef65ffd19867042810516d16919f6c1a5aec","15c88bfd1b8dc7231ff828ae8df5d955bae5ebca4cf2bcb417af5821e52299ae","3ebae8c00411116a66fca65b08228ea0cf0b72724701f9b854442100aab55aba","de18acda71730bac52f4b256ce7511bb56cc21f6f114c59c46782eff2f632857","7eb06594824ada538b1d8b48c3925a83e7db792f47a081a62cf3e5c4e23cf0ee","f5638f7c2f12a9a1a57b5c41b3c1ea7db3876c003bab68e6a57afd6bcc169af0","d8aab31ba8e618cc3eea10b0945de81cb93b7e8150a013a482332263b9305322","69da61a7b5093dac77fa3bec8be95dcf9a74c95a0e9161edb98bb24e30e439d2","561eca7a381b96d6ccac6e4061e6d2ae53f5bc44203f3fd9f5b26864c32ae6e9","62ea38627e3ebab429f7616812a9394d327c2bc271003dfba985de9b4137369f","b4439890c168d646357928431100daac5cbdee1d345a34e6bf6eca9f3abe22bc","5d72971a459517c44c1379dab9ed248e87a61ba0a1e0f25c9d67e1e640cd9a09","02d734976af36f4273d930bea88b3e62adf6b078cf120c1c63d49aa8d8427c5c",{"version":"3a3b67317eaa3b7fac600760815a3f308ff14275e73636bc359926371d46c3a0","affectsGlobalScope":true},"209e814e8e71aec74f69686a9506dd7610b97ab59dcee9446266446f72a76d05","6fa0008bf91a4cc9c8963bace4bba0bd6865cbfa29c3e3ccc461155660fb113a","2b8264b2fefd7367e0f20e2c04eed5d3038831fe00f5efbc110ff0131aab899b","9d9e658d1d5b805562749ce383ef8c67ccb796394d8734d9c138788d7dab6ee3","b0d10e46cfe3f6c476b69af02eaa38e4ccc7430221ce3109ae84bb9fb8282298","f7e133b20ee2669b6c0e5d7f0cd510868c57cd64b283e68c7f598e30ce9d76d2","6ba73232c9d3267ca36ddb83e335d474d2c0e167481e3dec416c782894e11438"],"options":{"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"jsx":2,"module":1,"noEmitOnError":true,"outDir":"./","rootDir":"./","skipLibCheck":true,"sourceMap":true,"target":3},"fileIdsList":[[102],[102,263],[102,263,264,265,266,267],[102,263,265],[77,102,109,269],[77,102,109],[77,102],[74,77,102,109,272,273],[102,270,273,274,276],[75,102,109],[74,75,102,109,244],[89,102,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,196,197],[102,198],[102,176,177,198],[89,102,175,179,198],[89,102,180,181,198],[89,102,180,198],[89,102,175,180,198],[89,102,186,198],[89,102,198],[102,194,195,198],[102,175,195,198],[89,102,175],[102,179],[89,102],[102,175,198],[102,279],[102,280],[102,286,288],[77,101,102,109,200,201],[59,102],[62,102],[63,68,102],[64,74,75,82,91,101,102],[64,65,74,82,102],[66,102],[67,68,75,83,102],[68,91,98,102],[69,71,74,82,102],[70,102],[71,72,102],[73,74,102],[74,102],[74,75,76,91,101,102],[74,75,76,91,102],[77,82,91,101,102],[74,75,77,78,82,91,98,101,102],[77,79,91,98,101,102],[59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108],[74,80,102],[81,101,102],[71,74,82,91,102],[83,102],[84,102],[62,85,102],[86,100,102,106],[87,102],[88,102],[74,89,102],[89,90,102,104],[74,91,92,93,102],[91,93,102],[91,92,102],[94,102],[95,102],[74,96,97,102],[96,97,102],[68,82,98,102],[99,102],[82,100,102],[63,77,88,101,102],[68,102],[91,102,103],[102,104],[102,105],[63,68,74,76,85,91,101,102,104,106],[91,102,107],[77,102,109,275],[64,102,109,245],[91,102,109],[102,295],[102,223,224],[74,75,102,109],[64,91,102,109],[102,254,255,256,257],[102,254,255],[102,255,256],[77,91,102,109],[102,245,258],[102,282,283],[102,282,283,284,285],[102,287],[102,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,131,132,134,136,137,138,139,140,141,142,143,144,145,146,147,148,149,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174],[102,112,114,119],[102,114,151],[102,113,118],[102,112,113,114,115,116,117],[102,113,114,115,118,151],[102,112,114,118,119],[102,118],[102,118,158],[102,112,113,114,118],[102,113,114,115,118],[102,113,114],[102,112,113,114,118,119],[102,114,150],[102,112,113,114,119],[102,175],[102,112,113,127],[102,112,113,126],[102,135],[102,128,129],[102,130],[102,128],[102,112,113,127,128],[102,112,113,126,127,129],[102,133],[102,112,113,128,129],[102,112,113,114,115,118],[102,112,113],[102,113],[102,112,118],[102,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222],[102,208],[102,209],[102,223],[55,56,102,239],[56,57,102],[58,102,238],[102,207],[75,84,102,207,230,236],[102,207,230,231,233],[102,231],[102,231,232,234,235],[102,231,233],[56,102,110,111,198,205,207,229,237],[56,102,225,226,227],[56,75,84,102,110,198,205,207,228],[102,202],[102,110],[102,199,203,204],[56,102],[102,202,206],[102,242,252,260],[56,64,102,243,246,251,261],[84,102,110,251,253,259],[102,247,248,249,250],[64,102,248],[57],[58,238],[207],[207,231],[231],[231,232,234,235],[207,229,237],[202],[199,203,204],[202,206],[242,252,260],[247,248,249,250],[64,248]],"referencedMap":[[50,1],[51,1],[52,1],[53,1],[265,2],[263,1],[268,3],[264,2],[266,4],[267,2],[270,5],[269,6],[271,7],[274,8],[277,9],[253,10],[245,11],[278,10],[198,12],[176,13],[178,14],[177,13],[180,15],[182,16],[183,17],[184,18],[185,16],[186,17],[187,16],[188,19],[189,17],[190,16],[195,20],[196,21],[197,22],[191,23],[181,24],[192,25],[179,25],[193,26],[279,1],[280,27],[281,28],[289,29],[275,1],[244,1],[290,1],[201,1],[202,30],[59,31],[60,31],[62,32],[63,33],[64,34],[65,35],[66,36],[67,37],[68,38],[69,39],[70,40],[71,41],[72,41],[73,42],[74,43],[75,44],[76,45],[61,1],[108,1],[77,46],[78,47],[79,48],[109,49],[80,50],[81,51],[82,52],[83,53],[84,54],[85,55],[86,56],[87,57],[88,58],[89,59],[90,60],[91,61],[93,62],[92,63],[94,64],[95,65],[96,66],[97,67],[98,68],[99,69],[100,70],[101,71],[102,72],[103,73],[104,74],[105,75],[106,76],[107,77],[291,1],[292,1],[293,1],[273,1],[272,1],[111,1],[276,78],[246,79],[294,1],[226,1],[194,80],[206,1],[295,1],[296,81],[225,82],[55,43],[56,1],[243,83],[224,1],[110,84],[258,85],[256,86],[257,87],[254,10],[255,1],[200,88],[259,89],[282,1],[284,90],[286,91],[285,90],[283,1],[288,92],[287,1],[175,93],[125,94],[123,94],[174,1],[150,95],[138,96],[118,97],[148,96],[149,96],[152,98],[153,96],[120,99],[154,96],[155,96],[156,96],[157,96],[158,100],[159,101],[160,96],[116,96],[161,96],[162,96],[163,100],[164,96],[165,96],[166,102],[167,96],[168,98],[169,96],[117,96],[170,96],[171,96],[172,103],[115,104],[121,105],[151,106],[124,107],[173,108],[126,109],[127,110],[136,111],[135,112],[131,113],[130,112],[132,114],[129,115],[128,116],[134,117],[133,114],[137,118],[119,119],[114,120],[112,121],[122,1],[113,122],[143,1],[144,1],[141,1],[142,100],[140,1],[145,1],[139,121],[147,1],[146,1],[227,1],[223,123],[208,1],[209,1],[217,124],[212,1],[211,125],[210,1],[219,1],[222,126],[215,124],[218,1],[216,124],[213,125],[214,1],[220,1],[221,1],[10,1],[11,1],[15,1],[14,1],[2,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[22,1],[23,1],[3,1],[49,1],[4,1],[27,1],[24,1],[25,1],[26,1],[28,1],[29,1],[30,1],[5,1],[31,1],[32,1],[33,1],[34,1],[6,1],[35,1],[36,1],[37,1],[38,1],[7,1],[43,1],[39,1],[40,1],[41,1],[42,1],[8,1],[47,1],[44,1],[45,1],[46,1],[1,1],[9,1],[48,1],[13,1],[12,1],[54,1],[240,127],[58,128],[57,1],[239,129],[230,130],[237,131],[234,132],[232,133],[236,134],[235,135],[231,1],[233,1],[238,136],[228,137],[229,138],[203,139],[199,140],[205,141],[204,142],[207,143],[241,1],[261,144],[252,145],[242,142],[260,146],[262,1],[251,147],[250,1],[249,148],[248,1],[247,1]],"exportedModulesMap":[[265,2],[263,1],[268,3],[264,2],[266,4],[267,2],[270,5],[269,6],[271,7],[274,8],[277,9],[253,10],[245,11],[278,10],[198,12],[176,13],[178,14],[177,13],[180,15],[182,16],[183,17],[184,18],[185,16],[186,17],[187,16],[188,19],[189,17],[190,16],[195,20],[196,21],[197,22],[191,23],[181,24],[192,25],[179,25],[193,26],[279,1],[280,27],[281,28],[289,29],[275,1],[244,1],[290,1],[201,1],[202,30],[59,31],[60,31],[62,32],[63,33],[64,34],[65,35],[66,36],[67,37],[68,38],[69,39],[70,40],[71,41],[72,41],[73,42],[74,43],[75,44],[76,45],[61,1],[108,1],[77,46],[78,47],[79,48],[109,49],[80,50],[81,51],[82,52],[83,53],[84,54],[85,55],[86,56],[87,57],[88,58],[89,59],[90,60],[91,61],[93,62],[92,63],[94,64],[95,65],[96,66],[97,67],[98,68],[99,69],[100,70],[101,71],[102,72],[103,73],[104,74],[105,75],[106,76],[107,77],[291,1],[292,1],[293,1],[273,1],[272,1],[111,1],[276,78],[246,79],[294,1],[226,1],[194,80],[206,1],[295,1],[296,81],[225,82],[55,43],[56,1],[243,83],[224,1],[110,84],[258,85],[256,86],[257,87],[254,10],[255,1],[200,88],[259,89],[282,1],[284,90],[286,91],[285,90],[283,1],[288,92],[287,1],[175,93],[125,94],[123,94],[174,1],[150,95],[138,96],[118,97],[148,96],[149,96],[152,98],[153,96],[120,99],[154,96],[155,96],[156,96],[157,96],[158,100],[159,101],[160,96],[116,96],[161,96],[162,96],[163,100],[164,96],[165,96],[166,102],[167,96],[168,98],[169,96],[117,96],[170,96],[171,96],[172,103],[115,104],[121,105],[151,106],[124,107],[173,108],[126,109],[127,110],[136,111],[135,112],[131,113],[130,112],[132,114],[129,115],[128,116],[134,117],[133,114],[137,118],[119,119],[114,120],[112,121],[122,1],[113,122],[143,1],[144,1],[141,1],[142,100],[140,1],[145,1],[139,121],[147,1],[146,1],[227,1],[223,123],[208,1],[209,1],[217,124],[212,1],[211,125],[210,1],[219,1],[222,126],[215,124],[218,1],[216,124],[213,125],[214,1],[220,1],[221,1],[10,1],[11,1],[15,1],[14,1],[2,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[22,1],[23,1],[3,1],[49,1],[4,1],[27,1],[24,1],[25,1],[26,1],[28,1],[29,1],[30,1],[5,1],[31,1],[32,1],[33,1],[34,1],[6,1],[35,1],[36,1],[37,1],[38,1],[7,1],[43,1],[39,1],[40,1],[41,1],[42,1],[8,1],[47,1],[44,1],[45,1],[46,1],[1,1],[9,1],[48,1],[13,1],[12,1],[54,1],[58,149],[239,150],[230,151],[237,151],[234,152],[232,153],[236,154],[235,153],[238,155],[229,151],[203,156],[205,157],[207,158],[241,1],[261,159],[252,145],[260,146],[262,1],[251,160],[249,161]],"semanticDiagnosticsPerFile":[[50,[{"file":"./__tests__/changelog/pipelines/attach-author.test.ts","start":79,"length":56,"messageText":"Cannot find module '../../../src/release/changelog/pipelines/attach-author' or its corresponding type declarations.","category":1,"code":2307},{"file":"./__tests__/changelog/pipelines/attach-author.test.ts","start":165,"length":28,"messageText":"Cannot find module '../../../src/release/types' or its corresponding type declarations.","category":1,"code":2307}]],[51,[{"file":"./__tests__/changelog/pipelines/beutify.test.ts","start":75,"length":51,"messageText":"Cannot find module '../../../src/release/changelog/pipelines/beautify' or its corresponding type declarations.","category":1,"code":2307}]],[52,[{"file":"./__tests__/changelog/pipelines/normalize-commit-url.test.ts","start":85,"length":63,"messageText":"Cannot find module '../../../src/release/changelog/pipelines/normalize-commit-url' or its corresponding type declarations.","category":1,"code":2307}]],[53,[{"file":"./__tests__/release/patch/helper.test.ts","start":74,"length":35,"messageText":"Cannot find module '../../../src/release/patch/helper' or its corresponding type declarations.","category":1,"code":2307},{"file":"./__tests__/release/patch/helper.test.ts","start":133,"length":28,"messageText":"Cannot find module '../../../src/release/types' or its corresponding type declarations.","category":1,"code":2307}]],265,263,268,264,266,267,270,269,271,274,277,253,245,278,198,176,178,177,180,182,183,184,185,186,187,188,189,190,195,196,197,191,181,192,179,193,279,280,281,289,275,244,290,201,202,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,61,108,77,78,79,109,80,81,82,83,84,85,86,87,88,89,90,91,93,92,94,95,96,97,98,99,100,101,102,103,104,105,106,107,291,292,293,273,272,111,276,246,294,226,194,206,295,296,225,55,56,243,224,110,258,256,257,254,255,200,259,282,284,286,285,283,288,287,175,125,123,174,150,138,118,148,149,152,153,120,154,155,156,157,158,159,160,116,161,162,163,164,165,166,167,168,169,117,170,171,172,115,121,151,124,173,126,127,136,135,131,130,132,129,128,134,133,137,119,114,112,122,113,143,144,141,142,140,145,139,147,146,227,223,208,209,217,212,211,210,219,222,215,218,216,213,214,220,221,10,11,15,14,2,16,17,18,19,20,21,22,23,3,49,4,27,24,25,26,28,29,30,5,31,32,33,34,6,35,36,37,38,7,43,39,40,41,42,8,47,44,45,46,1,9,48,13,12,54,240,[58,[{"file":"./packages/monoo/src/dev/index.ts","start":135,"length":11,"messageText":"Cannot find module '../shared' or its corresponding type declarations.","category":1,"code":2307}]],[57,[{"file":"./packages/monoo/src/dev/types.ts","start":71,"length":10,"messageText":"Cannot find module '../types' or its corresponding type declarations.","category":1,"code":2307}]],239,[230,[{"file":"./packages/monoo/src/release/changelog/helpers.ts","start":53,"length":14,"messageText":"Cannot find module '../../shared' or its corresponding type declarations.","category":1,"code":2307}]],[237,[{"file":"./packages/monoo/src/release/changelog/index.ts","start":256,"length":14,"messageText":"Cannot find module '../../shared' or its corresponding type declarations.","category":1,"code":2307}]],234,232,236,235,231,233,[238,[{"file":"./packages/monoo/src/release/index.ts","start":352,"length":10,"messageText":"Cannot find module '../types' or its corresponding type declarations.","category":1,"code":2307},{"file":"./packages/monoo/src/release/index.ts","start":443,"length":11,"messageText":"Cannot find module '../shared' or its corresponding type declarations.","category":1,"code":2307}]],[228,[{"file":"./packages/monoo/src/release/patch/helper.ts","start":225,"length":22,"messageText":"Cannot find module '../../types/monorepo' or its corresponding type declarations.","category":1,"code":2307}]],[229,[{"file":"./packages/monoo/src/release/patch/index.ts","start":402,"length":14,"messageText":"Cannot find module '../../shared' or its corresponding type declarations.","category":1,"code":2307},{"file":"./packages/monoo/src/release/patch/index.ts","start":465,"length":22,"messageText":"Cannot find module '../../types/monorepo' or its corresponding type declarations.","category":1,"code":2307}]],203,199,205,204,[207,[{"file":"./packages/monoo/src/release/types.ts","start":144,"length":19,"messageText":"Cannot find module '../types/monorepo' or its corresponding type declarations.","category":1,"code":2307}]],241,261,252,242,260,262,251,250,249,248,247],"affectedFilesPendingEmit":[[50,1],[51,1],[52,1],[53,1],[265,1],[263,1],[268,1],[264,1],[266,1],[267,1],[270,1],[269,1],[271,1],[274,1],[277,1],[253,1],[245,1],[278,1],[198,1],[176,1],[178,1],[177,1],[180,1],[182,1],[183,1],[184,1],[185,1],[186,1],[187,1],[188,1],[189,1],[190,1],[195,1],[196,1],[197,1],[191,1],[181,1],[192,1],[179,1],[193,1],[279,1],[280,1],[281,1],[289,1],[275,1],[244,1],[290,1],[201,1],[202,1],[59,1],[60,1],[62,1],[63,1],[64,1],[65,1],[66,1],[67,1],[68,1],[69,1],[70,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[61,1],[108,1],[77,1],[78,1],[79,1],[109,1],[80,1],[81,1],[82,1],[83,1],[84,1],[85,1],[86,1],[87,1],[88,1],[89,1],[90,1],[91,1],[93,1],[92,1],[94,1],[95,1],[96,1],[97,1],[98,1],[99,1],[100,1],[101,1],[102,1],[103,1],[104,1],[105,1],[106,1],[107,1],[291,1],[292,1],[293,1],[273,1],[272,1],[111,1],[276,1],[246,1],[294,1],[226,1],[194,1],[206,1],[295,1],[296,1],[225,1],[55,1],[56,1],[243,1],[224,1],[110,1],[258,1],[256,1],[257,1],[254,1],[255,1],[200,1],[259,1],[282,1],[284,1],[286,1],[285,1],[283,1],[288,1],[287,1],[175,1],[125,1],[123,1],[174,1],[150,1],[138,1],[118,1],[148,1],[149,1],[152,1],[153,1],[120,1],[154,1],[155,1],[156,1],[157,1],[158,1],[159,1],[160,1],[116,1],[161,1],[162,1],[163,1],[164,1],[165,1],[166,1],[167,1],[168,1],[169,1],[117,1],[170,1],[171,1],[172,1],[115,1],[121,1],[151,1],[124,1],[173,1],[126,1],[127,1],[136,1],[135,1],[131,1],[130,1],[132,1],[129,1],[128,1],[134,1],[133,1],[137,1],[119,1],[114,1],[112,1],[122,1],[113,1],[143,1],[144,1],[141,1],[142,1],[140,1],[145,1],[139,1],[147,1],[146,1],[227,1],[223,1],[208,1],[209,1],[217,1],[212,1],[211,1],[210,1],[219,1],[222,1],[215,1],[218,1],[216,1],[213,1],[214,1],[220,1],[221,1],[10,1],[11,1],[15,1],[14,1],[2,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[22,1],[23,1],[3,1],[49,1],[4,1],[27,1],[24,1],[25,1],[26,1],[28,1],[29,1],[30,1],[5,1],[31,1],[32,1],[33,1],[34,1],[6,1],[35,1],[36,1],[37,1],[38,1],[7,1],[43,1],[39,1],[40,1],[41,1],[42,1],[8,1],[47,1],[44,1],[45,1],[46,1],[1,1],[9,1],[48,1],[13,1],[12,1],[54,1],[240,1],[58,1],[57,1],[239,1],[297,1],[230,1],[237,1],[234,1],[232,1],[236,1],[235,1],[231,1],[233,1],[238,1],[228,1],[229,1],[203,1],[199,1],[205,1],[204,1],[207,1],[298,1],[299,1],[300,1],[301,1],[302,1],[303,1],[304,1],[241,1],[261,1],[305,1],[252,1],[306,1],[307,1],[242,1],[308,1],[260,1],[309,1],[310,1],[311,1],[312,1],[313,1],[314,1],[315,1],[262,1],[251,1],[250,1],[249,1],[248,1],[316,1],[247,1],[317,1],[318,1],[319,1],[320,1],[321,1],[322,1],[323,1],[324,1],[325,1],[326,1],[327,1],[328,1],[329,1],[330,1],[331,1],[332,1],[333,1],[334,1],[335,1],[336,1],[337,1],[338,1],[339,1],[340,1],[341,1],[342,1],[343,1],[344,1],[345,1],[346,1],[347,1],[348,1],[349,1],[350,1],[351,1],[352,1]]},"version":"4.5.2"} --------------------------------------------------------------------------------