@loom-forge/address 0.1.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/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # @loom-forge/address
2
+
3
+ **loom** · o `AddressPort` sobre [`json-myers`](https://github.com/andersondrosa/json-myers):
4
+ diff/patch **identity-aware** da definição. É o formato de fio da MUDANÇA — undo serializável,
5
+ colaboração, persistência, server-sync.
6
+
7
+ ```bash
8
+ pnpm add @loom-forge/address json-myers
9
+ ```
10
+
11
+ ```ts
12
+ import { createMyersAddress } from "@loom-forge/address";
13
+
14
+ const addr = createMyersAddress(); // { identity?: string, strict?: boolean }
15
+ const patch = addr.diff(defA, defB); // reorder/move → {move, key}; edit → update por id
16
+ addr.patch(defA, patch); // round-trip: == defB
17
+ ```
18
+
19
+ Como os nós têm `id`, o json-myers usa **smart-key**: reorder vira `{ move, key }` (não
20
+ remove+add) e sobrevive à reordenação; editar uma prop vira update aninhado por id; o `:index`
21
+ cobre grids posicionais. Um diff por POSIÇÃO (RFC 6902) quebra no instante em que algo se move —
22
+ ver [docs/DECISIONS](./docs/DECISIONS.md) ADR-202.
23
+
24
+ **O que se difere é a definição AUTORADA** — o documento, como o autor o escreveu. Tudo o que o
25
+ motor escreve por cima dele em runtime fica fora do patch: a marca `local` de uma intenção e o
26
+ escopo que o `bind` guarda num binding resolvido (ADR-018 do root) moram no nó resolvido, nunca no
27
+ documento. Uma cadeia `then`/`catch` é objeto aninhado como outro qualquer, e é diferida por chave.
28
+
29
+ O consumidor natural é o [`@loom-forge/editor`](../editor/README.md), que emite o patch a cada
30
+ commit. O invariante que prende os dois está na suíte de conformance:
31
+ `address.patch(antes, patch) === editor.getDefinition()`.
@@ -0,0 +1,11 @@
1
+ import { AddressPort } from '@loom-forge/core';
2
+
3
+ interface MyersAddressOptions {
4
+ /** campo de identidade dos arrays de coleção. Default `"id"` (= os nós). */
5
+ identity?: string;
6
+ /** aplicar patch em modo strict (assume patch gerado por diff real contra a base). */
7
+ strict?: boolean;
8
+ }
9
+ declare function createMyersAddress(opts?: MyersAddressOptions): AddressPort;
10
+
11
+ export { type MyersAddressOptions, createMyersAddress };
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ import { patchJson, diffJson } from 'json-myers';
2
+
3
+ // src/myers.ts
4
+ function createMyersAddress(opts = {}) {
5
+ const diffOpts = opts.identity ? { identity: opts.identity } : void 0;
6
+ const patchOpts = {
7
+ ...opts.identity ? { identity: opts.identity } : {},
8
+ ...opts.strict ? { strict: true } : {}
9
+ };
10
+ return {
11
+ diff: (a, b) => diffJson(a, b, diffOpts),
12
+ patch: (base, d) => patchJson(base, d, patchOpts)
13
+ };
14
+ }
15
+
16
+ export { createMyersAddress };
17
+ //# sourceMappingURL=index.js.map
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/myers.ts"],"names":[],"mappings":";;;AAmBO,SAAS,kBAAA,CACd,IAAA,GAA4B,EAAC,EAChB;AACb,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA,GAAW,EAAE,QAAA,EAAU,IAAA,CAAK,UAAS,GAAI,MAAA;AAC/D,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa,EAAC;AAAA,IACnD,GAAI,IAAA,CAAK,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,KAAS;AAAC,GACxC;AACA,EAAA,OAAO;AAAA,IACL,MAAM,CAAC,CAAA,EAAG,MAAM,QAAA,CAAS,CAAA,EAAG,GAAG,QAAQ,CAAA;AAAA,IACvC,OAAO,CAAC,IAAA,EAAM,MAAM,SAAA,CAAU,IAAA,EAAM,GAAG,SAAS;AAAA,GAClD;AACF","file":"index.js","sourcesContent":["import { diffJson, patchJson } from \"json-myers\";\nimport type { AddressPort } from \"@loom-forge/core\";\n\n/* ──────────────────────────────────────────────────────────────────────────────\n Adapter do AddressPort sobre json-myers — diff/patch IDENTITY-aware da definição.\n Os nós têm `id` → smart-key: reorder/move viram `{move, key}` (não remove+add),\n sobrevivendo à reordenação; editar prop vira update aninhado por id. É o formato\n de fio da MUDANÇA (undo/redo serializável, colaboração, persistência, server-sync).\n\n DI/opcional: json-myers é peer opcional; este adapter (subpath ./address) o embrulha.\n ────────────────────────────────────────────────────────────────────────────── */\n\nexport interface MyersAddressOptions {\n /** campo de identidade dos arrays de coleção. Default `\"id\"` (= os nós). */\n identity?: string;\n /** aplicar patch em modo strict (assume patch gerado por diff real contra a base). */\n strict?: boolean;\n}\n\nexport function createMyersAddress(\n opts: MyersAddressOptions = {},\n): AddressPort {\n const diffOpts = opts.identity ? { identity: opts.identity } : undefined;\n const patchOpts = {\n ...(opts.identity ? { identity: opts.identity } : {}),\n ...(opts.strict ? { strict: true } : {}),\n };\n return {\n diff: (a, b) => diffJson(a, b, diffOpts),\n patch: (base, d) => patchJson(base, d, patchOpts),\n };\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@loom-forge/address",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "loom · o AddressPort sobre json-myers: diff/patch identity-aware da definição — reorder vira {move, key}. O formato de fio da mudança (undo serializável, colaboração, persistência).",
6
+ "keywords": [
7
+ "json",
8
+ "diff",
9
+ "patch",
10
+ "address",
11
+ "identity"
12
+ ],
13
+ "license": "MIT",
14
+ "author": {
15
+ "name": "Anderson D. Rosa",
16
+ "url": "https://github.com/andersondrosa"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/andersondrosa/loom-forge.git",
21
+ "directory": "packages/address"
22
+ },
23
+ "homepage": "https://github.com/andersondrosa/loom-forge/tree/main/packages/address#readme",
24
+ "bugs": {
25
+ "url": "https://github.com/andersondrosa/loom-forge/issues"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "sideEffects": false,
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "import": "./dist/index.js"
35
+ }
36
+ },
37
+ "files": [
38
+ "dist"
39
+ ],
40
+ "dependencies": {
41
+ "@loom-forge/core": "0.1.0"
42
+ },
43
+ "peerDependencies": {
44
+ "json-myers": "^3.2.0"
45
+ },
46
+ "devDependencies": {
47
+ "json-myers": "^3.2.0",
48
+ "tsup": "^8.0.0",
49
+ "typescript": "^5.9.3"
50
+ },
51
+ "scripts": {
52
+ "build": "tsup",
53
+ "dev": "tsup --watch",
54
+ "test": "vitest run",
55
+ "test:watch": "vitest",
56
+ "typecheck": "tsc --noEmit",
57
+ "clean": "rm -rf dist"
58
+ }
59
+ }