diff --git a/CHANGELOG.md b/CHANGELOG.md
index b858ceaea56..d4db63a9f96 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1137,6 +1137,10 @@ should use 4.0.1-alpha.0 for testing.
## [Unreleased]
+### Added
+
+#### web3-core
+
- Added rpc exception codes following eip-1474 as an experimental feature (if `useRpcCallSpecification` at `enableExperimentalFeatures` is `true`) (#5525)
#### web3
diff --git a/fixtures/contracts/Basic.sol b/fixtures/contracts/Basic.sol
index b0713759b14..cdb10b5ef1d 100644
--- a/fixtures/contracts/Basic.sol
+++ b/fixtures/contracts/Basic.sol
@@ -28,23 +28,11 @@ contract Basic {
return boolValue;
}
- function getValues()
- public
- view
- returns (
- uint256,
- string memory,
- bool
- )
- {
+ function getValues() public view returns (uint256, string memory, bool) {
return (intValue, stringValue, boolValue);
}
- function setValues(
- uint256 _value,
- string memory _stringValue,
- bool _boolValue
- ) public {
+ function setValues(uint256 _value, string memory _stringValue, bool _boolValue) public {
intValue = _value;
stringValue = _stringValue;
boolValue = _boolValue;
@@ -62,19 +50,11 @@ contract Basic {
revert('REVERTED WITH REVERT');
}
- function firesMultiValueEvent(
- string memory str,
- uint256 val,
- bool flag
- ) public {
+ function firesMultiValueEvent(string memory str, uint256 val, bool flag) public {
emit MultiValueEvent(str, val, flag);
}
- function firesMultiValueIndexedEvent(
- string memory str,
- uint256 val,
- bool flag
- ) public {
+ function firesMultiValueIndexedEvent(string memory str, uint256 val, bool flag) public {
emit MultiValueIndexedEvent(str, val, flag);
}
diff --git a/fixtures/contracts/Greeter.sol b/fixtures/contracts/Greeter.sol
index 8fda2977aef..387ebe99fcd 100644
--- a/fixtures/contracts/Greeter.sol
+++ b/fixtures/contracts/Greeter.sol
@@ -3,29 +3,29 @@
pragma solidity ^0.8.13;
contract Greeter {
- uint256 counter;
- string private greeting;
+ uint256 counter;
+ string private greeting;
- event GREETING_CHANGING(string from, string to);
- event GREETING_CHANGED(string greeting);
+ event GREETING_CHANGING(string from, string to);
+ event GREETING_CHANGED(string greeting);
- constructor(string memory _greeting) {
- greeting = _greeting;
- counter = 0;
- }
+ constructor(string memory _greeting) {
+ greeting = _greeting;
+ counter = 0;
+ }
- function greet() public view returns (string memory) {
- return greeting;
- }
+ function greet() public view returns (string memory) {
+ return greeting;
+ }
- function setGreeting(string memory _greeting) public returns (bool, string memory) {
- emit GREETING_CHANGING(greeting, _greeting);
- greeting = _greeting;
- emit GREETING_CHANGED(greeting);
- return (true, greeting);
- }
+ function setGreeting(string memory _greeting) public returns (bool, string memory) {
+ emit GREETING_CHANGING(greeting, _greeting);
+ greeting = _greeting;
+ emit GREETING_CHANGED(greeting);
+ return (true, greeting);
+ }
- function increment() public {
- counter = counter + 1;
- }
+ function increment() public {
+ counter = counter + 1;
+ }
}
diff --git a/package.json b/package.json
index d5ea7346c18..8e417f741fa 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,7 @@
"build:web": "lerna run build:web --stream",
"build:web:analyze": "lerna run build:web:analyze --stream",
"build:docs": "cd docs && yarn install && yarn build",
+ "changelog": "ts-node scripts/changelog/src/index.ts",
"clean": "lerna run clean --stream --parallel",
"ganache:start": "WEB3_SYSTEM_TEST_BACKEND=ganache && ./scripts/ganache.sh start",
"ganache:start:background": "WEB3_SYSTEM_TEST_BACKEND=ganache && ./scripts/ganache.sh start 1",
@@ -50,9 +51,9 @@
"geth-binary:stop": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth_binary.sh stop",
"lint": "lerna run lint --stream --parallel",
"lint:fix": "lerna run lint:fix --stream --parallel",
- "format": "lerna run format --stream --parallel",
+ "format": "lerna run format --stream --parallel && prettier --write ./scripts/**/*.ts",
"test": "lerna run test --stream --parallel",
- "test:unit": "lerna run test:unit --stream --parallel",
+ "test:unit": "lerna run test:unit --stream --parallel && jest --config=./scripts/jest.config.js",
"test:integration": "lerna run test:integration --stream",
"test:e2e:ganache:http": "./scripts/test-runner.sh ganache http",
"test:e2e:ganache:ws": "./scripts/test-runner.sh ganache ws",
diff --git a/packages/web3-core/src/web3_subscription_manager.ts b/packages/web3-core/src/web3_subscription_manager.ts
index 78056ccfed3..5ca7842e663 100644
--- a/packages/web3-core/src/web3_subscription_manager.ts
+++ b/packages/web3-core/src/web3_subscription_manager.ts
@@ -23,7 +23,8 @@ import { Web3RequestManager, Web3RequestManagerEvent } from './web3_request_mana
import { Web3SubscriptionConstructor } from './web3_subscriptions';
type ShouldUnsubscribeCondition = ({
- id: sub,
+ id,
+ sub,
}: {
id: string;
sub: unknown;
diff --git a/packages/web3-errors/src/index.ts b/packages/web3-errors/src/index.ts
index 732074b9402..6d8b8fa13f5 100644
--- a/packages/web3-errors/src/index.ts
+++ b/packages/web3-errors/src/index.ts
@@ -28,4 +28,4 @@ export * from './errors/transaction_errors';
export * from './errors/utils_errors';
export * from './errors/response_errors';
export * from './errors/core_errors';
-export * from './errors/rpc_errors';
\ No newline at end of file
+export * from './errors/rpc_errors';
diff --git a/packages/web3-eth-contract/test/fixtures/contracts/SampleStorageContract.sol b/packages/web3-eth-contract/test/fixtures/contracts/SampleStorageContract.sol
index 2c0c640135d..617c3732fdb 100644
--- a/packages/web3-eth-contract/test/fixtures/contracts/SampleStorageContract.sol
+++ b/packages/web3-eth-contract/test/fixtures/contracts/SampleStorageContract.sol
@@ -18,17 +18,16 @@ along with web3.js. If not, see .
pragma solidity ^0.8.7;
contract SampleStorageContract {
+ uint256 uintNum;
- uint256 uintNum;
+ event NEWNUM(uint256 param);
- event NEWNUM(uint256 param);
+ function storeNum(uint256 param) public {
+ uintNum = param;
+ emit NEWNUM(param);
+ }
- function storeNum(uint256 param) public {
- uintNum = param;
- emit NEWNUM(param);
- }
-
- function retrieveNum() public view returns (uint256){
- return uintNum;
- }
-}
\ No newline at end of file
+ function retrieveNum() public view returns (uint256) {
+ return uintNum;
+ }
+}
diff --git a/packages/web3-validator/src/utils.ts b/packages/web3-validator/src/utils.ts
index 9178838500d..37b24c6ac45 100644
--- a/packages/web3-validator/src/utils.ts
+++ b/packages/web3-validator/src/utils.ts
@@ -28,7 +28,7 @@ import { isAbiParameterSchema } from './validation/abi';
import { isHexStrict } from './validation/string';
// import { abiToJsonSchemaCases } from '../test/fixtures/abi_to_json_schema';
-export const parseBaseType = (
+export const parseBaseType = (
type: string,
): {
baseType?: T;
diff --git a/scripts/changelog/src/add_changelog_entry.ts b/scripts/changelog/src/add_changelog_entry.ts
new file mode 100644
index 00000000000..4c5b32a4369
--- /dev/null
+++ b/scripts/changelog/src/add_changelog_entry.ts
@@ -0,0 +1,69 @@
+/*
+This file is part of web3.js.
+
+web3.js is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+web3.js is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with web3.js. If not, see .
+*/
+import { readFileSync, writeFileSync } from 'fs';
+
+// eslint-disable-next-line import/no-cycle
+import { ChangelogConfig, DEFAULT_CHANGELOG_CONFIG } from './types';
+import { getPackageGroupedUnreleasedEntries, getUnreleasedSection } from './sync';
+
+export const addChangelogEntry = (commandName: string, args: string[]) => {
+ let CHANGELOG_CONFIG: ChangelogConfig;
+ if (args?.[0] !== undefined && args[0].endsWith('.json')) {
+ CHANGELOG_CONFIG = JSON.parse(readFileSync(args[0], 'utf8')) as ChangelogConfig;
+ args.shift();
+ } else {
+ CHANGELOG_CONFIG = DEFAULT_CHANGELOG_CONFIG;
+ }
+
+ const [packageName, changelogEntry] = args;
+ const parsedChangelog = readFileSync(
+ `${CHANGELOG_CONFIG.packagesDirectoryPath}/${packageName}/${CHANGELOG_CONFIG.packagesChangelogPath}`,
+ 'utf8',
+ ).split(/\n/);
+ const groupedUnreleasedEntries = getPackageGroupedUnreleasedEntries(
+ getUnreleasedSection(parsedChangelog),
+ );
+ const formattedCommandName = `### ${
+ commandName.charAt(0).toUpperCase() + commandName.slice(1)
+ }`;
+ const formattedChangelogEntry = `- ${changelogEntry}`;
+
+ if (groupedUnreleasedEntries[formattedCommandName] !== undefined) {
+ groupedUnreleasedEntries[formattedCommandName].push(formattedChangelogEntry);
+ } else {
+ groupedUnreleasedEntries[formattedCommandName] = [formattedChangelogEntry];
+ }
+
+ const flattenedModifiedUnreleasedEntries: string[] = [];
+ for (const entryHeader of Object.keys(groupedUnreleasedEntries)) {
+ const entries = groupedUnreleasedEntries[entryHeader];
+ flattenedModifiedUnreleasedEntries.push(entryHeader);
+ flattenedModifiedUnreleasedEntries.push('');
+ for (const [index, entry] of entries.entries()) {
+ flattenedModifiedUnreleasedEntries.push(entry);
+ if (index + 1 === entries.length) flattenedModifiedUnreleasedEntries.push('');
+ }
+ }
+
+ // +2 is so the header, ## [Unreleased], and the newline after it don't get removed
+ parsedChangelog.splice(parsedChangelog.findIndex(item => item === '## [Unreleased]') + 2);
+ parsedChangelog.push(...flattenedModifiedUnreleasedEntries);
+ writeFileSync(
+ `${CHANGELOG_CONFIG.packagesDirectoryPath}/${packageName}/${CHANGELOG_CONFIG.packagesChangelogPath}`,
+ parsedChangelog.join('\n'),
+ );
+};
diff --git a/scripts/changelog/src/helpers.ts b/scripts/changelog/src/helpers.ts
new file mode 100644
index 00000000000..b0ce1af0acf
--- /dev/null
+++ b/scripts/changelog/src/helpers.ts
@@ -0,0 +1,40 @@
+/*
+This file is part of web3.js.
+
+web3.js is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+web3.js is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with web3.js. If not, see .
+*/
+import { readdirSync } from 'fs';
+
+// eslint-disable-next-line import/no-cycle
+import { Command, getCommands } from './types';
+
+export const parseArgs = (commands: Command[] = getCommands()): unknown => {
+ const commandArg = process.argv[2];
+ for (const command of commands) {
+ if (command.name === commandArg) {
+ return command.commandFunction(command.name, process.argv.slice(3));
+ }
+ }
+
+ // eslint-disable-next-line no-console
+ console.log('Invalid command, please refer to below table for expected commands:');
+ // eslint-disable-next-line no-console
+ console.table(commands);
+ return undefined;
+};
+
+export const getListOfPackageNames = (packagesDirectory: string) =>
+ readdirSync(packagesDirectory, { withFileTypes: true })
+ .filter(dirent => dirent.isDirectory())
+ .map(dirent => dirent.name);
diff --git a/scripts/changelog/src/index.ts b/scripts/changelog/src/index.ts
new file mode 100644
index 00000000000..b4e1caccb8a
--- /dev/null
+++ b/scripts/changelog/src/index.ts
@@ -0,0 +1,20 @@
+/*
+This file is part of web3.js.
+
+web3.js is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+web3.js is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with web3.js. If not, see .
+*/
+// eslint-disable-next-line import/no-cycle
+import { parseArgs } from './helpers';
+
+parseArgs();
diff --git a/scripts/changelog/src/sync.ts b/scripts/changelog/src/sync.ts
new file mode 100644
index 00000000000..0344fba6595
--- /dev/null
+++ b/scripts/changelog/src/sync.ts
@@ -0,0 +1,166 @@
+/*
+This file is part of web3.js.
+
+web3.js is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+web3.js is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with web3.js. If not, see .
+*/
+import { readFileSync, writeFileSync } from 'fs';
+
+// eslint-disable-next-line import/no-cycle
+import {
+ ChangelogConfig,
+ DEFAULT_CHANGELOG_CONFIG,
+ ENTRY_SECTION_HEADERS,
+ GroupedUnreleasedEntries,
+} from './types';
+import { getListOfPackageNames } from './helpers';
+
+export const getUnreleasedSection = (parsedChangelog: string[]) => {
+ const unreleasedSectionHeaderIndex = parsedChangelog.findIndex(
+ item => item === '## [Unreleased]',
+ );
+ const unreleasedSection = parsedChangelog.slice(unreleasedSectionHeaderIndex);
+ return unreleasedSection;
+};
+
+export const getRootGroupedUnreleasedEntries = (unreleasedSection: string[]) => {
+ const groupedUnreleasedEntries: GroupedUnreleasedEntries = {};
+
+ let lastPackageHeaderIndex = 0;
+ let lastEntryHeaderIndex = 0;
+ for (const [index, item] of unreleasedSection.entries()) {
+ // substring(4) removes "### " from entry headers (e.g. "### Changed" -> "Changed")
+ if (ENTRY_SECTION_HEADERS.includes(item.substring(4))) {
+ groupedUnreleasedEntries[unreleasedSection[index]] = {};
+ lastEntryHeaderIndex = index;
+ } else if (item.startsWith('#### ')) {
+ groupedUnreleasedEntries[unreleasedSection[lastEntryHeaderIndex]][item] = [];
+ lastPackageHeaderIndex = index;
+ } else if (item.startsWith('-')) {
+ const entryHeader = unreleasedSection[lastEntryHeaderIndex];
+ const packageHeader = unreleasedSection[lastPackageHeaderIndex];
+ groupedUnreleasedEntries[entryHeader][packageHeader].push(item);
+ }
+ }
+
+ return groupedUnreleasedEntries;
+};
+
+export const getPackageGroupedUnreleasedEntries = (unreleasedSection: string[]) => {
+ const groupedUnreleasedEntries: Record = {};
+
+ let lastEntryHeaderIndex = 0;
+ for (const [index, item] of unreleasedSection.entries()) {
+ // substring(4) removes "### " from entry headers (e.g. "### Changed" -> "Changed")
+ if (ENTRY_SECTION_HEADERS.includes(item.substring(4))) {
+ groupedUnreleasedEntries[item] = [];
+ lastEntryHeaderIndex = index;
+ } else if (item.startsWith('- ')) {
+ const entryHeader = unreleasedSection[lastEntryHeaderIndex];
+ groupedUnreleasedEntries[entryHeader].push(item);
+ }
+ }
+
+ return groupedUnreleasedEntries;
+};
+
+export const getSyncedGroupedUnreleasedEntries = (
+ listOfPackageNames: string[],
+ changelogConfig: ChangelogConfig,
+ rootGroupedUnreleasedEntries: GroupedUnreleasedEntries,
+) => {
+ const _rootGroupedUnreleasedEntries: GroupedUnreleasedEntries = rootGroupedUnreleasedEntries;
+ for (const packageName of listOfPackageNames) {
+ const parsedChangelog = readFileSync(
+ `${changelogConfig.packagesDirectoryPath}/${packageName}/${changelogConfig.packagesChangelogPath}`,
+ 'utf8',
+ ).split(/\n/);
+ const packageGroupedUnreleasedEntries = getPackageGroupedUnreleasedEntries(
+ getUnreleasedSection(parsedChangelog),
+ );
+
+ for (const entrySectionHeader of ENTRY_SECTION_HEADERS) {
+ const formattedEntrySectionHeader = `### ${entrySectionHeader}`;
+ const formattedPackageEntryHeader = `#### ${packageName}`;
+
+ const packageEntrySection =
+ packageGroupedUnreleasedEntries[formattedEntrySectionHeader];
+ if (packageEntrySection !== undefined) {
+ // PackageName has a formattedEntrySectionHeader listed in packageName/CHANGELOG.md
+
+ if (_rootGroupedUnreleasedEntries[formattedEntrySectionHeader] === undefined) {
+ // Root CHANGELOG.md is missing formattedEntrySectionHeader
+ _rootGroupedUnreleasedEntries[formattedEntrySectionHeader] = {};
+ }
+
+ _rootGroupedUnreleasedEntries[formattedEntrySectionHeader][
+ formattedPackageEntryHeader
+ ] = packageGroupedUnreleasedEntries[formattedEntrySectionHeader];
+ }
+ }
+ }
+
+ return _rootGroupedUnreleasedEntries;
+};
+
+export const flattenSyncedUnreleasedEntries = (
+ syncedGroupedUnreleasedEntries: GroupedUnreleasedEntries,
+ listOfPackageNames: string[],
+) => {
+ const flattenedSyncedUnreleasedEntries: string[] = [];
+ for (const key of Object.keys(syncedGroupedUnreleasedEntries)) {
+ const element = syncedGroupedUnreleasedEntries[key];
+ flattenedSyncedUnreleasedEntries.push(key);
+ flattenedSyncedUnreleasedEntries.push('');
+ for (const packageName of listOfPackageNames) {
+ const formattedPackageEntryHeader = `#### ${packageName}`;
+ const element2 = element[formattedPackageEntryHeader];
+ if (element[formattedPackageEntryHeader] !== undefined) {
+ flattenedSyncedUnreleasedEntries.push(formattedPackageEntryHeader);
+ flattenedSyncedUnreleasedEntries.push('');
+ flattenedSyncedUnreleasedEntries.push(...element2);
+ flattenedSyncedUnreleasedEntries.push('');
+ }
+ }
+ }
+
+ return flattenedSyncedUnreleasedEntries;
+};
+
+// @ts-expect-error 'commandName' is declared but its value is never read
+export const syncChangelogs = (commandName: string, args?: string[]) => {
+ const CHANGELOG_CONFIG: ChangelogConfig =
+ args?.[0] !== undefined && args[0].endsWith('.json')
+ ? (JSON.parse(readFileSync(args[0], 'utf8')) as ChangelogConfig)
+ : DEFAULT_CHANGELOG_CONFIG;
+ const parsedRootChangelog = readFileSync(CHANGELOG_CONFIG.rootChangelogPath, 'utf8').split(
+ /\n/,
+ );
+ const listOfPackageNames = getListOfPackageNames(CHANGELOG_CONFIG.packagesDirectoryPath);
+ const syncedGroupedUnreleasedEntries = getSyncedGroupedUnreleasedEntries(
+ listOfPackageNames,
+ CHANGELOG_CONFIG,
+ getRootGroupedUnreleasedEntries(getUnreleasedSection(parsedRootChangelog)),
+ );
+ const flattenedSyncedUnreleasedEntries = flattenSyncedUnreleasedEntries(
+ syncedGroupedUnreleasedEntries,
+ listOfPackageNames,
+ );
+
+ // +2 is so the header, ## [Unreleased], and the newline after it don't get removed
+ parsedRootChangelog.splice(
+ parsedRootChangelog.findIndex(item => item === '## [Unreleased]') + 2,
+ );
+ parsedRootChangelog.push(...flattenedSyncedUnreleasedEntries);
+ writeFileSync(CHANGELOG_CONFIG.rootChangelogPath, parsedRootChangelog.join('\n'));
+};
diff --git a/scripts/changelog/src/types.ts b/scripts/changelog/src/types.ts
new file mode 100644
index 00000000000..57c3f172876
--- /dev/null
+++ b/scripts/changelog/src/types.ts
@@ -0,0 +1,76 @@
+/*
+This file is part of web3.js.
+
+web3.js is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+web3.js is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with web3.js. If not, see .
+*/
+// eslint-disable-next-line import/no-cycle
+import { addChangelogEntry } from './add_changelog_entry';
+// eslint-disable-next-line import/no-cycle
+import { syncChangelogs } from './sync';
+
+export interface ChangelogConfig {
+ packagesDirectoryPath: string;
+ packagesChangelogPath: string;
+ rootChangelogPath: string;
+}
+
+export interface Command {
+ name: string;
+ description: string;
+ arguments: string[];
+ example: string;
+ commandFunction: (commandName: string, args: string[]) => unknown;
+}
+
+export type GroupedUnreleasedEntries = Record>;
+
+export const DEFAULT_CHANGELOG_CONFIG = {
+ packagesDirectoryPath: './packages',
+ packagesChangelogPath: 'CHANGELOG.md',
+ rootChangelogPath: './CHANGELOG.md',
+};
+
+export const ENTRY_SECTION_HEADERS = [
+ 'Added',
+ 'Changed',
+ 'Deprecated',
+ 'Removed',
+ 'Fixed',
+ 'Security',
+];
+
+export const getCommands = () => {
+ const commands: Command[] = [];
+
+ commands.push({
+ name: 'sync',
+ description:
+ 'Checks CHANGELOG.md for each package in ./packages/ for entries not included in root CHANGELOG.md',
+ arguments: [],
+ example: 'sync',
+ commandFunction: syncChangelogs,
+ });
+
+ for (const entrySectionHeader of ENTRY_SECTION_HEADERS) {
+ commands.push({
+ name: entrySectionHeader.toLowerCase(),
+ description: `Adds changelogEntry to packageName's CHANGELOG.md under ${entrySectionHeader} header`,
+ arguments: ['packageName', 'changelogEntry'],
+ example: `yarn changelog ${entrySectionHeader.toLowerCase()} [packageName] [changelogEntry]`,
+ commandFunction: addChangelogEntry,
+ });
+ }
+
+ return commands;
+};
diff --git a/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/CHANGELOG.md b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/CHANGELOG.md
new file mode 100644
index 00000000000..40e0e4d3846
--- /dev/null
+++ b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/CHANGELOG.md
@@ -0,0 +1,192 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+
+
+## [0.1.0-alpha.0]
+
+### Added
+
+- I've added feature XY (#1000)
+
+### Changed
+
+- I've cleaned up XY (#1000)
+
+### Deprecated
+
+- I've deprecated XY (#1000)
+
+### Removed
+
+- I've removed XY (#1000)
+
+### Fixed
+
+- I've fixed XY (#1000)
+
+### Security
+
+- I've improved the security in XY (#1000)
+
+## [0.1.0-alpha.1]
+
+### Added
+
+- I've added feature XY (#1001)
+
+### Changed
+
+- I've cleaned up XY (#1001)
+
+### Deprecated
+
+- I've deprecated XY (#1001)
+
+### Removed
+
+- I've removed XY (#1001)
+
+### Fixed
+
+- I've fixed XY (#1001)
+
+### Security
+
+- I've improved the security in XY (#1001)
+
+## [0.1.0]
+
+### Added
+
+- I've added feature XY (#1002)
+
+### Changed
+
+- I've cleaned up XY (#1002)
+
+### Deprecated
+
+- I've deprecated XY (#1002)
+
+### Removed
+
+- I've removed XY (#1002)
+
+### Fixed
+
+- I've fixed XY (#1002)
+
+### Security
+
+- I've improved the security in XY (#1002)
+
+## [0.1.1]
+
+### Added
+
+- I've added feature XY (#1003)
+
+### Changed
+
+- I've cleaned up XY (#1003)
+
+### Deprecated
+
+- I've deprecated XY (#1003)
+
+### Removed
+
+- I've removed XY (#1003)
+
+### Fixed
+
+- I've fixed XY (#1003)
+
+### Security
+
+- I've improved the security in XY (#1003)
+
+## [1.0.0]
+
+### Added
+
+- I've added feature XY (#1004)
+
+### Changed
+
+- I've cleaned up XY (#1004)
+
+### Deprecated
+
+- I've deprecated XY (#1004)
+
+### Removed
+
+- I've removed XY (#1004)
+
+### Fixed
+
+- I've fixed XY (#1004)
+
+### Security
+
+- I've improved the security in XY (#1004)
+
+## [Unreleased]
+
+### Added
+
+- I've added feature XY (#1005)
+
+### Changed
+
+- I've cleaned up XY (#1005)
+
+### Deprecated
+
+- I've deprecated XY (#1005)
+
+### Removed
+
+- I've removed XY (#1005)
+
+### Fixed
+
+- I've fixed XY (#1005)
+
+### Security
+
+- I've improved the security in XY (#1005)
diff --git a/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG.json b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG.json
new file mode 100644
index 00000000000..b6f9ba8a2d9
--- /dev/null
+++ b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG.json
@@ -0,0 +1,196 @@
+[
+ "# Changelog",
+ "",
+ "All notable changes to this project will be documented in this file.",
+ "",
+ "The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),",
+ "and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).",
+ "",
+ "",
+ "",
+ "## [0.1.0-alpha.0]",
+ "",
+ "### Added",
+ "",
+ "- I've added feature XY (#1000)",
+ "",
+ "### Changed",
+ "",
+ "- I've cleaned up XY (#1000)",
+ "",
+ "### Deprecated",
+ "",
+ "- I've deprecated XY (#1000)",
+ "",
+ "### Removed",
+ "",
+ "- I've removed XY (#1000)",
+ "",
+ "### Fixed",
+ "",
+ "- I've fixed XY (#1000)",
+ "",
+ "### Security",
+ "",
+ "- I've improved the security in XY (#1000)",
+ "",
+ "## [0.1.0-alpha.1]",
+ "",
+ "### Added",
+ "",
+ "- I've added feature XY (#1001)",
+ "",
+ "### Changed",
+ "",
+ "- I've cleaned up XY (#1001)",
+ "",
+ "### Deprecated",
+ "",
+ "- I've deprecated XY (#1001)",
+ "",
+ "### Removed",
+ "",
+ "- I've removed XY (#1001)",
+ "",
+ "### Fixed",
+ "",
+ "- I've fixed XY (#1001)",
+ "",
+ "### Security",
+ "",
+ "- I've improved the security in XY (#1001)",
+ "",
+ "## [0.1.0]",
+ "",
+ "### Added",
+ "",
+ "- I've added feature XY (#1002)",
+ "",
+ "### Changed",
+ "",
+ "- I've cleaned up XY (#1002)",
+ "",
+ "### Deprecated",
+ "",
+ "- I've deprecated XY (#1002)",
+ "",
+ "### Removed",
+ "",
+ "- I've removed XY (#1002)",
+ "",
+ "### Fixed",
+ "",
+ "- I've fixed XY (#1002)",
+ "",
+ "### Security",
+ "",
+ "- I've improved the security in XY (#1002)",
+ "",
+ "## [0.1.1]",
+ "",
+ "### Added",
+ "",
+ "- I've added feature XY (#1003)",
+ "",
+ "### Changed",
+ "",
+ "- I've cleaned up XY (#1003)",
+ "",
+ "### Deprecated",
+ "",
+ "- I've deprecated XY (#1003)",
+ "",
+ "### Removed",
+ "",
+ "- I've removed XY (#1003)",
+ "",
+ "### Fixed",
+ "",
+ "- I've fixed XY (#1003)",
+ "",
+ "### Security",
+ "",
+ "- I've improved the security in XY (#1003)",
+ "",
+ "## [1.0.0]",
+ "",
+ "### Added",
+ "",
+ "- I've added feature XY (#1004)",
+ "",
+ "### Changed",
+ "",
+ "- I've cleaned up XY (#1004)",
+ "",
+ "### Deprecated",
+ "",
+ "- I've deprecated XY (#1004)",
+ "",
+ "### Removed",
+ "",
+ "- I've removed XY (#1004)",
+ "",
+ "### Fixed",
+ "",
+ "- I've fixed XY (#1004)",
+ "",
+ "### Security",
+ "",
+ "- I've improved the security in XY (#1004)",
+ "",
+ "## [Unreleased]",
+ "",
+ "### Added",
+ "",
+ "- I've added feature XY (#1005)",
+ "- Some new change (#42)",
+ "",
+ "### Changed",
+ "",
+ "- I've cleaned up XY (#1005)",
+ "",
+ "### Deprecated",
+ "",
+ "- I've deprecated XY (#1005)",
+ "",
+ "### Removed",
+ "",
+ "- I've removed XY (#1005)",
+ "",
+ "### Fixed",
+ "",
+ "- I've fixed XY (#1005)",
+ "",
+ "### Security",
+ "",
+ "- I've improved the security in XY (#1005)",
+ ""
+]
diff --git a/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG_2.json b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG_2.json
new file mode 100644
index 00000000000..540f24ac25e
--- /dev/null
+++ b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG_2.json
@@ -0,0 +1,199 @@
+[
+ "# Changelog",
+ "",
+ "All notable changes to this project will be documented in this file.",
+ "",
+ "The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),",
+ "and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).",
+ "",
+ "",
+ "",
+ "## [0.1.0-alpha.0]",
+ "",
+ "### Added",
+ "",
+ "- I've added feature XY (#1000)",
+ "",
+ "### Changed",
+ "",
+ "- I've cleaned up XY (#1000)",
+ "",
+ "### Deprecated",
+ "",
+ "- I've deprecated XY (#1000)",
+ "",
+ "### Removed",
+ "",
+ "- I've removed XY (#1000)",
+ "",
+ "### Fixed",
+ "",
+ "- I've fixed XY (#1000)",
+ "",
+ "### Security",
+ "",
+ "- I've improved the security in XY (#1000)",
+ "",
+ "## [0.1.0-alpha.1]",
+ "",
+ "### Added",
+ "",
+ "- I've added feature XY (#1001)",
+ "",
+ "### Changed",
+ "",
+ "- I've cleaned up XY (#1001)",
+ "",
+ "### Deprecated",
+ "",
+ "- I've deprecated XY (#1001)",
+ "",
+ "### Removed",
+ "",
+ "- I've removed XY (#1001)",
+ "",
+ "### Fixed",
+ "",
+ "- I've fixed XY (#1001)",
+ "",
+ "### Security",
+ "",
+ "- I've improved the security in XY (#1001)",
+ "",
+ "## [0.1.0]",
+ "",
+ "### Added",
+ "",
+ "- I've added feature XY (#1002)",
+ "",
+ "### Changed",
+ "",
+ "- I've cleaned up XY (#1002)",
+ "",
+ "### Deprecated",
+ "",
+ "- I've deprecated XY (#1002)",
+ "",
+ "### Removed",
+ "",
+ "- I've removed XY (#1002)",
+ "",
+ "### Fixed",
+ "",
+ "- I've fixed XY (#1002)",
+ "",
+ "### Security",
+ "",
+ "- I've improved the security in XY (#1002)",
+ "",
+ "## [0.1.1]",
+ "",
+ "### Added",
+ "",
+ "- I've added feature XY (#1003)",
+ "",
+ "### Changed",
+ "",
+ "- I've cleaned up XY (#1003)",
+ "",
+ "### Deprecated",
+ "",
+ "- I've deprecated XY (#1003)",
+ "",
+ "### Removed",
+ "",
+ "- I've removed XY (#1003)",
+ "",
+ "### Fixed",
+ "",
+ "- I've fixed XY (#1003)",
+ "",
+ "### Security",
+ "",
+ "- I've improved the security in XY (#1003)",
+ "",
+ "## [1.0.0]",
+ "",
+ "### Added",
+ "",
+ "- I've added feature XY (#1004)",
+ "",
+ "### Changed",
+ "",
+ "- I've cleaned up XY (#1004)",
+ "",
+ "### Deprecated",
+ "",
+ "- I've deprecated XY (#1004)",
+ "",
+ "### Removed",
+ "",
+ "- I've removed XY (#1004)",
+ "",
+ "### Fixed",
+ "",
+ "- I've fixed XY (#1004)",
+ "",
+ "### Security",
+ "",
+ "- I've improved the security in XY (#1004)",
+ "",
+ "## [Unreleased]",
+ "",
+ "### Added",
+ "",
+ "- I've added feature XY (#1005)",
+ "",
+ "### Changed",
+ "",
+ "- I've cleaned up XY (#1005)",
+ "",
+ "### Deprecated",
+ "",
+ "- I've deprecated XY (#1005)",
+ "",
+ "### Removed",
+ "",
+ "- I've removed XY (#1005)",
+ "",
+ "### Fixed",
+ "",
+ "- I've fixed XY (#1005)",
+ "",
+ "### Security",
+ "",
+ "- I've improved the security in XY (#1005)",
+ "",
+ "### Newheader",
+ "",
+ "- Some new change (#42)",
+ ""
+]
diff --git a/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-2/CHANGELOG.md b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-2/CHANGELOG.md
new file mode 100644
index 00000000000..af08bb229bd
--- /dev/null
+++ b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-2/CHANGELOG.md
@@ -0,0 +1,166 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+
+
+## [0.1.0-alpha.1]
+
+### Added
+
+- I've added feature XY #2 (#1001)
+
+### Changed
+
+- I've cleaned up XY #2 (#1001)
+
+### Deprecated
+
+- I've deprecated XY #2 (#1001)
+
+### Removed
+
+- I've removed XY #2 (#1001)
+
+### Fixed
+
+- I've fixed XY #2 (#1001)
+
+### Security
+
+- I've improved the security in XY #2 (#1001)
+
+## [0.1.0]
+
+### Added
+
+- I've added feature XY #2 (#1002)
+
+### Changed
+
+- I've cleaned up XY #2 (#1002)
+
+### Deprecated
+
+- I've deprecated XY #2 (#1002)
+
+### Removed
+
+- I've removed XY #2 (#1002)
+
+### Fixed
+
+- I've fixed XY #2 (#1002)
+
+### Security
+
+- I've improved the security in XY #2 (#1002)
+
+## [0.1.1]
+
+### Added
+
+- I've added feature XY #2 (#1003)
+
+### Changed
+
+- I've cleaned up XY #2 (#1003)
+
+### Deprecated
+
+- I've deprecated XY #2 (#1003)
+
+### Removed
+
+- I've removed XY #2 (#1003)
+
+### Fixed
+
+- I've fixed XY #2 (#1003)
+
+### Security
+
+- I've improved the security in XY #2 (#1003)
+
+## [1.0.0]
+
+### Added
+
+- I've added feature XY #2 (#1004)
+
+### Changed
+
+- I've cleaned up XY #2 (#1004)
+
+### Deprecated
+
+- I've deprecated XY #2 (#1004)
+
+### Removed
+
+- I've removed XY #2 (#1004)
+
+### Fixed
+
+- I've fixed XY #2 (#1004)
+
+### Security
+
+- I've improved the security in XY #2 (#1004)
+
+## [Unreleased]
+
+### Added
+
+- I've added feature XY #2 (#1005)
+
+### Changed
+
+- I've cleaned up XY #2 (#1005)
+
+### Deprecated
+
+- I've deprecated XY #2 (#1005)
+
+### Removed
+
+- I've removed XY #2 (#1005)
+
+### Fixed
+
+- I've fixed XY #2 (#1005)
+
+### Security
+
+- I've improved the security in XY #2 (#1005)
diff --git a/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-3/CHANGELOG.md b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-3/CHANGELOG.md
new file mode 100644
index 00000000000..f6ef8c19809
--- /dev/null
+++ b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-3/CHANGELOG.md
@@ -0,0 +1,170 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+
+
+## [0.1.0]
+
+### Added
+
+- I've added feature XY #3 (#1002)
+
+### Changed
+
+- I've cleaned up XY #3 (#1002)
+
+### Deprecated
+
+- I've deprecated XY #3 (#1002)
+
+### Removed
+
+- I've removed XY #3 (#1002)
+
+### Fixed
+
+- I've fixed XY #3 (#1002)
+
+### Security
+
+- I've improved the security in XY #3 (#1002)
+
+## [0.1.1]
+
+### Added
+
+- I've added feature XY #3 (#1003)
+- I've added feature XY #4 (#1003)
+
+### Changed
+
+- I've cleaned up XY #3 (#1003)
+- I've cleaned up XY #4 (#1003)
+
+### Deprecated
+
+- I've deprecated XY #3 (#1003)
+- I've deprecated XY #4 (#1003)
+
+### Removed
+
+- I've removed XY #3 (#1003)
+- I've removed XY #4 (#1003)
+
+### Fixed
+
+- I've fixed XY #3 (#1003)
+- I've fixed XY #4 (#1003)
+
+### Security
+
+- I've improved the security in XY #3 (#1003)
+- I've improved the security in XY #4 (#1003)
+
+## [1.0.0]
+
+### Added
+
+- I've added feature XY #3 (#1004)
+- I've added feature XY #4 (#1004)
+- I've added feature XY #5 (#1004)
+
+### Changed
+
+- I've cleaned up XY #3 (#1004)
+- I've cleaned up XY #4 (#1004)
+- I've cleaned up XY #5 (#1004)
+
+### Deprecated
+
+- I've deprecated XY #3 (#1004)
+- I've deprecated XY #4 (#1004)
+- I've deprecated XY #5 (#1004)
+
+### Removed
+
+- I've removed XY #3 (#1004)
+- I've removed XY #4 (#1004)
+- I've removed XY #5 (#1004)
+
+### Fixed
+
+- I've fixed XY #3 (#1004)
+- I've fixed XY #4 (#1004)
+- I've fixed XY #5 (#1004)
+
+### Security
+
+- I've improved the security in XY #3 (#1004)
+- I've improved the security in XY #4 (#1004)
+- I've improved the security in XY #5 (#1004)
+
+## [Unreleased]
+
+### Added
+
+- I've added feature XY #3 (#1005)
+- I've added feature XY #4 (#1005)
+- I've added feature XY #5 (#1005)
+
+### Changed
+
+- I've cleaned up XY #3 (#1005)
+- I've cleaned up XY #4 (#1005)
+- I've cleaned up XY #5 (#1005)
+
+### Deprecated
+
+- I've deprecated XY #3 (#1005)
+- I've deprecated XY #4 (#1005)
+- I've deprecated XY #5 (#1005)
+
+### Removed
+
+- I've removed XY #3 (#1005)
+- I've removed XY #4 (#1005)
+- I've removed XY #5 (#1005)
+
+### Fixed
+
+- I've fixed XY #3 (#1005)
+- I've fixed XY #4 (#1005)
+- I've fixed XY #5 (#1005)
+
+### Security
+
+- I've improved the security in XY #3 (#1005)
+- I've improved the security in XY #4 (#1005)
+- I've improved the security in XY #5 (#1005)
diff --git a/scripts/changelog/test/fixtures/package_parsed_changelog.ts b/scripts/changelog/test/fixtures/package_parsed_changelog.ts
new file mode 100644
index 00000000000..a812d3e1d09
--- /dev/null
+++ b/scripts/changelog/test/fixtures/package_parsed_changelog.ts
@@ -0,0 +1,114 @@
+/*
+This file is part of web3.js.
+
+web3.js is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+web3.js is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with web3.js. If not, see .
+*/
+export const packageUnreleasedSection = [
+ '## [Unreleased]',
+ '',
+ '### Added',
+ '',
+ '- random text (#425)',
+ '',
+ '### Removed',
+ '',
+ '- `build` entry from `package.json` (#420)',
+ '- `bar` (#424)',
+ '',
+ '### Changed',
+ '',
+ '- `tsc` compiled files moved to `lib/` directory from `dist/` (#421)',
+ '- `foo` (#423)',
+ '',
+];
+
+export const parsedPackageChangelog = [
+ '# Changelog',
+ '',
+ 'All notable changes to this project will be documented in this file.',
+ '',
+ 'The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),',
+ 'and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).',
+ '',
+ '',
+ '',
+ '## [4.0.0-alpha.1]',
+ '',
+ '### Breaking Changes',
+ '',
+ '#### Connection close is not supported',
+ '',
+ 'In `1.x` user had access to raw connection object and can interact with it. e.g.',
+ '',
+ '```ts',
+ 'web3.currentProvider.connection.close();',
+ '```',
+ '',
+ 'But this internal behavior is not exposed any further. Though you can achieve same with this approach.',
+ '',
+ '```ts',
+ 'web3.currentProvider.disconnect();',
+ '```',
+ '',
+ '## [4.0.1-alpha.2]',
+ '',
+ '### Changed',
+ '',
+ '- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739)',
+ '',
+ '## [4.0.1-alpha.5]',
+ '',
+ '### Removed',
+ '',
+ '- `build` entry from `package.json` (#5755)',
+ '',
+ ...packageUnreleasedSection,
+];
+
+export const packageGroupedUnreleasedEntries = {
+ '### Added': ['- random text (#425)'],
+ '### Removed': ['- `build` entry from `package.json` (#420)', '- `bar` (#424)'],
+ '### Changed': [
+ '- `tsc` compiled files moved to `lib/` directory from `dist/` (#421)',
+ '- `foo` (#423)',
+ ],
+};
diff --git a/scripts/changelog/test/fixtures/root_parsed_changelog.ts b/scripts/changelog/test/fixtures/root_parsed_changelog.ts
new file mode 100644
index 00000000000..1081a15aeff
--- /dev/null
+++ b/scripts/changelog/test/fixtures/root_parsed_changelog.ts
@@ -0,0 +1,1160 @@
+/*
+This file is part of web3.js.
+
+web3.js is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+web3.js is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with web3.js. If not, see .
+*/
+export const rootUnreleasedSection = [
+ '## [Unreleased]',
+ '',
+ '### Added',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've added feature XY (#1005)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've added feature XY #2 (#1005)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've added feature XY #3 (#1005)",
+ "- I've added feature XY #4 (#1005)",
+ "- I've added feature XY #5 (#1005)",
+ '',
+ '### Changed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've cleaned up XY (#1005)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've cleaned up XY #2 (#1005)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've cleaned up XY #3 (#1005)",
+ "- I've cleaned up XY #4 (#1005)",
+ "- I've cleaned up XY #5 (#1005)",
+ '',
+ '### Deprecated',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've deprecated XY (#1005)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've deprecated XY #2 (#1005)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've deprecated XY #3 (#1005)",
+ "- I've deprecated XY #4 (#1005)",
+ "- I've deprecated XY #5 (#1005)",
+ '',
+ '### Removed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've removed XY (#1005)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've removed XY #2 (#1005)",
+ '',
+ '#### mock-package-3',
+ "- I've removed XY #3 (#1005)",
+ "- I've removed XY #4 (#1005)",
+ "- I've removed XY #5 (#1005)",
+ '',
+ '### Fixed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've fixed XY (#1005)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've fixed XY #2 (#1005)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've fixed XY #3 (#1005)",
+ "- I've fixed XY #4 (#1005)",
+ "- I've fixed XY #5 (#1005)",
+ '',
+ '### Security',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've improved the security in XY (#1005)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've improved the security in XY #2 (#1005)",
+ '',
+ '#### mock-package-3',
+ "- I've improved the security in XY #3 (#1005)",
+ "- I've improved the security in XY #4 (#1005)",
+ "- I've improved the security in XY #5 (#1005)",
+ '',
+];
+
+export const parsedRootChangelog = [
+ '# Changelog',
+ '',
+ 'All notable changes to this project will be documented in this file.',
+ '',
+ 'The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),',
+ 'and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).',
+ '',
+ '',
+ '## [0.1.0-alpha.0]',
+ '',
+ '### Added',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've added feature XY (#1000)",
+ '',
+ '### Changed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've cleaned up XY (#1000)",
+ '',
+ '### Deprecated',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've deprecated XY (#1000)",
+ '',
+ '### Removed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've removed XY (#1000)",
+ '',
+ '### Fixed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've fixed XY (#1000)",
+ '',
+ '### Security',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've improved the security in XY (#1000)",
+ '',
+ '## [0.1.0-alpha.1]',
+ '',
+ '### Added',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've added feature XY (#1001)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've added feature XY #2 (#1001)",
+ '',
+ '### Changed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've cleaned up XY (#1001)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've cleaned up XY #2 (#1001)",
+ '',
+ '### Deprecated',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've deprecated XY (#1001)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've deprecated XY #2 (#1001)",
+ '',
+ '### Removed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've removed XY (#1001)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've removed XY #2 (#1001)",
+ '',
+ '### Fixed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've fixed XY (#1001)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've fixed XY #2 (#1001)",
+ '',
+ '### Security',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've improved the security in XY (#1001)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've improved the security in XY #2 (#1001)",
+ '',
+ '## [0.1.0]',
+ '',
+ '### Added',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've added feature XY (#1002)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've added feature XY #2 (#1002)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've added feature XY #3 (#1002)",
+ '',
+ '### Changed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've cleaned up XY (#1002)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've cleaned up XY #2 (#1002)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've cleaned up XY #3 (#1002)",
+ '',
+ '### Deprecated',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've deprecated XY (#1002)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've deprecated XY #2 (#1002)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've deprecated XY #3 (#1002)",
+ '',
+ '### Removed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've removed XY (#1002)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've removed XY #2 (#1002)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've removed XY #3 (#1002)",
+ '',
+ '### Fixed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've fixed XY (#1002)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've fixed XY #2 (#1002)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've fixed XY #3 (#1002)",
+ '',
+ '### Security',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've improved the security in XY (#1002)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've improved the security in XY #2 (#1002)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've improved the security in XY #3 (#1002)",
+ '',
+ '## [0.1.1]',
+ '',
+ '### Added',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've added feature XY (#1003)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've added feature XY #2 (#1003)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've added feature XY #3 (#1003)",
+ "- I've added feature XY #4 (#1003)",
+ '',
+ '### Changed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've cleaned up XY (#1003)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've cleaned up XY #2 (#1003)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've cleaned up XY #3 (#1003)",
+ "- I've cleaned up XY #4 (#1003)",
+ '',
+ '### Deprecated',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've deprecated XY (#1003)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've deprecated XY #2 (#1003)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've deprecated XY #3 (#1003)",
+ "- I've deprecated XY #4 (#1003)",
+ '',
+ '### Removed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've removed XY (#1003)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've removed XY #2 (#1003)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've removed XY #3 (#1003)",
+ "- I've removed XY #4 (#1003)",
+ '',
+ '### Fixed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've fixed XY (#1003)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've fixed XY #2 (#1003)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've fixed XY #3 (#1003)",
+ "- I've fixed XY #4 (#1003)",
+ '',
+ '### Security',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've improved the security in XY (#1003)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've improved the security in XY #2 (#1003)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've improved the security in XY #3 (#1003)",
+ "- I've improved the security in XY #4 (#1003)",
+ '',
+ '## [1.0.0]',
+ '',
+ '### Added',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've added feature XY (#1004)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've added feature XY #2 (#1004)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've added feature XY #3 (#1004)",
+ "- I've added feature XY #4 (#1004)",
+ "- I've added feature XY #5 (#1004)",
+ '',
+ '### Changed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've cleaned up XY (#1004)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've cleaned up XY #2 (#1004)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've cleaned up XY #3 (#1004)",
+ "- I've cleaned up XY #4 (#1004)",
+ "- I've cleaned up XY #5 (#1004)",
+ '',
+ '### Deprecated',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've deprecated XY (#1004)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've deprecated XY #2 (#1004)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've deprecated XY #3 (#1004)",
+ "- I've deprecated XY #4 (#1004)",
+ "- I've deprecated XY #5 (#1004)",
+ '',
+ '### Removed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've removed XY (#1004)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've removed XY #2 (#1004)",
+ '',
+ '#### mock-package-3',
+ "- I've removed XY #3 (#1004)",
+ "- I've removed XY #4 (#1004)",
+ "- I've removed XY #5 (#1004)",
+ '',
+ '### Fixed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've fixed XY (#1004)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've fixed XY #2 (#1004)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've fixed XY #3 (#1004)",
+ "- I've fixed XY #4 (#1004)",
+ "- I've fixed XY #5 (#1004)",
+ '',
+ '### Security',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've improved the security in XY (#1004)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've improved the security in XY #2 (#1004)",
+ '',
+ '#### mock-package-3',
+ "- I've improved the security in XY #3 (#1004)",
+ "- I've improved the security in XY #4 (#1004)",
+ "- I've improved the security in XY #5 (#1004)",
+ '',
+ ...rootUnreleasedSection,
+];
+
+export const rootGroupedUnreleasedEntries = {
+ '### Added': {
+ '#### mock-package-1': ["- I've added feature XY (#1005)"],
+ '#### mock-package-2': ["- I've added feature XY #2 (#1005)"],
+ '#### mock-package-3': [
+ "- I've added feature XY #3 (#1005)",
+ "- I've added feature XY #4 (#1005)",
+ "- I've added feature XY #5 (#1005)",
+ ],
+ },
+ '### Changed': {
+ '#### mock-package-1': ["- I've cleaned up XY (#1005)"],
+ '#### mock-package-2': ["- I've cleaned up XY #2 (#1005)"],
+ '#### mock-package-3': [
+ "- I've cleaned up XY #3 (#1005)",
+ "- I've cleaned up XY #4 (#1005)",
+ "- I've cleaned up XY #5 (#1005)",
+ ],
+ },
+ '### Deprecated': {
+ '#### mock-package-1': ["- I've deprecated XY (#1005)"],
+ '#### mock-package-2': ["- I've deprecated XY #2 (#1005)"],
+ '#### mock-package-3': [
+ "- I've deprecated XY #3 (#1005)",
+ "- I've deprecated XY #4 (#1005)",
+ "- I've deprecated XY #5 (#1005)",
+ ],
+ },
+ '### Removed': {
+ '#### mock-package-1': ["- I've removed XY (#1005)"],
+ '#### mock-package-2': ["- I've removed XY #2 (#1005)"],
+ '#### mock-package-3': [
+ "- I've removed XY #3 (#1005)",
+ "- I've removed XY #4 (#1005)",
+ "- I've removed XY #5 (#1005)",
+ ],
+ },
+ '### Fixed': {
+ '#### mock-package-1': ["- I've fixed XY (#1005)"],
+ '#### mock-package-2': ["- I've fixed XY #2 (#1005)"],
+ '#### mock-package-3': [
+ "- I've fixed XY #3 (#1005)",
+ "- I've fixed XY #4 (#1005)",
+ "- I've fixed XY #5 (#1005)",
+ ],
+ },
+ '### Security': {
+ '#### mock-package-1': ["- I've improved the security in XY (#1005)"],
+ '#### mock-package-2': ["- I've improved the security in XY #2 (#1005)"],
+ '#### mock-package-3': [
+ "- I've improved the security in XY #3 (#1005)",
+ "- I've improved the security in XY #4 (#1005)",
+ "- I've improved the security in XY #5 (#1005)",
+ ],
+ },
+};
+
+export const rootSyncedGroupedUnreleasedEntries = {
+ '### Added': {
+ '#### mock-package-1': ["- I've added feature XY (#1005)"],
+ '#### mock-package-2': ["- I've added feature XY #2 (#1005)"],
+ '#### mock-package-3': [
+ "- I've added feature XY #3 (#1005)",
+ "- I've added feature XY #4 (#1005)",
+ "- I've added feature XY #5 (#1005)",
+ ],
+ },
+ '### Changed': {
+ '#### mock-package-1': ["- I've cleaned up XY (#1005)"],
+ '#### mock-package-2': ["- I've cleaned up XY #2 (#1005)"],
+ '#### mock-package-3': [
+ "- I've cleaned up XY #3 (#1005)",
+ "- I've cleaned up XY #4 (#1005)",
+ "- I've cleaned up XY #5 (#1005)",
+ ],
+ },
+ '### Deprecated': {
+ '#### mock-package-1': ["- I've deprecated XY (#1005)"],
+ '#### mock-package-2': ["- I've deprecated XY #2 (#1005)"],
+ '#### mock-package-3': [
+ "- I've deprecated XY #3 (#1005)",
+ "- I've deprecated XY #4 (#1005)",
+ "- I've deprecated XY #5 (#1005)",
+ ],
+ },
+ '### Removed': {
+ '#### mock-package-1': ["- I've removed XY (#1005)"],
+ '#### mock-package-2': ["- I've removed XY #2 (#1005)"],
+ '#### mock-package-3': [
+ "- I've removed XY #3 (#1005)",
+ "- I've removed XY #4 (#1005)",
+ "- I've removed XY #5 (#1005)",
+ ],
+ },
+ '### Fixed': {
+ '#### mock-package-1': ["- I've fixed XY (#1005)"],
+ '#### mock-package-2': ["- I've fixed XY #2 (#1005)"],
+ '#### mock-package-3': [
+ "- I've fixed XY #3 (#1005)",
+ "- I've fixed XY #4 (#1005)",
+ "- I've fixed XY #5 (#1005)",
+ ],
+ },
+ '### Security': {
+ '#### mock-package-1': ["- I've improved the security in XY (#1005)"],
+ '#### mock-package-2': ["- I've improved the security in XY #2 (#1005)"],
+ '#### mock-package-3': [
+ "- I've improved the security in XY #3 (#1005)",
+ "- I've improved the security in XY #4 (#1005)",
+ "- I've improved the security in XY #5 (#1005)",
+ ],
+ },
+};
+
+export const rootFlattenedSyncedUnreleasedEntries = [
+ '### Added',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've added feature XY (#1005)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've added feature XY #2 (#1005)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've added feature XY #3 (#1005)",
+ "- I've added feature XY #4 (#1005)",
+ "- I've added feature XY #5 (#1005)",
+ '',
+ '### Changed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've cleaned up XY (#1005)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've cleaned up XY #2 (#1005)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've cleaned up XY #3 (#1005)",
+ "- I've cleaned up XY #4 (#1005)",
+ "- I've cleaned up XY #5 (#1005)",
+ '',
+ '### Deprecated',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've deprecated XY (#1005)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've deprecated XY #2 (#1005)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've deprecated XY #3 (#1005)",
+ "- I've deprecated XY #4 (#1005)",
+ "- I've deprecated XY #5 (#1005)",
+ '',
+ '### Removed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've removed XY (#1005)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've removed XY #2 (#1005)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've removed XY #3 (#1005)",
+ "- I've removed XY #4 (#1005)",
+ "- I've removed XY #5 (#1005)",
+ '',
+ '### Fixed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've fixed XY (#1005)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've fixed XY #2 (#1005)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've fixed XY #3 (#1005)",
+ "- I've fixed XY #4 (#1005)",
+ "- I've fixed XY #5 (#1005)",
+ '',
+ '### Security',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've improved the security in XY (#1005)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've improved the security in XY #2 (#1005)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've improved the security in XY #3 (#1005)",
+ "- I've improved the security in XY #4 (#1005)",
+ "- I've improved the security in XY #5 (#1005)",
+ '',
+];
+
+export const rootSyncedChangelog = [
+ '# Changelog',
+ '',
+ 'All notable changes to this project will be documented in this file.',
+ '',
+ 'The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),',
+ 'and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).',
+ '',
+ '',
+ '',
+ '## [0.1.0-alpha.0]',
+ '',
+ '### Added',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've added feature XY (#1000)",
+ '',
+ '### Changed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've cleaned up XY (#1000)",
+ '',
+ '### Deprecated',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've deprecated XY (#1000)",
+ '',
+ '### Removed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've removed XY (#1000)",
+ '',
+ '### Fixed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've fixed XY (#1000)",
+ '',
+ '### Security',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've improved the security in XY (#1000)",
+ '',
+ '## [0.1.0-alpha.1]',
+ '',
+ '### Added',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've added feature XY (#1001)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've added feature XY #2 (#1001)",
+ '',
+ '### Changed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've cleaned up XY (#1001)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've cleaned up XY #2 (#1001)",
+ '',
+ '### Deprecated',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've deprecated XY (#1001)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've deprecated XY #2 (#1001)",
+ '',
+ '### Removed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've removed XY (#1001)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've removed XY #2 (#1001)",
+ '',
+ '### Fixed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've fixed XY (#1001)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've fixed XY #2 (#1001)",
+ '',
+ '### Security',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've improved the security in XY (#1001)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've improved the security in XY #2 (#1001)",
+ '',
+ '## [0.1.0]',
+ '',
+ '### Added',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've added feature XY (#1002)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've added feature XY #2 (#1002)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've added feature XY #3 (#1002)",
+ '',
+ '### Changed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've cleaned up XY (#1002)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've cleaned up XY #2 (#1002)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've cleaned up XY #3 (#1002)",
+ '',
+ '### Deprecated',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've deprecated XY (#1002)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've deprecated XY #2 (#1002)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've deprecated XY #3 (#1002)",
+ '',
+ '### Removed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've removed XY (#1002)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've removed XY #2 (#1002)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've removed XY #3 (#1002)",
+ '',
+ '### Fixed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've fixed XY (#1002)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've fixed XY #2 (#1002)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've fixed XY #3 (#1002)",
+ '',
+ '### Security',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've improved the security in XY (#1002)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've improved the security in XY #2 (#1002)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've improved the security in XY #3 (#1002)",
+ '',
+ '## [0.1.1]',
+ '',
+ '### Added',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've added feature XY (#1003)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've added feature XY #2 (#1003)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've added feature XY #3 (#1003)",
+ "- I've added feature XY #4 (#1003)",
+ '',
+ '### Changed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've cleaned up XY (#1003)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've cleaned up XY #2 (#1003)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've cleaned up XY #3 (#1003)",
+ "- I've cleaned up XY #4 (#1003)",
+ '',
+ '### Deprecated',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've deprecated XY (#1003)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've deprecated XY #2 (#1003)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've deprecated XY #3 (#1003)",
+ "- I've deprecated XY #4 (#1003)",
+ '',
+ '### Removed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've removed XY (#1003)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've removed XY #2 (#1003)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've removed XY #3 (#1003)",
+ "- I've removed XY #4 (#1003)",
+ '',
+ '### Fixed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've fixed XY (#1003)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've fixed XY #2 (#1003)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've fixed XY #3 (#1003)",
+ "- I've fixed XY #4 (#1003)",
+ '',
+ '### Security',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've improved the security in XY (#1003)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've improved the security in XY #2 (#1003)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've improved the security in XY #3 (#1003)",
+ "- I've improved the security in XY #4 (#1003)",
+ '',
+ '## [1.0.0]',
+ '',
+ '### Added',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've added feature XY (#1004)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've added feature XY #2 (#1004)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've added feature XY #3 (#1004)",
+ "- I've added feature XY #4 (#1004)",
+ "- I've added feature XY #5 (#1004)",
+ '',
+ '### Changed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've cleaned up XY (#1004)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've cleaned up XY #2 (#1004)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've cleaned up XY #3 (#1004)",
+ "- I've cleaned up XY #4 (#1004)",
+ "- I've cleaned up XY #5 (#1004)",
+ '',
+ '### Deprecated',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've deprecated XY (#1004)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've deprecated XY #2 (#1004)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've deprecated XY #3 (#1004)",
+ "- I've deprecated XY #4 (#1004)",
+ "- I've deprecated XY #5 (#1004)",
+ '',
+ '### Removed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've removed XY (#1004)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've removed XY #2 (#1004)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've removed XY #3 (#1004)",
+ "- I've removed XY #4 (#1004)",
+ "- I've removed XY #5 (#1004)",
+ '',
+ '### Fixed',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've fixed XY (#1004)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've fixed XY #2 (#1004)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've fixed XY #3 (#1004)",
+ "- I've fixed XY #4 (#1004)",
+ "- I've fixed XY #5 (#1004)",
+ '',
+ '### Security',
+ '',
+ '#### mock-package-1',
+ '',
+ "- I've improved the security in XY (#1004)",
+ '',
+ '#### mock-package-2',
+ '',
+ "- I've improved the security in XY #2 (#1004)",
+ '',
+ '#### mock-package-3',
+ '',
+ "- I've improved the security in XY #3 (#1004)",
+ "- I've improved the security in XY #4 (#1004)",
+ "- I've improved the security in XY #5 (#1004)",
+ '',
+ '## [Unreleased]',
+ '',
+ ...rootFlattenedSyncedUnreleasedEntries,
+];
diff --git a/scripts/changelog/test/fixtures/root_unsynced_CHANGELOG.tmpl b/scripts/changelog/test/fixtures/root_unsynced_CHANGELOG.tmpl
new file mode 100644
index 00000000000..cad5393ff66
--- /dev/null
+++ b/scripts/changelog/test/fixtures/root_unsynced_CHANGELOG.tmpl
@@ -0,0 +1,474 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+
+
+## [0.1.0-alpha.0]
+
+### Added
+
+#### mock-package-1
+
+- I've added feature XY (#1000)
+
+### Changed
+
+#### mock-package-1
+
+- I've cleaned up XY (#1000)
+
+### Deprecated
+
+#### mock-package-1
+
+- I've deprecated XY (#1000)
+
+### Removed
+
+#### mock-package-1
+
+- I've removed XY (#1000)
+
+### Fixed
+
+#### mock-package-1
+
+- I've fixed XY (#1000)
+
+### Security
+
+#### mock-package-1
+
+- I've improved the security in XY (#1000)
+
+## [0.1.0-alpha.1]
+
+### Added
+
+#### mock-package-1
+
+- I've added feature XY (#1001)
+
+#### mock-package-2
+
+- I've added feature XY #2 (#1001)
+
+### Changed
+
+#### mock-package-1
+
+- I've cleaned up XY (#1001)
+
+#### mock-package-2
+
+- I've cleaned up XY #2 (#1001)
+
+### Deprecated
+
+#### mock-package-1
+
+- I've deprecated XY (#1001)
+
+#### mock-package-2
+
+- I've deprecated XY #2 (#1001)
+
+### Removed
+
+#### mock-package-1
+
+- I've removed XY (#1001)
+
+#### mock-package-2
+
+- I've removed XY #2 (#1001)
+
+### Fixed
+
+#### mock-package-1
+
+- I've fixed XY (#1001)
+
+#### mock-package-2
+
+- I've fixed XY #2 (#1001)
+
+### Security
+
+#### mock-package-1
+
+- I've improved the security in XY (#1001)
+
+#### mock-package-2
+
+- I've improved the security in XY #2 (#1001)
+
+## [0.1.0]
+
+### Added
+
+#### mock-package-1
+
+- I've added feature XY (#1002)
+
+#### mock-package-2
+
+- I've added feature XY #2 (#1002)
+
+#### mock-package-3
+
+- I've added feature XY #3 (#1002)
+
+### Changed
+
+#### mock-package-1
+
+- I've cleaned up XY (#1002)
+
+#### mock-package-2
+
+- I've cleaned up XY #2 (#1002)
+
+#### mock-package-3
+
+- I've cleaned up XY #3 (#1002)
+
+### Deprecated
+
+#### mock-package-1
+
+- I've deprecated XY (#1002)
+
+#### mock-package-2
+
+- I've deprecated XY #2 (#1002)
+
+#### mock-package-3
+
+- I've deprecated XY #3 (#1002)
+
+### Removed
+
+#### mock-package-1
+
+- I've removed XY (#1002)
+
+#### mock-package-2
+
+- I've removed XY #2 (#1002)
+
+#### mock-package-3
+
+- I've removed XY #3 (#1002)
+
+### Fixed
+
+#### mock-package-1
+
+- I've fixed XY (#1002)
+
+#### mock-package-2
+
+- I've fixed XY #2 (#1002)
+
+#### mock-package-3
+
+- I've fixed XY #3 (#1002)
+
+### Security
+
+#### mock-package-1
+
+- I've improved the security in XY (#1002)
+
+#### mock-package-2
+
+- I've improved the security in XY #2 (#1002)
+
+#### mock-package-3
+
+- I've improved the security in XY #3 (#1002)
+
+## [0.1.1]
+
+### Added
+
+#### mock-package-1
+
+- I've added feature XY (#1003)
+
+#### mock-package-2
+
+- I've added feature XY #2 (#1003)
+
+#### mock-package-3
+
+- I've added feature XY #3 (#1003)
+- I've added feature XY #4 (#1003)
+
+### Changed
+
+#### mock-package-1
+
+- I've cleaned up XY (#1003)
+
+#### mock-package-2
+
+- I've cleaned up XY #2 (#1003)
+
+#### mock-package-3
+
+- I've cleaned up XY #3 (#1003)
+- I've cleaned up XY #4 (#1003)
+
+### Deprecated
+
+#### mock-package-1
+
+- I've deprecated XY (#1003)
+
+#### mock-package-2
+
+- I've deprecated XY #2 (#1003)
+
+#### mock-package-3
+
+- I've deprecated XY #3 (#1003)
+- I've deprecated XY #4 (#1003)
+
+### Removed
+
+#### mock-package-1
+
+- I've removed XY (#1003)
+
+#### mock-package-2
+
+- I've removed XY #2 (#1003)
+
+#### mock-package-3
+
+- I've removed XY #3 (#1003)
+- I've removed XY #4 (#1003)
+
+### Fixed
+
+#### mock-package-1
+
+- I've fixed XY (#1003)
+
+#### mock-package-2
+
+- I've fixed XY #2 (#1003)
+
+#### mock-package-3
+
+- I've fixed XY #3 (#1003)
+- I've fixed XY #4 (#1003)
+
+### Security
+
+#### mock-package-1
+
+- I've improved the security in XY (#1003)
+
+#### mock-package-2
+
+- I've improved the security in XY #2 (#1003)
+
+#### mock-package-3
+
+- I've improved the security in XY #3 (#1003)
+- I've improved the security in XY #4 (#1003)
+
+## [1.0.0]
+
+### Added
+
+#### mock-package-1
+
+- I've added feature XY (#1004)
+
+#### mock-package-2
+
+- I've added feature XY #2 (#1004)
+
+#### mock-package-3
+
+- I've added feature XY #3 (#1004)
+- I've added feature XY #4 (#1004)
+- I've added feature XY #5 (#1004)
+
+### Changed
+
+#### mock-package-1
+
+- I've cleaned up XY (#1004)
+
+#### mock-package-2
+
+- I've cleaned up XY #2 (#1004)
+
+#### mock-package-3
+
+- I've cleaned up XY #3 (#1004)
+- I've cleaned up XY #4 (#1004)
+- I've cleaned up XY #5 (#1004)
+
+### Deprecated
+
+#### mock-package-1
+
+- I've deprecated XY (#1004)
+
+#### mock-package-2
+
+- I've deprecated XY #2 (#1004)
+
+#### mock-package-3
+
+- I've deprecated XY #3 (#1004)
+- I've deprecated XY #4 (#1004)
+- I've deprecated XY #5 (#1004)
+
+### Removed
+
+#### mock-package-1
+
+- I've removed XY (#1004)
+
+#### mock-package-2
+
+- I've removed XY #2 (#1004)
+
+#### mock-package-3
+
+- I've removed XY #3 (#1004)
+- I've removed XY #4 (#1004)
+- I've removed XY #5 (#1004)
+
+### Fixed
+
+#### mock-package-1
+
+- I've fixed XY (#1004)
+
+#### mock-package-2
+
+- I've fixed XY #2 (#1004)
+
+#### mock-package-3
+
+- I've fixed XY #3 (#1004)
+- I've fixed XY #4 (#1004)
+- I've fixed XY #5 (#1004)
+
+### Security
+
+#### mock-package-1
+
+- I've improved the security in XY (#1004)
+
+#### mock-package-2
+
+- I've improved the security in XY #2 (#1004)
+
+#### mock-package-3
+
+- I've improved the security in XY #3 (#1004)
+- I've improved the security in XY #4 (#1004)
+- I've improved the security in XY #5 (#1004)
+
+## [Unreleased]
+
+### Added
+
+#### mock-package-1
+
+- I've added feature XY (#1005)
+
+#### mock-package-3
+
+- I've added feature XY #3 (#1005)
+- I've added feature XY #5 (#1005)
+
+### Changed
+
+#### mock-package-1
+
+- I've cleaned up XY (#1005)
+
+#### mock-package-3
+
+- I've cleaned up XY #5 (#1005)
+
+### Deprecated
+
+#### mock-package-1
+
+- I've deprecated XY (#1005)
+
+### Removed
+
+#### mock-package-1
+
+- I've removed XY (#1005)
+
+#### mock-package-3
+
+- I've removed XY #3 (#1005)
+- I've removed XY #4 (#1005)
+
+### Fixed
+
+#### mock-package-1
+
+- I've fixed XY (#1005)
+
+#### mock-package-3
+
+- I've fixed XY #4 (#1005)
+
+### Security
+
+#### mock-package-1
+
+- I've improved the security in XY (#1005)
+
+#### mock-package-3
+
+- I've improved the security in XY #3 (#1005)
+- I've improved the security in XY #4 (#1005)
+- I've improved the security in XY #5 (#1005)
diff --git a/scripts/changelog/test/unit/add_changelog_entry.test.ts b/scripts/changelog/test/unit/add_changelog_entry.test.ts
new file mode 100644
index 00000000000..3043d2b162a
--- /dev/null
+++ b/scripts/changelog/test/unit/add_changelog_entry.test.ts
@@ -0,0 +1,76 @@
+/*
+This file is part of web3.js.
+
+web3.js is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+web3.js is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with web3.js. If not, see .
+*/
+import { copyFileSync, readFileSync, unlinkSync } from 'fs';
+
+import { addChangelogEntry } from '../../src/add_changelog_entry';
+import { getListOfPackageNames } from '../../src/helpers';
+import TestChangelogConfig from './test_changelog_config.json';
+import ModifiedTestChangelogConfig from './test_changelog_config_for_add_changelog_entry_tests.json';
+import ExpectedModifiedChangelog from '../fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG.json';
+import ExpectedModifiedChangelog2 from '../fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG_2.json';
+
+describe('Add Changelog Entry tests', () => {
+ it('should add an entry under the Added header`', () => {
+ const listOfPackageNames = getListOfPackageNames(TestChangelogConfig.packagesDirectoryPath);
+
+ copyFileSync(
+ `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${TestChangelogConfig.packagesChangelogPath}`,
+ `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${ModifiedTestChangelogConfig.packagesChangelogPath}`,
+ );
+
+ addChangelogEntry('added', [
+ './scripts/changelog/test/unit/test_changelog_config_for_add_changelog_entry_tests.json',
+ listOfPackageNames[0],
+ 'Some new change (#42)',
+ ]);
+
+ const parsedModifiedChangelog = readFileSync(
+ `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${ModifiedTestChangelogConfig.packagesChangelogPath}`,
+ 'utf8',
+ ).split(/\n/);
+ expect(parsedModifiedChangelog).toEqual(ExpectedModifiedChangelog);
+
+ unlinkSync(
+ `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${ModifiedTestChangelogConfig.packagesChangelogPath}`,
+ );
+ });
+
+ it('should add the header Newheader and add an entry under it`', () => {
+ const listOfPackageNames = getListOfPackageNames(TestChangelogConfig.packagesDirectoryPath);
+
+ copyFileSync(
+ `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${TestChangelogConfig.packagesChangelogPath}`,
+ `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${ModifiedTestChangelogConfig.packagesChangelogPath}`,
+ );
+
+ addChangelogEntry('newheader', [
+ './scripts/changelog/test/unit/test_changelog_config_for_add_changelog_entry_tests.json',
+ listOfPackageNames[0],
+ 'Some new change (#42)',
+ ]);
+
+ const parsedModifiedChangelog = readFileSync(
+ `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${ModifiedTestChangelogConfig.packagesChangelogPath}`,
+ 'utf8',
+ ).split(/\n/);
+ expect(parsedModifiedChangelog).toEqual(ExpectedModifiedChangelog2);
+
+ unlinkSync(
+ `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${ModifiedTestChangelogConfig.packagesChangelogPath}`,
+ );
+ });
+});
diff --git a/scripts/changelog/test/unit/helpers.test.ts b/scripts/changelog/test/unit/helpers.test.ts
new file mode 100644
index 00000000000..10c35467247
--- /dev/null
+++ b/scripts/changelog/test/unit/helpers.test.ts
@@ -0,0 +1,80 @@
+/*
+This file is part of web3.js.
+
+web3.js is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+web3.js is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with web3.js. If not, see .
+*/
+import { getListOfPackageNames, parseArgs } from '../../src/helpers';
+import { Command } from '../../src/types';
+
+describe('Changelog Helpers tests', () => {
+ const mockCommandFunction = jest.fn();
+ const mockCommandFunction2 = jest.fn();
+ const commands: Command[] = [
+ {
+ name: 'mockCommand',
+ description: 'mockCommand',
+ arguments: [],
+ example: 'mockCommand',
+ commandFunction: mockCommandFunction,
+ },
+ {
+ name: 'mockCommand2',
+ description: 'mockCommand2',
+ arguments: ['argument1', 'argument2'],
+ example: 'mockCommand2',
+ commandFunction: mockCommandFunction2,
+ },
+ ];
+
+ it('should parse args and execute mockCommandFunction with no arguments', () => {
+ process.argv = ['', '', 'mockCommand'];
+ parseArgs(commands);
+
+ expect(commands[0].commandFunction).toHaveBeenCalledWith('mockCommand', []);
+ });
+
+ it('should parse args and execute mockCommandFunction2 with two arguments', () => {
+ const expectedArguments = ['arg1', 'arg2'];
+ process.argv = ['', '', 'mockCommand2', ...expectedArguments];
+ parseArgs(commands);
+
+ expect(commands[1].commandFunction).toHaveBeenCalledWith('mockCommand2', expectedArguments);
+ });
+
+ it('should parse args, not execute either commandFunctions, and call console.log and console.table', () => {
+ // eslint-disable-next-line no-console
+ console.log = jest.fn();
+ // eslint-disable-next-line no-console
+ console.table = jest.fn();
+ process.argv = ['', ''];
+
+ parseArgs(commands);
+
+ expect(commands[0].commandFunction).not.toHaveBeenCalledWith();
+ expect(commands[1].commandFunction).not.toHaveBeenCalledWith();
+ // eslint-disable-next-line no-console
+ expect(console.log).toHaveBeenLastCalledWith(
+ 'Invalid command, please refer to below table for expected commands:',
+ );
+ // eslint-disable-next-line no-console
+ expect(console.table).toHaveBeenCalledWith(commands);
+ });
+
+ it('should get list of directory names in ../fixtures/mock_packages_directory', () => {
+ const result = getListOfPackageNames(
+ './scripts/changelog/test/fixtures/mock_packages_directory',
+ );
+ expect(result).toEqual(['mock-package-1', 'mock-package-2', 'mock-package-3']);
+ });
+});
diff --git a/scripts/changelog/test/unit/sync.test.ts b/scripts/changelog/test/unit/sync.test.ts
new file mode 100644
index 00000000000..b9ef50f64f2
--- /dev/null
+++ b/scripts/changelog/test/unit/sync.test.ts
@@ -0,0 +1,104 @@
+/*
+This file is part of web3.js.
+
+web3.js is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+web3.js is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with web3.js. If not, see .
+*/
+import { copyFileSync, readFileSync, unlinkSync } from 'fs';
+
+import {
+ flattenSyncedUnreleasedEntries,
+ getPackageGroupedUnreleasedEntries,
+ getRootGroupedUnreleasedEntries,
+ getSyncedGroupedUnreleasedEntries,
+ getUnreleasedSection,
+ syncChangelogs,
+} from '../../src/sync';
+import { getListOfPackageNames } from '../../src/helpers';
+import {
+ parsedPackageChangelog,
+ packageUnreleasedSection,
+ packageGroupedUnreleasedEntries,
+} from '../fixtures/package_parsed_changelog';
+import {
+ rootFlattenedSyncedUnreleasedEntries,
+ rootGroupedUnreleasedEntries,
+ rootSyncedChangelog,
+ rootSyncedGroupedUnreleasedEntries,
+ rootUnreleasedSection,
+} from '../fixtures/root_parsed_changelog';
+import TestChangelogConfig from './test_changelog_config.json';
+
+describe('Changelog Sync tests', () => {
+ let listOfPackageNames: string[];
+
+ beforeAll(() => {
+ listOfPackageNames = getListOfPackageNames(
+ './scripts/changelog/test/fixtures/mock_packages_directory',
+ );
+ });
+
+ it('should get package unreleased section', () => {
+ const result = getUnreleasedSection(parsedPackageChangelog);
+ expect(result).toEqual(packageUnreleasedSection);
+ });
+
+ it('should get root grouped unreleased entries', () => {
+ const result = getRootGroupedUnreleasedEntries(rootUnreleasedSection);
+ expect(result).toEqual(rootGroupedUnreleasedEntries);
+ });
+
+ it('should get package grouped unreleased entries', () => {
+ const result = getPackageGroupedUnreleasedEntries(packageUnreleasedSection);
+ expect(result).toEqual(packageGroupedUnreleasedEntries);
+ });
+
+ it('should get synced grouped unreleased entries', () => {
+ const result = getSyncedGroupedUnreleasedEntries(
+ listOfPackageNames,
+ TestChangelogConfig,
+ rootGroupedUnreleasedEntries,
+ );
+ expect(result).toEqual(rootSyncedGroupedUnreleasedEntries);
+ });
+
+ it('should flatten synced unreleased entries', () => {
+ const syncedGroupedUnreleasedEntries = getSyncedGroupedUnreleasedEntries(
+ listOfPackageNames,
+ TestChangelogConfig,
+ rootGroupedUnreleasedEntries,
+ );
+ const result = flattenSyncedUnreleasedEntries(
+ syncedGroupedUnreleasedEntries,
+ listOfPackageNames,
+ );
+ expect(result).toEqual(rootFlattenedSyncedUnreleasedEntries);
+ });
+
+ it('should sync all package CHANGELOGs with root CHANGELOG.md', () => {
+ copyFileSync(
+ './scripts/changelog/test/fixtures/root_unsynced_CHANGELOG.tmpl',
+ TestChangelogConfig.rootChangelogPath,
+ );
+
+ syncChangelogs('sync', ['./scripts/changelog/test/unit/test_changelog_config.json']);
+
+ const parsedRootChangelog = readFileSync(
+ TestChangelogConfig.rootChangelogPath,
+ 'utf8',
+ ).split(/\n/);
+ expect(parsedRootChangelog).toEqual(rootSyncedChangelog);
+
+ unlinkSync(TestChangelogConfig.rootChangelogPath);
+ });
+});
diff --git a/scripts/changelog/test/unit/test_changelog_config.json b/scripts/changelog/test/unit/test_changelog_config.json
new file mode 100644
index 00000000000..95555719f3a
--- /dev/null
+++ b/scripts/changelog/test/unit/test_changelog_config.json
@@ -0,0 +1,5 @@
+{
+ "packagesDirectoryPath": "./scripts/changelog/test/fixtures/mock_packages_directory",
+ "packagesChangelogPath": "CHANGELOG.md",
+ "rootChangelogPath": "./scripts/changelog/test/fixtures/mock_packages_directory/CHANGELOG.md"
+}
diff --git a/scripts/changelog/test/unit/test_changelog_config_for_add_changelog_entry_tests.json b/scripts/changelog/test/unit/test_changelog_config_for_add_changelog_entry_tests.json
new file mode 100644
index 00000000000..40bcfb7045c
--- /dev/null
+++ b/scripts/changelog/test/unit/test_changelog_config_for_add_changelog_entry_tests.json
@@ -0,0 +1,5 @@
+{
+ "packagesDirectoryPath": "./scripts/changelog/test/fixtures/mock_packages_directory",
+ "packagesChangelogPath": "MODIFIED_CHANGELOG.md",
+ "rootChangelogPath": "./scripts/changelog/test/fixtures/mock_packages_directory/CHANGELOG.md"
+}
diff --git a/scripts/jest.config.js b/scripts/jest.config.js
new file mode 100644
index 00000000000..2bdf6529d4c
--- /dev/null
+++ b/scripts/jest.config.js
@@ -0,0 +1,20 @@
+/*
+This file is part of web3.js.
+
+web3.js is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+web3.js is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with web3.js. If not, see .
+*/
+module.exports = {
+ preset: 'ts-jest',
+ testEnvironment: 'node',
+};
diff --git a/templates/.prettierignore.tmpl b/templates/.prettierignore.tmpl
index a555afa7e28..76075e77df3 100644
--- a/templates/.prettierignore.tmpl
+++ b/templates/.prettierignore.tmpl
@@ -37,6 +37,9 @@ tmp/
browsertest.build/
.coverage
.coverage-unit
+cypress/.cert
+*.lock
+
# Eth2 specs
*.yaml
*.yml
diff --git a/yarn.lock b/yarn.lock
index 589abaf2e2e..146d17c863e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -11913,4 +11913,4 @@ yn@3.1.1:
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
- integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
\ No newline at end of file