@alistigo/document-format 0.2.2
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 +107 -0
- package/dist/index.d.ts +102 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/package.json +40 -0
- package/dist/schemas/document.json +69 -0
- package/dist/serializer/__tests__/list-document-serializer.test.d.ts +2 -0
- package/dist/serializer/__tests__/list-document-serializer.test.d.ts.map +1 -0
- package/dist/serializer/__tests__/list-document-serializer.test.js +95 -0
- package/dist/serializer/__tests__/list-document-serializer.test.js.map +1 -0
- package/dist/serializer/list-document-serializer.d.ts +8 -0
- package/dist/serializer/list-document-serializer.d.ts.map +1 -0
- package/dist/serializer/list-document-serializer.js +117 -0
- package/dist/serializer/list-document-serializer.js.map +1 -0
- package/dist/types.d.ts +48 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +12 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +20 -0
- package/dist/validate.js.map +1 -0
- package/docs/changelog.md +17 -0
- package/docs/spec.md +383 -0
- package/docs/validation.md +207 -0
- package/package.json +39 -0
- package/src/schemas/document.json +69 -0
package/README.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# @alistigo/document-format
|
|
2
|
+
|
|
3
|
+
The **specification, JSON schemas, and TypeScript types** for the Alistigo list document format. Single source of truth — every other Alistigo package (the iframe app, the runner, the host protocol, plugins) imports types and schemas from here.
|
|
4
|
+
|
|
5
|
+
A document is a self-contained JSON-LD object with three sections:
|
|
6
|
+
|
|
7
|
+
- **`meta`** — identity (listId, formatVersion, dates) and the *event-log integrity descriptor* (full / truncated / absent).
|
|
8
|
+
- **`eventLog`** — the append-only history. Optional. Can be prefix-truncated or omitted to shrink the document.
|
|
9
|
+
- **`projection`** — the current rendered state of the list (a schema.org `ItemList`).
|
|
10
|
+
|
|
11
|
+
```jsonc
|
|
12
|
+
{
|
|
13
|
+
"@context": ["https://schema.org", { "alistigo": "https://alistigo.io/ns/v1#" }],
|
|
14
|
+
"@type": "alistigo:Document",
|
|
15
|
+
"meta": {
|
|
16
|
+
"listId": "urn:uuid:0190f5cc-…",
|
|
17
|
+
"formatVersion": "1.0.0",
|
|
18
|
+
"dateCreated": "2026-04-30T12:00:00Z",
|
|
19
|
+
"dateModified": "2026-04-30T12:00:00Z",
|
|
20
|
+
"eventLog": { "presence": "full" }
|
|
21
|
+
},
|
|
22
|
+
"eventLog": [ /* append-only events */ ],
|
|
23
|
+
"projection": {
|
|
24
|
+
"@type": "ItemList",
|
|
25
|
+
"itemListElement": [ /* current items */ ]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Documentation
|
|
31
|
+
|
|
32
|
+
| File | Purpose |
|
|
33
|
+
|------|---------|
|
|
34
|
+
| [`docs/spec.md`](docs/spec.md) | The full format specification: every section, every field, every rule. **Authoritative.** |
|
|
35
|
+
| [`docs/validation.md`](docs/validation.md) | How to validate a document — three layers (schema / plugin schemas / replay equivalence) with executable pseudo-code. |
|
|
36
|
+
| [`src/schemas/document.json`](src/schemas/document.json) | The JSON Schema (Draft 2020-12). Bundled — `$defs` cover Meta, Event, Projection, ListItem, Item. |
|
|
37
|
+
| [`src/types.ts`](src/types.ts) | TypeScript mirrors of the schemas. Keep in lockstep with the JSON. |
|
|
38
|
+
|
|
39
|
+
## Install
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
pnpm add @alistigo/document-format
|
|
43
|
+
# Optional — only if you use validateDocument():
|
|
44
|
+
pnpm add ajv ajv-formats
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`ajv` and `ajv-formats` are *optional* peer dependencies. Consumers that only need types or the schema as JSON can skip them; consumers that call `validateDocument()` install them.
|
|
48
|
+
|
|
49
|
+
## Usage
|
|
50
|
+
|
|
51
|
+
### Types
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import type {
|
|
55
|
+
AlistigoDocument,
|
|
56
|
+
AlistigoMeta,
|
|
57
|
+
AlistigoEvent,
|
|
58
|
+
AlistigoProjection,
|
|
59
|
+
} from "@alistigo/document-format";
|
|
60
|
+
|
|
61
|
+
const doc: AlistigoDocument = JSON.parse(rawJson);
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### JSON Schema
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
import { documentSchema } from "@alistigo/document-format";
|
|
68
|
+
|
|
69
|
+
// or, if you want to point Ajv at the file directly (for npm CDN consumers etc):
|
|
70
|
+
// import documentSchema from "@alistigo/document-format/schemas/document.json";
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Validation
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import { validateDocument } from "@alistigo/document-format";
|
|
77
|
+
|
|
78
|
+
const result = await validateDocument(unknownInput);
|
|
79
|
+
if (!result.valid) {
|
|
80
|
+
console.error(result.errors);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// proceed with input as AlistigoDocument
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
For full three-layer validation (schema + plugin schemas + replay equivalence), see [`docs/validation.md`](docs/validation.md).
|
|
87
|
+
|
|
88
|
+
### Replay an event log
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
import { replayEvents } from "@alistigo/document-format";
|
|
92
|
+
|
|
93
|
+
const projection = replayEvents(doc.eventLog ?? []);
|
|
94
|
+
// projection should equal doc.projection when meta.eventLog.presence is "full"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## How this package is meant to evolve
|
|
98
|
+
|
|
99
|
+
- The **spec** ([`docs/spec.md`](docs/spec.md)) and the **JSON schema** ([`src/schemas/document.json`](src/schemas/document.json)) are kept in lockstep. Don't edit one without the other.
|
|
100
|
+
- The **TypeScript types** ([`src/types.ts`](src/types.ts)) mirror the schema. They're a developer affordance, not the source of truth.
|
|
101
|
+
- Format versioning is **SemVer** — see [spec §6](docs/spec.md#6-versioning--evolution). Every change to the schema bumps `FORMAT_VERSION` (exported as a constant) and adds a row to the changelog.
|
|
102
|
+
- The package is **publishable** (`@mlabrut/*`) so the schema is fetchable by external systems via `unpkg`/`jsdelivr` etc. URL-stable schemas are part of the contract.
|
|
103
|
+
|
|
104
|
+
## Related
|
|
105
|
+
|
|
106
|
+
- [`projects/alistigo-ai/architecture.md`](../../projects/alistigo-ai/architecture.md) — why event sourcing and CQRS, and how the document interacts with the runtime.
|
|
107
|
+
- [`packages/alistigo-features/`](../alistigo-features/) — the Gherkin behavior specs that exercise this format.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
export { ListDocumentSerializer, SCHEMA_VERSION } from "./serializer/list-document-serializer.js";
|
|
2
|
+
export * from "./types.js";
|
|
3
|
+
export { validateDocument } from "./validate.js";
|
|
4
|
+
export declare const documentSchema: {
|
|
5
|
+
$schema: string;
|
|
6
|
+
$id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
description: string;
|
|
9
|
+
type: string;
|
|
10
|
+
required: string[];
|
|
11
|
+
properties: {
|
|
12
|
+
"@context": {
|
|
13
|
+
type: string;
|
|
14
|
+
required: string[];
|
|
15
|
+
properties: {
|
|
16
|
+
"@vocab": {
|
|
17
|
+
type: string;
|
|
18
|
+
const: string;
|
|
19
|
+
};
|
|
20
|
+
alistigo: {
|
|
21
|
+
type: string;
|
|
22
|
+
const: string;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
"@type": {
|
|
27
|
+
type: string;
|
|
28
|
+
const: string;
|
|
29
|
+
};
|
|
30
|
+
"alistigo:listId": {
|
|
31
|
+
type: string;
|
|
32
|
+
pattern: string;
|
|
33
|
+
};
|
|
34
|
+
"alistigo:schemaVersion": {
|
|
35
|
+
type: string;
|
|
36
|
+
pattern: string;
|
|
37
|
+
};
|
|
38
|
+
name: {
|
|
39
|
+
type: string;
|
|
40
|
+
};
|
|
41
|
+
itemListElement: {
|
|
42
|
+
type: string;
|
|
43
|
+
items: {
|
|
44
|
+
$ref: string;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
"alistigo:listEventLog": {
|
|
48
|
+
type: string;
|
|
49
|
+
items: {
|
|
50
|
+
$ref: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
$defs: {
|
|
55
|
+
ListItem: {
|
|
56
|
+
type: string;
|
|
57
|
+
required: string[];
|
|
58
|
+
properties: {
|
|
59
|
+
"@type": {
|
|
60
|
+
type: string;
|
|
61
|
+
const: string;
|
|
62
|
+
};
|
|
63
|
+
"alistigo:listElementId": {
|
|
64
|
+
type: string;
|
|
65
|
+
pattern: string;
|
|
66
|
+
};
|
|
67
|
+
position: {
|
|
68
|
+
type: string;
|
|
69
|
+
minimum: number;
|
|
70
|
+
};
|
|
71
|
+
name: {
|
|
72
|
+
type: string;
|
|
73
|
+
minLength: number;
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
EventRecord: {
|
|
78
|
+
type: string;
|
|
79
|
+
required: string[];
|
|
80
|
+
properties: {
|
|
81
|
+
"alistigo:listEventId": {
|
|
82
|
+
type: string;
|
|
83
|
+
};
|
|
84
|
+
"alistigo:eventType": {
|
|
85
|
+
type: string;
|
|
86
|
+
enum: string[];
|
|
87
|
+
};
|
|
88
|
+
"alistigo:listId": {
|
|
89
|
+
type: string;
|
|
90
|
+
};
|
|
91
|
+
"alistigo:actorId": {
|
|
92
|
+
type: string;
|
|
93
|
+
};
|
|
94
|
+
"alistigo:timestamp": {
|
|
95
|
+
type: string;
|
|
96
|
+
format: string;
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAClG,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ListDocumentSerializer, SCHEMA_VERSION } from "./serializer/list-document-serializer.js";
|
|
2
|
+
export * from "./types.js";
|
|
3
|
+
export { validateDocument } from "./validate.js";
|
|
4
|
+
import documentSchemaJson from "./schemas/document.json" with { type: "json" };
|
|
5
|
+
export const documentSchema = documentSchemaJson;
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAClG,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,kBAAkB,MAAM,yBAAyB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@alistigo/document-format",
|
|
3
|
+
"version": "0.2.2",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "Specification, JSON schemas, and TypeScript types for the Alistigo list document format. The source of truth for what an Alistigo document looks like.",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts"
|
|
11
|
+
},
|
|
12
|
+
"./schemas/document.json": "./src/schemas/document.json"
|
|
13
|
+
},
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"src/schemas",
|
|
19
|
+
"docs"
|
|
20
|
+
],
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@alistigo/domain": "workspace:*"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"ajv": "^8.17.0",
|
|
29
|
+
"ajv-formats": "^3.0.1"
|
|
30
|
+
},
|
|
31
|
+
"peerDependenciesMeta": {
|
|
32
|
+
"ajv": {
|
|
33
|
+
"optional": true
|
|
34
|
+
},
|
|
35
|
+
"ajv-formats": {
|
|
36
|
+
"optional": true
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"module": "./index.js"
|
|
40
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://alistigo.ai/schema/v1/document.json",
|
|
4
|
+
"title": "Alistigo Document",
|
|
5
|
+
"description": "A self-contained Alistigo list document in JSON-LD ItemList format.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"@context",
|
|
9
|
+
"@type",
|
|
10
|
+
"alistigo:listId",
|
|
11
|
+
"alistigo:schemaVersion",
|
|
12
|
+
"itemListElement",
|
|
13
|
+
"alistigo:listEventLog"
|
|
14
|
+
],
|
|
15
|
+
"properties": {
|
|
16
|
+
"@context": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"required": ["@vocab", "alistigo"],
|
|
19
|
+
"properties": {
|
|
20
|
+
"@vocab": { "type": "string", "const": "https://schema.org/" },
|
|
21
|
+
"alistigo": { "type": "string", "const": "https://alistigo.ai/vocab/" }
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"@type": { "type": "string", "const": "ItemList" },
|
|
25
|
+
"alistigo:listId": { "type": "string", "pattern": "^lst_" },
|
|
26
|
+
"alistigo:schemaVersion": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
|
|
27
|
+
"name": { "type": "string" },
|
|
28
|
+
"itemListElement": {
|
|
29
|
+
"type": "array",
|
|
30
|
+
"items": { "$ref": "#/$defs/ListItem" }
|
|
31
|
+
},
|
|
32
|
+
"alistigo:listEventLog": {
|
|
33
|
+
"type": "array",
|
|
34
|
+
"items": { "$ref": "#/$defs/EventRecord" }
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"$defs": {
|
|
38
|
+
"ListItem": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"required": ["@type", "alistigo:listElementId", "position", "name"],
|
|
41
|
+
"properties": {
|
|
42
|
+
"@type": { "type": "string", "const": "ListItem" },
|
|
43
|
+
"alistigo:listElementId": { "type": "string", "pattern": "^lse_" },
|
|
44
|
+
"position": { "type": "integer", "minimum": 1 },
|
|
45
|
+
"name": { "type": "string", "minLength": 1 }
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"EventRecord": {
|
|
49
|
+
"type": "object",
|
|
50
|
+
"required": [
|
|
51
|
+
"alistigo:listEventId",
|
|
52
|
+
"alistigo:eventType",
|
|
53
|
+
"alistigo:listId",
|
|
54
|
+
"alistigo:actorId",
|
|
55
|
+
"alistigo:timestamp"
|
|
56
|
+
],
|
|
57
|
+
"properties": {
|
|
58
|
+
"alistigo:listEventId": { "type": "string" },
|
|
59
|
+
"alistigo:eventType": {
|
|
60
|
+
"type": "string",
|
|
61
|
+
"enum": ["ListCreated", "ListElementAdded", "ListElementDeleted", "ListExported"]
|
|
62
|
+
},
|
|
63
|
+
"alistigo:listId": { "type": "string" },
|
|
64
|
+
"alistigo:actorId": { "type": "string" },
|
|
65
|
+
"alistigo:timestamp": { "type": "string", "format": "date-time" }
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-document-serializer.test.d.ts","sourceRoot":"","sources":["../../../src/serializer/__tests__/list-document-serializer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
2
|
+
import { createListElementContent, generateActorId, List } from "@alistigo/domain";
|
|
3
|
+
import { ListDocumentSerializer, SCHEMA_VERSION } from "../list-document-serializer.js";
|
|
4
|
+
const actorId = generateActorId();
|
|
5
|
+
describe("ListDocumentSerializer.serialize", () => {
|
|
6
|
+
it("serializes a freshly created list to a valid document with 0 elements", () => {
|
|
7
|
+
const { list } = List.create({ actorId });
|
|
8
|
+
const doc = ListDocumentSerializer.serialize(list);
|
|
9
|
+
expect(doc["@type"]).toBe("ItemList");
|
|
10
|
+
expect(doc["alistigo:listId"]).toBe(list.id.toString());
|
|
11
|
+
expect(doc["alistigo:schemaVersion"]).toBe(SCHEMA_VERSION);
|
|
12
|
+
expect(doc.itemListElement).toHaveLength(0);
|
|
13
|
+
expect(doc["alistigo:listEventLog"]).toHaveLength(1);
|
|
14
|
+
expect(doc["alistigo:listEventLog"][0]?.["alistigo:eventType"]).toBe("ListCreated");
|
|
15
|
+
});
|
|
16
|
+
// fallow-ignore-next-line complexity
|
|
17
|
+
it("serializes a list after addListElement with 1 element", () => {
|
|
18
|
+
const { list } = List.create({ actorId });
|
|
19
|
+
list.addListElement({ actorId, listId: list.id, content: createListElementContent("Milk") });
|
|
20
|
+
const doc = ListDocumentSerializer.serialize(list);
|
|
21
|
+
expect(doc.itemListElement).toHaveLength(1);
|
|
22
|
+
expect(doc.itemListElement[0]?.["@type"]).toBe("ListItem");
|
|
23
|
+
expect(doc.itemListElement[0]?.name).toBe("Milk");
|
|
24
|
+
expect(doc.itemListElement[0]?.position).toBe(1);
|
|
25
|
+
expect(doc["alistigo:listEventLog"]).toHaveLength(2);
|
|
26
|
+
expect(doc["alistigo:listEventLog"][1]?.["alistigo:eventType"]).toBe("ListElementAdded");
|
|
27
|
+
});
|
|
28
|
+
it("appends new uncommitted events to an existing log when previousDocument is provided", () => {
|
|
29
|
+
const { list } = List.create({ actorId });
|
|
30
|
+
const firstDoc = ListDocumentSerializer.serialize(list);
|
|
31
|
+
list.markEventsAsCommitted();
|
|
32
|
+
list.addListElement({ actorId, listId: list.id, content: createListElementContent("Eggs") });
|
|
33
|
+
const secondDoc = ListDocumentSerializer.serialize(list, firstDoc);
|
|
34
|
+
expect(secondDoc["alistigo:listEventLog"]).toHaveLength(2);
|
|
35
|
+
expect(secondDoc["alistigo:listEventLog"][0]?.["alistigo:eventType"]).toBe("ListCreated");
|
|
36
|
+
expect(secondDoc["alistigo:listEventLog"][1]?.["alistigo:eventType"]).toBe("ListElementAdded");
|
|
37
|
+
});
|
|
38
|
+
it("includes title as name when list has a title", () => {
|
|
39
|
+
const { list } = List.create({ actorId, title: "Groceries" });
|
|
40
|
+
const doc = ListDocumentSerializer.serialize(list);
|
|
41
|
+
expect(doc.name).toBe("Groceries");
|
|
42
|
+
});
|
|
43
|
+
it("omits name when list has no title", () => {
|
|
44
|
+
const { list } = List.create({ actorId });
|
|
45
|
+
const doc = ListDocumentSerializer.serialize(list);
|
|
46
|
+
expect(doc.name).toBeUndefined();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe("ListDocumentSerializer.deserialize", () => {
|
|
50
|
+
it("deserializes a serialized document to an equivalent list", () => {
|
|
51
|
+
const { list } = List.create({ actorId });
|
|
52
|
+
list.addListElement({ actorId, listId: list.id, content: createListElementContent("Apple") });
|
|
53
|
+
const doc = ListDocumentSerializer.serialize(list);
|
|
54
|
+
const restored = ListDocumentSerializer.deserialize(doc);
|
|
55
|
+
expect(restored.id.toString()).toBe(list.id.toString());
|
|
56
|
+
expect(restored.elements).toHaveLength(1);
|
|
57
|
+
expect(restored.elements[0]?.content).toBe("Apple");
|
|
58
|
+
});
|
|
59
|
+
it("deserializes preserving deletion — deleted elements are absent", () => {
|
|
60
|
+
const { list } = List.create({ actorId });
|
|
61
|
+
const addEvent = list.addListElement({
|
|
62
|
+
actorId,
|
|
63
|
+
listId: list.id,
|
|
64
|
+
content: createListElementContent("To delete"),
|
|
65
|
+
});
|
|
66
|
+
list.addListElement({ actorId, listId: list.id, content: createListElementContent("Keep") });
|
|
67
|
+
list.deleteListElement({ actorId, listId: list.id, listElementId: addEvent.listElementId });
|
|
68
|
+
const doc = ListDocumentSerializer.serialize(list);
|
|
69
|
+
const restored = ListDocumentSerializer.deserialize(doc);
|
|
70
|
+
expect(restored.elements).toHaveLength(1);
|
|
71
|
+
expect(restored.elements[0]?.content).toBe("Keep");
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe("ListDocumentSerializer round-trip", () => {
|
|
75
|
+
it("deserialize(serialize(list)) produces same elements", () => {
|
|
76
|
+
const { list } = List.create({ actorId, title: "Round-trip" });
|
|
77
|
+
list.addListElement({ actorId, listId: list.id, content: createListElementContent("One") });
|
|
78
|
+
list.addListElement({ actorId, listId: list.id, content: createListElementContent("Two") });
|
|
79
|
+
const doc = ListDocumentSerializer.serialize(list);
|
|
80
|
+
const restored = ListDocumentSerializer.deserialize(doc);
|
|
81
|
+
expect(restored.id.toString()).toBe(list.id.toString());
|
|
82
|
+
expect(restored.title).toBe("Round-trip");
|
|
83
|
+
expect(restored.elements).toHaveLength(2);
|
|
84
|
+
expect(restored.elements[0]?.content).toBe("One");
|
|
85
|
+
expect(restored.elements[1]?.content).toBe("Two");
|
|
86
|
+
});
|
|
87
|
+
it("round-trip produces no uncommitted events", () => {
|
|
88
|
+
const { list } = List.create({ actorId });
|
|
89
|
+
list.addListElement({ actorId, listId: list.id, content: createListElementContent("Item") });
|
|
90
|
+
const doc = ListDocumentSerializer.serialize(list);
|
|
91
|
+
const restored = ListDocumentSerializer.deserialize(doc);
|
|
92
|
+
expect(restored.getUncommittedEvents()).toHaveLength(0);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=list-document-serializer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-document-serializer.test.js","sourceRoot":"","sources":["../../../src/serializer/__tests__/list-document-serializer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { List } from "@alistigo/domain";
|
|
2
|
+
import { type AlistigoDocument } from "../types.js";
|
|
3
|
+
export declare const SCHEMA_VERSION: "1.0.0";
|
|
4
|
+
export declare const ListDocumentSerializer: {
|
|
5
|
+
serialize(list: List, previousDocument?: AlistigoDocument): AlistigoDocument;
|
|
6
|
+
deserialize(doc: AlistigoDocument): List;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=list-document-serializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-document-serializer.d.ts","sourceRoot":"","sources":["../../src/serializer/list-document-serializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,IAAI,EAML,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,gBAAgB,EAMtB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,cAAc,EAAG,OAAgB,CAAC;AA0F/C,eAAO,MAAM,sBAAsB;oBACjB,IAAI,qBAAqB,gBAAgB,GAAG,gBAAgB;qBA2B3D,gBAAgB,GAAG,IAAI;CAKzC,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { createListElementContent, createTimestamp, List, parseActorId, parseListElementId, parseListEventId, parseListId, } from "@alistigo/domain";
|
|
2
|
+
import { ALISTIGO_CONTEXT, } from "../types.js";
|
|
3
|
+
export const SCHEMA_VERSION = "1.0.0";
|
|
4
|
+
function eventToRecord(event) {
|
|
5
|
+
const base = {
|
|
6
|
+
"alistigo:listEventId": event.listEventId.toString(),
|
|
7
|
+
"alistigo:listId": event.listId.toString(),
|
|
8
|
+
"alistigo:actorId": event.actorId.toString(),
|
|
9
|
+
"alistigo:timestamp": event.timestamp,
|
|
10
|
+
};
|
|
11
|
+
switch (event.type) {
|
|
12
|
+
case "ListCreated": {
|
|
13
|
+
const record = {
|
|
14
|
+
...base,
|
|
15
|
+
"alistigo:eventType": "ListCreated",
|
|
16
|
+
...(event.title !== undefined ? { name: event.title } : {}),
|
|
17
|
+
};
|
|
18
|
+
return record;
|
|
19
|
+
}
|
|
20
|
+
case "ListElementAdded": {
|
|
21
|
+
const record = {
|
|
22
|
+
...base,
|
|
23
|
+
"alistigo:eventType": "ListElementAdded",
|
|
24
|
+
"alistigo:listElementId": event.listElementId.toString(),
|
|
25
|
+
name: event.content,
|
|
26
|
+
};
|
|
27
|
+
return record;
|
|
28
|
+
}
|
|
29
|
+
case "ListElementDeleted": {
|
|
30
|
+
const record = {
|
|
31
|
+
...base,
|
|
32
|
+
"alistigo:eventType": "ListElementDeleted",
|
|
33
|
+
"alistigo:listElementId": event.listElementId.toString(),
|
|
34
|
+
};
|
|
35
|
+
return record;
|
|
36
|
+
}
|
|
37
|
+
case "ListExported": {
|
|
38
|
+
const record = {
|
|
39
|
+
...base,
|
|
40
|
+
"alistigo:eventType": "ListExported",
|
|
41
|
+
};
|
|
42
|
+
return record;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function recordToEvent(record) {
|
|
47
|
+
const base = {
|
|
48
|
+
listEventId: parseListEventId(record["alistigo:listEventId"]),
|
|
49
|
+
listId: parseListId(record["alistigo:listId"]),
|
|
50
|
+
actorId: parseActorId(record["alistigo:actorId"]),
|
|
51
|
+
timestamp: createTimestamp(record["alistigo:timestamp"]),
|
|
52
|
+
};
|
|
53
|
+
switch (record["alistigo:eventType"]) {
|
|
54
|
+
case "ListCreated": {
|
|
55
|
+
const created = record;
|
|
56
|
+
return {
|
|
57
|
+
...base,
|
|
58
|
+
type: "ListCreated",
|
|
59
|
+
...(created.name !== undefined ? { title: created.name } : {}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
case "ListElementAdded": {
|
|
63
|
+
const added = record;
|
|
64
|
+
return {
|
|
65
|
+
...base,
|
|
66
|
+
type: "ListElementAdded",
|
|
67
|
+
listElementId: parseListElementId(added["alistigo:listElementId"]),
|
|
68
|
+
content: createListElementContent(added.name),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
case "ListElementDeleted": {
|
|
72
|
+
const deleted = record;
|
|
73
|
+
return {
|
|
74
|
+
...base,
|
|
75
|
+
type: "ListElementDeleted",
|
|
76
|
+
listElementId: parseListElementId(deleted["alistigo:listElementId"]),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
case "ListExported": {
|
|
80
|
+
return {
|
|
81
|
+
...base,
|
|
82
|
+
type: "ListExported",
|
|
83
|
+
format: "json-ld",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export const ListDocumentSerializer = {
|
|
89
|
+
serialize(list, previousDocument) {
|
|
90
|
+
const existingLog = previousDocument?.["alistigo:listEventLog"] ?? [];
|
|
91
|
+
const newRecords = list.getUncommittedEvents().map(eventToRecord);
|
|
92
|
+
const itemListElement = list.elements.map((element, index) => ({
|
|
93
|
+
"@type": "ListItem",
|
|
94
|
+
"alistigo:listElementId": element.id.toString(),
|
|
95
|
+
position: index + 1,
|
|
96
|
+
name: element.content,
|
|
97
|
+
}));
|
|
98
|
+
const doc = {
|
|
99
|
+
"@context": ALISTIGO_CONTEXT,
|
|
100
|
+
"@type": "ItemList",
|
|
101
|
+
"alistigo:listId": list.id.toString(),
|
|
102
|
+
"alistigo:schemaVersion": SCHEMA_VERSION,
|
|
103
|
+
itemListElement: itemListElement,
|
|
104
|
+
"alistigo:listEventLog": [...existingLog, ...newRecords],
|
|
105
|
+
};
|
|
106
|
+
if (list.title !== undefined) {
|
|
107
|
+
doc.name = list.title;
|
|
108
|
+
}
|
|
109
|
+
return doc;
|
|
110
|
+
},
|
|
111
|
+
deserialize(doc) {
|
|
112
|
+
const listId = parseListId(doc["alistigo:listId"]);
|
|
113
|
+
const events = doc["alistigo:listEventLog"].map(recordToEvent);
|
|
114
|
+
return List.rehydrate(listId, events);
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=list-document-serializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-document-serializer.js","sourceRoot":"","sources":["../../src/serializer/list-document-serializer.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export type SemVer = `${number}.${number}.${number}`;
|
|
2
|
+
export type TypeIDString = string;
|
|
3
|
+
export declare const ALISTIGO_CONTEXT: {
|
|
4
|
+
readonly "@vocab": "https://schema.org/";
|
|
5
|
+
readonly alistigo: "https://alistigo.ai/vocab/";
|
|
6
|
+
};
|
|
7
|
+
export type AlistigoContext = typeof ALISTIGO_CONTEXT;
|
|
8
|
+
export interface AlistigoDocument {
|
|
9
|
+
"@context": AlistigoContext;
|
|
10
|
+
"@type": "ItemList";
|
|
11
|
+
"alistigo:listId": TypeIDString;
|
|
12
|
+
"alistigo:schemaVersion": SemVer;
|
|
13
|
+
name?: string;
|
|
14
|
+
itemListElement: AlistigoListItem[];
|
|
15
|
+
"alistigo:listEventLog": AlistigoEventRecord[];
|
|
16
|
+
}
|
|
17
|
+
export interface AlistigoListItem {
|
|
18
|
+
"@type": "ListItem";
|
|
19
|
+
"alistigo:listElementId": TypeIDString;
|
|
20
|
+
position: number;
|
|
21
|
+
name: string;
|
|
22
|
+
}
|
|
23
|
+
interface AlistigoEventRecordBase {
|
|
24
|
+
"alistigo:listEventId": TypeIDString;
|
|
25
|
+
"alistigo:eventType": string;
|
|
26
|
+
"alistigo:listId": TypeIDString;
|
|
27
|
+
"alistigo:actorId": TypeIDString;
|
|
28
|
+
"alistigo:timestamp": string;
|
|
29
|
+
}
|
|
30
|
+
export interface AlistigoListCreatedRecord extends AlistigoEventRecordBase {
|
|
31
|
+
"alistigo:eventType": "ListCreated";
|
|
32
|
+
name?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface AlistigoListElementAddedRecord extends AlistigoEventRecordBase {
|
|
35
|
+
"alistigo:eventType": "ListElementAdded";
|
|
36
|
+
"alistigo:listElementId": TypeIDString;
|
|
37
|
+
name: string;
|
|
38
|
+
}
|
|
39
|
+
export interface AlistigoListElementDeletedRecord extends AlistigoEventRecordBase {
|
|
40
|
+
"alistigo:eventType": "ListElementDeleted";
|
|
41
|
+
"alistigo:listElementId": TypeIDString;
|
|
42
|
+
}
|
|
43
|
+
export interface AlistigoListExportedRecord extends AlistigoEventRecordBase {
|
|
44
|
+
"alistigo:eventType": "ListExported";
|
|
45
|
+
}
|
|
46
|
+
export type AlistigoEventRecord = AlistigoListCreatedRecord | AlistigoListElementAddedRecord | AlistigoListElementDeletedRecord | AlistigoListExportedRecord;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AACrD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC,eAAO,MAAM,gBAAgB;;;CAGnB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,OAAO,gBAAgB,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,eAAe,CAAC;IAC5B,OAAO,EAAE,UAAU,CAAC;IACpB,iBAAiB,EAAE,YAAY,CAAC;IAChC,wBAAwB,EAAE,MAAM,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,gBAAgB,EAAE,CAAC;IACpC,uBAAuB,EAAE,mBAAmB,EAAE,CAAC;CAChD;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,UAAU,CAAC;IACpB,wBAAwB,EAAE,YAAY,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,uBAAuB;IAC/B,sBAAsB,EAAE,YAAY,CAAC;IACrC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,YAAY,CAAC;IAChC,kBAAkB,EAAE,YAAY,CAAC;IACjC,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,yBAA0B,SAAQ,uBAAuB;IACxE,oBAAoB,EAAE,aAAa,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,8BAA+B,SAAQ,uBAAuB;IAC7E,oBAAoB,EAAE,kBAAkB,CAAC;IACzC,wBAAwB,EAAE,YAAY,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gCAAiC,SAAQ,uBAAuB;IAC/E,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,wBAAwB,EAAE,YAAY,CAAC;CACxC;AAED,MAAM,WAAW,0BAA2B,SAAQ,uBAAuB;IACzE,oBAAoB,EAAE,cAAc,CAAC;CACtC;AAED,MAAM,MAAM,mBAAmB,GAC3B,yBAAyB,GACzB,8BAA8B,GAC9B,gCAAgC,GAChC,0BAA0B,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,qBAAqB;IAC/B,QAAQ,EAAE,4BAA4B;CAC9B,CAAC"}
|