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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +194 -0
  3. package/dist/errors.d.ts +2 -0
  4. package/dist/errors.d.ts.map +1 -0
  5. package/dist/errors.js +4 -0
  6. package/dist/errors.js.map +1 -0
  7. package/dist/features.d.ts +9 -0
  8. package/dist/features.d.ts.map +1 -0
  9. package/dist/features.js +14 -0
  10. package/dist/features.js.map +1 -0
  11. package/dist/index.d.ts +12 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +8 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/inject-connection-state.d.ts +6 -0
  16. package/dist/inject-connection-state.d.ts.map +1 -0
  17. package/dist/inject-connection-state.js +41 -0
  18. package/dist/inject-connection-state.js.map +1 -0
  19. package/dist/inject-mutator.d.ts +4 -0
  20. package/dist/inject-mutator.d.ts.map +1 -0
  21. package/dist/inject-mutator.js +63 -0
  22. package/dist/inject-mutator.js.map +1 -0
  23. package/dist/inject-query.d.ts +7 -0
  24. package/dist/inject-query.d.ts.map +1 -0
  25. package/dist/inject-query.js +47 -0
  26. package/dist/inject-query.js.map +1 -0
  27. package/dist/inject-zero.d.ts +6 -0
  28. package/dist/inject-zero.d.ts.map +1 -0
  29. package/dist/inject-zero.js +16 -0
  30. package/dist/inject-zero.js.map +1 -0
  31. package/dist/instance-manager.d.ts +13 -0
  32. package/dist/instance-manager.d.ts.map +1 -0
  33. package/dist/instance-manager.js +140 -0
  34. package/dist/instance-manager.js.map +1 -0
  35. package/dist/mutator-call-tracker.d.ts +16 -0
  36. package/dist/mutator-call-tracker.d.ts.map +1 -0
  37. package/dist/mutator-call-tracker.js +53 -0
  38. package/dist/mutator-call-tracker.js.map +1 -0
  39. package/dist/mutator-ref.d.ts +35 -0
  40. package/dist/mutator-ref.d.ts.map +1 -0
  41. package/dist/mutator-ref.js +2 -0
  42. package/dist/mutator-ref.js.map +1 -0
  43. package/dist/options-diff.d.ts +6 -0
  44. package/dist/options-diff.d.ts.map +1 -0
  45. package/dist/options-diff.js +31 -0
  46. package/dist/options-diff.js.map +1 -0
  47. package/dist/provide-zero-testing.d.ts +7 -0
  48. package/dist/provide-zero-testing.d.ts.map +1 -0
  49. package/dist/provide-zero-testing.js +17 -0
  50. package/dist/provide-zero-testing.js.map +1 -0
  51. package/dist/provide-zero.d.ts +5 -0
  52. package/dist/provide-zero.d.ts.map +1 -0
  53. package/dist/provide-zero.js +12 -0
  54. package/dist/provide-zero.js.map +1 -0
  55. package/dist/query-identity.d.ts +15 -0
  56. package/dist/query-identity.d.ts.map +1 -0
  57. package/dist/query-identity.js +20 -0
  58. package/dist/query-identity.js.map +1 -0
  59. package/dist/query-ref.d.ts +27 -0
  60. package/dist/query-ref.d.ts.map +1 -0
  61. package/dist/query-ref.js +2 -0
  62. package/dist/query-ref.js.map +1 -0
  63. package/dist/query-view-controller.d.ts +48 -0
  64. package/dist/query-view-controller.d.ts.map +1 -0
  65. package/dist/query-view-controller.js +150 -0
  66. package/dist/query-view-controller.js.map +1 -0
  67. package/dist/types.d.ts +17 -0
  68. package/dist/types.d.ts.map +1 -0
  69. package/dist/types.js +2 -0
  70. package/dist/types.js.map +1 -0
  71. package/dist/utils.d.ts +11 -0
  72. package/dist/utils.d.ts.map +1 -0
  73. package/dist/utils.js +21 -0
  74. package/dist/utils.js.map +1 -0
  75. package/dist/with-bootstrap.d.ts +4 -0
  76. package/dist/with-bootstrap.d.ts.map +1 -0
  77. package/dist/with-bootstrap.js +8 -0
  78. package/dist/with-bootstrap.js.map +1 -0
  79. 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":"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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -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,4 @@
1
+ import type { Zero } from '@rocicorp/zero';
2
+ import { type ZeroFeature } from './features.js';
3
+ export declare function withBootstrap(bootstrap: (zero: Zero) => void): ZeroFeature<'bootstrap'>;
4
+ //# sourceMappingURL=with-bootstrap.d.ts.map
@@ -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
+ }