diff --git a/README.md b/README.md index 93d77b6..03e3fd4 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,13 @@ Replace primitive obsession and defensive validation with domain-safe values that validate themselves. +Dependency-less: zero runtime dependencies, for Node.js and browsers. + [![CI](https://github.com/haskou/value-objects/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/haskou/value-objects/actions/workflows/ci.yml?query=branch%3Amaster) [![codecov](https://codecov.io/gh/haskou/value-objects/branch/master/graph/badge.svg)](https://codecov.io/gh/haskou/value-objects) [![npm version](https://img.shields.io/npm/v/@haskou/value-objects.svg)](https://www.npmjs.com/package/@haskou/value-objects) [![npm downloads](https://img.shields.io/npm/dw/@haskou/value-objects.svg)](https://www.npmjs.com/package/@haskou/value-objects) +[![dependencies](https://img.shields.io/badge/dependencies-0-brightgreen.svg)](https://www.npmjs.com/package/@haskou/value-objects?activeTab=dependencies) [![license](https://img.shields.io/npm/l/@haskou/value-objects.svg)](LICENSE.txt) ## Installation diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index 3c8ee5e..9fd626f 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -19,9 +19,9 @@ pnpm add @haskou/value-objects ## Runtime requirements -The package does not declare a Node.js engine requirement. It publishes runtime-neutral value-object code with separate ESM and CommonJS entry points. +The package is dependency-less: it installs nothing besides itself. It does not declare a Node.js engine requirement and publishes runtime-neutral value-object code with separate ESM and CommonJS entry points. -`UUID.generate()` and `ShortId.generate()` use the installed `uuid` dependency, which selects its Node or browser implementation. Node consumers do not need a global crypto object; browser bundlers select the browser entry automatically. +`UUID.generate()` and `ShortId.generate()` use the Web Crypto `globalThis.crypto.getRandomValues()`, which is available in all current browsers (including non-secure contexts) and in Node.js 20 or later. ## Importing @@ -39,7 +39,7 @@ const { Email, Timestamp, UUID } = require('@haskou/value-objects'); The package export map resolves ESM to `dist/index.mjs` with `dist/index.d.mts` declarations, and CommonJS to `dist/index.cjs` with `dist/index.d.cts` declarations. -The ESM entry re-exports the CommonJS implementation, and its declarations re-export the same type definitions. Mixing `import` and `require` preserves class identity, equality, collection membership, and the global NullObject creation setting. Browser consumers need a bundler that handles CommonJS and the `buffer` package. +The ESM entry re-exports the CommonJS implementation, and its declarations re-export the same type definitions. Mixing `import` and `require` preserves class identity, equality, collection membership, and the global NullObject creation setting. Browser consumers need a bundler that handles CommonJS. ## Published files diff --git a/docs/getting-started/introduction.md b/docs/getting-started/introduction.md index 9b41cf1..1faeec2 100644 --- a/docs/getting-started/introduction.md +++ b/docs/getting-started/introduction.md @@ -39,7 +39,7 @@ amount.isGreaterThan(5); // true | Media | `Media` | | Collections | `UniqueObjectArray` | -The package provides separate ESM and CommonJS entry points and does not declare a Node.js engine requirement. Identifier generation delegates to the installed `uuid` dependency for Node and browser support. +The package is dependency-less, provides separate ESM and CommonJS entry points, and does not declare a Node.js engine requirement. ## Design expectations diff --git a/docs/index.md b/docs/index.md index 71c1c7a..1149f02 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,7 +5,7 @@ description: Documentation for @haskou/value-objects. # Value Objects documentation -A TypeScript library for validated, immutable primitive wrappers and small utility value objects. +A dependency-less TypeScript library for validated, immutable primitive wrappers and small utility value objects. ::: info Documentation This site is the main documentation for `@haskou/value-objects`. diff --git a/docs/reference/media.md b/docs/reference/media.md index c8f1cb3..49d8412 100644 --- a/docs/reference/media.md +++ b/docs/reference/media.md @@ -1,11 +1,11 @@ --- title: Media -description: String or Buffer-backed media value object. +description: String or Uint8Array-backed media value object. --- # `Media` -String or Buffer-backed media value object. +String or `Uint8Array`-backed media value object. ## Import @@ -22,27 +22,26 @@ class Media extends ValueObject ## Constructor ```typescript -constructor(value: string | Buffer) +constructor(value: string | Uint8Array) ``` ## Validation -Accepts strings and Node `Buffer` values. +Accepts strings and `Uint8Array` values (Node `Buffer` is a `Uint8Array`). ## Methods | Method | Description | | --- | --- | -| `getBuffer()` | Returns a defensive `Buffer` copy. | +| `getBuffer()` | Returns a defensive `Uint8Array` copy. | | `getSize()` | Returns byte length. | | `getBase64()` | Returns the content encoded as Base64. | -| `hasValue(other)` | Compares Media, Buffer, or primitive values by their underlying bytes/value. | +| `hasValue(other)` | Compares Media, `Uint8Array`, or primitive values by their underlying bytes/value. | | `isEqual(other)` | Requires another `Media` and compares its underlying bytes. | ## Example ```typescript -import { Buffer } from 'buffer'; import { Media } from '@haskou/value-objects'; const media = new Media('hello world'); @@ -50,12 +49,13 @@ const media = new Media('hello world'); media.getSize(); // 11 media.getBase64(); // 'aGVsbG8gd29ybGQ=' media.isEqual(new Media('hello world')); // true -media.hasValue(Buffer.from('hello world')); // true +media.hasValue(new TextEncoder().encode('hello world')); // true ``` ## Notes -- When constructed from a Buffer, the Buffer is copied. Returned buffers are also copies. +- When constructed from bytes, the bytes are copied. Returned arrays are also copies. +- Text decoding of byte input is UTF-8 and keeps a leading BOM. Equality and `getBuffer()` use the original bytes. - Use `isEqual()` for Media-to-Media equality and `hasValue()` when only the underlying content matters. ## Related diff --git a/docs/reference/short-id.md b/docs/reference/short-id.md index 1e14e1e..f0b3cd8 100644 --- a/docs/reference/short-id.md +++ b/docs/reference/short-id.md @@ -58,7 +58,7 @@ const existing = new ShortId('507f1f77bcf86cd799439011'); - Generation returns lowercase hex. - Constructor validation currently allows alphanumeric characters, not only lowercase hex. -Generation uses the installed `uuid` dependency, which selects its Node or browser implementation. Consumers do not need to configure a global crypto object in Node. Browser bundlers select the browser entry automatically. +Generation uses `globalThis.crypto.getRandomValues()` (browsers and Node.js 20 or later). The package has no runtime dependencies. ## Related diff --git a/docs/reference/uuid.md b/docs/reference/uuid.md index d5dabab..1bd0ca2 100644 --- a/docs/reference/uuid.md +++ b/docs/reference/uuid.md @@ -55,7 +55,7 @@ id.toString(); // e.g. '3fd4c04a-8e73-4e10-aef3-f491b32ec538' - The constructor pattern accepts lowercase `a-z`, `0-9`, and hyphens. -Generation uses the installed `uuid` dependency, which selects its Node or browser implementation. Consumers do not need to configure a global crypto object in Node. Browser bundlers select the browser entry automatically. +Generation uses `globalThis.crypto.getRandomValues()` (browsers and Node.js 20 or later) and produces an RFC 4122 version 4 UUID. The package has no runtime dependencies. ## Related diff --git a/package.json b/package.json index 547be97..6947ad4 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,13 @@ "domain-driven-design", "email-validation", "uuid", - "hash" + "hash", + "zero-dependencies", + "dependency-free", + "isomorphic", + "browser", + "null-object", + "domain-model" ], "publishConfig": { "access": "public" @@ -63,10 +69,6 @@ "docs:build": "vitepress build docs", "docs:preview": "vitepress build docs && vitepress preview docs" }, - "dependencies": { - "buffer": "^6.0.3", - "uuid": "^11.1.1" - }, "devDependencies": { "@arethetypeswrong/core": "^0.18.5", "@haskou/eslint-config": "^0.2.2", @@ -80,7 +82,6 @@ "ts-jest": "^29.4.14", "tsdown": "^0.23.0", "typescript": "^6.0.3", - "vitepress": "^1.6.4", - "vue": "^3.5.43" + "vitepress": "^1.6.4" } } diff --git a/src/value-objects/hashes/Hash.ts b/src/value-objects/hashes/Hash.ts index 154149a..6df2634 100644 --- a/src/value-objects/hashes/Hash.ts +++ b/src/value-objects/hashes/Hash.ts @@ -1,5 +1,3 @@ -import { Buffer } from 'buffer'; - import { NullObject } from '../NullObject'; import { StringValueObject } from '../StringValueObject'; import { ValueObject } from '../ValueObject'; @@ -14,8 +12,10 @@ export abstract class Hash extends ValueObject { } public toBase64(): StringValueObject { - return new StringValueObject( - Buffer.from(this.valueOf(), 'hex').toString('base64'), + const bytes = Array.from(this.valueOf().matchAll(/../g), ([pair]) => + parseInt(pair, 16), ); + + return new StringValueObject(btoa(String.fromCharCode(...bytes))); } } diff --git a/src/value-objects/hashes/SHA256Hash.ts b/src/value-objects/hashes/SHA256Hash.ts index c454d16..fcaf4e8 100644 --- a/src/value-objects/hashes/SHA256Hash.ts +++ b/src/value-objects/hashes/SHA256Hash.ts @@ -1,12 +1,10 @@ -import { Buffer } from 'buffer'; - import { InvalidHashError } from '../../errors/InvalidHashError'; import { assert } from '../../patterns'; import { NullObject } from '../NullObject'; import { StringValueObject } from '../StringValueObject'; -import { ValueObject } from '../ValueObject'; +import { Hash } from './Hash'; -export class SHA256Hash extends ValueObject { +export class SHA256Hash extends Hash { public static isValid(hash: string | StringValueObject): boolean { return !!hash.valueOf().match(/^[a-f0-9]{64}$/i); } @@ -23,10 +21,4 @@ export class SHA256Hash extends ValueObject { new InvalidHashError('SHA256', source.valueOf()), ); } - - public toBase64(): StringValueObject { - return new StringValueObject( - Buffer.from(this.valueOf(), 'hex').toString('base64'), - ); - } } diff --git a/src/value-objects/hashes/SHA512Hash.ts b/src/value-objects/hashes/SHA512Hash.ts index adfbfaf..c6dfce7 100644 --- a/src/value-objects/hashes/SHA512Hash.ts +++ b/src/value-objects/hashes/SHA512Hash.ts @@ -1,12 +1,10 @@ -import { Buffer } from 'buffer'; - import { InvalidHashError } from '../../errors/InvalidHashError'; import { assert } from '../../patterns'; import { NullObject } from '../NullObject'; import { StringValueObject } from '../StringValueObject'; -import { ValueObject } from '../ValueObject'; +import { Hash } from './Hash'; -export class SHA512Hash extends ValueObject { +export class SHA512Hash extends Hash { public static isValid(hash: string | StringValueObject): boolean { return !!hash.valueOf().match(/^[a-f0-9]{128}$/i); } @@ -23,10 +21,4 @@ export class SHA512Hash extends ValueObject { new InvalidHashError('SHA512', source.valueOf()), ); } - - public toBase64(): StringValueObject { - return new StringValueObject( - Buffer.from(this.valueOf(), 'hex').toString('base64'), - ); - } } diff --git a/src/value-objects/ids/ShortId.ts b/src/value-objects/ids/ShortId.ts index 52c20b7..d8f9a63 100644 --- a/src/value-objects/ids/ShortId.ts +++ b/src/value-objects/ids/ShortId.ts @@ -1,6 +1,3 @@ -import { Buffer } from 'buffer'; -import { parse, v4 as uuidV4 } from 'uuid'; - import { InvalidFormatError } from '../../errors/InvalidFormatError'; import { InvalidLengthError } from '../../errors/InvalidLengthError'; import { assert } from '../../patterns'; @@ -13,14 +10,13 @@ export class ShortId extends ValueObject { private static readonly PATTERN = new RegExp(`[a-zA-Z0-9]{${this.LENGTH}}$`); private static generateObjectIdHex(): string { - const random = parse(uuidV4()); - const bytes = Buffer.alloc(12); - bytes.writeUInt32BE(Math.floor(Date.now() / 1000), 0); - // Keep eight fully random bytes, excluding the UUID version/variant bytes. - bytes.set(random.subarray(0, 6), 4); - bytes.set(random.subarray(9, 11), 10); + const bytes = new Uint8Array(12); + new DataView(bytes.buffer).setUint32(0, Math.floor(Date.now() / 1000)); + bytes.set(globalThis.crypto.getRandomValues(new Uint8Array(8)), 4); - return bytes.toString('hex'); + return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join( + '', + ); } public static generate(): ShortId { diff --git a/src/value-objects/ids/UUID.ts b/src/value-objects/ids/UUID.ts index 400a40c..81eb6d5 100644 --- a/src/value-objects/ids/UUID.ts +++ b/src/value-objects/ids/UUID.ts @@ -1,5 +1,3 @@ -import { v4 as uuidV4 } from 'uuid'; - import { InvalidFormatError } from '../../errors/InvalidFormatError'; import { InvalidLengthError } from '../../errors/InvalidLengthError'; import { assert } from '../../patterns'; @@ -16,7 +14,23 @@ export class UUID extends ValueObject { /^(?:00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i; public static generate(): UUID { - return new UUID(uuidV4()); + const bytes = globalThis.crypto.getRandomValues(new Uint8Array(16)); + // RFC 4122 ยง4.4: version 4 and variant 10xx. + bytes[6] = (bytes[6] % 16) + 64; + bytes[8] = (bytes[8] % 64) + 128; + const hex = Array.from(bytes, (byte) => + byte.toString(16).padStart(2, '0'), + ).join(''); + + return new UUID( + [ + hex.slice(0, 8), + hex.slice(8, 12), + hex.slice(12, 16), + hex.slice(16, 20), + hex.slice(20), + ].join('-'), + ); } constructor(value: string | StringValueObject) { diff --git a/src/value-objects/media/Media.ts b/src/value-objects/media/Media.ts index 054d22c..5f49539 100644 --- a/src/value-objects/media/Media.ts +++ b/src/value-objects/media/Media.ts @@ -1,25 +1,30 @@ -import { Buffer } from 'buffer'; - import { NullObject } from '../NullObject'; import { ValueObject } from '../ValueObject'; export class Media extends ValueObject { - private readonly buffer?: Buffer; + private static readonly BASE64_CHUNK_SIZE = 0x8000; + + private readonly buffer?: Uint8Array; - constructor(value: string | Buffer) { - super(value?.toString()); + constructor(value: string | Uint8Array) { + super( + value instanceof Uint8Array + ? new TextDecoder('utf-8', { ignoreBOM: true }).decode(value) + : value, + ); if (NullObject.isNullObject(this)) { return this; } - this.buffer = Buffer.isBuffer(value) ? Buffer.from(value) : undefined; + this.buffer = + value instanceof Uint8Array ? new Uint8Array(value) : undefined; } - public getBuffer(): Buffer { + public getBuffer(): Uint8Array { return this.buffer === undefined - ? Buffer.from(this.value) - : Buffer.from(this.buffer); + ? new TextEncoder().encode(this.value) + : new Uint8Array(this.buffer); } public getSize(): number { @@ -27,18 +32,37 @@ export class Media extends ValueObject { } public getBase64(): string { - return this.getBuffer().toString('base64'); + const bytes = this.getBuffer(); + const chunks: string[] = []; + + // Chunked so large payloads do not overflow the call stack. + for (let i = 0; i < bytes.length; i += Media.BASE64_CHUNK_SIZE) { + chunks.push( + String.fromCharCode(...bytes.subarray(i, i + Media.BASE64_CHUNK_SIZE)), + ); + } + + return btoa(chunks.join('')); } public hasValue(other: unknown): boolean { + let otherBytes: Uint8Array | undefined; + if (other instanceof Media) { - return this.getBuffer().equals(other.getBuffer()); + otherBytes = other.getBuffer(); + } else if (other instanceof Uint8Array) { + otherBytes = other; } - if (Buffer.isBuffer(other)) { - return this.getBuffer().equals(other); + if (otherBytes === undefined) { + return super.hasValue(other); } - return super.hasValue(other); + const bytes = this.getBuffer(); + + return ( + bytes.length === otherBytes.length && + bytes.every((byte, i) => byte === otherBytes[i]) + ); } } diff --git a/tests/value-objects/ids/ShortId.spec.ts b/tests/value-objects/ids/ShortId.spec.ts index acab0f7..eb310ce 100644 --- a/tests/value-objects/ids/ShortId.spec.ts +++ b/tests/value-objects/ids/ShortId.spec.ts @@ -14,24 +14,14 @@ describe('ShortId', () => { } }); - it('generates in Node without a global crypto object', () => { - const descriptor = Object.getOwnPropertyDescriptor(globalThis, 'crypto'); - Object.defineProperty(globalThis, 'crypto', { - configurable: true, - value: undefined, - }); - try { - const values = Array.from({ length: 100 }, () => - ShortId.generate().valueOf(), - ); - expect(new Set(values).size).toBe(100); - expect( - values.every((value) => new ShortId(value) instanceof ShortId), - ).toBeTrue(); - } finally { - if (descriptor) Object.defineProperty(globalThis, 'crypto', descriptor); - else Reflect.deleteProperty(globalThis, 'crypto'); - } + it('generates unique valid values', () => { + const values = Array.from({ length: 100 }, () => + ShortId.generate().valueOf(), + ); + expect(new Set(values).size).toBe(100); + expect( + values.every((value) => new ShortId(value) instanceof ShortId), + ).toBeTrue(); }); it('should generate a valid ShortId', () => { diff --git a/tests/value-objects/ids/UUID.spec.ts b/tests/value-objects/ids/UUID.spec.ts index 661d1d7..3684d5b 100644 --- a/tests/value-objects/ids/UUID.spec.ts +++ b/tests/value-objects/ids/UUID.spec.ts @@ -5,24 +5,14 @@ import { UUID } from '../../../src/value-objects/ids/UUID'; describe('UUID', () => { describe('generate', () => { - it('generates in Node without a global crypto object', () => { - const descriptor = Object.getOwnPropertyDescriptor(globalThis, 'crypto'); - Object.defineProperty(globalThis, 'crypto', { - configurable: true, - value: undefined, - }); - try { - const values = Array.from({ length: 100 }, () => - UUID.generate().valueOf(), - ); - expect(new Set(values).size).toBe(100); - expect( - values.every((value) => new UUID(value) instanceof UUID), - ).toBeTrue(); - } finally { - if (descriptor) Object.defineProperty(globalThis, 'crypto', descriptor); - else Reflect.deleteProperty(globalThis, 'crypto'); - } + it('generates unique valid values', () => { + const values = Array.from({ length: 100 }, () => + UUID.generate().valueOf(), + ); + expect(new Set(values).size).toBe(100); + expect( + values.every((value) => new UUID(value) instanceof UUID), + ).toBeTrue(); }); it('should generate a valid LongId', () => { diff --git a/tests/value-objects/media/Media.spec.ts b/tests/value-objects/media/Media.spec.ts index 796b6c1..1ef1190 100644 --- a/tests/value-objects/media/Media.spec.ts +++ b/tests/value-objects/media/Media.spec.ts @@ -19,12 +19,17 @@ describe('Media', () => { expect(media.valueOf()).toBe(testContent); }); - it('should create from a Buffer', () => { - const media = new Media(Buffer.from(testContent)); + it('should create from a plain Uint8Array', () => { + const media = new Media(new TextEncoder().encode(testContent)); expect(media).toBeInstanceOf(Media); expect(media.valueOf()).toBe(testContent); }); + it('should keep a leading BOM when decoding bytes', () => { + const media = new Media(new Uint8Array([0xef, 0xbb, 0xbf, 0x61])); + expect(media.valueOf()).toBe('\uFEFFa'); + }); + it('should preserve non-text bytes from a Buffer', () => { const source = Buffer.from([0xff, 0xfe, 0xfd, 0x00, 0x80]); const media = new Media(source); @@ -38,12 +43,12 @@ describe('Media', () => { }); describe('getBuffer', () => { - it('should return the content as a Buffer', () => { + it('should return the content as a Uint8Array', () => { const media = new Media(testContent); - const buffer = media.getBuffer(); + const bytes = media.getBuffer(); - expect(buffer).toBeInstanceOf(Buffer); - expect(buffer.toString()).toBe(testContent); + expect(bytes).toBeInstanceOf(Uint8Array); + expect(new TextDecoder().decode(bytes)).toBe(testContent); }); }); diff --git a/yarn.lock b/yarn.lock index 4768277..0de005f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -288,13 +288,6 @@ dependencies: "@babel/types" "^7.29.7" -"@babel/parser@^7.29.8": - version "7.29.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.8.tgz#9653716a2f10c677b98fbc63d4bfb000c302cf17" - integrity sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA== - dependencies: - "@babel/types" "^7.29.8" - "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -444,14 +437,6 @@ "@babel/helper-string-parser" "^7.29.7" "@babel/helper-validator-identifier" "^7.29.7" -"@babel/types@^7.29.8": - version "7.29.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.8.tgz#1229eef31d85156d70fa3f4cd859376d0eaf6863" - integrity sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg== - dependencies: - "@babel/helper-string-parser" "^7.29.7" - "@babel/helper-validator-identifier" "^7.29.7" - "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1906,17 +1891,6 @@ estree-walker "^2.0.2" source-map-js "^1.2.1" -"@vue/compiler-core@3.5.43": - version "3.5.43" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.43.tgz#ff792a8bb20d29fe2a9f013d5735d39c7808c9a5" - integrity sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg== - dependencies: - "@babel/parser" "^7.29.8" - "@vue/shared" "3.5.43" - entities "^7.0.1" - estree-walker "^2.0.2" - source-map-js "^1.2.1" - "@vue/compiler-dom@3.5.38": version "3.5.38" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.38.tgz#10ad73a70399a4c09dedf45ff6a93d42eadc861f" @@ -1925,14 +1899,6 @@ "@vue/compiler-core" "3.5.38" "@vue/shared" "3.5.38" -"@vue/compiler-dom@3.5.43": - version "3.5.43" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.43.tgz#1bec85b4c3078544b278524e521311a6202d673f" - integrity sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ== - dependencies: - "@vue/compiler-core" "3.5.43" - "@vue/shared" "3.5.43" - "@vue/compiler-sfc@3.5.38": version "3.5.38" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.38.tgz#2b02036f89c7db0a688534a2eb0d42728c7f09c1" @@ -1948,21 +1914,6 @@ postcss "^8.5.15" source-map-js "^1.2.1" -"@vue/compiler-sfc@3.5.43": - version "3.5.43" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.43.tgz#19c097f398abacfee9627646075a919d2f57a6ae" - integrity sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ== - dependencies: - "@babel/parser" "^7.29.8" - "@vue/compiler-core" "3.5.43" - "@vue/compiler-dom" "3.5.43" - "@vue/compiler-ssr" "3.5.43" - "@vue/shared" "3.5.43" - estree-walker "^2.0.2" - magic-string "^0.30.21" - postcss "^8.5.28" - source-map-js "^1.2.1" - "@vue/compiler-ssr@3.5.38": version "3.5.38" resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.38.tgz#23975aa9643752c78c0625277ffa86f58600300d" @@ -1971,14 +1922,6 @@ "@vue/compiler-dom" "3.5.38" "@vue/shared" "3.5.38" -"@vue/compiler-ssr@3.5.43": - version "3.5.43" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.43.tgz#aacd1d047545d51d5cb0eca9aa3f490507bf7040" - integrity sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg== - dependencies: - "@vue/compiler-dom" "3.5.43" - "@vue/shared" "3.5.43" - "@vue/devtools-api@^7.7.0": version "7.7.9" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-7.7.9.tgz#999dbea50da6b00cf59a1336f11fdc2b43d9e063" @@ -2013,13 +1956,6 @@ dependencies: "@vue/shared" "3.5.38" -"@vue/reactivity@3.5.43": - version "3.5.43" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.43.tgz#26441233103e834616959a032d8fabd4524fd089" - integrity sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA== - dependencies: - "@vue/shared" "3.5.43" - "@vue/runtime-core@3.5.38": version "3.5.38" resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.38.tgz#26560a876b9c0251e57f7a05f9263e623f244f9c" @@ -2028,14 +1964,6 @@ "@vue/reactivity" "3.5.38" "@vue/shared" "3.5.38" -"@vue/runtime-core@3.5.43": - version "3.5.43" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.43.tgz#eca01c87c32047d32f3639c1a9206d368abe0c46" - integrity sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw== - dependencies: - "@vue/reactivity" "3.5.43" - "@vue/shared" "3.5.43" - "@vue/runtime-dom@3.5.38": version "3.5.38" resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.38.tgz#7aec70bd013e43166e9ccecd4a1f096fd8ca11fb" @@ -2046,16 +1974,6 @@ "@vue/shared" "3.5.38" csstype "^3.2.3" -"@vue/runtime-dom@3.5.43": - version "3.5.43" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.43.tgz#c40a898bd1ce11697741b9a079414a803413028a" - integrity sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw== - dependencies: - "@vue/reactivity" "3.5.43" - "@vue/runtime-core" "3.5.43" - "@vue/shared" "3.5.43" - csstype "^3.2.3" - "@vue/server-renderer@3.5.38": version "3.5.38" resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.38.tgz#5d24a5305e776a53038fc772fbd9d1205c236588" @@ -2064,25 +1982,11 @@ "@vue/compiler-ssr" "3.5.38" "@vue/shared" "3.5.38" -"@vue/server-renderer@3.5.43": - version "3.5.43" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.43.tgz#ae2b84b832821e39c3355705e1c269f5a7d29b3c" - integrity sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ== - dependencies: - "@vue/compiler-ssr" "3.5.43" - "@vue/runtime-dom" "3.5.43" - "@vue/shared" "3.5.43" - "@vue/shared@3.5.38", "@vue/shared@^3.5.13": version "3.5.38" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.38.tgz#6c4be4defd86cdc35bfa2b7dd45d7b11a5d51101" integrity sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug== -"@vue/shared@3.5.43": - version "3.5.43" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.43.tgz#22c11ecf1304bfc6f6b745f3b4ba54c410074338" - integrity sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q== - "@vueuse/core@12.8.2", "@vueuse/core@^12.4.0": version "12.8.2" resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-12.8.2.tgz#007c6dd29a7d1f6933e916e7a2f8ef3c3f968eaa" @@ -2398,11 +2302,6 @@ balanced-match@^4.0.2: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - baseline-browser-mapping@^2.10.12: version "2.10.36" resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.36.tgz#ff3c7c87095c70075b1ac787160fd4fc98750a74" @@ -2452,14 +2351,6 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - builtin-modules@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" @@ -3201,11 +3092,6 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore@^5.2.0: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -3987,11 +3873,6 @@ nanoid@^3.3.12: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.15.tgz#36c490fad8c6e86c824c940dfdde999b69ed4316" integrity sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA== -nanoid@^3.3.18: - version "3.3.19" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.19.tgz#336d4aa4bcd4fb24d2cddede7ffeae40bec03f0a" - integrity sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug== - napi-postinstall@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9" @@ -4197,15 +4078,6 @@ postcss@^8.4.43, postcss@^8.5.15: picocolors "^1.1.1" source-map-js "^1.2.1" -postcss@^8.5.28: - version "8.5.28" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.28.tgz#da4563a99a06e62d6c1cd1acae363224bcaed6e9" - integrity sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A== - dependencies: - nanoid "^3.3.18" - picocolors "^1.1.1" - source-map-js "^1.2.1" - preact@^10.0.0: version "10.29.2" resolved "https://registry.yarnpkg.com/preact/-/preact-10.29.2.tgz#3e6069c471718b8d124d1cd67565114532e88d70" @@ -4857,11 +4729,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -uuid@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.1.tgz#f6d81d2e1c65d00762e5e29b16c5d2d995e208ad" - integrity sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ== - v8-to-istanbul@^9.0.1: version "9.3.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" @@ -4943,17 +4810,6 @@ vue@^3.5.13: "@vue/server-renderer" "3.5.38" "@vue/shared" "3.5.38" -vue@^3.5.43: - version "3.5.43" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.43.tgz#bab91368e7b9aad9b89dd92e866b120081deb094" - integrity sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng== - dependencies: - "@vue/compiler-dom" "3.5.43" - "@vue/compiler-sfc" "3.5.43" - "@vue/runtime-dom" "3.5.43" - "@vue/server-renderer" "3.5.43" - "@vue/shared" "3.5.43" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"