ngx-zero 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/LICENSE +21 -0
- package/README.md +194 -0
- package/dist/errors.d.ts +2 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +4 -0
- package/dist/errors.js.map +1 -0
- package/dist/features.d.ts +9 -0
- package/dist/features.d.ts.map +1 -0
- package/dist/features.js +14 -0
- package/dist/features.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/inject-connection-state.d.ts +6 -0
- package/dist/inject-connection-state.d.ts.map +1 -0
- package/dist/inject-connection-state.js +41 -0
- package/dist/inject-connection-state.js.map +1 -0
- package/dist/inject-mutator.d.ts +4 -0
- package/dist/inject-mutator.d.ts.map +1 -0
- package/dist/inject-mutator.js +63 -0
- package/dist/inject-mutator.js.map +1 -0
- package/dist/inject-query.d.ts +7 -0
- package/dist/inject-query.d.ts.map +1 -0
- package/dist/inject-query.js +47 -0
- package/dist/inject-query.js.map +1 -0
- package/dist/inject-zero.d.ts +6 -0
- package/dist/inject-zero.d.ts.map +1 -0
- package/dist/inject-zero.js +16 -0
- package/dist/inject-zero.js.map +1 -0
- package/dist/instance-manager.d.ts +13 -0
- package/dist/instance-manager.d.ts.map +1 -0
- package/dist/instance-manager.js +140 -0
- package/dist/instance-manager.js.map +1 -0
- package/dist/mutator-call-tracker.d.ts +16 -0
- package/dist/mutator-call-tracker.d.ts.map +1 -0
- package/dist/mutator-call-tracker.js +53 -0
- package/dist/mutator-call-tracker.js.map +1 -0
- package/dist/mutator-ref.d.ts +35 -0
- package/dist/mutator-ref.d.ts.map +1 -0
- package/dist/mutator-ref.js +2 -0
- package/dist/mutator-ref.js.map +1 -0
- package/dist/options-diff.d.ts +6 -0
- package/dist/options-diff.d.ts.map +1 -0
- package/dist/options-diff.js +31 -0
- package/dist/options-diff.js.map +1 -0
- package/dist/provide-zero-testing.d.ts +7 -0
- package/dist/provide-zero-testing.d.ts.map +1 -0
- package/dist/provide-zero-testing.js +17 -0
- package/dist/provide-zero-testing.js.map +1 -0
- package/dist/provide-zero.d.ts +5 -0
- package/dist/provide-zero.d.ts.map +1 -0
- package/dist/provide-zero.js +12 -0
- package/dist/provide-zero.js.map +1 -0
- package/dist/query-identity.d.ts +15 -0
- package/dist/query-identity.d.ts.map +1 -0
- package/dist/query-identity.js +20 -0
- package/dist/query-identity.js.map +1 -0
- package/dist/query-ref.d.ts +27 -0
- package/dist/query-ref.d.ts.map +1 -0
- package/dist/query-ref.js +2 -0
- package/dist/query-ref.js.map +1 -0
- package/dist/query-view-controller.d.ts +48 -0
- package/dist/query-view-controller.d.ts.map +1 -0
- package/dist/query-view-controller.js +150 -0
- package/dist/query-view-controller.js.map +1 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +11 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +21 -0
- package/dist/utils.js.map +1 -0
- package/dist/with-bootstrap.d.ts +4 -0
- package/dist/with-bootstrap.d.ts.map +1 -0
- package/dist/with-bootstrap.js +8 -0
- package/dist/with-bootstrap.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { signal, untracked } from '@angular/core';
|
|
2
|
+
import { tryCatch } from './utils.js';
|
|
3
|
+
export const DISABLED = Symbol('ngx-zero/disabled');
|
|
4
|
+
export class QueryViewController {
|
|
5
|
+
#data = signal(undefined);
|
|
6
|
+
#status = signal('disabled');
|
|
7
|
+
#error = signal(undefined);
|
|
8
|
+
#session;
|
|
9
|
+
#applied;
|
|
10
|
+
#destroyed = false;
|
|
11
|
+
#keepPreviousData;
|
|
12
|
+
#ttl;
|
|
13
|
+
data = this.#data.asReadonly();
|
|
14
|
+
status = this.#status.asReadonly();
|
|
15
|
+
error = this.#error.asReadonly();
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.#keepPreviousData = options.keepPreviousData;
|
|
18
|
+
this.#ttl = options.ttl;
|
|
19
|
+
}
|
|
20
|
+
/** Candidate-first: on a throw the prior session stays fully live. */
|
|
21
|
+
reconcile(spec, options = {}) {
|
|
22
|
+
if (this.#destroyed) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (spec === this.#applied && !options.force) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (spec.key === DISABLED) {
|
|
29
|
+
this.#commit(spec, () => this.#write(undefined, 'disabled'));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Never bridge a forced retry or an instance swap (no old-user flash).
|
|
33
|
+
const previous = this.#applied;
|
|
34
|
+
const bridgeAllowed = this.#keepPreviousData &&
|
|
35
|
+
!options.force &&
|
|
36
|
+
previous !== undefined &&
|
|
37
|
+
previous.key !== DISABLED &&
|
|
38
|
+
previous.zero === spec.zero;
|
|
39
|
+
const candidate = this.#buildCandidate(spec);
|
|
40
|
+
this.#commit(spec, () => {
|
|
41
|
+
this.#session = candidate.session;
|
|
42
|
+
candidate.install(bridgeAllowed);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** Applies the new state even if retirement throws; the error surfaces after. */
|
|
46
|
+
#commit(spec, applyNewState) {
|
|
47
|
+
this.#applied = spec;
|
|
48
|
+
const retired = tryCatch(() => this.#teardown());
|
|
49
|
+
applyNewState();
|
|
50
|
+
if (retired.error) {
|
|
51
|
+
throw retired.error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Never touches the public signals; the caller commits the new state. */
|
|
55
|
+
#teardown() {
|
|
56
|
+
const session = this.#session;
|
|
57
|
+
if (!session) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.#session = undefined;
|
|
61
|
+
session.alive = false; // stale-write guard first, then detach
|
|
62
|
+
const unsubscribed = tryCatch(() => session.unsubscribe());
|
|
63
|
+
session.view.destroy();
|
|
64
|
+
if (unsubscribed.error) {
|
|
65
|
+
throw unsubscribed.error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* addListener fires synchronously (zero@1.8.0); that first emission is
|
|
70
|
+
* captured and applied by `install()` at commit time.
|
|
71
|
+
*/
|
|
72
|
+
#buildCandidate(spec) {
|
|
73
|
+
const view = this.#materializeView(spec);
|
|
74
|
+
const session = { alive: true, view, unsubscribe: noop };
|
|
75
|
+
let installed = false;
|
|
76
|
+
let captured;
|
|
77
|
+
const listener = (data, resultType, error) => {
|
|
78
|
+
if (!session.alive) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (!installed) {
|
|
82
|
+
captured = { data, resultType, error };
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.#write(data, resultType, error);
|
|
86
|
+
};
|
|
87
|
+
const subscribed = tryCatch(() => view.addListener(listener));
|
|
88
|
+
if (subscribed.error) {
|
|
89
|
+
session.alive = false;
|
|
90
|
+
view.destroy();
|
|
91
|
+
throw subscribed.error;
|
|
92
|
+
}
|
|
93
|
+
session.unsubscribe = subscribed.result;
|
|
94
|
+
const install = (bridgeAllowed) => {
|
|
95
|
+
installed = true;
|
|
96
|
+
if (captured) {
|
|
97
|
+
const snapshot = captured;
|
|
98
|
+
captured = undefined;
|
|
99
|
+
this.#applyInitialSnapshot(snapshot, bridgeAllowed);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
return { session, install };
|
|
103
|
+
}
|
|
104
|
+
#materializeView(spec) {
|
|
105
|
+
return spec.zero.materialize(spec.query, this.#ttl === undefined ? undefined : { ttl: this.#ttl });
|
|
106
|
+
}
|
|
107
|
+
/** The bridge skips this one overwrite when the new view starts empty at 'unknown'. */
|
|
108
|
+
#applyInitialSnapshot({ data, resultType, error }, bridgeAllowed) {
|
|
109
|
+
if (bridgeAllowed && resultType === 'unknown' && isEmptyResult(data)) {
|
|
110
|
+
this.#status.set('unknown');
|
|
111
|
+
this.#error.set(undefined);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
this.#write(data, resultType, error);
|
|
115
|
+
}
|
|
116
|
+
#write(data, status, error) {
|
|
117
|
+
this.#data.set(data);
|
|
118
|
+
this.#status.set(status);
|
|
119
|
+
this.#error.set(status === 'error' ? error : undefined);
|
|
120
|
+
}
|
|
121
|
+
/** `untracked` so it is callable from templates and effects without deps. */
|
|
122
|
+
retry(currentSpec) {
|
|
123
|
+
if (this.#destroyed) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
untracked(() => {
|
|
127
|
+
const spec = currentSpec();
|
|
128
|
+
if (spec.key === DISABLED) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
this.reconcile(spec, { force: true });
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
updateTTL(ttl) {
|
|
135
|
+
this.#session?.view.updateTTL(ttl);
|
|
136
|
+
}
|
|
137
|
+
destroy() {
|
|
138
|
+
if (this.#destroyed) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.#destroyed = true;
|
|
142
|
+
this.#teardown();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Empty for both shapes: [] (list) or undefined (.one() miss). */
|
|
146
|
+
function isEmptyResult(data) {
|
|
147
|
+
return data === undefined || (Array.isArray(data) && data.length === 0);
|
|
148
|
+
}
|
|
149
|
+
function noop() { }
|
|
150
|
+
//# sourceMappingURL=query-view-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-view-controller.js","sourceRoot":"","sources":["../src/query-view-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAWlD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,CAAC,MAAM,QAAQ,GAAkB,MAAM,CAAC,mBAAmB,CAAC,CAAC;AA+BnE,MAAM,OAAO,mBAAmB;IACrB,KAAK,GAAG,MAAM,CAAU,SAAS,CAAC,CAAC;IACnC,OAAO,GAAG,MAAM,CAAc,UAAU,CAAC,CAAC;IAC1C,MAAM,GAAG,MAAM,CAA2B,SAAS,CAAC,CAAC;IAE9D,QAAQ,CAA0B;IAClC,QAAQ,CAAwB;IAChC,UAAU,GAAG,KAAK,CAAC;IAEV,iBAAiB,CAAU;IAC3B,IAAI,CAAkB;IAEtB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAC/B,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IACnC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAE1C,YAAY,OAGX;QACC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;IAC1B,CAAC;IAED,sEAAsE;IACtE,SAAS,CAAC,IAAe,EAAE,UAA+B,EAAE;QAC1D,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,uEAAuE;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,aAAa,GACjB,IAAI,CAAC,iBAAiB;YACtB,CAAC,OAAO,CAAC,KAAK;YACd,QAAQ,KAAK,SAAS;YACtB,QAAQ,CAAC,GAAG,KAAK,QAAQ;YACzB,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;QAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE;YACtB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC;YAClC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iFAAiF;IACjF,OAAO,CAAC,IAAe,EAAE,aAAyB;QAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACjD,aAAa,EAAE,CAAC;QAChB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,OAAO,CAAC,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,SAAS;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,uCAAuC;QAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;YACvB,MAAM,YAAY,CAAC,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,IAAsB;QAIpC,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,OAAO,GAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAEtE,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,QAA8B,CAAC;QAEnC,MAAM,QAAQ,GAAG,CACf,IAAa,EACb,UAAsB,EACtB,KAAoB,EACd,EAAE;YACR,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,QAAQ,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9D,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,KAAK,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC;QAExC,MAAM,OAAO,GAAG,CAAC,aAAsB,EAAQ,EAAE;YAC/C,SAAS,GAAG,IAAI,CAAC;YACjB,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,QAAQ,GAAG,QAAQ,CAAC;gBAC1B,QAAQ,GAAG,SAAS,CAAC;gBACrB,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,gBAAgB,CAAC,IAAsB;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAC1B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CACzD,CAAC;IACJ,CAAC;IAED,uFAAuF;IACvF,qBAAqB,CACnB,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAY,EACrC,aAAsB;QAEtB,IAAI,aAAa,IAAI,UAAU,KAAK,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,IAAa,EAAE,MAAmB,EAAE,KAAoB;QAC7D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,WAA4B;QAChC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,SAAS,CAAC,GAAG,EAAE;YACb,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,GAAQ;QAChB,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;CACF;AAED,mEAAmE;AACnE,SAAS,aAAa,CAAC,IAAa;IAClC,OAAO,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,IAAI,KAAU,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Zero, ZeroOptions } from '@rocicorp/zero';
|
|
2
|
+
export interface ExternalZeroSource {
|
|
3
|
+
readonly zero: Zero;
|
|
4
|
+
}
|
|
5
|
+
export type ZeroOptionsOrExternalSource = ZeroOptions | ExternalZeroSource;
|
|
6
|
+
export type ZeroInstanceOptions = ZeroOptionsOrExternalSource | (() => ZeroOptionsOrExternalSource);
|
|
7
|
+
export type ZeroSourceFactory = () => ZeroOptionsOrExternalSource;
|
|
8
|
+
export type ZeroReconcileVerdict = 'noop' | 'connect' | 'recreate';
|
|
9
|
+
export interface ZeroInstanceHooks {
|
|
10
|
+
/**
|
|
11
|
+
* Called once per Zero instance created.
|
|
12
|
+
* Not called for external `{ zero }`.
|
|
13
|
+
* Runs in injection context.
|
|
14
|
+
*/
|
|
15
|
+
onInstanceCreated?(zero: Zero): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,2BAA2B,GAAG,WAAW,GAAG,kBAAkB,CAAC;AAE3E,MAAM,MAAM,mBAAmB,GAAG,2BAA2B,GAAG,CAAC,MAAM,2BAA2B,CAAC,CAAC;AAEpG,MAAM,MAAM,iBAAiB,GAAG,MAAM,2BAA2B,CAAC;AAElE,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,iBAAiB,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CACtC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type Result<T> = {
|
|
2
|
+
result: T;
|
|
3
|
+
error?: never;
|
|
4
|
+
} | {
|
|
5
|
+
result?: never;
|
|
6
|
+
error: Error;
|
|
7
|
+
};
|
|
8
|
+
export declare function tryCatch(fn: () => never): Result<never>;
|
|
9
|
+
export declare function tryCatch<T>(fn: () => Promise<T>): Promise<Result<T>>;
|
|
10
|
+
export declare function tryCatch<T>(fn: () => T): Result<T>;
|
|
11
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAExF,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function tryCatch(fn) {
|
|
2
|
+
try {
|
|
3
|
+
const value = fn();
|
|
4
|
+
if (isThenable(value)) {
|
|
5
|
+
return Promise.resolve(value).then(result => ({ result }), thrown => ({ error: toError(thrown) }));
|
|
6
|
+
}
|
|
7
|
+
return { result: value };
|
|
8
|
+
}
|
|
9
|
+
catch (thrown) {
|
|
10
|
+
return { error: toError(thrown) };
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function toError(thrown) {
|
|
14
|
+
return thrown instanceof Error ? thrown : new Error(String(thrown), { cause: thrown });
|
|
15
|
+
}
|
|
16
|
+
function isThenable(value) {
|
|
17
|
+
return (typeof value === 'object' &&
|
|
18
|
+
value !== null &&
|
|
19
|
+
typeof value.then === 'function');
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,QAAQ,CAAI,EAAwB;IAClD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,EAAE,CAAC;QAEnB,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAChC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EACtB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CACvC,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,MAAe;IAC9B,OAAO,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAA4B,CAAC,IAAI,KAAK,UAAU,CACzD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-bootstrap.d.ts","sourceRoot":"","sources":["../src/with-bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAG9D,wBAAgB,aAAa,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,CAIvF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { zeroFeature } from './features.js';
|
|
2
|
+
import { ZERO_INSTANCE_HOOKS } from './instance-manager.js';
|
|
3
|
+
export function withBootstrap(bootstrap) {
|
|
4
|
+
return zeroFeature('bootstrap', [
|
|
5
|
+
{ provide: ZERO_INSTANCE_HOOKS, multi: true, useValue: { onInstanceCreated: bootstrap } },
|
|
6
|
+
]);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=with-bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-bootstrap.js","sourceRoot":"","sources":["../src/with-bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAoB,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,aAAa,CAAC,SAA+B;IAC3D,OAAO,WAAW,CAAC,WAAW,EAAE;QAC9B,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,EAAE;KAC1F,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ngx-zero",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Signals-first, zoneless-ready Angular bindings for Rocicorp Zero",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Ivan Anchev",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/ivan-anchev/ngx-zero.git"
|
|
10
|
+
},
|
|
11
|
+
"keywords": [
|
|
12
|
+
"angular",
|
|
13
|
+
"zero",
|
|
14
|
+
"rocicorp",
|
|
15
|
+
"sync",
|
|
16
|
+
"local-first",
|
|
17
|
+
"signals",
|
|
18
|
+
"zoneless"
|
|
19
|
+
],
|
|
20
|
+
"type": "module",
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"default": "./dist/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./package.json": "./package.json"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"README.md",
|
|
32
|
+
"LICENSE"
|
|
33
|
+
],
|
|
34
|
+
"scripts": {
|
|
35
|
+
"typecheck": "tsc --noEmit && tsc -p tests/types/tsconfig.json",
|
|
36
|
+
"lint": "eslint .",
|
|
37
|
+
"test": "vitest run",
|
|
38
|
+
"test:watch": "vitest",
|
|
39
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
40
|
+
"playground": "pnpm build && pnpm --filter ngx-zero-playground dev:all",
|
|
41
|
+
"playground:db": "pnpm --filter ngx-zero-playground db:setup",
|
|
42
|
+
"playground:build": "pnpm build && pnpm --filter ngx-zero-playground build",
|
|
43
|
+
"check:package": "pnpm build && publint && attw --pack . --profile esm-only",
|
|
44
|
+
"prepare": "husky"
|
|
45
|
+
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"@angular/core": ">=20.0.0 <23.0.0",
|
|
48
|
+
"@rocicorp/zero": ">=1.8.0 <2.0.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@angular/compiler": "^20.3.26",
|
|
52
|
+
"@angular/core": "^20.3.0",
|
|
53
|
+
"@angular/platform-browser": "^20.3.26",
|
|
54
|
+
"@arethetypeswrong/cli": "^0.18.2",
|
|
55
|
+
"@eslint/js": "^10.0.1",
|
|
56
|
+
"@rocicorp/zero": "^1.8.0",
|
|
57
|
+
"eslint": "^10.7.0",
|
|
58
|
+
"husky": "^9.1.7",
|
|
59
|
+
"jsdom": "^29.1.1",
|
|
60
|
+
"lint-staged": "^17.0.8",
|
|
61
|
+
"publint": "^0.3.12",
|
|
62
|
+
"rxjs": "^7.8.2",
|
|
63
|
+
"typescript": "~5.9.2",
|
|
64
|
+
"typescript-eslint": "^8.64.0",
|
|
65
|
+
"vitest": "^3.2.4",
|
|
66
|
+
"zone.js": "^0.15.1"
|
|
67
|
+
},
|
|
68
|
+
"lint-staged": {
|
|
69
|
+
"*.{ts,js}": "eslint --fix"
|
|
70
|
+
},
|
|
71
|
+
"packageManager": "pnpm@11.2.2",
|
|
72
|
+
"publishConfig": {
|
|
73
|
+
"access": "public",
|
|
74
|
+
"provenance": true
|
|
75
|
+
}
|
|
76
|
+
}
|