From 9651ff8f954398e34463f2581704343d49b70377 Mon Sep 17 00:00:00 2001 From: dangreen Date: Mon, 29 Jun 2026 18:02:22 +0400 Subject: [PATCH] feat(node-gha,github-action): support Node.js GitHub Action releases --- README.md | 9 ++ packages/github-action/src/releaser.ts | 2 +- packages/node-gha/README.md | 118 ++++++++++++++++++++ packages/node-gha/oxlint.config.ts | 12 ++ packages/node-gha/package.json | 65 +++++++++++ packages/node-gha/src/index.ts | 2 + packages/node-gha/src/project.ts | 29 +++++ packages/node-gha/src/publish.spec.ts | 86 ++++++++++++++ packages/node-gha/src/publish.ts | 149 +++++++++++++++++++++++++ packages/node-gha/tsconfig.build.json | 13 +++ packages/node-gha/tsconfig.json | 13 +++ pnpm-lock.yaml | 84 ++++++++------ 12 files changed, 549 insertions(+), 33 deletions(-) create mode 100644 packages/node-gha/README.md create mode 100644 packages/node-gha/oxlint.config.ts create mode 100644 packages/node-gha/package.json create mode 100644 packages/node-gha/src/index.ts create mode 100644 packages/node-gha/src/project.ts create mode 100644 packages/node-gha/src/publish.spec.ts create mode 100644 packages/node-gha/src/publish.ts create mode 100644 packages/node-gha/tsconfig.build.json create mode 100644 packages/node-gha/tsconfig.json diff --git a/README.md b/README.md index 86e6055..ceacd8c 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ A simple tool to automate version bumps, changelogs, and releases using [Convent | [`@simple-release/config`](packages/config#readme) | A simple-release config loader. | [![NPM version][config-npm]][config-npm-url] | [![Dependencies status][config-deps]][config-deps-url] | | [`@simple-release/npm`](packages/npm#readme) | A npm addon for simple-release. | [![NPM version][npm-npm]][npm-npm-url] | [![Dependencies status][npm-deps]][npm-deps-url] | | [`@simple-release/pnpm`](packages/pnpm#readme) | A pnpm addon for simple-release. | [![NPM version][pnpm-npm]][pnpm-npm-url] | [![Dependencies status][pnpm-deps]][pnpm-deps-url] | +| [`@simple-release/node-gha`](packages/node-gha#readme) | A Node.js GitHub Actions addon for simple-release. | [![NPM version][node-gha-npm]][node-gha-npm-url] | [![Dependencies status][node-gha-deps]][node-gha-deps-url] | | [`@simple-release/github`](packages/github#readme) | A github release addon for simple-release. | [![NPM version][github-npm]][github-npm-url] | [![Dependencies status][github-deps]][github-deps-url] | | [`@simple-release/github-action`](packages/github-action#readme) | A simple-release api for github action. | [![NPM version][github-action-npm]][github-action-npm-url] | [![Dependencies status][github-action-deps]][github-action-deps-url] | | [`simple-github-release`](packages/simple-github-release#readme) | A simple tool to create GitHub releases. | [![NPM version][simple-github-release-npm]][simple-github-release-npm-url] | [![Dependencies status][simple-github-release-deps]][simple-github-release-deps-url] | @@ -63,6 +64,14 @@ A simple tool to automate version bumps, changelogs, and releases using [Convent [pnpm-deps]: https://img.shields.io/librariesio/release/npm/@simple-release/pnpm [pnpm-deps-url]: https://libraries.io/npm/@simple-release%2Fpnpm + + +[node-gha-npm]: https://img.shields.io/npm/v/@simple-release/node-gha.svg +[node-gha-npm-url]: https://www.npmjs.com/package/@simple-release/node-gha + +[node-gha-deps]: https://img.shields.io/librariesio/release/npm/@simple-release/node-gha +[node-gha-deps-url]: https://libraries.io/npm/@simple-release%2Fnode-gha + [github-npm]: https://img.shields.io/npm/v/@simple-release/github.svg diff --git a/packages/github-action/src/releaser.ts b/packages/github-action/src/releaser.ts index 9dd50ff..67ffaf6 100644 --- a/packages/github-action/src/releaser.ts +++ b/packages/github-action/src/releaser.ts @@ -140,8 +140,8 @@ export class ReleaserGithubAction

extends Releaser< .maintenanceBranch() .tag() .push() - .release() .publish() + .release() .run(check ? ifReleaseCommit : undefined) } diff --git a/packages/node-gha/README.md b/packages/node-gha/README.md new file mode 100644 index 0000000..66314ce --- /dev/null +++ b/packages/node-gha/README.md @@ -0,0 +1,118 @@ +# @simple-release/node-gha + +[![ESM-only package][package]][package-url] +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Install size][size]][size-url] +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] + +[package]: https://img.shields.io/badge/package-ESM--only-ffe536.svg +[package-url]: https://nodejs.org/api/esm.html + +[npm]: https://img.shields.io/npm/v/@simple-release/node-gha.svg +[npm-url]: https://www.npmjs.com/package/@simple-release/node-gha + +[node]: https://img.shields.io/node/v/@simple-release/node-gha.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/@simple-release/node-gha +[deps-url]: https://libraries.io/npm/@simple-release%2Fnode-gha + +[size]: https://packagephobia.com/badge?p=@simple-release/node-gha +[size-url]: https://packagephobia.com/result?p=@simple-release/node-gha + +[build]: https://img.shields.io/github/actions/workflow/status/TrigenSoftware/simple-release/tests.yml?branch=main +[build-url]: https://github.com/TrigenSoftware/simple-release/actions + +[coverage]: https://coveralls.io/repos/github/TrigenSoftware/simple-release/badge.svg?branch=main +[coverage-url]: https://coveralls.io/github/TrigenSoftware/simple-release?branch=main + +A Node.js GitHub Actions addon for simple-release. + +## Install + +```bash +# pnpm +pnpm add @simple-release/node-gha +# yarn +yarn add @simple-release/node-gha +# npm +npm i @simple-release/node-gha +``` + +## Usage + +```js +import { Releaser } from '@simple-release/core' +import { NodeGhaProject } from '@simple-release/node-gha' + +await new Releaser({ + project: new NodeGhaProject() +}) + .publish({ + build: 'pnpm install --prod', + files: [ + 'node_modules', + 'dist' + ] + }) + .run() +``` + +`NodeGhaProject` publishes a built Node.js GitHub Action state by creating or updating: + +- `latest` branch from the current release commit. +- `v{major}` branch from the built `latest` state. +- `v{version}` tag from the built `latest` state. + +If `build` is provided, the command runs on the `latest` branch. After the command completes, files from the publish option `files` are force-added and the release commit is amended before refs are pushed. If `files` is not provided, package.json `files` is used. + +## Options + +### NodeGhaProject + +#### `path` + +Path to the `package.json` manifest file. Defaults to `'package.json'`. + +#### `changelogFile` + +Path to the changelog file. Defaults to `'CHANGELOG.md'`. + +#### `compose` + +Function to compose the main manifest with secondaries. It can be needed if you have some secondary manifests where version also should be updated. Optional. + +### publish + +Publish options for `NodeGhaProject`. + +#### `skip` + +If true, skip publishing. Optional. + +#### `latestBranch` + +Branch that points to the latest built GitHub Action state. Defaults to `'latest'`. + +#### `majorBranchPrefix` + +Prefix for the major branch. Defaults to `'v'`. + +#### `tagPrefix` + +Prefix for version tags. Defaults to `'v'`. + +#### `build` + +Build or install command to run before publishing refs. Optional. + +#### `files` + +Files to stage after `build`. Defaults to package.json `files`. + +#### `env` + +Environment variables to set before running build commands. Defaults to `process.env`. diff --git a/packages/node-gha/oxlint.config.ts b/packages/node-gha/oxlint.config.ts new file mode 100644 index 0000000..4eba28c --- /dev/null +++ b/packages/node-gha/oxlint.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from '@trigen/oxlint' +import testConfig from '@trigen/oxlint-config/test' +import tsTypeCheckedConfig from '@trigen/oxlint-config/typescript-type-checked' +import rootConfig from '../../oxlint.config.ts' + +export default defineConfig({ + extends: [ + rootConfig, + tsTypeCheckedConfig, + testConfig + ] +}) diff --git a/packages/node-gha/package.json b/packages/node-gha/package.json new file mode 100644 index 0000000..f08b2c6 --- /dev/null +++ b/packages/node-gha/package.json @@ -0,0 +1,65 @@ +{ + "name": "@simple-release/node-gha", + "type": "module", + "version": "2.3.0", + "description": "A Node.js GitHub Actions addon for simple-release.", + "author": { + "name": "Dan Onoshko", + "email": "danon0404@gmail.com", + "url": "https://github.com/dangreen" + }, + "license": "MIT", + "homepage": "https://github.com/TrigenSoftware/simple-release/tree/main/packages/node-gha#readme", + "funding": "https://ko-fi.com/dangreen", + "repository": { + "type": "git", + "url": "https://github.com/TrigenSoftware/simple-release.git", + "directory": "packages/node-gha" + }, + "bugs": { + "url": "https://github.com/TrigenSoftware/simple-release/issues" + }, + "keywords": [ + "simple-release", + "github-actions", + "release", + "publish", + "changelog" + ], + "engines": { + "node": ">=22" + }, + "exports": "./src/index.ts", + "publishConfig": { + "exports": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "directory": "package", + "linkDirectory": false + }, + "files": [ + "dist" + ], + "scripts": { + "clear:package": "del ./package", + "clear:dist": "del ./dist", + "clear": "del ./package ./dist ./coverage", + "prepublishOnly": "run build clear:package clean-publish", + "postpublish": "pnpm clear:package", + "build": "tsgo -p tsconfig.build.json", + "lint": "oxlint", + "test:unit": "vitest run --coverage", + "test:types": "tsgo --noEmit", + "test": "run -p lint test:unit test:types" + }, + "dependencies": { + "@simple-libs/child-process-utils": "^2.0.0", + "@simple-release/core": "workspace:^", + "semver": "^7.5.2" + }, + "devDependencies": { + "@types/semver": "^7.5.8", + "test": "workspace:^" + } +} diff --git a/packages/node-gha/src/index.ts b/packages/node-gha/src/index.ts new file mode 100644 index 0000000..87b9032 --- /dev/null +++ b/packages/node-gha/src/index.ts @@ -0,0 +1,2 @@ +export * from './project.js' +export * from './publish.js' diff --git a/packages/node-gha/src/project.ts b/packages/node-gha/src/project.ts new file mode 100644 index 0000000..22a00ba --- /dev/null +++ b/packages/node-gha/src/project.ts @@ -0,0 +1,29 @@ +import { + type PackageJsonProjectOptions, + type ProjectBumpOptions, + PackageJsonProject +} from '@simple-release/core' +import { + type PublishOptions, + publish +} from './publish.js' + +export type NodeGhaProjectOptions = PackageJsonProjectOptions + +export type NodeGhaProjectBumpOptions = ProjectBumpOptions + +export type NodeGhaProjectPublishOptions = PublishOptions + +/** + * A Node.js GitHub Actions project that publishes version refs to git branches and tags. + */ +export class NodeGhaProject extends PackageJsonProject { + override async publish(options: NodeGhaProjectPublishOptions = {}): Promise { + if (options.skip) { + options.logger?.info('Skipping publish') + return + } + + await publish(this, options) + } +} diff --git a/packages/node-gha/src/publish.spec.ts b/packages/node-gha/src/publish.spec.ts new file mode 100644 index 0000000..c17aad0 --- /dev/null +++ b/packages/node-gha/src/publish.spec.ts @@ -0,0 +1,86 @@ +import { join } from 'path' +import { + describe, + expect, + it +} from 'vitest' +import { + createDirectory, + forkProject, + packageJsonProject +} from 'test' +import { NodeGhaProject } from './project.js' + +function refHash(output: string) { + return output.split(/\s+/)[0] +} + +describe('node-gha', () => { + describe('publish', () => { + it('should publish GitHub Action refs from the built latest branch', async () => { + const { cwd } = await forkProject('node-gha-publish', packageJsonProject({ + version: '2.5.0', + files: [ + 'dist' + ] + })) + const remote = await createDirectory('node-gha-publish-remote') + const project = new NodeGhaProject({ + path: join(cwd, 'package.json') + }) + + await project.gitClient.exec('-C', remote, 'init', '--bare') + await project.gitClient.exec('remote', 'set-url', 'origin', remote) + + await project.publish({ + build: 'node -e "const fs=require(\'fs\');fs.mkdirSync(\'dist\',{recursive:true});fs.writeFileSync(\'dist/index.js\',\'built\\n\')"' + }) + + const latestRef = await project.gitClient.exec('ls-remote', '--heads', 'origin', 'latest') + const majorRef = await project.gitClient.exec('ls-remote', '--heads', 'origin', 'v2') + const tagRef = await project.gitClient.exec('ls-remote', '--tags', 'origin', 'v2.5.0') + + expect(latestRef).toContain('refs/heads/latest') + expect(majorRef).toContain('refs/heads/v2') + expect(tagRef).toContain('refs/tags/v2.5.0') + expect(refHash(latestRef)).toBe(refHash(majorRef)) + expect(refHash(latestRef)).toBe(refHash(tagRef)) + expect(await project.gitClient.exec('show', 'v2.5.0:dist/index.js')).toBe('built') + expect(await project.gitClient.getCurrentBranch()).toBe('master') + }) + + it('should use custom ref names and explicit files', async () => { + const { cwd } = await forkProject('node-gha-publish-custom-refs', packageJsonProject({ + version: '3.0.0' + })) + const remote = await createDirectory('node-gha-publish-custom-refs-remote') + const project = new NodeGhaProject({ + path: join(cwd, 'package.json') + }) + + await project.gitClient.exec('-C', remote, 'init', '--bare') + await project.gitClient.exec('remote', 'set-url', 'origin', remote) + + await project.publish({ + latestBranch: 'stable', + majorBranchPrefix: 'release-', + tagPrefix: 'action-v', + build: 'node -e "const fs=require(\'fs\');fs.mkdirSync(\'lib\',{recursive:true});fs.writeFileSync(\'lib/action.js\',\'custom\\n\')"', + files: [ + 'lib/action.js' + ] + }) + + const latestRef = await project.gitClient.exec('ls-remote', '--heads', 'origin', 'stable') + const majorRef = await project.gitClient.exec('ls-remote', '--heads', 'origin', 'release-3') + const tagRef = await project.gitClient.exec('ls-remote', '--tags', 'origin', 'action-v3.0.0') + + expect(latestRef).toContain('refs/heads/stable') + expect(majorRef).toContain('refs/heads/release-3') + expect(tagRef).toContain('refs/tags/action-v3.0.0') + expect(refHash(latestRef)).toBe(refHash(majorRef)) + expect(refHash(latestRef)).toBe(refHash(tagRef)) + expect(await project.gitClient.exec('show', 'action-v3.0.0:lib/action.js')).toBe('custom') + }) + }) +}) diff --git a/packages/node-gha/src/publish.ts b/packages/node-gha/src/publish.ts new file mode 100644 index 0000000..43b0758 --- /dev/null +++ b/packages/node-gha/src/publish.ts @@ -0,0 +1,149 @@ +import { spawn } from 'child_process' +import type { + PackageJsonProject, + ProjectPublishOptions +} from '@simple-release/core' +import { throwProcessError } from '@simple-libs/child-process-utils' +import semverMajor from 'semver/functions/major.js' +import semverValid from 'semver/functions/valid.js' + +export interface PublishOptions extends ProjectPublishOptions { + /** + * Branch that points to the latest built GitHub Action state. + * @default 'latest' + */ + latestBranch?: string + /** + * Prefix for the major branch. + * @default 'v' + */ + majorBranchPrefix?: string + /** + * Prefix for version tags. + * @default 'v' + */ + tagPrefix?: string + /** + * Build or install command to run before publishing refs. + */ + build?: string | string[] + /** + * Files to stage after build. Defaults to package.json `files`. + */ + files?: string[] + /** + * Environment variables to set before running build commands. + * @default process.env + */ + env?: Record +} + +async function runBuildCommands( + commands: string[], + options: Pick, + cwd: string +) { + const { + dryRun, + env = process.env, + logger + } = options + const silent = logger?.parent.options.silent + + for (const command of commands) { + logger?.info(`Running build command: ${command}`) + + if (!dryRun) { + await throwProcessError(spawn(command, { + cwd, + env, + shell: true, + stdio: silent ? 'ignore' : 'inherit' + })) + } + } +} + +export async function publish(project: PackageJsonProject, options: PublishOptions = {}): Promise { + const { + gitClient, + manifest + } = project + const { + latestBranch = 'latest', + majorBranchPrefix = 'v', + tagPrefix = 'v', + dryRun, + logger + } = options + const { projectPath } = manifest + const pkg = await manifest.readManifest() + const version = await manifest.getVersion() + const validVersion = semverValid(version) + + if (!validVersion) { + throw new Error(`Invalid GitHub Action version: ${version}`) + } + + const majorBranch = `${majorBranchPrefix}${semverMajor(validVersion)}` + const versionTag = `${tagPrefix}${validVersion}` + const buildCommands = options.build + ? Array.isArray(options.build) + ? options.build + : [options.build] + : [] + const files = options.files || pkg.files as string[] || [] + const originalBranch = await gitClient.getCurrentBranch() + const releaseCommit = await gitClient.verify('HEAD') + + logger?.info(`Publishing GitHub Action ${versionTag}...`) + logger?.verbose(`Latest branch: ${latestBranch}`) + logger?.verbose(`Major branch: ${majorBranch}`) + + let shouldRestoreBranch = false + + try { + if (!dryRun) { + await gitClient.exec('checkout', '-B', latestBranch, releaseCommit) + + shouldRestoreBranch = originalBranch !== latestBranch + } + + await runBuildCommands(buildCommands, options, projectPath) + + if (!dryRun && buildCommands.length && files.length) { + logger?.info('Staging built GitHub Action files...') + + await gitClient.exec('add', '--force', '--', ...files) + + const stagedFiles = await gitClient.exec('diff', '--cached', '--name-only') + + if (stagedFiles) { + await gitClient.exec('commit', '--amend', '--no-edit', '--no-verify') + } + } + + if (!dryRun) { + logger?.info('Creating GitHub Action release refs...') + + await gitClient.exec('branch', '-f', '--', majorBranch, 'HEAD') + await gitClient.exec('tag', '-f', '--', versionTag, 'HEAD') + + logger?.info('Pushing GitHub Action release refs...') + + await gitClient.push(latestBranch, { + force: true, + verify: false + }) + await gitClient.push(majorBranch, { + force: true, + verify: false + }) + await gitClient.exec('push', '--force', 'origin', versionTag) + } + } finally { + if (shouldRestoreBranch) { + await gitClient.checkout(originalBranch) + } + } +} diff --git a/packages/node-gha/tsconfig.build.json b/packages/node-gha/tsconfig.build.json new file mode 100644 index 0000000..87a2104 --- /dev/null +++ b/packages/node-gha/tsconfig.build.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "dist" + }, + "include": [ + "src" + ], + "exclude": [ + "**/*.spec.ts" + ] +} diff --git a/packages/node-gha/tsconfig.json b/packages/node-gha/tsconfig.json new file mode 100644 index 0000000..c5556fc --- /dev/null +++ b/packages/node-gha/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.build.json", + "compilerOptions": { + "allowJs": true, + "rootDir": "../.." + }, + "include": [ + "src", + "*.js", + "*.ts" + ], + "exclude": [] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ea97c1..34dd75c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,7 +34,7 @@ importers: version: 22.16.2 '@typescript/native-preview': specifier: latest - version: 7.0.0-dev.20260627.2 + version: 7.0.0-dev.20260628.1 '@vitest/coverage-v8': specifier: ^4.1.9 version: 4.1.9(vitest@4.1.9) @@ -175,6 +175,26 @@ importers: version: link:../pnpm publishDirectory: package + packages/node-gha: + dependencies: + '@simple-libs/child-process-utils': + specifier: ^2.0.0 + version: 2.0.0 + '@simple-release/core': + specifier: workspace:^ + version: link:../core + semver: + specifier: ^7.5.2 + version: 7.8.5 + devDependencies: + '@types/semver': + specifier: ^7.5.8 + version: 7.7.0 + test: + specifier: workspace:^ + version: link:../test + publishDirectory: package + packages/npm: dependencies: '@simple-libs/child-process-utils': @@ -899,50 +919,50 @@ packages: resolution: {integrity: sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260627.2': - resolution: {integrity: sha512-om8UapcrjCyQ7Vsn0eb6kEB/scwo2/Np95cOyCiIIjUWObsDKL/DSpkYX3Z1cxo1L8WY48UM5edR2bzzarBxBg==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260628.1': + resolution: {integrity: sha512-eHHDHAZjbZ681sHyW87tg8mH4+xIs+Q7cHKIlrdafqeny1KYWorj3O9Qfnjvcl2Yd2Eq+IzJxffF6Tepy13L4Q==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260627.2': - resolution: {integrity: sha512-40IOEo0tMS8lNLK/iVhjPcZsgXY7Erijqe5b2HLN9eufoPaGFUfNpFQ8JYHI/xgEF6/JdgGAQp6j4s8E8oamew==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260628.1': + resolution: {integrity: sha512-xIsJSXa0Fsv0pPfQ0YYa7nUQJ/nGRF/r8p60e0Aa29SexxgOXMsu3YhOnUnJEdbvaPzqlKqa1GqNGpbGnLQcLA==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260627.2': - resolution: {integrity: sha512-66G5zoTYUi358zkza1kAoUgAXs4Ek0eA69TyPDU350fH6wgepeEkCuD5kel4iTPuIbJE40WZABcbBsQJsRCbJQ==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260628.1': + resolution: {integrity: sha512-p3yj2a70vkaFB3OD+Vt4oNUaiE7I30fwiXs6LVNAW6k0GSHNc4ucYcWVlpcp8+cej9RBQgxMnMH5MSVYmNhUvw==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260627.2': - resolution: {integrity: sha512-1wIpqbi6Y8plCc4dH1Qw12fBu5Uk1qAdEC1fnpybkztXG90ErTG8XeccQ/SeCAl2X65PnhUU+rvzNVwqfvGyGg==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260628.1': + resolution: {integrity: sha512-BoclteE+MBOnfK0Qh21mQgrvYPy/v2k7CPTPufcNp1g1fsSvsF3Xv6K8I/grEjo3ZjNrgIvVxivoAqaQhSMlGA==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260627.2': - resolution: {integrity: sha512-0v1xRUgREzDAaNjaKtHuX5jEHVmY/MC5YR/rvSTNSYbqtg3vnUvafimRpyInXwMq399a9K6SwW2omIOfYeNJmQ==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260628.1': + resolution: {integrity: sha512-LKNKDoTnM8aacpbt1u8kJR1feXpBuLlvKKbVt0RYBL4j1OA148TXKjLtbVu37I0lcVxjqERYuAybpvut2xq31w==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260627.2': - resolution: {integrity: sha512-kXsG81vUZxV4gjKfJP/Nx3mJISG9ijzQmXamDbDgPzndzpmD0g+RyzEF+s6RH5AzFAc3nuGcg3LQWY2QThl67w==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260628.1': + resolution: {integrity: sha512-XUGCYlDAfeA4PIm7ZSZtVHmvffVoMct0LhTA/CoALhSQFnFnJdipOfsZghSyU6TCpTuzBoOhWCjBufrQC23xOQ==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260627.2': - resolution: {integrity: sha512-+V3qtCz+L1d6xN1mFFHohzDnpHlPCLlOfZS11FE7Kjz/qfMViBjQwCAAtTlBT+GfZKj41nsQ5ybRqo2DVC1sMg==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260628.1': + resolution: {integrity: sha512-rJMZ+YaRv9XybOZBYAsJt7x/K2IWmX9bgRatHobl0wwkKmfKd3giNnRXcDwOqYeCaWzunCbUhAirUtuUprRcnQ==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260627.2': - resolution: {integrity: sha512-kJlusQpaCY5IxejXa5jcVUXu6IfLtIuK2+CWKvaFD3lqNhvt4OR3+1KOxAleaxHdvEc4fWMr0mrF7MIAmDXoAg==} + '@typescript/native-preview@7.0.0-dev.20260628.1': + resolution: {integrity: sha512-359WmBk3vA/bJxfeWyLbFeeejmky7Wssc8HMu0Iabu490WJLj/FqkDC51V65yuDp+anMAEkgeKO43fj6pMb/ZA==} engines: {node: '>=16.20.0'} hasBin: true @@ -2905,36 +2925,36 @@ snapshots: '@typescript-eslint/types@8.62.0': {} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260627.2': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260628.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260627.2': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260628.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260627.2': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260628.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260627.2': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260628.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260627.2': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260628.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260627.2': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260628.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260627.2': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260628.1': optional: true - '@typescript/native-preview@7.0.0-dev.20260627.2': + '@typescript/native-preview@7.0.0-dev.20260628.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260627.2 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260627.2 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260627.2 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260627.2 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260627.2 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260627.2 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260627.2 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260628.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260628.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260628.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260628.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260628.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260628.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260628.1 '@vitest/coverage-v8@4.1.9(vitest@4.1.9)': dependencies: