@editability/shared 0.1.4 → 0.1.7

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/dist/ast.d.ts CHANGED
@@ -37,9 +37,16 @@ export type PublishChange = {
37
37
  ast: EditabilityAst;
38
38
  fingerprint?: string;
39
39
  };
40
+ export type PublishResourceChange = {
41
+ path: string;
42
+ schemaId: string;
43
+ fingerprint: string;
44
+ value: unknown;
45
+ };
40
46
  export type PublishRequest = {
41
47
  message?: string;
42
48
  changes: PublishChange[];
49
+ resources?: PublishResourceChange[];
43
50
  force?: boolean;
44
51
  };
45
52
  export type PublishResponse = {
package/dist/ast.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAE1B,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,EAAE,CAAA;CAAE,CAAC;AAE1C,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,cAAc,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC"}
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAE1B,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,EAAE,CAAA;CAAE,CAAC;AAE1C,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,cAAc,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export * from "./ast.js";
2
2
  export * from "./diff.js";
3
3
  export * from "./ids.js";
4
+ export * from "./json.js";
5
+ export * from "./resources.js";
4
6
  export * from "./sanitize.js";
5
7
  export * from "./text.js";
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  export * from "./ast.js";
2
2
  export * from "./diff.js";
3
3
  export * from "./ids.js";
4
+ export * from "./json.js";
5
+ export * from "./resources.js";
4
6
  export * from "./sanitize.js";
5
7
  export * from "./text.js";
6
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
package/dist/json.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare function stableJsonStringify(value: unknown): string;
2
+ export declare function stableJsonStringifyPretty(value: unknown, indent?: number): string;
3
+ export declare function jsonFingerprint(value: unknown): string;
4
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAmFA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE1D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,SAAI,GAAG,MAAM,CAE5E;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD"}
package/dist/json.js ADDED
@@ -0,0 +1,94 @@
1
+ import { fnv1a64 } from "./ids.js";
2
+ // Stable JSON utilities used for fingerprinting and deterministic serialization.
3
+ // This intentionally mirrors JSON.stringify behavior for undefined values:
4
+ // - object keys with undefined are omitted
5
+ // - array entries that are undefined serialize as null
6
+ function isPlainObject(value) {
7
+ if (value === null || typeof value !== "object")
8
+ return false;
9
+ const proto = Object.getPrototypeOf(value);
10
+ return proto === Object.prototype || proto === null;
11
+ }
12
+ function stringifyStable(value, indent, depth, seen) {
13
+ if (value === null)
14
+ return "null";
15
+ if (typeof value === "string")
16
+ return JSON.stringify(value);
17
+ if (typeof value === "number")
18
+ return Number.isFinite(value) ? String(value) : "null";
19
+ if (typeof value === "boolean")
20
+ return value ? "true" : "false";
21
+ if (typeof value === "bigint")
22
+ return JSON.stringify(value.toString());
23
+ if (typeof value === "undefined" || typeof value === "function" || typeof value === "symbol")
24
+ return "null";
25
+ if (value instanceof Date) {
26
+ return JSON.stringify(value.toISOString());
27
+ }
28
+ if (Array.isArray(value)) {
29
+ if (seen.has(value))
30
+ throw new Error("stableJsonStringify: circular reference");
31
+ seen.add(value);
32
+ const parts = value.map((entry) => {
33
+ if (typeof entry === "undefined" || typeof entry === "function" || typeof entry === "symbol") {
34
+ return "null";
35
+ }
36
+ return stringifyStable(entry, indent, depth + 1, seen);
37
+ });
38
+ seen.delete(value);
39
+ if (indent <= 0) {
40
+ return `[${parts.join(",")}]`;
41
+ }
42
+ if (parts.length === 0)
43
+ return "[]";
44
+ const pad = " ".repeat(indent);
45
+ const prefix = pad.repeat(depth + 1);
46
+ const closePrefix = pad.repeat(depth);
47
+ return `[\n${prefix}${parts.join(`,\n${prefix}`)}\n${closePrefix}]`;
48
+ }
49
+ if (!isPlainObject(value)) {
50
+ // Fall back to JSON.stringify for non-plain objects (e.g. class instances)
51
+ // to avoid surprising serialization. If it fails, emit null.
52
+ try {
53
+ const json = JSON.stringify(value);
54
+ return json ?? "null";
55
+ }
56
+ catch {
57
+ return "null";
58
+ }
59
+ }
60
+ if (seen.has(value))
61
+ throw new Error("stableJsonStringify: circular reference");
62
+ seen.add(value);
63
+ const keys = Object.keys(value).sort();
64
+ const entries = [];
65
+ for (const k of keys) {
66
+ const v = value[k];
67
+ if (typeof v === "undefined" || typeof v === "function" || typeof v === "symbol") {
68
+ continue;
69
+ }
70
+ entries.push({ k, v: stringifyStable(v, indent, depth + 1, seen) });
71
+ }
72
+ seen.delete(value);
73
+ if (indent <= 0) {
74
+ const joined = entries.map((e) => `${JSON.stringify(e.k)}:${e.v}`).join(",");
75
+ return `{${joined}}`;
76
+ }
77
+ if (entries.length === 0)
78
+ return "{}";
79
+ const pad = " ".repeat(indent);
80
+ const prefix = pad.repeat(depth + 1);
81
+ const closePrefix = pad.repeat(depth);
82
+ const joined = entries.map((e) => `${JSON.stringify(e.k)}: ${e.v}`).join(`,\n${prefix}`);
83
+ return `{\n${prefix}${joined}\n${closePrefix}}`;
84
+ }
85
+ export function stableJsonStringify(value) {
86
+ return stringifyStable(value, 0, 0, new Set());
87
+ }
88
+ export function stableJsonStringifyPretty(value, indent = 2) {
89
+ return stringifyStable(value, indent, 0, new Set());
90
+ }
91
+ export function jsonFingerprint(value) {
92
+ return fnv1a64(stableJsonStringify(value));
93
+ }
94
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export type EditableResource = {
2
+ path: string;
3
+ schemaId: string;
4
+ label?: string;
5
+ initial?: unknown;
6
+ fingerprint?: string;
7
+ };
8
+ export type ResourceDraft = {
9
+ path: string;
10
+ schemaId: string;
11
+ fingerprint: string;
12
+ value: unknown;
13
+ updatedAt: number;
14
+ label?: string;
15
+ };
16
+ export type ResourceStoreSnapshot = {
17
+ version: 1;
18
+ updatedAt: number;
19
+ registered: Record<string, EditableResource>;
20
+ drafts: Record<string, ResourceDraft>;
21
+ };
22
+ export type EditabilityResourceStore = {
23
+ getSnapshot: () => ResourceStoreSnapshot;
24
+ subscribe: (listener: () => void) => () => void;
25
+ register: (resource: {
26
+ path: string;
27
+ schemaId: string;
28
+ label?: string;
29
+ initial: unknown;
30
+ }) => void;
31
+ setDraft: (path: string, value: unknown) => void;
32
+ clearDraft: (path: string) => void;
33
+ clearAllDrafts: () => void;
34
+ getDrafts: () => ResourceDraft[];
35
+ };
36
+ export declare function getEditabilityResourceStore(): EditabilityResourceStore;
37
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,MAAM,qBAAqB,CAAC;IACzC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,QAAQ,EAAE,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACnG,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,aAAa,EAAE,CAAC;CAClC,CAAC;AA4BF,wBAAgB,2BAA2B,IAAI,wBAAwB,CAqGtE"}
@@ -0,0 +1,125 @@
1
+ import { jsonFingerprint } from "./json.js";
2
+ const STORAGE_KEY = "editability:resources:draft:v1";
3
+ const GLOBAL_KEY = "__editabilityResourceStore";
4
+ function safeParse(raw) {
5
+ if (!raw)
6
+ return null;
7
+ try {
8
+ return JSON.parse(raw);
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ }
14
+ function loadDrafts() {
15
+ if (typeof window === "undefined")
16
+ return {};
17
+ const parsed = safeParse(localStorage.getItem(STORAGE_KEY));
18
+ if (!parsed || parsed.version !== 1 || !parsed.drafts || typeof parsed.drafts !== "object") {
19
+ return {};
20
+ }
21
+ return parsed.drafts;
22
+ }
23
+ function saveDrafts(drafts) {
24
+ if (typeof window === "undefined")
25
+ return;
26
+ localStorage.setItem(STORAGE_KEY, JSON.stringify({ version: 1, drafts }));
27
+ }
28
+ export function getEditabilityResourceStore() {
29
+ if (typeof window === "undefined") {
30
+ // Server safety: return a no-op store.
31
+ return {
32
+ getSnapshot: () => ({ version: 1, updatedAt: Date.now(), registered: {}, drafts: {} }),
33
+ subscribe: () => () => undefined,
34
+ register: () => undefined,
35
+ setDraft: () => undefined,
36
+ clearDraft: () => undefined,
37
+ clearAllDrafts: () => undefined,
38
+ getDrafts: () => [],
39
+ };
40
+ }
41
+ const w = window;
42
+ const existing = w[GLOBAL_KEY];
43
+ if (existing) {
44
+ return existing;
45
+ }
46
+ const listeners = new Set();
47
+ let snapshot = {
48
+ version: 1,
49
+ updatedAt: Date.now(),
50
+ registered: {},
51
+ drafts: loadDrafts(),
52
+ };
53
+ const emit = (next) => {
54
+ snapshot = next;
55
+ saveDrafts(snapshot.drafts);
56
+ listeners.forEach((fn) => fn());
57
+ };
58
+ const store = {
59
+ getSnapshot: () => snapshot,
60
+ subscribe: (listener) => {
61
+ listeners.add(listener);
62
+ return () => listeners.delete(listener);
63
+ },
64
+ register: ({ path, schemaId, label, initial }) => {
65
+ const fingerprint = jsonFingerprint(initial);
66
+ const registered = { ...snapshot.registered, [path]: { path, schemaId, label, initial, fingerprint } };
67
+ const drafts = { ...snapshot.drafts };
68
+ // If a draft exists but schemaId is missing (older), keep it; otherwise update metadata.
69
+ const draft = drafts[path];
70
+ if (draft) {
71
+ drafts[path] = { ...draft, schemaId: draft.schemaId || schemaId, label: draft.label ?? label };
72
+ }
73
+ emit({ ...snapshot, updatedAt: Date.now(), registered, drafts });
74
+ },
75
+ setDraft: (path, value) => {
76
+ const registered = snapshot.registered[path];
77
+ const existingDraft = snapshot.drafts[path];
78
+ const schemaId = registered?.schemaId ?? existingDraft?.schemaId;
79
+ const fingerprint = registered?.fingerprint ?? existingDraft?.fingerprint;
80
+ if (!schemaId || !fingerprint) {
81
+ // Without registration we can't safely accept edits.
82
+ console.warn(`Editability: cannot set draft for unregistered resource: ${path}`);
83
+ return;
84
+ }
85
+ // If the draft equals the initial fingerprint, clear it to keep the draft store minimal.
86
+ const nextFingerprint = jsonFingerprint(value);
87
+ if (registered?.fingerprint && nextFingerprint === registered.fingerprint) {
88
+ if (!existingDraft) {
89
+ return;
90
+ }
91
+ const drafts = { ...snapshot.drafts };
92
+ delete drafts[path];
93
+ emit({ ...snapshot, updatedAt: Date.now(), drafts });
94
+ return;
95
+ }
96
+ const drafts = { ...snapshot.drafts };
97
+ drafts[path] = {
98
+ path,
99
+ schemaId,
100
+ fingerprint,
101
+ value,
102
+ updatedAt: Date.now(),
103
+ label: registered?.label ?? existingDraft?.label,
104
+ };
105
+ emit({ ...snapshot, updatedAt: Date.now(), drafts });
106
+ },
107
+ clearDraft: (path) => {
108
+ const existing = snapshot.drafts[path];
109
+ if (!existing)
110
+ return;
111
+ const drafts = { ...snapshot.drafts };
112
+ delete drafts[path];
113
+ emit({ ...snapshot, updatedAt: Date.now(), drafts });
114
+ },
115
+ clearAllDrafts: () => {
116
+ if (Object.keys(snapshot.drafts).length === 0)
117
+ return;
118
+ emit({ ...snapshot, updatedAt: Date.now(), drafts: {} });
119
+ },
120
+ getDrafts: () => Object.values(snapshot.drafts).sort((a, b) => b.updatedAt - a.updatedAt),
121
+ };
122
+ w[GLOBAL_KEY] = store;
123
+ return store;
124
+ }
125
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAoC5C,MAAM,WAAW,GAAG,gCAAgC,CAAC;AACrD,MAAM,UAAU,GAAG,4BAA4B,CAAC;AAEhD,SAAS,SAAS,CAAC,GAAkB;IACnC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAwE,CAAC;IACnI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC3F,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,SAAS,UAAU,CAAC,MAAqC;IACvD,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,uCAAuC;QACvC,OAAO;YACL,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACtF,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS;YAChC,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS;YACzB,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS;YACzB,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS;YAC3B,cAAc,EAAE,GAAG,EAAE,CAAC,SAAS;YAC/B,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE;SACpB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,GAAG,MAA4C,CAAC;IACvD,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAyC,CAAC;IACvE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,IAAI,QAAQ,GAA0B;QACpC,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,UAAU,EAAE,EAAE;QACd,MAAM,EAAE,UAAU,EAAE;KACrB,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,IAA2B,EAAE,EAAE;QAC3C,QAAQ,GAAG,IAAI,CAAC;QAChB,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5B,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,KAAK,GAA6B;QACtC,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ;QAC3B,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE;YACtB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;YAC/C,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;YACvG,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,yFAAyF;YACzF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;YACjG,CAAC;YACD,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACxB,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,UAAU,EAAE,QAAQ,IAAI,aAAa,EAAE,QAAQ,CAAC;YACjE,MAAM,WAAW,GAAG,UAAU,EAAE,WAAW,IAAI,aAAa,EAAE,WAAW,CAAC;YAC1E,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC9B,qDAAqD;gBACrD,OAAO,CAAC,IAAI,CAAC,4DAA4D,IAAI,EAAE,CAAC,CAAC;gBACjF,OAAO;YACT,CAAC;YAED,yFAAyF;YACzF,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,UAAU,EAAE,WAAW,IAAI,eAAe,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC;gBAC1E,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,OAAO;gBACT,CAAC;gBACD,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACtC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;gBACpB,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,GAAG;gBACb,IAAI;gBACJ,QAAQ;gBACR,WAAW;gBACX,KAAK;gBACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,aAAa,EAAE,KAAK;aACjD,CAAC;YACF,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YACnB,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,cAAc,EAAE,GAAG,EAAE;YACnB,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACtD,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;KAC1F,CAAC;IAEF,CAAC,CAAC,UAAU,CAAC,GAAG,KAAgB,CAAC;IACjC,OAAO,KAAK,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@editability/shared",
3
- "version": "0.1.4",
3
+ "version": "0.1.7",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -16,6 +16,7 @@
16
16
  "sideEffects": false,
17
17
  "devDependencies": {
18
18
  "@types/node": "latest",
19
+ "jsdom": "latest",
19
20
  "typescript": "latest",
20
21
  "vitest": "latest"
21
22
  },