Compare commits

...
Author SHA1 Message Date
Will Schurman 593fb10c99 v0.71.0 2026-10-09 11:09:24 -07:00
Vatsal Patel 3c96f3b9ea fix: declare runtime dependencies imported by published packages (#717) 2026-10-09 09:14:43 -07:00
Will Schurman 84f83071f3 v0.70.0 2026-10-05 10:24:41 -07:00
Will Schurman 🦦 13ce74e93a feat: add transient error for PostgreSQL lock timeouts (#716)
# Why

Re-implementation of #714 on top of #715.

# How

Prompt:

> add new error for pg code 55P03, use PR 714 as reference but a new error class

# Test Plan

CI
2026-10-05 10:08:28 -07:00
Will Schurman 🦦 6de04055e7 feat!: move knex-specific database adapter errors into entity-database-adapter-knex (#715)
# Why

While reviewing #714, noticed that it was probably better if these knex/postgres-specific errors live in their package rather than the root package.

This is a breaking change but one that is detectable via tsc so within the scope of what's allowed via minor version bump.

# How

Have claude move them. Prompt: 

> move knex-specific entity errors into the entity-database-adapter-knex package. no need for backwards
  compatibility

# Test Plan

CI
2026-10-05 10:05:23 -07:00
renovate[bot] ba74662842 chore(deps): update jest to v30.5.2 (#712)
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@jest/globals](https://redirect.github.com/jestjs/jest) ([source](https://redirect.github.com/jestjs/jest/tree/HEAD/packages/jest-globals)) | [`30.5.1` → `30.5.2`](https://renovatebot.com/diffs/npm/@jest%2fglobals/30.5.1/30.5.2) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@jest%2fglobals/30.5.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@jest%2fglobals/30.5.1/30.5.2?slim=true) |
| [jest](https://jestjs.io/) ([source](https://redirect.github.com/jestjs/jest/tree/HEAD/packages/jest)) | [`30.5.1` → `30.5.2`](https://renovatebot.com/diffs/npm/jest/30.5.1/30.5.2) | ![age](https://developer.mend.io/api/mc/badges/age/npm/jest/30.5.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/jest/30.5.1/30.5.2?slim=true) |

---

### Release Notes

<details>
<summary>jestjs/jest (@&#8203;jest/globals)</summary>

### [`v30.5.2`](https://redirect.github.com/jestjs/jest/blob/HEAD/CHANGELOG.md#3052)

[Compare Source](https://redirect.github.com/jestjs/jest/compare/v30.5.1...v30.5.2)

##### Features

- `[@jest/transform]` Strip TypeScript types with Node when no transformer claims a `.ts`, `.mts` or `.cts` file ([#&#8203;16421](https://redirect.github.com/jestjs/jest/pull/16421))

##### Fixes

- `[jest-core, jest-haste-map, jest-transform]` Keep `require('../package.json')` external when bundling, so `jest --version` and the transform and haste-map cache keys report the released version instead of the previous one ([#&#8203;16422](https://redirect.github.com/jestjs/jest/pull/16422))
- `[jest-each]` Escape a table row's keys before building the `$variable` interpolation `RegExp`, so a column name such as `count(*)` no longer fails the whole table with `Invalid regular expression`, and a `.` or `|` in a column name is matched literally ([#&#8203;16345](https://redirect.github.com/jestjs/jest/pull/16345))
- `[@jest/source-map]` Resolve absolute Windows paths in a source map's `sources` and `sourceRoot` again, instead of appending them to the transformed file's directory ([#&#8203;16439](https://redirect.github.com/jestjs/jest/pull/16439))

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/expo/entity).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMjUuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjEyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-10-05 08:44:51 -07:00
38 changed files with 662 additions and 414 deletions

No files matched your search

+12
View File
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
### Bug Fixes
- declare runtime dependencies imported by published packages ([#717](https://github.com/expo/entity/issues/717)) ([3c96f3b](https://github.com/expo/entity/commit/3c96f3b9ea2b097c979447354f0abe35ed5e8d57))
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
### Features
- add transient error for PostgreSQL lock timeouts ([#716](https://github.com/expo/entity/issues/716)) ([13ce74e](https://github.com/expo/entity/commit/13ce74e93aec0a0b0b84edd1e1e89d785a3dbf46)), closes [#714](https://github.com/expo/entity/issues/714) [#715](https://github.com/expo/entity/issues/715)
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
### Features
+1 -1
View File
@@ -1,6 +1,6 @@
{
"packages": ["packages/*"],
"npmClient": "yarn",
"version": "0.69.0",
"version": "0.71.0",
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
}
+1 -1
View File
@@ -25,7 +25,7 @@
"@tsconfig/bases": "1.0.28",
"@types/node": "24.19.1",
"ctix": "2.8.2",
"jest": "30.5.1",
"jest": "30.5.2",
"lerna": "9.0.7",
"oxfmt": "0.67.0",
"oxlint": "1.82.0",
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-cache-adapter-local-memory
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-cache-adapter-local-memory
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-cache-adapter-local-memory
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-cache-adapter-local-memory",
"version": "0.69.0",
"version": "0.71.0",
"description": "Cross-request local memory cache adapter for @expo/entity",
"keywords": [
"entity"
@@ -31,7 +31,7 @@
"devDependencies": {
"@expo/entity-testing-utils": "workspace:^",
"@isaacs/ttlcache": "2.1.5",
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"typescript": "6.0.3"
},
"engines": {
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-cache-adapter-redis
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-cache-adapter-redis
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-cache-adapter-redis
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-cache-adapter-redis",
"version": "0.69.0",
"version": "0.71.0",
"description": "Redis cache adapter for @expo/entity",
"keywords": [
"entity"
@@ -31,7 +31,7 @@
"devDependencies": {
"@expo/batcher": "1.1.2",
"@expo/entity-testing-utils": "workspace:^",
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"ioredis": "5.11.1",
"ts-mockito": "2.6.1",
"typescript": "6.0.3"
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-codemod
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-codemod
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-codemod
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-codemod",
"version": "0.69.0",
"version": "0.71.0",
"description": "jscodeshift codemods for @expo/entity upgrades",
"keywords": [
"entity"
@@ -25,7 +25,7 @@
"test": "yarn test:all --rootDir $(pwd)"
},
"devDependencies": {
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"@types/jscodeshift": "17.3.0",
"@types/node": "24.19.1",
"jscodeshift": "17.4.0",
@@ -3,6 +3,16 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
### Bug Fixes
- declare runtime dependencies imported by published packages ([#717](https://github.com/expo/entity/issues/717)) ([3c96f3b](https://github.com/expo/entity/commit/3c96f3b9ea2b097c979447354f0abe35ed5e8d57))
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-database-adapter-knex-testing-utils
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-database-adapter-knex-testing-utils
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-database-adapter-knex-testing-utils",
"version": "0.69.0",
"version": "0.71.0",
"description": "Testing utilities for applications using Entity with Knex database adapter",
"keywords": [
"entity"
@@ -27,11 +27,12 @@
"dependencies": {
"@expo/entity": "workspace:^",
"@expo/entity-database-adapter-knex": "workspace:^",
"@expo/entity-testing-utils": "workspace:^",
"invariant": "^2.2.4",
"uuid": "^14.0.0"
},
"devDependencies": {
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"@types/invariant": "2.2.37",
"@types/node": "24.19.1",
"typescript": "6.0.3"
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
### Bug Fixes
- declare runtime dependencies imported by published packages ([#717](https://github.com/expo/entity/issues/717)) ([3c96f3b](https://github.com/expo/entity/commit/3c96f3b9ea2b097c979447354f0abe35ed5e8d57))
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
### Features
- add transient error for PostgreSQL lock timeouts ([#716](https://github.com/expo/entity/issues/716)) ([13ce74e](https://github.com/expo/entity/commit/13ce74e93aec0a0b0b84edd1e1e89d785a3dbf46)), closes [#714](https://github.com/expo/entity/issues/714) [#715](https://github.com/expo/entity/issues/715)
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
### Features
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-database-adapter-knex",
"version": "0.69.0",
"version": "0.71.0",
"description": "Knex database adapter for @expo/entity",
"keywords": [
"entity"
@@ -27,11 +27,12 @@
},
"dependencies": {
"@expo/entity": "workspace:^",
"@expo/results": "^1.0.0",
"knex": "^3.2.9"
},
"devDependencies": {
"@expo/entity-testing-utils": "workspace:^",
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"pg": "8.23.1",
"ts-mockito": "2.6.1",
"typescript": "6.0.3"
@@ -1,13 +1,4 @@
import {
EntityDatabaseAdapterCheckConstraintError,
EntityDatabaseAdapterExclusionConstraintError,
EntityDatabaseAdapterForeignKeyConstraintError,
EntityDatabaseAdapterNotNullConstraintError,
EntityDatabaseAdapterTransientError,
EntityDatabaseAdapterUniqueConstraintError,
EntityDatabaseAdapterUnknownError,
ViewerContext,
} from '@expo/entity';
import { EntityDatabaseAdapterUniqueConstraintError, ViewerContext } from '@expo/entity';
import nullthrows from '@expo/nullthrows';
import { afterAll, beforeAll, beforeEach, describe, expect, it } from '@jest/globals';
import type { Knex } from 'knex';
@@ -15,6 +6,15 @@ import knex from 'knex';
import { ErrorsTestEntity } from '../__testfixtures__/ErrorsTestEntity.ts';
import { createKnexIntegrationTestEntityCompanionProvider } from '../__testfixtures__/createKnexIntegrationTestEntityCompanionProvider.ts';
import {
EntityDatabaseAdapterCheckConstraintError,
EntityDatabaseAdapterExclusionConstraintError,
EntityDatabaseAdapterForeignKeyConstraintError,
EntityDatabaseAdapterLockNotAvailableError,
EntityDatabaseAdapterNotNullConstraintError,
EntityDatabaseAdapterTransientError,
EntityDatabaseAdapterUnknownError,
} from '../errors/KnexEntityDatabaseAdapterError.ts';
describe('postgres errors', () => {
let knexInstance: Knex;
@@ -160,6 +160,34 @@ describe('postgres errors', () => {
).rejects.toThrow(EntityDatabaseAdapterExclusionConstraintError);
});
it('throws EntityDatabaseAdapterLockNotAvailableError when lock_timeout is exceeded', async () => {
const vc = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
const entity = await ErrorsTestEntity.creator(vc)
.setField('id', 1)
.setField('fieldNonNull', 'hello')
.createAsync();
// hold a row lock from a separate transaction while the entity update attempts to acquire it
const lockHolderTransaction = await knexInstance.transaction();
await lockHolderTransaction.raw(
'SELECT * FROM postgres_test_entities WHERE id = ? FOR UPDATE',
[entity.getID()],
);
try {
await expect(
vc.runInTransactionForDatabaseAdapterFlavorAsync('postgres', async (queryContext) => {
await queryContext.getQueryInterface().raw("SET LOCAL lock_timeout = '100ms'");
await ErrorsTestEntity.updater(entity, queryContext)
.setField('fieldNonNull', 'world')
.updateAsync();
}),
).rejects.toThrow(EntityDatabaseAdapterLockNotAvailableError);
} finally {
await lockHolderTransaction.rollback();
}
});
it('throws EntityDatabaseAdapterUnknownError otherwise', async () => {
const vc = new ViewerContext(createKnexIntegrationTestEntityCompanionProvider(knexInstance));
await expect(
@@ -0,0 +1,163 @@
import { EntityDatabaseAdapterError, EntityErrorState } from '@expo/entity';
/**
* Error code for an entity error thrown by the knex database adapter.
* Each error code should map to a specific class of Entity error.
*/
export enum KnexEntityDatabaseAdapterErrorCode {
ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT = 'ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT',
ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN = 'ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN',
ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID = 'ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID',
ERR_ENTITY_DATABASE_ADAPTER_LOCK_NOT_AVAILABLE = 'ERR_ENTITY_DATABASE_ADAPTER_LOCK_NOT_AVAILABLE',
}
/**
* Thrown when a transient error occurrs within the database adapter.
* Transient errors may succeed if retried.
*/
export class EntityDatabaseAdapterTransientError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterTransientError';
}
get state(): EntityErrorState.TRANSIENT {
return EntityErrorState.TRANSIENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT;
}
}
/**
* Thrown when an unknown error occurrs within the database adapter.
* This is a catch-all error class for DBMS-specific errors that do not fit into other categories.
*/
export class EntityDatabaseAdapterUnknownError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterUnknownError';
}
get state(): EntityErrorState.UNKNOWN {
return EntityErrorState.UNKNOWN;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN;
}
}
/**
* Thrown when a check constraint is violated within the database adapter.
* This indicates that a value being inserted or updated does not satisfy a defined data integrity constraint.
*/
export class EntityDatabaseAdapterCheckConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterCheckConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT;
}
}
/**
* Thrown when an exclusion constraint is violated within the database adapter.
* This indicates that a value being inserted or updated conflicts with an existing value based on a defined exclusion constraint.
*/
export class EntityDatabaseAdapterExclusionConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterExclusionConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT;
}
}
/**
* Thrown when a foreign key constraint is violated within the database adapter.
* This indicates that a value being inserted, updated, or deleted references a non-existent value in a related table
* or is referenced in a related table.
*/
export class EntityDatabaseAdapterForeignKeyConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterForeignKeyConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT;
}
}
/**
* Thrown when a not-null constraint is violated within the database adapter.
* This indicates that a null value is being inserted or updated into a column that does not allow null values.
*/
export class EntityDatabaseAdapterNotNullConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterNotNullConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT;
}
}
/**
* Thrown when a pagination cursor cannot be decoded or does not match the expected pagination
* specification.
*/
export class EntityDatabaseAdapterPaginationCursorInvalidError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterPaginationCursorInvalidError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID;
}
}
/**
* Thrown when a lock on a row or table cannot be acquired (PostgreSQL error code 55P03, `lock_not_available`).
* This happens when a statement exceeds `lock_timeout` while waiting for a lock, or when a `NOWAIT`
* lock request conflicts with a lock held by another transaction.
* This error is transient since the conflicting lock is released when the other transaction completes.
*/
export class EntityDatabaseAdapterLockNotAvailableError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterLockNotAvailableError';
}
get state(): EntityErrorState.TRANSIENT {
return EntityErrorState.TRANSIENT;
}
get code(): KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_LOCK_NOT_AVAILABLE {
return KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_LOCK_NOT_AVAILABLE;
}
}
@@ -0,0 +1,76 @@
import { EntityDatabaseAdapterError, EntityErrorState } from '@expo/entity';
import { describe, expect, it } from '@jest/globals';
import {
EntityDatabaseAdapterCheckConstraintError,
EntityDatabaseAdapterExclusionConstraintError,
EntityDatabaseAdapterForeignKeyConstraintError,
EntityDatabaseAdapterLockNotAvailableError,
EntityDatabaseAdapterNotNullConstraintError,
EntityDatabaseAdapterPaginationCursorInvalidError,
EntityDatabaseAdapterTransientError,
EntityDatabaseAdapterUnknownError,
KnexEntityDatabaseAdapterErrorCode,
} from '../KnexEntityDatabaseAdapterError.ts';
describe('KnexEntityDatabaseAdapterError', () => {
it('instantiates all errors with correct state and code', () => {
const transientError = new EntityDatabaseAdapterTransientError('test');
expect(transientError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(transientError.state).toBe(EntityErrorState.TRANSIENT);
expect(transientError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT,
);
const unknownError = new EntityDatabaseAdapterUnknownError('test');
expect(unknownError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(unknownError.state).toBe(EntityErrorState.UNKNOWN);
expect(unknownError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN,
);
const checkError = new EntityDatabaseAdapterCheckConstraintError('test');
expect(checkError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(checkError.state).toBe(EntityErrorState.PERMANENT);
expect(checkError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT,
);
const exclusionError = new EntityDatabaseAdapterExclusionConstraintError('test');
expect(exclusionError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(exclusionError.state).toBe(EntityErrorState.PERMANENT);
expect(exclusionError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT,
);
const foreignKeyError = new EntityDatabaseAdapterForeignKeyConstraintError('test');
expect(foreignKeyError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(foreignKeyError.state).toBe(EntityErrorState.PERMANENT);
expect(foreignKeyError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT,
);
const notNullError = new EntityDatabaseAdapterNotNullConstraintError('test');
expect(notNullError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(notNullError.state).toBe(EntityErrorState.PERMANENT);
expect(notNullError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT,
);
const paginationCursorInvalidError = new EntityDatabaseAdapterPaginationCursorInvalidError(
'test',
);
expect(paginationCursorInvalidError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(paginationCursorInvalidError.state).toBe(EntityErrorState.PERMANENT);
expect(paginationCursorInvalidError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID,
);
const lockNotAvailableError = new EntityDatabaseAdapterLockNotAvailableError('test');
expect(lockNotAvailableError).toBeInstanceOf(EntityDatabaseAdapterError);
expect(lockNotAvailableError.state).toBe(EntityErrorState.TRANSIENT);
expect(lockNotAvailableError.code).toBe(
KnexEntityDatabaseAdapterErrorCode.ERR_ENTITY_DATABASE_ADAPTER_LOCK_NOT_AVAILABLE,
);
});
});
@@ -1,8 +1,27 @@
import { EntityErrorState } from '@expo/entity';
import { describe, expect, it } from '@jest/globals';
import { EntityDatabaseAdapterLockNotAvailableError } from '../KnexEntityDatabaseAdapterError.ts';
import { wrapNativePostgresCallAsync } from '../wrapNativePostgresCallAsync.ts';
describe(wrapNativePostgresCallAsync, () => {
it('translates a PostgreSQL lock_not_available error and preserves the cause', async () => {
const error = Object.assign(new Error('canceling statement due to lock timeout'), {
code: '55P03',
});
const result = wrapNativePostgresCallAsync(async () => {
throw error;
});
await expect(result).rejects.toBeInstanceOf(EntityDatabaseAdapterLockNotAvailableError);
await expect(result).rejects.toMatchObject({
state: EntityErrorState.TRANSIENT,
message: error.message,
stack: error.stack,
cause: error,
});
});
it('rethrows literals', async () => {
const throwingFn = async (): Promise<void> => {
// eslint-disable-next-line no-throw-literal,@typescript-eslint/only-throw-error
@@ -1,14 +1,16 @@
import type { EntityDatabaseAdapterError } from '@expo/entity';
import { EntityDatabaseAdapterUniqueConstraintError } from '@expo/entity';
import knex from 'knex';
import {
EntityDatabaseAdapterCheckConstraintError,
EntityDatabaseAdapterExclusionConstraintError,
EntityDatabaseAdapterForeignKeyConstraintError,
EntityDatabaseAdapterLockNotAvailableError,
EntityDatabaseAdapterNotNullConstraintError,
EntityDatabaseAdapterTransientError,
EntityDatabaseAdapterUniqueConstraintError,
EntityDatabaseAdapterUnknownError,
} from '@expo/entity';
import knex from 'knex';
} from './KnexEntityDatabaseAdapterError.ts';
function wrapNativePostgresError(
error: Error & { code?: string },
@@ -38,6 +40,8 @@ function translatePostgresError(
return new EntityDatabaseAdapterCheckConstraintError(error.message, error);
case '23P01':
return new EntityDatabaseAdapterExclusionConstraintError(error.message, error);
case '55P03':
return new EntityDatabaseAdapterLockNotAvailableError(error.message, error);
default:
return new EntityDatabaseAdapterUnknownError(error.message, error);
}
@@ -18,6 +18,7 @@ export * from './PostgresEntityDatabaseAdapterProvider.ts';
export * from './PostgresEntityQueryContextProvider.ts';
export * from './ReadonlyPostgresEntity.ts';
export * from './SQLOperator.ts';
export * from './errors/KnexEntityDatabaseAdapterError.ts';
export * from './errors/wrapNativePostgresCallAsync.ts';
export * from './internal/EntityKnexDataManager.ts';
export * from './internal/getKnexDataManager.ts';
@@ -1,6 +1,5 @@
import type { EntityConfiguration, EntityQueryContext, IEntityMetricsAdapter } from '@expo/entity';
import {
EntityDatabaseAdapterPaginationCursorInvalidError,
EntityMetricsCountType,
EntityMetricsLoadType,
getDatabaseFieldForEntityField,
@@ -18,6 +17,7 @@ import type {
import { NullsOrdering, OrderByOrdering } from '../BasePostgresEntityDatabaseAdapter.ts';
import { PaginationStrategy } from '../PaginationStrategy.ts';
import { SQLFragment, SQLExpression, identifier, sql, unsafeRaw } from '../SQLOperator.ts';
import { EntityDatabaseAdapterPaginationCursorInvalidError } from '../errors/KnexEntityDatabaseAdapterError.ts';
import type { DistributiveOmit, NonNullableKeys } from './utilityTypes.ts';
interface DataManagerStandardSpecification<TFields extends Record<string, any>> {
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-example
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-example
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-example
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-example",
"version": "0.69.0",
"version": "0.71.0",
"private": true,
"description": "An example integration of the @expo/entity framework",
"keywords": [
@@ -30,7 +30,7 @@
"koa": "3.2.1"
},
"devDependencies": {
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"@types/koa": "3.0.3",
"@types/koa__cors": "5.0.1",
"@types/koa__router": "12.0.5",
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-full-integration-tests
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-full-integration-tests
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-full-integration-tests
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-full-integration-tests",
"version": "0.69.0",
"version": "0.71.0",
"private": true,
"description": "Full redis and knex integration tests for the entity framework",
"keywords": [
@@ -22,7 +22,7 @@
"@expo/entity-database-adapter-knex": "workspace:^"
},
"devDependencies": {
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"typescript": "6.0.3"
},
"engines": {
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-ip-address-field
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-ip-address-field
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-ip-address-field
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-ip-address-field",
"version": "0.69.0",
"version": "0.71.0",
"description": "IP address EntityField definitions for @expo/entity",
"keywords": [
"entity"
@@ -30,7 +30,7 @@
},
"devDependencies": {
"@expo/entity-testing-utils": "workspace:^",
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"typescript": "6.0.3"
},
"engines": {
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-secondary-cache-local-memory
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-secondary-cache-local-memory
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-secondary-cache-local-memory
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-secondary-cache-local-memory",
"version": "0.69.0",
"version": "0.71.0",
"description": "Local memory secondary cache for @expo/entity",
"keywords": [
"entity"
@@ -32,7 +32,7 @@
"devDependencies": {
"@expo/nullthrows": "2.1.0",
"@isaacs/ttlcache": "2.1.5",
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"typescript": "6.0.3"
},
"engines": {
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
**Note:** Version bump only for package @expo/entity-secondary-cache-redis
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-secondary-cache-redis
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-secondary-cache-redis
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-secondary-cache-redis",
"version": "0.69.0",
"version": "0.71.0",
"description": "Redis secondary cache for @expo/entity",
"keywords": [
"entity"
@@ -30,7 +30,7 @@
},
"devDependencies": {
"@expo/nullthrows": "2.1.0",
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"ioredis": "5.11.1",
"typescript": "6.0.3"
},
@@ -3,6 +3,16 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
### Bug Fixes
- declare runtime dependencies imported by published packages ([#717](https://github.com/expo/entity/issues/717)) ([3c96f3b](https://github.com/expo/entity/commit/3c96f3b9ea2b097c979447354f0abe35ed5e8d57))
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity-testing-utils
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity-testing-utils
+5 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/entity-testing-utils",
"version": "0.69.0",
"version": "0.71.0",
"description": "A package containing utilities for testing applications that use Entity",
"keywords": [
"entity"
@@ -26,11 +26,13 @@
},
"dependencies": {
"@expo/entity": "workspace:^",
"invariant": "^2.2.4",
"lodash-es": "^4.17.23",
"ts-mockito": "^2.6.1"
"ts-mockito": "^2.6.1",
"uuid": "^14.0.0"
},
"devDependencies": {
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"@types/lodash-es": "4.17.12",
"@types/node": "24.19.1",
"typescript": "6.0.3"
+10
View File
@@ -3,6 +3,16 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [0.71.0](https://github.com/expo/entity/compare/v0.70.0...v0.71.0) (2026-10-09)
### Bug Fixes
- declare runtime dependencies imported by published packages ([#717](https://github.com/expo/entity/issues/717)) ([3c96f3b](https://github.com/expo/entity/commit/3c96f3b9ea2b097c979447354f0abe35ed5e8d57))
# [0.70.0](https://github.com/expo/entity/compare/v0.69.0...v0.70.0) (2026-10-05)
**Note:** Version bump only for package @expo/entity
# [0.69.0](https://github.com/expo/entity/compare/v0.68.0...v0.69.0) (2026-09-29)
**Note:** Version bump only for package @expo/entity
+3 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/entity",
"version": "0.69.0",
"version": "0.71.0",
"description": "A privacy-first data model",
"keywords": [
"entity"
@@ -25,12 +25,13 @@
"test": "yarn test:all --rootDir $(pwd)"
},
"dependencies": {
"@expo/nullthrows": "^2.1.0",
"@expo/results": "^1.0.0",
"dataloader": "^2.2.3",
"invariant": "^2.2.4"
},
"devDependencies": {
"@jest/globals": "30.5.1",
"@jest/globals": "30.5.2",
"@types/invariant": "2.2.37",
"@types/lodash-es": "4.17.12",
"@types/node": "24.19.1",
@@ -9,115 +9,6 @@ export abstract class EntityDatabaseAdapterError extends EntityError {
}
}
/**
* Thrown when a transient error occurrs within the database adapter.
* Transient errors may succeed if retried.
*/
export class EntityDatabaseAdapterTransientError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterTransientError';
}
get state(): EntityErrorState.TRANSIENT {
return EntityErrorState.TRANSIENT;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT;
}
}
/**
* Thrown when an unknown error occurrs within the database adapter.
* This is a catch-all error class for DBMS-specific errors that do not fit into other categories.
*/
export class EntityDatabaseAdapterUnknownError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterUnknownError';
}
get state(): EntityErrorState.UNKNOWN {
return EntityErrorState.UNKNOWN;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN;
}
}
/**
* Thrown when a check constraint is violated within the database adapter.
* This indicates that a value being inserted or updated does not satisfy a defined data integrity constraint.
*/
export class EntityDatabaseAdapterCheckConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterCheckConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT;
}
}
/**
* Thrown when an exclusion constraint is violated within the database adapter.
* This indicates that a value being inserted or updated conflicts with an existing value based on a defined exclusion constraint.
*/
export class EntityDatabaseAdapterExclusionConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterExclusionConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT;
}
}
/**
* Thrown when a foreign key constraint is violated within the database adapter.
* This indicates that a value being inserted, updated, or deleted references a non-existent value in a related table
* or is referenced in a related table.
*/
export class EntityDatabaseAdapterForeignKeyConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterForeignKeyConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT;
}
}
/**
* Thrown when a not-null constraint is violated within the database adapter.
* This indicates that a null value is being inserted or updated into a column that does not allow null values.
*/
export class EntityDatabaseAdapterNotNullConstraintError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterNotNullConstraintError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT;
}
}
/**
* Thrown when a unique constraint is violated within the database adapter.
* This indicates that a value being inserted or updated duplicates an existing value in a column or set of columns
@@ -231,17 +122,3 @@ export class EntityDatabaseAdapterExcessiveDeleteResultError extends EntityDatab
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT;
}
}
export class EntityDatabaseAdapterPaginationCursorInvalidError extends EntityDatabaseAdapterError {
static {
this.prototype.name = 'EntityDatabaseAdapterPaginationCursorError';
}
get state(): EntityErrorState.PERMANENT {
return EntityErrorState.PERMANENT;
}
get code(): EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID {
return EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID;
}
}
+3 -9
View File
@@ -8,18 +8,13 @@ export enum EntityErrorState {
}
/**
* Error code for an entity error. Each error code should map to a specific class of Entity error.
* Error code for an entity error defined in this package. Each error code should map to a specific class of Entity error.
* Other packages that define entity errors (such as database adapter implementations) define their own error code enums.
*/
export enum EntityErrorCode {
ERR_ENTITY_NOT_AUTHORIZED = 'ERR_ENTITY_NOT_AUTHORIZED',
ERR_ENTITY_NOT_FOUND = 'ERR_ENTITY_NOT_FOUND',
ERR_ENTITY_INVALID_FIELD_VALUE = 'ERR_ENTITY_INVALID_FIELD_VALUE',
ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT = 'ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT',
ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN = 'ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN',
ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_UNIQUE_CONSTRAINT = 'ERR_ENTITY_DATABASE_ADAPTER_UNIQUE_CONSTRAINT',
ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_INSERT_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_INSERT_RESULT',
ERR_ENTITY_DATABASE_ADAPTER_EMPTY_INSERT_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EMPTY_INSERT_RESULT',
@@ -27,7 +22,6 @@ export enum EntityErrorCode {
ERR_ENTITY_DATABASE_ADAPTER_EMPTY_UPDATE_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EMPTY_UPDATE_RESULT',
ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT = 'ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT',
ERR_ENTITY_CACHE_ADAPTER_TRANSIENT = 'ERR_ENTITY_CACHE_ADAPTER_TRANSIENT',
ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID = 'ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID',
}
/**
@@ -39,7 +33,7 @@ export abstract class EntityError extends Error {
}
public abstract readonly state: EntityErrorState;
public abstract readonly code: EntityErrorCode;
public abstract readonly code: string;
constructor(message: string, cause?: Error) {
super(message, { cause });
@@ -1,20 +1,13 @@
import { describe, expect, it } from '@jest/globals';
import {
EntityDatabaseAdapterCheckConstraintError,
EntityDatabaseAdapterEmptyInsertResultError,
EntityDatabaseAdapterEmptyUpdateResultError,
EntityDatabaseAdapterError,
EntityDatabaseAdapterExcessiveDeleteResultError,
EntityDatabaseAdapterExcessiveInsertResultError,
EntityDatabaseAdapterExcessiveUpdateResultError,
EntityDatabaseAdapterExclusionConstraintError,
EntityDatabaseAdapterForeignKeyConstraintError,
EntityDatabaseAdapterNotNullConstraintError,
EntityDatabaseAdapterPaginationCursorInvalidError,
EntityDatabaseAdapterTransientError,
EntityDatabaseAdapterUniqueConstraintError,
EntityDatabaseAdapterUnknownError,
} from '../EntityDatabaseAdapterError.ts';
import { EntityErrorCode, EntityErrorState } from '../EntityError.ts';
@@ -22,34 +15,6 @@ describe(EntityDatabaseAdapterError, () => {
// necessary for coverage within the entity package since these errors are
// currently only ever instantiated by database adapter implementations
it('instantiates all errors with correct state and code', () => {
const transientError = new EntityDatabaseAdapterTransientError('test');
expect(transientError.state).toBe(EntityErrorState.TRANSIENT);
expect(transientError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_TRANSIENT);
const unknownError = new EntityDatabaseAdapterUnknownError('test');
expect(unknownError.state).toBe(EntityErrorState.UNKNOWN);
expect(unknownError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNKNOWN);
const checkError = new EntityDatabaseAdapterCheckConstraintError('test');
expect(checkError.state).toBe(EntityErrorState.PERMANENT);
expect(checkError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_CHECK_CONSTRAINT);
const exclusionError = new EntityDatabaseAdapterExclusionConstraintError('test');
expect(exclusionError.state).toBe(EntityErrorState.PERMANENT);
expect(exclusionError.code).toBe(
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCLUSION_CONSTRAINT,
);
const foreignKeyError = new EntityDatabaseAdapterForeignKeyConstraintError('test');
expect(foreignKeyError.state).toBe(EntityErrorState.PERMANENT);
expect(foreignKeyError.code).toBe(
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_FOREIGN_KEY_CONSTRAINT,
);
const notNullError = new EntityDatabaseAdapterNotNullConstraintError('test');
expect(notNullError.state).toBe(EntityErrorState.PERMANENT);
expect(notNullError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_NOT_NULL_CONSTRAINT);
const uniqueError = new EntityDatabaseAdapterUniqueConstraintError('test');
expect(uniqueError.state).toBe(EntityErrorState.PERMANENT);
expect(uniqueError.code).toBe(EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_UNIQUE_CONSTRAINT);
@@ -83,13 +48,5 @@ describe(EntityDatabaseAdapterError, () => {
expect(excessiveDeleteError.code).toBe(
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_EXCESSIVE_DELETE_RESULT,
);
const paginationCursorInvalidError = new EntityDatabaseAdapterPaginationCursorInvalidError(
'test',
);
expect(paginationCursorInvalidError.state).toBe(EntityErrorState.PERMANENT);
expect(paginationCursorInvalidError.code).toBe(
EntityErrorCode.ERR_ENTITY_DATABASE_ADAPTER_PAGINATION_CURSOR_INVALID,
);
});
});
Generated
+204 -198
View File
@@ -863,7 +863,7 @@ __metadata:
"@expo/entity": "workspace:^"
"@expo/entity-testing-utils": "workspace:^"
"@isaacs/ttlcache": "npm:2.1.5"
"@jest/globals": "npm:30.5.1"
"@jest/globals": "npm:30.5.2"
typescript: "npm:6.0.3"
languageName: unknown
linkType: soft
@@ -875,7 +875,7 @@ __metadata:
"@expo/batcher": "npm:1.1.2"
"@expo/entity": "workspace:^"
"@expo/entity-testing-utils": "workspace:^"
"@jest/globals": "npm:30.5.1"
"@jest/globals": "npm:30.5.2"
ioredis: "npm:5.11.1"
ts-mockito: "npm:2.6.1"
typescript: "npm:6.0.3"
@@ -888,7 +888,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@expo/entity-codemod@workspace:packages/entity-codemod"
dependencies:
"@jest/globals": "npm:30.5.1"
"@jest/globals": "npm:30.5.2"
"@types/jscodeshift": "npm:17.3.0"
"@types/node": "npm:24.19.1"
jscodeshift: "npm:17.4.0"
@@ -902,7 +902,8 @@ __metadata:
dependencies:
"@expo/entity": "workspace:^"
"@expo/entity-database-adapter-knex": "workspace:^"
"@jest/globals": "npm:30.5.1"
"@expo/entity-testing-utils": "workspace:^"
"@jest/globals": "npm:30.5.2"
"@types/invariant": "npm:2.2.37"
"@types/node": "npm:24.19.1"
invariant: "npm:^2.2.4"
@@ -919,7 +920,8 @@ __metadata:
dependencies:
"@expo/entity": "workspace:^"
"@expo/entity-testing-utils": "workspace:^"
"@jest/globals": "npm:30.5.1"
"@expo/results": "npm:^1.0.0"
"@jest/globals": "npm:30.5.2"
knex: "npm:^3.2.9"
pg: "npm:8.23.1"
ts-mockito: "npm:2.6.1"
@@ -935,7 +937,7 @@ __metadata:
"@as-integrations/koa": "npm:1.1.1"
"@expo/entity": "workspace:^"
"@expo/entity-testing-utils": "workspace:^"
"@jest/globals": "npm:30.5.1"
"@jest/globals": "npm:30.5.2"
"@koa/bodyparser": "npm:6.1.0"
"@koa/cors": "npm:5.0.0"
"@koa/router": "npm:15.4.0"
@@ -957,7 +959,7 @@ __metadata:
"@expo/entity": "workspace:^"
"@expo/entity-cache-adapter-redis": "workspace:^"
"@expo/entity-database-adapter-knex": "workspace:^"
"@jest/globals": "npm:30.5.1"
"@jest/globals": "npm:30.5.2"
typescript: "npm:6.0.3"
languageName: unknown
linkType: soft
@@ -968,7 +970,7 @@ __metadata:
dependencies:
"@expo/entity": "workspace:^"
"@expo/entity-testing-utils": "workspace:^"
"@jest/globals": "npm:30.5.1"
"@jest/globals": "npm:30.5.2"
ip-address: "npm:^10.1.0"
typescript: "npm:6.0.3"
languageName: unknown
@@ -982,7 +984,7 @@ __metadata:
"@expo/entity-cache-adapter-local-memory": "workspace:^"
"@expo/nullthrows": "npm:2.1.0"
"@isaacs/ttlcache": "npm:2.1.5"
"@jest/globals": "npm:30.5.1"
"@jest/globals": "npm:30.5.2"
typescript: "npm:6.0.3"
languageName: unknown
linkType: soft
@@ -994,7 +996,7 @@ __metadata:
"@expo/entity": "workspace:^"
"@expo/entity-cache-adapter-redis": "workspace:^"
"@expo/nullthrows": "npm:2.1.0"
"@jest/globals": "npm:30.5.1"
"@jest/globals": "npm:30.5.2"
ioredis: "npm:5.11.1"
typescript: "npm:6.0.3"
languageName: unknown
@@ -1005,12 +1007,14 @@ __metadata:
resolution: "@expo/entity-testing-utils@workspace:packages/entity-testing-utils"
dependencies:
"@expo/entity": "workspace:^"
"@jest/globals": "npm:30.5.1"
"@jest/globals": "npm:30.5.2"
"@types/lodash-es": "npm:4.17.12"
"@types/node": "npm:24.19.1"
invariant: "npm:^2.2.4"
lodash-es: "npm:^4.17.23"
ts-mockito: "npm:^2.6.1"
typescript: "npm:6.0.3"
uuid: "npm:^14.0.0"
peerDependencies:
"@jest/globals": "*"
languageName: unknown
@@ -1020,8 +1024,9 @@ __metadata:
version: 0.0.0-use.local
resolution: "@expo/entity@workspace:packages/entity"
dependencies:
"@expo/nullthrows": "npm:^2.1.0"
"@expo/results": "npm:^1.0.0"
"@jest/globals": "npm:30.5.1"
"@jest/globals": "npm:30.5.2"
"@types/invariant": "npm:2.2.37"
"@types/lodash-es": "npm:4.17.12"
"@types/node": "npm:24.19.1"
@@ -1034,7 +1039,7 @@ __metadata:
languageName: unknown
linkType: soft
"@expo/nullthrows@npm:2.1.0":
"@expo/nullthrows@npm:2.1.0, @expo/nullthrows@npm:^2.1.0":
version: 2.1.0
resolution: "@expo/nullthrows@npm:2.1.0"
checksum: 10c0/9f0b7f8ebcf5932ecc9bd2c55a4892ad35e009d21448881455b3f491bb96751586041fb852577c6c43b89c5df74a14b0693e9f2156093ffa1073be5d0670054f
@@ -1448,9 +1453,9 @@ __metadata:
languageName: node
linkType: hard
"@jest/console@npm:30.5.1":
version: 30.5.1
resolution: "@jest/console@npm:30.5.1"
"@jest/console@npm:30.5.2":
version: 30.5.2
resolution: "@jest/console@npm:30.5.2"
dependencies:
"@jest/types": "npm:30.5.1"
"@types/node": "npm:*"
@@ -1458,19 +1463,19 @@ __metadata:
jest-message-util: "npm:30.5.1"
jest-util: "npm:30.5.1"
slash: "npm:^3.0.0"
checksum: 10c0/c4d674fd36bbbbe5605445782a298233eee356c71ef7cb11d097ce961b940a3d78278f8291f56f9c5102453abbbe36c1eb7d5b7279cd1facc16465c8beeeadcf
checksum: 10c0/1e7b14f09eec6af78dbe9d4acea6613c184409aa16ddc9ee86ced5b5ec7969f52da588e6bb300dc6333e82dc172aeb54a9f5cc8f7d50651586723288ac9c5ba4
languageName: node
linkType: hard
"@jest/core@npm:30.5.1":
version: 30.5.1
resolution: "@jest/core@npm:30.5.1"
"@jest/core@npm:30.5.2":
version: 30.5.2
resolution: "@jest/core@npm:30.5.2"
dependencies:
"@jest/console": "npm:30.5.1"
"@jest/console": "npm:30.5.2"
"@jest/pattern": "npm:30.5.0"
"@jest/reporters": "npm:30.5.1"
"@jest/test-result": "npm:30.5.1"
"@jest/transform": "npm:30.5.1"
"@jest/reporters": "npm:30.5.2"
"@jest/test-result": "npm:30.5.2"
"@jest/transform": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
"@types/node": "npm:*"
ansi-escapes: "npm:^4.3.2"
@@ -1480,18 +1485,18 @@ __metadata:
fast-json-stable-stringify: "npm:^2.1.0"
graceful-fs: "npm:^4.2.11"
jest-changed-files: "npm:30.5.1"
jest-config: "npm:30.5.1"
jest-config: "npm:30.5.2"
jest-haste-map: "npm:30.5.1"
jest-message-util: "npm:30.5.1"
jest-regex-util: "npm:30.5.0"
jest-resolve: "npm:30.5.1"
jest-resolve-dependencies: "npm:30.5.1"
jest-runner: "npm:30.5.1"
jest-runtime: "npm:30.5.1"
jest-snapshot: "npm:30.5.1"
jest-resolve-dependencies: "npm:30.5.2"
jest-runner: "npm:30.5.2"
jest-runtime: "npm:30.5.2"
jest-snapshot: "npm:30.5.2"
jest-util: "npm:30.5.1"
jest-validate: "npm:30.5.1"
jest-watcher: "npm:30.5.1"
jest-watcher: "npm:30.5.2"
pretty-format: "npm:30.5.1"
slash: "npm:^3.0.0"
peerDependencies:
@@ -1499,7 +1504,7 @@ __metadata:
peerDependenciesMeta:
node-notifier:
optional: true
checksum: 10c0/a463de91ba0b0cfcbacb2f361abf0b02280740e93257d6f9d54383670aaab1522373cf2d502437d366d364331de7bbc735abed59c12afc63d4a7f41ba927892d
checksum: 10c0/9fa38140cb0a3c0eafa2ebd0595a42c0bdb13c6b7dacb398fe214cbc6dd750d7498b84a54e48f829b49e319d3ef480d0b9e47f0c53e1758ee528ea1b8f968fe6
languageName: node
linkType: hard
@@ -1517,48 +1522,48 @@ __metadata:
languageName: node
linkType: hard
"@jest/environment@npm:30.5.1":
version: 30.5.1
resolution: "@jest/environment@npm:30.5.1"
"@jest/environment@npm:30.5.2":
version: 30.5.2
resolution: "@jest/environment@npm:30.5.2"
dependencies:
"@jest/fake-timers": "npm:30.5.1"
"@jest/fake-timers": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
"@types/node": "npm:*"
jest-mock: "npm:30.5.1"
checksum: 10c0/f8cd7e3827927aef443f6d96700685f6526df66339b963f7ed8b6f62cd92b524f85383cf955c798ca4e17bfd8ad74503b0d548e504322c323e9eae089bc5b639
jest-mock: "npm:30.5.2"
checksum: 10c0/f060f2d94dfccd7de4890a419e803735921d8358a3ecc8e424e5f6a632da80fc37372f6e54f1397876b721cec5bae2da515e6dce2ac6558bd90f0c1cbeb5c105
languageName: node
linkType: hard
"@jest/expect-utils@npm:30.5.1":
version: 30.5.1
resolution: "@jest/expect-utils@npm:30.5.1"
"@jest/expect-utils@npm:30.5.2":
version: 30.5.2
resolution: "@jest/expect-utils@npm:30.5.2"
dependencies:
"@jest/get-type": "npm:30.5.0"
checksum: 10c0/8e154abddb5ff73cbd36d602b577fa7f64509ebcc2f5580794d813165f7ca9456b4d61f609d18b42de7647d0cfe1f275a36084d2c0bbf6818479a889f1afee17
checksum: 10c0/0db00595907f6705c5acc8d10ee9d11d74960cd459beaae66bd7a1d6845c7df1d123295e957bb56b6882b380f2e7d55d277ced7646e0229fc4a67abeb713c048
languageName: node
linkType: hard
"@jest/expect@npm:30.5.1":
version: 30.5.1
resolution: "@jest/expect@npm:30.5.1"
"@jest/expect@npm:30.5.2":
version: 30.5.2
resolution: "@jest/expect@npm:30.5.2"
dependencies:
expect: "npm:30.5.1"
jest-snapshot: "npm:30.5.1"
checksum: 10c0/a6e8dd1491964b01859260607247583eb06cedbdf3b1e4bd3e7b257ef7fbf25e15ad303f60e280f70f045497fa1d82647e6167ad2d7bd46496b39727781bd825
expect: "npm:30.5.2"
jest-snapshot: "npm:30.5.2"
checksum: 10c0/ceebb291be34707e3d2ac99bc5e4a5039927e01d28650b1dc51888dfa3963a3a75a3c72f0abe4df9aa243dc3b31af72e467072d75b52bd11b80a84ebe765d8f9
languageName: node
linkType: hard
"@jest/fake-timers@npm:30.5.1":
version: 30.5.1
resolution: "@jest/fake-timers@npm:30.5.1"
"@jest/fake-timers@npm:30.5.2":
version: 30.5.2
resolution: "@jest/fake-timers@npm:30.5.2"
dependencies:
"@jest/types": "npm:30.5.1"
"@sinonjs/fake-timers": "npm:^15.4.0"
"@types/node": "npm:*"
jest-message-util: "npm:30.5.1"
jest-mock: "npm:30.5.1"
jest-mock: "npm:30.5.2"
jest-util: "npm:30.5.1"
checksum: 10c0/5af701f17c6909a5d5ec0db64a024ba0b8399e68fdbcb465bb3cb4ca61edaafed232fb60497b64b4181a1487d63fa10b0d11a5654cfeb2428360cbf10e97857d
checksum: 10c0/c8ff08f541743210abaf07b75bfe6224458c816a500d5be954690fd1661cd14b054201dfe2a6ebdc0083290d4c03d73bbac4f3c1fbef5c3b16d1981642dfff57
languageName: node
linkType: hard
@@ -1576,15 +1581,15 @@ __metadata:
languageName: node
linkType: hard
"@jest/globals@npm:30.5.1":
version: 30.5.1
resolution: "@jest/globals@npm:30.5.1"
"@jest/globals@npm:30.5.2":
version: 30.5.2
resolution: "@jest/globals@npm:30.5.2"
dependencies:
"@jest/environment": "npm:30.5.1"
"@jest/expect": "npm:30.5.1"
"@jest/environment": "npm:30.5.2"
"@jest/expect": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
jest-mock: "npm:30.5.1"
checksum: 10c0/7cc9ad8f382c244ef913398ffcae64fa1f2ebf3b7729022fdba12f4c04f75d4cd7440417ff900ba3cfbebd1b851ee11ecbf348e157320229bec8dfc8d595ca2b
jest-mock: "npm:30.5.2"
checksum: 10c0/e60738080d4866350b2152d98ddf99728cc1ac19983b80bea5d5ab219f82ef271fadd102b0cee2c01808367d6e054bea1c4ec4aa7c69e45b4e14b79a30f76538
languageName: node
linkType: hard
@@ -1612,14 +1617,14 @@ __metadata:
languageName: node
linkType: hard
"@jest/reporters@npm:30.5.1":
version: 30.5.1
resolution: "@jest/reporters@npm:30.5.1"
"@jest/reporters@npm:30.5.2":
version: 30.5.2
resolution: "@jest/reporters@npm:30.5.2"
dependencies:
"@bcoe/v8-coverage": "npm:^0.2.3"
"@jest/console": "npm:30.5.1"
"@jest/test-result": "npm:30.5.1"
"@jest/transform": "npm:30.5.1"
"@jest/console": "npm:30.5.2"
"@jest/test-result": "npm:30.5.2"
"@jest/transform": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
"@jridgewell/trace-mapping": "npm:^0.3.31"
"@types/node": "npm:*"
@@ -1644,7 +1649,7 @@ __metadata:
peerDependenciesMeta:
node-notifier:
optional: true
checksum: 10c0/7e0fee38be99ae436572552398035d7c5f7cedede60569c9c6e3c5887982e0b8c3a049f9cf83f17ccfe4e19da085ab3a30de412206503e2617a7ee62233bddd8
checksum: 10c0/be9c62eb48ecd8744226c65c4bcdfb2b2a807dbac451a0b136701aa6685b5566fbd4872874504da5d7c24d6686ed0afdcff02dc1ecd2d0231fd4cda0dc040eab
languageName: node
linkType: hard
@@ -1678,45 +1683,45 @@ __metadata:
languageName: node
linkType: hard
"@jest/source-map@npm:30.5.0":
version: 30.5.0
resolution: "@jest/source-map@npm:30.5.0"
"@jest/source-map@npm:30.5.2":
version: 30.5.2
resolution: "@jest/source-map@npm:30.5.2"
dependencies:
"@jridgewell/trace-mapping": "npm:^0.3.31"
callsites: "npm:^3.1.0"
convert-source-map: "npm:^2.0.0"
graceful-fs: "npm:^4.2.11"
checksum: 10c0/26e63b86abcbe439e83487d9f4fef0efc34033194264df19fda2c0d1152033e3e5fe5733e13c56aea74e7fc77971128d6c76d6a1cd5ad390ee46028fe9a6a97e
checksum: 10c0/6d939ebec2a2a7322fd0c5d536810a4ac4fbf3700a47b6246829715791270386ba4e58b51f939532d061e06830cea3cc6c3026b2bb0234c9c6594df0fcb17495
languageName: node
linkType: hard
"@jest/test-result@npm:30.5.1":
version: 30.5.1
resolution: "@jest/test-result@npm:30.5.1"
"@jest/test-result@npm:30.5.2":
version: 30.5.2
resolution: "@jest/test-result@npm:30.5.2"
dependencies:
"@jest/console": "npm:30.5.1"
"@jest/console": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
"@types/istanbul-lib-coverage": "npm:^2.0.6"
collect-v8-coverage: "npm:^1.0.2"
checksum: 10c0/1563a0c0ac59985d49d1f67dec92b671581d3f6ae8d6b2faeb5668523062040a2665939d0625e3adfef5fa1abccd910f3b7de799a933a1880ec8cb6069b691e6
checksum: 10c0/936ceb0a647e09eb00fa10bae0c19dd45c8029a1ba984ab4c22871fea68a72c0e5db9eebb48166af31c305b351978a2bcd23cbe59567587ca41c095d6c09c3c7
languageName: node
linkType: hard
"@jest/test-sequencer@npm:30.5.1":
version: 30.5.1
resolution: "@jest/test-sequencer@npm:30.5.1"
"@jest/test-sequencer@npm:30.5.2":
version: 30.5.2
resolution: "@jest/test-sequencer@npm:30.5.2"
dependencies:
"@jest/test-result": "npm:30.5.1"
"@jest/test-result": "npm:30.5.2"
graceful-fs: "npm:^4.2.11"
jest-haste-map: "npm:30.5.1"
slash: "npm:^3.0.0"
checksum: 10c0/ea197d1fd59f7c4a991088a68972b2704c6d24e048be619b992a5fc107e72c567a1180e745404356fe0e9515df069ed86cf9ab56f399435736d5ceee03d0bc2c
checksum: 10c0/de92712f0ce196a0e36ea1beb1b70aa12c76ccf31e4017f1377473d41c76a672a5b810b054f53ecbd8b3d085208aad56fa60d4574b823958d279175c9fc6ad31
languageName: node
linkType: hard
"@jest/transform@npm:30.5.1":
version: 30.5.1
resolution: "@jest/transform@npm:30.5.1"
"@jest/transform@npm:30.5.2":
version: 30.5.2
resolution: "@jest/transform@npm:30.5.2"
dependencies:
"@babel/core": "npm:^7.27.4"
"@jest/types": "npm:30.5.1"
@@ -1732,7 +1737,7 @@ __metadata:
pirates: "npm:^4.0.7"
slash: "npm:^3.0.0"
write-file-atomic: "npm:^5.0.1"
checksum: 10c0/560f48993ede78507dc53eb6e063d1decf139faa8267ed1900541fbe98dce684cc0d70897d09ab976c2bbe4dc4fe3844e4798221da65e40fa93c87ac9efc60f4
checksum: 10c0/be3f9aa812a442402ed41a37d0f11d174a0a9037038dc1326c32d1d55e22fc7bc5f5146284c5a18db3da572afb81739f0a93d3f1d519e811d25dacaeb380c647
languageName: node
linkType: hard
@@ -3925,11 +3930,11 @@ __metadata:
languageName: node
linkType: hard
"babel-jest@npm:30.5.1":
version: 30.5.1
resolution: "babel-jest@npm:30.5.1"
"babel-jest@npm:30.5.2":
version: 30.5.2
resolution: "babel-jest@npm:30.5.2"
dependencies:
"@jest/transform": "npm:30.5.1"
"@jest/transform": "npm:30.5.2"
"@types/babel__core": "npm:^7.20.5"
babel-plugin-istanbul: "npm:^8.0.0"
babel-preset-jest: "npm:30.5.0"
@@ -3938,7 +3943,7 @@ __metadata:
slash: "npm:^3.0.0"
peerDependencies:
"@babel/core": ^7.11.0 || ^8.0.0-0
checksum: 10c0/ce3d18eb45443cb9351074fede247fc6ba7845e18ab4b9ee239a1c47560c939d8194d58f7a08d4ebc7fc1060b33189dd62d41972c68ccec3d82261313b98c6dc
checksum: 10c0/1bba4a4068a5de10dc9d1300c7f22170ffa5e51af8ec145c3efa06c4703994b245cfc212f9961a60b53a6657334fd7266998340edaa65c195eaad37bd62fc43b
languageName: node
linkType: hard
@@ -5452,17 +5457,17 @@ __metadata:
languageName: node
linkType: hard
"expect@npm:30.5.1":
version: 30.5.1
resolution: "expect@npm:30.5.1"
"expect@npm:30.5.2":
version: 30.5.2
resolution: "expect@npm:30.5.2"
dependencies:
"@jest/expect-utils": "npm:30.5.1"
"@jest/expect-utils": "npm:30.5.2"
"@jest/get-type": "npm:30.5.0"
jest-matcher-utils: "npm:30.5.1"
jest-matcher-utils: "npm:30.5.2"
jest-message-util: "npm:30.5.1"
jest-mock: "npm:30.5.1"
jest-mock: "npm:30.5.2"
jest-util: "npm:30.5.1"
checksum: 10c0/351148b185c609a67c4ce5064572d02e7bba11febde47b5177e49fee7e6b680e945034c1ec9414d9fa1f7348a3eceb0d7429f9c9564c693e39c6d138f282370c
checksum: 10c0/31bf2307499008f267c84992a8ea27f76e97f207f685075439aa12f60b93dd81d024e5fcb0142755ed499233056f27fa51d01843d04cba437dfe7588387c352f
languageName: node
linkType: hard
@@ -6684,45 +6689,45 @@ __metadata:
languageName: node
linkType: hard
"jest-circus@npm:30.5.1":
version: 30.5.1
resolution: "jest-circus@npm:30.5.1"
"jest-circus@npm:30.5.2":
version: 30.5.2
resolution: "jest-circus@npm:30.5.2"
dependencies:
"@jest/environment": "npm:30.5.1"
"@jest/expect": "npm:30.5.1"
"@jest/test-result": "npm:30.5.1"
"@jest/environment": "npm:30.5.2"
"@jest/expect": "npm:30.5.2"
"@jest/test-result": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
"@types/node": "npm:*"
chalk: "npm:^4.1.2"
co: "npm:^4.6.0"
dedent: "npm:^1.6.0"
is-generator-fn: "npm:^2.1.0"
jest-each: "npm:30.5.1"
jest-matcher-utils: "npm:30.5.1"
jest-each: "npm:30.5.2"
jest-matcher-utils: "npm:30.5.2"
jest-message-util: "npm:30.5.1"
jest-runtime: "npm:30.5.1"
jest-snapshot: "npm:30.5.1"
jest-runtime: "npm:30.5.2"
jest-snapshot: "npm:30.5.2"
jest-util: "npm:30.5.1"
p-limit: "npm:^3.1.0"
pretty-format: "npm:30.5.1"
pure-rand: "npm:^7.0.0"
slash: "npm:^3.0.0"
stack-utils: "npm:^2.0.6"
checksum: 10c0/dc7ee7e5dcb8415545922372c9909f514a78c7211b14cb31e3064f4b7f4f9ecd9daf55a9702f8f3fa87899e5a70e27f82b8f58d4cac9e6f8fd685f1c06b390d5
checksum: 10c0/e6a1467ab5080c2620cd2bcf47b8dab0402eb15c1322f966915adfbf37bb42b6be2fb75359de198ae489182441f846bde271dd5d44be81c25395d29a161cf3b6
languageName: node
linkType: hard
"jest-cli@npm:30.5.1":
version: 30.5.1
resolution: "jest-cli@npm:30.5.1"
"jest-cli@npm:30.5.2":
version: 30.5.2
resolution: "jest-cli@npm:30.5.2"
dependencies:
"@jest/core": "npm:30.5.1"
"@jest/test-result": "npm:30.5.1"
"@jest/core": "npm:30.5.2"
"@jest/test-result": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
chalk: "npm:^4.1.2"
exit-x: "npm:^0.2.2"
import-local: "npm:^3.2.0"
jest-config: "npm:30.5.1"
jest-config: "npm:30.5.2"
jest-util: "npm:30.5.1"
jest-validate: "npm:30.5.1"
yargs: "npm:^17.7.2"
@@ -6733,31 +6738,31 @@ __metadata:
optional: true
bin:
jest: bin/jest.js
checksum: 10c0/f30d39dbed226ff39a1f79f7361bd1ee8e156e4ff8890b6ff860111398b0d16f148fada806d257e9412986ab054b2545fa8cd3c055db6140fcfe42ebfc9032c9
checksum: 10c0/dfa69c5af0186bb9b5f057234e1412c366d694a809d87f65c973ce208cd9d7a93b854009d728d2dac96a27797dca8f5d132a38e95658ac9bbfbe6c9cf645bd5e
languageName: node
linkType: hard
"jest-config@npm:30.5.1":
version: 30.5.1
resolution: "jest-config@npm:30.5.1"
"jest-config@npm:30.5.2":
version: 30.5.2
resolution: "jest-config@npm:30.5.2"
dependencies:
"@babel/core": "npm:^7.27.4"
"@jest/get-type": "npm:30.5.0"
"@jest/pattern": "npm:30.5.0"
"@jest/test-sequencer": "npm:30.5.1"
"@jest/test-sequencer": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
babel-jest: "npm:30.5.1"
babel-jest: "npm:30.5.2"
chalk: "npm:^4.1.2"
ci-info: "npm:^4.2.0"
deepmerge: "npm:^4.3.1"
glob: "npm:^13.0.6"
graceful-fs: "npm:^4.2.11"
jest-circus: "npm:30.5.1"
jest-circus: "npm:30.5.2"
jest-docblock: "npm:30.5.0"
jest-environment-node: "npm:30.5.1"
jest-environment-node: "npm:30.5.2"
jest-regex-util: "npm:30.5.0"
jest-resolve: "npm:30.5.1"
jest-runner: "npm:30.5.1"
jest-runner: "npm:30.5.2"
jest-util: "npm:30.5.1"
jest-validate: "npm:30.5.1"
parse-json: "npm:^5.2.0"
@@ -6775,19 +6780,19 @@ __metadata:
optional: true
ts-node:
optional: true
checksum: 10c0/c8c0c027cdc386d88825ba9a5db0d906a01c7f3096fc7e8198114c8ed4eb9d801b14d3aefc7a5a2a2b3260dc73a01ea83e1196e0abca3ffebb192eac16c49541
checksum: 10c0/fc554f3009d8a516af41dd0f1ffa47dc78b1127822873c74cec3283a32189be5a1b74b656f9336833d2b509d20eddbd99ecd4b8aeb462bc6ad59246655c72530
languageName: node
linkType: hard
"jest-diff@npm:30.5.1":
version: 30.5.1
resolution: "jest-diff@npm:30.5.1"
"jest-diff@npm:30.5.2":
version: 30.5.2
resolution: "jest-diff@npm:30.5.2"
dependencies:
"@jest/diff-sequences": "npm:30.5.0"
"@jest/get-type": "npm:30.5.0"
chalk: "npm:^4.1.2"
pretty-format: "npm:30.5.1"
checksum: 10c0/06e55c89249cd454f97b88c74ed24fa801646b9cf2b6dbc47c3c9976c6fcf677e8c8ecce2f7768ba2a03053d1640e94a3ad1016048dda2186b9a4069074e231c
checksum: 10c0/b11524e4b7a0c7b83c5b6a3775f705b1002bf086c211e9bd2e481686e3fa0ee1a87e61fa7453232aef2808f085f254f4f8fcbb41b69681d1b9384ec321cf6002
languageName: node
linkType: hard
@@ -6812,31 +6817,32 @@ __metadata:
languageName: node
linkType: hard
"jest-each@npm:30.5.1":
version: 30.5.1
resolution: "jest-each@npm:30.5.1"
"jest-each@npm:30.5.2":
version: 30.5.2
resolution: "jest-each@npm:30.5.2"
dependencies:
"@jest/get-type": "npm:30.5.0"
"@jest/types": "npm:30.5.1"
chalk: "npm:^4.1.2"
jest-regex-util: "npm:30.5.0"
jest-util: "npm:30.5.1"
pretty-format: "npm:30.5.1"
checksum: 10c0/fc61fc731aae1f749fa392780679ed943dd51ff4dc3e5b9db67c3b6c9aa2ed272cfe234625869b5d6cbb1175766a67dc378a9c9872394536843d42ce3b7232f0
checksum: 10c0/25cc136905719a0b97d102b979eaf5ccc21712a29c5b0fca5a9024387a28a0cef7446d70589aa35c284226955446cc6dfde96fc9d5162f1579978f3938335261
languageName: node
linkType: hard
"jest-environment-node@npm:30.5.1":
version: 30.5.1
resolution: "jest-environment-node@npm:30.5.1"
"jest-environment-node@npm:30.5.2":
version: 30.5.2
resolution: "jest-environment-node@npm:30.5.2"
dependencies:
"@jest/environment": "npm:30.5.1"
"@jest/fake-timers": "npm:30.5.1"
"@jest/environment": "npm:30.5.2"
"@jest/fake-timers": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
"@types/node": "npm:*"
jest-mock: "npm:30.5.1"
jest-mock: "npm:30.5.2"
jest-util: "npm:30.5.1"
jest-validate: "npm:30.5.1"
checksum: 10c0/bdef3e7b37eaca8351268ff1128020834c959772daf47f90c06b56d08a11e05e52635c7d7127a661f3a652f8aea77699a5f463dec6205edfff28a0503016f190
checksum: 10c0/9dedafbc92232686277e232ed39c16e272fb8985b715761ea4963b1363317f0e1f52dbc55bd175cb88bf033a06e29a9154bfe192c231f5c2d483db2c693242e9
languageName: node
linkType: hard
@@ -6869,15 +6875,15 @@ __metadata:
languageName: node
linkType: hard
"jest-matcher-utils@npm:30.5.1":
version: 30.5.1
resolution: "jest-matcher-utils@npm:30.5.1"
"jest-matcher-utils@npm:30.5.2":
version: 30.5.2
resolution: "jest-matcher-utils@npm:30.5.2"
dependencies:
"@jest/get-type": "npm:30.5.0"
chalk: "npm:^4.1.2"
jest-diff: "npm:30.5.1"
jest-diff: "npm:30.5.2"
pretty-format: "npm:30.5.1"
checksum: 10c0/5cd6bf25c1fdf4e9439b69ed3911caefe035f2f2180fb6dbb9b648af1a2102e2546b4cc967394d63bb073d64ab4f025f81af5bf94b52acf314d45b9fad90e6fd
checksum: 10c0/30f075c6f897335415817ad25e6caae8994de87c31ad59ae8f501e2c8bf6c925635abb481c562436b6add42a784902f105ee2fa0eca3357bd26e038f7e004cb8
languageName: node
linkType: hard
@@ -6899,15 +6905,15 @@ __metadata:
languageName: node
linkType: hard
"jest-mock@npm:30.5.1":
version: 30.5.1
resolution: "jest-mock@npm:30.5.1"
"jest-mock@npm:30.5.2":
version: 30.5.2
resolution: "jest-mock@npm:30.5.2"
dependencies:
"@jest/expect-utils": "npm:30.5.1"
"@jest/expect-utils": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
"@types/node": "npm:*"
jest-util: "npm:30.5.1"
checksum: 10c0/58b1a7f93142147949e1cf0fd5a0fbd91d8fae466c24950aaf7ea766aeb0c657f48add172a5b614240a77e9f652bf0cecd8365d0fb3aac9b81a938e983f97f16
checksum: 10c0/24cc9ac6449c536ef5009c531e14ee6b145f5d68db6e4c5616a8f775c5c81173e83e2c6c47922d413da4dbf804eab555b91ab424b0bf918495ee1b29d8a8ebaa
languageName: node
linkType: hard
@@ -6918,13 +6924,13 @@ __metadata:
languageName: node
linkType: hard
"jest-resolve-dependencies@npm:30.5.1":
version: 30.5.1
resolution: "jest-resolve-dependencies@npm:30.5.1"
"jest-resolve-dependencies@npm:30.5.2":
version: 30.5.2
resolution: "jest-resolve-dependencies@npm:30.5.2"
dependencies:
jest-regex-util: "npm:30.5.0"
jest-snapshot: "npm:30.5.1"
checksum: 10c0/cc0a2031ec36be9b1986d595798340e751285f868f1b48912c2f5275a333d2b2df9421beea2925dd60db0d63de4f4c195070f66805d0b212c1c1948b1ab0f6af
jest-snapshot: "npm:30.5.2"
checksum: 10c0/9015f81e25bdb10a04a26350ce8deca4d389394ea07cb3b3ba63e567ad0ed91bfcc27e7048289faaaa5865519e4ed8a14c238685d38f33bda5576298852c7ac0
languageName: node
linkType: hard
@@ -6943,15 +6949,15 @@ __metadata:
languageName: node
linkType: hard
"jest-runner@npm:30.5.1":
version: 30.5.1
resolution: "jest-runner@npm:30.5.1"
"jest-runner@npm:30.5.2":
version: 30.5.2
resolution: "jest-runner@npm:30.5.2"
dependencies:
"@jest/console": "npm:30.5.1"
"@jest/environment": "npm:30.5.1"
"@jest/source-map": "npm:30.5.0"
"@jest/test-result": "npm:30.5.1"
"@jest/transform": "npm:30.5.1"
"@jest/console": "npm:30.5.2"
"@jest/environment": "npm:30.5.2"
"@jest/source-map": "npm:30.5.2"
"@jest/test-result": "npm:30.5.2"
"@jest/transform": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
"@types/node": "npm:*"
chalk: "npm:^4.1.2"
@@ -6959,30 +6965,30 @@ __metadata:
exit-x: "npm:^0.2.2"
graceful-fs: "npm:^4.2.11"
jest-docblock: "npm:30.5.0"
jest-environment-node: "npm:30.5.1"
jest-environment-node: "npm:30.5.2"
jest-haste-map: "npm:30.5.1"
jest-leak-detector: "npm:30.5.1"
jest-message-util: "npm:30.5.1"
jest-resolve: "npm:30.5.1"
jest-runtime: "npm:30.5.1"
jest-runtime: "npm:30.5.2"
jest-util: "npm:30.5.1"
jest-watcher: "npm:30.5.1"
jest-watcher: "npm:30.5.2"
jest-worker: "npm:30.5.1"
p-limit: "npm:^3.1.0"
checksum: 10c0/37b703fefc9d6f410d3fa659f9601c9e5238e5089c83740038e5e73f8a2ea3bde6f06c4ca4823cf59dbe253ab85eb0fbe4b29d7669d52ce917a49098ec886695
checksum: 10c0/a0a38536df5448905f517e74abd4682e8f48bfb7912b07b29da4daa94c15e468f7ac732806dde7ed4443b07e0fba28c469446009dd2344b52df96913d7db9f24
languageName: node
linkType: hard
"jest-runtime@npm:30.5.1":
version: 30.5.1
resolution: "jest-runtime@npm:30.5.1"
"jest-runtime@npm:30.5.2":
version: 30.5.2
resolution: "jest-runtime@npm:30.5.2"
dependencies:
"@jest/environment": "npm:30.5.1"
"@jest/fake-timers": "npm:30.5.1"
"@jest/globals": "npm:30.5.1"
"@jest/source-map": "npm:30.5.0"
"@jest/test-result": "npm:30.5.1"
"@jest/transform": "npm:30.5.1"
"@jest/environment": "npm:30.5.2"
"@jest/fake-timers": "npm:30.5.2"
"@jest/globals": "npm:30.5.2"
"@jest/source-map": "npm:30.5.2"
"@jest/test-result": "npm:30.5.2"
"@jest/transform": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
"@types/node": "npm:*"
chalk: "npm:^4.1.2"
@@ -6993,43 +6999,43 @@ __metadata:
graceful-fs: "npm:^4.2.11"
jest-haste-map: "npm:30.5.1"
jest-message-util: "npm:30.5.1"
jest-mock: "npm:30.5.1"
jest-mock: "npm:30.5.2"
jest-regex-util: "npm:30.5.0"
jest-resolve: "npm:30.5.1"
jest-snapshot: "npm:30.5.1"
jest-snapshot: "npm:30.5.2"
jest-util: "npm:30.5.1"
slash: "npm:^3.0.0"
strip-bom: "npm:^4.0.0"
checksum: 10c0/6d9ddfbca0124d08dfef2c38ba56506ad29292dfa55d1c5221c57dade2e3b5187628741736608f42b95d8c0ba52bfa4163d3ba3e752bbc1cdee3e7ae858e3f38
checksum: 10c0/c1cb0f5eb8d55d768ece011dbe1bd5197ec4ca2497ed0c1a6d38ea4ba835fa3fd69a8ef6e95650f3f9e181d4f586d8596d14318f7cf8afd3e73c241c03c8dcac
languageName: node
linkType: hard
"jest-snapshot@npm:30.5.1":
version: 30.5.1
resolution: "jest-snapshot@npm:30.5.1"
"jest-snapshot@npm:30.5.2":
version: 30.5.2
resolution: "jest-snapshot@npm:30.5.2"
dependencies:
"@babel/core": "npm:^7.27.4"
"@babel/generator": "npm:^7.27.5"
"@babel/plugin-syntax-jsx": "npm:^7.27.1"
"@babel/plugin-syntax-typescript": "npm:^7.27.1"
"@babel/types": "npm:^7.27.3"
"@jest/expect-utils": "npm:30.5.1"
"@jest/expect-utils": "npm:30.5.2"
"@jest/get-type": "npm:30.5.0"
"@jest/snapshot-utils": "npm:30.5.1"
"@jest/transform": "npm:30.5.1"
"@jest/transform": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
babel-preset-current-node-syntax: "npm:^1.2.0"
chalk: "npm:^4.1.2"
expect: "npm:30.5.1"
expect: "npm:30.5.2"
graceful-fs: "npm:^4.2.11"
jest-diff: "npm:30.5.1"
jest-matcher-utils: "npm:30.5.1"
jest-diff: "npm:30.5.2"
jest-matcher-utils: "npm:30.5.2"
jest-message-util: "npm:30.5.1"
jest-util: "npm:30.5.1"
pretty-format: "npm:30.5.1"
semver: "npm:^7.7.2"
synckit: "npm:^0.11.8"
checksum: 10c0/a0733a3786d4b721db835b4340b33717181ded7e83287303008d93c93d5ffacce74f2a15c9c4b9a4c458041d00473484687e07e42c99e217c7ddabce16a3ebfb
checksum: 10c0/cef6b102f743cbefd5d8ad0cf15b5694c09522904c43ace56537990475805b7c6eaebf82e6c5564e225e8db7617ebdda77340acc9a47d9909f338fbb84fca345
languageName: node
linkType: hard
@@ -7061,11 +7067,11 @@ __metadata:
languageName: node
linkType: hard
"jest-watcher@npm:30.5.1":
version: 30.5.1
resolution: "jest-watcher@npm:30.5.1"
"jest-watcher@npm:30.5.2":
version: 30.5.2
resolution: "jest-watcher@npm:30.5.2"
dependencies:
"@jest/test-result": "npm:30.5.1"
"@jest/test-result": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
"@types/node": "npm:*"
ansi-escapes: "npm:^4.3.2"
@@ -7073,7 +7079,7 @@ __metadata:
emittery: "npm:^0.13.1"
jest-util: "npm:30.5.1"
string-length: "npm:^4.0.2"
checksum: 10c0/7cfdb9eb43374ee5285c8018129af96a4347d492374a5c7bf3f9fe679743c00efde5f7d4095fb4353157ba44be1725c864ed62029f82ddcfd02a53c1feded827
checksum: 10c0/50909a1db41bfe3cc114215e4a7dbfa6ba16df328a49c95dca71cc042fd98824e57e2a1e8c00d8c802f3e15fbeda7d4fd735902da0b6afe960d835a0b1d469be
languageName: node
linkType: hard
@@ -7090,14 +7096,14 @@ __metadata:
languageName: node
linkType: hard
"jest@npm:30.5.1":
version: 30.5.1
resolution: "jest@npm:30.5.1"
"jest@npm:30.5.2":
version: 30.5.2
resolution: "jest@npm:30.5.2"
dependencies:
"@jest/core": "npm:30.5.1"
"@jest/core": "npm:30.5.2"
"@jest/types": "npm:30.5.1"
import-local: "npm:^3.2.0"
jest-cli: "npm:30.5.1"
jest-cli: "npm:30.5.2"
peerDependencies:
node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
peerDependenciesMeta:
@@ -7105,7 +7111,7 @@ __metadata:
optional: true
bin:
jest: bin/jest.js
checksum: 10c0/3837af2b884e2f99b255106edcf6d0543f2350124034d4f84b276f90cf1a72b5f5717fb01affcf80b0ccc0b3bf8d2e5c7c297140ca22a5b657765e3d307a0445
checksum: 10c0/8aaf72602bbb7eedc4430e5a9c11e4e75cf7d56e2f95a08c039c021f0cdbe9d11596c32de193bf7e8ca106e75b1dbe8a14cda38b8dd9b1fd9da21bb24f688c77
languageName: node
linkType: hard
@@ -9791,7 +9797,7 @@ __metadata:
"@tsconfig/bases": "npm:1.0.28"
"@types/node": "npm:24.19.1"
ctix: "npm:2.8.2"
jest: "npm:30.5.1"
jest: "npm:30.5.2"
lerna: "npm:9.0.7"
oxfmt: "npm:0.67.0"
oxlint: "npm:1.82.0"