@kindgi/platform 0.0.0-bootstrap.0 → 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 (74) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +41 -1
  3. package/dist/in-memory/index.d.ts +9 -0
  4. package/dist/in-memory/index.d.ts.map +1 -0
  5. package/dist/in-memory/index.js +11 -0
  6. package/dist/in-memory/index.js.map +1 -0
  7. package/dist/in-memory/org-binding.d.ts +6 -0
  8. package/dist/in-memory/org-binding.d.ts.map +1 -0
  9. package/dist/in-memory/org-binding.js +81 -0
  10. package/dist/in-memory/org-binding.js.map +1 -0
  11. package/dist/in-memory/project-binding.d.ts +13 -0
  12. package/dist/in-memory/project-binding.d.ts.map +1 -0
  13. package/dist/in-memory/project-binding.js +286 -0
  14. package/dist/in-memory/project-binding.js.map +1 -0
  15. package/dist/in-memory/team-binding.d.ts +12 -0
  16. package/dist/in-memory/team-binding.d.ts.map +1 -0
  17. package/dist/in-memory/team-binding.js +170 -0
  18. package/dist/in-memory/team-binding.js.map +1 -0
  19. package/dist/in-memory/util.d.ts +27 -0
  20. package/dist/in-memory/util.d.ts.map +1 -0
  21. package/dist/in-memory/util.js +49 -0
  22. package/dist/in-memory/util.js.map +1 -0
  23. package/dist/index.d.ts +17 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +5 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/org-binding.d.ts +70 -0
  28. package/dist/org-binding.d.ts.map +1 -0
  29. package/dist/org-binding.js +4 -0
  30. package/dist/org-binding.js.map +1 -0
  31. package/dist/project-binding.d.ts +115 -0
  32. package/dist/project-binding.d.ts.map +1 -0
  33. package/dist/project-binding.js +4 -0
  34. package/dist/project-binding.js.map +1 -0
  35. package/dist/scope.d.ts +45 -0
  36. package/dist/scope.d.ts.map +1 -0
  37. package/dist/scope.js +13 -0
  38. package/dist/scope.js.map +1 -0
  39. package/dist/team-binding.d.ts +108 -0
  40. package/dist/team-binding.d.ts.map +1 -0
  41. package/dist/team-binding.js +4 -0
  42. package/dist/team-binding.js.map +1 -0
  43. package/dist/team-project-grant-binding.d.ts +49 -0
  44. package/dist/team-project-grant-binding.d.ts.map +1 -0
  45. package/dist/team-project-grant-binding.js +4 -0
  46. package/dist/team-project-grant-binding.js.map +1 -0
  47. package/dist/tenant-hierarchy-binding.d.ts +104 -0
  48. package/dist/tenant-hierarchy-binding.d.ts.map +1 -0
  49. package/dist/tenant-hierarchy-binding.js +4 -0
  50. package/dist/tenant-hierarchy-binding.js.map +1 -0
  51. package/dist/types.d.ts +129 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +6 -0
  54. package/dist/types.js.map +1 -0
  55. package/package.json +49 -4
  56. package/src/in-memory/index.ts +12 -0
  57. package/src/in-memory/org-binding.ts +101 -0
  58. package/src/in-memory/project-binding.ts +327 -0
  59. package/src/in-memory/team-binding.ts +205 -0
  60. package/src/in-memory/util.ts +72 -0
  61. package/src/index.ts +56 -0
  62. package/src/org-binding.ts +76 -0
  63. package/src/project-binding.ts +134 -0
  64. package/src/scope.ts +51 -0
  65. package/src/team-binding.ts +116 -0
  66. package/src/team-project-grant-binding.ts +65 -0
  67. package/src/tenant-hierarchy-binding.ts +107 -0
  68. package/src/types.ts +177 -0
  69. package/tests/in-memory-org-binding.test.ts +12 -0
  70. package/tests/in-memory-project-binding.test.ts +12 -0
  71. package/tests/in-memory-team-binding.test.ts +12 -0
  72. package/tests/org-binding.conformance.ts +165 -0
  73. package/tests/project-binding.conformance.ts +231 -0
  74. package/tests/team-binding.conformance.ts +175 -0
@@ -0,0 +1,286 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ import { nowTimestamp, paginate } from './util.js';
4
+ let projectIdCounter = 0;
5
+ function nextProjectId() {
6
+ projectIdCounter += 1;
7
+ return `project-${projectIdCounter}`;
8
+ }
9
+ function projMembershipKey(projectId, userId) {
10
+ return `${projectId}::${userId}`;
11
+ }
12
+ function grantKey(teamId, projectId) {
13
+ return `${teamId}::${projectId}`;
14
+ }
15
+ /**
16
+ * Combined factory — returns the three project-related bindings that
17
+ * share underlying storage. Any of them can be plucked out and passed
18
+ * individually to consumers that need just one.
19
+ */
20
+ export function makeInMemoryProjectBinding() {
21
+ const projectRows = new Map();
22
+ const membershipRows = new Map();
23
+ const grantRows = new Map();
24
+ // Track grant insertion order for deterministic `list` ordering.
25
+ const grantOrder = [];
26
+ function findProjectInTenant(tenantId, projectId) {
27
+ const p = projectRows.get(projectId);
28
+ if (p === undefined || p.tenantId !== tenantId)
29
+ return undefined;
30
+ return p;
31
+ }
32
+ function tenantAlreadyHasDefault(tenantId) {
33
+ for (const row of projectRows.values()) {
34
+ if (row.tenantId === tenantId && row.isDefault)
35
+ return true;
36
+ }
37
+ return false;
38
+ }
39
+ const projects = {
40
+ async create(tenantId, spec) {
41
+ const isDefault = spec.isDefault === true;
42
+ if (isDefault && tenantAlreadyHasDefault(tenantId)) {
43
+ throw new Error(`project-default-already-exists: tenant ${tenantId} already has an isDefault=true project`);
44
+ }
45
+ const id = nextProjectId();
46
+ const now = nowTimestamp();
47
+ const row = {
48
+ id,
49
+ tenantId,
50
+ name: spec.name,
51
+ slug: spec.slug,
52
+ isDefault,
53
+ createdAt: now,
54
+ updatedAt: now,
55
+ ...(spec.orgId !== undefined ? { orgId: spec.orgId } : {}),
56
+ ...(spec.description !== undefined ? { description: spec.description } : {}),
57
+ };
58
+ projectRows.set(id, row);
59
+ return id;
60
+ },
61
+ async get(tenantId, projectId) {
62
+ return findProjectInTenant(tenantId, projectId);
63
+ },
64
+ async list(tenantId, filter) {
65
+ const all = [];
66
+ for (const row of projectRows.values()) {
67
+ if (row.tenantId !== tenantId)
68
+ continue;
69
+ if (filter.orgId !== undefined && row.orgId !== filter.orgId)
70
+ continue;
71
+ if (filter.nameContains !== undefined && !row.name.includes(filter.nameContains)) {
72
+ continue;
73
+ }
74
+ all.push(row);
75
+ }
76
+ all.sort((a, b) => {
77
+ if (a.createdAt !== b.createdAt)
78
+ return a.createdAt < b.createdAt ? -1 : 1;
79
+ return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
80
+ });
81
+ return paginate(all, filter.limit, filter.cursor);
82
+ },
83
+ async getDefault(tenantId) {
84
+ for (const row of projectRows.values()) {
85
+ if (row.tenantId === tenantId && row.isDefault)
86
+ return row;
87
+ }
88
+ return undefined;
89
+ },
90
+ async update(tenantId, projectId, patch) {
91
+ const row = findProjectInTenant(tenantId, projectId);
92
+ if (row === undefined) {
93
+ throw new Error(`project-not-found: ${projectId}`);
94
+ }
95
+ let nextOrgId = row.orgId;
96
+ if (patch.orgId !== undefined) {
97
+ nextOrgId = patch.orgId === null ? undefined : patch.orgId;
98
+ }
99
+ const nextDescription = patch.description ?? row.description;
100
+ const next = {
101
+ id: row.id,
102
+ tenantId: row.tenantId,
103
+ name: patch.name ?? row.name,
104
+ slug: patch.slug ?? row.slug,
105
+ isDefault: row.isDefault,
106
+ createdAt: row.createdAt,
107
+ updatedAt: nowTimestamp(),
108
+ ...(nextOrgId !== undefined ? { orgId: nextOrgId } : {}),
109
+ ...(nextDescription !== undefined ? { description: nextDescription } : {}),
110
+ };
111
+ projectRows.set(projectId, next);
112
+ },
113
+ async delete(tenantId, projectId) {
114
+ const row = findProjectInTenant(tenantId, projectId);
115
+ if (row === undefined)
116
+ return;
117
+ projectRows.delete(projectId);
118
+ // Cascade — direct memberships + team grants drop with the project.
119
+ for (const key of membershipRows.keys()) {
120
+ if (key.startsWith(`${projectId}::`)) {
121
+ membershipRows.delete(key);
122
+ }
123
+ }
124
+ for (let i = grantOrder.length - 1; i >= 0; i -= 1) {
125
+ const key = grantOrder[i];
126
+ if (key === undefined)
127
+ continue;
128
+ if (key.endsWith(`::${projectId}`)) {
129
+ grantRows.delete(key);
130
+ grantOrder.splice(i, 1);
131
+ }
132
+ }
133
+ },
134
+ };
135
+ const memberships = {
136
+ async add(tenantId, input) {
137
+ const proj = findProjectInTenant(tenantId, input.projectId);
138
+ if (proj === undefined) {
139
+ throw new Error(`project-not-found: ${input.projectId}`);
140
+ }
141
+ const key = projMembershipKey(input.projectId, input.userId);
142
+ if (membershipRows.has(key))
143
+ return;
144
+ const row = {
145
+ projectId: input.projectId,
146
+ userId: input.userId,
147
+ role: input.role,
148
+ joinedAt: nowTimestamp(),
149
+ };
150
+ membershipRows.set(key, row);
151
+ },
152
+ async remove(tenantId, projectId, userId) {
153
+ const proj = findProjectInTenant(tenantId, projectId);
154
+ if (proj === undefined)
155
+ return;
156
+ membershipRows.delete(projMembershipKey(projectId, userId));
157
+ },
158
+ async list(tenantId, projectId, filter) {
159
+ const proj = findProjectInTenant(tenantId, projectId);
160
+ if (proj === undefined)
161
+ return { items: [] };
162
+ const all = [];
163
+ for (const row of membershipRows.values()) {
164
+ if (row.projectId !== projectId)
165
+ continue;
166
+ all.push(row);
167
+ }
168
+ all.sort((a, b) => (a.joinedAt < b.joinedAt ? -1 : a.joinedAt > b.joinedAt ? 1 : 0));
169
+ return paginate(all, filter.limit, filter.cursor);
170
+ },
171
+ async listForUser(tenantId, userId, filter) {
172
+ const all = [];
173
+ for (const row of membershipRows.values()) {
174
+ if (row.userId !== userId)
175
+ continue;
176
+ const p = projectRows.get(row.projectId);
177
+ if (p === undefined || p.tenantId !== tenantId)
178
+ continue;
179
+ all.push(row);
180
+ }
181
+ all.sort((a, b) => (a.joinedAt < b.joinedAt ? -1 : a.joinedAt > b.joinedAt ? 1 : 0));
182
+ return paginate(all, filter.limit, filter.cursor);
183
+ },
184
+ async updateRole(tenantId, projectId, userId, role) {
185
+ const proj = findProjectInTenant(tenantId, projectId);
186
+ if (proj === undefined) {
187
+ throw new Error(`project-not-found: ${projectId}`);
188
+ }
189
+ const key = projMembershipKey(projectId, userId);
190
+ const row = membershipRows.get(key);
191
+ if (row === undefined) {
192
+ throw new Error(`project-membership-not-found: ${projectId}/${userId}`);
193
+ }
194
+ membershipRows.set(key, { ...row, role });
195
+ },
196
+ };
197
+ const grants = {
198
+ async add(tenantId, input) {
199
+ // Grant validity requires the project to exist in-tenant. Team
200
+ // existence is not checked here: teams live in the separate
201
+ // `makeInMemoryTeamBinding` store.
202
+ const proj = findProjectInTenant(tenantId, input.projectId);
203
+ if (proj === undefined) {
204
+ throw new Error(`project-not-found: ${input.projectId}`);
205
+ }
206
+ const key = grantKey(input.teamId, input.projectId);
207
+ if (grantRows.has(key))
208
+ return;
209
+ const row = {
210
+ teamId: input.teamId,
211
+ projectId: input.projectId,
212
+ role: input.role,
213
+ };
214
+ grantRows.set(key, row);
215
+ grantOrder.push(key);
216
+ },
217
+ async remove(tenantId, teamId, projectId) {
218
+ const proj = findProjectInTenant(tenantId, projectId);
219
+ if (proj === undefined)
220
+ return;
221
+ const key = grantKey(teamId, projectId);
222
+ if (grantRows.delete(key)) {
223
+ const idx = grantOrder.indexOf(key);
224
+ if (idx >= 0)
225
+ grantOrder.splice(idx, 1);
226
+ }
227
+ },
228
+ async list(tenantId, filter) {
229
+ const all = [];
230
+ for (const key of grantOrder) {
231
+ const row = grantRows.get(key);
232
+ if (row === undefined)
233
+ continue;
234
+ const p = projectRows.get(row.projectId);
235
+ if (p === undefined || p.tenantId !== tenantId)
236
+ continue;
237
+ all.push(row);
238
+ }
239
+ return paginate(all, filter.limit, filter.cursor);
240
+ },
241
+ async listForTeam(tenantId, teamId, filter) {
242
+ const all = [];
243
+ for (const key of grantOrder) {
244
+ const row = grantRows.get(key);
245
+ if (row === undefined)
246
+ continue;
247
+ if (row.teamId !== teamId)
248
+ continue;
249
+ const p = projectRows.get(row.projectId);
250
+ if (p === undefined || p.tenantId !== tenantId)
251
+ continue;
252
+ all.push(row);
253
+ }
254
+ return paginate(all, filter.limit, filter.cursor);
255
+ },
256
+ async listForProject(tenantId, projectId, filter) {
257
+ const proj = findProjectInTenant(tenantId, projectId);
258
+ if (proj === undefined)
259
+ return { items: [] };
260
+ const all = [];
261
+ for (const key of grantOrder) {
262
+ const row = grantRows.get(key);
263
+ if (row === undefined)
264
+ continue;
265
+ if (row.projectId !== projectId)
266
+ continue;
267
+ all.push(row);
268
+ }
269
+ return paginate(all, filter.limit, filter.cursor);
270
+ },
271
+ async updateRole(tenantId, teamId, projectId, role) {
272
+ const proj = findProjectInTenant(tenantId, projectId);
273
+ if (proj === undefined) {
274
+ throw new Error(`project-not-found: ${projectId}`);
275
+ }
276
+ const key = grantKey(teamId, projectId);
277
+ const row = grantRows.get(key);
278
+ if (row === undefined) {
279
+ throw new Error(`team-project-grant-not-found: ${teamId}/${projectId}`);
280
+ }
281
+ grantRows.set(key, { ...row, role });
282
+ },
283
+ };
284
+ return { projects, memberships, grants };
285
+ }
286
+ //# sourceMappingURL=project-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-binding.js","sourceRoot":"","sources":["../../src/in-memory/project-binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { TeamBinding, TeamMembershipBinding } from '../team-binding.js';
2
+ /**
3
+ * Combined factory — returns a `TeamBinding` + `TeamMembershipBinding`
4
+ * pair that share underlying storage. The pair is the atomic unit
5
+ * (memberships reference teams; the two must agree on tenant
6
+ * membership at every op).
7
+ */
8
+ export declare function makeInMemoryTeamBinding(): {
9
+ readonly teams: TeamBinding;
10
+ readonly memberships: TeamMembershipBinding;
11
+ };
12
+ //# sourceMappingURL=team-binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-binding.d.ts","sourceRoot":"","sources":["../../src/in-memory/team-binding.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,WAAW,EAGX,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAe5B;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI;IACzC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;CAC7C,CAyJA"}
@@ -0,0 +1,170 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ import { nowTimestamp, paginate } from './util.js';
4
+ let teamIdCounter = 0;
5
+ function nextTeamId() {
6
+ teamIdCounter += 1;
7
+ return `team-${teamIdCounter}`;
8
+ }
9
+ function membershipKey(teamId, userId) {
10
+ return `${teamId}::${userId}`;
11
+ }
12
+ /**
13
+ * Combined factory — returns a `TeamBinding` + `TeamMembershipBinding`
14
+ * pair that share underlying storage. The pair is the atomic unit
15
+ * (memberships reference teams; the two must agree on tenant
16
+ * membership at every op).
17
+ */
18
+ export function makeInMemoryTeamBinding() {
19
+ const teamRows = new Map();
20
+ const membershipRows = new Map();
21
+ function findTeamInTenant(tenantId, teamId) {
22
+ const t = teamRows.get(teamId);
23
+ if (t === undefined || t.tenantId !== tenantId)
24
+ return undefined;
25
+ return t;
26
+ }
27
+ const teams = {
28
+ async create(tenantId, spec) {
29
+ const id = nextTeamId();
30
+ const now = nowTimestamp();
31
+ const row = {
32
+ id,
33
+ tenantId,
34
+ name: spec.name,
35
+ slug: spec.slug,
36
+ createdAt: now,
37
+ updatedAt: now,
38
+ ...(spec.orgId !== undefined ? { orgId: spec.orgId } : {}),
39
+ ...(spec.description !== undefined ? { description: spec.description } : {}),
40
+ };
41
+ teamRows.set(id, row);
42
+ return id;
43
+ },
44
+ async get(tenantId, teamId) {
45
+ return findTeamInTenant(tenantId, teamId);
46
+ },
47
+ async list(tenantId, filter) {
48
+ const all = [];
49
+ for (const row of teamRows.values()) {
50
+ if (row.tenantId !== tenantId)
51
+ continue;
52
+ if (filter.orgId !== undefined && row.orgId !== filter.orgId)
53
+ continue;
54
+ if (filter.nameContains !== undefined && !row.name.includes(filter.nameContains)) {
55
+ continue;
56
+ }
57
+ all.push(row);
58
+ }
59
+ all.sort((a, b) => {
60
+ if (a.createdAt !== b.createdAt)
61
+ return a.createdAt < b.createdAt ? -1 : 1;
62
+ return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
63
+ });
64
+ return paginate(all, filter.limit, filter.cursor);
65
+ },
66
+ async update(tenantId, teamId, patch) {
67
+ const row = findTeamInTenant(tenantId, teamId);
68
+ if (row === undefined) {
69
+ throw new Error(`team-not-found: ${teamId}`);
70
+ }
71
+ // orgId patch tri-state: undefined = untouched; null = clear;
72
+ // OrgId value = set.
73
+ let nextOrgId = row.orgId;
74
+ if (patch.orgId !== undefined) {
75
+ nextOrgId = patch.orgId === null ? undefined : patch.orgId;
76
+ }
77
+ const nextDescription = patch.description ?? row.description;
78
+ const next = {
79
+ id: row.id,
80
+ tenantId: row.tenantId,
81
+ name: patch.name ?? row.name,
82
+ slug: patch.slug ?? row.slug,
83
+ createdAt: row.createdAt,
84
+ updatedAt: nowTimestamp(),
85
+ ...(nextOrgId !== undefined ? { orgId: nextOrgId } : {}),
86
+ ...(nextDescription !== undefined ? { description: nextDescription } : {}),
87
+ };
88
+ teamRows.set(teamId, next);
89
+ },
90
+ async delete(tenantId, teamId) {
91
+ const row = findTeamInTenant(tenantId, teamId);
92
+ if (row === undefined)
93
+ return;
94
+ teamRows.delete(teamId);
95
+ // Cascade — every membership row for this team drops with it.
96
+ for (const key of membershipRows.keys()) {
97
+ if (key.startsWith(`${teamId}::`)) {
98
+ membershipRows.delete(key);
99
+ }
100
+ }
101
+ },
102
+ };
103
+ const memberships = {
104
+ async add(tenantId, input) {
105
+ const team = findTeamInTenant(tenantId, input.teamId);
106
+ if (team === undefined) {
107
+ throw new Error(`team-not-found: ${input.teamId}`);
108
+ }
109
+ const key = membershipKey(input.teamId, input.userId);
110
+ if (membershipRows.has(key)) {
111
+ // Idempotent — role mutation goes through updateRole.
112
+ return;
113
+ }
114
+ const row = {
115
+ teamId: input.teamId,
116
+ userId: input.userId,
117
+ role: input.role,
118
+ joinedAt: nowTimestamp(),
119
+ };
120
+ membershipRows.set(key, row);
121
+ },
122
+ async remove(tenantId, teamId, userId) {
123
+ const team = findTeamInTenant(tenantId, teamId);
124
+ if (team === undefined)
125
+ return;
126
+ membershipRows.delete(membershipKey(teamId, userId));
127
+ },
128
+ async list(tenantId, teamId, filter) {
129
+ const team = findTeamInTenant(tenantId, teamId);
130
+ if (team === undefined)
131
+ return { items: [] };
132
+ const all = [];
133
+ for (const row of membershipRows.values()) {
134
+ if (row.teamId !== teamId)
135
+ continue;
136
+ all.push(row);
137
+ }
138
+ all.sort((a, b) => (a.joinedAt < b.joinedAt ? -1 : a.joinedAt > b.joinedAt ? 1 : 0));
139
+ return paginate(all, filter.limit, filter.cursor);
140
+ },
141
+ async listForUser(tenantId, userId, filter) {
142
+ const all = [];
143
+ for (const row of membershipRows.values()) {
144
+ if (row.userId !== userId)
145
+ continue;
146
+ // Confirm the parent team belongs to the tenant.
147
+ const t = teamRows.get(row.teamId);
148
+ if (t === undefined || t.tenantId !== tenantId)
149
+ continue;
150
+ all.push(row);
151
+ }
152
+ all.sort((a, b) => (a.joinedAt < b.joinedAt ? -1 : a.joinedAt > b.joinedAt ? 1 : 0));
153
+ return paginate(all, filter.limit, filter.cursor);
154
+ },
155
+ async updateRole(tenantId, teamId, userId, role) {
156
+ const team = findTeamInTenant(tenantId, teamId);
157
+ if (team === undefined) {
158
+ throw new Error(`team-not-found: ${teamId}`);
159
+ }
160
+ const key = membershipKey(teamId, userId);
161
+ const row = membershipRows.get(key);
162
+ if (row === undefined) {
163
+ throw new Error(`team-membership-not-found: ${teamId}/${userId}`);
164
+ }
165
+ membershipRows.set(key, { ...row, role });
166
+ },
167
+ };
168
+ return { teams, memberships };
169
+ }
170
+ //# sourceMappingURL=team-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-binding.js","sourceRoot":"","sources":["../../src/in-memory/team-binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Shared helpers for the in-memory reference adapters.
3
+ *
4
+ * - `nowTimestamp()` — monotonic-ish `Timestamp` from `Date.now()`.
5
+ * Uses a per-call increment fallback so two calls in the same
6
+ * millisecond still produce a strictly-increasing pair (matters for
7
+ * `list` ordering by `createdAt`).
8
+ * - `paginate(all, limit, cursor)` — takes a sorted array + optional
9
+ * `limit` + optional opaque `Cursor` and returns a `Page<T>`. Cursor
10
+ * encoding is `String(offset)` — trivial for the in-memory adapter,
11
+ * opaque to callers per the `Cursor` doc-comment in
12
+ * `packages/types/src/filter.ts`.
13
+ */
14
+ import type { Cursor, Page, Timestamp } from '@kindgi/types';
15
+ export declare function nowTimestamp(): Timestamp;
16
+ /**
17
+ * Default page size when a caller passes no `limit` ("small default,
18
+ * high ceiling").
19
+ */
20
+ export declare const DEFAULT_PAGE_LIMIT = 100;
21
+ /**
22
+ * Maximum page size — clamps runaway `limit` values so a caller
23
+ * can't accidentally exfiltrate an entire table.
24
+ */
25
+ export declare const MAX_PAGE_LIMIT = 500;
26
+ export declare function paginate<T>(all: readonly T[], limit: number | undefined, cursor: Cursor | undefined): Page<T>;
27
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/in-memory/util.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAQ7D,wBAAgB,YAAY,IAAI,SAAS,CAcxC;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,wBAAgB,QAAQ,CAAC,CAAC,EACxB,GAAG,EAAE,SAAS,CAAC,EAAE,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,IAAI,CAAC,CAAC,CAAC,CAcT"}
@@ -0,0 +1,49 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ // Monotonic counter so back-to-back calls inside a single millisecond
4
+ // still produce strictly-increasing `Timestamp` values. Kept module-
5
+ // local; not exposed.
6
+ let lastMs = 0;
7
+ let lastCounter = 0;
8
+ export function nowTimestamp() {
9
+ const ms = Date.now();
10
+ if (ms === lastMs) {
11
+ lastCounter += 1;
12
+ }
13
+ else {
14
+ lastMs = ms;
15
+ lastCounter = 0;
16
+ }
17
+ const date = new Date(ms).toISOString();
18
+ // Encode the sub-ms counter as a trailing `#NNNN` suffix so the
19
+ // resulting string still sorts lexicographically in creation order —
20
+ // the in-memory adapter only compares strings.
21
+ const suffix = lastCounter === 0 ? '' : `#${String(lastCounter).padStart(4, '0')}`;
22
+ return `${date}${suffix}`;
23
+ }
24
+ /**
25
+ * Default page size when a caller passes no `limit` ("small default,
26
+ * high ceiling").
27
+ */
28
+ export const DEFAULT_PAGE_LIMIT = 100;
29
+ /**
30
+ * Maximum page size — clamps runaway `limit` values so a caller
31
+ * can't accidentally exfiltrate an entire table.
32
+ */
33
+ export const MAX_PAGE_LIMIT = 500;
34
+ export function paginate(all, limit, cursor) {
35
+ const effectiveLimit = Math.min(Math.max(1, limit ?? DEFAULT_PAGE_LIMIT), MAX_PAGE_LIMIT);
36
+ const offset = cursor === undefined ? 0 : Number.parseInt(cursor, 10);
37
+ const safeOffset = Number.isFinite(offset) && offset >= 0 ? offset : 0;
38
+ const slice = all.slice(safeOffset, safeOffset + effectiveLimit);
39
+ const nextOffset = safeOffset + slice.length;
40
+ const hasMore = nextOffset < all.length;
41
+ if (hasMore) {
42
+ return {
43
+ items: slice,
44
+ nextCursor: String(nextOffset),
45
+ };
46
+ }
47
+ return { items: slice };
48
+ }
49
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/in-memory/util.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAkBjC,sEAAsE;AACtE,qEAAqE;AACrE,sBAAsB;AACtB,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB,MAAM,UAAU,YAAY;IAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;QAClB,WAAW,IAAI,CAAC,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,EAAE,CAAC;QACZ,WAAW,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACxC,gEAAgE;IAChE,qEAAqE;IACrE,+CAA+C;IAC/C,MAAM,MAAM,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACnF,OAAO,GAAG,IAAI,GAAG,MAAM,EAAe,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC,MAAM,UAAU,QAAQ,CACtB,GAAiB,EACjB,KAAyB,EACzB,MAA0B;IAE1B,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,kBAAkB,CAAC,EAAE,cAAc,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7C,MAAM,OAAO,GAAG,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC;IACxC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,UAAU,EAAE,MAAM,CAAC,UAAU,CAAW;SACzC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `@kindgi/platform` — the multi-tenant hierarchy primitives. Ships
3
+ * the type surface + binding interfaces (plus reference in-memory
4
+ * adapters); durable implementations are supplied by the deployment.
5
+ * Authorization vocabulary (object types, actions, tuple builders, PEP
6
+ * helpers) lives in `@kindgi/authz`, not here.
7
+ */
8
+ export type * from './scope.js';
9
+ export type * from './types.js';
10
+ export { scopeKey } from './scope.js';
11
+ export type { OrgBinding, OrgListFilter, } from './org-binding.js';
12
+ export type { TeamBinding, TeamListFilter, TeamMembershipAddInput, TeamMembershipBinding, } from './team-binding.js';
13
+ export type { ProjectBinding, ProjectListFilter, ProjectMembershipAddInput, ProjectMembershipBinding, } from './project-binding.js';
14
+ export type { TeamProjectGrant, TeamProjectGrantAddInput, TeamProjectGrantBinding, } from './team-project-grant-binding.js';
15
+ export { makeInMemoryOrgBinding, makeInMemoryTeamBinding, makeInMemoryProjectBinding, } from './in-memory/index.js';
16
+ export type { AddProjectMemberParams, AddTeamMemberParams, CreateOrgError, CreateOrgParams, CreateProjectError, CreateProjectParams, CreateTeamError, CreateTeamParams, MembershipMutationError, TenantHierarchyBinding, TenantSummary, } from './tenant-hierarchy-binding.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,mBAAmB,YAAY,CAAC;AAChC,mBAAmB,YAAY,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,YAAY,EACV,UAAU,EACV,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,GACd,MAAM,+BAA+B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ export { scopeKey } from './scope.js';
4
+ export { makeInMemoryOrgBinding, makeInMemoryTeamBinding, makeInMemoryProjectBinding, } from './in-memory/index.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAYjC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAwBtC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC"}