From a8095c427d421cf5746de043f45011681d5844fc Mon Sep 17 00:00:00 2001 From: Maarten Zuidhoorn Date: Thu, 3 Sep 2026 11:57:34 +0200 Subject: [PATCH] Make package template a proper Yarn workspace Adds `scripts/create-package/package-template` to the monorepo's workspaces list so that Yarn constraints are enforced against it, making it easier to keep the template aligned with other packages. The template's package name is set to `@metamask/package-template` (a real resolvable name), with placeholders only for fields that vary per package. Constraints are relaxed where needed: the homepage uses a placeholder directory name, and the codeowner check is skipped for the template. --- package.json | 3 ++- scripts/create-package/constants.ts | 2 +- .../create-package/package-template/README.md | 4 +-- .../package-template/package.json | 10 +++++--- yarn.config.cjs | 25 ++++++++++++++----- yarn.lock | 17 +++++++++++++ 6 files changed, 47 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index e28c861b543..faa96fe3992 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ }, "workspaces": [ "examples/*", - "packages/*" + "packages/*", + "scripts/create-package/package-template" ], "files": [], "scripts": { diff --git a/scripts/create-package/constants.ts b/scripts/create-package/constants.ts index cf8992ee0b8..46a9fc1dad0 100644 --- a/scripts/create-package/constants.ts +++ b/scripts/create-package/constants.ts @@ -14,7 +14,7 @@ export enum MonorepoFiles { export enum Placeholders { CurrentYear = 'CURRENT_YEAR', NodeVersions = 'NODE_VERSIONS', - PackageName = 'PACKAGE_NAME', + PackageName = '@metamask/package-template', PackageDescription = 'PACKAGE_DESCRIPTION', PackageDirectoryName = 'PACKAGE_DIRECTORY_NAME', } diff --git a/scripts/create-package/package-template/README.md b/scripts/create-package/package-template/README.md index 8299befe97e..2144ba3623d 100644 --- a/scripts/create-package/package-template/README.md +++ b/scripts/create-package/package-template/README.md @@ -4,11 +4,11 @@ PACKAGE_DESCRIPTION ## Installation -`yarn add PACKAGE_NAME` +`yarn add @metamask/package-template` or -`npm install PACKAGE_NAME` +`npm install @metamask/package-template` ## Contributing diff --git a/scripts/create-package/package-template/package.json b/scripts/create-package/package-template/package.json index 50a66badadd..84603359290 100644 --- a/scripts/create-package/package-template/package.json +++ b/scripts/create-package/package-template/package.json @@ -1,5 +1,5 @@ { - "name": "PACKAGE_NAME", + "name": "@metamask/package-template", "version": "0.0.0", "description": "PACKAGE_DESCRIPTION", "keywords": [ @@ -42,8 +42,10 @@ "build": "ts-bridge --project tsconfig.build.json --verbose --clean --no-references", "build:all": "ts-bridge --project tsconfig.build.json --verbose --clean", "build:docs": "typedoc", - "changelog:update": "../../scripts/update-changelog.sh PACKAGE_NAME", - "changelog:validate": "../../scripts/validate-changelog.sh PACKAGE_NAME", + "changelog:update": "../../scripts/update-changelog.sh @metamask/package-template", + "changelog:validate": "../../scripts/validate-changelog.sh @metamask/package-template", + "lint:tsconfigs": "tsx ../../scripts/lint-tsconfigs/lint-tsconfigs.mts", + "lint:tsconfigs:fix": "tsx ../../scripts/lint-tsconfigs/lint-tsconfigs.mts --fix", "messenger-action-types:check": "tsx ../../packages/messenger-cli/src/cli.ts --formatter oxfmt --check", "messenger-action-types:generate": "tsx ../../packages/messenger-cli/src/cli.ts --formatter oxfmt --generate", "since-latest-release": "../../scripts/since-latest-release.sh", @@ -65,6 +67,6 @@ "typescript": "~5.3.3" }, "engines": { - "node": "NODE_VERSIONS" + "node": "^18.18 || >=20" } } diff --git a/yarn.config.cjs b/yarn.config.cjs index 2b55c2fd360..7be0d372f36 100644 --- a/yarn.config.cjs +++ b/yarn.config.cjs @@ -83,6 +83,9 @@ module.exports = defineConfig({ const isPrivate = hasProperty(workspace.manifest, 'private') && workspace.manifest.private === true; + const isTemplate = + workspace.manifest.name === '@metamask/package-template'; + const dependenciesByIdentAndType = getDependenciesByIdentAndType( Yarn.dependencies({ workspace }), ); @@ -110,11 +113,19 @@ module.exports = defineConfig({ expectWorkspaceField(workspace, 'keywords', ['Ethereum', 'MetaMask']); // All non-root packages must have a homepage URL that includes its name. - expectWorkspaceField( - workspace, - 'homepage', - `${repositoryUri}/tree/main/packages/${workspaceBasename}#readme`, - ); + if (isTemplate) { + expectWorkspaceField( + workspace, + 'homepage', + `${repositoryUri}/tree/main/packages/PACKAGE_DIRECTORY_NAME#readme`, + ); + } else { + expectWorkspaceField( + workspace, + 'homepage', + `${repositoryUri}/tree/main/packages/${workspaceBasename}#readme`, + ); + } // All non-root packages must have a URL for reporting bugs that points // to the Issues page for the repository. @@ -289,7 +300,9 @@ module.exports = defineConfig({ // All non-root packages must have a valid README.md file. await expectReadme(workspace, workspaceBasename, isPrivate); - await expectCodeowner(workspace, workspaceBasename); + if (!isTemplate) { + await expectCodeowner(workspace, workspaceBasename); + } } } diff --git a/yarn.lock b/yarn.lock index 16ede8012a3..a9cb6632e27 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8171,6 +8171,23 @@ __metadata: languageName: node linkType: hard +"@metamask/package-template@workspace:scripts/create-package/package-template": + version: 0.0.0-use.local + resolution: "@metamask/package-template@workspace:scripts/create-package/package-template" + dependencies: + "@metamask/auto-changelog": "npm:^6.1.0" + "@ts-bridge/cli": "npm:^0.6.4" + "@types/jest": "npm:^30.0.0" + deepmerge: "npm:^4.2.2" + jest: "npm:^30.4.2" + ts-jest: "npm:^29.4.11" + tsx: "npm:^4.20.5" + typedoc: "npm:^0.25.13" + typedoc-plugin-missing-exports: "npm:^2.0.0" + typescript: "npm:~5.3.3" + languageName: unknown + linkType: soft + "@metamask/passkey-controller@npm:^3.1.0, @metamask/passkey-controller@workspace:packages/passkey-controller": version: 0.0.0-use.local resolution: "@metamask/passkey-controller@workspace:packages/passkey-controller"