@selvajs/platform 0.15.0-beta.1 → 0.15.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/computeServer/index.d.ts +1 -1
- package/dist/computeServer/index.d.ts.map +1 -1
- package/dist/computeServer/interface.d.ts +29 -1
- package/dist/computeServer/interface.d.ts.map +1 -1
- package/dist/computeServer/types.d.ts +12 -1
- package/dist/computeServer/types.d.ts.map +1 -1
- package/dist/computeServer/types.js.map +1 -1
- package/dist/data/index.d.ts +2 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +1 -1
- package/dist/data/index.js.map +1 -1
- package/dist/data/interface.d.ts +36 -8
- package/dist/data/interface.d.ts.map +1 -1
- package/dist/data/interface.js +7 -1
- package/dist/data/interface.js.map +1 -1
- package/dist/definitions/interface.d.ts +6 -1
- package/dist/definitions/interface.d.ts.map +1 -1
- package/dist/definitions/schemas.d.ts.map +1 -1
- package/dist/definitions/schemas.js +5 -0
- package/dist/definitions/schemas.js.map +1 -1
- package/dist/events/index.d.ts +1 -1
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +1 -1
- package/dist/events/index.js.map +1 -1
- package/dist/events/interface.d.ts +7 -0
- package/dist/events/interface.d.ts.map +1 -1
- package/dist/events/interface.js +7 -0
- package/dist/events/interface.js.map +1 -1
- package/dist/index.d.ts +7 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/logging/interface.d.ts +82 -0
- package/dist/logging/interface.d.ts.map +1 -0
- package/dist/logging/interface.js +33 -0
- package/dist/logging/interface.js.map +1 -0
- package/dist/organizations/__tests__/slug-schema.test.d.ts +2 -0
- package/dist/organizations/__tests__/slug-schema.test.d.ts.map +1 -0
- package/dist/organizations/__tests__/slug-schema.test.js +38 -0
- package/dist/organizations/__tests__/slug-schema.test.js.map +1 -0
- package/dist/organizations/index.d.ts +1 -1
- package/dist/organizations/index.d.ts.map +1 -1
- package/dist/organizations/index.js +1 -1
- package/dist/organizations/index.js.map +1 -1
- package/dist/organizations/schemas.d.ts +16 -2
- package/dist/organizations/schemas.d.ts.map +1 -1
- package/dist/organizations/schemas.js +32 -2
- package/dist/organizations/schemas.js.map +1 -1
- package/dist/testing/suites/solveMetricSinkSuite.d.ts +5 -0
- package/dist/testing/suites/solveMetricSinkSuite.d.ts.map +1 -1
- package/dist/testing/suites/solveMetricSinkSuite.js +17 -8
- package/dist/testing/suites/solveMetricSinkSuite.js.map +1 -1
- package/dist/testing/suites/storageProviderSuite.d.ts.map +1 -1
- package/dist/testing/suites/storageProviderSuite.js +23 -2
- package/dist/testing/suites/storageProviderSuite.js.map +1 -1
- package/package.json +1 -1
- package/dist/auth.d.ts +0 -60
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -12
- package/dist/auth.js.map +0 -1
- package/dist/compute.d.ts +0 -47
- package/dist/compute.d.ts.map +0 -1
- package/dist/compute.js +0 -11
- package/dist/compute.js.map +0 -1
- package/dist/definitions/service.d.ts +0 -62
- package/dist/definitions/service.d.ts.map +0 -1
- package/dist/definitions/service.js +0 -149
- package/dist/definitions/service.js.map +0 -1
- package/dist/definitions.d.ts +0 -146
- package/dist/definitions.d.ts.map +0 -1
- package/dist/definitions.js +0 -23
- package/dist/definitions.js.map +0 -1
- package/dist/invites/schemas.d.ts +0 -24
- package/dist/invites/schemas.d.ts.map +0 -1
- package/dist/invites/schemas.js +0 -17
- package/dist/invites/schemas.js.map +0 -1
- package/dist/organizations.d.ts +0 -93
- package/dist/organizations.d.ts.map +0 -1
- package/dist/organizations.js +0 -14
- package/dist/organizations.js.map +0 -1
- package/dist/testing/adapterSuite.d.ts +0 -33
- package/dist/testing/adapterSuite.d.ts.map +0 -1
- package/dist/testing/adapterSuite.js +0 -166
- package/dist/testing/adapterSuite.js.map +0 -1
- package/dist/testing/suites/runner.d.ts +0 -21
- package/dist/testing/suites/runner.d.ts.map +0 -1
- package/dist/testing/suites/runner.js +0 -7
- package/dist/testing/suites/runner.js.map +0 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { SlugSchema, RESERVED_SLUGS } from '../schemas.js';
|
|
3
|
+
/**
|
|
4
|
+
* Reserved-slug guard (audit D4). A tenant slug must never equal a top-level
|
|
5
|
+
* route segment, or it could shadow (or be shadowed by) a route once flat
|
|
6
|
+
* tenant URLs — `/o/{slug}/…` per ADR 0006 — exist. These tests pin that the
|
|
7
|
+
* guard rejects every reserved word and still accepts ordinary slugs, so the
|
|
8
|
+
* reservation can't silently regress before the multi-org routing is built.
|
|
9
|
+
*/
|
|
10
|
+
describe('SlugSchema', () => {
|
|
11
|
+
it('accepts a normal lowercase-hyphenated slug', () => {
|
|
12
|
+
expect(SlugSchema.safeParse('acme-studio').success).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
it('rejects every reserved slug', () => {
|
|
15
|
+
for (const reserved of RESERVED_SLUGS) {
|
|
16
|
+
const result = SlugSchema.safeParse(reserved);
|
|
17
|
+
expect(result.success, `"${reserved}" must be rejected`).toBe(false);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
it('reserves the multi-org namespace prefix `o` even though the length gate already blocks it', () => {
|
|
21
|
+
// `o` is 1 char, so `min(3)` rejects it regardless — but it stays in the
|
|
22
|
+
// reserved set so intent survives any future relaxation of the length rule.
|
|
23
|
+
expect(RESERVED_SLUGS).toContain('o');
|
|
24
|
+
expect(SlugSchema.safeParse('o').success).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
it('still enforces the format rules (length, charset)', () => {
|
|
27
|
+
expect(SlugSchema.safeParse('ab').success).toBe(false); // too short
|
|
28
|
+
expect(SlugSchema.safeParse('-lead').success).toBe(false); // leading hyphen
|
|
29
|
+
expect(SlugSchema.safeParse('UPPER').success).toBe(false); // uppercase
|
|
30
|
+
expect(SlugSchema.safeParse('a'.repeat(64)).success).toBe(false); // too long
|
|
31
|
+
});
|
|
32
|
+
it('does not over-reject: a slug that merely contains a reserved word is fine', () => {
|
|
33
|
+
// The guard is exact-match, not substring — `team-alpha` is not `team`.
|
|
34
|
+
expect(SlugSchema.safeParse('team-alpha').success).toBe(true);
|
|
35
|
+
expect(SlugSchema.safeParse('my-api').success).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=slug-schema.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug-schema.test.js","sourceRoot":"","sources":["../../../src/organizations/__tests__/slug-schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE3D;;;;;;GAMG;AACH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACtC,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,QAAQ,oBAAoB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtE,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2FAA2F,EAAE,GAAG,EAAE;QACpG,yEAAyE;QACzE,4EAA4E;QAC5E,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY;QACpE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB;QAC5E,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY;QACvE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACpF,wEAAwE;QACxE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -2,5 +2,5 @@ export type { Organization, OrgMember, OrgAssets } from './types.js';
|
|
|
2
2
|
export type { IOrgStore } from './interface.js';
|
|
3
3
|
export { orgPaths } from './paths.js';
|
|
4
4
|
export type { OrgRole, OrgPermission, OrgAssetKind, CreateOrgInput, UpdateOrgInput } from './schemas.js';
|
|
5
|
-
export { OrgRoleSchema, OrgPermissionSchema, OrgAssetKindSchema, ALL_ORG_ASSET_KINDS, SlugSchema, CreateOrgSchema, UpdateOrgSchema, ALL_ORG_PERMISSIONS, DEFAULT_ORG_PERMISSIONS, OWNER_ADMIN_ONLY_PERMISSIONS, MEMBER_ASSIGNABLE_PERMISSIONS } from './schemas.js';
|
|
5
|
+
export { OrgRoleSchema, OrgPermissionSchema, OrgAssetKindSchema, ALL_ORG_ASSET_KINDS, SlugSchema, RESERVED_SLUGS, CreateOrgSchema, UpdateOrgSchema, ALL_ORG_PERMISSIONS, DEFAULT_ORG_PERMISSIONS, OWNER_ADMIN_ONLY_PERMISSIONS, MEMBER_ASSIGNABLE_PERMISSIONS } from './schemas.js';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organizations/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACrE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EACX,OAAO,EACP,aAAa,EACb,YAAY,EACZ,cAAc,EACd,cAAc,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,EAC5B,6BAA6B,EAC7B,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organizations/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACrE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EACX,OAAO,EACP,aAAa,EACb,YAAY,EACZ,cAAc,EACd,cAAc,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,EAC5B,6BAA6B,EAC7B,MAAM,cAAc,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { orgPaths } from './paths.js';
|
|
2
|
-
export { OrgRoleSchema, OrgPermissionSchema, OrgAssetKindSchema, ALL_ORG_ASSET_KINDS, SlugSchema, CreateOrgSchema, UpdateOrgSchema, ALL_ORG_PERMISSIONS, DEFAULT_ORG_PERMISSIONS, OWNER_ADMIN_ONLY_PERMISSIONS, MEMBER_ASSIGNABLE_PERMISSIONS } from './schemas.js';
|
|
2
|
+
export { OrgRoleSchema, OrgPermissionSchema, OrgAssetKindSchema, ALL_ORG_ASSET_KINDS, SlugSchema, RESERVED_SLUGS, CreateOrgSchema, UpdateOrgSchema, ALL_ORG_PERMISSIONS, DEFAULT_ORG_PERMISSIONS, OWNER_ADMIN_ONLY_PERMISSIONS, MEMBER_ASSIGNABLE_PERMISSIONS } from './schemas.js';
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/organizations/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,OAAO,EACN,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,EAC5B,6BAA6B,EAC7B,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/organizations/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,OAAO,EACN,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,uBAAuB,EACvB,4BAA4B,EAC5B,6BAA6B,EAC7B,MAAM,cAAc,CAAC"}
|
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Top-level path segments a tenant slug must never equal, so a slug can never
|
|
4
|
+
* shadow (or be shadowed by) a route (audit D4). Two forces meet here:
|
|
5
|
+
* - Reserved multi-org namespace: `/o/{slug}/` is the decided shape for
|
|
6
|
+
* per-org URLs (see ADR 0006). `o` is reserved even though the length gate
|
|
7
|
+
* below already makes a 1-char slug impossible — belt-and-suspenders, and it
|
|
8
|
+
* documents intent for anyone relaxing the length rule later.
|
|
9
|
+
* - Existing flat top-level routes: reserving these keeps a future move to
|
|
10
|
+
* `/o/{slug}/…` (or any flat tenant route) collision-free from day one,
|
|
11
|
+
* before any external link is minted against a slug.
|
|
12
|
+
* Lowercase; the slug is lowercased/matched case-insensitively so `Admin` can't
|
|
13
|
+
* slip through. Keep in sync with the route tree's top-level directories.
|
|
14
|
+
*/
|
|
15
|
+
export declare const RESERVED_SLUGS: readonly string[];
|
|
16
|
+
/** Lowercase alphanumeric with internal hyphens, 3–63 chars, not a reserved word. */
|
|
3
17
|
export declare const SlugSchema: z.ZodString;
|
|
4
18
|
export declare const OrgRoleSchema: z.ZodEnum<{
|
|
5
|
-
owner: "owner";
|
|
6
19
|
admin: "admin";
|
|
20
|
+
owner: "owner";
|
|
7
21
|
member: "member";
|
|
8
22
|
}>;
|
|
9
23
|
export type OrgRole = z.infer<typeof OrgRoleSchema>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/organizations/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/organizations/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAY3C,CAAC;AAIF,qFAAqF;AACrF,eAAO,MAAM,UAAU,aAUpB,CAAC;AAEJ,eAAO,MAAM,aAAa;;;;EAAuC,CAAC;AAClE,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;EAA8B,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,mBAAmB,EAAE,SAAS,YAAY,EAA+B,CAAC;AAEvF,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB;;;;;EAK9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,mBAAmB,EAAE,SAAS,aAAa,EAAgC,CAAC;AAEzF,sDAAsD;AACtD,eAAO,MAAM,4BAA4B,EAAE,SAAS,aAAa,EAGhE,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,SAAS,aAAa,EAEjE,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAI7E,CAAC;AAEF,eAAO,MAAM,eAAe;;;iBAG1B,CAAC;AAEH,eAAO,MAAM,eAAe;;;iBAA4B,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAC7D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
|
|
@@ -1,10 +1,40 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Top-level path segments a tenant slug must never equal, so a slug can never
|
|
4
|
+
* shadow (or be shadowed by) a route (audit D4). Two forces meet here:
|
|
5
|
+
* - Reserved multi-org namespace: `/o/{slug}/` is the decided shape for
|
|
6
|
+
* per-org URLs (see ADR 0006). `o` is reserved even though the length gate
|
|
7
|
+
* below already makes a 1-char slug impossible — belt-and-suspenders, and it
|
|
8
|
+
* documents intent for anyone relaxing the length rule later.
|
|
9
|
+
* - Existing flat top-level routes: reserving these keeps a future move to
|
|
10
|
+
* `/o/{slug}/…` (or any flat tenant route) collision-free from day one,
|
|
11
|
+
* before any external link is minted against a slug.
|
|
12
|
+
* Lowercase; the slug is lowercased/matched case-insensitively so `Admin` can't
|
|
13
|
+
* slip through. Keep in sync with the route tree's top-level directories.
|
|
14
|
+
*/
|
|
15
|
+
export const RESERVED_SLUGS = [
|
|
16
|
+
'o',
|
|
17
|
+
'api',
|
|
18
|
+
'admin',
|
|
19
|
+
'auth',
|
|
20
|
+
'login',
|
|
21
|
+
'logout',
|
|
22
|
+
'setup',
|
|
23
|
+
'team',
|
|
24
|
+
'library',
|
|
25
|
+
'projects',
|
|
26
|
+
'accept-invite'
|
|
27
|
+
];
|
|
28
|
+
const RESERVED_SLUG_SET = new Set(RESERVED_SLUGS);
|
|
29
|
+
/** Lowercase alphanumeric with internal hyphens, 3–63 chars, not a reserved word. */
|
|
3
30
|
export const SlugSchema = z
|
|
4
31
|
.string()
|
|
5
32
|
.min(3, 'Slug must be at least 3 characters')
|
|
6
33
|
.max(63, 'Slug must be at most 63 characters')
|
|
7
|
-
.regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/, 'Slug must be lowercase alphanumeric with hyphens (no leading/trailing/consecutive hyphens)')
|
|
34
|
+
.regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/, 'Slug must be lowercase alphanumeric with hyphens (no leading/trailing/consecutive hyphens)')
|
|
35
|
+
.refine((s) => !RESERVED_SLUG_SET.has(s), {
|
|
36
|
+
message: 'Slug is reserved and cannot be used'
|
|
37
|
+
});
|
|
8
38
|
export const OrgRoleSchema = z.enum(['owner', 'admin', 'member']);
|
|
9
39
|
/**
|
|
10
40
|
* Kinds of org-scoped branding asset. Adding a new kind is a single entry here
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/organizations/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/organizations/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsB;IAChD,GAAG;IACH,KAAK;IACL,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,MAAM;IACN,SAAS;IACT,UAAU;IACV,eAAe;CACf,CAAC;AAEF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;AAElD,qFAAqF;AACrF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC;KACzB,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,EAAE,oCAAoC,CAAC;KAC5C,GAAG,CAAC,EAAE,EAAE,oCAAoC,CAAC;KAC7C,KAAK,CACL,iCAAiC,EACjC,4FAA4F,CAC5F;KACA,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;IACzC,OAAO,EAAE,qCAAqC;CAC9C,CAAC,CAAC;AAEJ,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAGlE;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAG9D,MAAM,CAAC,MAAM,mBAAmB,GAA4B,kBAAkB,CAAC,OAAO,CAAC;AAEvF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC;IACzC,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,iBAAiB;CACjB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,mBAAmB,GAA6B,mBAAmB,CAAC,OAAO,CAAC;AAEzF,sDAAsD;AACtD,MAAM,CAAC,MAAM,4BAA4B,GAA6B;IACrE,oBAAoB;IACpB,oBAAoB;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAA6B,mBAAmB,CAAC,MAAM,CAChG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAChD,CAAC;AAEF,yEAAyE;AACzE,MAAM,CAAC,MAAM,uBAAuB,GAA8C;IACjF,KAAK,EAAE,CAAC,GAAG,mBAAmB,CAAC;IAC/B,KAAK,EAAE,CAAC,GAAG,mBAAmB,CAAC;IAC/B,MAAM,EAAE,EAAE;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjE,IAAI,EAAE,UAAU;CAChB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC"}
|
|
@@ -26,6 +26,11 @@ export interface SolveMetricSinkConformanceOptions {
|
|
|
26
26
|
createSink: () => Promise<ISolveMetricSink> | ISolveMetricSink;
|
|
27
27
|
/** Read every persisted metric back, normalized to `RecordedSolveMetric`. */
|
|
28
28
|
readRows: () => Promise<RecordedSolveMetric[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Force a buffering sink to write everything it holds. Called before every
|
|
31
|
+
* `readRows`. Omit for sinks that persist synchronously on `record`.
|
|
32
|
+
*/
|
|
33
|
+
flushSink?: (sink: ISolveMetricSink) => Promise<void> | void;
|
|
29
34
|
/**
|
|
30
35
|
* Build a sink whose backing store is broken so writes fail. Used to prove
|
|
31
36
|
* `record` swallows errors. Omit if the adapter can't simulate a failure;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solveMetricSinkSuite.d.ts","sourceRoot":"","sources":["../../../src/testing/suites/solveMetricSinkSuite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAkB,MAAM,gBAAgB,CAAC;AAEpF;;;;GAIG;AACH,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACvD,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iCAAiC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,UAAU,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;IAC/D,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC/C;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;IACvE,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACrC;AAsBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,iCAAiC,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"solveMetricSinkSuite.d.ts","sourceRoot":"","sources":["../../../src/testing/suites/solveMetricSinkSuite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAkB,MAAM,gBAAgB,CAAC;AAEpF;;;;GAIG;AACH,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACvD,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iCAAiC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,UAAU,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;IAC/D,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC/C;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7D;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;IACvE,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACrC;AAsBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,iCAAiC,GAAG,IAAI,CAgF3F"}
|
|
@@ -30,9 +30,15 @@ function baseMetric(overrides = {}) {
|
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
32
|
export function runSolveMetricSinkConformance(opts) {
|
|
33
|
-
const { name, createSink, readRows, createFailingSink, cleanup } = opts;
|
|
33
|
+
const { name, createSink, readRows, flushSink, createFailingSink, cleanup } = opts;
|
|
34
34
|
describe(`ISolveMetricSink conformance: ${name}`, () => {
|
|
35
35
|
let sink;
|
|
36
|
+
/** Read persisted rows, first draining anything the sink is buffering. */
|
|
37
|
+
async function drainAndRead() {
|
|
38
|
+
if (flushSink)
|
|
39
|
+
await flushSink(sink);
|
|
40
|
+
return readRows();
|
|
41
|
+
}
|
|
36
42
|
beforeEach(async () => {
|
|
37
43
|
sink = await createSink();
|
|
38
44
|
});
|
|
@@ -43,28 +49,28 @@ export function runSolveMetricSinkConformance(opts) {
|
|
|
43
49
|
it('persists a successful solve with all fields intact', async () => {
|
|
44
50
|
const metric = baseMetric();
|
|
45
51
|
await sink.record(sysCtx('user-1'), metric);
|
|
46
|
-
const rows = await
|
|
52
|
+
const rows = await drainAndRead();
|
|
47
53
|
expect(rows).toHaveLength(1);
|
|
48
54
|
expect(rows[0]).toMatchObject({ ...metric, actorId: 'user-1' });
|
|
49
55
|
});
|
|
50
56
|
it('records the actor from the RequestContext', async () => {
|
|
51
57
|
await sink.record(sysCtx('user-xyz'), baseMetric());
|
|
52
|
-
const rows = await
|
|
58
|
+
const rows = await drainAndRead();
|
|
53
59
|
expect(rows[0].actorId).toBe('user-xyz');
|
|
54
60
|
});
|
|
55
61
|
it('falls back to "system" when the context has no user id', async () => {
|
|
56
62
|
await sink.record(sysCtx(''), baseMetric());
|
|
57
|
-
const rows = await
|
|
63
|
+
const rows = await drainAndRead();
|
|
58
64
|
expect(rows[0].actorId).toBe('system');
|
|
59
65
|
});
|
|
60
66
|
it('persists a failed solve with its failureKind and zero duration', async () => {
|
|
61
67
|
await sink.record(sysCtx('user-1'), baseMetric({ ok: false, failureKind: 'timeout', durationMs: 0 }));
|
|
62
|
-
const rows = await
|
|
68
|
+
const rows = await drainAndRead();
|
|
63
69
|
expect(rows[0]).toMatchObject({ ok: false, failureKind: 'timeout', durationMs: 0 });
|
|
64
70
|
});
|
|
65
71
|
it('persists error/warning counts on an otherwise-ok solve', async () => {
|
|
66
72
|
await sink.record(sysCtx('user-1'), baseMetric({ errorCount: 2, warningCount: 5 }));
|
|
67
|
-
const rows = await
|
|
73
|
+
const rows = await drainAndRead();
|
|
68
74
|
expect(rows[0]).toMatchObject({ ok: true, errorCount: 2, warningCount: 5 });
|
|
69
75
|
});
|
|
70
76
|
it('persists null definition/version/org for remote-URL solves', async () => {
|
|
@@ -74,14 +80,17 @@ export function runSolveMetricSinkConformance(opts) {
|
|
|
74
80
|
versionId: null,
|
|
75
81
|
orgId: null
|
|
76
82
|
}));
|
|
77
|
-
const rows = await
|
|
83
|
+
const rows = await drainAndRead();
|
|
78
84
|
expect(rows[0]).toMatchObject({ definitionId: null, versionId: null, orgId: null });
|
|
79
85
|
});
|
|
80
86
|
if (createFailingSink) {
|
|
81
87
|
it('does not throw when the backing write fails', async () => {
|
|
82
88
|
const failing = await createFailingSink();
|
|
83
|
-
// The contract: record swallows the failure and resolves.
|
|
89
|
+
// The contract: record swallows the failure and resolves. For a
|
|
90
|
+
// buffering sink the write happens on flush, so that must swallow too.
|
|
84
91
|
await expect(failing.record(sysCtx('user-1'), baseMetric())).resolves.toBeUndefined();
|
|
92
|
+
if (flushSink)
|
|
93
|
+
await expect(flushSink(failing)).resolves.not.toThrow();
|
|
85
94
|
});
|
|
86
95
|
}
|
|
87
96
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solveMetricSinkSuite.js","sourceRoot":"","sources":["../../../src/testing/suites/solveMetricSinkSuite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"solveMetricSinkSuite.js","sourceRoot":"","sources":["../../../src/testing/suites/solveMetricSinkSuite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storageProviderSuite.d.ts","sourceRoot":"","sources":["../../../src/testing/suites/storageProviderSuite.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,WAAW,iCAAiC;IACjD,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,aAAa,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;CAClE;
|
|
1
|
+
{"version":3,"file":"storageProviderSuite.d.ts","sourceRoot":"","sources":["../../../src/testing/suites/storageProviderSuite.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,WAAW,iCAAiC;IACjD,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,aAAa,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;CAClE;AAoBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,iCAAiC,GAAG,IAAI,CAsL3F"}
|
|
@@ -8,6 +8,19 @@ import { describe, it, expect } from 'vitest';
|
|
|
8
8
|
function bytes(text) {
|
|
9
9
|
return new TextEncoder().encode(text);
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Fast content fingerprint (FNV-1a) for large-payload comparison. A single
|
|
13
|
+
* linear pass — orders of magnitude cheaper than vitest's `toEqual` deep
|
|
14
|
+
* walk over a megabyte-scale typed array.
|
|
15
|
+
*/
|
|
16
|
+
function checksum(data) {
|
|
17
|
+
let h = 0x811c9dc5;
|
|
18
|
+
for (let i = 0; i < data.length; i++) {
|
|
19
|
+
h ^= data[i];
|
|
20
|
+
h = Math.imul(h, 0x01000193);
|
|
21
|
+
}
|
|
22
|
+
return h >>> 0;
|
|
23
|
+
}
|
|
11
24
|
export function runStorageProviderConformance(opts) {
|
|
12
25
|
const { name, createStorage } = opts;
|
|
13
26
|
describe(`IStorageProvider conformance: ${name}`, () => {
|
|
@@ -94,6 +107,12 @@ export function runStorageProviderConformance(opts) {
|
|
|
94
107
|
const got = await storage.get('binary/data.bin');
|
|
95
108
|
expect(got).toEqual(binary);
|
|
96
109
|
});
|
|
110
|
+
// Runs with a raised timeout: the round-trip itself is ~1ms, but this test
|
|
111
|
+
// carries fixed worker overhead (~1.5s locally) that inflates several-fold
|
|
112
|
+
// on a loaded CI runner where all packages' suites run concurrently — enough
|
|
113
|
+
// to blow the default 5s. Comparison uses a checksum, not `toEqual`, whose
|
|
114
|
+
// element-by-element deep walk over a million-entry Uint8Array alone cost
|
|
115
|
+
// >1.5s.
|
|
97
116
|
it('handles large data', async () => {
|
|
98
117
|
const storage = await createStorage();
|
|
99
118
|
const large = new Uint8Array(1024 * 1024); // 1 MB
|
|
@@ -102,8 +121,10 @@ export function runStorageProviderConformance(opts) {
|
|
|
102
121
|
}
|
|
103
122
|
await storage.put('large/file.bin', large);
|
|
104
123
|
const got = await storage.get('large/file.bin');
|
|
105
|
-
expect(got).
|
|
106
|
-
|
|
124
|
+
expect(got).not.toBeNull();
|
|
125
|
+
expect(got.length).toBe(large.length);
|
|
126
|
+
expect(checksum(got)).toBe(checksum(large));
|
|
127
|
+
}, 30_000);
|
|
107
128
|
it('put with contentType is stored', async () => {
|
|
108
129
|
const storage = await createStorage();
|
|
109
130
|
const data = bytes('{"type":"octet"}');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storageProviderSuite.js","sourceRoot":"","sources":["../../../src/testing/suites/storageProviderSuite.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"storageProviderSuite.js","sourceRoot":"","sources":["../../../src/testing/suites/storageProviderSuite.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/auth.d.ts
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Authentication provider interface.
|
|
3
|
-
*
|
|
4
|
-
* Implement this to plug in any auth backend:
|
|
5
|
-
* - Local HMAC sessions (built-in default)
|
|
6
|
-
* - Firebase Auth
|
|
7
|
-
* - Supabase Auth
|
|
8
|
-
* - AWS Cognito
|
|
9
|
-
* - Any OIDC/JWT provider
|
|
10
|
-
*/
|
|
11
|
-
export type UserRole = 'platform_admin' | 'user';
|
|
12
|
-
export interface AuthUser {
|
|
13
|
-
id: string;
|
|
14
|
-
email?: string;
|
|
15
|
-
displayName?: string;
|
|
16
|
-
role: UserRole;
|
|
17
|
-
metadata?: Record<string, unknown>;
|
|
18
|
-
}
|
|
19
|
-
export interface IAuthProvider {
|
|
20
|
-
/**
|
|
21
|
-
* Verify a token string — session cookie value, JWT, Firebase ID token, etc.
|
|
22
|
-
* Returns the authenticated user, or null if the token is invalid or expired.
|
|
23
|
-
*/
|
|
24
|
-
verifyToken(token: string): Promise<AuthUser | null>;
|
|
25
|
-
/**
|
|
26
|
-
* Look up a user by their provider-specific ID.
|
|
27
|
-
* Returns null if the user does not exist.
|
|
28
|
-
*/
|
|
29
|
-
getUser(id: string): Promise<AuthUser | null>;
|
|
30
|
-
/**
|
|
31
|
-
* Create a new opaque session token for an authenticated user.
|
|
32
|
-
* Stored in a cookie by the transport layer. Format is provider-specific:
|
|
33
|
-
* HMAC string, signed JWT, Firebase custom token, etc.
|
|
34
|
-
*/
|
|
35
|
-
createSessionToken(user: AuthUser): Promise<string>;
|
|
36
|
-
/**
|
|
37
|
-
* Verify login credentials (email + password).
|
|
38
|
-
* Returns the authenticated user, or null if credentials are invalid.
|
|
39
|
-
* Email may be an empty string for password-only auth (no users.json configured).
|
|
40
|
-
*/
|
|
41
|
-
verifyLoginCredentials(email: string, password: string): Promise<AuthUser | null>;
|
|
42
|
-
/**
|
|
43
|
-
* List all users. Returns null if this provider does not support user management
|
|
44
|
-
* (e.g. single-password mode).
|
|
45
|
-
*/
|
|
46
|
-
listUsers(): Promise<AuthUser[] | null>;
|
|
47
|
-
/**
|
|
48
|
-
* Create a new user. Returns null if not supported.
|
|
49
|
-
*/
|
|
50
|
-
createUser(email: string, password: string, role: UserRole): Promise<AuthUser | null>;
|
|
51
|
-
/**
|
|
52
|
-
* Update a user's role. Returns false if not supported or user not found.
|
|
53
|
-
*/
|
|
54
|
-
updateUserRole(id: string, role: UserRole): Promise<boolean>;
|
|
55
|
-
/**
|
|
56
|
-
* Delete a user by ID. Returns false if not supported or user not found.
|
|
57
|
-
*/
|
|
58
|
-
deleteUser(id: string): Promise<boolean>;
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=auth.d.ts.map
|
package/dist/auth.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,QAAQ,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC7B;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAErD;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAE9C;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpD;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAIlF;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC;IAExC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAEtF;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7D;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC"}
|
package/dist/auth.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Authentication provider interface.
|
|
3
|
-
*
|
|
4
|
-
* Implement this to plug in any auth backend:
|
|
5
|
-
* - Local HMAC sessions (built-in default)
|
|
6
|
-
* - Firebase Auth
|
|
7
|
-
* - Supabase Auth
|
|
8
|
-
* - AWS Cognito
|
|
9
|
-
* - Any OIDC/JWT provider
|
|
10
|
-
*/
|
|
11
|
-
export {};
|
|
12
|
-
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
package/dist/compute.d.ts
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compute server provider interface.
|
|
3
|
-
*
|
|
4
|
-
* Implement to support:
|
|
5
|
-
* - Single server (built-in default)
|
|
6
|
-
* - Server pool with load balancing
|
|
7
|
-
* - Per-definition routing (e.g. definition A always goes to server B)
|
|
8
|
-
* - Dynamic provisioning
|
|
9
|
-
*/
|
|
10
|
-
export interface ComputeServerConfig {
|
|
11
|
-
/** UUID v4 primary key */
|
|
12
|
-
id: string;
|
|
13
|
-
/** Human-readable display label */
|
|
14
|
-
label: string;
|
|
15
|
-
/** Base URL of the Rhino.Compute instance, e.g. http://localhost:5000 */
|
|
16
|
-
serverUrl: string;
|
|
17
|
-
/** Optional API key sent as RhinoComputeKey header */
|
|
18
|
-
apiKey?: string;
|
|
19
|
-
/** Request timeout in milliseconds. Default: 30000 */
|
|
20
|
-
timeoutMs?: number;
|
|
21
|
-
/** Number of retries on transient failure. Default: 0 */
|
|
22
|
-
retryCount?: number;
|
|
23
|
-
}
|
|
24
|
-
export interface ComputeConfig {
|
|
25
|
-
servers: ComputeServerConfig[];
|
|
26
|
-
/** UUID of the server to use when no routing rule matches. Falls back to servers[0]. */
|
|
27
|
-
defaultServerId?: string;
|
|
28
|
-
}
|
|
29
|
-
export interface SolveRequest {
|
|
30
|
-
/** GUID of the definition being solved — enables per-definition routing */
|
|
31
|
-
definitionGuid?: string;
|
|
32
|
-
/** Arbitrary hints for routing decisions (e.g. required plugin versions) */
|
|
33
|
-
hints?: Record<string, string>;
|
|
34
|
-
}
|
|
35
|
-
export interface IComputeServerProvider {
|
|
36
|
-
/** Resolve which compute server to use for a given solve request. */
|
|
37
|
-
getServer(request?: SolveRequest): Promise<ComputeServerConfig>;
|
|
38
|
-
/** Return the default server, or undefined if none configured. */
|
|
39
|
-
getDefaultServer(): Promise<ComputeServerConfig | undefined>;
|
|
40
|
-
/** Look up a specific server by its UUID. Returns undefined if not found. */
|
|
41
|
-
getServerById(id: string): Promise<ComputeServerConfig | undefined>;
|
|
42
|
-
/** Return the full config. Used by the admin UI. */
|
|
43
|
-
getConfig(): Promise<ComputeConfig>;
|
|
44
|
-
/** Replace the full config atomically. Used by the admin UI. */
|
|
45
|
-
saveConfig(config: ComputeConfig): Promise<void>;
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=compute.d.ts.map
|
package/dist/compute.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../src/compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,mBAAmB;IACnC,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,wFAAwF;IACxF,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC5B,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACtC,qEAAqE;IACrE,SAAS,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEhE,kEAAkE;IAClE,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IAE7D,6EAA6E;IAC7E,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IAEpE,oDAAoD;IACpD,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAEpC,gEAAgE;IAChE,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD"}
|
package/dist/compute.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compute server provider interface.
|
|
3
|
-
*
|
|
4
|
-
* Implement to support:
|
|
5
|
-
* - Single server (built-in default)
|
|
6
|
-
* - Server pool with load balancing
|
|
7
|
-
* - Per-definition routing (e.g. definition A always goes to server B)
|
|
8
|
-
* - Dynamic provisioning
|
|
9
|
-
*/
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=compute.js.map
|
package/dist/compute.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compute.js","sourceRoot":"","sources":["../src/compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { IDataProvider } from '../data/interface.js';
|
|
2
|
-
import type { IStorageProvider } from '../storage/interface.js';
|
|
3
|
-
import type { RequestContext } from '../context.js';
|
|
4
|
-
import type { DefinitionRecord, DefinitionFileExt, DefinitionMeta } from './types.js';
|
|
5
|
-
import type { UpdateMetadataInput } from './schemas.js';
|
|
6
|
-
export interface CreateDefinitionInput {
|
|
7
|
-
guid: string;
|
|
8
|
-
projectId: string;
|
|
9
|
-
ownerId: string;
|
|
10
|
-
fileExt: DefinitionFileExt;
|
|
11
|
-
meta: DefinitionMeta;
|
|
12
|
-
computeServerId?: string;
|
|
13
|
-
maxHistory?: number;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Default age threshold after which a 'pending' record is considered stale.
|
|
17
|
-
* Conservative — covers slow uploads over weak connections.
|
|
18
|
-
*/
|
|
19
|
-
export declare const PENDING_GC_AGE_MS: number;
|
|
20
|
-
/**
|
|
21
|
-
* Orchestrates writes that span IDataProvider + IStorageProvider.
|
|
22
|
-
*
|
|
23
|
-
* Ordering rules (see Phase 4 of the provider refactor):
|
|
24
|
-
*
|
|
25
|
-
* create — metadata-first:
|
|
26
|
-
* 1. Write record with status='pending'
|
|
27
|
-
* 2. Upload blob
|
|
28
|
-
* 3. Flip status to 'ready'
|
|
29
|
-
* If step 2 fails the record stays 'pending' with no blob. List queries
|
|
30
|
-
* filter 'pending' by default, so no consumer sees the half-written state.
|
|
31
|
-
* The janitor (gcStalePending) sweeps records older than PENDING_GC_AGE_MS.
|
|
32
|
-
*
|
|
33
|
-
* updateFile — best-effort with retry-safe shape:
|
|
34
|
-
* 1. Archive current file to history blob
|
|
35
|
-
* 2. Append history entry to record
|
|
36
|
-
* 3. Write new file to the active blob path
|
|
37
|
-
* 4. Prune history beyond maxHistory
|
|
38
|
-
* A failure between 2 and 3 leaves the record pointing at a missing active
|
|
39
|
-
* blob. The operation is idempotent — retrying with the same file restores
|
|
40
|
-
* a consistent state. This is an acknowledged limitation; the create path
|
|
41
|
-
* is where orphan risk is highest and is the one we fully guard.
|
|
42
|
-
*/
|
|
43
|
-
export declare class DefinitionService {
|
|
44
|
-
private data;
|
|
45
|
-
private storage;
|
|
46
|
-
constructor(data: IDataProvider, storage: IStorageProvider);
|
|
47
|
-
create(ctx: RequestContext, input: CreateDefinitionInput, file: Uint8Array): Promise<DefinitionRecord>;
|
|
48
|
-
updateFile(ctx: RequestContext, guid: string, file: Uint8Array, ext: DefinitionFileExt, originalName: string): Promise<void>;
|
|
49
|
-
updateMeta(ctx: RequestContext, guid: string, patch: UpdateMetadataInput): Promise<void>;
|
|
50
|
-
saveCoverImage(ctx: RequestContext, guid: string, imageData: Uint8Array): Promise<void>;
|
|
51
|
-
revertToVersion(ctx: RequestContext, guid: string, ref: string): Promise<void>;
|
|
52
|
-
delete(ctx: RequestContext, guid: string): Promise<void>;
|
|
53
|
-
/**
|
|
54
|
-
* Janitor — delete records stuck in 'pending' for longer than ageMs and
|
|
55
|
-
* any blobs they may have written. Safe to run on a schedule.
|
|
56
|
-
* Runs under SYSTEM_CONTEXT; callers don't pass one.
|
|
57
|
-
*
|
|
58
|
-
* @returns Number of records reclaimed.
|
|
59
|
-
*/
|
|
60
|
-
gcStalePending(ageMs?: number): Promise<number>;
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/definitions/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EACX,gBAAgB,EAEhB,iBAAiB,EACjB,cAAc,EACd,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAAiB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,iBAAiB;IAE5B,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,OAAO;gBADP,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,gBAAgB;IAG5B,MAAM,CACX,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,qBAAqB,EAC5B,IAAI,EAAE,UAAU,GACd,OAAO,CAAC,gBAAgB,CAAC;IAiCtB,UAAU,CACf,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,iBAAiB,EACtB,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAwCV,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxF,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvF,eAAe,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9E,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9D;;;;;;OAMG;IACG,cAAc,CAAC,KAAK,GAAE,MAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;CASxE"}
|