diff --git a/biome.json b/biome.json index 9b9e487..563a508 100644 --- a/biome.json +++ b/biome.json @@ -1,13 +1,21 @@ { - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", - "organizeImports": { "enabled": true }, + "$schema": "https://biomejs.dev/schemas/2.4.12/schema.json", + "assist": { "actions": { "source": { "organizeImports": "on" } } }, "vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true }, "files": { - "ignore": ["dist", "node_modules", ".turbo", "coverage", "research", ".scratch"] + "includes": [ + "**", + "!**/dist", + "!**/node_modules", + "!**/.turbo", + "!**/coverage", + "!**/research", + "!**/.scratch" + ] }, "linter": { "enabled": true, @@ -17,17 +25,7 @@ "useImportType": "error", "useNodejsImportProtocol": "error", "useConst": "error", - "noNonNullAssertion": "error" - }, - "correctness": { - "noUnusedImports": "error", - "noUnusedVariables": "error" - }, - "suspicious": { - "noConsoleLog": "error", - "noExplicitAny": "error" - }, - "nursery": { + "noNonNullAssertion": "error", "noRestrictedImports": { "level": "error", "options": { @@ -41,7 +39,16 @@ } } } - } + }, + "correctness": { + "noUnusedImports": "error", + "noUnusedVariables": "error" + }, + "suspicious": { + "noExplicitAny": "error", + "noConsole": "error" + }, + "nursery": {} } }, "formatter": { @@ -60,17 +67,16 @@ }, "overrides": [ { - "include": ["**/test/**", "**/*.test.ts", "**/scripts/**", "examples/**"], + "includes": ["**/test/**", "**/*.test.ts", "**/scripts/**", "**/examples/**"], "linter": { "rules": { - "nursery": { - "noRestrictedImports": "off" - }, + "nursery": {}, "suspicious": { - "noConsoleLog": "off" + "noConsole": "off" }, "style": { - "noNonNullAssertion": "off" + "noNonNullAssertion": "off", + "noRestrictedImports": "off" } } } diff --git a/package.json b/package.json index 0c2752d..1f9d540 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "release": "changeset publish" }, "devDependencies": { - "@biomejs/biome": "^1.9.4", + "@biomejs/biome": "^2.4.12", "@changesets/cli": "^2.27.11", "turbo": "^2.3.3", "typescript": "^5.7.3" diff --git a/packages/passmint/package.json b/packages/passmint/package.json index c3af7ce..d6fd0be 100644 --- a/packages/passmint/package.json +++ b/packages/passmint/package.json @@ -12,7 +12,11 @@ "default": "./dist/index.js" } }, - "files": ["dist", "LICENSE", "README.md"], + "files": [ + "dist", + "LICENSE", + "README.md" + ], "sideEffects": false, "scripts": { "build": "tsdown", diff --git a/packages/passmint/src/apple/render.ts b/packages/passmint/src/apple/render.ts index c668b6e..e31a061 100644 --- a/packages/passmint/src/apple/render.ts +++ b/packages/passmint/src/apple/render.ts @@ -1,9 +1,9 @@ import { PassmintRenderError } from '../errors' import type { Barcode } from '../schema/barcodes' import type { Field } from '../schema/fields' -import type { ImageSource, ImageTriple, Images } from '../schema/images' -import { defaultValue, translations } from '../schema/localization' +import type { ImageSource, Images, ImageTriple } from '../schema/images' import type { LocalizedString } from '../schema/localization' +import { defaultValue, translations } from '../schema/localization' import type { PassInput } from '../schema/pass' import { encodeStringsFile } from './strings' diff --git a/packages/passmint/src/cms/index.ts b/packages/passmint/src/cms/index.ts index c419b95..af8636b 100644 --- a/packages/passmint/src/cms/index.ts +++ b/packages/passmint/src/cms/index.ts @@ -1,14 +1,14 @@ -export { pemToDer } from './pem' -export type { PemDecodeOptions } from './pem' export { - sortSetOfByBytes, - encodeLength, buildSetOf, + encodeLength, + sortSetOfByBytes, toArrayBuffer, } from './der' -export { SigningMaterial } from './material' export type { - SigningMaterialFromPemInput, SigningMaterialFromParsedInput, + SigningMaterialFromPemInput, } from './material' +export { SigningMaterial } from './material' +export type { PemDecodeOptions } from './pem' +export { pemToDer } from './pem' export { signManifest } from './sign' diff --git a/packages/passmint/src/cms/sign.ts b/packages/passmint/src/cms/sign.ts index d511575..69a6d16 100644 --- a/packages/passmint/src/cms/sign.ts +++ b/packages/passmint/src/cms/sign.ts @@ -1,23 +1,23 @@ import { Attribute, - CMSVersion, CertificateChoices, CertificateSet, + CMSVersion, ContentInfo, DigestAlgorithmIdentifier, DigestAlgorithmIdentifiers, EncapsulatedContentInfo, IssuerAndSerialNumber, - SignatureAlgorithmIdentifier, - SignedData, - SignerIdentifier, - SignerInfo, - SignerInfos, id_contentType, id_data, id_messageDigest, id_signedData, id_signingTime, + SignatureAlgorithmIdentifier, + SignedData, + SignerIdentifier, + SignerInfo, + SignerInfos, } from '@peculiar/asn1-cms' import { AsnConvert, diff --git a/packages/passmint/src/google/index.ts b/packages/passmint/src/google/index.ts index c0a3388..4175aef 100644 --- a/packages/passmint/src/google/index.ts +++ b/packages/passmint/src/google/index.ts @@ -1,10 +1,10 @@ -export { GoogleSigningMaterial } from './material' +export type { GoogleSaveJwtClaims, GoogleSavePayload } from './jwt' +export { base64url, base64urlJson, signSaveJwt } from './jwt' export type { - GoogleSigningMaterialFromServiceAccountInput, GoogleSigningMaterialFromParsedInput, + GoogleSigningMaterialFromServiceAccountInput, } from './material' -export { signSaveJwt, base64url, base64urlJson } from './jwt' -export type { GoogleSaveJwtClaims, GoogleSavePayload } from './jwt' -export { renderGooglePayload } from './render' +export { GoogleSigningMaterial } from './material' export type { GoogleRenderOptions } from './render' +export { renderGooglePayload } from './render' export { buildSaveLink } from './save-link' diff --git a/packages/passmint/src/google/render.ts b/packages/passmint/src/google/render.ts index bfcfaea..13b7829 100644 --- a/packages/passmint/src/google/render.ts +++ b/packages/passmint/src/google/render.ts @@ -2,8 +2,8 @@ import { PassmintGoogleError, PassmintRenderError } from '../errors' import type { Barcode } from '../schema/barcodes' import type { Field } from '../schema/fields' import type { ImageSource } from '../schema/images' -import { defaultValue, translations } from '../schema/localization' import type { LocalizedString } from '../schema/localization' +import { defaultValue, translations } from '../schema/localization' import type { Location } from '../schema/locations' import type { PassInput } from '../schema/pass' import type { GoogleSavePayload } from './jwt' diff --git a/packages/passmint/src/index.ts b/packages/passmint/src/index.ts index a3600c9..54c6c97 100644 --- a/packages/passmint/src/index.ts +++ b/packages/passmint/src/index.ts @@ -1,85 +1,80 @@ export const VERSION: string = '0.0.0' +export type { ManifestResult } from './apple/manifest' +export { buildManifest } from './apple/manifest' +// --- Low-level Apple pipeline (for advanced use cases) --- +export { assemblePkpass } from './apple/pkpass' +export type { AppleRenderedPass } from './apple/render' +export { renderApplePass } from './apple/render' +export { encodeStringsFile, encodeUtf16BeWithBom } from './apple/strings' +export type { + SigningMaterialFromParsedInput, + SigningMaterialFromPemInput, +} from './cms' +// --- CMS signing (Apple .pkpass) --- +export { SigningMaterial, signManifest } from './cms' +export { MAX_PEM_LENGTH } from './cms/pem' +export type { + GoogleErrorCode, + PackagingErrorCode, + RenderErrorCode, + SchemaErrorCode, + SigningErrorCode, +} from './errors' // --- Errors --- export { PassmintError, - PassmintSchemaError, + PassmintGoogleError, + PassmintPackagingError, PassmintRenderError, + PassmintSchemaError, PassmintSigningError, - PassmintPackagingError, - PassmintGoogleError, } from './errors' export type { - SchemaErrorCode, - RenderErrorCode, - SigningErrorCode, - PackagingErrorCode, - GoogleErrorCode, -} from './errors' - -// --- The main facade --- -export { Pass, PassBuilder, SignedPass, DEFAULT_GOOGLE_JWT_EXPIRY_SECONDS } from './pass' -export type { GoogleSaveOptions } from './pass' - + GoogleRenderOptions, + GoogleSaveJwtClaims, + GoogleSavePayload, + GoogleSigningMaterialFromParsedInput, + GoogleSigningMaterialFromServiceAccountInput, +} from './google' // --- Google Wallet (JWT save-link) --- export { - GoogleSigningMaterial, - signSaveJwt, - renderGooglePayload, - buildSaveLink, base64url, base64urlJson, + buildSaveLink, + GoogleSigningMaterial, + renderGooglePayload, + signSaveJwt, } from './google' -export type { - GoogleSigningMaterialFromServiceAccountInput, - GoogleSigningMaterialFromParsedInput, - GoogleSaveJwtClaims, - GoogleSavePayload, - GoogleRenderOptions, -} from './google' - -// --- CMS signing (Apple .pkpass) --- -export { SigningMaterial, signManifest } from './cms' -export type { - SigningMaterialFromPemInput, - SigningMaterialFromParsedInput, -} from './cms' -export { MAX_PEM_LENGTH } from './cms/pem' - -// --- Low-level Apple pipeline (for advanced use cases) --- -export { assemblePkpass } from './apple/pkpass' -export { renderApplePass } from './apple/render' -export type { AppleRenderedPass } from './apple/render' -export { buildManifest } from './apple/manifest' -export type { ManifestResult } from './apple/manifest' -export { encodeStringsFile, encodeUtf16BeWithBom } from './apple/strings' -export { ZipAssembler } from './zip/assembler' - -// --- Schema + validation --- -export { parsePassInput, PassInputSchema } from './schema/index' +export type { GoogleSaveOptions } from './pass' +// --- The main facade --- +export { DEFAULT_GOOGLE_JWT_EXPIRY_SECONDS, Pass, PassBuilder, SignedPass } from './pass' export { MAX_IMAGE_BYTE_LENGTH } from './schema/images' export type { - PassInput, - PassStyle, + Barcode, + BarcodeFormat, + Beacon, BoardingPassInput, - EventTicketInput, - StoreCardInput, + Color, CouponInput, + DataDetector, + DateTimeStyle, + EventTicketInput, + Field, + FieldValue, GenericPassInput, - LocalizedString, - Color, ImageSource, - ImageTriple, Images, - Barcode, - BarcodeFormat, - Field, - FieldValue, - TextAlignment, - DateTimeStyle, - NumberStyle, - DataDetector, + ImageTriple, + LocalizedString, Location, - Beacon, + NumberStyle, + PassInput, + PassStyle, SemanticTags, + StoreCardInput, + TextAlignment, } from './schema/index' +// --- Schema + validation --- +export { PassInputSchema, parsePassInput } from './schema/index' +export { ZipAssembler } from './zip/assembler' diff --git a/packages/passmint/src/schema/index.ts b/packages/passmint/src/schema/index.ts index 51c4d4f..c23fc1d 100644 --- a/packages/passmint/src/schema/index.ts +++ b/packages/passmint/src/schema/index.ts @@ -2,30 +2,29 @@ import * as v from 'valibot' import { PassmintSchemaError } from '../errors' import { type PassInput, PassInputSchema } from './pass' -export { PassInputSchema } from './pass' -export type { - PassInput, - PassStyle, - BoardingPassInput, - EventTicketInput, - StoreCardInput, - CouponInput, - GenericPassInput, -} from './pass' - -export type { LocalizedString } from './localization' -export type { Color } from './colors' -export type { ImageSource, ImageTriple, Images } from './images' export type { Barcode, BarcodeFormat } from './barcodes' +export type { Color } from './colors' export type { + DataDetector, + DateTimeStyle, Field, FieldValue, - TextAlignment, - DateTimeStyle, NumberStyle, - DataDetector, + TextAlignment, } from './fields' -export type { Location, Beacon } from './locations' +export type { ImageSource, Images, ImageTriple } from './images' +export type { LocalizedString } from './localization' +export type { Beacon, Location } from './locations' +export type { + BoardingPassInput, + CouponInput, + EventTicketInput, + GenericPassInput, + PassInput, + PassStyle, + StoreCardInput, +} from './pass' +export { PassInputSchema } from './pass' export type { SemanticTags } from './semantic-tags' /** diff --git a/packages/passmint/test/schema/barcodes.test.ts b/packages/passmint/test/schema/barcodes.test.ts index 74b1b96..c5841d0 100644 --- a/packages/passmint/test/schema/barcodes.test.ts +++ b/packages/passmint/test/schema/barcodes.test.ts @@ -16,13 +16,17 @@ describe('BarcodeSchema', () => { expect(r.success).toBe(true) }) - it.each([['QR'], ['qrcode'], ['ean13'], ['upc_a'], [''], [null]])( - 'rejects format %s', - (format) => { - const r = v.safeParse(BarcodeSchema, { format, message: 'x' }) - expect(r.success).toBe(false) - }, - ) + it.each([ + ['QR'], + ['qrcode'], + ['ean13'], + ['upc_a'], + [''], + [null], + ])('rejects format %s', (format) => { + const r = v.safeParse(BarcodeSchema, { format, message: 'x' }) + expect(r.success).toBe(false) + }) it('accepts a full barcode with altText and encoding', () => { const r = v.safeParse(BarcodeSchema, { diff --git a/packages/passmint/test/schema/colors.test.ts b/packages/passmint/test/schema/colors.test.ts index 61490d1..59336a1 100644 --- a/packages/passmint/test/schema/colors.test.ts +++ b/packages/passmint/test/schema/colors.test.ts @@ -15,10 +15,15 @@ describe('ColorSchema', () => { expect(v.safeParse(ColorSchema, input).success).toBe(true) }) - it.each([[''], ['red'], ['rgb(255)'], ['rgba(0,0,0,0.5)'], ['#GG0000'], ['#FFFF'], ['#1234567']])( - 'rejects %s', - (input) => { - expect(v.safeParse(ColorSchema, input).success).toBe(false) - }, - ) + it.each([ + [''], + ['red'], + ['rgb(255)'], + ['rgba(0,0,0,0.5)'], + ['#GG0000'], + ['#FFFF'], + ['#1234567'], + ])('rejects %s', (input) => { + expect(v.safeParse(ColorSchema, input).success).toBe(false) + }) }) diff --git a/packages/passmint/test/schema/images.test.ts b/packages/passmint/test/schema/images.test.ts index 8be9eab..3cea575 100644 --- a/packages/passmint/test/schema/images.test.ts +++ b/packages/passmint/test/schema/images.test.ts @@ -2,8 +2,8 @@ import * as v from 'valibot' import { describe, expect, it } from 'vitest' import { ImageSourceSchema, - ImageTripleSchema, ImagesSchema, + ImageTripleSchema, MAX_IMAGE_BYTE_LENGTH, } from '../../src/schema/images' diff --git a/packages/passmint/test/schema/localization.test.ts b/packages/passmint/test/schema/localization.test.ts index 0d766e9..7310703 100644 --- a/packages/passmint/test/schema/localization.test.ts +++ b/packages/passmint/test/schema/localization.test.ts @@ -1,9 +1,9 @@ import * as v from 'valibot' import { describe, expect, it } from 'vitest' import { + defaultValue, LanguageTagSchema, LocalizedStringSchema, - defaultValue, translations, } from '../../src/schema/localization' diff --git a/packages/passmint/test/schema/pass.test.ts b/packages/passmint/test/schema/pass.test.ts index d4aef6f..cc0dca3 100644 --- a/packages/passmint/test/schema/pass.test.ts +++ b/packages/passmint/test/schema/pass.test.ts @@ -92,17 +92,20 @@ describe('parsePassInput — boarding pass', () => { ).toThrow(PassmintSchemaError) }) - it.each([['air'], ['train'], ['bus'], ['boat'], ['generic']])( - 'accepts transitType %s', - (transitType) => { - const pass = parsePassInput({ - style: 'boardingPass', - ...validBase, - transitType, - }) - expect(pass.style).toBe('boardingPass') - }, - ) + it.each([ + ['air'], + ['train'], + ['bus'], + ['boat'], + ['generic'], + ])('accepts transitType %s', (transitType) => { + const pass = parsePassInput({ + style: 'boardingPass', + ...validBase, + transitType, + }) + expect(pass.style).toBe('boardingPass') + }) it('rejects an invalid transitType', () => { expect(() => diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6559fa5..f87942c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: ^1.9.4 - version: 1.9.4 + specifier: ^2.4.12 + version: 2.4.12 '@changesets/cli': specifier: ^2.27.11 version: 2.30.0(@types/node@22.19.17) @@ -154,55 +154,55 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - '@biomejs/biome@1.9.4': - resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} + '@biomejs/biome@2.4.12': + resolution: {integrity: sha512-Rro7adQl3NLq/zJCIL98eElXKI8eEiBtoeu5TbXF/U3qbjuSc7Jb5rjUbeHHcquDWeSf3HnGP7XI5qGrlRk/pA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@1.9.4': - resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} + '@biomejs/cli-darwin-arm64@2.4.12': + resolution: {integrity: sha512-BnMU4Pc3ciEVteVpZ0BK33MLr7X57F5w1dwDLDn+/iy/yTrA4Q/N2yftidFtsA4vrDh0FMXDpacNV/Tl3fbmng==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@1.9.4': - resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} + '@biomejs/cli-darwin-x64@2.4.12': + resolution: {integrity: sha512-x9uJ0bI1rJsWICp3VH8w/5PnAVD3A7SqzDpbrfoUQX1QyWrK5jSU4fRLo/wSgGeplCivbxBRKmt5Xq4/nWvq8A==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@1.9.4': - resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} + '@biomejs/cli-linux-arm64-musl@2.4.12': + resolution: {integrity: sha512-FhfpkAAlKL6kwvcVap0Hgp4AhZmtd3YImg0kK1jd7C/aSoh4SfsB2f++yG1rU0lr8Y5MCFJrcSkmssiL9Xnnig==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@1.9.4': - resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} + '@biomejs/cli-linux-arm64@2.4.12': + resolution: {integrity: sha512-tOwuCuZZtKi1jVzbk/5nXmIsziOB6yqN8c9r9QM0EJYPU6DpQWf11uBOSCfFKKM4H3d9ZoarvlgMfbcuD051Pw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@1.9.4': - resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} + '@biomejs/cli-linux-x64-musl@2.4.12': + resolution: {integrity: sha512-dwTIgZrGutzhkQCuvHynCkyW6hJxUuyZqKKO0YNfaS2GUoRO+tOvxXZqZB6SkWAOdfZTzwaw8IEdUnIkHKHoew==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@1.9.4': - resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} + '@biomejs/cli-linux-x64@2.4.12': + resolution: {integrity: sha512-8pFeAnLU9QdW9jCIslB/v82bI0lhBmz2ZAKc8pVMFPO0t0wAHsoEkrUQUbMkIorTRIjbqyNZHA3lEXavsPWYSw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@1.9.4': - resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} + '@biomejs/cli-win32-arm64@2.4.12': + resolution: {integrity: sha512-B0DLnx0vA9ya/3v7XyCaP+/lCpnbWbMOfUFFve+xb5OxyYvdHaS55YsSddr228Y+JAFk58agCuZTsqNiw2a6ig==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@1.9.4': - resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} + '@biomejs/cli-win32-x64@2.4.12': + resolution: {integrity: sha512-yMckRzTyZ83hkk8iDFWswqSdU8tvZxspJKnYNh7JZr/zhZNOlzH13k4ecboU6MurKExCe2HUkH75pGI/O2JwGA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -2426,39 +2426,39 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@biomejs/biome@1.9.4': + '@biomejs/biome@2.4.12': optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.4 - '@biomejs/cli-darwin-x64': 1.9.4 - '@biomejs/cli-linux-arm64': 1.9.4 - '@biomejs/cli-linux-arm64-musl': 1.9.4 - '@biomejs/cli-linux-x64': 1.9.4 - '@biomejs/cli-linux-x64-musl': 1.9.4 - '@biomejs/cli-win32-arm64': 1.9.4 - '@biomejs/cli-win32-x64': 1.9.4 + '@biomejs/cli-darwin-arm64': 2.4.12 + '@biomejs/cli-darwin-x64': 2.4.12 + '@biomejs/cli-linux-arm64': 2.4.12 + '@biomejs/cli-linux-arm64-musl': 2.4.12 + '@biomejs/cli-linux-x64': 2.4.12 + '@biomejs/cli-linux-x64-musl': 2.4.12 + '@biomejs/cli-win32-arm64': 2.4.12 + '@biomejs/cli-win32-x64': 2.4.12 - '@biomejs/cli-darwin-arm64@1.9.4': + '@biomejs/cli-darwin-arm64@2.4.12': optional: true - '@biomejs/cli-darwin-x64@1.9.4': + '@biomejs/cli-darwin-x64@2.4.12': optional: true - '@biomejs/cli-linux-arm64-musl@1.9.4': + '@biomejs/cli-linux-arm64-musl@2.4.12': optional: true - '@biomejs/cli-linux-arm64@1.9.4': + '@biomejs/cli-linux-arm64@2.4.12': optional: true - '@biomejs/cli-linux-x64-musl@1.9.4': + '@biomejs/cli-linux-x64-musl@2.4.12': optional: true - '@biomejs/cli-linux-x64@1.9.4': + '@biomejs/cli-linux-x64@2.4.12': optional: true - '@biomejs/cli-win32-arm64@1.9.4': + '@biomejs/cli-win32-arm64@2.4.12': optional: true - '@biomejs/cli-win32-x64@1.9.4': + '@biomejs/cli-win32-x64@2.4.12': optional: true '@braidai/lang@1.1.2': {}