@classytic/arc 2.11.3 → 2.13.1
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 +27 -18
- package/dist/{BaseController-swXruJ2_.mjs → BaseController-DX_T-bDB.mjs} +388 -423
- package/dist/EventTransport-CT_52aWU.d.mts +34 -0
- package/dist/EventTransport-DLWoUMHy.mjs +103 -0
- package/dist/{QueryCache-DOBNHBE0.d.mts → QueryCache-D41bfdBB.d.mts} +1 -1
- package/dist/{ResourceRegistry-DkAeAuTX.mjs → ResourceRegistry-CTERg_2x.mjs} +139 -66
- package/dist/audit/index.d.mts +2 -2
- package/dist/audit/index.mjs +1 -1
- package/dist/auth/audit.d.mts +199 -0
- package/dist/auth/audit.mjs +288 -0
- package/dist/auth/index.d.mts +5 -5
- package/dist/auth/index.mjs +117 -191
- package/dist/auth/redis-session.d.mts +1 -1
- package/dist/{betterAuthOpenApi-DwxtK3uG.mjs → betterAuthOpenApi--M_i87dQ.mjs} +1 -1
- package/dist/buildHandler-olo-gt94.mjs +610 -0
- package/dist/cache/index.d.mts +3 -3
- package/dist/cache/index.mjs +3 -3
- package/dist/cli/commands/describe.d.mts +89 -13
- package/dist/cli/commands/describe.mjs +56 -2
- package/dist/cli/commands/docs.mjs +2 -2
- package/dist/cli/commands/generate.mjs +147 -48
- package/dist/cli/commands/init.d.mts +13 -0
- package/dist/cli/commands/init.mjs +237 -112
- package/dist/cli/commands/introspect.mjs +8 -1
- package/dist/context/index.mjs +1 -1
- package/dist/core/index.d.mts +3 -3
- package/dist/core/index.mjs +5 -5
- package/dist/core-D72ia0EH.mjs +1399 -0
- package/dist/{createActionRouter-u3ql2EDo.mjs → createActionRouter-CEvzKcy8.mjs} +7 -20
- package/dist/createAggregationRouter-CyecOxnO.mjs +114 -0
- package/dist/{createApp-BFxtdKy6.mjs → createApp-XX2-N0Yd.mjs} +31 -27
- package/dist/defineEvent-D5h7EvAx.mjs +188 -0
- package/dist/docs/index.d.mts +2 -2
- package/dist/docs/index.mjs +2 -2
- package/dist/{elevation-DOFoxoDs.mjs → elevation-DgoeTyfX.mjs} +1 -1
- package/dist/errorHandler-Bk-AGhkU.mjs +174 -0
- package/dist/errorHandler-DFr45ZG4.d.mts +45 -0
- package/dist/errors-j4aJm1Wg.mjs +184 -0
- package/dist/{eventPlugin-KrFIQ097.mjs → eventPlugin-CaKTYkYM.mjs} +35 -137
- package/dist/{eventPlugin-CUNjYYRY.d.mts → eventPlugin-qXpqTebY.d.mts} +57 -7
- package/dist/events/index.d.mts +164 -5
- package/dist/events/index.mjs +133 -209
- package/dist/events/transports/redis-stream-entry.d.mts +1 -1
- package/dist/events/transports/redis-stream-entry.mjs +204 -31
- package/dist/events/transports/redis.d.mts +1 -1
- package/dist/factory/index.d.mts +2 -2
- package/dist/factory/index.mjs +2 -2
- package/dist/{fields-C8Y0XLAu.d.mts → fields-COhcH3fk.d.mts} +23 -2
- package/dist/hooks/index.d.mts +1 -1
- package/dist/hooks/index.mjs +1 -1
- package/dist/idempotency/index.d.mts +3 -3
- package/dist/idempotency/index.mjs +1 -20
- package/dist/idempotency/redis.d.mts +1 -1
- package/dist/idempotency/redis.mjs +1 -1
- package/dist/{index-BYCqHCVu.d.mts → index-BTqLEvhu.d.mts} +164 -4
- package/dist/{index-6u4_Gg6G.d.mts → index-BtW7qYwa.d.mts} +661 -281
- package/dist/{index-BdXnTPRj.d.mts → index-Ds61mrJE.d.mts} +50 -4
- package/dist/{index-DdQ3O9Pg.d.mts → index-Dz5IKsrE.d.mts} +360 -219
- package/dist/index.d.mts +6 -7
- package/dist/index.mjs +9 -10
- package/dist/integrations/event-gateway.d.mts +2 -2
- package/dist/integrations/event-gateway.mjs +1 -1
- package/dist/integrations/index.d.mts +2 -2
- package/dist/integrations/mcp/index.d.mts +2 -2
- 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/integrations/streamline.d.mts +60 -11
- package/dist/integrations/streamline.mjs +75 -85
- package/dist/integrations/websocket-redis.d.mts +1 -1
- package/dist/integrations/websocket.d.mts +1 -1
- package/dist/integrations/websocket.mjs +2 -8
- package/dist/middleware/index.d.mts +1 -1
- package/dist/middleware/index.mjs +2 -2
- package/dist/migrations/index.d.mts +23 -3
- package/dist/migrations/index.mjs +0 -7
- package/dist/{multipartBody-CvTR1Un6.mjs → multipartBody-BOvVSVCD.mjs} +11 -8
- package/dist/{openapi-BGUn7Ki1.mjs → openapi-CiOMVW1p.mjs} +143 -13
- package/dist/org/index.d.mts +2 -2
- package/dist/org/index.mjs +1 -1
- package/dist/permissions/index.d.mts +3 -3
- package/dist/permissions/index.mjs +3 -3
- package/dist/{permissions-gd_aUWrR.mjs → permissions-ohQyv50e.mjs} +404 -176
- package/dist/{pipe-DVoIheVC.mjs → pipe-Zr0KXjQe.mjs} +1 -1
- package/dist/pipeline/index.d.mts +1 -1
- package/dist/pipeline/index.mjs +1 -1
- package/dist/plugins/index.d.mts +18 -33
- package/dist/plugins/index.mjs +33 -13
- package/dist/plugins/response-cache.mjs +1 -1
- package/dist/plugins/tracing-entry.d.mts +1 -1
- package/dist/plugins/tracing-entry.mjs +1 -1
- package/dist/presets/filesUpload.d.mts +5 -5
- package/dist/presets/filesUpload.mjs +6 -9
- package/dist/presets/index.d.mts +1 -1
- package/dist/presets/index.mjs +1 -1
- package/dist/presets/multiTenant.d.mts +1 -1
- package/dist/presets/multiTenant.mjs +2 -2
- package/dist/presets/search.d.mts +2 -2
- package/dist/presets/search.mjs +6 -8
- package/dist/{presets-Z7P5w4gF.mjs → presets-BbkjdPeH.mjs} +6 -28
- package/dist/{queryCachePlugin-BUXBSm4F.d.mts → queryCachePlugin-CqMdLI2-.d.mts} +2 -2
- package/dist/{queryCachePlugin-Bq6bO6vc.mjs → queryCachePlugin-m1XsgAIJ.mjs} +3 -3
- package/dist/{redis-Cm1gnRDf.d.mts → redis-DiMkdHEl.d.mts} +1 -1
- package/dist/redis-stream-D6HzR1Z_.d.mts +232 -0
- package/dist/registry/index.d.mts +1 -1
- package/dist/registry/index.mjs +2 -2
- package/dist/{replyHelpers-ByllIXXV.mjs → replyHelpers-CK-FNO8E.mjs} +3 -21
- package/dist/{resourceToTools-ByZpgjeH.mjs → resourceToTools-C5coh64w.mjs} +224 -71
- package/dist/{routerShared-BqLRb5l7.mjs → routerShared-D6_fEGHh.mjs} +40 -36
- package/dist/{schemaIR-BlG9bY7v.mjs → schemaIR-7Vl611Qs.mjs} +1 -1
- package/dist/schemas/index.d.mts +100 -30
- package/dist/schemas/index.mjs +86 -29
- package/dist/scim/index.d.mts +264 -0
- package/dist/scim/index.mjs +963 -0
- package/dist/scope/index.d.mts +3 -3
- package/dist/scope/index.mjs +4 -4
- package/dist/{sse-V7aXc3bW.mjs → sse-Bz-5ZeTt.mjs} +1 -1
- package/dist/{store-helpers-BhrzxvyQ.mjs → store-helpers-BkIN9-vu.mjs} +1 -1
- package/dist/testing/index.d.mts +2 -8
- package/dist/testing/index.mjs +16 -24
- package/dist/testing/storageContract.d.mts +1 -1
- package/dist/types/index.d.mts +4 -4
- package/dist/types/storage.d.mts +1 -1
- package/dist/{types-BH7dEGvU.d.mts → types-BvqwCCSx.d.mts} +77 -29
- package/dist/{types-tgR4Pt8F.d.mts → types-CTYvcwHe.d.mts} +195 -1
- package/dist/{types-AOD8fxIw.mjs → types-C_s5moIu.mjs} +117 -1
- package/dist/{types-9beEMe25.d.mts → types-DQHFc8PM.d.mts} +1 -1
- package/dist/utils/index.d.mts +2 -2
- package/dist/utils/index.mjs +5 -5
- package/dist/{utils-CcYTj09l.mjs → utils-_h9B3c57.mjs} +1269 -1334
- package/dist/{versioning-M9lNLhO8.d.mts → versioning-DTTvc80y.d.mts} +1 -1
- package/package.json +24 -34
- package/skills/arc/SKILL.md +521 -785
- package/skills/arc/references/agent-auth.md +238 -0
- package/skills/arc/references/api-reference.md +187 -0
- package/skills/arc/references/auth.md +354 -7
- package/skills/arc/references/enterprise-auth.md +94 -0
- package/skills/arc/references/events.md +8 -6
- package/skills/arc/references/mcp.md +2 -2
- package/skills/arc/references/multi-tenancy.md +11 -2
- package/skills/arc/references/production.md +10 -9
- package/skills/arc/references/scim.md +247 -0
- package/skills/arc/references/testing.md +1 -1
- package/skills/arc-code-review/SKILL.md +141 -0
- package/skills/arc-code-review/references/anti-patterns.md +911 -0
- package/skills/arc-code-review/references/arc-cheatsheet.md +380 -0
- package/skills/arc-code-review/references/migration-recipes.md +700 -0
- package/skills/arc-code-review/references/mongokit-migration.md +386 -0
- package/skills/arc-code-review/references/scaffolding.md +230 -0
- package/skills/arc-code-review/references/severity.md +127 -0
- package/dist/EventTransport-CfVEGaEl.d.mts +0 -293
- package/dist/adapters/index.d.mts +0 -3
- package/dist/adapters/index.mjs +0 -2
- package/dist/adapters-D0tT2Tyo.mjs +0 -949
- package/dist/auth/mongoose.d.mts +0 -191
- package/dist/auth/mongoose.mjs +0 -73
- package/dist/core-DnUsRpuX.mjs +0 -1049
- package/dist/errorHandler-BQm8ZxTK.mjs +0 -173
- package/dist/errorHandler-Co3lnVmJ.d.mts +0 -114
- package/dist/errors-D5c-5BJL.mjs +0 -232
- package/dist/index-BbMrcvGp.d.mts +0 -362
- package/dist/redis-stream-CM8TXTix.d.mts +0 -110
- /package/dist/{HookSystem-CGsMd6oK.mjs → HookSystem-Iiebom92.mjs} +0 -0
- /package/dist/{actionPermissions-sUUKDhtP.mjs → actionPermissions-CyUkQu6O.mjs} +0 -0
- /package/dist/{caching-CheW3m-S.mjs → caching-SM8gghN6.mjs} +0 -0
- /package/dist/{constants-BhY1OHoH.mjs → constants-Cxde4rpC.mjs} +0 -0
- /package/dist/{elevation-s5ykdNHr.d.mts → elevation-BXOWoGCF.d.mts} +0 -0
- /package/dist/{externalPaths-Bapitwvd.d.mts → externalPaths-BD5nw6St.d.mts} +0 -0
- /package/dist/{interface-CkkWm5uR.d.mts → interface-DfLGcus7.d.mts} +0 -0
- /package/dist/{interface-Da0r7Lna.d.mts → interface-beEtJyWM.d.mts} +0 -0
- /package/dist/{keys-CARyUjiR.mjs → keys-CGcCbNyu.mjs} +0 -0
- /package/dist/{loadResources-CPpkyKfM.mjs → loadResources-DBMQg_Aj.mjs} +0 -0
- /package/dist/{memory-DikHSvWa.mjs → memory-UBydS5ku.mjs} +0 -0
- /package/dist/{metrics-Csh4nsvv.mjs → metrics-Qnvwc-LQ.mjs} +0 -0
- /package/dist/{pluralize-BneOJkpi.mjs → pluralize-DQgqgifU.mjs} +0 -0
- /package/dist/{registry-D63ee7fl.mjs → registry-I-ogLgL9.mjs} +0 -0
- /package/dist/{requestContext-C5XeK3VA.mjs → requestContext-SSaaTgW8.mjs} +0 -0
- /package/dist/{schemaConverter-B0oKLuqI.mjs → schemaConverter-De34B1ZG.mjs} +0 -0
- /package/dist/{sessionManager-D-oNWHz3.d.mts → sessionManager-C4Le_UB3.d.mts} +0 -0
- /package/dist/{storage-BwGQXUpd.d.mts → storage-Dfzt4VTl.d.mts} +0 -0
- /package/dist/{tracing-DokiEsuz.d.mts → tracing-QJVprktp.d.mts} +0 -0
- /package/dist/{typeGuards-CcFZXgU7.mjs → typeGuards-BzkXkvVv.mjs} +0 -0
- /package/dist/{types-DV9WDfeg.mjs → types-D57iXYb8.mjs} +0 -0
- /package/dist/{versioning-CGPjkqAg.mjs → versioning-BUrT5aP4.mjs} +0 -0
- /package/dist/{websocket-CyJ1VIFI.d.mts → websocket-ChC2rqe1.d.mts} +0 -0
|
@@ -65,13 +65,15 @@ function multipartBody(options = {}) {
|
|
|
65
65
|
for await (const part of parts) if (part.type === "file") {
|
|
66
66
|
if (fileCount >= maxFiles) continue;
|
|
67
67
|
if (mimeMatcher && !mimeMatcher.matches(part.mimetype)) return reply.code(415).send({
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
code: "arc.unsupported_media_type",
|
|
69
|
+
message: `File type '${part.mimetype}' not allowed. Accepted: ${mimeMatcher.describe()}`,
|
|
70
|
+
status: 415
|
|
70
71
|
});
|
|
71
72
|
const buffer = await part.toBuffer();
|
|
72
73
|
if (buffer.length > maxFileSize) return reply.code(413).send({
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
code: "arc.payload_too_large",
|
|
75
|
+
message: `File '${part.filename}' exceeds maximum size of ${Math.round(maxFileSize / 1024 / 1024)}MB`,
|
|
76
|
+
status: 413
|
|
75
77
|
});
|
|
76
78
|
files[part.fieldname] = {
|
|
77
79
|
filename: part.filename,
|
|
@@ -85,16 +87,17 @@ function multipartBody(options = {}) {
|
|
|
85
87
|
} catch (err) {
|
|
86
88
|
request.log.error({ err }, "multipartBody: failed to parse multipart form");
|
|
87
89
|
return reply.code(400).send({
|
|
88
|
-
|
|
89
|
-
|
|
90
|
+
code: "arc.bad_request",
|
|
91
|
+
message: "Failed to parse multipart form data",
|
|
92
|
+
status: 400
|
|
90
93
|
});
|
|
91
94
|
}
|
|
92
95
|
if (requiredFields) {
|
|
93
96
|
const missing = requiredFields.filter((name) => !(name in files));
|
|
94
97
|
if (missing.length > 0) return reply.code(400).send({
|
|
95
|
-
success: false,
|
|
96
|
-
error: `Missing required file field${missing.length > 1 ? "s" : ""}: ${missing.join(", ")}`,
|
|
97
98
|
code: "MISSING_FILE_FIELDS",
|
|
99
|
+
message: `Missing required file field${missing.length > 1 ? "s" : ""}: ${missing.join(", ")}`,
|
|
100
|
+
status: 400,
|
|
98
101
|
details: { missing }
|
|
99
102
|
});
|
|
100
103
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { t as getUserRoles } from "./types-
|
|
2
|
-
import { n as convertRouteSchema } from "./schemaConverter-
|
|
3
|
-
import { t as resolveActionPermission } from "./actionPermissions-
|
|
4
|
-
import { t as buildActionBodySchema } from "./createActionRouter-
|
|
1
|
+
import { t as getUserRoles } from "./types-D57iXYb8.mjs";
|
|
2
|
+
import { n as convertRouteSchema } from "./schemaConverter-De34B1ZG.mjs";
|
|
3
|
+
import { t as resolveActionPermission } from "./actionPermissions-CyUkQu6O.mjs";
|
|
4
|
+
import { t as buildActionBodySchema } from "./createActionRouter-CEvzKcy8.mjs";
|
|
5
5
|
import fp from "fastify-plugin";
|
|
6
6
|
//#region src/docs/openapi.ts
|
|
7
7
|
const openApiPlugin = async (fastify, opts = {}) => {
|
|
@@ -160,7 +160,6 @@ const DEFAULT_LIST_PARAMS = [
|
|
|
160
160
|
function generateResourcePaths(resource, apiPrefix = "", additionalSecurity = []) {
|
|
161
161
|
const paths = {};
|
|
162
162
|
const basePath = `${apiPrefix}${resource.prefix}`;
|
|
163
|
-
if (resource.disableDefaultRoutes && (!resource.customRoutes || resource.customRoutes.length === 0) && (!resource.actions || resource.actions.length === 0)) return paths;
|
|
164
163
|
if (!resource.disableDefaultRoutes) {
|
|
165
164
|
const disabledSet = new Set(resource.disabledRoutes ?? []);
|
|
166
165
|
const updateMethod = resource.updateMethod ?? "PATCH";
|
|
@@ -173,7 +172,7 @@ function generateResourcePaths(resource, apiPrefix = "", additionalSecurity = []
|
|
|
173
172
|
type: "object",
|
|
174
173
|
properties: {
|
|
175
174
|
success: { type: "boolean" },
|
|
176
|
-
|
|
175
|
+
data: {
|
|
177
176
|
type: "array",
|
|
178
177
|
items: { $ref: `#/components/schemas/${resource.name}` }
|
|
179
178
|
},
|
|
@@ -358,9 +357,136 @@ function generateResourcePaths(resource, apiPrefix = "", additionalSecurity = []
|
|
|
358
357
|
}
|
|
359
358
|
}, anyAuthRequired, additionalSecurity);
|
|
360
359
|
}
|
|
360
|
+
if (resource.aggregations && resource.aggregations.length > 0) appendAggregationPaths(paths, resource, basePath, additionalSecurity);
|
|
361
361
|
return paths;
|
|
362
362
|
}
|
|
363
363
|
/**
|
|
364
|
+
* Emit one OpenAPI path entry per declared aggregation.
|
|
365
|
+
*
|
|
366
|
+
* Path: `GET /:resource/aggregations/<name>`
|
|
367
|
+
* Response: `{ rows: AggregationRow[] }` where each row is keyed by
|
|
368
|
+
* the groupBy fields (nested object for joined-alias paths)
|
|
369
|
+
* plus the measure aliases.
|
|
370
|
+
*
|
|
371
|
+
* Auth requirement is read from the aggregation's own `permissions`
|
|
372
|
+
* function — same fallback chain runtime + MCP use.
|
|
373
|
+
*/
|
|
374
|
+
function appendAggregationPaths(paths, resource, basePath, additionalSecurity) {
|
|
375
|
+
if (!resource.aggregations) return;
|
|
376
|
+
for (const agg of resource.aggregations) {
|
|
377
|
+
const path = toOpenApiPath(`${basePath}/aggregations/${agg.name}`);
|
|
378
|
+
const requiresAuth = !agg.permissions?._isPublic;
|
|
379
|
+
const rowSchema = buildAggregationRowSchema(normalizeGroupByForOpenApi(agg.groupBy), agg.measures, agg.lookupAliases);
|
|
380
|
+
const querystring = {
|
|
381
|
+
type: "object",
|
|
382
|
+
properties: {},
|
|
383
|
+
additionalProperties: true
|
|
384
|
+
};
|
|
385
|
+
if (agg.requireDateRange) {
|
|
386
|
+
const props = querystring.properties;
|
|
387
|
+
const f = agg.requireDateRange.field;
|
|
388
|
+
props[`${f}[gte]`] = {
|
|
389
|
+
type: "string",
|
|
390
|
+
description: `Lower bound (inclusive) of required date range on \`${f}\`.`
|
|
391
|
+
};
|
|
392
|
+
props[`${f}[lte]`] = {
|
|
393
|
+
type: "string",
|
|
394
|
+
description: `Upper bound (inclusive) of required date range on \`${f}\`.`
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
if (agg.requireFilters?.length) {
|
|
398
|
+
const props = querystring.properties;
|
|
399
|
+
for (const f of agg.requireFilters) props[f] = {
|
|
400
|
+
type: "string",
|
|
401
|
+
description: `Required filter on \`${f}\` — request rejected (400) if missing.`
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
const descLines = [];
|
|
405
|
+
if (agg.description) descLines.push(agg.description);
|
|
406
|
+
descLines.push("Portable aggregation. Caller filters via query string narrow the base + tenant scope; response shape is `{ rows: [...] }` matching repo-core's `AggResult` contract.");
|
|
407
|
+
if (Object.keys(agg.measures).length > 0) {
|
|
408
|
+
const measureLines = Object.entries(agg.measures).map(([alias, op]) => `- \`${alias}\` — \`${op}\``).join("\n");
|
|
409
|
+
descLines.push("", "**Measures:**", measureLines);
|
|
410
|
+
}
|
|
411
|
+
if (agg.requireDateRange) descLines.push("", `**Required date range** on \`${agg.requireDateRange.field}\` — supply \`?${agg.requireDateRange.field}[gte]=...&${agg.requireDateRange.field}[lte]=...\`.` + (agg.requireDateRange.maxRangeDays ? ` Range cap: ${agg.requireDateRange.maxRangeDays} days.` : ""));
|
|
412
|
+
if (!paths[path]) paths[path] = {};
|
|
413
|
+
paths[path].get = createOperation(resource, `aggregation.${agg.name}`, agg.summary ?? `Aggregation: ${agg.name}`, {
|
|
414
|
+
description: descLines.join("\n"),
|
|
415
|
+
parameters: [{
|
|
416
|
+
name: "querystring",
|
|
417
|
+
in: "query",
|
|
418
|
+
required: false,
|
|
419
|
+
schema: querystring,
|
|
420
|
+
description: "Filter narrowing — composes with base filter + tenant scope."
|
|
421
|
+
}],
|
|
422
|
+
responses: {
|
|
423
|
+
"200": {
|
|
424
|
+
description: "Aggregation result",
|
|
425
|
+
content: { "application/json": { schema: {
|
|
426
|
+
type: "object",
|
|
427
|
+
required: ["rows"],
|
|
428
|
+
properties: { rows: {
|
|
429
|
+
type: "array",
|
|
430
|
+
items: rowSchema
|
|
431
|
+
} }
|
|
432
|
+
} } }
|
|
433
|
+
},
|
|
434
|
+
"400": { description: "Missing required filter or invalid date range" },
|
|
435
|
+
"401": { description: "Authentication required" },
|
|
436
|
+
"403": { description: "Permission denied" },
|
|
437
|
+
"422": { description: "Result row count exceeded `maxGroups` cap" },
|
|
438
|
+
"501": { description: "Adapter does not implement `aggregate()`" },
|
|
439
|
+
"504": { description: "Aggregation execution timed out" }
|
|
440
|
+
}
|
|
441
|
+
}, requiresAuth, additionalSecurity);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Build the JSON Schema for a single aggregation row. Combines the
|
|
446
|
+
* groupBy field shape (nested for joined-alias paths) with the
|
|
447
|
+
* measure-alias scalars.
|
|
448
|
+
*
|
|
449
|
+
* Group keys with dotted paths (e.g. `'category.code'`) emit a nested
|
|
450
|
+
* `category: { code: string }` object, matching the cross-kit
|
|
451
|
+
* `nestDottedKeys` output. Plain group keys are flat.
|
|
452
|
+
*
|
|
453
|
+
* Measure scalars are always `number` — every measure op
|
|
454
|
+
* (`count` / `sum` / `avg` / `min` / `max` / `countDistinct`)
|
|
455
|
+
* produces a numeric result.
|
|
456
|
+
*/
|
|
457
|
+
function buildAggregationRowSchema(groupByFields, measures, _lookupAliases) {
|
|
458
|
+
const properties = {};
|
|
459
|
+
for (const field of groupByFields) setNestedSchemaProp(properties, field.split("."), { type: "string" });
|
|
460
|
+
for (const alias of Object.keys(measures)) properties[alias] = { type: "number" };
|
|
461
|
+
return {
|
|
462
|
+
type: "object",
|
|
463
|
+
properties,
|
|
464
|
+
additionalProperties: false
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
function normalizeGroupByForOpenApi(groupBy) {
|
|
468
|
+
if (!groupBy) return [];
|
|
469
|
+
return typeof groupBy === "string" ? [groupBy] : groupBy;
|
|
470
|
+
}
|
|
471
|
+
function setNestedSchemaProp(target, path, leaf) {
|
|
472
|
+
if (path.length === 1) {
|
|
473
|
+
target[path[0]] = leaf;
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
const head = path[0];
|
|
477
|
+
const rest = path.slice(1);
|
|
478
|
+
let nested = target[head];
|
|
479
|
+
if (!nested || typeof nested !== "object") {
|
|
480
|
+
nested = {
|
|
481
|
+
type: "object",
|
|
482
|
+
properties: {}
|
|
483
|
+
};
|
|
484
|
+
target[head] = nested;
|
|
485
|
+
}
|
|
486
|
+
if (!nested.properties) nested.properties = {};
|
|
487
|
+
setNestedSchemaProp(nested.properties, rest, leaf);
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
364
490
|
* Create an operation object
|
|
365
491
|
* @param requiresAuthOverride - Override for whether auth is required (for additional routes)
|
|
366
492
|
* @param additionalSecurity - Extra security alternatives from external integrations (OR'd with bearerAuth)
|
|
@@ -511,13 +637,17 @@ function generateSchemas(resources) {
|
|
|
511
637
|
}
|
|
512
638
|
}
|
|
513
639
|
};
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
const
|
|
519
|
-
|
|
520
|
-
|
|
640
|
+
const resourceSchema = schemas[resource.name];
|
|
641
|
+
if (fieldPerms && resourceSchema?.properties) {
|
|
642
|
+
const props = resourceSchema.properties;
|
|
643
|
+
for (const [field, perm] of Object.entries(fieldPerms)) {
|
|
644
|
+
const propSchema = props[field];
|
|
645
|
+
if (propSchema) {
|
|
646
|
+
const desc = propSchema.description ?? "";
|
|
647
|
+
const permDesc = formatFieldPermDescription(perm);
|
|
648
|
+
propSchema.description = desc ? `${desc} (${permDesc})` : permDesc;
|
|
649
|
+
} else if (perm.type === "hidden") {}
|
|
650
|
+
}
|
|
521
651
|
}
|
|
522
652
|
if (storedSchemas?.createBody) {
|
|
523
653
|
schemas[`${resource.name}Input`] = {
|
package/dist/org/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { yt as RouteHandler } from "../index-
|
|
2
|
-
import { d as UserBase } from "../fields-
|
|
1
|
+
import { yt as RouteHandler } from "../index-BtW7qYwa.mjs";
|
|
2
|
+
import { d as UserBase } from "../fields-COhcH3fk.mjs";
|
|
3
3
|
import { InvitationAdapter, InvitationDoc, MemberDoc, OrgAdapter, OrgDoc, OrgPermissionStatement, OrgRole, OrganizationPluginOptions } from "./types.mjs";
|
|
4
4
|
import { FastifyPluginAsync, RouteHandlerMethod } from "fastify";
|
|
5
5
|
|
package/dist/org/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as
|
|
1
|
+
import { _ as hasOrgAccess, b as isMember, l as getOrgRoles, n as PUBLIC_SCOPE, y as isElevated } from "../types-C_s5moIu.mjs";
|
|
2
2
|
import fp from "fastify-plugin";
|
|
3
3
|
//#region src/org/organizationPlugin.ts
|
|
4
4
|
const DEFAULT_ROLES = [
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as applyFieldWritePermissions, c as PermissionCheck, d as UserBase, f as getUserRoles, i as applyFieldReadPermissions, l as PermissionContext, n as FieldPermissionMap, o as fields, p as normalizeRoles, r as FieldPermissionType, s as resolveEffectiveRoles, t as FieldPermission, u as PermissionResult } from "../fields-
|
|
2
|
-
import { A as requireRoles, C as allOf, D as not, E as denyAll, M as when, N as applyPermissionResult, O as requireAuth, P as normalizePermissionResult, S as createOrgPermissions, T as anyOf, _ as ConnectEventsOptions, a as presets_d_exports, b as PermissionEventBus, c as readOnly, d as requireOrgRole, f as requireScopeContext, g as createRoleHierarchy, h as RoleHierarchy, i as ownerWithAdminBypass, j as roles, k as requireOwnership, l as requireOrgInScope, m as requireTeamMembership, n as authenticated, o as publicRead, p as requireServiceScope, r as fullPublic, s as publicReadAdminWrite, t as adminOnly, u as requireOrgMembership, v as DynamicPermissionMatrix, w as allowPublic, x as createDynamicPermissionMatrix, y as DynamicPermissionMatrixConfig } from "../index-
|
|
3
|
-
export { ConnectEventsOptions, DynamicPermissionMatrix, DynamicPermissionMatrixConfig, FieldPermission, FieldPermissionMap, FieldPermissionType, PermissionCheck, PermissionContext, PermissionEventBus, PermissionResult, RoleHierarchy, UserBase, adminOnly, allOf, allowPublic, anyOf, applyFieldReadPermissions, applyFieldWritePermissions, applyPermissionResult, authenticated, createDynamicPermissionMatrix, createOrgPermissions, createRoleHierarchy, denyAll, fields, fullPublic, getUserRoles, normalizePermissionResult, normalizeRoles, not, ownerWithAdminBypass, presets_d_exports as permissions, publicRead, publicReadAdminWrite, readOnly, requireAuth, requireOrgInScope, requireOrgMembership, requireOrgRole, requireOwnership, requireRoles, requireScopeContext, requireServiceScope, requireTeamMembership, resolveEffectiveRoles, roles, when };
|
|
1
|
+
import { a as applyFieldWritePermissions, c as PermissionCheck, d as UserBase, f as getUserRoles, i as applyFieldReadPermissions, l as PermissionContext, n as FieldPermissionMap, o as fields, p as normalizeRoles, r as FieldPermissionType, s as resolveEffectiveRoles, t as FieldPermission, u as PermissionResult } from "../fields-COhcH3fk.mjs";
|
|
2
|
+
import { A as requireRoles, C as allOf, D as not, E as denyAll, F as RequireAgentScopeOptions, I as RequireMandateOptions, L as requireAgentScope, M as when, N as applyPermissionResult, O as requireAuth, P as normalizePermissionResult, R as requireDPoP, S as createOrgPermissions, T as anyOf, _ as ConnectEventsOptions, a as presets_d_exports, b as PermissionEventBus, c as readOnly, d as requireOrgRole, f as requireScopeContext, g as createRoleHierarchy, h as RoleHierarchy, i as ownerWithAdminBypass, j as roles, k as requireOwnership, l as requireOrgInScope, m as requireTeamMembership, n as authenticated, o as publicRead, p as requireServiceScope, r as fullPublic, s as publicReadAdminWrite, t as adminOnly, u as requireOrgMembership, v as DynamicPermissionMatrix, w as allowPublic, x as createDynamicPermissionMatrix, y as DynamicPermissionMatrixConfig, z as requireMandate } from "../index-BTqLEvhu.mjs";
|
|
3
|
+
export { ConnectEventsOptions, DynamicPermissionMatrix, DynamicPermissionMatrixConfig, FieldPermission, FieldPermissionMap, FieldPermissionType, PermissionCheck, PermissionContext, PermissionEventBus, PermissionResult, RequireAgentScopeOptions, RequireMandateOptions, RoleHierarchy, UserBase, adminOnly, allOf, allowPublic, anyOf, applyFieldReadPermissions, applyFieldWritePermissions, applyPermissionResult, authenticated, createDynamicPermissionMatrix, createOrgPermissions, createRoleHierarchy, denyAll, fields, fullPublic, getUserRoles, normalizePermissionResult, normalizeRoles, not, ownerWithAdminBypass, presets_d_exports as permissions, publicRead, publicReadAdminWrite, readOnly, requireAgentScope, requireAuth, requireDPoP, requireMandate, requireOrgInScope, requireOrgMembership, requireOrgRole, requireOwnership, requireRoles, requireScopeContext, requireServiceScope, requireTeamMembership, resolveEffectiveRoles, roles, when };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { A as
|
|
2
|
-
import { n as normalizeRoles, t as getUserRoles } from "../types-
|
|
3
|
-
export { adminOnly, allOf, allowPublic, anyOf, applyFieldReadPermissions, applyFieldWritePermissions, applyPermissionResult, authenticated, createDynamicPermissionMatrix, createOrgPermissions, createRoleHierarchy, denyAll, fields, fullPublic, getUserRoles, normalizePermissionResult, normalizeRoles, not, ownerWithAdminBypass, presets_exports as permissions, publicRead, publicReadAdminWrite, readOnly, requireAuth, requireOrgInScope, requireOrgMembership, requireOrgRole, requireOwnership, requireRoles, requireScopeContext, requireServiceScope, requireTeamMembership, resolveEffectiveRoles, roles, when };
|
|
1
|
+
import { A as roles, C as allowPublic, D as requireAuth, E as not, F as applyPermissionResult, L as normalizePermissionResult, M as requireAgentScope, N as requireDPoP, O as requireOwnership, P as requireMandate, S as allOf, T as denyAll, _ as requireOrgMembership, a as presets_exports, b as requireServiceScope, c as readOnly, d as applyFieldWritePermissions, f as fields, g as requireOrgInScope, h as createOrgPermissions, i as ownerWithAdminBypass, j as when, k as requireRoles, l as createRoleHierarchy, m as createDynamicPermissionMatrix, n as authenticated, o as publicRead, p as resolveEffectiveRoles, r as fullPublic, s as publicReadAdminWrite, t as adminOnly, u as applyFieldReadPermissions, v as requireOrgRole, w as anyOf, x as requireTeamMembership, y as requireScopeContext } from "../permissions-ohQyv50e.mjs";
|
|
2
|
+
import { n as normalizeRoles, t as getUserRoles } from "../types-D57iXYb8.mjs";
|
|
3
|
+
export { adminOnly, allOf, allowPublic, anyOf, applyFieldReadPermissions, applyFieldWritePermissions, applyPermissionResult, authenticated, createDynamicPermissionMatrix, createOrgPermissions, createRoleHierarchy, denyAll, fields, fullPublic, getUserRoles, normalizePermissionResult, normalizeRoles, not, ownerWithAdminBypass, presets_exports as permissions, publicRead, publicReadAdminWrite, readOnly, requireAgentScope, requireAuth, requireDPoP, requireMandate, requireOrgInScope, requireOrgMembership, requireOrgRole, requireOwnership, requireRoles, requireScopeContext, requireServiceScope, requireTeamMembership, resolveEffectiveRoles, roles, when };
|