@superblocksteam/shared 0.9589.5 → 0.9590.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/dist/database-lifecycle/index.d.ts +60 -1
- package/dist/database-lifecycle/index.d.ts.map +1 -1
- package/dist/database-lifecycle/index.js +34 -0
- package/dist/database-lifecycle/index.js.map +1 -1
- package/dist/types/application/index.d.ts +1 -1
- package/dist/types/application/index.d.ts.map +1 -1
- package/dist/types/application/index.js.map +1 -1
- package/dist/types/audit/ocsf.d.ts.map +1 -1
- package/dist/types/audit/ocsf.js +8 -1
- package/dist/types/audit/ocsf.js.map +1 -1
- package/dist/types/plugin/form.d.ts +7 -0
- package/dist/types/plugin/form.d.ts.map +1 -1
- package/dist/types/plugin/form.js +22 -1
- package/dist/types/plugin/form.js.map +1 -1
- package/dist/types/plugin/form.test.d.ts +2 -0
- package/dist/types/plugin/form.test.d.ts.map +1 -0
- package/dist/types/plugin/form.test.js +156 -0
- package/dist/types/plugin/form.test.js.map +1 -0
- package/dist/types/policyGate/index.d.ts +21 -1
- package/dist/types/policyGate/index.d.ts.map +1 -1
- package/dist/types/rbac/index.d.ts +5 -0
- package/dist/types/rbac/index.d.ts.map +1 -1
- package/dist/types/rbac/index.js +5 -0
- package/dist/types/rbac/index.js.map +1 -1
- package/dist/types/reviewPolicy/index.d.ts +35 -0
- package/dist/types/reviewPolicy/index.d.ts.map +1 -1
- package/dist/types/user/index.d.ts +2 -0
- package/dist/types/user/index.d.ts.map +1 -1
- package/dist/types/user/index.js.map +1 -1
- package/dist/utils/string.d.ts +2 -0
- package/dist/utils/string.d.ts.map +1 -1
- package/dist/utils/string.js +13 -1
- package/dist/utils/string.js.map +1 -1
- package/dist/utils/string.test.js +28 -0
- package/dist/utils/string.test.js.map +1 -1
- package/dist-esm/database-lifecycle/index.d.ts +60 -1
- package/dist-esm/database-lifecycle/index.d.ts.map +1 -1
- package/dist-esm/database-lifecycle/index.js +32 -0
- package/dist-esm/database-lifecycle/index.js.map +1 -1
- package/dist-esm/types/application/index.d.ts +1 -1
- package/dist-esm/types/application/index.d.ts.map +1 -1
- package/dist-esm/types/application/index.js.map +1 -1
- package/dist-esm/types/audit/ocsf.d.ts.map +1 -1
- package/dist-esm/types/audit/ocsf.js +8 -1
- package/dist-esm/types/audit/ocsf.js.map +1 -1
- package/dist-esm/types/plugin/form.d.ts +7 -0
- package/dist-esm/types/plugin/form.d.ts.map +1 -1
- package/dist-esm/types/plugin/form.js +20 -0
- package/dist-esm/types/plugin/form.js.map +1 -1
- package/dist-esm/types/plugin/form.test.d.ts +2 -0
- package/dist-esm/types/plugin/form.test.d.ts.map +1 -0
- package/dist-esm/types/plugin/form.test.js +154 -0
- package/dist-esm/types/plugin/form.test.js.map +1 -0
- package/dist-esm/types/policyGate/index.d.ts +21 -1
- package/dist-esm/types/policyGate/index.d.ts.map +1 -1
- package/dist-esm/types/rbac/index.d.ts +5 -0
- package/dist-esm/types/rbac/index.d.ts.map +1 -1
- package/dist-esm/types/rbac/index.js +5 -0
- package/dist-esm/types/rbac/index.js.map +1 -1
- package/dist-esm/types/reviewPolicy/index.d.ts +35 -0
- package/dist-esm/types/reviewPolicy/index.d.ts.map +1 -1
- package/dist-esm/types/user/index.d.ts +2 -0
- package/dist-esm/types/user/index.d.ts.map +1 -1
- package/dist-esm/types/user/index.js.map +1 -1
- package/dist-esm/utils/string.d.ts +2 -0
- package/dist-esm/utils/string.d.ts.map +1 -1
- package/dist-esm/utils/string.js +11 -0
- package/dist-esm/utils/string.js.map +1 -1
- package/dist-esm/utils/string.test.js +29 -1
- package/dist-esm/utils/string.test.js.map +1 -1
- package/package.json +2 -2
- package/src/database-lifecycle/index.ts +156 -1
- package/src/types/application/index.ts +5 -0
- package/src/types/audit/ocsf.ts +8 -1
- package/src/types/plugin/form.test.ts +161 -0
- package/src/types/plugin/form.ts +22 -0
- package/src/types/policyGate/index.ts +26 -1
- package/src/types/rbac/index.ts +5 -0
- package/src/types/reviewPolicy/index.ts +34 -3
- package/src/types/user/index.ts +2 -0
- package/src/utils/string.test.ts +32 -1
- package/src/utils/string.ts +12 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/reviewPolicy/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/reviewPolicy/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,11 +40,13 @@ export type GetOrganizationGeneralResponseBody = {
|
|
|
40
40
|
name: string;
|
|
41
41
|
allowedDomains: Domain[];
|
|
42
42
|
roleSettings: RoleSettingsDto;
|
|
43
|
+
npmAllowInstallScripts?: boolean;
|
|
43
44
|
};
|
|
44
45
|
export type PatchOrganizationGeneralResponseBody = {
|
|
45
46
|
name?: string;
|
|
46
47
|
allowedDomains?: string[];
|
|
47
48
|
roleSettings?: RoleSettingsDto;
|
|
49
|
+
npmAllowInstallScripts?: boolean;
|
|
48
50
|
};
|
|
49
51
|
export type DataTreeUser = {
|
|
50
52
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/user/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,oBAAY,qBAAqB;IAC/B,mBAAmB,IAAI;IACvB,aAAa,IAAI;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,qBAAqB,CAAC;CAC/B;AAED,oBAAY,sBAAsB;IAChC,OAAO,IAAI;IACX,MAAM,IAAI;IACV,QAAQ,IAAI;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,sBAAsB,CAAC;IAC/B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;CAC/B;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/user/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/user/index.ts"],"names":[],"mappings":"AAWA,MAAM,CAAN,IAAY,qBAGX;AAHD,WAAY,qBAAqB;IAC/B,+FAAuB,CAAA;IACvB,mFAAiB,CAAA;AACnB,CAAC,EAHW,qBAAqB,KAArB,qBAAqB,QAGhC;AASD,MAAM,CAAN,IAAY,sBAIX;AAJD,WAAY,sBAAsB;IAChC,yEAAW,CAAA;IACX,uEAAU,CAAA;IACV,2EAAY,CAAA;AACd,CAAC,EAJW,sBAAsB,KAAtB,sBAAsB,QAIjC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/user/index.ts"],"names":[],"mappings":"AAWA,MAAM,CAAN,IAAY,qBAGX;AAHD,WAAY,qBAAqB;IAC/B,+FAAuB,CAAA;IACvB,mFAAiB,CAAA;AACnB,CAAC,EAHW,qBAAqB,KAArB,qBAAqB,QAGhC;AASD,MAAM,CAAN,IAAY,sBAIX;AAJD,WAAY,sBAAsB;IAChC,yEAAW,CAAA;IACX,uEAAU,CAAA;IACV,2EAAY,CAAA;AACd,CAAC,EAJW,sBAAsB,KAAtB,sBAAsB,QAIjC;AAyCD,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,iCAAmB,CAAA;IACnB,qCAAuB,CAAA;IACvB,6CAA+B,CAAA;AACjC,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAED,MAAM,CAAN,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,yCAA2B,CAAA;IAC3B,2BAAa,CAAA;AACf,CAAC,EAHW,UAAU,KAAV,UAAU,QAGrB;AAED,MAAM,CAAN,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,uCAA2B,CAAA;IAC3B,iCAAqB,CAAA;AACvB,CAAC,EAHW,QAAQ,KAAR,QAAQ,QAGnB;AAID,MAAM,CAAN,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B,0CAAqB,CAAA;IACrB,4CAAuB,CAAA;IACvB,sCAAiB,CAAA;IACjB,wCAAmB,CAAA;AACrB,CAAC,EALW,iBAAiB,KAAjB,iBAAiB,QAK5B;AAiBD,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,4CAA2B,CAAA;IAC3B,gCAAe,CAAA;AACjB,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAED,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC"}
|
|
@@ -3,5 +3,7 @@ export declare const snakeCaseToDisplay: (snakeCaseString: string) => string;
|
|
|
3
3
|
export declare const jsonPrettyPrint: (obj: unknown) => string;
|
|
4
4
|
export declare const EmailRegexString = "(([^<>()[\\].,;:\\s@\\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})";
|
|
5
5
|
export declare const validateEmail: (email: string) => boolean;
|
|
6
|
+
export declare const UUID_REGEX_STRING = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
|
|
7
|
+
export declare const isUuid: (value: unknown) => value is string;
|
|
6
8
|
export declare const getNextEntityName: (prefix: string, existingNames: string[], separator?: string) => string;
|
|
7
9
|
//# sourceMappingURL=string.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,GAAI,iBAAiB,MAAM,KAAG,MAE5D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,iBAAiB,MAAM,KAAG,MAE5D,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,OAAO,KAAG,MAE9C,CAAC;AAEF,eAAO,MAAM,gBAAgB,8IAC0G,CAAC;AAGxI,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,OAE7C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,eAAe,MAAM,EAAE,EAAE,kBAAe,WA0BzF,CAAC"}
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,GAAI,iBAAiB,MAAM,KAAG,MAE5D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,iBAAiB,MAAM,KAAG,MAE5D,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,OAAO,KAAG,MAE9C,CAAC;AAEF,eAAO,MAAM,gBAAgB,8IAC0G,CAAC;AAGxI,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,OAE7C,CAAC;AAQF,eAAO,MAAM,iBAAiB,iEAAiE,CAAC;AAEhG,eAAO,MAAM,MAAM,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAEhD,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,eAAe,MAAM,EAAE,EAAE,kBAAe,WA0BzF,CAAC"}
|
package/dist-esm/utils/string.js
CHANGED
|
@@ -12,6 +12,17 @@ const EmailRegexComplete = new RegExp(`^${EmailRegexString}$`);
|
|
|
12
12
|
export const validateEmail = (email) => {
|
|
13
13
|
return EmailRegexComplete.test(email);
|
|
14
14
|
};
|
|
15
|
+
// Matches canonical RFC 4122-style UUIDs (8-4-4-4-12 hex, case-insensitive).
|
|
16
|
+
// Intentionally strict: we want to reject inputs that PostgreSQL would later
|
|
17
|
+
// reject with `invalid input syntax for type uuid`, surfacing the boundary as
|
|
18
|
+
// a 4xx in our own validators instead of a 500 from the DB driver. Do NOT
|
|
19
|
+
// loosen this to a partial match or a "looks UUID-ish" regex — the strictness
|
|
20
|
+
// is the contract.
|
|
21
|
+
export const UUID_REGEX_STRING = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}';
|
|
22
|
+
const UuidRegexComplete = new RegExp(`^${UUID_REGEX_STRING}$`, 'i');
|
|
23
|
+
export const isUuid = (value) => {
|
|
24
|
+
return typeof value === 'string' && UuidRegexComplete.test(value);
|
|
25
|
+
};
|
|
15
26
|
export const getNextEntityName = (prefix, existingNames, separator = '_') => {
|
|
16
27
|
const cleanName = (name) => {
|
|
17
28
|
return (name
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,eAAuB,EAAU,EAAE;IACpE,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAChH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,eAAuB,EAAU,EAAE;IACpE,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACrG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAY,EAAU,EAAE;IACtD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAC3B,qIAAqI,CAAC;AAExI,MAAM,kBAAkB,GAAG,IAAI,MAAM,CAAC,IAAI,gBAAgB,GAAG,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAa,EAAW,EAAE;IACtD,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,aAAuB,EAAE,SAAS,GAAG,GAAG,EAAE,EAAE;IAC5F,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;QACjC,OAAO,CACL,IAAI;YACF,6CAA6C;aAC5C,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC;aACnC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;aAC3B,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,CACxD,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,eAAe,SAAS,CAAC,CAAC;IACvD,MAAM,WAAW,GAAa,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACtD,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACrC,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAa,CAAC;IAEf,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnD,OAAO,GAAG,eAAe,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC;AAC9C,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, test, expect } from 'vitest';
|
|
2
|
-
import { camelCaseToDisplay, getNextEntityName, validateEmail } from './string.js';
|
|
2
|
+
import { camelCaseToDisplay, getNextEntityName, isUuid, validateEmail } from './string.js';
|
|
3
3
|
describe('camel case to display', () => {
|
|
4
4
|
test('can convert camel case to display', () => {
|
|
5
5
|
expect(camelCaseToDisplay('testCamelCase')).toBe('Test Camel Case');
|
|
@@ -15,6 +15,34 @@ describe('validate email', () => {
|
|
|
15
15
|
expect(validateEmail('some<>body@domain.com')).toBe(false);
|
|
16
16
|
});
|
|
17
17
|
});
|
|
18
|
+
describe('isUuid', () => {
|
|
19
|
+
test('accepts canonical RFC 4122-style UUIDs (case-insensitive)', () => {
|
|
20
|
+
expect(isUuid('a1b2c3d4-e5f6-7890-abcd-1234567890ab')).toBe(true);
|
|
21
|
+
expect(isUuid('A1B2C3D4-E5F6-7890-ABCD-1234567890AB')).toBe(true);
|
|
22
|
+
expect(isUuid('00000000-0000-0000-0000-000000000000')).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
test('rejects non-UUID strings without throwing', () => {
|
|
25
|
+
// Strictness is the contract — these are the shapes PostgreSQL would
|
|
26
|
+
// reject with `invalid input syntax for type uuid` if forwarded to a
|
|
27
|
+
// UUID column.
|
|
28
|
+
expect(isUuid('not-a-uuid')).toBe(false);
|
|
29
|
+
expect(isUuid('unknown agent id')).toBe(false);
|
|
30
|
+
// Near-miss: first segment is 7 chars instead of 8.
|
|
31
|
+
expect(isUuid('1234567-1234-1234-1234-123456789abc')).toBe(false);
|
|
32
|
+
// Too many segments.
|
|
33
|
+
expect(isUuid('a1b2c3d4-e5f6-7890-abcd-1234567890ab-extra')).toBe(false);
|
|
34
|
+
// Non-hex character.
|
|
35
|
+
expect(isUuid('a1b2c3d4-e5f6-7890-abcd-1234567890zz')).toBe(false);
|
|
36
|
+
// Empty string.
|
|
37
|
+
expect(isUuid('')).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
test('rejects non-string inputs', () => {
|
|
40
|
+
expect(isUuid(null)).toBe(false);
|
|
41
|
+
expect(isUuid(undefined)).toBe(false);
|
|
42
|
+
expect(isUuid(123)).toBe(false);
|
|
43
|
+
expect(isUuid({})).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
18
46
|
describe('getNextEntityName', () => {
|
|
19
47
|
test('get next name with underscore', async () => {
|
|
20
48
|
expect(getNextEntityName('Tabs_', ['Tabs_1', 'Tabs_2', 'Tabs_3'])).toEqual('Tabs_4');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string.test.js","sourceRoot":"","sources":["../../src/utils/string.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"string.test.js","sourceRoot":"","sources":["../../src/utils/string.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@superblocksteam/shared",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9590.0",
|
|
4
4
|
"description": "Superblocks Shared Resources",
|
|
5
5
|
"license": "Superblocks Community Software License",
|
|
6
6
|
"repository": "https://github.com/superblocksteam/shared.git",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"@lezer/common": "0.16.1",
|
|
24
24
|
"@lezer/lr": "0.16.3",
|
|
25
25
|
"@opentelemetry/api": "^1.9.1",
|
|
26
|
-
"@opentelemetry/semantic-conventions": "^1.
|
|
26
|
+
"@opentelemetry/semantic-conventions": "^1.36.0",
|
|
27
27
|
"@superblocksteam/sabs-types": "0.154.0",
|
|
28
28
|
"@superblocksteam/types": "1.351.0",
|
|
29
29
|
"@types/esprima": "4.0.3",
|
|
@@ -23,7 +23,13 @@ export type LifecycleErrorCode =
|
|
|
23
23
|
| 'policy_blocked'
|
|
24
24
|
| 'credential_resolution_failed'
|
|
25
25
|
| 'terraform_failed'
|
|
26
|
-
| '
|
|
26
|
+
| 'migration_failed'
|
|
27
|
+
| 'callback_failed'
|
|
28
|
+
// Server-side classification for a terminal callback that arrived for a
|
|
29
|
+
// request whose desiredSpecHash no longer matches the binding (binding has
|
|
30
|
+
// moved to a newer spec). The callback's metadata/state is discarded and
|
|
31
|
+
// the request is cancelled rather than applied to the current binding.
|
|
32
|
+
| 'stale_dispatch';
|
|
27
33
|
|
|
28
34
|
export const CREDENTIAL_RESOLVERS = ['opa_local', 'aws_secrets_manager', 'gcp_secret_manager', 'vault', 'kubernetes_secret'] as const;
|
|
29
35
|
export type CredentialResolver = (typeof CREDENTIAL_RESOLVERS)[number];
|
|
@@ -34,6 +40,22 @@ export type CredentialRef = {
|
|
|
34
40
|
field?: string;
|
|
35
41
|
};
|
|
36
42
|
|
|
43
|
+
export type CredentialResolverConfig = {
|
|
44
|
+
type: CredentialResolver;
|
|
45
|
+
config: Record<string, unknown>;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Reference to a versioned Terraform module that the lifecycle worker should
|
|
49
|
+
// invoke for one operation in this profile. `baseInputs` are profile-level
|
|
50
|
+
// inputs the org admin sets once (AWS account/region/VPC/subnets/KMS/...);
|
|
51
|
+
// the planner merges these with binding-derived inputs (binding_key,
|
|
52
|
+
// requirement spec, credential refs) when it builds a dispatch payload.
|
|
53
|
+
export type TerraformModuleRef = {
|
|
54
|
+
source: string;
|
|
55
|
+
version: string;
|
|
56
|
+
baseInputs: Record<string, unknown>;
|
|
57
|
+
};
|
|
58
|
+
|
|
37
59
|
export type DatabaseRequirement = {
|
|
38
60
|
logicalName: string;
|
|
39
61
|
engine: DatabaseEngine;
|
|
@@ -63,6 +85,22 @@ export type EnvironmentProfile = {
|
|
|
63
85
|
supportedOperations: LifecycleOperation[];
|
|
64
86
|
supportedEngines: DatabaseEngine[];
|
|
65
87
|
backend: DatabaseBackend;
|
|
88
|
+
// V1 stop-gap. Picks the Terraform module the lifecycle worker invokes
|
|
89
|
+
// per operation. `Partial` because not every operation is Terraform-backed
|
|
90
|
+
// in V1 — `migrate_schema` is served by the native Go runner inside the
|
|
91
|
+
// worker (ENG-3415); admins leave it unset and the dispatcher skips
|
|
92
|
+
// emitting a Terraform dispatch for it.
|
|
93
|
+
//
|
|
94
|
+
// TODO(ENG-3456): collapse into per-operation backends when the
|
|
95
|
+
// shared-vs-isolated admin config lands. Each operation will then carry
|
|
96
|
+
// its own discriminated kind ('terraform' | 'native-migration-runner'),
|
|
97
|
+
// with the module reference and Terraform backend config nested under
|
|
98
|
+
// kind: 'terraform'. The wire protocol picks up a matching discriminant.
|
|
99
|
+
moduleSelectors: Partial<Record<LifecycleOperation, TerraformModuleRef>>;
|
|
100
|
+
// Where the worker resolves and writes credential refs. Scoped per profile
|
|
101
|
+
// because dev/prod profiles may use different resolvers (e.g. opa_local
|
|
102
|
+
// for dev, aws_secrets_manager for prod).
|
|
103
|
+
credentialResolver: CredentialResolverConfig;
|
|
66
104
|
};
|
|
67
105
|
|
|
68
106
|
type DatabaseBindingBase = {
|
|
@@ -123,6 +161,74 @@ export type TerraformModuleOutput = {
|
|
|
123
161
|
resourceKey: string;
|
|
124
162
|
};
|
|
125
163
|
|
|
164
|
+
// Resolved per-dispatch Terraform module reference. Mirrors the Go worker's
|
|
165
|
+
// `pkg/databaselifecycle.TerraformModule` JSON shape — `MaterializeJob`
|
|
166
|
+
// writes these straight into `terraform.tfvars.json` and the generated root
|
|
167
|
+
// `main.tf` module block.
|
|
168
|
+
export type TerraformModuleDispatch = {
|
|
169
|
+
source: string;
|
|
170
|
+
version: string;
|
|
171
|
+
inputs: Record<string, unknown>;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// Backend config the worker writes into `backend.tfbackend` and passes to
|
|
175
|
+
// `terraform init -backend-config=...`. Derived from the profile's
|
|
176
|
+
// `backend.stateBackend` plus the per-binding state key. `stateBackend` is
|
|
177
|
+
// the discriminant the worker uses to emit the right HCL
|
|
178
|
+
// `terraform { backend "<stateBackend>" {} }` block — same name as on the
|
|
179
|
+
// profile side. `remoteState` and `locking` pass through unchanged. The
|
|
180
|
+
// worker doesn't see `provisioner`/`provider` — those are server-side
|
|
181
|
+
// categorical fields, not backend args.
|
|
182
|
+
export type TerraformBackendDispatch = {
|
|
183
|
+
stateBackend: TerraformDatabaseBackend['stateBackend'];
|
|
184
|
+
remoteState: boolean;
|
|
185
|
+
locking: boolean;
|
|
186
|
+
key: string;
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
// One forward-only SQL migration the server attaches to a dispatch
|
|
190
|
+
// payload so the lifecycle worker's migration runner can apply it after
|
|
191
|
+
// `tofu apply` succeeds. `version` is the sort key + the primary key in
|
|
192
|
+
// the worker's in-DB `superblocks_schema_migrations` ledger; `filename`
|
|
193
|
+
// is recorded for diagnostics; `sql` is the raw multi-statement SQL.
|
|
194
|
+
// Matches `orchestrator/pkg/databaselifecycle/migrations.Migration`.
|
|
195
|
+
export type LifecycleMigration = {
|
|
196
|
+
version: string;
|
|
197
|
+
filename: string;
|
|
198
|
+
sql: string;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
// Canonical wire payload for a lifecycle dispatch sent from the server to a
|
|
202
|
+
// lifecycle worker. The worker's `DispatchPayload` struct in
|
|
203
|
+
// orchestrator/pkg/databaselifecycle/dispatch.go decodes this JSON shape;
|
|
204
|
+
// keys and order here are intentional. Replaces three duplicate definitions
|
|
205
|
+
// previously living in dispatchQueue.ts / devPersistence.ts / planner.
|
|
206
|
+
//
|
|
207
|
+
// `migrations` is present iff the operation should consider migration
|
|
208
|
+
// state — `ensure_dev_database` / `ensure_prod_database` / `migrate_schema`
|
|
209
|
+
// dispatches carry an array (possibly empty); `retire_database` omits it.
|
|
210
|
+
// An omitted slice keeps the worker's `MigrationState` at the default
|
|
211
|
+
// "pending"; an empty slice means "vacuous truth, mark migrated"; a
|
|
212
|
+
// non-empty slice triggers the runner.
|
|
213
|
+
export type LifecycleDispatchPayload = {
|
|
214
|
+
agentId: string;
|
|
215
|
+
bindingKey: string;
|
|
216
|
+
connectionMetadata?: Record<string, string | number | boolean>;
|
|
217
|
+
desiredSpec: DatabaseRequirement;
|
|
218
|
+
desiredSpecHash: string;
|
|
219
|
+
migrations?: LifecycleMigration[];
|
|
220
|
+
operation: LifecycleOperation;
|
|
221
|
+
profileId: string;
|
|
222
|
+
requestId: string;
|
|
223
|
+
resourceKey: string;
|
|
224
|
+
runtimeCredentialRefs?: Record<string, CredentialRef>;
|
|
225
|
+
// Present for Terraform-backed operations. Omitted for native migration
|
|
226
|
+
// dispatches, where the worker skips Terraform materialization and runs the
|
|
227
|
+
// migration runner directly.
|
|
228
|
+
terraformBackend?: TerraformBackendDispatch;
|
|
229
|
+
terraformModule?: TerraformModuleDispatch;
|
|
230
|
+
};
|
|
231
|
+
|
|
126
232
|
export function computeRequirementKey(requirement: Pick<DatabaseRequirement, 'logicalName' | 'engine'>): string {
|
|
127
233
|
return `${slugify(requirement.logicalName)}~${encodeURIComponent(requirement.logicalName)}:${requirement.engine}`;
|
|
128
234
|
}
|
|
@@ -164,6 +270,55 @@ export async function computeDesiredSpecHash(requirement: DatabaseRequirement):
|
|
|
164
270
|
return await sha256Base64(JSON.stringify(canonicalize(requirement)));
|
|
165
271
|
}
|
|
166
272
|
|
|
273
|
+
// resource_key identifies the physical resource a binding maps to in
|
|
274
|
+
// customer infrastructure, and is the unit of locking inside the lifecycle
|
|
275
|
+
// worker. Distinct from binding_key (product identity in the control plane)
|
|
276
|
+
// because two different profiles could plausibly target the same logical
|
|
277
|
+
// resource — the planner uses profileId here so a profile swap forces a
|
|
278
|
+
// fresh resource. Shape mirrors planning doc §15.
|
|
279
|
+
export function computeResourceKey(input: {
|
|
280
|
+
organizationId: string;
|
|
281
|
+
profileId: string;
|
|
282
|
+
applicationId: string;
|
|
283
|
+
requirementKey: string;
|
|
284
|
+
environmentClass: EnvironmentClass;
|
|
285
|
+
environmentName: string;
|
|
286
|
+
actorScope?: string;
|
|
287
|
+
}): string {
|
|
288
|
+
return [
|
|
289
|
+
input.organizationId,
|
|
290
|
+
input.profileId,
|
|
291
|
+
input.applicationId,
|
|
292
|
+
input.requirementKey,
|
|
293
|
+
input.environmentClass,
|
|
294
|
+
`${slugify(input.environmentName)}~${encodeURIComponent(input.environmentName)}`,
|
|
295
|
+
input.actorScope ?? 'default'
|
|
296
|
+
].join('/');
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Per-binding Terraform state path inside the configured backend. Used to
|
|
300
|
+
// generate the `backend.tfbackend` config that the worker passes to
|
|
301
|
+
// `terraform init -backend-config=...`. Planning doc §9.4.
|
|
302
|
+
export function computeTerraformStateKey(input: {
|
|
303
|
+
organizationId: string;
|
|
304
|
+
applicationId: string;
|
|
305
|
+
requirementKey: string;
|
|
306
|
+
environmentClass: EnvironmentClass;
|
|
307
|
+
environmentName: string;
|
|
308
|
+
actorScope?: string;
|
|
309
|
+
}): string {
|
|
310
|
+
return [
|
|
311
|
+
'superblocks/byo-db',
|
|
312
|
+
input.environmentClass,
|
|
313
|
+
input.organizationId,
|
|
314
|
+
input.applicationId,
|
|
315
|
+
input.requirementKey,
|
|
316
|
+
`${slugify(input.environmentName)}~${encodeURIComponent(input.environmentName)}`,
|
|
317
|
+
input.actorScope ?? 'default',
|
|
318
|
+
'terraform.tfstate'
|
|
319
|
+
].join('/');
|
|
320
|
+
}
|
|
321
|
+
|
|
167
322
|
export function isTerminalLifecycleState(state: LifecycleState): state is LifecycleTerminalState {
|
|
168
323
|
return (LIFECYCLE_TERMINAL_STATES as readonly string[]).includes(state);
|
|
169
324
|
}
|
|
@@ -604,6 +604,11 @@ export type ApplicationHashChangeSource =
|
|
|
604
604
|
| 'requestedFilesSync'
|
|
605
605
|
| 'cli:sdk'
|
|
606
606
|
| 'cli:git-sync'
|
|
607
|
+
// Brownfield npm private-registry migration (APPS-4195, historical).
|
|
608
|
+
// Emitted by the now-removed background install/upload path in the
|
|
609
|
+
// dev-server SDK; retained as a known ApplicationHashChangeSource so
|
|
610
|
+
// existing audit records still parse. Mapped to action='none' (no commit).
|
|
611
|
+
| 'cli:private-registry-migration'
|
|
607
612
|
| 'initialSync'
|
|
608
613
|
// Atomic V2 -> V3 template migration: the vite dev server performs the
|
|
609
614
|
// deterministic folder restructure and calls setApplicationHash with this
|
package/src/types/audit/ocsf.ts
CHANGED
|
@@ -235,7 +235,14 @@ export const AUDIT_EVENT_TYPE_CATALOG: AuditEventTypeEntry[] = [
|
|
|
235
235
|
category_uid: OCSFCategoryUid.APPLICATION_ACTIVITY,
|
|
236
236
|
category_name: 'APPLICATION_ACTIVITY',
|
|
237
237
|
resource_type: 'Organization',
|
|
238
|
-
operations: [
|
|
238
|
+
operations: [
|
|
239
|
+
'organization.npm_allow_install_scripts_changed',
|
|
240
|
+
'organization.npm_registry.create',
|
|
241
|
+
'organization.npm_registry.delete',
|
|
242
|
+
'organization.npm_registry.update',
|
|
243
|
+
'organization.settings.update',
|
|
244
|
+
'organization.update'
|
|
245
|
+
]
|
|
239
246
|
},
|
|
240
247
|
{
|
|
241
248
|
class_uid: OCSFClassUid.ENTITY_MANAGEMENT,
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { FormComponentType, getDisplayOnlyFieldNames } from './form.js';
|
|
4
|
+
import type { FormTemplate } from './form.js';
|
|
5
|
+
|
|
6
|
+
describe('getDisplayOnlyFieldNames', () => {
|
|
7
|
+
it('returns ALERT field names', () => {
|
|
8
|
+
const template: FormTemplate = {
|
|
9
|
+
sections: [
|
|
10
|
+
{
|
|
11
|
+
name: 'auth',
|
|
12
|
+
items: [
|
|
13
|
+
{
|
|
14
|
+
name: 'HTTPBasicAlert',
|
|
15
|
+
label: '',
|
|
16
|
+
startVersion: '1',
|
|
17
|
+
componentType: FormComponentType.ALERT,
|
|
18
|
+
messageTemplate: 'some info'
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
};
|
|
24
|
+
expect(getDisplayOnlyFieldNames(template)).toEqual(new Set(['HTTPBasicAlert']));
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('returns BUTTON field names', () => {
|
|
28
|
+
const template: FormTemplate = {
|
|
29
|
+
sections: [
|
|
30
|
+
{
|
|
31
|
+
name: 'authButtons',
|
|
32
|
+
items: [
|
|
33
|
+
{
|
|
34
|
+
rowItems: [
|
|
35
|
+
{
|
|
36
|
+
name: 'oauth-connect-button',
|
|
37
|
+
label: 'Connect',
|
|
38
|
+
startVersion: '1',
|
|
39
|
+
componentType: FormComponentType.BUTTON,
|
|
40
|
+
buttonType: 'connectOAuth'
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'oauth-revoke-shared-tokens-button',
|
|
44
|
+
label: 'Revoke',
|
|
45
|
+
startVersion: '1',
|
|
46
|
+
componentType: FormComponentType.BUTTON,
|
|
47
|
+
buttonType: 'revokeOAuthTokens'
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
};
|
|
55
|
+
expect(getDisplayOnlyFieldNames(template)).toEqual(new Set(['oauth-connect-button', 'oauth-revoke-shared-tokens-button']));
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('returns disabled + immutable INPUT_TEXT field names', () => {
|
|
59
|
+
const template: FormTemplate = {
|
|
60
|
+
sections: [
|
|
61
|
+
{
|
|
62
|
+
name: 'auth',
|
|
63
|
+
items: [
|
|
64
|
+
{
|
|
65
|
+
name: 'oauth-callback-alert',
|
|
66
|
+
label: 'Callback URL',
|
|
67
|
+
startVersion: '1',
|
|
68
|
+
componentType: FormComponentType.INPUT_TEXT,
|
|
69
|
+
disabled: true,
|
|
70
|
+
immutable: true,
|
|
71
|
+
initialValue: 'https://example.com/oauth/callback'
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
};
|
|
77
|
+
expect(getDisplayOnlyFieldNames(template)).toEqual(new Set(['oauth-callback-alert']));
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('does not include regular INPUT_TEXT fields', () => {
|
|
81
|
+
const template: FormTemplate = {
|
|
82
|
+
sections: [
|
|
83
|
+
{
|
|
84
|
+
name: 'main',
|
|
85
|
+
items: [
|
|
86
|
+
{
|
|
87
|
+
name: 'path',
|
|
88
|
+
label: 'URL',
|
|
89
|
+
startVersion: '1',
|
|
90
|
+
componentType: FormComponentType.INPUT_TEXT
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
};
|
|
96
|
+
expect(getDisplayOnlyFieldNames(template).size).toBe(0);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('does not include disabled-only fields without immutable', () => {
|
|
100
|
+
const template: FormTemplate = {
|
|
101
|
+
sections: [
|
|
102
|
+
{
|
|
103
|
+
name: 'main',
|
|
104
|
+
items: [
|
|
105
|
+
{
|
|
106
|
+
name: 'path',
|
|
107
|
+
label: 'URL',
|
|
108
|
+
startVersion: '1',
|
|
109
|
+
componentType: FormComponentType.INPUT_TEXT,
|
|
110
|
+
disabled: true
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
};
|
|
116
|
+
expect(getDisplayOnlyFieldNames(template).size).toBe(0);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('handles mixed sections with normal and display-only fields', () => {
|
|
120
|
+
const template: FormTemplate = {
|
|
121
|
+
sections: [
|
|
122
|
+
{
|
|
123
|
+
name: 'main',
|
|
124
|
+
items: [
|
|
125
|
+
{
|
|
126
|
+
name: 'path',
|
|
127
|
+
label: 'URL',
|
|
128
|
+
startVersion: '1',
|
|
129
|
+
componentType: FormComponentType.INPUT_TEXT
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'OAuth2PasswordAlert',
|
|
133
|
+
label: '',
|
|
134
|
+
startVersion: '1',
|
|
135
|
+
componentType: FormComponentType.ALERT
|
|
136
|
+
}
|
|
137
|
+
]
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: 'authButtons',
|
|
141
|
+
items: [
|
|
142
|
+
{
|
|
143
|
+
rowItems: [
|
|
144
|
+
{
|
|
145
|
+
name: 'oauth-connect-button',
|
|
146
|
+
label: 'Connect',
|
|
147
|
+
startVersion: '1',
|
|
148
|
+
componentType: FormComponentType.BUTTON,
|
|
149
|
+
buttonType: 'connectOAuth'
|
|
150
|
+
}
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
};
|
|
157
|
+
const result = getDisplayOnlyFieldNames(template);
|
|
158
|
+
expect(result).toEqual(new Set(['OAuth2PasswordAlert', 'oauth-connect-button']));
|
|
159
|
+
expect(result.has('path')).toBe(false);
|
|
160
|
+
});
|
|
161
|
+
});
|
package/src/types/plugin/form.ts
CHANGED
|
@@ -439,6 +439,28 @@ interface CheckboxFormItem extends BaseFormItem {
|
|
|
439
439
|
validateReduxPath?: ValidateReduxPath;
|
|
440
440
|
}
|
|
441
441
|
|
|
442
|
+
const DISPLAY_ONLY_COMPONENT_TYPES: ReadonlySet<FormComponentType> = new Set([FormComponentType.ALERT, FormComponentType.BUTTON]);
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Returns the set of field names from a form template that are display-only
|
|
446
|
+
* and should not be persisted. This includes ALERT and BUTTON components
|
|
447
|
+
* (which render informational banners or action triggers) and disabled
|
|
448
|
+
* immutable fields (e.g. the OAuth callback URL display).
|
|
449
|
+
*/
|
|
450
|
+
export const getDisplayOnlyFieldNames = (template: FormTemplate): Set<string> => {
|
|
451
|
+
const names = new Set<string>();
|
|
452
|
+
for (const section of template.sections) {
|
|
453
|
+
for (const sectionItem of section.items) {
|
|
454
|
+
for (const item of getRowItemsFromSectionItem(sectionItem)) {
|
|
455
|
+
if (DISPLAY_ONLY_COMPONENT_TYPES.has(item.componentType) || (item.disabled && item.immutable)) {
|
|
456
|
+
names.add(item.name);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
return names;
|
|
462
|
+
};
|
|
463
|
+
|
|
442
464
|
export interface DropdownOption {
|
|
443
465
|
key: string;
|
|
444
466
|
value: string;
|
|
@@ -14,14 +14,39 @@ export type PolicyGateReadinessFindingSummary = {
|
|
|
14
14
|
suppressed: number;
|
|
15
15
|
};
|
|
16
16
|
|
|
17
|
+
export type PolicyGateReadinessFinding = {
|
|
18
|
+
blocking: boolean;
|
|
19
|
+
severity: 'critical' | 'high' | 'info' | 'low' | 'medium';
|
|
20
|
+
title: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type PolicyGateScanPhaseName = 'built_asset' | 'dependency_audit' | 'source';
|
|
24
|
+
|
|
25
|
+
export type PolicyGateScanPhaseState = 'complete' | 'failed' | 'pending' | 'running' | 'skipped';
|
|
26
|
+
|
|
27
|
+
export type PolicyGateScanPhaseProgress = {
|
|
28
|
+
completedAt?: string;
|
|
29
|
+
durationMs?: number;
|
|
30
|
+
startedAt?: string;
|
|
31
|
+
state: PolicyGateScanPhaseState;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export type PolicyGateScanProgress = {
|
|
35
|
+
phases: Partial<Record<PolicyGateScanPhaseName, PolicyGateScanPhaseProgress>>;
|
|
36
|
+
requiredPhases: PolicyGateScanPhaseName[];
|
|
37
|
+
};
|
|
38
|
+
|
|
17
39
|
export type PolicyGateReadinessItem = {
|
|
18
40
|
actions: PolicyGateReadinessAction[];
|
|
41
|
+
displayName?: string;
|
|
42
|
+
findings?: PolicyGateReadinessFinding[];
|
|
19
43
|
findingSummary: PolicyGateReadinessFindingSummary;
|
|
20
44
|
itemId: string;
|
|
21
45
|
itemType: 'security_agent' | 'security_scan';
|
|
22
46
|
mode: 'advisory' | 'approval' | 'blocking' | 'report_only';
|
|
23
47
|
policyId: string;
|
|
24
48
|
policyVersionId: string;
|
|
49
|
+
progress?: PolicyGateScanProgress;
|
|
25
50
|
reviewRunId?: string;
|
|
26
51
|
staleReason?: string;
|
|
27
52
|
status: PolicyGateReadinessItemStatus;
|
|
@@ -43,7 +68,7 @@ export type PolicyGateReadinessResponse = {
|
|
|
43
68
|
target: PolicyGateReadinessTarget;
|
|
44
69
|
};
|
|
45
70
|
|
|
46
|
-
export type PolicyGateReadinessStatus = 'allowed' | 'approval_required' | 'blocked' | 'failed' | 'running' | 'stale';
|
|
71
|
+
export type PolicyGateReadinessStatus = 'allowed' | 'approval_required' | 'blocked' | 'disabled' | 'failed' | 'running' | 'stale';
|
|
47
72
|
|
|
48
73
|
export type PolicyGateReadinessTarget = {
|
|
49
74
|
applicationId: string;
|