@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 +31 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
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()`.
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|