@pipeline-builder/api-core 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +51 -0
- package/lib/constants/ai-providers.d.ts +41 -0
- package/lib/constants/ai-providers.js +88 -0
- package/lib/constants/http-status.d.ts +24 -0
- package/lib/constants/http-status.js +29 -0
- package/lib/constants/index.d.ts +3 -0
- package/lib/constants/index.js +22 -0
- package/lib/constants/time.d.ts +10 -0
- package/lib/constants/time.js +16 -0
- package/lib/errors/app-errors.d.ts +30 -0
- package/lib/errors/app-errors.js +62 -0
- package/lib/errors/index.d.ts +1 -0
- package/lib/errors/index.js +20 -0
- package/lib/helpers/access-helpers.d.ts +40 -0
- package/lib/helpers/access-helpers.js +56 -0
- package/lib/helpers/crud-helpers.d.ts +16 -0
- package/lib/helpers/crud-helpers.js +34 -0
- package/lib/helpers/index.d.ts +4 -0
- package/lib/helpers/index.js +23 -0
- package/lib/helpers/mask-helpers.d.ts +33 -0
- package/lib/helpers/mask-helpers.js +54 -0
- package/lib/helpers/sse-helpers.d.ts +13 -0
- package/lib/helpers/sse-helpers.js +40 -0
- package/lib/index.d.ts +57 -0
- package/lib/index.js +86 -0
- package/lib/middleware/auth.d.ts +50 -0
- package/lib/middleware/auth.js +171 -0
- package/lib/middleware/index.d.ts +1 -0
- package/lib/middleware/index.js +20 -0
- package/lib/openapi/extend-zod.d.ts +1 -0
- package/lib/openapi/extend-zod.js +8 -0
- package/lib/openapi/index.d.ts +2 -0
- package/lib/openapi/index.js +10 -0
- package/lib/openapi/registry.d.ts +17 -0
- package/lib/openapi/registry.js +42 -0
- package/lib/openapi/routes/billing-routes.d.ts +1 -0
- package/lib/openapi/routes/billing-routes.js +69 -0
- package/lib/openapi/routes/index.d.ts +5 -0
- package/lib/openapi/routes/index.js +22 -0
- package/lib/openapi/routes/message-routes.d.ts +1 -0
- package/lib/openapi/routes/message-routes.js +108 -0
- package/lib/openapi/routes/pipeline-routes.d.ts +1 -0
- package/lib/openapi/routes/pipeline-routes.js +90 -0
- package/lib/openapi/routes/plugin-routes.d.ts +1 -0
- package/lib/openapi/routes/plugin-routes.js +99 -0
- package/lib/openapi/routes/quota-routes.d.ts +1 -0
- package/lib/openapi/routes/quota-routes.js +65 -0
- package/lib/openapi/schema-registry.d.ts +25 -0
- package/lib/openapi/schema-registry.js +95 -0
- package/lib/routes/health.d.ts +47 -0
- package/lib/routes/health.js +81 -0
- package/lib/routes/index.d.ts +1 -0
- package/lib/routes/index.js +20 -0
- package/lib/services/admin-audit.d.ts +13 -0
- package/lib/services/admin-audit.js +31 -0
- package/lib/services/cache-service.d.ts +108 -0
- package/lib/services/cache-service.js +212 -0
- package/lib/services/compliance-client.d.ts +46 -0
- package/lib/services/compliance-client.js +102 -0
- package/lib/services/compliance-event-subscriber.d.ts +11 -0
- package/lib/services/compliance-event-subscriber.js +60 -0
- package/lib/services/compliance-queue.d.ts +11 -0
- package/lib/services/compliance-queue.js +38 -0
- package/lib/services/entity-events.d.ts +44 -0
- package/lib/services/entity-events.js +63 -0
- package/lib/services/http-client.d.ts +108 -0
- package/lib/services/http-client.js +285 -0
- package/lib/services/index.d.ts +10 -0
- package/lib/services/index.js +40 -0
- package/lib/services/quota.d.ts +59 -0
- package/lib/services/quota.js +137 -0
- package/lib/services/retry-strategy.d.ts +74 -0
- package/lib/services/retry-strategy.js +127 -0
- package/lib/types/billing.d.ts +47 -0
- package/lib/types/billing.js +5 -0
- package/lib/types/common.d.ts +161 -0
- package/lib/types/common.js +53 -0
- package/lib/types/error-codes.d.ts +38 -0
- package/lib/types/error-codes.js +77 -0
- package/lib/types/feature-flags.d.ts +38 -0
- package/lib/types/feature-flags.js +107 -0
- package/lib/types/http.d.ts +37 -0
- package/lib/types/http.js +5 -0
- package/lib/types/index.d.ts +7 -0
- package/lib/types/index.js +26 -0
- package/lib/types/pipeline.d.ts +70 -0
- package/lib/types/pipeline.js +44 -0
- package/lib/types/quota-tiers.d.ts +23 -0
- package/lib/types/quota-tiers.js +26 -0
- package/lib/utils/alias-resolver.d.ts +16 -0
- package/lib/utils/alias-resolver.js +49 -0
- package/lib/utils/headers.d.ts +18 -0
- package/lib/utils/headers.js +24 -0
- package/lib/utils/identity.d.ts +61 -0
- package/lib/utils/identity.js +75 -0
- package/lib/utils/index.d.ts +7 -0
- package/lib/utils/index.js +26 -0
- package/lib/utils/logger.d.ts +28 -0
- package/lib/utils/logger.js +77 -0
- package/lib/utils/object.d.ts +13 -0
- package/lib/utils/object.js +21 -0
- package/lib/utils/params.d.ts +89 -0
- package/lib/utils/params.js +148 -0
- package/lib/utils/response.d.ts +142 -0
- package/lib/utils/response.js +237 -0
- package/lib/validation/ai-schemas.d.ts +61 -0
- package/lib/validation/ai-schemas.js +81 -0
- package/lib/validation/common-schemas.d.ts +72 -0
- package/lib/validation/common-schemas.js +58 -0
- package/lib/validation/index.d.ts +6 -0
- package/lib/validation/index.js +25 -0
- package/lib/validation/message-schemas.d.ts +79 -0
- package/lib/validation/message-schemas.js +42 -0
- package/lib/validation/middleware.d.ts +60 -0
- package/lib/validation/middleware.js +77 -0
- package/lib/validation/pipeline-schemas.d.ts +135 -0
- package/lib/validation/pipeline-schemas.js +85 -0
- package/lib/validation/plugin-schemas.d.ts +127 -0
- package/lib/validation/plugin-schemas.js +84 -0
- package/openapi.yaml +292 -0
- package/package.json +127 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.VALID_QUOTA_TYPES = void 0;
|
|
6
|
+
exports.isValidQuotaType = isValidQuotaType;
|
|
7
|
+
exports.validateQuotaType = validateQuotaType;
|
|
8
|
+
/**
|
|
9
|
+
* Valid quota type values.
|
|
10
|
+
*/
|
|
11
|
+
exports.VALID_QUOTA_TYPES = ['plugins', 'pipelines', 'apiCalls'];
|
|
12
|
+
/**
|
|
13
|
+
* Type guard to check if a value is a valid QuotaType.
|
|
14
|
+
*
|
|
15
|
+
* @param value - Value to check
|
|
16
|
+
* @returns True if value is a valid QuotaType
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* if (isValidQuotaType(req.body.quotaType)) {
|
|
21
|
+
* // quotaType is guaranteed to be QuotaType
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
function isValidQuotaType(value) {
|
|
26
|
+
return typeof value === 'string' && exports.VALID_QUOTA_TYPES.includes(value);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate and assert that a value is a valid QuotaType.
|
|
30
|
+
* Throws an error if validation fails.
|
|
31
|
+
*
|
|
32
|
+
* @param value - Value to validate
|
|
33
|
+
* @param fieldName - Name of the field being validated (for error messages)
|
|
34
|
+
* @returns The validated QuotaType
|
|
35
|
+
* @throws Error if value is not a valid QuotaType
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* try {
|
|
40
|
+
* const quotaType = validateQuotaType(req.body.quotaType, 'quotaType');
|
|
41
|
+
* // Use quotaType safely
|
|
42
|
+
* } catch (err) {
|
|
43
|
+
* return sendError(res, 400, err.message);
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
function validateQuotaType(value, fieldName = 'quotaType') {
|
|
48
|
+
if (!isValidQuotaType(value)) {
|
|
49
|
+
throw new Error(`Invalid ${fieldName}: "${value}". Must be one of: ${exports.VALID_QUOTA_TYPES.join(', ')}`);
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7O0FBeUJ0Qyw0Q0FFQztBQXFCRCw4Q0FPQztBQWhERDs7R0FFRztBQUNVLFFBQUEsaUJBQWlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBVSxDQUFDO0FBRS9FOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLEtBQWM7SUFDN0MsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUkseUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQWtCLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLEtBQWMsRUFBRSxTQUFTLEdBQUcsV0FBVztJQUN2RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksS0FBSyxDQUNiLFdBQVcsU0FBUyxNQUFNLEtBQUssc0JBQXNCLHlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNwRixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFF1b3RhIHR5cGUgaWRlbnRpZmllcnMuXG4gKi9cbmV4cG9ydCB0eXBlIFF1b3RhVHlwZSA9ICdwbHVnaW5zJyB8ICdwaXBlbGluZXMnIHwgJ2FwaUNhbGxzJztcblxuLyoqXG4gKiBWYWxpZCBxdW90YSB0eXBlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1FVT1RBX1RZUEVTID0gWydwbHVnaW5zJywgJ3BpcGVsaW5lcycsICdhcGlDYWxscyddIGFzIGNvbnN0O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIFF1b3RhVHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZhbGlkIFF1b3RhVHlwZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNWYWxpZFF1b3RhVHlwZShyZXEuYm9keS5xdW90YVR5cGUpKSB7XG4gKiAgIC8vIHF1b3RhVHlwZSBpcyBndWFyYW50ZWVkIHRvIGJlIFF1b3RhVHlwZVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUXVvdGFUeXBlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUXVvdGFUeXBlIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgVkFMSURfUVVPVEFfVFlQRVMuaW5jbHVkZXModmFsdWUgYXMgUXVvdGFUeXBlKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgYXNzZXJ0IHRoYXQgYSB2YWx1ZSBpcyBhIHZhbGlkIFF1b3RhVHlwZS5cbiAqIFRocm93cyBhbiBlcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHZhbGlkYXRlXG4gKiBAcGFyYW0gZmllbGROYW1lIC0gTmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgdmFsaWRhdGVkIChmb3IgZXJyb3IgbWVzc2FnZXMpXG4gKiBAcmV0dXJucyBUaGUgdmFsaWRhdGVkIFF1b3RhVHlwZVxuICogQHRocm93cyBFcnJvciBpZiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBRdW90YVR5cGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgY29uc3QgcXVvdGFUeXBlID0gdmFsaWRhdGVRdW90YVR5cGUocmVxLmJvZHkucXVvdGFUeXBlLCAncXVvdGFUeXBlJyk7XG4gKiAgIC8vIFVzZSBxdW90YVR5cGUgc2FmZWx5XG4gKiB9IGNhdGNoIChlcnIpIHtcbiAqICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIDQwMCwgZXJyLm1lc3NhZ2UpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVF1b3RhVHlwZSh2YWx1ZTogdW5rbm93biwgZmllbGROYW1lID0gJ3F1b3RhVHlwZScpOiBRdW90YVR5cGUge1xuICBpZiAoIWlzVmFsaWRRdW90YVR5cGUodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgJHtmaWVsZE5hbWV9OiBcIiR7dmFsdWV9XCIuIE11c3QgYmUgb25lIG9mOiAke1ZBTElEX1FVT1RBX1RZUEVTLmpvaW4oJywgJyl9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgZnJvbSBxdW90YSBjaGVjayBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFDaGVja1Jlc3VsdCB7XG4gIC8qKiBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIGFsbG93ZWQgKi9cbiAgYWxsb3dlZDogYm9vbGVhbjtcbiAgLyoqIE1heGltdW0gcXVvdGEgbGltaXQgKC0xIGZvciB1bmxpbWl0ZWQpICovXG4gIGxpbWl0OiBudW1iZXI7XG4gIC8qKiBDdXJyZW50IHVzYWdlIGNvdW50ICovXG4gIHVzZWQ6IG51bWJlcjtcbiAgLyoqIFJlbWFpbmluZyBxdW90YSAoLTEgZm9yIHVubGltaXRlZCkgKi9cbiAgcmVtYWluaW5nOiBudW1iZXI7XG4gIC8qKiBJU08gdGltZXN0YW1wIHdoZW4gcXVvdGEgcmVzZXRzICovXG4gIHJlc2V0QXQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgcXVvdGEgaXMgdW5saW1pdGVkICovXG4gIHVubGltaXRlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBRdW90YSBpbmZvcm1hdGlvbiBmb3IgZXJyb3IgcmVzcG9uc2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhSW5mbyB7XG4gIHR5cGU6IFF1b3RhVHlwZTtcbiAgbGltaXQ6IG51bWJlcjtcbiAgdXNlZDogbnVtYmVyO1xuICByZW1haW5pbmc6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBBUEkgc3VjY2VzcyByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlTdWNjZXNzUmVzcG9uc2U8VCA9IHVua25vd24+IHtcbiAgc3VjY2VzczogdHJ1ZTtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBkYXRhPzogVDtcbiAgbWVzc2FnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBBUEkgZXJyb3IgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRXJyb3JSZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGZhbHNlO1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgY29kZT86IHN0cmluZztcbiAgZGV0YWlscz86IHVua25vd247XG4gIHF1b3RhPzogUXVvdGFJbmZvO1xufVxuXG4vKipcbiAqIENvbWJpbmVkIEFQSSByZXNwb25zZSB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBBcGlSZXNwb25zZTxUID0gdW5rbm93bj4gPSBBcGlTdWNjZXNzUmVzcG9uc2U8VD4gfCBBcGlFcnJvclJlc3BvbnNlO1xuXG4vKipcbiAqIEpXVCBwYXlsb2FkIGZyb20gYWNjZXNzIHRva2Vucy5cbiAqXG4gKiBVc2VycyBjYW4gYmVsb25nIHRvIG11bHRpcGxlIG9yZ2FuaXphdGlvbnMuIFRoZSB0b2tlbiBpcyBzY29wZWQgdG8gb25lXG4gKiBhY3RpdmUgb3JnYW5pemF0aW9uIGF0IGEgdGltZS4gVGhlIGByb2xlYCBmaWVsZCBpcyB0aGUgdXNlcidzIHBlci1vcmdcbiAqIHJvbGUgaW4gdGhhdCBvcmdhbml6YXRpb24gKGZyb20gdGhlIFVzZXJPcmdhbml6YXRpb24ganVuY3Rpb24gY29sbGVjdGlvbiksXG4gKiBhbmQgYGlzQWRtaW5gIGlzIGRlcml2ZWQgYXMgYHJvbGUgPT09ICdhZG1pbicgfHwgcm9sZSA9PT0gJ293bmVyJ2AuXG4gKlxuICogVXNlIGBQT1NUIC9hdXRoL3N3aXRjaC1vcmdgIHRvIGNoYW5nZSB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiwgd2hpY2hcbiAqIHJlLWlzc3VlcyB0b2tlbnMgd2l0aCB0aGUgbmV3IG9yZydzIHJvbGUgYW5kIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnd0UGF5bG9hZCB7XG4gIC8qKiBVc2VyIElEIChzdWJqZWN0KSAqL1xuICBzdWI6IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lICovXG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIC8qKiBVc2VyIGVtYWlsICovXG4gIGVtYWlsOiBzdHJpbmc7XG4gIC8qKiBQZXItb3JnIHJvbGUgaW4gdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKCdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcicpLiBOb3QgYSBnbG9iYWwgcm9sZS4gKi9cbiAgcm9sZTogJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcbiAgLyoqIERlcml2ZWQ6IHRydWUgd2hlbiByb2xlIGlzICdhZG1pbicgb3IgJ293bmVyJyBpbiB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiAqL1xuICBpc0FkbWluPzogYm9vbGVhbjtcbiAgLyoqIE9yZ2FuaXphdGlvbidzIHF1b3RhIHRpZXIgKCdkZXZlbG9wZXInIHwgJ3BybycgfCAndW5saW1pdGVkJykgKi9cbiAgdGllcj86IHN0cmluZztcbiAgLyoqIFJlc29sdmVkIGZlYXR1cmUgZmxhZ3MgZm9yIHRoaXMgdXNlci9vcmcgKi9cbiAgZmVhdHVyZXM/OiBzdHJpbmdbXTtcbiAgLyoqIEFjdGl2ZSBvcmdhbml6YXRpb24gSUQgKGZyb20gVXNlck9yZ2FuaXphdGlvbiBtZW1iZXJzaGlwKSAqL1xuICBvcmdhbml6YXRpb25JZD86IHN0cmluZztcbiAgLyoqIEFjdGl2ZSBvcmdhbml6YXRpb24gbmFtZSAqL1xuICBvcmdhbml6YXRpb25OYW1lPzogc3RyaW5nO1xuICAvKiogVG9rZW4gdHlwZSAqL1xuICB0eXBlOiAnYWNjZXNzJyB8ICdyZWZyZXNoJztcbiAgLyoqIElzc3VlZCBhdCB0aW1lc3RhbXAgKi9cbiAgaWF0PzogbnVtYmVyO1xuICAvKiogRXhwaXJhdGlvbiB0aW1lc3RhbXAgKi9cbiAgZXhwPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIEV4cHJlc3MgUmVxdWVzdCB3aXRoIHVzZXIgcHJvcGVydHkuXG4gKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgbmFtZXNwYWNlIEV4cHJlc3Mge1xuICAgIGludGVyZmFjZSBSZXF1ZXN0IHtcbiAgICAgIHVzZXI/OiBKd3RQYXlsb2FkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNlcnZpY2UgY29uZmlndXJhdGlvbiBmb3IgaW50ZXJuYWwgSFRUUCBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbmZpZyB7XG4gIC8qKiBTZXJ2aWNlIGhvc3RuYW1lICovXG4gIGhvc3Q6IHN0cmluZztcbiAgLyoqIFNlcnZpY2UgcG9ydCAqL1xuICBwb3J0OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSGVhbHRoIGNoZWNrIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrUmVzcG9uc2Uge1xuICBzdGF0dXM6ICdoZWFsdGh5JyB8ICd1bmhlYWx0aHknO1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICB1cHRpbWU6IG51bWJlcjtcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJyB8ICd1bmtub3duJz47XG59XG4iXX0=
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standardized error codes used across all API microservices.
|
|
3
|
+
* Use these codes in error responses for consistent client handling.
|
|
4
|
+
*
|
|
5
|
+
* Each HTTP status category has one primary code. Use the `details`
|
|
6
|
+
* field in error responses for sub-type information (e.g. which quota
|
|
7
|
+
* was exceeded, which field failed validation).
|
|
8
|
+
*/
|
|
9
|
+
export declare enum ErrorCode {
|
|
10
|
+
UNAUTHORIZED = "UNAUTHORIZED",
|
|
11
|
+
TOKEN_EXPIRED = "TOKEN_EXPIRED",
|
|
12
|
+
TOKEN_INVALID = "TOKEN_INVALID",
|
|
13
|
+
TOKEN_MISSING = "TOKEN_MISSING",
|
|
14
|
+
INSUFFICIENT_PERMISSIONS = "INSUFFICIENT_PERMISSIONS",
|
|
15
|
+
ORG_MISMATCH = "ORG_MISMATCH",
|
|
16
|
+
COMPLIANCE_VIOLATION = "COMPLIANCE_VIOLATION",
|
|
17
|
+
NOT_FOUND = "NOT_FOUND",
|
|
18
|
+
ORG_NOT_FOUND = "ORG_NOT_FOUND",
|
|
19
|
+
VALIDATION_ERROR = "VALIDATION_ERROR",
|
|
20
|
+
MISSING_REQUIRED_FIELD = "MISSING_REQUIRED_FIELD",
|
|
21
|
+
QUOTA_EXCEEDED = "QUOTA_EXCEEDED",
|
|
22
|
+
RATE_LIMIT_EXCEEDED = "RATE_LIMIT_EXCEEDED",
|
|
23
|
+
CONFLICT = "CONFLICT",
|
|
24
|
+
DUPLICATE_ENTRY = "DUPLICATE_ENTRY",
|
|
25
|
+
SCAN_CONFLICT = "SCAN_CONFLICT",
|
|
26
|
+
INTERNAL_ERROR = "INTERNAL_ERROR",
|
|
27
|
+
DATABASE_ERROR = "DATABASE_ERROR",
|
|
28
|
+
SERVICE_UNAVAILABLE = "SERVICE_UNAVAILABLE",
|
|
29
|
+
COMPLIANCE_SERVICE_UNAVAILABLE = "COMPLIANCE_SERVICE_UNAVAILABLE"
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Maps error codes to their default HTTP status codes.
|
|
33
|
+
*/
|
|
34
|
+
export declare const ErrorCodeStatus: Record<ErrorCode, number>;
|
|
35
|
+
/**
|
|
36
|
+
* Get the HTTP status code for an error code.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getStatusForErrorCode(code: ErrorCode): number;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.ErrorCodeStatus = exports.ErrorCode = void 0;
|
|
6
|
+
exports.getStatusForErrorCode = getStatusForErrorCode;
|
|
7
|
+
/**
|
|
8
|
+
* Standardized error codes used across all API microservices.
|
|
9
|
+
* Use these codes in error responses for consistent client handling.
|
|
10
|
+
*
|
|
11
|
+
* Each HTTP status category has one primary code. Use the `details`
|
|
12
|
+
* field in error responses for sub-type information (e.g. which quota
|
|
13
|
+
* was exceeded, which field failed validation).
|
|
14
|
+
*/
|
|
15
|
+
var ErrorCode;
|
|
16
|
+
(function (ErrorCode) {
|
|
17
|
+
// Authentication errors (401)
|
|
18
|
+
ErrorCode["UNAUTHORIZED"] = "UNAUTHORIZED";
|
|
19
|
+
ErrorCode["TOKEN_EXPIRED"] = "TOKEN_EXPIRED";
|
|
20
|
+
ErrorCode["TOKEN_INVALID"] = "TOKEN_INVALID";
|
|
21
|
+
ErrorCode["TOKEN_MISSING"] = "TOKEN_MISSING";
|
|
22
|
+
// Authorization errors (403)
|
|
23
|
+
ErrorCode["INSUFFICIENT_PERMISSIONS"] = "INSUFFICIENT_PERMISSIONS";
|
|
24
|
+
ErrorCode["ORG_MISMATCH"] = "ORG_MISMATCH";
|
|
25
|
+
ErrorCode["COMPLIANCE_VIOLATION"] = "COMPLIANCE_VIOLATION";
|
|
26
|
+
// Not found errors (404)
|
|
27
|
+
ErrorCode["NOT_FOUND"] = "NOT_FOUND";
|
|
28
|
+
ErrorCode["ORG_NOT_FOUND"] = "ORG_NOT_FOUND";
|
|
29
|
+
// Validation errors (400)
|
|
30
|
+
ErrorCode["VALIDATION_ERROR"] = "VALIDATION_ERROR";
|
|
31
|
+
ErrorCode["MISSING_REQUIRED_FIELD"] = "MISSING_REQUIRED_FIELD";
|
|
32
|
+
// Quota/Rate limit errors (429)
|
|
33
|
+
ErrorCode["QUOTA_EXCEEDED"] = "QUOTA_EXCEEDED";
|
|
34
|
+
ErrorCode["RATE_LIMIT_EXCEEDED"] = "RATE_LIMIT_EXCEEDED";
|
|
35
|
+
// Conflict errors (409)
|
|
36
|
+
ErrorCode["CONFLICT"] = "CONFLICT";
|
|
37
|
+
ErrorCode["DUPLICATE_ENTRY"] = "DUPLICATE_ENTRY";
|
|
38
|
+
ErrorCode["SCAN_CONFLICT"] = "SCAN_CONFLICT";
|
|
39
|
+
// Server errors (500)
|
|
40
|
+
ErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
|
|
41
|
+
ErrorCode["DATABASE_ERROR"] = "DATABASE_ERROR";
|
|
42
|
+
// Service unavailable (503)
|
|
43
|
+
ErrorCode["SERVICE_UNAVAILABLE"] = "SERVICE_UNAVAILABLE";
|
|
44
|
+
ErrorCode["COMPLIANCE_SERVICE_UNAVAILABLE"] = "COMPLIANCE_SERVICE_UNAVAILABLE";
|
|
45
|
+
})(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
|
|
46
|
+
/**
|
|
47
|
+
* Maps error codes to their default HTTP status codes.
|
|
48
|
+
*/
|
|
49
|
+
exports.ErrorCodeStatus = {
|
|
50
|
+
[ErrorCode.UNAUTHORIZED]: 401,
|
|
51
|
+
[ErrorCode.TOKEN_EXPIRED]: 401,
|
|
52
|
+
[ErrorCode.TOKEN_INVALID]: 401,
|
|
53
|
+
[ErrorCode.TOKEN_MISSING]: 401,
|
|
54
|
+
[ErrorCode.INSUFFICIENT_PERMISSIONS]: 403,
|
|
55
|
+
[ErrorCode.ORG_MISMATCH]: 403,
|
|
56
|
+
[ErrorCode.COMPLIANCE_VIOLATION]: 403,
|
|
57
|
+
[ErrorCode.NOT_FOUND]: 404,
|
|
58
|
+
[ErrorCode.ORG_NOT_FOUND]: 404,
|
|
59
|
+
[ErrorCode.VALIDATION_ERROR]: 400,
|
|
60
|
+
[ErrorCode.MISSING_REQUIRED_FIELD]: 400,
|
|
61
|
+
[ErrorCode.QUOTA_EXCEEDED]: 429,
|
|
62
|
+
[ErrorCode.RATE_LIMIT_EXCEEDED]: 429,
|
|
63
|
+
[ErrorCode.CONFLICT]: 409,
|
|
64
|
+
[ErrorCode.DUPLICATE_ENTRY]: 409,
|
|
65
|
+
[ErrorCode.SCAN_CONFLICT]: 409,
|
|
66
|
+
[ErrorCode.INTERNAL_ERROR]: 500,
|
|
67
|
+
[ErrorCode.DATABASE_ERROR]: 500,
|
|
68
|
+
[ErrorCode.SERVICE_UNAVAILABLE]: 503,
|
|
69
|
+
[ErrorCode.COMPLIANCE_SERVICE_UNAVAILABLE]: 503,
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Get the HTTP status code for an error code.
|
|
73
|
+
*/
|
|
74
|
+
function getStatusForErrorCode(code) {
|
|
75
|
+
return exports.ErrorCodeStatus[code] ?? 500;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItY29kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvZXJyb3ItY29kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQTZFdEMsc0RBRUM7QUE3RUQ7Ozs7Ozs7R0FPRztBQUNILElBQVksU0FvQ1g7QUFwQ0QsV0FBWSxTQUFTO0lBQ25CLDhCQUE4QjtJQUM5QiwwQ0FBNkIsQ0FBQTtJQUM3Qiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUUvQiw2QkFBNkI7SUFDN0Isa0VBQXFELENBQUE7SUFDckQsMENBQTZCLENBQUE7SUFDN0IsMERBQTZDLENBQUE7SUFFN0MseUJBQXlCO0lBQ3pCLG9DQUF1QixDQUFBO0lBQ3ZCLDRDQUErQixDQUFBO0lBRS9CLDBCQUEwQjtJQUMxQixrREFBcUMsQ0FBQTtJQUNyQyw4REFBaUQsQ0FBQTtJQUVqRCxnQ0FBZ0M7SUFDaEMsOENBQWlDLENBQUE7SUFDakMsd0RBQTJDLENBQUE7SUFFM0Msd0JBQXdCO0lBQ3hCLGtDQUFxQixDQUFBO0lBQ3JCLGdEQUFtQyxDQUFBO0lBQ25DLDRDQUErQixDQUFBO0lBRS9CLHNCQUFzQjtJQUN0Qiw4Q0FBaUMsQ0FBQTtJQUNqQyw4Q0FBaUMsQ0FBQTtJQUVqQyw0QkFBNEI7SUFDNUIsd0RBQTJDLENBQUE7SUFDM0MsOEVBQWlFLENBQUE7QUFDbkUsQ0FBQyxFQXBDVyxTQUFTLHlCQUFULFNBQVMsUUFvQ3BCO0FBRUQ7O0dBRUc7QUFDVSxRQUFBLGVBQWUsR0FBOEI7SUFDeEQsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRztJQUM3QixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxHQUFHO0lBQzlCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUc7SUFDOUIsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsR0FBRztJQUM5QixDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLEdBQUc7SUFDekMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRztJQUM3QixDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEdBQUc7SUFDckMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRztJQUMxQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxHQUFHO0lBQzlCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsR0FBRztJQUNqQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEdBQUc7SUFDdkMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsR0FBRztJQUMvQixDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEdBQUc7SUFDcEMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRztJQUN6QixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHO0lBQ2hDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUc7SUFDOUIsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsR0FBRztJQUMvQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxHQUFHO0lBQy9CLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsR0FBRztJQUNwQyxDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLEdBQUc7Q0FDaEQsQ0FBQztBQUVGOztHQUVHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsSUFBZTtJQUNuRCxPQUFPLHVCQUFlLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTdGFuZGFyZGl6ZWQgZXJyb3IgY29kZXMgdXNlZCBhY3Jvc3MgYWxsIEFQSSBtaWNyb3NlcnZpY2VzLlxuICogVXNlIHRoZXNlIGNvZGVzIGluIGVycm9yIHJlc3BvbnNlcyBmb3IgY29uc2lzdGVudCBjbGllbnQgaGFuZGxpbmcuXG4gKlxuICogRWFjaCBIVFRQIHN0YXR1cyBjYXRlZ29yeSBoYXMgb25lIHByaW1hcnkgY29kZS4gVXNlIHRoZSBgZGV0YWlsc2BcbiAqIGZpZWxkIGluIGVycm9yIHJlc3BvbnNlcyBmb3Igc3ViLXR5cGUgaW5mb3JtYXRpb24gKGUuZy4gd2hpY2ggcXVvdGFcbiAqIHdhcyBleGNlZWRlZCwgd2hpY2ggZmllbGQgZmFpbGVkIHZhbGlkYXRpb24pLlxuICovXG5leHBvcnQgZW51bSBFcnJvckNvZGUge1xuICAvLyBBdXRoZW50aWNhdGlvbiBlcnJvcnMgKDQwMSlcbiAgVU5BVVRIT1JJWkVEID0gJ1VOQVVUSE9SSVpFRCcsXG4gIFRPS0VOX0VYUElSRUQgPSAnVE9LRU5fRVhQSVJFRCcsXG4gIFRPS0VOX0lOVkFMSUQgPSAnVE9LRU5fSU5WQUxJRCcsXG4gIFRPS0VOX01JU1NJTkcgPSAnVE9LRU5fTUlTU0lORycsXG5cbiAgLy8gQXV0aG9yaXphdGlvbiBlcnJvcnMgKDQwMylcbiAgSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TID0gJ0lOU1VGRklDSUVOVF9QRVJNSVNTSU9OUycsXG4gIE9SR19NSVNNQVRDSCA9ICdPUkdfTUlTTUFUQ0gnLFxuICBDT01QTElBTkNFX1ZJT0xBVElPTiA9ICdDT01QTElBTkNFX1ZJT0xBVElPTicsXG5cbiAgLy8gTm90IGZvdW5kIGVycm9ycyAoNDA0KVxuICBOT1RfRk9VTkQgPSAnTk9UX0ZPVU5EJyxcbiAgT1JHX05PVF9GT1VORCA9ICdPUkdfTk9UX0ZPVU5EJyxcblxuICAvLyBWYWxpZGF0aW9uIGVycm9ycyAoNDAwKVxuICBWQUxJREFUSU9OX0VSUk9SID0gJ1ZBTElEQVRJT05fRVJST1InLFxuICBNSVNTSU5HX1JFUVVJUkVEX0ZJRUxEID0gJ01JU1NJTkdfUkVRVUlSRURfRklFTEQnLFxuXG4gIC8vIFF1b3RhL1JhdGUgbGltaXQgZXJyb3JzICg0MjkpXG4gIFFVT1RBX0VYQ0VFREVEID0gJ1FVT1RBX0VYQ0VFREVEJyxcbiAgUkFURV9MSU1JVF9FWENFRURFRCA9ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcblxuICAvLyBDb25mbGljdCBlcnJvcnMgKDQwOSlcbiAgQ09ORkxJQ1QgPSAnQ09ORkxJQ1QnLFxuICBEVVBMSUNBVEVfRU5UUlkgPSAnRFVQTElDQVRFX0VOVFJZJyxcbiAgU0NBTl9DT05GTElDVCA9ICdTQ0FOX0NPTkZMSUNUJyxcblxuICAvLyBTZXJ2ZXIgZXJyb3JzICg1MDApXG4gIElOVEVSTkFMX0VSUk9SID0gJ0lOVEVSTkFMX0VSUk9SJyxcbiAgREFUQUJBU0VfRVJST1IgPSAnREFUQUJBU0VfRVJST1InLFxuXG4gIC8vIFNlcnZpY2UgdW5hdmFpbGFibGUgKDUwMylcbiAgU0VSVklDRV9VTkFWQUlMQUJMRSA9ICdTRVJWSUNFX1VOQVZBSUxBQkxFJyxcbiAgQ09NUExJQU5DRV9TRVJWSUNFX1VOQVZBSUxBQkxFID0gJ0NPTVBMSUFOQ0VfU0VSVklDRV9VTkFWQUlMQUJMRScsXG59XG5cbi8qKlxuICogTWFwcyBlcnJvciBjb2RlcyB0byB0aGVpciBkZWZhdWx0IEhUVFAgc3RhdHVzIGNvZGVzLlxuICovXG5leHBvcnQgY29uc3QgRXJyb3JDb2RlU3RhdHVzOiBSZWNvcmQ8RXJyb3JDb2RlLCBudW1iZXI+ID0ge1xuICBbRXJyb3JDb2RlLlVOQVVUSE9SSVpFRF06IDQwMSxcbiAgW0Vycm9yQ29kZS5UT0tFTl9FWFBJUkVEXTogNDAxLFxuICBbRXJyb3JDb2RlLlRPS0VOX0lOVkFMSURdOiA0MDEsXG4gIFtFcnJvckNvZGUuVE9LRU5fTUlTU0lOR106IDQwMSxcbiAgW0Vycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlNdOiA0MDMsXG4gIFtFcnJvckNvZGUuT1JHX01JU01BVENIXTogNDAzLFxuICBbRXJyb3JDb2RlLkNPTVBMSUFOQ0VfVklPTEFUSU9OXTogNDAzLFxuICBbRXJyb3JDb2RlLk5PVF9GT1VORF06IDQwNCxcbiAgW0Vycm9yQ29kZS5PUkdfTk9UX0ZPVU5EXTogNDA0LFxuICBbRXJyb3JDb2RlLlZBTElEQVRJT05fRVJST1JdOiA0MDAsXG4gIFtFcnJvckNvZGUuTUlTU0lOR19SRVFVSVJFRF9GSUVMRF06IDQwMCxcbiAgW0Vycm9yQ29kZS5RVU9UQV9FWENFRURFRF06IDQyOSxcbiAgW0Vycm9yQ29kZS5SQVRFX0xJTUlUX0VYQ0VFREVEXTogNDI5LFxuICBbRXJyb3JDb2RlLkNPTkZMSUNUXTogNDA5LFxuICBbRXJyb3JDb2RlLkRVUExJQ0FURV9FTlRSWV06IDQwOSxcbiAgW0Vycm9yQ29kZS5TQ0FOX0NPTkZMSUNUXTogNDA5LFxuICBbRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXTogNTAwLFxuICBbRXJyb3JDb2RlLkRBVEFCQVNFX0VSUk9SXTogNTAwLFxuICBbRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEVdOiA1MDMsXG4gIFtFcnJvckNvZGUuQ09NUExJQU5DRV9TRVJWSUNFX1VOQVZBSUxBQkxFXTogNTAzLFxufTtcblxuLyoqXG4gKiBHZXQgdGhlIEhUVFAgc3RhdHVzIGNvZGUgZm9yIGFuIGVycm9yIGNvZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0dXNGb3JFcnJvckNvZGUoY29kZTogRXJyb3JDb2RlKTogbnVtYmVyIHtcbiAgcmV0dXJuIEVycm9yQ29kZVN0YXR1c1tjb2RlXSA/PyA1MDA7XG59XG4iXX0=
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { QuotaTier } from './quota-tiers';
|
|
2
|
+
/** Canonical feature flag identifiers. */
|
|
3
|
+
export type FeatureFlag = 'priority_support' | 'custom_integrations' | 'ai_generation' | 'bulk_operations' | 'audit_log';
|
|
4
|
+
/** All valid feature flags (order determines display order). */
|
|
5
|
+
export declare const ALL_FEATURE_FLAGS: readonly FeatureFlag[];
|
|
6
|
+
/** Check whether a string is a valid FeatureFlag. */
|
|
7
|
+
export declare function isValidFeatureFlag(value: string): value is FeatureFlag;
|
|
8
|
+
/** Features enabled by default for each tier. */
|
|
9
|
+
export declare const TIER_FEATURES: Record<QuotaTier, readonly FeatureFlag[]>;
|
|
10
|
+
/** Human-readable metadata for each feature flag. */
|
|
11
|
+
export declare const FEATURE_METADATA: Record<FeatureFlag, {
|
|
12
|
+
label: string;
|
|
13
|
+
description: string;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Resolve a user's effective feature set.
|
|
17
|
+
*
|
|
18
|
+
* 1. System org users always get ALL features.
|
|
19
|
+
* 2. Start with the tier's default features.
|
|
20
|
+
* 3. Apply per-user overrides: `true` adds a feature, `false` removes it.
|
|
21
|
+
* 4. Invalid override keys are silently ignored.
|
|
22
|
+
*
|
|
23
|
+
* @param tier - The organization's quota tier
|
|
24
|
+
* @param featureOverrides - Per-user overrides (key = feature flag, value = enabled)
|
|
25
|
+
* @param isSystemOrg - Whether the user belongs to the system organization
|
|
26
|
+
* @returns Sorted array of enabled feature flags
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveUserFeatures(tier: QuotaTier, featureOverrides?: Record<string, boolean> | null, isSystemOrg?: boolean): FeatureFlag[];
|
|
29
|
+
/**
|
|
30
|
+
* Check if a specific feature is enabled for a user.
|
|
31
|
+
*
|
|
32
|
+
* @param tier - The organization's quota tier
|
|
33
|
+
* @param feature - The feature flag to check
|
|
34
|
+
* @param featureOverrides - Per-user overrides
|
|
35
|
+
* @param isSystemOrg - Whether the user belongs to the system organization
|
|
36
|
+
* @returns true if the feature is enabled
|
|
37
|
+
*/
|
|
38
|
+
export declare function hasFeature(tier: QuotaTier, feature: FeatureFlag, featureOverrides?: Record<string, boolean> | null, isSystemOrg?: boolean): boolean;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.FEATURE_METADATA = exports.TIER_FEATURES = exports.ALL_FEATURE_FLAGS = void 0;
|
|
6
|
+
exports.isValidFeatureFlag = isValidFeatureFlag;
|
|
7
|
+
exports.resolveUserFeatures = resolveUserFeatures;
|
|
8
|
+
exports.hasFeature = hasFeature;
|
|
9
|
+
/** All valid feature flags (order determines display order). */
|
|
10
|
+
exports.ALL_FEATURE_FLAGS = [
|
|
11
|
+
'priority_support',
|
|
12
|
+
'ai_generation',
|
|
13
|
+
'bulk_operations',
|
|
14
|
+
'custom_integrations',
|
|
15
|
+
'audit_log',
|
|
16
|
+
];
|
|
17
|
+
/** Check whether a string is a valid FeatureFlag. */
|
|
18
|
+
function isValidFeatureFlag(value) {
|
|
19
|
+
return exports.ALL_FEATURE_FLAGS.includes(value);
|
|
20
|
+
}
|
|
21
|
+
// Tier-to-feature mapping
|
|
22
|
+
/** Features enabled by default for each tier. */
|
|
23
|
+
exports.TIER_FEATURES = {
|
|
24
|
+
developer: [],
|
|
25
|
+
pro: ['priority_support', 'ai_generation', 'bulk_operations'],
|
|
26
|
+
unlimited: [...exports.ALL_FEATURE_FLAGS],
|
|
27
|
+
};
|
|
28
|
+
// Feature metadata (for display)
|
|
29
|
+
/** Human-readable metadata for each feature flag. */
|
|
30
|
+
exports.FEATURE_METADATA = {
|
|
31
|
+
priority_support: {
|
|
32
|
+
label: 'Priority Support',
|
|
33
|
+
description: 'Faster response times and dedicated support channels',
|
|
34
|
+
},
|
|
35
|
+
ai_generation: {
|
|
36
|
+
label: 'AI Generation',
|
|
37
|
+
description: 'AI-powered pipeline and plugin generation',
|
|
38
|
+
},
|
|
39
|
+
bulk_operations: {
|
|
40
|
+
label: 'Bulk Operations',
|
|
41
|
+
description: 'Batch create, update, and delete for pipelines and plugins',
|
|
42
|
+
},
|
|
43
|
+
custom_integrations: {
|
|
44
|
+
label: 'Custom Integrations',
|
|
45
|
+
description: 'Connect to external services and custom webhook endpoints',
|
|
46
|
+
},
|
|
47
|
+
audit_log: {
|
|
48
|
+
label: 'Audit Log',
|
|
49
|
+
description: 'Detailed audit trail of all user and system actions',
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
// Resolution logic
|
|
53
|
+
/**
|
|
54
|
+
* Resolve a user's effective feature set.
|
|
55
|
+
*
|
|
56
|
+
* 1. System org users always get ALL features.
|
|
57
|
+
* 2. Start with the tier's default features.
|
|
58
|
+
* 3. Apply per-user overrides: `true` adds a feature, `false` removes it.
|
|
59
|
+
* 4. Invalid override keys are silently ignored.
|
|
60
|
+
*
|
|
61
|
+
* @param tier - The organization's quota tier
|
|
62
|
+
* @param featureOverrides - Per-user overrides (key = feature flag, value = enabled)
|
|
63
|
+
* @param isSystemOrg - Whether the user belongs to the system organization
|
|
64
|
+
* @returns Sorted array of enabled feature flags
|
|
65
|
+
*/
|
|
66
|
+
function resolveUserFeatures(tier, featureOverrides, isSystemOrg) {
|
|
67
|
+
// System org always gets everything
|
|
68
|
+
if (isSystemOrg)
|
|
69
|
+
return [...exports.ALL_FEATURE_FLAGS];
|
|
70
|
+
// Start with tier defaults
|
|
71
|
+
const features = new Set(exports.TIER_FEATURES[tier] ?? []);
|
|
72
|
+
// Apply per-user overrides
|
|
73
|
+
if (featureOverrides) {
|
|
74
|
+
for (const [key, enabled] of Object.entries(featureOverrides)) {
|
|
75
|
+
if (!isValidFeatureFlag(key))
|
|
76
|
+
continue;
|
|
77
|
+
if (enabled) {
|
|
78
|
+
features.add(key);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
features.delete(key);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Return in canonical order
|
|
86
|
+
return exports.ALL_FEATURE_FLAGS.filter(f => features.has(f));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Check if a specific feature is enabled for a user.
|
|
90
|
+
*
|
|
91
|
+
* @param tier - The organization's quota tier
|
|
92
|
+
* @param feature - The feature flag to check
|
|
93
|
+
* @param featureOverrides - Per-user overrides
|
|
94
|
+
* @param isSystemOrg - Whether the user belongs to the system organization
|
|
95
|
+
* @returns true if the feature is enabled
|
|
96
|
+
*/
|
|
97
|
+
function hasFeature(tier, feature, featureOverrides, isSystemOrg) {
|
|
98
|
+
if (isSystemOrg)
|
|
99
|
+
return true;
|
|
100
|
+
// Check override first
|
|
101
|
+
if (featureOverrides && feature in featureOverrides) {
|
|
102
|
+
return featureOverrides[feature];
|
|
103
|
+
}
|
|
104
|
+
// Fall back to tier default
|
|
105
|
+
return (exports.TIER_FEATURES[tier] ?? []).includes(feature);
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1mbGFncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9mZWF0dXJlLWZsYWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7QUF3QnRDLGdEQUVDO0FBb0RELGtEQXlCQztBQVdELGdDQWVDO0FBbkhELGdFQUFnRTtBQUNuRCxRQUFBLGlCQUFpQixHQUEyQjtJQUN2RCxrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixxQkFBcUI7SUFDckIsV0FBVztDQUNaLENBQUM7QUFFRixxREFBcUQ7QUFDckQsU0FBZ0Isa0JBQWtCLENBQUMsS0FBYTtJQUM5QyxPQUFRLHlCQUF1QyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsMEJBQTBCO0FBRTFCLGlEQUFpRDtBQUNwQyxRQUFBLGFBQWEsR0FBOEM7SUFDdEUsU0FBUyxFQUFFLEVBQUU7SUFDYixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLENBQUM7SUFDN0QsU0FBUyxFQUFFLENBQUMsR0FBRyx5QkFBaUIsQ0FBQztDQUNsQyxDQUFDO0FBRUYsaUNBQWlDO0FBRWpDLHFEQUFxRDtBQUN4QyxRQUFBLGdCQUFnQixHQUFnRTtJQUMzRixnQkFBZ0IsRUFBRTtRQUNoQixLQUFLLEVBQUUsa0JBQWtCO1FBQ3pCLFdBQVcsRUFBRSxzREFBc0Q7S0FDcEU7SUFDRCxhQUFhLEVBQUU7UUFDYixLQUFLLEVBQUUsZUFBZTtRQUN0QixXQUFXLEVBQUUsMkNBQTJDO0tBQ3pEO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixXQUFXLEVBQUUsNERBQTREO0tBQzFFO0lBQ0QsbUJBQW1CLEVBQUU7UUFDbkIsS0FBSyxFQUFFLHFCQUFxQjtRQUM1QixXQUFXLEVBQUUsMkRBQTJEO0tBQ3pFO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsS0FBSyxFQUFFLFdBQVc7UUFDbEIsV0FBVyxFQUFFLHFEQUFxRDtLQUNuRTtDQUNGLENBQUM7QUFFRixtQkFBbUI7QUFFbkI7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQ2pDLElBQWUsRUFDZixnQkFBaUQsRUFDakQsV0FBcUI7SUFFckIsb0NBQW9DO0lBQ3BDLElBQUksV0FBVztRQUFFLE9BQU8sQ0FBQyxHQUFHLHlCQUFpQixDQUFDLENBQUM7SUFFL0MsMkJBQTJCO0lBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFjLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFFakUsMkJBQTJCO0lBQzNCLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDOUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztnQkFBRSxTQUFTO1lBQ3ZDLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsT0FBTyx5QkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsVUFBVSxDQUN4QixJQUFlLEVBQ2YsT0FBb0IsRUFDcEIsZ0JBQWlELEVBQ2pELFdBQXFCO0lBRXJCLElBQUksV0FBVztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRTdCLHVCQUF1QjtJQUN2QixJQUFJLGdCQUFnQixJQUFJLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3BELE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELDRCQUE0QjtJQUM1QixPQUFPLENBQUMscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFF1b3RhVGllciB9IGZyb20gJy4vcXVvdGEtdGllcnMnO1xuXG4vLyBGZWF0dXJlIGZsYWcgaWRlbnRpZmllcnNcblxuLyoqIENhbm9uaWNhbCBmZWF0dXJlIGZsYWcgaWRlbnRpZmllcnMuICovXG5leHBvcnQgdHlwZSBGZWF0dXJlRmxhZyA9XG4gIHwgJ3ByaW9yaXR5X3N1cHBvcnQnXG4gIHwgJ2N1c3RvbV9pbnRlZ3JhdGlvbnMnXG4gIHwgJ2FpX2dlbmVyYXRpb24nXG4gIHwgJ2J1bGtfb3BlcmF0aW9ucydcbiAgfCAnYXVkaXRfbG9nJztcblxuLyoqIEFsbCB2YWxpZCBmZWF0dXJlIGZsYWdzIChvcmRlciBkZXRlcm1pbmVzIGRpc3BsYXkgb3JkZXIpLiAqL1xuZXhwb3J0IGNvbnN0IEFMTF9GRUFUVVJFX0ZMQUdTOiByZWFkb25seSBGZWF0dXJlRmxhZ1tdID0gW1xuICAncHJpb3JpdHlfc3VwcG9ydCcsXG4gICdhaV9nZW5lcmF0aW9uJyxcbiAgJ2J1bGtfb3BlcmF0aW9ucycsXG4gICdjdXN0b21faW50ZWdyYXRpb25zJyxcbiAgJ2F1ZGl0X2xvZycsXG5dO1xuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIEZlYXR1cmVGbGFnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRGZWF0dXJlRmxhZyh2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgRmVhdHVyZUZsYWcge1xuICByZXR1cm4gKEFMTF9GRUFUVVJFX0ZMQUdTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbi8vIFRpZXItdG8tZmVhdHVyZSBtYXBwaW5nXG5cbi8qKiBGZWF0dXJlcyBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIGVhY2ggdGllci4gKi9cbmV4cG9ydCBjb25zdCBUSUVSX0ZFQVRVUkVTOiBSZWNvcmQ8UXVvdGFUaWVyLCByZWFkb25seSBGZWF0dXJlRmxhZ1tdPiA9IHtcbiAgZGV2ZWxvcGVyOiBbXSxcbiAgcHJvOiBbJ3ByaW9yaXR5X3N1cHBvcnQnLCAnYWlfZ2VuZXJhdGlvbicsICdidWxrX29wZXJhdGlvbnMnXSxcbiAgdW5saW1pdGVkOiBbLi4uQUxMX0ZFQVRVUkVfRkxBR1NdLFxufTtcblxuLy8gRmVhdHVyZSBtZXRhZGF0YSAoZm9yIGRpc3BsYXkpXG5cbi8qKiBIdW1hbi1yZWFkYWJsZSBtZXRhZGF0YSBmb3IgZWFjaCBmZWF0dXJlIGZsYWcuICovXG5leHBvcnQgY29uc3QgRkVBVFVSRV9NRVRBREFUQTogUmVjb3JkPEZlYXR1cmVGbGFnLCB7IGxhYmVsOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfT4gPSB7XG4gIHByaW9yaXR5X3N1cHBvcnQ6IHtcbiAgICBsYWJlbDogJ1ByaW9yaXR5IFN1cHBvcnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRmFzdGVyIHJlc3BvbnNlIHRpbWVzIGFuZCBkZWRpY2F0ZWQgc3VwcG9ydCBjaGFubmVscycsXG4gIH0sXG4gIGFpX2dlbmVyYXRpb246IHtcbiAgICBsYWJlbDogJ0FJIEdlbmVyYXRpb24nLFxuICAgIGRlc2NyaXB0aW9uOiAnQUktcG93ZXJlZCBwaXBlbGluZSBhbmQgcGx1Z2luIGdlbmVyYXRpb24nLFxuICB9LFxuICBidWxrX29wZXJhdGlvbnM6IHtcbiAgICBsYWJlbDogJ0J1bGsgT3BlcmF0aW9ucycsXG4gICAgZGVzY3JpcHRpb246ICdCYXRjaCBjcmVhdGUsIHVwZGF0ZSwgYW5kIGRlbGV0ZSBmb3IgcGlwZWxpbmVzIGFuZCBwbHVnaW5zJyxcbiAgfSxcbiAgY3VzdG9tX2ludGVncmF0aW9uczoge1xuICAgIGxhYmVsOiAnQ3VzdG9tIEludGVncmF0aW9ucycsXG4gICAgZGVzY3JpcHRpb246ICdDb25uZWN0IHRvIGV4dGVybmFsIHNlcnZpY2VzIGFuZCBjdXN0b20gd2ViaG9vayBlbmRwb2ludHMnLFxuICB9LFxuICBhdWRpdF9sb2c6IHtcbiAgICBsYWJlbDogJ0F1ZGl0IExvZycsXG4gICAgZGVzY3JpcHRpb246ICdEZXRhaWxlZCBhdWRpdCB0cmFpbCBvZiBhbGwgdXNlciBhbmQgc3lzdGVtIGFjdGlvbnMnLFxuICB9LFxufTtcblxuLy8gUmVzb2x1dGlvbiBsb2dpY1xuXG4vKipcbiAqIFJlc29sdmUgYSB1c2VyJ3MgZWZmZWN0aXZlIGZlYXR1cmUgc2V0LlxuICpcbiAqIDEuIFN5c3RlbSBvcmcgdXNlcnMgYWx3YXlzIGdldCBBTEwgZmVhdHVyZXMuXG4gKiAyLiBTdGFydCB3aXRoIHRoZSB0aWVyJ3MgZGVmYXVsdCBmZWF0dXJlcy5cbiAqIDMuIEFwcGx5IHBlci11c2VyIG92ZXJyaWRlczogYHRydWVgIGFkZHMgYSBmZWF0dXJlLCBgZmFsc2VgIHJlbW92ZXMgaXQuXG4gKiA0LiBJbnZhbGlkIG92ZXJyaWRlIGtleXMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHRpZXIgLSBUaGUgb3JnYW5pemF0aW9uJ3MgcXVvdGEgdGllclxuICogQHBhcmFtIGZlYXR1cmVPdmVycmlkZXMgLSBQZXItdXNlciBvdmVycmlkZXMgKGtleSA9IGZlYXR1cmUgZmxhZywgdmFsdWUgPSBlbmFibGVkKVxuICogQHBhcmFtIGlzU3lzdGVtT3JnIC0gV2hldGhlciB0aGUgdXNlciBiZWxvbmdzIHRvIHRoZSBzeXN0ZW0gb3JnYW5pemF0aW9uXG4gKiBAcmV0dXJucyBTb3J0ZWQgYXJyYXkgb2YgZW5hYmxlZCBmZWF0dXJlIGZsYWdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlckZlYXR1cmVzKFxuICB0aWVyOiBRdW90YVRpZXIsXG4gIGZlYXR1cmVPdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB8IG51bGwsXG4gIGlzU3lzdGVtT3JnPzogYm9vbGVhbixcbik6IEZlYXR1cmVGbGFnW10ge1xuICAvLyBTeXN0ZW0gb3JnIGFsd2F5cyBnZXRzIGV2ZXJ5dGhpbmdcbiAgaWYgKGlzU3lzdGVtT3JnKSByZXR1cm4gWy4uLkFMTF9GRUFUVVJFX0ZMQUdTXTtcblxuICAvLyBTdGFydCB3aXRoIHRpZXIgZGVmYXVsdHNcbiAgY29uc3QgZmVhdHVyZXMgPSBuZXcgU2V0PEZlYXR1cmVGbGFnPihUSUVSX0ZFQVRVUkVTW3RpZXJdID8/IFtdKTtcblxuICAvLyBBcHBseSBwZXItdXNlciBvdmVycmlkZXNcbiAgaWYgKGZlYXR1cmVPdmVycmlkZXMpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVuYWJsZWRdIG9mIE9iamVjdC5lbnRyaWVzKGZlYXR1cmVPdmVycmlkZXMpKSB7XG4gICAgICBpZiAoIWlzVmFsaWRGZWF0dXJlRmxhZyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIGZlYXR1cmVzLmFkZChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmVhdHVyZXMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJuIGluIGNhbm9uaWNhbCBvcmRlclxuICByZXR1cm4gQUxMX0ZFQVRVUkVfRkxBR1MuZmlsdGVyKGYgPT4gZmVhdHVyZXMuaGFzKGYpKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHNwZWNpZmljIGZlYXR1cmUgaXMgZW5hYmxlZCBmb3IgYSB1c2VyLlxuICpcbiAqIEBwYXJhbSB0aWVyIC0gVGhlIG9yZ2FuaXphdGlvbidzIHF1b3RhIHRpZXJcbiAqIEBwYXJhbSBmZWF0dXJlIC0gVGhlIGZlYXR1cmUgZmxhZyB0byBjaGVja1xuICogQHBhcmFtIGZlYXR1cmVPdmVycmlkZXMgLSBQZXItdXNlciBvdmVycmlkZXNcbiAqIEBwYXJhbSBpc1N5c3RlbU9yZyAtIFdoZXRoZXIgdGhlIHVzZXIgYmVsb25ncyB0byB0aGUgc3lzdGVtIG9yZ2FuaXphdGlvblxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGZWF0dXJlKFxuICB0aWVyOiBRdW90YVRpZXIsXG4gIGZlYXR1cmU6IEZlYXR1cmVGbGFnLFxuICBmZWF0dXJlT3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gfCBudWxsLFxuICBpc1N5c3RlbU9yZz86IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgaWYgKGlzU3lzdGVtT3JnKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBDaGVjayBvdmVycmlkZSBmaXJzdFxuICBpZiAoZmVhdHVyZU92ZXJyaWRlcyAmJiBmZWF0dXJlIGluIGZlYXR1cmVPdmVycmlkZXMpIHtcbiAgICByZXR1cm4gZmVhdHVyZU92ZXJyaWRlc1tmZWF0dXJlXTtcbiAgfVxuXG4gIC8vIEZhbGwgYmFjayB0byB0aWVyIGRlZmF1bHRcbiAgcmV0dXJuIChUSUVSX0ZFQVRVUkVTW3RpZXJdID8/IFtdKS5pbmNsdWRlcyhmZWF0dXJlKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic HTTP headers representation.
|
|
3
|
+
*/
|
|
4
|
+
export interface HttpHeaders {
|
|
5
|
+
[key: string]: string | string[] | undefined;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Generic HTTP request interface.
|
|
9
|
+
* Represents the minimal request shape needed by api-core utilities.
|
|
10
|
+
*/
|
|
11
|
+
export interface HttpRequest {
|
|
12
|
+
/** Request headers */
|
|
13
|
+
headers: HttpHeaders;
|
|
14
|
+
/** Route parameters */
|
|
15
|
+
params: Record<string, string | string[] | undefined>;
|
|
16
|
+
/** Query parameters */
|
|
17
|
+
query: Record<string, unknown>;
|
|
18
|
+
/** Authenticated user (if present) */
|
|
19
|
+
user?: {
|
|
20
|
+
organizationId?: string;
|
|
21
|
+
userId?: string;
|
|
22
|
+
role?: string;
|
|
23
|
+
[key: string]: unknown;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Generic HTTP response interface.
|
|
28
|
+
* Represents the minimal response shape needed by api-core utilities.
|
|
29
|
+
*/
|
|
30
|
+
export interface HttpResponse {
|
|
31
|
+
/** Set HTTP status code */
|
|
32
|
+
status(code: number): HttpResponse;
|
|
33
|
+
/** Send JSON response */
|
|
34
|
+
json(body: unknown): void;
|
|
35
|
+
/** Set response header */
|
|
36
|
+
setHeader(name: string, value: string | number): void;
|
|
37
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogR2VuZXJpYyBIVFRQIGhlYWRlcnMgcmVwcmVzZW50YXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cEhlYWRlcnMge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZW5lcmljIEhUVFAgcmVxdWVzdCBpbnRlcmZhY2UuXG4gKiBSZXByZXNlbnRzIHRoZSBtaW5pbWFsIHJlcXVlc3Qgc2hhcGUgbmVlZGVkIGJ5IGFwaS1jb3JlIHV0aWxpdGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwUmVxdWVzdCB7XG4gIC8qKiBSZXF1ZXN0IGhlYWRlcnMgKi9cbiAgaGVhZGVyczogSHR0cEhlYWRlcnM7XG4gIC8qKiBSb3V0ZSBwYXJhbWV0ZXJzICovXG4gIHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+O1xuICAvKiogUXVlcnkgcGFyYW1ldGVycyAqL1xuICBxdWVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBBdXRoZW50aWNhdGVkIHVzZXIgKGlmIHByZXNlbnQpICovXG4gIHVzZXI/OiB7XG4gICAgb3JnYW5pemF0aW9uSWQ/OiBzdHJpbmc7XG4gICAgdXNlcklkPzogc3RyaW5nO1xuICAgIHJvbGU/OiBzdHJpbmc7XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgfTtcbn1cblxuLyoqXG4gKiBHZW5lcmljIEhUVFAgcmVzcG9uc2UgaW50ZXJmYWNlLlxuICogUmVwcmVzZW50cyB0aGUgbWluaW1hbCByZXNwb25zZSBzaGFwZSBuZWVkZWQgYnkgYXBpLWNvcmUgdXRpbGl0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBSZXNwb25zZSB7XG4gIC8qKiBTZXQgSFRUUCBzdGF0dXMgY29kZSAqL1xuICBzdGF0dXMoY29kZTogbnVtYmVyKTogSHR0cFJlc3BvbnNlO1xuICAvKiogU2VuZCBKU09OIHJlc3BvbnNlICovXG4gIGpzb24oYm9keTogdW5rbm93bik6IHZvaWQ7XG4gIC8qKiBTZXQgcmVzcG9uc2UgaGVhZGVyICovXG4gIHNldEhlYWRlcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkO1xufVxuIl19
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
16
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
__exportStar(require("./error-codes"), exports);
|
|
20
|
+
__exportStar(require("./common"), exports);
|
|
21
|
+
__exportStar(require("./pipeline"), exports);
|
|
22
|
+
__exportStar(require("./http"), exports);
|
|
23
|
+
__exportStar(require("./quota-tiers"), exports);
|
|
24
|
+
__exportStar(require("./billing"), exports);
|
|
25
|
+
__exportStar(require("./feature-flags"), exports);
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFdEMsZ0RBQThCO0FBQzlCLDJDQUF5QjtBQUN6Qiw2Q0FBMkI7QUFDM0IseUNBQXVCO0FBQ3ZCLGdEQUE4QjtBQUM5Qiw0Q0FBMEI7QUFDMUIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCAqIGZyb20gJy4vZXJyb3ItY29kZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZSc7XG5leHBvcnQgKiBmcm9tICcuL2h0dHAnO1xuZXhwb3J0ICogZnJvbSAnLi9xdW90YS10aWVycyc7XG5leHBvcnQgKiBmcm9tICcuL2JpbGxpbmcnO1xuZXhwb3J0ICogZnJvbSAnLi9mZWF0dXJlLWZsYWdzJztcbiJdfQ==
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared pipeline types used by both pipeline-core and pipeline-data
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Utility type to extract the union of all values from an object type
|
|
6
|
+
*/
|
|
7
|
+
type ValueOf<T> = T[keyof T];
|
|
8
|
+
/**
|
|
9
|
+
* Access modifier for plugins and resources
|
|
10
|
+
*
|
|
11
|
+
* @property PUBLIC - Accessible to all users and organizations
|
|
12
|
+
* @property PRIVATE - Restricted to specific users or organizations
|
|
13
|
+
*/
|
|
14
|
+
export declare const AccessModifier: {
|
|
15
|
+
readonly PUBLIC: "public";
|
|
16
|
+
readonly PRIVATE: "private";
|
|
17
|
+
};
|
|
18
|
+
export type AccessModifier = ValueOf<typeof AccessModifier>;
|
|
19
|
+
/**
|
|
20
|
+
* AWS CodeBuild compute resource sizes
|
|
21
|
+
*
|
|
22
|
+
* @property SMALL - 3 GB memory, 2 vCPUs
|
|
23
|
+
* @property MEDIUM - 7 GB memory, 4 vCPUs
|
|
24
|
+
* @property LARGE - 15 GB memory, 8 vCPUs
|
|
25
|
+
* @property X2_LARGE - 145 GB memory, 72 vCPUs
|
|
26
|
+
*
|
|
27
|
+
* @see https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-compute-types.html
|
|
28
|
+
*/
|
|
29
|
+
export declare const ComputeType: {
|
|
30
|
+
readonly SMALL: "SMALL";
|
|
31
|
+
readonly MEDIUM: "MEDIUM";
|
|
32
|
+
readonly LARGE: "LARGE";
|
|
33
|
+
readonly X2_LARGE: "X2_LARGE";
|
|
34
|
+
};
|
|
35
|
+
export type ComputeType = ValueOf<typeof ComputeType>;
|
|
36
|
+
/**
|
|
37
|
+
* Types of pipeline steps that can be created by plugins
|
|
38
|
+
*
|
|
39
|
+
* @property CODE_BUILD_STEP - Full CodeBuild step with custom build environment
|
|
40
|
+
* @property SHELL_STEP - Simple shell step without custom build environment
|
|
41
|
+
* @property MANUAL_APPROVAL_STEP - Native CDK approval gate (no Docker image, no commands)
|
|
42
|
+
*/
|
|
43
|
+
export declare const PluginType: {
|
|
44
|
+
readonly CODE_BUILD_STEP: "CodeBuildStep";
|
|
45
|
+
readonly SHELL_STEP: "ShellStep";
|
|
46
|
+
readonly MANUAL_APPROVAL_STEP: "ManualApprovalStep";
|
|
47
|
+
};
|
|
48
|
+
export type PluginType = ValueOf<typeof PluginType>;
|
|
49
|
+
/**
|
|
50
|
+
* Metadata type for storing configuration and custom properties
|
|
51
|
+
*
|
|
52
|
+
* Supports:
|
|
53
|
+
* - Standard key-value pairs (string, boolean, number)
|
|
54
|
+
* - Custom AWS CDK keys with the pattern `aws:cdk:{namespace}:{key}`
|
|
55
|
+
* (all lowercase — matches the format produced by `getCustomKey`)
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const metadata: MetaDataType = {
|
|
60
|
+
* BUILD_ENV: 'production',
|
|
61
|
+
* NODE_VERSION: '18',
|
|
62
|
+
* ENABLE_CACHE: true,
|
|
63
|
+
* MAX_RETRIES: 3
|
|
64
|
+
* };
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export type MetaDataType = Record<string, string | boolean | number> & {
|
|
68
|
+
[K in `aws:cdk:${string}`]?: unknown;
|
|
69
|
+
};
|
|
70
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.PluginType = exports.ComputeType = exports.AccessModifier = void 0;
|
|
6
|
+
/**
|
|
7
|
+
* Access modifier for plugins and resources
|
|
8
|
+
*
|
|
9
|
+
* @property PUBLIC - Accessible to all users and organizations
|
|
10
|
+
* @property PRIVATE - Restricted to specific users or organizations
|
|
11
|
+
*/
|
|
12
|
+
exports.AccessModifier = {
|
|
13
|
+
PUBLIC: 'public',
|
|
14
|
+
PRIVATE: 'private',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* AWS CodeBuild compute resource sizes
|
|
18
|
+
*
|
|
19
|
+
* @property SMALL - 3 GB memory, 2 vCPUs
|
|
20
|
+
* @property MEDIUM - 7 GB memory, 4 vCPUs
|
|
21
|
+
* @property LARGE - 15 GB memory, 8 vCPUs
|
|
22
|
+
* @property X2_LARGE - 145 GB memory, 72 vCPUs
|
|
23
|
+
*
|
|
24
|
+
* @see https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-compute-types.html
|
|
25
|
+
*/
|
|
26
|
+
exports.ComputeType = {
|
|
27
|
+
SMALL: 'SMALL',
|
|
28
|
+
MEDIUM: 'MEDIUM',
|
|
29
|
+
LARGE: 'LARGE',
|
|
30
|
+
X2_LARGE: 'X2_LARGE',
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Types of pipeline steps that can be created by plugins
|
|
34
|
+
*
|
|
35
|
+
* @property CODE_BUILD_STEP - Full CodeBuild step with custom build environment
|
|
36
|
+
* @property SHELL_STEP - Simple shell step without custom build environment
|
|
37
|
+
* @property MANUAL_APPROVAL_STEP - Native CDK approval gate (no Docker image, no commands)
|
|
38
|
+
*/
|
|
39
|
+
exports.PluginType = {
|
|
40
|
+
CODE_BUILD_STEP: 'CodeBuildStep',
|
|
41
|
+
SHELL_STEP: 'ShellStep',
|
|
42
|
+
MANUAL_APPROVAL_STEP: 'ManualApprovalStep',
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQVd0Qzs7Ozs7R0FLRztBQUNVLFFBQUEsY0FBYyxHQUFHO0lBQzVCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLE9BQU8sRUFBRSxTQUFTO0NBQ1YsQ0FBQztBQUdYOzs7Ozs7Ozs7R0FTRztBQUNVLFFBQUEsV0FBVyxHQUFHO0lBQ3pCLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFFBQVE7SUFDaEIsS0FBSyxFQUFFLE9BQU87SUFDZCxRQUFRLEVBQUUsVUFBVTtDQUNaLENBQUM7QUFHWDs7Ozs7O0dBTUc7QUFDVSxRQUFBLFVBQVUsR0FBRztJQUN4QixlQUFlLEVBQUUsZUFBZTtJQUNoQyxVQUFVLEVBQUUsV0FBVztJQUN2QixvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNoYXJlZCBwaXBlbGluZSB0eXBlcyB1c2VkIGJ5IGJvdGggcGlwZWxpbmUtY29yZSBhbmQgcGlwZWxpbmUtZGF0YVxuICovXG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIGV4dHJhY3QgdGhlIHVuaW9uIG9mIGFsbCB2YWx1ZXMgZnJvbSBhbiBvYmplY3QgdHlwZVxuICovXG50eXBlIFZhbHVlT2Y8VD4gPSBUW2tleW9mIFRdO1xuXG4vKipcbiAqIEFjY2VzcyBtb2RpZmllciBmb3IgcGx1Z2lucyBhbmQgcmVzb3VyY2VzXG4gKlxuICogQHByb3BlcnR5IFBVQkxJQyAtIEFjY2Vzc2libGUgdG8gYWxsIHVzZXJzIGFuZCBvcmdhbml6YXRpb25zXG4gKiBAcHJvcGVydHkgUFJJVkFURSAtIFJlc3RyaWN0ZWQgdG8gc3BlY2lmaWMgdXNlcnMgb3Igb3JnYW5pemF0aW9uc1xuICovXG5leHBvcnQgY29uc3QgQWNjZXNzTW9kaWZpZXIgPSB7XG4gIFBVQkxJQzogJ3B1YmxpYycsXG4gIFBSSVZBVEU6ICdwcml2YXRlJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBBY2Nlc3NNb2RpZmllciA9IFZhbHVlT2Y8dHlwZW9mIEFjY2Vzc01vZGlmaWVyPjtcblxuLyoqXG4gKiBBV1MgQ29kZUJ1aWxkIGNvbXB1dGUgcmVzb3VyY2Ugc2l6ZXNcbiAqXG4gKiBAcHJvcGVydHkgU01BTEwgLSAzIEdCIG1lbW9yeSwgMiB2Q1BVc1xuICogQHByb3BlcnR5IE1FRElVTSAtIDcgR0IgbWVtb3J5LCA0IHZDUFVzXG4gKiBAcHJvcGVydHkgTEFSR0UgLSAxNSBHQiBtZW1vcnksIDggdkNQVXNcbiAqIEBwcm9wZXJ0eSBYMl9MQVJHRSAtIDE0NSBHQiBtZW1vcnksIDcyIHZDUFVzXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29kZWJ1aWxkL2xhdGVzdC91c2VyZ3VpZGUvYnVpbGQtZW52LXJlZi1jb21wdXRlLXR5cGVzLmh0bWxcbiAqL1xuZXhwb3J0IGNvbnN0IENvbXB1dGVUeXBlID0ge1xuICBTTUFMTDogJ1NNQUxMJyxcbiAgTUVESVVNOiAnTUVESVVNJyxcbiAgTEFSR0U6ICdMQVJHRScsXG4gIFgyX0xBUkdFOiAnWDJfTEFSR0UnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIENvbXB1dGVUeXBlID0gVmFsdWVPZjx0eXBlb2YgQ29tcHV0ZVR5cGU+O1xuXG4vKipcbiAqIFR5cGVzIG9mIHBpcGVsaW5lIHN0ZXBzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYnkgcGx1Z2luc1xuICpcbiAqIEBwcm9wZXJ0eSBDT0RFX0JVSUxEX1NURVAgLSBGdWxsIENvZGVCdWlsZCBzdGVwIHdpdGggY3VzdG9tIGJ1aWxkIGVudmlyb25tZW50XG4gKiBAcHJvcGVydHkgU0hFTExfU1RFUCAtIFNpbXBsZSBzaGVsbCBzdGVwIHdpdGhvdXQgY3VzdG9tIGJ1aWxkIGVudmlyb25tZW50XG4gKiBAcHJvcGVydHkgTUFOVUFMX0FQUFJPVkFMX1NURVAgLSBOYXRpdmUgQ0RLIGFwcHJvdmFsIGdhdGUgKG5vIERvY2tlciBpbWFnZSwgbm8gY29tbWFuZHMpXG4gKi9cbmV4cG9ydCBjb25zdCBQbHVnaW5UeXBlID0ge1xuICBDT0RFX0JVSUxEX1NURVA6ICdDb2RlQnVpbGRTdGVwJyxcbiAgU0hFTExfU1RFUDogJ1NoZWxsU3RlcCcsXG4gIE1BTlVBTF9BUFBST1ZBTF9TVEVQOiAnTWFudWFsQXBwcm92YWxTdGVwJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBQbHVnaW5UeXBlID0gVmFsdWVPZjx0eXBlb2YgUGx1Z2luVHlwZT47XG5cbi8qKlxuICogTWV0YWRhdGEgdHlwZSBmb3Igc3RvcmluZyBjb25maWd1cmF0aW9uIGFuZCBjdXN0b20gcHJvcGVydGllc1xuICpcbiAqIFN1cHBvcnRzOlxuICogLSBTdGFuZGFyZCBrZXktdmFsdWUgcGFpcnMgKHN0cmluZywgYm9vbGVhbiwgbnVtYmVyKVxuICogLSBDdXN0b20gQVdTIENESyBrZXlzIHdpdGggdGhlIHBhdHRlcm4gYGF3czpjZGs6e25hbWVzcGFjZX06e2tleX1gXG4gKiAgIChhbGwgbG93ZXJjYXNlIOKAlCBtYXRjaGVzIHRoZSBmb3JtYXQgcHJvZHVjZWQgYnkgYGdldEN1c3RvbUtleWApXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1ldGFkYXRhOiBNZXRhRGF0YVR5cGUgPSB7XG4gKiAgIEJVSUxEX0VOVjogJ3Byb2R1Y3Rpb24nLFxuICogICBOT0RFX1ZFUlNJT046ICcxOCcsXG4gKiAgIEVOQUJMRV9DQUNIRTogdHJ1ZSxcbiAqICAgTUFYX1JFVFJJRVM6IDNcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgTWV0YURhdGFUeXBlID1cbiAgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlcj4gJlxuICB7IFtLIGluIGBhd3M6Y2RrOiR7c3RyaW5nfWBdPzogdW5rbm93biB9O1xuIl19
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Available quota tier identifiers. */
|
|
2
|
+
export type QuotaTier = 'developer' | 'pro' | 'unlimited';
|
|
3
|
+
/** Limit values for each quota type within a tier. */
|
|
4
|
+
export interface QuotaTierLimits {
|
|
5
|
+
plugins: number;
|
|
6
|
+
pipelines: number;
|
|
7
|
+
apiCalls: number;
|
|
8
|
+
}
|
|
9
|
+
/** Full preset for a single tier (label + limits). */
|
|
10
|
+
export interface QuotaTierPreset {
|
|
11
|
+
label: string;
|
|
12
|
+
limits: QuotaTierLimits;
|
|
13
|
+
}
|
|
14
|
+
/** Preset limits for each tier. */
|
|
15
|
+
export declare const QUOTA_TIERS: Record<QuotaTier, QuotaTierPreset>;
|
|
16
|
+
/** All valid tier names. */
|
|
17
|
+
export declare const VALID_TIERS: readonly QuotaTier[];
|
|
18
|
+
/** Default tier assigned to new organizations. */
|
|
19
|
+
export declare const DEFAULT_TIER: QuotaTier;
|
|
20
|
+
/** Check whether a string is a valid QuotaTier. */
|
|
21
|
+
export declare function isValidTier(value: string): value is QuotaTier;
|
|
22
|
+
/** Get the default limits for a given tier (falls back to developer). */
|
|
23
|
+
export declare function getTierLimits(tier: string): QuotaTierLimits;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.DEFAULT_TIER = exports.VALID_TIERS = exports.QUOTA_TIERS = void 0;
|
|
6
|
+
exports.isValidTier = isValidTier;
|
|
7
|
+
exports.getTierLimits = getTierLimits;
|
|
8
|
+
/** Preset limits for each tier. */
|
|
9
|
+
exports.QUOTA_TIERS = {
|
|
10
|
+
developer: { label: 'Developer', limits: { plugins: 100, pipelines: 10, apiCalls: -1 } },
|
|
11
|
+
pro: { label: 'Pro', limits: { plugins: 1000, pipelines: 100, apiCalls: -1 } },
|
|
12
|
+
unlimited: { label: 'Unlimited', limits: { plugins: -1, pipelines: -1, apiCalls: -1 } },
|
|
13
|
+
};
|
|
14
|
+
/** All valid tier names. */
|
|
15
|
+
exports.VALID_TIERS = Object.keys(exports.QUOTA_TIERS);
|
|
16
|
+
/** Default tier assigned to new organizations. */
|
|
17
|
+
exports.DEFAULT_TIER = 'developer';
|
|
18
|
+
/** Check whether a string is a valid QuotaTier. */
|
|
19
|
+
function isValidTier(value) {
|
|
20
|
+
return value in exports.QUOTA_TIERS;
|
|
21
|
+
}
|
|
22
|
+
/** Get the default limits for a given tier (falls back to developer). */
|
|
23
|
+
function getTierLimits(tier) {
|
|
24
|
+
return isValidTier(tier) ? exports.QUOTA_TIERS[tier].limits : exports.QUOTA_TIERS.developer.limits;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtdGllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcXVvdGEtdGllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQWdDdEMsa0NBRUM7QUFHRCxzQ0FFQztBQXJCRCxtQ0FBbUM7QUFDdEIsUUFBQSxXQUFXLEdBQXVDO0lBQzdELFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3hGLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzlFLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtDQUN4RixDQUFDO0FBRUYsNEJBQTRCO0FBQ2YsUUFBQSxXQUFXLEdBQXlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQVcsQ0FBZ0IsQ0FBQztBQUV6RixrREFBa0Q7QUFDckMsUUFBQSxZQUFZLEdBQWMsV0FBVyxDQUFDO0FBRW5ELG1EQUFtRDtBQUNuRCxTQUFnQixXQUFXLENBQUMsS0FBYTtJQUN2QyxPQUFPLEtBQUssSUFBSSxtQkFBVyxDQUFDO0FBQzlCLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsU0FBZ0IsYUFBYSxDQUFDLElBQVk7SUFDeEMsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxtQkFBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7QUFDckYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKiogQXZhaWxhYmxlIHF1b3RhIHRpZXIgaWRlbnRpZmllcnMuICovXG5leHBvcnQgdHlwZSBRdW90YVRpZXIgPSAnZGV2ZWxvcGVyJyB8ICdwcm8nIHwgJ3VubGltaXRlZCc7XG5cbi8qKiBMaW1pdCB2YWx1ZXMgZm9yIGVhY2ggcXVvdGEgdHlwZSB3aXRoaW4gYSB0aWVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVRpZXJMaW1pdHMge1xuICBwbHVnaW5zOiBudW1iZXI7XG4gIHBpcGVsaW5lczogbnVtYmVyO1xuICBhcGlDYWxsczogbnVtYmVyO1xufVxuXG4vKiogRnVsbCBwcmVzZXQgZm9yIGEgc2luZ2xlIHRpZXIgKGxhYmVsICsgbGltaXRzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyUHJlc2V0IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgbGltaXRzOiBRdW90YVRpZXJMaW1pdHM7XG59XG5cbi8qKiBQcmVzZXQgbGltaXRzIGZvciBlYWNoIHRpZXIuICovXG5leHBvcnQgY29uc3QgUVVPVEFfVElFUlM6IFJlY29yZDxRdW90YVRpZXIsIFF1b3RhVGllclByZXNldD4gPSB7XG4gIGRldmVsb3BlcjogeyBsYWJlbDogJ0RldmVsb3BlcicsIGxpbWl0czogeyBwbHVnaW5zOiAxMDAsIHBpcGVsaW5lczogMTAsIGFwaUNhbGxzOiAtMSB9IH0sXG4gIHBybzogeyBsYWJlbDogJ1BybycsIGxpbWl0czogeyBwbHVnaW5zOiAxMDAwLCBwaXBlbGluZXM6IDEwMCwgYXBpQ2FsbHM6IC0xIH0gfSxcbiAgdW5saW1pdGVkOiB7IGxhYmVsOiAnVW5saW1pdGVkJywgbGltaXRzOiB7IHBsdWdpbnM6IC0xLCBwaXBlbGluZXM6IC0xLCBhcGlDYWxsczogLTEgfSB9LFxufTtcblxuLyoqIEFsbCB2YWxpZCB0aWVyIG5hbWVzLiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1RJRVJTOiByZWFkb25seSBRdW90YVRpZXJbXSA9IE9iamVjdC5rZXlzKFFVT1RBX1RJRVJTKSBhcyBRdW90YVRpZXJbXTtcblxuLyoqIERlZmF1bHQgdGllciBhc3NpZ25lZCB0byBuZXcgb3JnYW5pemF0aW9ucy4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJRVI6IFF1b3RhVGllciA9ICdkZXZlbG9wZXInO1xuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFF1b3RhVGllci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGllcih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUXVvdGFUaWVyIHtcbiAgcmV0dXJuIHZhbHVlIGluIFFVT1RBX1RJRVJTO1xufVxuXG4vKiogR2V0IHRoZSBkZWZhdWx0IGxpbWl0cyBmb3IgYSBnaXZlbiB0aWVyIChmYWxscyBiYWNrIHRvIGRldmVsb3BlcikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGllckxpbWl0cyh0aWVyOiBzdHJpbmcpOiBRdW90YVRpZXJMaW1pdHMge1xuICByZXR1cm4gaXNWYWxpZFRpZXIodGllcikgPyBRVU9UQV9USUVSU1t0aWVyXS5saW1pdHMgOiBRVU9UQV9USUVSUy5kZXZlbG9wZXIubGltaXRzO1xufVxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Result of alias resolution. */
|
|
2
|
+
export interface AliasResolution {
|
|
3
|
+
/** The resolved organization ID (e.g., 'system'). */
|
|
4
|
+
resolvedOrgId: string;
|
|
5
|
+
/** Whether the input was an alias that got resolved. */
|
|
6
|
+
wasAlias: boolean;
|
|
7
|
+
/** The original input value, useful for audit logging. */
|
|
8
|
+
originalValue: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Resolve an email-like alias to an actual organization ID.
|
|
12
|
+
*
|
|
13
|
+
* If the input matches a configured support alias, it resolves to the system
|
|
14
|
+
* org ID. Otherwise the input is returned as-is (lowercased).
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveRecipientAlias(recipientOrgId: string): AliasResolution;
|