@praxisjs/decorators 0.4.1 → 0.4.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/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @praxisjs/decorators
2
2
 
3
+ ## 0.4.2
4
+
5
+ ### Patch Changes
6
+
7
+ - fe39901: fix(decorators): fix infinite recursion in `@History` decorator `undo()`/`redo()`
8
+
9
+ `originalUndo` and `originalRedo` were closures that captured `h` by reference. By the time they were called, `h.undo` and `h.redo` had already been overwritten by the augmented versions, creating an infinite cycle that resulted in a stack overflow.
10
+
11
+ The fix captures the original methods by value using `.bind(h)` (`const _undo = h.undo.bind(h)`) before overwriting them, breaking the cycle and satisfying the `unbound-method` lint rule.
12
+
13
+ - Updated dependencies [fe39901]
14
+ - @praxisjs/core@0.4.1
15
+
3
16
  ## 0.4.1
4
17
 
5
18
  ### Patch Changes
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=functions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/functions.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,270 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { Bind } from "../functions/bind";
3
+ import { Debounce } from "../functions/debounce";
4
+ import { Log } from "../functions/log";
5
+ import { Once } from "../functions/once";
6
+ import { Retry } from "../functions/retry";
7
+ import { Throttle } from "../functions/throttle";
8
+ // Helpers to simulate TC39 decorator context
9
+ function mockMethodContext(name) {
10
+ const initializers = [];
11
+ const ctx = {
12
+ name,
13
+ kind: "method",
14
+ addInitializer(fn) {
15
+ initializers.push(fn);
16
+ },
17
+ runInitializers(instance) {
18
+ initializers.forEach((fn) => { fn.call(instance); });
19
+ },
20
+ };
21
+ return ctx;
22
+ }
23
+ // ── Once ─────────────────────────────────────────────────────────────────────
24
+ describe("Once", () => {
25
+ it("only calls the original function once", () => {
26
+ const original = vi.fn(() => 42);
27
+ const ctx = mockMethodContext("doSomething");
28
+ const wrapped = Once()(original, ctx);
29
+ const obj = {};
30
+ expect(wrapped.call(obj)).toBe(42);
31
+ expect(wrapped.call(obj)).toBe(42);
32
+ expect(original).toHaveBeenCalledTimes(1);
33
+ });
34
+ it("returns the same result on subsequent calls", () => {
35
+ let counter = 0;
36
+ const original = () => ++counter;
37
+ const ctx = mockMethodContext("inc");
38
+ const wrapped = Once()(original, ctx);
39
+ const obj = {};
40
+ wrapped.call(obj);
41
+ wrapped.call(obj);
42
+ wrapped.call(obj);
43
+ expect(counter).toBe(1);
44
+ });
45
+ it("is per-instance — different instances call independently", () => {
46
+ const original = vi.fn(() => "result");
47
+ const ctx = mockMethodContext("fn");
48
+ const wrapped = Once()(original, ctx);
49
+ const a = {};
50
+ const b = {};
51
+ wrapped.call(a);
52
+ wrapped.call(b);
53
+ expect(original).toHaveBeenCalledTimes(2);
54
+ });
55
+ });
56
+ // ── Retry ─────────────────────────────────────────────────────────────────────
57
+ describe("Retry", () => {
58
+ it("returns result if the first attempt succeeds", async () => {
59
+ const original = vi.fn(async () => "ok");
60
+ const ctx = mockMethodContext("fetch");
61
+ const wrapped = Retry(3)(original, ctx);
62
+ const result = await wrapped.call({});
63
+ expect(result).toBe("ok");
64
+ expect(original).toHaveBeenCalledTimes(1);
65
+ });
66
+ it("retries and succeeds on a later attempt", async () => {
67
+ let attempt = 0;
68
+ const original = vi.fn(async () => {
69
+ attempt++;
70
+ if (attempt < 3)
71
+ throw new Error("fail");
72
+ return "success";
73
+ });
74
+ const ctx = mockMethodContext("call");
75
+ const wrapped = Retry(3)(original, ctx);
76
+ const result = await wrapped.call({});
77
+ expect(result).toBe("success");
78
+ expect(original).toHaveBeenCalledTimes(3);
79
+ });
80
+ it("throws after exhausting all attempts", async () => {
81
+ const original = vi.fn(async () => {
82
+ throw new Error("always fails");
83
+ });
84
+ const ctx = mockMethodContext("bad");
85
+ const wrapped = Retry(3)(original, ctx);
86
+ await expect(wrapped.call({})).rejects.toThrow("always fails");
87
+ expect(original).toHaveBeenCalledTimes(3);
88
+ });
89
+ it("applies delay+backoff between retries", async () => {
90
+ vi.useFakeTimers();
91
+ const original = vi.fn(async () => { throw new Error("fail"); });
92
+ const ctx = mockMethodContext("delayed");
93
+ const wrapped = Retry(3, { delay: 100, backoff: 2 })(original, ctx);
94
+ const p = wrapped.call({});
95
+ const rejection = expect(p).rejects.toThrow("fail");
96
+ await vi.runAllTimersAsync();
97
+ await rejection;
98
+ expect(original).toHaveBeenCalledTimes(3);
99
+ vi.useRealTimers();
100
+ });
101
+ it("calls onRetry callback for each failed attempt (except last)", async () => {
102
+ const onRetry = vi.fn();
103
+ const original = vi.fn(async () => {
104
+ throw new Error("err");
105
+ });
106
+ const ctx = mockMethodContext("op");
107
+ const wrapped = Retry(3, { onRetry })(original, ctx);
108
+ await expect(wrapped.call({})).rejects.toThrow();
109
+ expect(onRetry).toHaveBeenCalledTimes(2); // attempts 1 and 2, not the last
110
+ });
111
+ });
112
+ // ── Log ──────────────────────────────────────────────────────────────────────
113
+ describe("Log", () => {
114
+ it("calls the original function and returns its value", () => {
115
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
116
+ const original = vi.fn(() => 99);
117
+ const ctx = mockMethodContext("myMethod");
118
+ const wrapped = Log({ args: false, result: false })(original, ctx);
119
+ class Dummy {
120
+ }
121
+ const result = wrapped.call(new Dummy());
122
+ expect(result).toBe(99);
123
+ spy.mockRestore();
124
+ });
125
+ it("logs args when args=true", () => {
126
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
127
+ const original = vi.fn((x) => x);
128
+ const ctx = mockMethodContext("greet");
129
+ const wrapped = Log({ args: true, result: false })(original, ctx);
130
+ class Foo {
131
+ }
132
+ wrapped.call(new Foo(), "hello");
133
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining("args:"), ["hello"]);
134
+ spy.mockRestore();
135
+ });
136
+ it("does not log in production when devOnly=true", () => {
137
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
138
+ const original = vi.fn(() => "value");
139
+ const ctx = mockMethodContext("prod");
140
+ const wrapped = Log({ devOnly: true })(original, ctx);
141
+ const prevEnv = process.env.NODE_ENV;
142
+ process.env.NODE_ENV = "production";
143
+ class App {
144
+ }
145
+ wrapped.call(new App());
146
+ expect(spy).not.toHaveBeenCalled();
147
+ process.env.NODE_ENV = prevEnv;
148
+ spy.mockRestore();
149
+ });
150
+ it("handles async functions — logs resolved value", async () => {
151
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
152
+ const original = vi.fn(async () => "async-result");
153
+ const ctx = mockMethodContext("load");
154
+ const wrapped = Log({ args: false, result: true })(original, ctx);
155
+ class Svc {
156
+ }
157
+ await wrapped.call(new Svc());
158
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining("resolved:"), "async-result", expect.any(String));
159
+ spy.mockRestore();
160
+ });
161
+ it("handles async rejection — logs rejected value and re-throws", async () => {
162
+ const spy = vi.spyOn(console, "log").mockImplementation(() => { });
163
+ const original = vi.fn(async () => { throw new Error("async-error"); });
164
+ const ctx = mockMethodContext("failing");
165
+ const wrapped = Log({ args: false, result: true })(original, ctx);
166
+ class Svc {
167
+ }
168
+ await expect(wrapped.call(new Svc())).rejects.toThrow("async-error");
169
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining("rejected:"), expect.any(Error));
170
+ spy.mockRestore();
171
+ });
172
+ });
173
+ // ── Bind ─────────────────────────────────────────────────────────────────────
174
+ describe("Bind", () => {
175
+ it("binds method to the instance so 'this' is preserved", () => {
176
+ class Counter {
177
+ value = 10;
178
+ getValue() {
179
+ return this.value;
180
+ }
181
+ }
182
+ const ctx = mockMethodContext("getValue");
183
+ Bind()(Counter.prototype.getValue, ctx);
184
+ const c = new Counter();
185
+ ctx.runInitializers(c);
186
+ const detached = c.getValue;
187
+ expect(detached()).toBe(10);
188
+ });
189
+ });
190
+ // ── Debounce ─────────────────────────────────────────────────────────────────
191
+ describe("Debounce", () => {
192
+ it("defers execution until after the wait period", () => {
193
+ vi.useFakeTimers();
194
+ const fn = vi.fn();
195
+ const ctx = mockMethodContext("search");
196
+ Debounce(100)(fn, ctx);
197
+ const obj = {};
198
+ ctx.runInitializers(obj);
199
+ const method = obj.search;
200
+ method("a");
201
+ method("b");
202
+ method("c");
203
+ expect(fn).not.toHaveBeenCalled();
204
+ vi.advanceTimersByTime(100);
205
+ expect(fn).toHaveBeenCalledTimes(1);
206
+ expect(fn).toHaveBeenCalledWith("c");
207
+ vi.useRealTimers();
208
+ });
209
+ it("resets the timer on each call", () => {
210
+ vi.useFakeTimers();
211
+ const fn = vi.fn();
212
+ const ctx = mockMethodContext("onInput");
213
+ Debounce(50)(fn, ctx);
214
+ const obj = {};
215
+ ctx.runInitializers(obj);
216
+ const method = obj.onInput;
217
+ method("x");
218
+ vi.advanceTimersByTime(30);
219
+ method("y");
220
+ vi.advanceTimersByTime(30); // 30ms since last call — not enough
221
+ expect(fn).not.toHaveBeenCalled();
222
+ vi.advanceTimersByTime(20); // now 50ms since "y"
223
+ expect(fn).toHaveBeenCalledOnce();
224
+ vi.useRealTimers();
225
+ });
226
+ });
227
+ // ── Throttle ─────────────────────────────────────────────────────────────────
228
+ describe("Throttle", () => {
229
+ it("executes the first call immediately", () => {
230
+ vi.useFakeTimers();
231
+ const fn = vi.fn(() => "first");
232
+ const ctx = mockMethodContext("save");
233
+ Throttle(100)(fn, ctx);
234
+ const obj = {};
235
+ ctx.runInitializers(obj);
236
+ const method = obj.save;
237
+ method();
238
+ expect(fn).toHaveBeenCalledTimes(1);
239
+ vi.useRealTimers();
240
+ });
241
+ it("ignores calls within the throttle window", () => {
242
+ vi.useFakeTimers();
243
+ const fn = vi.fn();
244
+ const ctx = mockMethodContext("scroll");
245
+ Throttle(100)(fn, ctx);
246
+ const obj = {};
247
+ ctx.runInitializers(obj);
248
+ const method = obj.scroll;
249
+ method();
250
+ method();
251
+ method();
252
+ expect(fn).toHaveBeenCalledTimes(1);
253
+ vi.useRealTimers();
254
+ });
255
+ it("allows a new call after the window expires", () => {
256
+ vi.useFakeTimers();
257
+ const fn = vi.fn();
258
+ const ctx = mockMethodContext("resize");
259
+ Throttle(100)(fn, ctx);
260
+ const obj = {};
261
+ ctx.runInitializers(obj);
262
+ const method = obj.resize;
263
+ method();
264
+ vi.advanceTimersByTime(100);
265
+ method();
266
+ expect(fn).toHaveBeenCalledTimes(2);
267
+ vi.useRealTimers();
268
+ });
269
+ });
270
+ //# sourceMappingURL=functions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.test.js","sourceRoot":"","sources":["../../src/__tests__/functions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memo.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memo.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/memo.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { Memo } from "../functions/memo";
3
+ function mockCtx(name) {
4
+ return { name, kind: "method" };
5
+ }
6
+ describe("Memo", () => {
7
+ it("returns the computed value", () => {
8
+ const fn = vi.fn((x) => x * 2);
9
+ const wrapped = Memo()(fn, mockCtx("double"));
10
+ const obj = {};
11
+ expect(wrapped.call(obj, 5)).toBe(10);
12
+ });
13
+ it("caches result for same args — calls original only once", () => {
14
+ const fn = vi.fn((x) => x + 1);
15
+ const wrapped = Memo()(fn, mockCtx("inc"));
16
+ const obj = {};
17
+ wrapped.call(obj, 3);
18
+ wrapped.call(obj, 3);
19
+ wrapped.call(obj, 3);
20
+ expect(fn).toHaveBeenCalledTimes(1);
21
+ });
22
+ it("computes separately for different args", () => {
23
+ const fn = vi.fn((x) => x * 10);
24
+ const wrapped = Memo()(fn, mockCtx("mul"));
25
+ const obj = {};
26
+ expect(wrapped.call(obj, 2)).toBe(20);
27
+ expect(wrapped.call(obj, 3)).toBe(30);
28
+ expect(fn).toHaveBeenCalledTimes(2);
29
+ });
30
+ it("is per-instance — different instances have separate caches", () => {
31
+ const fn = vi.fn(() => Math.random());
32
+ const wrapped = Memo()(fn, mockCtx("rand"));
33
+ const a = {};
34
+ const b = {};
35
+ const v1 = wrapped.call(a);
36
+ const v2 = wrapped.call(b);
37
+ expect(fn).toHaveBeenCalledTimes(2);
38
+ expect(v1).not.toBe(v2); // different random values per instance
39
+ });
40
+ it("serializes no-args calls with __no_args__ key", () => {
41
+ const fn = vi.fn(() => 42);
42
+ const wrapped = Memo()(fn, mockCtx("noop"));
43
+ const obj = {};
44
+ wrapped.call(obj);
45
+ wrapped.call(obj);
46
+ expect(fn).toHaveBeenCalledTimes(1);
47
+ });
48
+ it("serializes object args via JSON.stringify", () => {
49
+ const fn = vi.fn((o) => JSON.stringify(o));
50
+ const wrapped = Memo()(fn, mockCtx("obj"));
51
+ const obj = {};
52
+ wrapped.call(obj, { a: 1 });
53
+ wrapped.call(obj, { a: 1 }); // same key
54
+ expect(fn).toHaveBeenCalledTimes(1);
55
+ });
56
+ it("serializes symbol args via toString()", () => {
57
+ const fn = vi.fn((s) => String(s));
58
+ const wrapped = Memo()(fn, mockCtx("sym"));
59
+ const obj = {};
60
+ const sym = Symbol("test");
61
+ wrapped.call(obj, sym);
62
+ wrapped.call(obj, sym);
63
+ expect(fn).toHaveBeenCalledTimes(1);
64
+ });
65
+ });
66
+ //# sourceMappingURL=memo.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memo.test.js","sourceRoot":"","sources":["../../src/__tests__/memo.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=properties-browser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties-browser.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/properties-browser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,178 @@
1
+ // @vitest-environment jsdom
2
+ import { describe, it, expect, vi, beforeEach } from "vitest";
3
+ import { StatefulComponent } from "@praxisjs/core";
4
+ import { Persisted } from "../properties/persisted";
5
+ import { Slot, initSlots, getSlot } from "../properties/slot";
6
+ beforeEach(() => {
7
+ localStorage.clear();
8
+ });
9
+ // Helper: creates a ClassFieldDecoratorContext mock
10
+ function fieldCtx(name) {
11
+ const initializers = [];
12
+ return {
13
+ ctx: {
14
+ name,
15
+ kind: "field",
16
+ addInitializer(fn) {
17
+ initializers.push(fn);
18
+ },
19
+ },
20
+ run(instance) {
21
+ initializers.forEach((fn) => { fn.call(instance); });
22
+ },
23
+ };
24
+ }
25
+ // Minimal concrete component
26
+ class TestComponent extends StatefulComponent {
27
+ render() { return null; }
28
+ }
29
+ // ── Persisted ─────────────────────────────────────────────────────────────────
30
+ describe("Persisted decorator", () => {
31
+ it("reads back the initial value when nothing is stored", () => {
32
+ const { ctx, run } = fieldCtx("theme");
33
+ Persisted("theme")(undefined, ctx);
34
+ const instance = new TestComponent();
35
+ instance.theme = "light";
36
+ run(instance);
37
+ expect(instance.theme).toBe("light");
38
+ });
39
+ it("persists set value to localStorage", () => {
40
+ const { ctx, run } = fieldCtx("lang");
41
+ Persisted("lang")(undefined, ctx);
42
+ const instance = new TestComponent();
43
+ instance.lang = "en";
44
+ run(instance);
45
+ instance.lang = "pt";
46
+ expect(localStorage.getItem("lang")).toBe('"pt"');
47
+ expect(instance.lang).toBe("pt");
48
+ });
49
+ it("reads existing localStorage value over the initialValue", () => {
50
+ localStorage.setItem("color", '"red"');
51
+ const { ctx, run } = fieldCtx("color");
52
+ Persisted("color")(undefined, ctx);
53
+ const instance = new TestComponent();
54
+ instance.color = "blue";
55
+ run(instance);
56
+ expect(instance.color).toBe("red");
57
+ });
58
+ it("uses the property name as storage key when no explicit key given", () => {
59
+ const { ctx, run } = fieldCtx("count");
60
+ Persisted()(undefined, ctx);
61
+ const instance = new TestComponent();
62
+ instance.count = 0;
63
+ run(instance);
64
+ instance.count = 7;
65
+ expect(localStorage.getItem("count")).toBe("7");
66
+ });
67
+ it("returns separate values per instance", () => {
68
+ const { ctx: ctxA, run: runA } = fieldCtx("val");
69
+ Persisted("valA")(undefined, ctxA);
70
+ const { ctx: ctxB, run: runB } = fieldCtx("val");
71
+ Persisted("valB")(undefined, ctxB);
72
+ const a = new TestComponent();
73
+ a.val = 1;
74
+ runA(a);
75
+ const b = new TestComponent();
76
+ b.val = 2;
77
+ runB(b);
78
+ a.val = 10;
79
+ b.val = 20;
80
+ expect(a.val).toBe(10);
81
+ expect(b.val).toBe(20);
82
+ });
83
+ });
84
+ // ── Slot ──────────────────────────────────────────────────────────────────────
85
+ describe("Slot decorator", () => {
86
+ it("returns an empty array before initSlots is called", () => {
87
+ const { ctx, run } = fieldCtx("default");
88
+ Slot()(undefined, ctx);
89
+ const instance = new TestComponent();
90
+ run(instance);
91
+ expect(instance.default).toEqual([]);
92
+ });
93
+ it("returns default slot children after initSlots", () => {
94
+ const { ctx, run } = fieldCtx("default");
95
+ Slot()(undefined, ctx);
96
+ const instance = new TestComponent();
97
+ run(instance);
98
+ const el = document.createElement("span");
99
+ initSlots(instance, [el]);
100
+ expect(instance.default).toContain(el);
101
+ });
102
+ it("resolves named slot children", () => {
103
+ const { ctx, run } = fieldCtx("header");
104
+ Slot("header")(undefined, ctx);
105
+ const instance = new TestComponent();
106
+ run(instance);
107
+ const el = document.createElement("div");
108
+ el.setAttribute("slot", "header");
109
+ initSlots(instance, [el]);
110
+ const result = instance.header;
111
+ expect(result).toHaveLength(1);
112
+ expect(result[0]).toBe(el);
113
+ });
114
+ it("named slot element has slot attribute removed", () => {
115
+ const { ctx, run } = fieldCtx("footer");
116
+ Slot("footer")(undefined, ctx);
117
+ const instance = new TestComponent();
118
+ run(instance);
119
+ const el = document.createElement("div");
120
+ el.setAttribute("slot", "footer");
121
+ initSlots(instance, [el]);
122
+ expect(el.getAttribute("slot")).toBeNull();
123
+ });
124
+ it("warns when attempting to set a slot directly (dev mode)", () => {
125
+ const originalEnv = process.env.NODE_ENV;
126
+ process.env.NODE_ENV = "development";
127
+ const { ctx, run } = fieldCtx("content");
128
+ Slot("content")(undefined, ctx);
129
+ const instance = new TestComponent();
130
+ run(instance);
131
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
132
+ instance.content = ["something"];
133
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining("[Slot]"));
134
+ warn.mockRestore();
135
+ process.env.NODE_ENV = originalEnv;
136
+ });
137
+ it("uses property name as slot name when no name given and prop is not 'default'", () => {
138
+ const { ctx, run } = fieldCtx("sidebar");
139
+ Slot()(undefined, ctx);
140
+ const instance = new TestComponent();
141
+ run(instance);
142
+ const el = document.createElement("aside");
143
+ el.setAttribute("slot", "sidebar");
144
+ initSlots(instance, [el]);
145
+ const result = instance.sidebar;
146
+ expect(result).toHaveLength(1);
147
+ });
148
+ });
149
+ // ── initSlots / getSlot helpers ───────────────────────────────────────────────
150
+ describe("initSlots / getSlot", () => {
151
+ it("splits children into named and default slots", () => {
152
+ const named = document.createElement("div");
153
+ named.setAttribute("slot", "header");
154
+ const plain = document.createElement("p");
155
+ const instance = {};
156
+ initSlots(instance, [named, plain]);
157
+ expect(getSlot(instance, "header")).toContain(named);
158
+ expect(getSlot(instance, "default")).toContain(plain);
159
+ });
160
+ it("handles null children gracefully", () => {
161
+ const instance = {};
162
+ initSlots(instance, null);
163
+ expect(getSlot(instance, "default")).toEqual([]);
164
+ });
165
+ it("flattens nested arrays", () => {
166
+ const a = document.createElement("span");
167
+ const b = document.createElement("span");
168
+ const instance = {};
169
+ initSlots(instance, [[a, b]]);
170
+ expect(getSlot(instance, "default")).toHaveLength(2);
171
+ });
172
+ it("returns empty array for unknown slot", () => {
173
+ const instance = {};
174
+ initSlots(instance, []);
175
+ expect(getSlot(instance, "nonexistent")).toEqual([]);
176
+ });
177
+ });
178
+ //# sourceMappingURL=properties-browser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties-browser.test.js","sourceRoot":"","sources":["../../src/__tests__/properties-browser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=properties.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/properties.test.ts"],"names":[],"mappings":""}