0eb25286c8
Deux mouvements de surface, aucun changement de comportement. **`packages/client` → `packages/sdk`, `@ng-eventually/client` → `@ng-eventually/sdk`.** « client » ne disait rien : ce paquet EST le SDK que l'application appelle, et c'est tout ce qu'elle appelle. L'ancien nom reste comme mot-clé de recherche dans `docs/source-layout-by-fate.md` et le tableau des paquets du README. **Une seule entrée.** L'entrée `./polyfill` disparaît ; ses symboles applicatifs — `configure`, `configureStoreRegistry`, `setCurrentUser`, `connectedUser` et leurs types — vivent dans un bloc `POLYFILL-ERA` de `src/index.ts`. Ce que la seconde porte portait mérite d'être nommé avant d'être retiré : *ce qu'on importe de ce chemin est exactement ce qu'on supprimera à la migration*. Une seule porte perd ce signal — rien à la ligne d'import ne distingue `configure`, qui part, de `docs`, que le vrai SDK remplace sur place. Trois choses le portent désormais : le bloc lui-même, l'inventaire d'exports de `docs/api-contract.md` (épinglé par `test/vocabulary.test.ts`, donc il ne peut pas rancir en silence), et le contrôle de vocabulaire sur les noms publiés. **Six symboles quittent la surface au passage**, et la fusion est ce qui a rendu le choix visible plutôt qu'hérité : - `getConfig` / `getStoreRegistryDeps` — câblage interne, atteint par `shared-wallet/bootstrap` ; - `resetConfig` / `resetStoreRegistry` / `resetCaps` — remises à zéro de test, atteintes par leur chemin interne, ce qui est leur raison d'être ; - le `share` direct — `inbox.share` a toujours été la même fonction, et la publier deux fois brouillait la frontière qu'elle servait à marquer. Corrections d'affirmations fausses trouvées en chemin : le contrat annonçait `isNuri` / `hasReadCap` sur la porte SDK alors qu'ils ne sont plus exportés depuis le passage au permissif en entrée (`NuriLike` validé à la porte) ; le README du paquet documentait `capFor`, `shareCap`, `getCaps` et `publishRepoLink`, dont aucun n'existe ; et le README de l'app d'exemple affirmait que la suite e2e la pilote, ce qui reste à faire. 179 tests unitaires, typecheck bibliothèque / exemple / harnais, e2e 42/42 contre le broker en ligne — mesuré une fois après le renommage, une fois après la fusion.
52 lines
2.2 KiB
TypeScript
52 lines
2.2 KiB
TypeScript
/**
|
|
* The reserved-namespace predicate, in isolation.
|
|
*
|
|
* It is one `startsWith`, but it is the seam that keeps the polyfill's emulated
|
|
* branches out of the consumer's data (see `machinery.ts`), so its edges are worth
|
|
* pinning: get it wrong in one direction and machinery leaks into domain properties;
|
|
* wrong in the other and real data silently disappears from reads.
|
|
*/
|
|
import { test, expect } from "bun:test";
|
|
import { MACHINERY_NS, isMachinerySubject } from "../src/emulated-verifier/machinery";
|
|
|
|
test("the emulated branch subjects are all machinery", () => {
|
|
// The four compartments store-registry emulates, verbatim.
|
|
for (const s of [
|
|
"urn:ng-eventually:shim:index",
|
|
"urn:ng-eventually:shim:storeBranch",
|
|
"urn:ng-eventually:shim:userBranch",
|
|
"urn:ng-eventually:shim:headerBranch",
|
|
]) {
|
|
expect(isMachinerySubject(s)).toBe(true);
|
|
}
|
|
});
|
|
|
|
test("inbox deposits are machinery too — a second prefix under the same namespace", () => {
|
|
expect(isMachinerySubject("urn:ng-eventually:inbox:deposit:1700:abc")).toBe(true);
|
|
});
|
|
|
|
test("consumer subjects are not machinery — including a NURI, which is what entities use", () => {
|
|
expect(isMachinerySubject("did:ng:o:doc1")).toBe(false);
|
|
expect(isMachinerySubject("urn:e2e:secret")).toBe(false);
|
|
expect(isMachinerySubject("http://example.org/thing")).toBe(false);
|
|
});
|
|
|
|
test("a look-alike prefix is NOT machinery — the boundary is exact, not fuzzy", () => {
|
|
// Anything that merely resembles the namespace must fall on the data side, or a
|
|
// consumer's own vocabulary could vanish from its reads.
|
|
expect(isMachinerySubject("urn:ng-eventuallyX:thing")).toBe(false);
|
|
expect(isMachinerySubject("urn:ng-event:thing")).toBe(false);
|
|
expect(isMachinerySubject("x-urn:ng-eventually:shim:index")).toBe(false);
|
|
});
|
|
|
|
test("an absent subject is not machinery — read paths hand bindings straight in", () => {
|
|
expect(isMachinerySubject(undefined)).toBe(false);
|
|
expect(isMachinerySubject("")).toBe(false);
|
|
});
|
|
|
|
test("the namespace is the prefix both writers actually use", () => {
|
|
// Guards against the constant drifting away from store-registry/inbox.
|
|
expect("urn:ng-eventually:shim".startsWith(MACHINERY_NS)).toBe(true);
|
|
expect("urn:ng-eventually:inbox".startsWith(MACHINERY_NS)).toBe(true);
|
|
});
|