@gettersethya/mira-client 0.1.0-alpha.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.
Files changed (163) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/client/auth.d.ts +66 -0
  3. package/dist/src/client/auth.d.ts.map +1 -0
  4. package/dist/src/client/auth.js +60 -0
  5. package/dist/src/client/auth.js.map +1 -0
  6. package/dist/src/client/collection.d.ts +239 -0
  7. package/dist/src/client/collection.d.ts.map +1 -0
  8. package/dist/src/client/collection.js +137 -0
  9. package/dist/src/client/collection.js.map +1 -0
  10. package/dist/src/client/errors.d.ts +46 -0
  11. package/dist/src/client/errors.d.ts.map +1 -0
  12. package/dist/src/client/errors.js +40 -0
  13. package/dist/src/client/errors.js.map +1 -0
  14. package/dist/src/client/factory.d.ts +76 -0
  15. package/dist/src/client/factory.d.ts.map +1 -0
  16. package/dist/src/client/factory.js +106 -0
  17. package/dist/src/client/factory.js.map +1 -0
  18. package/dist/src/client/file.d.ts +116 -0
  19. package/dist/src/client/file.d.ts.map +1 -0
  20. package/dist/src/client/file.js +99 -0
  21. package/dist/src/client/file.js.map +1 -0
  22. package/dist/src/client/handler.d.ts +92 -0
  23. package/dist/src/client/handler.d.ts.map +1 -0
  24. package/dist/src/client/handler.js +62 -0
  25. package/dist/src/client/handler.js.map +1 -0
  26. package/dist/src/client/index.d.ts +11 -0
  27. package/dist/src/client/index.d.ts.map +1 -0
  28. package/dist/src/client/index.js +6 -0
  29. package/dist/src/client/index.js.map +1 -0
  30. package/dist/src/client/types.d.ts +138 -0
  31. package/dist/src/client/types.d.ts.map +1 -0
  32. package/dist/src/client/types.js +2 -0
  33. package/dist/src/client/types.js.map +1 -0
  34. package/dist/src/collection/auth.d.ts +79 -0
  35. package/dist/src/collection/auth.d.ts.map +1 -0
  36. package/dist/src/collection/auth.js +50 -0
  37. package/dist/src/collection/auth.js.map +1 -0
  38. package/dist/src/collection/base.d.ts +64 -0
  39. package/dist/src/collection/base.d.ts.map +1 -0
  40. package/dist/src/collection/base.js +40 -0
  41. package/dist/src/collection/base.js.map +1 -0
  42. package/dist/src/collection/bytes.d.ts +51 -0
  43. package/dist/src/collection/bytes.d.ts.map +1 -0
  44. package/dist/src/collection/bytes.js +51 -0
  45. package/dist/src/collection/bytes.js.map +1 -0
  46. package/dist/src/collection/errors.d.ts +29 -0
  47. package/dist/src/collection/errors.d.ts.map +1 -0
  48. package/dist/src/collection/errors.js +23 -0
  49. package/dist/src/collection/errors.js.map +1 -0
  50. package/dist/src/collection/field.d.ts +300 -0
  51. package/dist/src/collection/field.d.ts.map +1 -0
  52. package/dist/src/collection/field.js +175 -0
  53. package/dist/src/collection/field.js.map +1 -0
  54. package/dist/src/collection/index-builder.d.ts +59 -0
  55. package/dist/src/collection/index-builder.d.ts.map +1 -0
  56. package/dist/src/collection/index-builder.js +43 -0
  57. package/dist/src/collection/index-builder.js.map +1 -0
  58. package/dist/src/collection/index.d.ts +22 -0
  59. package/dist/src/collection/index.d.ts.map +1 -0
  60. package/dist/src/collection/index.js +21 -0
  61. package/dist/src/collection/index.js.map +1 -0
  62. package/dist/src/collection/serialize.d.ts +24 -0
  63. package/dist/src/collection/serialize.d.ts.map +1 -0
  64. package/dist/src/collection/serialize.js +127 -0
  65. package/dist/src/collection/serialize.js.map +1 -0
  66. package/dist/src/collection/types.d.ts +119 -0
  67. package/dist/src/collection/types.d.ts.map +1 -0
  68. package/dist/src/collection/types.js +2 -0
  69. package/dist/src/collection/types.js.map +1 -0
  70. package/dist/src/collection/view.d.ts +57 -0
  71. package/dist/src/collection/view.d.ts.map +1 -0
  72. package/dist/src/collection/view.js +49 -0
  73. package/dist/src/collection/view.js.map +1 -0
  74. package/dist/src/filter/builder.d.ts +127 -0
  75. package/dist/src/filter/builder.d.ts.map +1 -0
  76. package/dist/src/filter/builder.js +72 -0
  77. package/dist/src/filter/builder.js.map +1 -0
  78. package/dist/src/filter/compiler.d.ts +48 -0
  79. package/dist/src/filter/compiler.d.ts.map +1 -0
  80. package/dist/src/filter/compiler.js +132 -0
  81. package/dist/src/filter/compiler.js.map +1 -0
  82. package/dist/src/filter/index.d.ts +6 -0
  83. package/dist/src/filter/index.d.ts.map +1 -0
  84. package/dist/src/filter/index.js +4 -0
  85. package/dist/src/filter/index.js.map +1 -0
  86. package/dist/src/filter/types.d.ts +96 -0
  87. package/dist/src/filter/types.d.ts.map +1 -0
  88. package/dist/src/filter/types.js +44 -0
  89. package/dist/src/filter/types.js.map +1 -0
  90. package/dist/src/index.d.ts +3 -0
  91. package/dist/src/index.d.ts.map +1 -0
  92. package/dist/src/index.js +3 -0
  93. package/dist/src/index.js.map +1 -0
  94. package/dist/src/rule/builder.d.ts +97 -0
  95. package/dist/src/rule/builder.d.ts.map +1 -0
  96. package/dist/src/rule/builder.js +126 -0
  97. package/dist/src/rule/builder.js.map +1 -0
  98. package/dist/src/rule/index.d.ts +3 -0
  99. package/dist/src/rule/index.d.ts.map +1 -0
  100. package/dist/src/rule/index.js +3 -0
  101. package/dist/src/rule/index.js.map +1 -0
  102. package/dist/src/rule/types.d.ts +129 -0
  103. package/dist/src/rule/types.d.ts.map +1 -0
  104. package/dist/src/rule/types.js +2 -0
  105. package/dist/src/rule/types.js.map +1 -0
  106. package/dist/tests/client/auth.test.d.ts +2 -0
  107. package/dist/tests/client/auth.test.d.ts.map +1 -0
  108. package/dist/tests/client/auth.test.js +67 -0
  109. package/dist/tests/client/auth.test.js.map +1 -0
  110. package/dist/tests/client/collection.test.d.ts +2 -0
  111. package/dist/tests/client/collection.test.d.ts.map +1 -0
  112. package/dist/tests/client/collection.test.js +543 -0
  113. package/dist/tests/client/collection.test.js.map +1 -0
  114. package/dist/tests/client/file.test.d.ts +2 -0
  115. package/dist/tests/client/file.test.d.ts.map +1 -0
  116. package/dist/tests/client/file.test.js +21 -0
  117. package/dist/tests/client/file.test.js.map +1 -0
  118. package/dist/tests/client/handler.test.d.ts +2 -0
  119. package/dist/tests/client/handler.test.d.ts.map +1 -0
  120. package/dist/tests/client/handler.test.js +24 -0
  121. package/dist/tests/client/handler.test.js.map +1 -0
  122. package/dist/tests/client/types.test.d.ts +2 -0
  123. package/dist/tests/client/types.test.d.ts.map +1 -0
  124. package/dist/tests/client/types.test.js +168 -0
  125. package/dist/tests/client/types.test.js.map +1 -0
  126. package/dist/tests/collection/auth.test.d.ts +2 -0
  127. package/dist/tests/collection/auth.test.d.ts.map +1 -0
  128. package/dist/tests/collection/auth.test.js +44 -0
  129. package/dist/tests/collection/auth.test.js.map +1 -0
  130. package/dist/tests/collection/base.test.d.ts +2 -0
  131. package/dist/tests/collection/base.test.d.ts.map +1 -0
  132. package/dist/tests/collection/base.test.js +70 -0
  133. package/dist/tests/collection/base.test.js.map +1 -0
  134. package/dist/tests/collection/bytes.test.d.ts +2 -0
  135. package/dist/tests/collection/bytes.test.d.ts.map +1 -0
  136. package/dist/tests/collection/bytes.test.js +9 -0
  137. package/dist/tests/collection/bytes.test.js.map +1 -0
  138. package/dist/tests/collection/field.test.d.ts +2 -0
  139. package/dist/tests/collection/field.test.d.ts.map +1 -0
  140. package/dist/tests/collection/field.test.js +140 -0
  141. package/dist/tests/collection/field.test.js.map +1 -0
  142. package/dist/tests/collection/index-type.test.d.ts +2 -0
  143. package/dist/tests/collection/index-type.test.d.ts.map +1 -0
  144. package/dist/tests/collection/index-type.test.js +28 -0
  145. package/dist/tests/collection/index-type.test.js.map +1 -0
  146. package/dist/tests/collection/serialize.test.d.ts +2 -0
  147. package/dist/tests/collection/serialize.test.d.ts.map +1 -0
  148. package/dist/tests/collection/serialize.test.js +165 -0
  149. package/dist/tests/collection/serialize.test.js.map +1 -0
  150. package/dist/tests/collection/view.test.d.ts +2 -0
  151. package/dist/tests/collection/view.test.d.ts.map +1 -0
  152. package/dist/tests/collection/view.test.js +66 -0
  153. package/dist/tests/collection/view.test.js.map +1 -0
  154. package/dist/tests/filter/compiler.test.d.ts +2 -0
  155. package/dist/tests/filter/compiler.test.d.ts.map +1 -0
  156. package/dist/tests/filter/compiler.test.js +156 -0
  157. package/dist/tests/filter/compiler.test.js.map +1 -0
  158. package/dist/tests/rule/builder.test.d.ts +2 -0
  159. package/dist/tests/rule/builder.test.d.ts.map +1 -0
  160. package/dist/tests/rule/builder.test.js +290 -0
  161. package/dist/tests/rule/builder.test.js.map +1 -0
  162. package/dist/tsconfig.tsbuildinfo +1 -0
  163. package/package.json +39 -0
@@ -0,0 +1,129 @@
1
+ /**
2
+ * A value node in a rule expression — can be a field reference, literal, auth context, subquery, date operation, or request value.
3
+ *
4
+ * - `field` — a record field (e.g., `Rule.field("ownerId")`)
5
+ * - `literal` — a static value (e.g., `Rule.literal(42)`)
6
+ * - `auth` — a field from the authenticated user record (e.g., `Rule.auth(Users, "role")`)
7
+ * - `authId` — the ID of the authenticated user (e.g., `Rule.authId(Users)`)
8
+ * - `subquery` — a subquery into another collection (e.g., `Rule.subquery(Members, "teamId")`)
9
+ * - `request` — a value from the incoming request (header, query, body)
10
+ * - `now` — current timestamp (e.g., `Rule.now()`)
11
+ * - `dateAdd` — date arithmetic (e.g., `Rule.dateAdd(Rule.now(), 7, "day")`)
12
+ * - `dateDiff` — difference between two dates (e.g., `Rule.dateDiff(Rule.field("created"), Rule.now(), "day")`)
13
+ */
14
+ export type OperandNode<K extends string = string, V = unknown> = {
15
+ kind: "field";
16
+ collection?: string;
17
+ field: K;
18
+ } | {
19
+ kind: "literal";
20
+ value: V;
21
+ } | {
22
+ kind: "auth";
23
+ collection: string;
24
+ field: string;
25
+ } | {
26
+ kind: "authId";
27
+ collection: string;
28
+ } | {
29
+ kind: "subquery";
30
+ collection: string;
31
+ field: string;
32
+ where: ExprNode<any>;
33
+ } | {
34
+ kind: "request";
35
+ source: "header" | "query" | "body";
36
+ key: string;
37
+ } | {
38
+ kind: "now";
39
+ } | {
40
+ kind: "dateAdd";
41
+ operand: OperandNode<any>;
42
+ amount: number;
43
+ unit: "day" | "hour" | "minute";
44
+ } | {
45
+ kind: "dateDiff";
46
+ left: OperandNode<any>;
47
+ right: OperandNode<any>;
48
+ unit: "day" | "hour" | "minute";
49
+ };
50
+ /**
51
+ * A boolean expression node in a rule — the result of comparing operands or combining sub-expressions.
52
+ *
53
+ * - `eq` / `neq` / `gt` / `gte` / `lt` / `lte` — comparison operators
54
+ * - `in` — membership test (literal array or subquery)
55
+ * - `and` / `or` / `not` — boolean combinators
56
+ * - `startsWith` / `contains` — string pattern matching
57
+ * - `public` — always-true marker
58
+ */
59
+ export type ExprNode<K extends string = string> = {
60
+ op: "eq";
61
+ left: OperandNode<K>;
62
+ right: OperandNode<any>;
63
+ } | {
64
+ op: "neq";
65
+ left: OperandNode<K>;
66
+ right: OperandNode<any>;
67
+ } | {
68
+ op: "gt";
69
+ left: OperandNode<K>;
70
+ right: OperandNode<any>;
71
+ } | {
72
+ op: "gte";
73
+ left: OperandNode<K>;
74
+ right: OperandNode<any>;
75
+ } | {
76
+ op: "lt";
77
+ left: OperandNode<K>;
78
+ right: OperandNode<any>;
79
+ } | {
80
+ op: "lte";
81
+ left: OperandNode<K>;
82
+ right: OperandNode<any>;
83
+ } | {
84
+ op: "in";
85
+ left: OperandNode<K>;
86
+ right: OperandNode<any>;
87
+ } | {
88
+ op: "and";
89
+ left: ExprNode<K>;
90
+ right: ExprNode<K>;
91
+ } | {
92
+ op: "or";
93
+ left: ExprNode<K>;
94
+ right: ExprNode<K>;
95
+ } | {
96
+ op: "not";
97
+ expr: ExprNode<K>;
98
+ } | {
99
+ op: "startsWith";
100
+ left: OperandNode<K>;
101
+ right: OperandNode<any>;
102
+ } | {
103
+ op: "contains";
104
+ left: OperandNode<K>;
105
+ right: OperandNode<any>;
106
+ } | {
107
+ op: "public";
108
+ };
109
+ /**
110
+ * A map of access rules keyed by action.
111
+ * Used in `CollectionSchema["x-rules"]`. Actions without a rule deny all access by default.
112
+ *
113
+ * @example
114
+ * {
115
+ * list: Rule.public(), // anyone can list
116
+ * view: Rule.field("ownerId").eq(Rule.authId(Users)), // owner only
117
+ * create: Rule.field("ownerId").eq(Rule.authId(Users)),
118
+ * update: Rule.field("ownerId").eq(Rule.authId(Users)),
119
+ * delete: Rule.field("ownerId").eq(Rule.authId(Users))
120
+ * }
121
+ */
122
+ export type RuleMap<K extends string = string> = {
123
+ list?: ExprNode<K>;
124
+ view?: ExprNode<K>;
125
+ create?: ExprNode<K>;
126
+ update?: ExprNode<K>;
127
+ delete?: ExprNode<K>;
128
+ };
129
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/rule/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/rule/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.test.d.ts","sourceRoot":"","sources":["../../../tests/client/auth.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { Effect, MutableRef } from "effect";
3
+ import { makeBrowserAuth, makeServerAuth } from "../../src/client/auth.js";
4
+ import { makeClientHandler } from "../../src/client/handler.js";
5
+ describe("BrowserAuth", () => {
6
+ it("isLoggedIn() false initially", () => {
7
+ const loggedInRef = MutableRef.make(false);
8
+ const execute = () => Effect.succeed(undefined);
9
+ const auth = makeBrowserAuth(execute, makeClientHandler, loggedInRef);
10
+ expect(auth.isLoggedIn()).toBe(false);
11
+ });
12
+ it("isLoggedIn() true after setting ref", () => {
13
+ const loggedInRef = MutableRef.make(true);
14
+ const execute = () => Effect.succeed(undefined);
15
+ const auth = makeBrowserAuth(execute, makeClientHandler, loggedInRef);
16
+ expect(auth.isLoggedIn()).toBe(true);
17
+ });
18
+ });
19
+ describe("ServerAuth", () => {
20
+ it("token is null initially", () => {
21
+ const authTokenRef = MutableRef.make(null);
22
+ const fileTokenCacheRef = MutableRef.make(new Map());
23
+ const auth = makeServerAuth(authTokenRef, fileTokenCacheRef);
24
+ expect(auth.token).toBeNull();
25
+ });
26
+ it("setToken stores the token, token reads it back", () => {
27
+ const authTokenRef = MutableRef.make(null);
28
+ const fileTokenCacheRef = MutableRef.make(new Map());
29
+ const auth = makeServerAuth(authTokenRef, fileTokenCacheRef);
30
+ auth.setToken("my-jwt-token");
31
+ expect(auth.token).toBe("my-jwt-token");
32
+ });
33
+ it("clear() sets token to null, clears file token cache", () => {
34
+ const authTokenRef = MutableRef.make(null);
35
+ const fileTokenCacheRef = MutableRef.make(new Map([["users", { token: "t", expiresAt: 123 }]]));
36
+ const auth = makeServerAuth(authTokenRef, fileTokenCacheRef);
37
+ auth.setToken("my-jwt-token");
38
+ auth.clear();
39
+ expect(auth.token).toBeNull();
40
+ expect(MutableRef.get(fileTokenCacheRef).size).toBe(0);
41
+ });
42
+ it("isValid() returns false for null token", () => {
43
+ const authTokenRef = MutableRef.make(null);
44
+ const fileTokenCacheRef = MutableRef.make(new Map());
45
+ const auth = makeServerAuth(authTokenRef, fileTokenCacheRef);
46
+ expect(auth.isValid()).toBe(false);
47
+ });
48
+ it("isValid() returns true for valid JWT", () => {
49
+ const futureExp = Math.floor(Date.now() / 1000) + 3600;
50
+ const payload = JSON.stringify({ exp: futureExp });
51
+ const fakeJwt = `header.${Buffer.from(payload).toString("base64")}.sig`;
52
+ const authTokenRef = MutableRef.make(fakeJwt);
53
+ const fileTokenCacheRef = MutableRef.make(new Map());
54
+ const auth = makeServerAuth(authTokenRef, fileTokenCacheRef);
55
+ expect(auth.isValid()).toBe(true);
56
+ });
57
+ it("isValid() returns false for expired JWT", () => {
58
+ const pastExp = Math.floor(Date.now() / 1000) - 3600;
59
+ const payload = JSON.stringify({ exp: pastExp });
60
+ const fakeJwt = `header.${Buffer.from(payload).toString("base64")}.sig`;
61
+ const authTokenRef = MutableRef.make(fakeJwt);
62
+ const fileTokenCacheRef = MutableRef.make(new Map());
63
+ const auth = makeServerAuth(authTokenRef, fileTokenCacheRef);
64
+ expect(auth.isValid()).toBe(false);
65
+ });
66
+ });
67
+ //# sourceMappingURL=auth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../../tests/client/auth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=collection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.test.d.ts","sourceRoot":"","sources":["../../../tests/client/collection.test.ts"],"names":[],"mappings":""}