@classytic/arc 2.25.0 → 2.30.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/README.md +2 -0
- package/dist/{BaseController--M8EMzt0.mjs → BaseController-B5DwufbB.mjs} +15 -11
- package/dist/EventTransport-C6YA8xY9.mjs +103 -0
- package/dist/{HookSystem-C1vB_Gc9.mjs → HookSystem-WkIougo6.mjs} +15 -35
- package/dist/applyPermissionResult-Cf6zUCvb.mjs +257 -0
- package/dist/audit/index.d.mts +2 -2
- package/dist/audit/index.mjs +1 -1
- package/dist/auth/index.d.mts +2 -2
- package/dist/auth/index.mjs +1 -1
- package/dist/{buildHandler-Dtwd8fdz.mjs → buildHandler-BYS3Vkfz.mjs} +32 -6
- package/dist/cleanup/index.d.mts +313 -0
- package/dist/cleanup/index.mjs +1267 -0
- package/dist/cli/commands/describe.d.mts +1 -1
- package/dist/cli/commands/docs.mjs +1 -1
- package/dist/core/index.d.mts +2 -2
- package/dist/core/index.mjs +5 -3
- package/dist/core-poalJLvp.mjs +175 -0
- package/dist/{createActionRouter-B6GvAuAX.mjs → createActionRouter-BxuywVRB.mjs} +2 -2
- package/dist/{createAggregationRouter-wzwFa_dW.mjs → createAggregationRouter-BiY-lGdY.mjs} +7 -20
- package/dist/{preloadResources-DfyngIN9.mjs → createApp-CXrKFciH.mjs} +25 -76
- package/dist/defineAggregation-ufWjUwml.mjs +47 -0
- package/dist/{core-EUNu0u07.mjs → defineResource-CxWqDCAy.mjs} +36 -261
- package/dist/docs/index.d.mts +1 -1
- package/dist/docs/index.mjs +1 -1
- package/dist/{eventPlugin-DrQ_FesK.mjs → eventPlugin-D2NNR4py.mjs} +2 -103
- package/dist/events/index.d.mts +28 -2
- package/dist/events/index.mjs +24 -343
- package/dist/factory/index.d.mts +4 -3
- package/dist/factory/index.mjs +3 -1
- package/dist/{fastify-augmentation-dPNBVeIj.d.mts → fastify-augmentation-0WhPnUH7.d.mts} +3 -2
- package/dist/{applyPermissionResult-Tw4iXtlf.mjs → fields-CQ_7KQWw.mjs} +1 -97
- package/dist/hooks/index.d.mts +1 -1
- package/dist/hooks/index.mjs +1 -1
- package/dist/idempotency/index.mjs +1 -1
- package/dist/index-CCzVR-N3.d.mts +107 -0
- package/dist/{index-BMnbzvtO.d.mts → index-Ch16aAah.d.mts} +201 -21
- package/dist/{index-f4PTrk3B.d.mts → index-Cx7bro4R.d.mts} +4 -4
- package/dist/{index-DPRH0Cme.d.mts → index-Q5gzEIWY.d.mts} +97 -66
- package/dist/index.d.mts +6 -6
- package/dist/index.mjs +8 -6
- package/dist/integrations/index.d.mts +1 -1
- package/dist/integrations/mcp/index.d.mts +6 -6
- package/dist/integrations/mcp/index.mjs +1 -1
- package/dist/integrations/mcp/testing.d.mts +1 -1
- package/dist/integrations/mcp/testing.mjs +1 -1
- package/dist/{mcpPlugin-Cb7olw0j.mjs → mcpPlugin-nRzm5g2s.mjs} +36 -43
- package/dist/middleware/index.d.mts +1 -1
- package/dist/migrations/index.d.mts +0 -3
- package/dist/migrations/index.mjs +0 -3
- package/dist/module-_-M7C5ES.mjs +29 -0
- package/dist/{openapi-DrLtog_B.mjs → openapi-B8Vkbxbn.mjs} +1 -1
- package/dist/permissions/index.d.mts +3 -3
- package/dist/permissions/index.mjs +4 -3
- package/dist/{permissions-BrtiBKGs.mjs → permissions-Bfu_8y1U.mjs} +318 -289
- package/dist/pipeline/index.d.mts +1 -1
- package/dist/{pipeline-BN5G05rd.mjs → pipeline-BJnpkY9i.mjs} +4 -18
- package/dist/plugins/index.d.mts +4 -4
- package/dist/plugins/index.mjs +2 -2
- package/dist/plugins/tracing-entry.mjs +1 -1
- package/dist/{preloadResources-0oe-JSSS.d.mts → preloadResources-DCfa2egz.d.mts} +3 -2
- package/dist/preloadResources-DSY5HGpS.mjs +45 -0
- package/dist/presets/filesUpload.d.mts +2 -2
- package/dist/presets/filesUpload.mjs +1 -1
- package/dist/presets/index.d.mts +14 -2
- package/dist/presets/index.mjs +1 -1
- package/dist/presets/multiTenant.d.mts +1 -1
- package/dist/presets/search.d.mts +2 -2
- package/dist/presets/search.mjs +1 -1
- package/dist/{presets-DwFDVKP0.mjs → presets-CJOEXLuk.mjs} +25 -9
- package/dist/projection-UBDgfMwu.mjs +17 -0
- package/dist/{realtime-Cuw_deA-.mjs → realtime-B9nmIY5V.mjs} +2 -1
- package/dist/{registerRoute-v0Wb6Plt.mjs → registerRoute-JkxIEBJq.mjs} +3 -1
- package/dist/registry/index.d.mts +2 -2
- package/dist/registry/index.mjs +1 -1
- package/dist/{registry-vcOCtPij.mjs → registry-BYXUUg21.mjs} +16 -1
- package/dist/repositoryFilter-Dz8k3S4P.mjs +44 -0
- package/dist/subscribe-helpers-DfzsivM6.mjs +339 -0
- package/dist/testing/cleanupStoreContract.d.mts +10 -0
- package/dist/testing/cleanupStoreContract.mjs +375 -0
- package/dist/testing/index.d.mts +34 -5
- package/dist/testing/index.mjs +316 -211
- package/dist/testing/outboxStoreContract.d.mts +13 -0
- package/dist/testing/outboxStoreContract.mjs +247 -0
- package/dist/types/index.d.mts +3 -3
- package/dist/{types-QFGc3Cjv.d.mts → types-Bmmn-fO0.d.mts} +1 -1
- package/dist/types-C_ZZRcD6.d.mts +450 -0
- package/dist/{types-Dmw-6Qeo.d.mts → types-ChvvVNP8.d.mts} +93 -88
- package/dist/{index-KUoxjIq1.d.mts → types-D_n8L6VY.d.mts} +33 -106
- package/dist/usage/index.d.mts +1 -1
- package/dist/usage/index.mjs +0 -0
- package/dist/utils/index.d.mts +2 -5
- package/package.json +539 -524
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { OutboxOwnershipError } from "@classytic/primitives/outbox";
|
|
2
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
3
|
+
//#region src/testing/outboxStoreContract.ts
|
|
4
|
+
let seq = 0;
|
|
5
|
+
/** A minimal well-formed event. Ids are unique per call. */
|
|
6
|
+
function event(type = "test.event") {
|
|
7
|
+
seq += 1;
|
|
8
|
+
return {
|
|
9
|
+
type,
|
|
10
|
+
payload: { n: seq },
|
|
11
|
+
meta: {
|
|
12
|
+
id: `evt-${Date.now()}-${seq}`,
|
|
13
|
+
occurredAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const idOf = (e) => e.meta.id;
|
|
18
|
+
function runOutboxStoreContract(name, setup) {
|
|
19
|
+
describe(`OutboxStore contract: ${name}`, () => {
|
|
20
|
+
let store;
|
|
21
|
+
let teardown;
|
|
22
|
+
let reset;
|
|
23
|
+
beforeAll(async () => {
|
|
24
|
+
const result = await setup();
|
|
25
|
+
store = result.store;
|
|
26
|
+
teardown = result.teardown;
|
|
27
|
+
reset = result.reset;
|
|
28
|
+
});
|
|
29
|
+
afterAll(async () => {
|
|
30
|
+
if (teardown) await teardown();
|
|
31
|
+
});
|
|
32
|
+
/** Save n events, oldest first. */
|
|
33
|
+
async function seed(n, type) {
|
|
34
|
+
if (reset) await reset();
|
|
35
|
+
const events = [];
|
|
36
|
+
for (let i = 0; i < n; i++) {
|
|
37
|
+
const e = event(type);
|
|
38
|
+
await store.save(e);
|
|
39
|
+
events.push(e);
|
|
40
|
+
}
|
|
41
|
+
return events;
|
|
42
|
+
}
|
|
43
|
+
describe("save — rejects malformed events (invariant 1)", () => {
|
|
44
|
+
it("persists a well-formed event", async () => {
|
|
45
|
+
const [e] = await seed(1);
|
|
46
|
+
expect((await store.getPending(10)).map(idOf)).toContain(idOf(e));
|
|
47
|
+
});
|
|
48
|
+
it("THROWS rather than persisting an event with no `type`", async () => {
|
|
49
|
+
if (reset) await reset();
|
|
50
|
+
await expect(store.save({
|
|
51
|
+
payload: {},
|
|
52
|
+
meta: { id: "no-type" }
|
|
53
|
+
})).rejects.toThrow();
|
|
54
|
+
expect((await store.getPending(10)).length).toBe(0);
|
|
55
|
+
});
|
|
56
|
+
it("THROWS rather than persisting an event with no `meta.id`", async () => {
|
|
57
|
+
if (reset) await reset();
|
|
58
|
+
await expect(store.save({
|
|
59
|
+
type: "x",
|
|
60
|
+
payload: {},
|
|
61
|
+
meta: {}
|
|
62
|
+
})).rejects.toThrow();
|
|
63
|
+
expect((await store.getPending(10)).length).toBe(0);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe("getPending", () => {
|
|
67
|
+
it("returns events FIFO (oldest first)", async () => {
|
|
68
|
+
const saved = await seed(3);
|
|
69
|
+
expect((await store.getPending(10)).slice(0, 3).map(idOf)).toEqual(saved.map(idOf));
|
|
70
|
+
});
|
|
71
|
+
it("honours the limit", async () => {
|
|
72
|
+
await seed(3);
|
|
73
|
+
expect((await store.getPending(2)).length).toBeLessThanOrEqual(2);
|
|
74
|
+
});
|
|
75
|
+
it("returns only well-formed events (invariant 6)", async () => {
|
|
76
|
+
await seed(2);
|
|
77
|
+
for (const e of await store.getPending(10)) {
|
|
78
|
+
expect(typeof e.type).toBe("string");
|
|
79
|
+
expect(e.type.length).toBeGreaterThan(0);
|
|
80
|
+
expect(idOf(e)).toBeTruthy();
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe("claimPending — exclusive lease (invariant 2)", () => {
|
|
85
|
+
it("claims pending events", async ({ skip }) => {
|
|
86
|
+
if (!store.claimPending) return skip();
|
|
87
|
+
await seed(2);
|
|
88
|
+
expect((await store.claimPending({
|
|
89
|
+
consumerId: "c1",
|
|
90
|
+
limit: 10
|
|
91
|
+
})).length).toBe(2);
|
|
92
|
+
});
|
|
93
|
+
it("two concurrent claimers NEVER receive the same event", async ({ skip }) => {
|
|
94
|
+
if (!store.claimPending) return skip();
|
|
95
|
+
await seed(6);
|
|
96
|
+
const [a, b] = await Promise.all([store.claimPending({
|
|
97
|
+
consumerId: "c1",
|
|
98
|
+
limit: 6
|
|
99
|
+
}), store.claimPending({
|
|
100
|
+
consumerId: "c2",
|
|
101
|
+
limit: 6
|
|
102
|
+
})]);
|
|
103
|
+
const idsA = a.map(idOf);
|
|
104
|
+
const idsB = b.map(idOf);
|
|
105
|
+
expect(idsA.filter((id) => idsB.includes(id))).toEqual([]);
|
|
106
|
+
expect(idsA.length + idsB.length).toBeLessThanOrEqual(6);
|
|
107
|
+
});
|
|
108
|
+
it("does not re-claim an event whose lease is still live", async ({ skip }) => {
|
|
109
|
+
if (!store.claimPending) return skip();
|
|
110
|
+
await seed(2);
|
|
111
|
+
await store.claimPending({
|
|
112
|
+
consumerId: "c1",
|
|
113
|
+
limit: 10,
|
|
114
|
+
leaseMs: 6e4
|
|
115
|
+
});
|
|
116
|
+
expect(await store.claimPending({
|
|
117
|
+
consumerId: "c2",
|
|
118
|
+
limit: 10
|
|
119
|
+
})).toEqual([]);
|
|
120
|
+
});
|
|
121
|
+
it("RECLAIMS an event whose lease expired (crashed worker)", async ({ skip }) => {
|
|
122
|
+
if (!store.claimPending) return skip();
|
|
123
|
+
await seed(1);
|
|
124
|
+
await store.claimPending({
|
|
125
|
+
consumerId: "dead",
|
|
126
|
+
limit: 10,
|
|
127
|
+
leaseMs: 0
|
|
128
|
+
});
|
|
129
|
+
expect((await store.claimPending({
|
|
130
|
+
consumerId: "c2",
|
|
131
|
+
limit: 10
|
|
132
|
+
})).length).toBe(1);
|
|
133
|
+
});
|
|
134
|
+
it("claims FIFO", async ({ skip }) => {
|
|
135
|
+
if (!store.claimPending) return skip();
|
|
136
|
+
const saved = await seed(3);
|
|
137
|
+
expect((await store.claimPending({
|
|
138
|
+
consumerId: "c1",
|
|
139
|
+
limit: 2
|
|
140
|
+
})).map(idOf)).toEqual(saved.slice(0, 2).map(idOf));
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe("acknowledge", () => {
|
|
144
|
+
it("removes the event from pending", async () => {
|
|
145
|
+
const [e] = await seed(1);
|
|
146
|
+
await store.acknowledge(idOf(e));
|
|
147
|
+
expect((await store.getPending(10)).map(idOf)).not.toContain(idOf(e));
|
|
148
|
+
});
|
|
149
|
+
it("is a NO-OP for an unknown id — never an ownership error (invariant 4)", async () => {
|
|
150
|
+
if (reset) await reset();
|
|
151
|
+
await expect(store.acknowledge("does-not-exist")).resolves.not.toThrow();
|
|
152
|
+
});
|
|
153
|
+
it("THROWS OutboxOwnershipError when consumerId is not the lease owner (invariant 3)", async ({ skip }) => {
|
|
154
|
+
if (!store.claimPending) return skip();
|
|
155
|
+
await seed(1);
|
|
156
|
+
const [claimed] = await store.claimPending({
|
|
157
|
+
consumerId: "owner",
|
|
158
|
+
limit: 1,
|
|
159
|
+
leaseMs: 6e4
|
|
160
|
+
});
|
|
161
|
+
if (!claimed) return skip();
|
|
162
|
+
await expect(store.acknowledge(idOf(claimed), { consumerId: "impostor" })).rejects.toBeInstanceOf(OutboxOwnershipError);
|
|
163
|
+
});
|
|
164
|
+
it("succeeds for the rightful lease owner", async ({ skip }) => {
|
|
165
|
+
if (!store.claimPending) return skip();
|
|
166
|
+
await seed(1);
|
|
167
|
+
const [claimed] = await store.claimPending({
|
|
168
|
+
consumerId: "owner",
|
|
169
|
+
limit: 1,
|
|
170
|
+
leaseMs: 6e4
|
|
171
|
+
});
|
|
172
|
+
if (!claimed) return skip();
|
|
173
|
+
await expect(store.acknowledge(idOf(claimed), { consumerId: "owner" })).resolves.not.toThrow();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe("fail — deterministic lease + visibility (invariant 5)", () => {
|
|
177
|
+
it("makes the event re-claimable again (lease cleared)", async ({ skip }) => {
|
|
178
|
+
if (!store.fail || !store.claimPending) return skip();
|
|
179
|
+
await seed(1);
|
|
180
|
+
const [claimed] = await store.claimPending({
|
|
181
|
+
consumerId: "c1",
|
|
182
|
+
limit: 1,
|
|
183
|
+
leaseMs: 6e4
|
|
184
|
+
});
|
|
185
|
+
if (!claimed) return skip();
|
|
186
|
+
await store.fail(idOf(claimed), { message: "boom" });
|
|
187
|
+
expect((await store.claimPending({
|
|
188
|
+
consumerId: "c2",
|
|
189
|
+
limit: 10
|
|
190
|
+
})).map(idOf)).toContain(idOf(claimed));
|
|
191
|
+
});
|
|
192
|
+
it("THROWS OutboxOwnershipError on a consumerId mismatch (invariant 3)", async ({ skip }) => {
|
|
193
|
+
if (!store.fail || !store.claimPending) return skip();
|
|
194
|
+
await seed(1);
|
|
195
|
+
const [claimed] = await store.claimPending({
|
|
196
|
+
consumerId: "owner",
|
|
197
|
+
limit: 1,
|
|
198
|
+
leaseMs: 6e4
|
|
199
|
+
});
|
|
200
|
+
if (!claimed) return skip();
|
|
201
|
+
await expect(store.fail(idOf(claimed), { message: "boom" }, { consumerId: "impostor" })).rejects.toBeInstanceOf(OutboxOwnershipError);
|
|
202
|
+
});
|
|
203
|
+
it("honours `retryAt` — the event is NOT immediately re-claimable", async ({ skip }) => {
|
|
204
|
+
if (!store.fail || !store.claimPending) return skip();
|
|
205
|
+
await seed(1);
|
|
206
|
+
const [claimed] = await store.claimPending({
|
|
207
|
+
consumerId: "c1",
|
|
208
|
+
limit: 1,
|
|
209
|
+
leaseMs: 6e4
|
|
210
|
+
});
|
|
211
|
+
if (!claimed) return skip();
|
|
212
|
+
await store.fail(idOf(claimed), { message: "boom" }, { retryAt: new Date(Date.now() + 6e4) });
|
|
213
|
+
expect((await store.claimPending({
|
|
214
|
+
consumerId: "c2",
|
|
215
|
+
limit: 10
|
|
216
|
+
})).map(idOf)).not.toContain(idOf(claimed));
|
|
217
|
+
});
|
|
218
|
+
it("`deadLetter: true` removes it from the pending stream", async ({ skip }) => {
|
|
219
|
+
if (!store.fail) return skip();
|
|
220
|
+
const [e] = await seed(1);
|
|
221
|
+
await store.fail(idOf(e), { message: "fatal" }, { deadLetter: true });
|
|
222
|
+
expect((await store.getPending(10)).map(idOf)).not.toContain(idOf(e));
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
describe("getDeadLettered", () => {
|
|
226
|
+
it("returns dead-lettered events with their failure metadata", async ({ skip }) => {
|
|
227
|
+
if (!store.fail || !store.getDeadLettered) return skip();
|
|
228
|
+
const [e] = await seed(1);
|
|
229
|
+
await store.fail(idOf(e), { message: "fatal" }, { deadLetter: true });
|
|
230
|
+
const row = (await store.getDeadLettered(10)).find((d) => idOf(d.event) === idOf(e));
|
|
231
|
+
expect(row).toBeDefined();
|
|
232
|
+
expect(row?.error).toBeDefined();
|
|
233
|
+
expect(typeof row?.attempts).toBe("number");
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
describe("purge", () => {
|
|
237
|
+
it("NEVER removes pending events — delivered-only scope", async ({ skip }) => {
|
|
238
|
+
if (!store.purge) return skip();
|
|
239
|
+
await seed(2);
|
|
240
|
+
await store.purge(0);
|
|
241
|
+
expect((await store.getPending(10)).length).toBe(2);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
//#endregion
|
|
247
|
+
export { runOutboxStoreContract };
|
package/dist/types/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { $ as OpenApiSchemas, A as RequestIdOptions, At as RouteDefinition, Bt as RouteHandler, C as RequestContext, D as HealthCheck, Dt as ActionEntry, E as GracefulShutdownOptions, Et as ActionDefinition, F as FastifyWithDecorators, Ft as ControllerLike, G as OnTenantDeleteConfig, Gt as AuthenticatorContext, H as CrudController, Ht as AuthHelpers, I as MiddlewareHandler, It as FastifyHandler, J as PresetHook, K as ResolvedTenantPurge, Kt as JwtContext, L as RequestWithExtras, Lt as IController, M as EventsDecorator, Mt as RouteMethod, N as FastifyRequestExtras, Nt as RateLimitConfig, O as HealthOptions, Ot as ActionHandlerFn, P as FastifyWithAuth, Pt as ControllerHandler, Q as MiddlewareConfig, Rt as IControllerResponse, S as QueryParserInterface, T as CrudRouterOptions, Tt as ResourceCacheConfig, U as ResourceConfig, Ut as AuthPluginOptions, W as ResourcePermissions, Wt as Authenticator, X as CrudRouteKey, Y as PresetResult, Z as CrudSchemas, _ as ControllerQueryOptions, a as InferAdapterDoc, at as ResourceExtensions, b as ParsedQuery, c as TypedController, d as PaginationResult, et as RouteSchemaOptions, f as IntrospectionData, g as ArcInternalMetadata, h as ResourceMetadata, i as ValidationResult, it as ResourceHooks, j as ArcDecorator, jt as RouteMcpConfig, k as IntrospectionPluginOptions, kn as BaseControllerOptions, kt as ActionsMap, l as TypedRepository, m as RegistryStats, n as ConfigError, nt as FieldRule, o as InferDocType, ot as EventDefinition, p as RegistryEntry, q as PresetFunction, qt as TokenPair, r as ValidateOptions, rt as ResourceHookContext, s as InferResourceDoc, t as RouteHandlerMethod, tt as ArcFieldRule, u as TypedResourceConfig, v as LookupOption, w as ServiceContext, x as PopulateOption, y as OwnershipCheck, zt as IRequestContext } from "../index-
|
|
1
|
+
import { $ as OpenApiSchemas, A as RequestIdOptions, At as RouteDefinition, Bt as RouteHandler, C as RequestContext, D as HealthCheck, Dt as ActionEntry, E as GracefulShutdownOptions, Et as ActionDefinition, F as FastifyWithDecorators, Ft as ControllerLike, G as OnTenantDeleteConfig, Gt as AuthenticatorContext, H as CrudController, Ht as AuthHelpers, I as MiddlewareHandler, It as FastifyHandler, J as PresetHook, K as ResolvedTenantPurge, Kt as JwtContext, L as RequestWithExtras, Lt as IController, M as EventsDecorator, Mt as RouteMethod, N as FastifyRequestExtras, Nt as RateLimitConfig, O as HealthOptions, Ot as ActionHandlerFn, P as FastifyWithAuth, Pt as ControllerHandler, Q as MiddlewareConfig, Rt as IControllerResponse, S as QueryParserInterface, T as CrudRouterOptions, Tt as ResourceCacheConfig, U as ResourceConfig, Ut as AuthPluginOptions, W as ResourcePermissions, Wt as Authenticator, X as CrudRouteKey, Y as PresetResult, Z as CrudSchemas, _ as ControllerQueryOptions, a as InferAdapterDoc, at as ResourceExtensions, b as ParsedQuery, c as TypedController, d as PaginationResult, et as RouteSchemaOptions, f as IntrospectionData, g as ArcInternalMetadata, h as ResourceMetadata, i as ValidationResult, it as ResourceHooks, j as ArcDecorator, jt as RouteMcpConfig, k as IntrospectionPluginOptions, kn as BaseControllerOptions, kt as ActionsMap, l as TypedRepository, m as RegistryStats, n as ConfigError, nt as FieldRule, o as InferDocType, ot as EventDefinition, p as RegistryEntry, q as PresetFunction, qt as TokenPair, r as ValidateOptions, rt as ResourceHookContext, s as InferResourceDoc, t as RouteHandlerMethod, tt as ArcFieldRule, u as TypedResourceConfig, v as LookupOption, w as ServiceContext, x as PopulateOption, y as OwnershipCheck, zt as IRequestContext } from "../index-Q5gzEIWY.mjs";
|
|
2
2
|
import { i as RequestScope } from "../types-DjC-KUCz.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { a as UserBase, d as JWTPayload, f as ObjectId, i as PermissionContext, l as AnyRecord, m as UserOrganization, n as DataPolicy, p as UserLike, r as PermissionCheck, t as AuthorizationDecision, u as ArcRequest } from "../types-ChvvVNP8.mjs";
|
|
4
4
|
import { n as ElevationOptions, t as ElevationEvent } from "../elevation-C9s5hFP_.mjs";
|
|
5
|
-
export type { ActionDefinition, ActionEntry, ActionHandlerFn, ActionsMap, AnyRecord, ArcDecorator, ArcFieldRule, ArcInternalMetadata, ArcRequest, AuthHelpers, AuthPluginOptions, Authenticator, AuthenticatorContext, BaseControllerOptions, ConfigError, ControllerHandler, ControllerLike, ControllerQueryOptions, CrudController, CrudRouteKey, CrudRouterOptions, CrudSchemas, ElevationEvent, ElevationOptions, EventDefinition, EventsDecorator, FastifyHandler, FastifyRequestExtras, FastifyWithAuth, FastifyWithDecorators, FieldRule, GracefulShutdownOptions, HealthCheck, HealthOptions, IController, IControllerResponse, IRequestContext, InferAdapterDoc, InferDocType, InferResourceDoc, IntrospectionData, IntrospectionPluginOptions, JWTPayload, JwtContext, LookupOption, MiddlewareConfig, MiddlewareHandler, ObjectId, OnTenantDeleteConfig, OpenApiSchemas, OwnershipCheck, PaginationResult, ParsedQuery, PermissionCheck, PermissionContext,
|
|
5
|
+
export type { ActionDefinition, ActionEntry, ActionHandlerFn, ActionsMap, AnyRecord, ArcDecorator, ArcFieldRule, ArcInternalMetadata, ArcRequest, AuthHelpers, AuthPluginOptions, Authenticator, AuthenticatorContext, AuthorizationDecision, BaseControllerOptions, ConfigError, ControllerHandler, ControllerLike, ControllerQueryOptions, CrudController, CrudRouteKey, CrudRouterOptions, CrudSchemas, DataPolicy, ElevationEvent, ElevationOptions, EventDefinition, EventsDecorator, FastifyHandler, FastifyRequestExtras, FastifyWithAuth, FastifyWithDecorators, FieldRule, GracefulShutdownOptions, HealthCheck, HealthOptions, IController, IControllerResponse, IRequestContext, InferAdapterDoc, InferDocType, InferResourceDoc, IntrospectionData, IntrospectionPluginOptions, JWTPayload, JwtContext, LookupOption, MiddlewareConfig, MiddlewareHandler, ObjectId, OnTenantDeleteConfig, OpenApiSchemas, OwnershipCheck, PaginationResult, ParsedQuery, PermissionCheck, PermissionContext, PopulateOption, PresetFunction, PresetHook, PresetResult, QueryParserInterface, RateLimitConfig, RegistryEntry, RegistryStats, RequestContext, RequestIdOptions, RequestScope, RequestWithExtras, ResolvedTenantPurge, ResourceCacheConfig, ResourceConfig, ResourceExtensions, ResourceHookContext, ResourceHooks, ResourceMetadata, ResourcePermissions, RouteDefinition, RouteHandler, RouteHandlerMethod, RouteMcpConfig, RouteMethod, RouteSchemaOptions, ServiceContext, TokenPair, TypedController, TypedRepository, TypedResourceConfig, UserBase, UserLike, UserOrganization, ValidateOptions, ValidationResult };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { V as ResourceDefinition } from "./index-
|
|
1
|
+
import { V as ResourceDefinition } from "./index-Q5gzEIWY.mjs";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
//#region src/integrations/mcp/types.d.ts
|
|
4
4
|
/** Behavioral hints for MCP clients (tool annotations per MCP spec) */
|