jazz-tools 0.8.15 → 0.8.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. package/CHANGELOG.md +283 -269
  2. package/dist/native/coValues/account.js +3 -6
  3. package/dist/native/coValues/account.js.map +1 -1
  4. package/dist/native/coValues/coList.js +3 -7
  5. package/dist/native/coValues/coList.js.map +1 -1
  6. package/dist/native/coValues/coMap.js +8 -14
  7. package/dist/native/coValues/coMap.js.map +1 -1
  8. package/dist/native/coValues/coStream.js +7 -12
  9. package/dist/native/coValues/coStream.js.map +1 -1
  10. package/dist/native/coValues/deepLoading.js +6 -3
  11. package/dist/native/coValues/deepLoading.js.map +1 -1
  12. package/dist/native/coValues/extensions/imageDef.js.map +1 -1
  13. package/dist/native/coValues/group.js +3 -6
  14. package/dist/native/coValues/group.js.map +1 -1
  15. package/dist/native/coValues/interfaces.js +4 -3
  16. package/dist/native/coValues/interfaces.js.map +1 -1
  17. package/dist/native/exports.js +3 -9
  18. package/dist/native/exports.js.map +1 -1
  19. package/dist/native/implementation/createContext.js +1 -2
  20. package/dist/native/implementation/createContext.js.map +1 -1
  21. package/dist/native/implementation/devtoolsFormatters.js +5 -25
  22. package/dist/native/implementation/devtoolsFormatters.js.map +1 -1
  23. package/dist/native/implementation/refs.js +1 -2
  24. package/dist/native/implementation/refs.js.map +1 -1
  25. package/dist/native/implementation/schema.js +1 -1
  26. package/dist/native/implementation/schema.js.map +1 -1
  27. package/dist/native/implementation/subscriptionScope.js +2 -4
  28. package/dist/native/implementation/subscriptionScope.js.map +1 -1
  29. package/dist/native/index.native.js +1 -1
  30. package/dist/native/index.native.js.map +1 -1
  31. package/dist/native/lib/cache.js.map +1 -1
  32. package/dist/native/lib/cache.test.js +1 -1
  33. package/dist/native/lib/cache.test.js.map +1 -1
  34. package/dist/web/coValues/account.js +3 -6
  35. package/dist/web/coValues/account.js.map +1 -1
  36. package/dist/web/coValues/coList.js +3 -7
  37. package/dist/web/coValues/coList.js.map +1 -1
  38. package/dist/web/coValues/coMap.js +8 -14
  39. package/dist/web/coValues/coMap.js.map +1 -1
  40. package/dist/web/coValues/coStream.js +7 -12
  41. package/dist/web/coValues/coStream.js.map +1 -1
  42. package/dist/web/coValues/deepLoading.js +6 -3
  43. package/dist/web/coValues/deepLoading.js.map +1 -1
  44. package/dist/web/coValues/extensions/imageDef.js.map +1 -1
  45. package/dist/web/coValues/group.js +3 -6
  46. package/dist/web/coValues/group.js.map +1 -1
  47. package/dist/web/coValues/interfaces.js +4 -3
  48. package/dist/web/coValues/interfaces.js.map +1 -1
  49. package/dist/web/exports.js +3 -9
  50. package/dist/web/exports.js.map +1 -1
  51. package/dist/web/implementation/createContext.js +1 -2
  52. package/dist/web/implementation/createContext.js.map +1 -1
  53. package/dist/web/implementation/devtoolsFormatters.js +5 -25
  54. package/dist/web/implementation/devtoolsFormatters.js.map +1 -1
  55. package/dist/web/implementation/refs.js +1 -2
  56. package/dist/web/implementation/refs.js.map +1 -1
  57. package/dist/web/implementation/schema.js +1 -1
  58. package/dist/web/implementation/schema.js.map +1 -1
  59. package/dist/web/implementation/subscriptionScope.js +2 -4
  60. package/dist/web/implementation/subscriptionScope.js.map +1 -1
  61. package/dist/web/lib/cache.js.map +1 -1
  62. package/dist/web/lib/cache.test.js +1 -1
  63. package/dist/web/lib/cache.test.js.map +1 -1
  64. package/package.json +5 -9
  65. package/src/coValues/account.ts +330 -339
  66. package/src/coValues/coList.ts +474 -495
  67. package/src/coValues/coMap.ts +584 -604
  68. package/src/coValues/coStream.ts +624 -650
  69. package/src/coValues/deepLoading.ts +184 -200
  70. package/src/coValues/extensions/imageDef.ts +44 -44
  71. package/src/coValues/group.ts +196 -210
  72. package/src/coValues/interfaces.ts +197 -199
  73. package/src/exports.ts +38 -26
  74. package/src/implementation/createContext.ts +206 -213
  75. package/src/implementation/devtoolsFormatters.ts +80 -100
  76. package/src/implementation/refs.ts +127 -139
  77. package/src/implementation/schema.ts +124 -128
  78. package/src/implementation/subscriptionScope.ts +111 -121
  79. package/src/index.native.ts +3 -3
  80. package/src/lib/cache.test.ts +48 -48
  81. package/src/lib/cache.ts +9 -9
  82. package/src/tests/coList.test.ts +264 -283
  83. package/src/tests/coMap.test.ts +741 -761
  84. package/src/tests/coStream.test.ts +405 -438
  85. package/src/tests/deepLoading.test.ts +251 -256
  86. package/src/tests/groupsAndAccounts.test.ts +70 -74
  87. package/src/tests/schema.test.ts +198 -198
  88. package/src/tests/subscribe.test.ts +312 -299
  89. package/tsconfig.json +2 -4
  90. package/tsconfig.native.json +4 -10
  91. package/tsconfig.web.json +4 -10
  92. package/.eslintrc.cjs +0 -24
  93. package/.prettierrc.js +0 -9
@@ -3,109 +3,89 @@
3
3
  import { ItemsSym } from "./symbols.js";
4
4
 
5
5
  (globalThis as any).devtoolsFormatters = [
6
- {
7
- header: (object: any) => {
8
- if (object._type === "CoMap") {
9
- return ["div", {}, ["span", {}, object.constructor.name]];
10
- } else if (object._type === "CoList") {
11
- return [
12
- "div",
13
- {},
6
+ {
7
+ header: (object: any) => {
8
+ if (object._type === "CoMap") {
9
+ return ["div", {}, ["span", {}, object.constructor.name]];
10
+ } else if (object._type === "CoList") {
11
+ return [
12
+ "div",
13
+ {},
14
+ ["span", {}, object.constructor.name + "(" + object.length + ") "],
15
+ ];
16
+ } else if (object._type === "Account") {
17
+ return [
18
+ "div",
19
+ {},
20
+ [
21
+ "span",
22
+ {},
23
+ object.constructor.name +
24
+ "(" +
25
+ object._refs.profile.value?.name +
26
+ (object.isMe ? " ME" : "") +
27
+ ")",
28
+ ],
29
+ ];
30
+ } else {
31
+ return null;
32
+ }
33
+ },
34
+ hasBody: function () {
35
+ return true;
36
+ },
37
+ body: function (object: any) {
38
+ if (object._type === "CoMap" || object._type === "Account") {
39
+ return [
40
+ "div",
41
+ { style: "margin-left: 15px" },
42
+ ["div", "id: ", ["object", { object: object.id }]],
43
+ ...Object.entries(object).map(([k, v]) => [
44
+ "div",
45
+ { style: "white-space: nowrap;" },
46
+ ["span", { style: "font-weight: bold; opacity: 0.6" }, k, ": "],
47
+ ["object", { object: v }],
48
+ ...(typeof object._schema[k] === "function"
49
+ ? v === null
50
+ ? [
14
51
  [
15
- "span",
16
- {},
17
- object.constructor.name + "(" + object.length + ") ",
52
+ "span",
53
+ { style: "opacity: 0.5" },
54
+ ` (pending ${object._schema[k].name} `,
55
+ ["object", { object: object._refs[k] }],
56
+ ")",
18
57
  ],
19
- ];
20
- } else if (object._type === "Account") {
21
- return [
22
- "div",
23
- {},
58
+ ]
59
+ : []
60
+ : []),
61
+ ]),
62
+ ];
63
+ } else if (object._type === "CoList") {
64
+ return [
65
+ "div",
66
+ { style: "margin-left: 15px" },
67
+ ["div", "id: ", ["object", { object: object.id }]],
68
+ ...(object as any[]).map((v, i) => [
69
+ "div",
70
+ { style: "white-space: nowrap;" },
71
+ ["span", { style: "font-weight: bold; opacity: 0.6" }, i, ": "],
72
+ ["object", { object: v }],
73
+ ...(typeof object._schema[ItemsSym] === "function"
74
+ ? v === null
75
+ ? [
24
76
  [
25
- "span",
26
- {},
27
- object.constructor.name +
28
- "(" +
29
- object._refs.profile.value?.name +
30
- (object.isMe ? " ME" : "") +
31
- ")",
77
+ "span",
78
+ { style: "opacity: 0.5" },
79
+ ` (pending ${object._schema[ItemsSym].name} `,
80
+ ["object", { object: object._refs[i] }],
81
+ ")",
32
82
  ],
33
- ];
34
- } else {
35
- return null;
36
- }
37
- },
38
- hasBody: function () {
39
- return true;
40
- },
41
- body: function (object: any) {
42
- if (object._type === "CoMap" || object._type === "Account") {
43
- return [
44
- "div",
45
- { style: "margin-left: 15px" },
46
- ["div", "id: ", ["object", { object: object.id }]],
47
- ...Object.entries(object).map(([k, v]) => [
48
- "div",
49
- { style: "white-space: nowrap;" },
50
- [
51
- "span",
52
- { style: "font-weight: bold; opacity: 0.6" },
53
- k,
54
- ": ",
55
- ],
56
- ["object", { object: v }],
57
- ...(typeof object._schema[k] === "function"
58
- ? v === null
59
- ? [
60
- [
61
- "span",
62
- { style: "opacity: 0.5" },
63
- ` (pending ${object._schema[k].name} `,
64
- [
65
- "object",
66
- { object: object._refs[k] },
67
- ],
68
- ")",
69
- ],
70
- ]
71
- : []
72
- : []),
73
- ]),
74
- ];
75
- } else if (object._type === "CoList") {
76
- return [
77
- "div",
78
- { style: "margin-left: 15px" },
79
- ["div", "id: ", ["object", { object: object.id }]],
80
- ...(object as any[]).map((v, i) => [
81
- "div",
82
- { style: "white-space: nowrap;" },
83
- [
84
- "span",
85
- { style: "font-weight: bold; opacity: 0.6" },
86
- i,
87
- ": ",
88
- ],
89
- ["object", { object: v }],
90
- ...(typeof object._schema[ItemsSym] === "function"
91
- ? v === null
92
- ? [
93
- [
94
- "span",
95
- { style: "opacity: 0.5" },
96
- ` (pending ${object._schema[ItemsSym].name} `,
97
- [
98
- "object",
99
- { object: object._refs[i] },
100
- ],
101
- ")",
102
- ],
103
- ]
104
- : []
105
- : []),
106
- ]),
107
- ];
108
- }
109
- },
83
+ ]
84
+ : []
85
+ : []),
86
+ ]),
87
+ ];
88
+ }
110
89
  },
90
+ },
111
91
  ];
@@ -1,171 +1,159 @@
1
1
  import type { CoID, RawCoValue } from "cojson";
2
2
  import type {
3
- Account,
4
- AnonymousJazzAgent,
5
- CoValue,
6
- ID,
7
- RefEncoded,
8
- UnCo,
3
+ Account,
4
+ AnonymousJazzAgent,
5
+ CoValue,
6
+ ID,
7
+ RefEncoded,
8
+ UnCo,
9
9
  } from "../internal.js";
10
10
  import {
11
- instantiateRefEncoded,
12
- isRefEncoded,
13
- subscriptionsScopes,
11
+ instantiateRefEncoded,
12
+ isRefEncoded,
13
+ subscriptionsScopes,
14
14
  } from "../internal.js";
15
15
  import { coValuesCache } from "../lib/cache.js";
16
16
 
17
17
  const TRACE_ACCESSES = false;
18
18
 
19
19
  export class Ref<out V extends CoValue> {
20
- constructor(
21
- readonly id: ID<V>,
22
- readonly controlledAccount: Account | AnonymousJazzAgent,
23
- readonly schema: RefEncoded<V>,
24
- ) {
25
- if (!isRefEncoded(schema)) {
26
- throw new Error("Ref must be constructed with a ref schema");
27
- }
20
+ constructor(
21
+ readonly id: ID<V>,
22
+ readonly controlledAccount: Account | AnonymousJazzAgent,
23
+ readonly schema: RefEncoded<V>,
24
+ ) {
25
+ if (!isRefEncoded(schema)) {
26
+ throw new Error("Ref must be constructed with a ref schema");
28
27
  }
28
+ }
29
29
 
30
- get value() {
31
- const node =
32
- "node" in this.controlledAccount
33
- ? this.controlledAccount.node
34
- : this.controlledAccount._raw.core.node;
35
- const raw = node.getLoaded(this.id as unknown as CoID<RawCoValue>);
36
- if (raw) {
37
- return coValuesCache.get(raw, () =>
38
- instantiateRefEncoded(this.schema, raw),
39
- );
40
- } else {
41
- return null;
42
- }
30
+ get value() {
31
+ const node =
32
+ "node" in this.controlledAccount
33
+ ? this.controlledAccount.node
34
+ : this.controlledAccount._raw.core.node;
35
+ const raw = node.getLoaded(this.id as unknown as CoID<RawCoValue>);
36
+ if (raw) {
37
+ return coValuesCache.get(raw, () =>
38
+ instantiateRefEncoded(this.schema, raw),
39
+ );
40
+ } else {
41
+ return null;
43
42
  }
43
+ }
44
44
 
45
- private async loadHelper(): Promise<V | "unavailable"> {
46
- const node =
47
- "node" in this.controlledAccount
48
- ? this.controlledAccount.node
49
- : this.controlledAccount._raw.core.node;
50
- const raw = await node.load(
51
- this.id as unknown as CoID<RawCoValue>,
52
- );
53
- if (raw === "unavailable") {
54
- return "unavailable";
55
- } else {
56
- return new Ref(this.id, this.controlledAccount, this.schema).value!;
57
- }
45
+ private async loadHelper(): Promise<V | "unavailable"> {
46
+ const node =
47
+ "node" in this.controlledAccount
48
+ ? this.controlledAccount.node
49
+ : this.controlledAccount._raw.core.node;
50
+ const raw = await node.load(this.id as unknown as CoID<RawCoValue>);
51
+ if (raw === "unavailable") {
52
+ return "unavailable";
53
+ } else {
54
+ return new Ref(this.id, this.controlledAccount, this.schema).value!;
58
55
  }
56
+ }
59
57
 
60
- async load(): Promise<V | undefined> {
61
- const result = await this.loadHelper();
62
- if (result === "unavailable") {
63
- return undefined;
64
- } else {
65
- return result;
66
- }
58
+ async load(): Promise<V | undefined> {
59
+ const result = await this.loadHelper();
60
+ if (result === "unavailable") {
61
+ return undefined;
62
+ } else {
63
+ return result;
67
64
  }
65
+ }
68
66
 
69
- accessFrom(
70
- fromScopeValue: CoValue,
71
- key: string | number | symbol,
72
- ): V | null {
73
- const subScope = subscriptionsScopes.get(fromScopeValue);
67
+ accessFrom(fromScopeValue: CoValue, key: string | number | symbol): V | null {
68
+ const subScope = subscriptionsScopes.get(fromScopeValue);
74
69
 
75
- subScope?.onRefAccessedOrSet(fromScopeValue.id, this.id);
76
- TRACE_ACCESSES &&
77
- console.log(
78
- subScope?.scopeID,
79
- "accessing",
80
- fromScopeValue,
81
- key,
82
- this.id,
83
- );
70
+ subScope?.onRefAccessedOrSet(fromScopeValue.id, this.id);
71
+ TRACE_ACCESSES &&
72
+ console.log(subScope?.scopeID, "accessing", fromScopeValue, key, this.id);
84
73
 
85
- if (this.value && subScope) {
86
- subscriptionsScopes.set(this.value, subScope);
87
- }
74
+ if (this.value && subScope) {
75
+ subscriptionsScopes.set(this.value, subScope);
76
+ }
88
77
 
89
- if (subScope) {
90
- const cached = subScope.cachedValues[this.id];
91
- if (cached) {
92
- TRACE_ACCESSES && console.log("cached", cached);
93
- return cached as V;
94
- } else if (this.value !== null) {
95
- const freshValueInstance = instantiateRefEncoded(
96
- this.schema,
97
- this.value?._raw,
98
- );
99
- TRACE_ACCESSES &&
100
- console.log("freshValueInstance", freshValueInstance);
101
- subScope.cachedValues[this.id] = freshValueInstance;
102
- subscriptionsScopes.set(freshValueInstance, subScope);
103
- return freshValueInstance as V;
104
- } else {
105
- return null;
106
- }
107
- } else {
108
- return this.value;
109
- }
78
+ if (subScope) {
79
+ const cached = subScope.cachedValues[this.id];
80
+ if (cached) {
81
+ TRACE_ACCESSES && console.log("cached", cached);
82
+ return cached as V;
83
+ } else if (this.value !== null) {
84
+ const freshValueInstance = instantiateRefEncoded(
85
+ this.schema,
86
+ this.value?._raw,
87
+ );
88
+ TRACE_ACCESSES && console.log("freshValueInstance", freshValueInstance);
89
+ subScope.cachedValues[this.id] = freshValueInstance;
90
+ subscriptionsScopes.set(freshValueInstance, subScope);
91
+ return freshValueInstance as V;
92
+ } else {
93
+ return null;
94
+ }
95
+ } else {
96
+ return this.value;
110
97
  }
98
+ }
111
99
  }
112
100
 
113
101
  export function makeRefs<Keys extends string | number>(
114
- getIdForKey: (key: Keys) => ID<CoValue> | undefined,
115
- getKeysWithIds: () => Keys[],
116
- controlledAccount: Account | AnonymousJazzAgent,
117
- refSchemaForKey: (key: Keys) => RefEncoded<CoValue>,
102
+ getIdForKey: (key: Keys) => ID<CoValue> | undefined,
103
+ getKeysWithIds: () => Keys[],
104
+ controlledAccount: Account | AnonymousJazzAgent,
105
+ refSchemaForKey: (key: Keys) => RefEncoded<CoValue>,
118
106
  ): { [K in Keys]: Ref<CoValue> } & {
107
+ [Symbol.iterator]: () => IterableIterator<Ref<CoValue>>;
108
+ length: number;
109
+ } {
110
+ const refs = {} as { [K in Keys]: Ref<CoValue> } & {
119
111
  [Symbol.iterator]: () => IterableIterator<Ref<CoValue>>;
120
112
  length: number;
121
- } {
122
- const refs = {} as { [K in Keys]: Ref<CoValue> } & {
123
- [Symbol.iterator]: () => IterableIterator<Ref<CoValue>>;
124
- length: number;
125
- };
126
- return new Proxy(refs, {
127
- get(_target, key) {
128
- if (key === Symbol.iterator) {
129
- return function* () {
130
- for (const key of getKeysWithIds()) {
131
- yield new Ref(
132
- getIdForKey(key)!,
133
- controlledAccount,
134
- refSchemaForKey(key),
135
- );
136
- }
137
- };
138
- }
139
- if (typeof key === "symbol") return undefined;
140
- if (key === "length") {
141
- return getKeysWithIds().length;
142
- }
143
- const id = getIdForKey(key as Keys);
144
- if (!id) return undefined;
145
- return new Ref(
146
- id as ID<CoValue>,
147
- controlledAccount,
148
- refSchemaForKey(key as Keys),
113
+ };
114
+ return new Proxy(refs, {
115
+ get(_target, key) {
116
+ if (key === Symbol.iterator) {
117
+ return function* () {
118
+ for (const key of getKeysWithIds()) {
119
+ yield new Ref(
120
+ getIdForKey(key)!,
121
+ controlledAccount,
122
+ refSchemaForKey(key),
149
123
  );
150
- },
151
- ownKeys() {
152
- return getKeysWithIds().map((key) => key.toString());
153
- },
154
- getOwnPropertyDescriptor(target, key) {
155
- const id = getIdForKey(key as Keys);
156
- if (id) {
157
- return {
158
- enumerable: true,
159
- configurable: true,
160
- writable: true,
161
- };
162
- } else {
163
- return Reflect.getOwnPropertyDescriptor(target, key);
164
- }
165
- },
166
- });
124
+ }
125
+ };
126
+ }
127
+ if (typeof key === "symbol") return undefined;
128
+ if (key === "length") {
129
+ return getKeysWithIds().length;
130
+ }
131
+ const id = getIdForKey(key as Keys);
132
+ if (!id) return undefined;
133
+ return new Ref(
134
+ id as ID<CoValue>,
135
+ controlledAccount,
136
+ refSchemaForKey(key as Keys),
137
+ );
138
+ },
139
+ ownKeys() {
140
+ return getKeysWithIds().map((key) => key.toString());
141
+ },
142
+ getOwnPropertyDescriptor(target, key) {
143
+ const id = getIdForKey(key as Keys);
144
+ if (id) {
145
+ return {
146
+ enumerable: true,
147
+ configurable: true,
148
+ writable: true,
149
+ };
150
+ } else {
151
+ return Reflect.getOwnPropertyDescriptor(target, key);
152
+ }
153
+ },
154
+ });
167
155
  }
168
156
 
169
157
  export type RefIfCoValue<V> = NonNullable<V> extends CoValue
170
- ? Ref<UnCo<NonNullable<V>>>
171
- : never;
158
+ ? Ref<UnCo<NonNullable<V>>>
159
+ : never;