diff --git a/.changeset/eight-pugs-remember.md b/.changeset/eight-pugs-remember.md new file mode 100644 index 0000000000..e2493a927a --- /dev/null +++ b/.changeset/eight-pugs-remember.md @@ -0,0 +1,7 @@ +--- +"@definitelytyped/publisher": patch +"@definitelytyped/retag": patch +"@definitelytyped/utils": patch +--- + +Publish old versions without touching latest tag diff --git a/packages/publisher/package.json b/packages/publisher/package.json index cc5f8c9753..e56ac5c0c1 100644 --- a/packages/publisher/package.json +++ b/packages/publisher/package.json @@ -10,6 +10,7 @@ "@definitelytyped/header-parser": "workspace:*", "@definitelytyped/retag": "workspace:*", "@definitelytyped/utils": "workspace:*", + "libnpmpublish": "^9.0.3", "longjohn": "^0.2.12", "pacote": "^17.0.4", "semver": "^7.5.4", @@ -17,6 +18,8 @@ "yargs": "^17.7.2" }, "devDependencies": { + "@npm/types": "^1.0.2", + "@types/libnpmpublish": "^4.0.3", "@types/pacote": "^11.1.8", "@types/semver": "^7.5.5", "@types/yargs": "^17.0.31" diff --git a/packages/publisher/src/calculate-versions.ts b/packages/publisher/src/calculate-versions.ts index 8dc219b4a6..6aef3c25f3 100644 --- a/packages/publisher/src/calculate-versions.ts +++ b/packages/publisher/src/calculate-versions.ts @@ -44,9 +44,7 @@ async function computeAndSaveChangedPackages( ): Promise { const cp = await computeChangedPackages(allPackages, log); const json: ChangedPackagesJson = { - changedTypings: cp.changedTypings.map( - ({ pkg: { id }, version, latestVersion }): ChangedTypingJson => ({ id, version, latestVersion }), - ), + changedTypings: cp.changedTypings.map(({ pkg: { id }, version }): ChangedTypingJson => ({ id, version })), changedNotNeededPackages: cp.changedNotNeededPackages.map((p) => p.typesDirectoryName), }; await writeDataFile(versionsFilename, json); @@ -80,10 +78,7 @@ async function computeChangedPackages(allPackages: AllPackages, log: LoggerWithE : reason; }); } - const latestVersion = pkg.isLatest - ? undefined - : (await fetchTypesPackageVersionInfo(await allPackages.getLatest(pkg), /*publish*/ true)).version; - return { pkg, version, latestVersion }; + return { pkg, version }; } return undefined; }); diff --git a/packages/publisher/src/generate-packages.ts b/packages/publisher/src/generate-packages.ts index f9bd0b0a78..3317134756 100644 --- a/packages/publisher/src/generate-packages.ts +++ b/packages/publisher/src/generate-packages.ts @@ -23,7 +23,6 @@ import { nAtATime, writeFile, writeLog, - writeTgz, } from "@definitelytyped/utils"; import * as pacote from "pacote"; import { defaultLocalOptions } from "./lib/common"; @@ -62,7 +61,7 @@ export default async function generatePackages(dt: FS, changedPackages: ChangedP await nAtATime(10, changedPackages.changedTypings, async ({ pkg, version }) => { await generateTypingPackage(pkg, version, dt); if (tgz) { - await writeTgz(outputDirectory(pkg), `${outputDirectory(pkg)}.tgz`); + await pacote.tarball.file(outputDirectory(pkg), `${outputDirectory(pkg)}.tgz`); } log(` * ${pkg.desc}`); }); diff --git a/packages/publisher/src/lib/package-publisher.ts b/packages/publisher/src/lib/package-publisher.ts index a66d7f6ec3..338e8ea873 100644 --- a/packages/publisher/src/lib/package-publisher.ts +++ b/packages/publisher/src/lib/package-publisher.ts @@ -1,42 +1,46 @@ -import assert = require("assert"); -import { Logger, joinPaths, readFileAndWarn, NpmPublishClient } from "@definitelytyped/utils"; +import { Logger, NpmPublishClient } from "@definitelytyped/utils"; import { NotNeededPackage, AnyPackage } from "@definitelytyped/definitions-parser"; -import { updateTypeScriptVersionTags, updateLatestTag } from "@definitelytyped/retag"; +import { updateTypeScriptVersionTags } from "@definitelytyped/retag"; +import * as libpub from "libnpmpublish"; +import * as pacote from "pacote"; import { ChangedTyping } from "./versions"; import { outputDirectory } from "../util/util"; export async function publishTypingsPackage( client: NpmPublishClient, changedTyping: ChangedTyping, + token: string, dry: boolean, log: Logger, ): Promise { - const { pkg, version, latestVersion } = changedTyping; - await common(client, pkg, log, dry); + const { pkg, version } = changedTyping; + await common(pkg, token, dry); if (pkg.isLatest) { await updateTypeScriptVersionTags(pkg, version, client, log, dry); } - assert((latestVersion === undefined) === pkg.isLatest); - if (latestVersion !== undefined) { - // If this is an older version of the package, we still update tags for the *latest*. - // NPM will update "latest" even if we are publishing an older version of a package (https://github.com/npm/npm/issues/6778), - // so we must undo that by re-tagging latest. - await updateLatestTag(pkg.name, latestVersion, client, log, dry); - } } export async function publishNotNeededPackage( - client: NpmPublishClient, pkg: NotNeededPackage, + token: string, dry: boolean, log: Logger, ): Promise { log(`Deprecating ${pkg.name}`); - await common(client, pkg, log, dry); + await common(pkg, token, dry); } -async function common(client: NpmPublishClient, pkg: AnyPackage, log: Logger, dry: boolean): Promise { +async function common(pkg: AnyPackage, token: string, dry: boolean): Promise { const packageDir = outputDirectory(pkg); - const packageJson = await readFileAndWarn("generate", joinPaths(packageDir, "package.json")); - await client.publish(packageDir, packageJson, dry, log); + const manifest = await pacote.manifest(packageDir).catch((reason) => { + throw reason.code === "ENOENT" ? new Error("Run generate first!", { cause: reason }) : reason; + }); + const tarData = await pacote.tarball(packageDir); + // Make sure we never assign the latest tag to an old version. + if (!dry) + await libpub.publish(manifest ? { ...manifest, bundledDependencies: undefined } : manifest, tarData, { + defaultTag: pkg.isLatest ? "latest" : "", + access: "public", + token, + }); } diff --git a/packages/publisher/src/lib/versions.ts b/packages/publisher/src/lib/versions.ts index 5f1123e0b5..1155fc6c3d 100644 --- a/packages/publisher/src/lib/versions.ts +++ b/packages/publisher/src/lib/versions.ts @@ -13,8 +13,6 @@ export interface ChangedTyping { readonly pkg: TypingsData; /** This is the version to be published, meaning it's the version that doesn't exist yet. */ readonly version: string; - /** For a non-latest version, this is the latest version; publishing an old version updates the 'latest' tag and we want to change it back. */ - readonly latestVersion: string | undefined; } export interface ChangedPackagesJson { @@ -26,7 +24,6 @@ export interface ChangedPackagesJson { export interface ChangedTypingJson { readonly id: PackageId; readonly version: string; - readonly latestVersion?: string; } export interface ChangedPackages { @@ -38,10 +35,9 @@ export async function readChangedPackages(allPackages: AllPackages): Promise ({ + json.changedTypings.map(async ({ id, version }) => ({ pkg: await allPackages.getTypingsData(id), version, - latestVersion, })), ), changedNotNeededPackages: json.changedNotNeededPackages.map((id) => diff --git a/packages/publisher/src/publish-packages.ts b/packages/publisher/src/publish-packages.ts index ce70cf80da..75b30dbfca 100644 --- a/packages/publisher/src/publish-packages.ts +++ b/packages/publisher/src/publish-packages.ts @@ -46,12 +46,13 @@ export default async function publishPackages( log("=== Publishing packages ==="); } - const client = await NpmPublishClient.create(await getSecret(Secret.NPM_TYPES_TOKEN), undefined); + const token = await getSecret(Secret.NPM_TYPES_TOKEN); + const client = new NpmPublishClient(token); for (const cp of changedPackages.changedTypings) { log(`Publishing ${cp.pkg.desc}...`); - await publishTypingsPackage(client, cp, dry, log); + await publishTypingsPackage(client, cp, token, dry, log); const commits = (await queryGithub( `repos/DefinitelyTyped/DefinitelyTyped/commits?path=types%2f${cp.pkg.subDirectoryPath}`, @@ -116,7 +117,7 @@ export default async function publishPackages( for (const n of changedPackages.changedNotNeededPackages) { const target = await skipBadPublishes(n, log); - await publishNotNeededPackage(client, target, dry, log); + await publishNotNeededPackage(target, token, dry, log); } await writeLog("publishing.md", logResult()); diff --git a/packages/publisher/src/publish-registry.ts b/packages/publisher/src/publish-registry.ts index 836bc4c6be..f8682c20fb 100644 --- a/packages/publisher/src/publish-registry.ts +++ b/packages/publisher/src/publish-registry.ts @@ -30,6 +30,8 @@ import { cacheDir, isObject, } from "@definitelytyped/utils"; +import { PackageJson } from "@npm/types"; +import * as libpub from "libnpmpublish"; import * as pacote from "pacote"; import * as semver from "semver"; // @ts-ignore @@ -74,17 +76,16 @@ export default async function publishRegistry(dt: FS, allPackages: AllPackages, const token = process.env.NPM_TOKEN!; - const publishClient = () => NpmPublishClient.create(token, { defaultTag: "next" }); if (maxVersion !== latestVersion) { // There was an error in the last publish and types-registry wasn't validated. // This may have just been due to a timeout, so test if types-registry@next is a subset of the one we're about to publish. // If so, we should just update it to "latest" now. log("Old version of types-registry was never tagged latest, so updating"); await validateIsSubset(readNotNeededPackages(dt), log); - await (await publishClient()).tag(typesRegistry, maxVersion, "latest", dry, log); + await new NpmPublishClient(token).tag(typesRegistry, maxVersion, "latest", dry, log); } else if (latestContentHash !== newContentHash) { log("New packages have been added, so publishing a new registry."); - await publish(await publishClient(), typesRegistry, packageJson, newVersion, dry, log); + await publish(new NpmPublishClient(token), packageJson, token, dry, log); } else { log("No new packages published, so no need to publish new registry."); // Just making sure... @@ -115,13 +116,13 @@ async function generate(registry: string, packageJson: {}): Promise { async function publish( client: NpmPublishClient, - packageName: string, - packageJson: {}, - version: string, + packageJson: PackageJson, + token: string, dry: boolean, log: Logger, ): Promise { - await client.publish(registryOutputPath, packageJson, dry, log); + const tarData = await pacote.tarball(registryOutputPath); + if (!dry) await libpub.publish(packageJson, tarData, { defaultTag: "next", access: "public", token }); // Sleep for 60 seconds to let NPM update. if (dry) { log("(dry) Skipping 60 second sleep..."); @@ -131,7 +132,7 @@ async function publish( } // Don't set it as "latest" until *after* it's been validated. await validate(log); - await client.tag(packageName, version, "latest", dry, log); + await client.tag(packageJson.name, packageJson.version, "latest", dry, log); } async function installForValidate(log: Logger): Promise { @@ -209,7 +210,7 @@ function assertJsonNewer(newer: { [s: string]: any }, older: { [s: string]: any } } -function generatePackageJson(name: string, version: string, typesPublisherContentHash: string): object { +function generatePackageJson(name: string, version: string, typesPublisherContentHash: string): PackageJson { const json = { name, version, diff --git a/packages/publisher/test/package-publisher.test.ts b/packages/publisher/test/package-publisher.test.ts new file mode 100644 index 0000000000..7c7e72a442 --- /dev/null +++ b/packages/publisher/test/package-publisher.test.ts @@ -0,0 +1,49 @@ +import { NotNeededPackage, TypingsData, createMockDT } from "@definitelytyped/definitions-parser"; +import * as libpub from "libnpmpublish"; +import { publishNotNeededPackage, publishTypingsPackage } from "../src/lib/package-publisher"; + +jest.mock("libnpmpublish"); +jest.mock("pacote", () => ({ async manifest() {}, async tarball() {} })); + +const client = { async tag() {} }; + +const dt = createMockDT(); + +const latestVersion = { + pkg: new TypingsData(dt.fs, { header: { name: "@types/some-package" } } as never, /*isLatest*/ true), + version: "1.2.3", +}; +const oldVersion = { + pkg: new TypingsData(dt.fs, { header: { name: "@types/some-package" } } as never, /*isLatest*/ false), + version: "1.2.3", +}; +const notNeeded = new NotNeededPackage("not-needed", "not-needed", "1.2.3"); + +function log() {} + +test("Latest version gets latest tag", async () => { + await publishTypingsPackage(client as never, latestVersion, /*token*/ "", /*dry*/ false, log); + expect(libpub.publish).toHaveBeenLastCalledWith(/*manifest*/ undefined, /*tarData*/ undefined, { + defaultTag: "latest", + access: "public", + token: "", + }); +}); + +test("Publishing old versions doesn't change the latest tag", async () => { + await publishTypingsPackage(client as never, oldVersion, /*token*/ "", /*dry*/ false, log); + expect(libpub.publish).toHaveBeenLastCalledWith(/*manifest*/ undefined, /*tarData*/ undefined, { + defaultTag: "", + access: "public", + token: "", + }); +}); + +test("Not-needed package gets latest tag", async () => { + await publishNotNeededPackage(notNeeded, /*token*/ "", /*dry*/ false, log); + expect(libpub.publish).toHaveBeenLastCalledWith(/*manifest*/ undefined, /*tarData*/ undefined, { + defaultTag: "latest", + access: "public", + token: "", + }); +}); diff --git a/packages/retag/src/index.ts b/packages/retag/src/index.ts index 655aeb61cb..8b76dd4706 100644 --- a/packages/retag/src/index.ts +++ b/packages/retag/src/index.ts @@ -48,19 +48,17 @@ async function tag(dry: boolean, definitelyTypedPath: string, name?: string) { const dt = await getDefinitelyTyped(options, log); const token = process.env.NPM_TOKEN as string; - const publishClient = await NpmPublishClient.create(token, {}); + const publishClient = new NpmPublishClient(token); if (name) { const pkg = await AllPackages.readSingle(dt, name); const version = await getLatestTypingVersion(pkg); await updateTypeScriptVersionTags(pkg, version, publishClient, consoleLogger.info, dry); - await updateLatestTag(pkg.name, version, publishClient, consoleLogger.info, dry); } else { const allPackages = AllPackages.fromFS(dt); await nAtATime(5, await allPackages.allLatestTypings(), async (pkg) => { // Only update tags for the latest version of the package. const version = await getLatestTypingVersion(pkg); await updateTypeScriptVersionTags(pkg, version, publishClient, consoleLogger.info, dry); - await updateLatestTag(pkg.name, version, publishClient, consoleLogger.info, dry); }); } // Don't tag notNeeded packages @@ -85,21 +83,6 @@ export async function updateTypeScriptVersionTags( } } -export async function updateLatestTag( - fullName: string, - version: string, - client: NpmPublishClient, - log: Logger, - dry: boolean, -): Promise { - log(` but tag ${fullName}@${version} as "latest"`); - if (dry) { - log(' (dry) Skip move "latest" back to newest version'); - } else { - await client.tag(fullName, version, "latest", dry, log); - } -} - export async function getLatestTypingVersion(pkg: TypingsData): Promise { return (await fetchTypesPackageVersionInfo(pkg, /*publish*/ false)).version; } diff --git a/packages/utils/.gitignore b/packages/utils/.gitignore index 978c880595..98d8a5a630 100644 --- a/packages/utils/.gitignore +++ b/packages/utils/.gitignore @@ -1,2 +1 @@ logs -test/data/pack.tgz \ No newline at end of file diff --git a/packages/utils/package.json b/packages/utils/package.json index 323142a7f6..b523e4fb97 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -25,13 +25,11 @@ "@types/node": "^16.18.61", "charm": "^1.0.2", "minimatch": "^9.0.3", - "tar": "^6.2.0", "tar-stream": "^3.1.6", "which": "^4.0.0" }, "devDependencies": { "@types/charm": "^1.0.6", - "@types/tar": "^6.1.9", "@types/tar-stream": "^3.1.3", "@types/which": "^3.0.2", "@qiwi/npm-types": "^1.0.3" diff --git a/packages/utils/src/io.ts b/packages/utils/src/io.ts index 2d1365396b..0f11704e18 100644 --- a/packages/utils/src/io.ts +++ b/packages/utils/src/io.ts @@ -1,8 +1,6 @@ import fs from "fs"; -import { Pack } from "tar"; import tarStream from "tar-stream"; import https, { Agent, request } from "https"; -import { resolve, sep } from "path"; import zlib from "zlib"; import { request as httpRequest } from "http"; import { Readable as ReadableStream } from "stream"; @@ -90,12 +88,6 @@ export function stringOfStream(stream: NodeJS.ReadableStream, description: strin }); } -export function streamDone(stream: NodeJS.WritableStream): Promise { - return new Promise((resolve, reject) => { - stream.on("error", reject).on("finish", resolve); - }); -} - type FetchOptions = https.RequestOptions & { readonly retries?: boolean | number; readonly body?: string; @@ -234,58 +226,3 @@ export function downloadAndExtractFile(url: string, log: LoggerWithErrors): Prom .on("error", rejectAndClearTimeout); }); } - -export function gzip(input: NodeJS.ReadableStream): NodeJS.ReadableStream { - return input.pipe(zlib.createGzip()); -} - -export function unGzip(input: NodeJS.ReadableStream): NodeJS.ReadableStream { - const output = zlib.createGunzip(); - input.pipe(output); - return output; -} - -export function writeTgz(inputDirectory: string, outFileName: string): Promise { - return new Promise((resolve, reject) => { - resolve(streamDone(createTgz(inputDirectory, reject).pipe(fs.createWriteStream(outFileName)))); - }); -} - -// To output this for testing: -// `require("./dist/io").createTgz("./src", err => { throw err }).pipe(fs.createWriteStream("foo.tgz"))` -export function createTgz(dir: string, onError: (error: Error) => void): NodeJS.ReadableStream { - return gzip(createTar(dir, onError)); -} - -function createTar(dir: string, onError: (error: Error) => void): NodeJS.ReadableStream { - const dirSegments = resolve(dir).split(sep); - const parentDir = dirSegments.slice(0, dirSegments.length - 1).join(sep); - const entryToAdd = dirSegments[dirSegments.length - 1]; - const packer = new Pack({ cwd: parentDir, filter: addDirectoryExecutablePermission }); - packer.on("error", onError); - const stream = packer.add(entryToAdd); - packer.end(); - // Shady, but minipass is compatible enough with ReadableStream for this use. - return stream as unknown as NodeJS.ReadableStream; -} - -/** - * Work around a bug where directories bundled on Windows do not have executable permission when extracted on Linux. - * https://github.com/npm/node-tar/issues/7#issuecomment-17572926 - */ -function addDirectoryExecutablePermission(_: string, stat: fs.Stats): boolean { - if (stat.isDirectory()) { - stat.mode = addExecutePermissionsFromReadPermissions(stat.mode); - } - return true; -} - -function addExecutePermissionsFromReadPermissions(mode: number): number { - // Constant that gives execute permissions to owner, group, and others. "+x" - const allExecutePermissions = 0o111; - // Moves the bits for read permissions into the place for execute permissions. - // In other words, a component will have execute permissions if it has read permissions. - const readPermissionsAsExecutePermissions = (mode >>> 2) & allExecutePermissions; - // Add these additional execute permissions to the mode. - return mode | readPermissionsAsExecutePermissions; -} diff --git a/packages/utils/src/npm.ts b/packages/utils/src/npm.ts index 9af4b964f9..682eb3b02b 100644 --- a/packages/utils/src/npm.ts +++ b/packages/utils/src/npm.ts @@ -1,57 +1,15 @@ import * as os from "os"; import process from "process"; -import fs from "fs"; import RegClient from "@qiwi/npm-registry-client"; -import { resolve as resolveUrl } from "url"; import { joinPaths } from "./fs"; import { Logger } from "./logging"; -import { createTgz } from "./io"; - -export const npmRegistryHostName = "registry.npmjs.org"; -export const npmRegistry = `https://${npmRegistryHostName}/`; export const cacheDir = joinPaths(process.env.GITHUB_ACTIONS ? joinPaths(__dirname, "../../..") : os.tmpdir(), "cache"); -type NeedToFixNpmRegistryClientTypings = any; - export class NpmPublishClient { - static async create(token: string, config?: NeedToFixNpmRegistryClientTypings): Promise { - return new NpmPublishClient(new RegClient(config), { token }, npmRegistry); - } - - private constructor( - private readonly client: RegClient, - private readonly auth: NeedToFixNpmRegistryClientTypings, - private readonly registry: string, - ) {} - - async publish(publishedDirectory: string, packageJson: {}, dry: boolean, log: Logger): Promise { - const readme = await fs.promises.readFile(joinPaths(publishedDirectory, "README.md")); + private readonly client = new RegClient(); - return new Promise((resolve, reject) => { - const body = createTgz(publishedDirectory, reject); - const metadata = { readme, ...packageJson }; - if (dry) { - log(`(dry) Skip publish of ${publishedDirectory} to ${this.registry}`); - } - resolve( - dry - ? undefined - : promisifyVoid((cb) => { - this.client.publish( - this.registry, - { - access: "public", - auth: this.auth, - metadata: metadata as NeedToFixNpmRegistryClientTypings, - body: body as NeedToFixNpmRegistryClientTypings, - }, - cb, - ); - }), - ); - }); - } + constructor(private readonly token: string) {} tag(packageName: string, version: string, distTag: string, dry: boolean, log: Logger): Promise { if (dry) { @@ -59,19 +17,22 @@ export class NpmPublishClient { return Promise.resolve(); } return promisifyVoid((cb) => { - this.client.distTags.add(this.registry, { package: packageName, version, distTag, auth: this.auth }, cb); + this.client.distTags.add( + "https://registry.npmjs.org", + { package: packageName, version, distTag, auth: { token: this.token } }, + cb, + ); }); } deprecate(packageName: string, version: string, message: string): Promise { - const url = resolveUrl(npmRegistry, packageName); const params = { message, version, - auth: this.auth, + auth: { token: this.token }, }; return promisifyVoid((cb) => { - this.client.deprecate(url, params, cb); + this.client.deprecate(`https://registry.npmjs.org/${packageName}`, params, cb); }); } } diff --git a/packages/utils/test/data/pack/test.txt b/packages/utils/test/data/pack/test.txt deleted file mode 100644 index 84362ca046..0000000000 --- a/packages/utils/test/data/pack/test.txt +++ /dev/null @@ -1 +0,0 @@ -Test file \ No newline at end of file diff --git a/packages/utils/test/io.test.ts b/packages/utils/test/io.test.ts deleted file mode 100644 index 3b181828e0..0000000000 --- a/packages/utils/test/io.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import path from "path"; -import fs from "fs"; -import { list } from "tar"; -import { createTgz } from "../src/io"; - -describe("io", () => { - describe(createTgz, () => { - it("packs a directory", (done) => { - const dir = path.join(__dirname, "data", "pack"); - const archivePath = path.join(__dirname, "data", "pack.tgz"); - - createTgz(dir, (err) => { - throw err; - }) - .pipe(fs.createWriteStream(archivePath)) - .on("finish", async () => { - expect(fs.existsSync(archivePath)).toBe(true); - const entries: string[] = []; - await list({ file: archivePath, onentry: (e) => entries.push(e.path) }); - expect(entries[0]).toBe("pack/"); - expect(entries[1]).toBe("pack/test.txt"); - done(); - }); - }); - }); -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e1863d54d7..0cc3de1c51 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -316,6 +316,9 @@ importers: '@definitelytyped/utils': specifier: workspace:* version: link:../utils + libnpmpublish: + specifier: ^9.0.3 + version: 9.0.3 longjohn: specifier: ^0.2.12 version: 0.2.12 @@ -332,6 +335,12 @@ importers: specifier: ^17.7.2 version: 17.7.2 devDependencies: + '@npm/types': + specifier: ^1.0.2 + version: 1.0.2 + '@types/libnpmpublish': + specifier: ^4.0.3 + version: 4.0.6 '@types/pacote': specifier: ^11.1.8 version: 11.1.8 @@ -431,9 +440,6 @@ importers: minimatch: specifier: ^9.0.3 version: 9.0.3 - tar: - specifier: ^6.2.0 - version: 6.2.0 tar-stream: specifier: ^3.1.6 version: 3.1.6 @@ -447,9 +453,6 @@ importers: '@types/charm': specifier: ^1.0.6 version: 1.0.6 - '@types/tar': - specifier: ^6.1.9 - version: 6.1.9 '@types/tar-stream': specifier: ^3.1.3 version: 3.1.3 @@ -1404,6 +1407,10 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@npm/types@1.0.2: + resolution: {integrity: sha512-KXZccTDEnWqNrrx6JjpJKU/wJvNeg9BDgjS0XhmlZab7br921HtyVbsYzJr4L+xIvjdJ20Wh9dgxgCI2a5CEQw==} + dev: true + /@npmcli/agent@2.2.0: resolution: {integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==} engines: {node: ^16.14.0 || >=18.0.0} @@ -1944,6 +1951,14 @@ packages: /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + /@types/libnpmpublish@4.0.6: + resolution: {integrity: sha512-xI99EEgpr1R0hpLAKb52QbBYv8ZZa9FDiZS7LEVE6RevjkQHF3BflPR7Mo2F8yxMnqP6eoPkWE0bnWvDC/sA9A==} + dependencies: + '@npm/types': 1.0.2 + '@types/node-fetch': 2.6.9 + '@types/npm-registry-fetch': 8.0.7 + dev: true + /@types/minimist@1.2.5: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: true @@ -2025,13 +2040,6 @@ packages: '@types/node': 16.18.61 dev: true - /@types/tar@6.1.9: - resolution: {integrity: sha512-T3+O+OQd9cdGmOXuKQY9+B0ceZHRlGVPQ7M5QZqkaPyP/vWnxPXM2aCegq8GP/n1n9dBfq2EBUqCSKKjQAVOPA==} - dependencies: - '@types/node': 16.18.61 - minipass: 4.2.8 - dev: true - /@types/tmp@0.2.6: resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==} dev: true @@ -2729,6 +2737,11 @@ packages: engines: {node: '>=8'} dev: true + /ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + dev: false + /cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} dev: true @@ -4969,7 +4982,7 @@ packages: pretty-ms: 8.0.0 strip-json-comments: 5.0.1 summary: 2.1.0 - typescript: 5.3.3 + typescript: 5.2.2 zod: 3.22.4 zod-validation-error: 2.1.0(zod@3.22.4) transitivePeerDependencies: @@ -4996,6 +5009,22 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 + /libnpmpublish@9.0.3: + resolution: {integrity: sha512-XoF0QgT1Ph9RMBfTwiwZeRN4Rs5t4w1POaRxaoVoWCMUqysswwlAPu3ZZJDNbh7asXBWXcXTJziDWkInhpbiBg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + ci-info: 4.0.0 + normalize-package-data: 6.0.0 + npm-package-arg: 11.0.1 + npm-registry-fetch: 16.1.0 + proc-log: 3.0.0 + semver: 7.5.4 + sigstore: 2.1.0 + ssri: 10.0.5 + transitivePeerDependencies: + - supports-color + dev: false + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true @@ -5312,11 +5341,6 @@ packages: yallist: 4.0.0 dev: false - /minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - dev: true - /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} @@ -6975,6 +6999,7 @@ packages: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true + dev: false /typescript@5.4.0-dev.20231212: resolution: {integrity: sha512-h3fO+IfEsmtTuje/ZBrinHekd9rob7fO0QJFxedSXrd8vy/aJeyqjv4PNZpW2peM/jxNaexpp1wC6eTjfrtEwg==}