@cosmicdrift/kumiko-framework 0.270.0 → 0.273.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -3
- package/src/__tests__/fixtures/migrate-cross-tenant/manual-only.expected.ts +44 -0
- package/src/__tests__/fixtures/migrate-cross-tenant/manual-only.input.ts +44 -0
- package/src/__tests__/fixtures/migrate-cross-tenant/rewrite.expected.ts +41 -0
- package/src/__tests__/fixtures/migrate-cross-tenant/rewrite.input.ts +41 -0
- package/src/__tests__/migrate-cross-tenant-codemod.test.ts +106 -0
- package/src/__tests__/related-list-parent-filter.integration.test.ts +103 -0
- package/src/api/__tests__/nested-write-ownership.integration.test.ts +268 -0
- package/src/api/server.ts +7 -20
- package/src/bun-db/__tests__/query-guards.test.ts +60 -3
- package/src/bun-db/query.ts +24 -21
- package/src/changes.json +91 -0
- package/src/db/__tests__/event-store-executor-write-verbs.integration.test.ts +77 -0
- package/src/db/__tests__/event-store-executor.integration.test.ts +1 -1
- package/src/db/__tests__/replay-migration-sql.test.ts +17 -0
- package/src/db/__tests__/tenant-db-convention-cross-tenant.test.ts +72 -0
- package/src/db/__tests__/tenant-db-declared-unsafe-raw.test.ts +104 -0
- package/src/db/__tests__/tenant-db-global.test.ts +92 -0
- package/src/db/__tests__/tenant-db-no-raw.test.ts +75 -0
- package/src/db/__tests__/tenant-db.integration.test.ts +3 -1
- package/src/db/__tests__/unchecked-system-db.test.ts +76 -0
- package/src/db/apply-entity-event.ts +1 -1
- package/src/db/assert-exists-in.ts +1 -1
- package/src/db/event-store-executor-context.ts +5 -2
- package/src/db/event-store-executor-read.ts +6 -4
- package/src/db/event-store-executor-write.ts +24 -18
- package/src/db/queries/shadow-swap.ts +36 -0
- package/src/db/replay-migration-sql.ts +5 -5
- package/src/db/tenant-db-runner.ts +23 -0
- package/src/db/tenant-db.ts +97 -24
- package/src/derivatives/__tests__/derivatives-context.test.ts +0 -1
- package/src/engine/__tests__/boot-validator-nav-area.test.ts +116 -0
- package/src/engine/__tests__/boot-validator-projection-list.test.ts +91 -0
- package/src/engine/__tests__/boot-validator-query-output-schema.test.ts +143 -0
- package/src/engine/__tests__/boot-validator.test.ts +51 -0
- package/src/engine/__tests__/entity-create-caller-id.integration.test.ts +87 -0
- package/src/engine/__tests__/entity-handlers-escape-hatch.test.ts +91 -0
- package/src/engine/__tests__/entity-handlers.test.ts +28 -0
- package/src/engine/__tests__/entity-restore-tenant-isolation.integration.test.ts +30 -5
- package/src/engine/__tests__/entity-write-crosstenant.integration.test.ts +206 -47
- package/src/engine/__tests__/read-steps-tenant-filter.integration.test.ts +215 -0
- package/src/engine/__tests__/required-surface-keys.test.ts +16 -0
- package/src/engine/__tests__/screen.test.ts +150 -0
- package/src/engine/__tests__/soft-delete-cleanup.test.ts +0 -1
- package/src/engine/__tests__/steps-read.test.ts +204 -8
- package/src/engine/__tests__/steps-unsafe-projection-delete.test.ts +7 -4
- package/src/engine/__tests__/steps-unsafe-projection-upsert.test.ts +6 -3
- package/src/engine/boot-validator/__tests__/global-tenancy.test.ts +16 -1
- package/src/engine/boot-validator/__tests__/rate-limit-disabled-reason.test.ts +45 -0
- package/src/engine/boot-validator/entity-handler.ts +21 -0
- package/src/engine/boot-validator/global-tenancy.ts +13 -1
- package/src/engine/boot-validator/parent-ref.ts +1 -1
- package/src/engine/boot-validator/projection-list-screens.ts +67 -2
- package/src/engine/boot-validator/query-output-columns.ts +33 -0
- package/src/engine/boot-validator/screens.ts +154 -31
- package/src/engine/build-config-feature-schema.ts +7 -4
- package/src/engine/entity-handlers.ts +71 -19
- package/src/engine/feature-entity-handlers.ts +4 -4
- package/src/engine/index.ts +5 -0
- package/src/engine/registry-validate.ts +12 -4
- package/src/engine/schema-builder.ts +6 -0
- package/src/engine/screen-helpers.ts +52 -0
- package/src/engine/steps/_read-source.ts +12 -0
- package/src/engine/steps/read-find-many.ts +8 -2
- package/src/engine/steps/read-find-one.ts +11 -8
- package/src/engine/steps/unsafe-projection-delete.ts +2 -1
- package/src/engine/steps/unsafe-projection-upsert.ts +2 -1
- package/src/engine/types/index.ts +8 -1
- package/src/errors/i18n/de.yaml +14 -0
- package/src/errors/i18n/en.yaml +13 -0
- package/src/errors/reasons.ts +4 -0
- package/src/i18n/required-surface-keys.ts +6 -2
- package/src/jobs/__tests__/job-systemdb.integration.test.ts +5 -4
- package/src/jobs/__tests__/jobs.integration.test.ts +41 -0
- package/src/jobs/job-runner.ts +35 -5
- package/src/pipeline/__tests__/escape-hatch-audit.integration.test.ts +254 -0
- package/src/pipeline/__tests__/escape-hatch-report.test.ts +149 -0
- package/src/pipeline/__tests__/msp-rebuild.integration.test.ts +28 -0
- package/src/pipeline/__tests__/projection-rebuild.integration.test.ts +94 -0
- package/src/pipeline/__tests__/projections-runner-systemscope.integration.test.ts +101 -0
- package/src/pipeline/__tests__/query-projection.integration.test.ts +169 -14
- package/src/pipeline/__tests__/rate-limit-default.integration.test.ts +118 -0
- package/src/pipeline/__tests__/rate-limit-default.test.ts +117 -0
- package/src/pipeline/__tests__/search-consumer-named-events.integration.test.ts +5 -2
- package/src/pipeline/__tests__/system-identity-switch.test.ts +240 -1
- package/src/pipeline/dispatch-query.ts +27 -8
- package/src/pipeline/dispatch-shared.ts +141 -57
- package/src/pipeline/dispatch-stream.ts +1 -3
- package/src/pipeline/dispatch-write.ts +62 -14
- package/src/pipeline/dispatcher.ts +20 -0
- package/src/pipeline/escape-hatch-report.ts +127 -0
- package/src/pipeline/index.ts +8 -0
- package/src/pipeline/member-read-only-transaction.ts +75 -0
- package/src/pipeline/msp-rebuild.ts +2 -0
- package/src/pipeline/projection-rebuild.ts +2 -0
- package/src/pipeline/projections-runner.ts +15 -13
- package/src/pipeline/system-identity-switch.ts +121 -9
- package/src/scripts/codemod/migrate-cross-tenant.ts +335 -0
- package/src/scripts/codemod/migrate-db-raw.ts +19 -6
- package/src/scripts/codemod/migrate-open-to-all.ts +2 -1
- package/src/ui-types/index.ts +3 -0
- package/src/utils/__tests__/ids.test.ts +29 -1
- package/src/utils/ids.ts +10 -1
- package/src/utils/index.ts +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { generateId } from "../ids";
|
|
2
|
+
import { generateDeterministicId, generateId } from "../ids";
|
|
3
3
|
|
|
4
4
|
// generateId is the row/stream/correlation ID source. The callers rely on
|
|
5
5
|
// it being a UUIDv7 (time-sortable → dense B-Tree indexes), not a v4 — a
|
|
@@ -22,3 +22,31 @@ describe("generateId", () => {
|
|
|
22
22
|
expect(new Set(ids).size).toBe(ids.length);
|
|
23
23
|
});
|
|
24
24
|
});
|
|
25
|
+
|
|
26
|
+
describe("generateDeterministicId", () => {
|
|
27
|
+
test("returns a well-formed lowercase UUID", () => {
|
|
28
|
+
expect(generateDeterministicId("ledger:schedule", "contract-1")).toMatch(UUID_RX);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("is UUID version 5 (content-addressed, not v7)", () => {
|
|
32
|
+
expect(generateDeterministicId("ledger:schedule", "contract-1")[14]).toBe("5");
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test("is deterministic: same namespace + key always yields the same id", () => {
|
|
36
|
+
const a = generateDeterministicId("ledger:schedule", "contract-1");
|
|
37
|
+
const b = generateDeterministicId("ledger:schedule", "contract-1");
|
|
38
|
+
expect(a).toBe(b);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("differs when the key changes", () => {
|
|
42
|
+
const a = generateDeterministicId("ledger:schedule", "contract-1");
|
|
43
|
+
const b = generateDeterministicId("ledger:schedule", "contract-2");
|
|
44
|
+
expect(a).not.toBe(b);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("differs when the namespace changes for the same key", () => {
|
|
48
|
+
const a = generateDeterministicId("ledger:schedule", "contract-1");
|
|
49
|
+
const b = generateDeterministicId("ledger:transaction", "contract-1");
|
|
50
|
+
expect(a).not.toBe(b);
|
|
51
|
+
});
|
|
52
|
+
});
|
package/src/utils/ids.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { v7 } from "uuid";
|
|
1
|
+
import { v5, v7 } from "uuid";
|
|
2
2
|
|
|
3
3
|
// Non-secret identifiers for DB rows, event streams, correlation/request
|
|
4
4
|
// IDs, SSE connections, distributed locks. UUIDv7: first 48 bits are a
|
|
@@ -15,3 +15,12 @@ import { v7 } from "uuid";
|
|
|
15
15
|
export function generateId(): string {
|
|
16
16
|
return v7();
|
|
17
17
|
}
|
|
18
|
+
|
|
19
|
+
// Derived from a DNS name (RFC 4122 §4.3) so the namespace is reproducible, not a hand-picked constant.
|
|
20
|
+
const DETERMINISTIC_ID_NAMESPACE = v5("kumiko.rocks", v5.DNS);
|
|
21
|
+
|
|
22
|
+
// Same (namespace, key) → same id, so a redelivered event hits the same row. Ids are
|
|
23
|
+
// unique per table, not per tenant: fold the tenant id into `key` or tenants collide.
|
|
24
|
+
export function generateDeterministicId(namespace: string, key: string): string {
|
|
25
|
+
return v5(`${namespace}:${key}`, DETERMINISTIC_ID_NAMESPACE);
|
|
26
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -2,7 +2,7 @@ export { assertUnreachable } from "./assert";
|
|
|
2
2
|
export { toSnakeCase } from "./case";
|
|
3
3
|
export { compareByCodepoint } from "./compare";
|
|
4
4
|
export { readPositiveIntEnv } from "./env-parse";
|
|
5
|
-
export { generateId } from "./ids";
|
|
5
|
+
export { generateDeterministicId, generateId } from "./ids";
|
|
6
6
|
export { isPlainObject } from "./is-plain-object";
|
|
7
7
|
export { parseStringArrayJson } from "./parse-string-array-json";
|
|
8
8
|
export { parseJsonOrThrow, parseJsonSafe, stringifyJson } from "./safe-json";
|