@pipeline-builder/pipeline-core 4.1.15 → 4.1.17
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/lib/cdk.d.ts +1 -0
- package/lib/cdk.js +2 -1
- package/lib/config/app-config.d.ts +5 -8
- package/lib/config/app-config.js +36 -38
- package/lib/config/config-types.d.ts +9 -112
- package/lib/config/config-types.js +1 -1
- package/lib/config/handler-constants.d.ts +12 -3
- package/lib/config/handler-constants.js +9 -26
- package/lib/config/infrastructure-config.js +44 -43
- package/lib/config/server-config.d.ts +1 -1
- package/lib/config/server-config.js +33 -32
- package/lib/config/service-client.d.ts +3 -7
- package/lib/config/service-client.js +5 -11
- package/lib/core/artifact-manager.d.ts +0 -17
- package/lib/core/artifact-manager.js +1 -17
- package/lib/core/metadata-helpers.d.ts +16 -0
- package/lib/core/metadata-helpers.js +41 -1
- package/lib/core/pipeline-helpers.js +23 -58
- package/lib/core/plugin-contract.d.ts +126 -0
- package/lib/core/plugin-contract.js +217 -0
- package/lib/core/plugin-lookup-envelope.d.ts +14 -0
- package/lib/core/plugin-lookup-envelope.js +29 -0
- package/lib/core/step-manifest.d.ts +50 -0
- package/lib/core/step-manifest.js +47 -0
- package/lib/handlers/platform-credential.d.ts +47 -0
- package/lib/handlers/platform-credential.js +87 -0
- package/lib/handlers/plugin-lookup-handler.d.ts +1 -1
- package/lib/handlers/plugin-lookup-handler.js +48 -42
- package/lib/index.d.ts +8 -8
- package/lib/index.js +10 -9
- package/lib/pipeline/pipeline-builder.d.ts +7 -0
- package/lib/pipeline/pipeline-builder.js +25 -9
- package/lib/pipeline/pipeline-configuration.js +6 -5
- package/lib/pipeline/plugin-lookup.d.ts +0 -1
- package/lib/pipeline/plugin-lookup.js +55 -23
- package/lib/pipeline/plugin-spec.d.ts +41 -0
- package/lib/pipeline/plugin-spec.js +1 -1
- package/lib/pipeline/stage-builder.d.ts +11 -0
- package/lib/pipeline/stage-builder.js +31 -12
- package/lib/pipeline/step-manifest-recorder.d.ts +22 -0
- package/lib/pipeline/step-manifest-recorder.js +57 -0
- package/lib/pipeline/step-types.d.ts +16 -4
- package/lib/pipeline/step-types.js +1 -1
- package/lib/template/index.d.ts +4 -4
- package/lib/template/index.js +5 -5
- package/lib/template/plugin-resolver.js +5 -5
- package/lib/template/tokenizer.d.ts +4 -0
- package/lib/template/tokenizer.js +11 -7
- package/lib/testing/exports.json +72 -0
- package/package.json +36 -8
- package/lib/config/billing-config.d.ts +0 -27
- package/lib/config/billing-config.js +0 -534
- package/lib/config/entitlements.d.ts +0 -23
- package/lib/config/entitlements.js +0 -46
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Effective-entitlement math for the account/entitlement model.
|
|
3
|
-
*
|
|
4
|
-
* The canonical "effective limits = tier base + Σ(bundle grants)" computation
|
|
5
|
-
* lives here — next to the plan/bundle config it operates on — so ANY
|
|
6
|
-
* account-scoped consumer (billing, and future quota/platform readers) shares
|
|
7
|
-
* one implementation instead of re-deriving the coalesce. Pure: the tier limits
|
|
8
|
-
* come from api-core (`getTierLimits`) and the bundle catalog is passed in.
|
|
9
|
-
*/
|
|
10
|
-
import { type QuotaTier, type QuotaTierLimits } from '@pipeline-builder/api-core';
|
|
11
|
-
import type { BundleConfig } from './config-types.js';
|
|
12
|
-
/**
|
|
13
|
-
* Compute an account's EFFECTIVE entitlements = tier base limits + Σ(bundle
|
|
14
|
-
* grants × quantity), plus the union of bundle-granted feature flags. A field
|
|
15
|
-
* already `-1` (unlimited) stays `-1`. Pure; the catalog is passed in.
|
|
16
|
-
*/
|
|
17
|
-
export declare function effectiveEntitlements(tier: QuotaTier, addons: ReadonlyArray<{
|
|
18
|
-
bundleId: string;
|
|
19
|
-
quantity: number;
|
|
20
|
-
}>, bundles: readonly BundleConfig[]): {
|
|
21
|
-
limits: Record<keyof QuotaTierLimits, number>;
|
|
22
|
-
features: string[];
|
|
23
|
-
};
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
/**
|
|
4
|
-
* Effective-entitlement math for the account/entitlement model.
|
|
5
|
-
*
|
|
6
|
-
* The canonical "effective limits = tier base + Σ(bundle grants)" computation
|
|
7
|
-
* lives here — next to the plan/bundle config it operates on — so ANY
|
|
8
|
-
* account-scoped consumer (billing, and future quota/platform readers) shares
|
|
9
|
-
* one implementation instead of re-deriving the coalesce. Pure: the tier limits
|
|
10
|
-
* come from api-core (`getTierLimits`) and the bundle catalog is passed in.
|
|
11
|
-
*/
|
|
12
|
-
import { getTierLimits } from '@pipeline-builder/api-core';
|
|
13
|
-
/**
|
|
14
|
-
* Compute an account's EFFECTIVE entitlements = tier base limits + Σ(bundle
|
|
15
|
-
* grants × quantity), plus the union of bundle-granted feature flags. A field
|
|
16
|
-
* already `-1` (unlimited) stays `-1`. Pure; the catalog is passed in.
|
|
17
|
-
*/
|
|
18
|
-
export function effectiveEntitlements(tier, addons, bundles) {
|
|
19
|
-
const limits = { ...getTierLimits(tier) };
|
|
20
|
-
const features = new Set();
|
|
21
|
-
const byId = new Map(bundles.map((b) => [b.id, b]));
|
|
22
|
-
for (const { bundleId, quantity } of addons) {
|
|
23
|
-
const bundle = byId.get(bundleId);
|
|
24
|
-
if (!bundle || quantity <= 0)
|
|
25
|
-
continue;
|
|
26
|
-
// Enforce the non-stackable invariant AND the maxQuantity ceiling in the
|
|
27
|
-
// CANONICAL math, not just at the purchase route: a `stackable:false` bundle
|
|
28
|
-
// counts once, and a stackable pack is clamped to its `maxQuantity` — so a
|
|
29
|
-
// non-route caller (drift reconciler, subscription-lifecycle) can't over-grant
|
|
30
|
-
// a quota from a stored/drifted quantity (e.g. a retention pack past its cap).
|
|
31
|
-
const effectiveQty = bundle.stackable ? Math.min(quantity, bundle.maxQuantity ?? quantity) : 1;
|
|
32
|
-
for (const [rawField, delta] of Object.entries(bundle.grants)) {
|
|
33
|
-
// `grants` is a Partial map, so a value can be undefined — skip those.
|
|
34
|
-
if (delta === undefined)
|
|
35
|
-
continue;
|
|
36
|
-
const field = rawField; // grants keys ARE quota fields
|
|
37
|
-
if (limits[field] === -1)
|
|
38
|
-
continue; // already unlimited
|
|
39
|
-
limits[field] = (limits[field] ?? 0) + delta * effectiveQty;
|
|
40
|
-
}
|
|
41
|
-
for (const f of bundle.features ?? [])
|
|
42
|
-
features.add(f);
|
|
43
|
-
}
|
|
44
|
-
return { limits, features: [...features] };
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9lbnRpdGxlbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQXdDLE1BQU0sNEJBQTRCLENBQUM7QUFHakc7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsSUFBZSxFQUNmLE1BQTZELEVBQzdELE9BQWdDO0lBRWhDLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQTJDLENBQUM7SUFDbkYsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELEtBQUssTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxJQUFJLENBQUM7WUFBRSxTQUFTO1FBQ3ZDLHlFQUF5RTtRQUN6RSw2RUFBNkU7UUFDN0UsMkVBQTJFO1FBQzNFLCtFQUErRTtRQUMvRSwrRUFBK0U7UUFDL0UsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9GLEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzlELHVFQUF1RTtZQUN2RSxJQUFJLEtBQUssS0FBSyxTQUFTO2dCQUFFLFNBQVM7WUFDbEMsTUFBTSxLQUFLLEdBQUcsUUFBaUMsQ0FBQyxDQUFDLCtCQUErQjtZQUNoRixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQUUsU0FBUyxDQUFDLG9CQUFvQjtZQUN4RCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFlBQVksQ0FBQztRQUM5RCxDQUFDO1FBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUU7WUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogRWZmZWN0aXZlLWVudGl0bGVtZW50IG1hdGggZm9yIHRoZSBhY2NvdW50L2VudGl0bGVtZW50IG1vZGVsLlxuICpcbiAqIFRoZSBjYW5vbmljYWwgXCJlZmZlY3RpdmUgbGltaXRzID0gdGllciBiYXNlICsgzqMoYnVuZGxlIGdyYW50cylcIiBjb21wdXRhdGlvblxuICogbGl2ZXMgaGVyZSDigJQgbmV4dCB0byB0aGUgcGxhbi9idW5kbGUgY29uZmlnIGl0IG9wZXJhdGVzIG9uIOKAlCBzbyBBTllcbiAqIGFjY291bnQtc2NvcGVkIGNvbnN1bWVyIChiaWxsaW5nLCBhbmQgZnV0dXJlIHF1b3RhL3BsYXRmb3JtIHJlYWRlcnMpIHNoYXJlc1xuICogb25lIGltcGxlbWVudGF0aW9uIGluc3RlYWQgb2YgcmUtZGVyaXZpbmcgdGhlIGNvYWxlc2NlLiBQdXJlOiB0aGUgdGllciBsaW1pdHNcbiAqIGNvbWUgZnJvbSBhcGktY29yZSAoYGdldFRpZXJMaW1pdHNgKSBhbmQgdGhlIGJ1bmRsZSBjYXRhbG9nIGlzIHBhc3NlZCBpbi5cbiAqL1xuXG5pbXBvcnQgeyBnZXRUaWVyTGltaXRzLCB0eXBlIFF1b3RhVGllciwgdHlwZSBRdW90YVRpZXJMaW1pdHMgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IEJ1bmRsZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnLXR5cGVzLmpzJztcblxuLyoqXG4gKiBDb21wdXRlIGFuIGFjY291bnQncyBFRkZFQ1RJVkUgZW50aXRsZW1lbnRzID0gdGllciBiYXNlIGxpbWl0cyArIM6jKGJ1bmRsZVxuICogZ3JhbnRzIMOXIHF1YW50aXR5KSwgcGx1cyB0aGUgdW5pb24gb2YgYnVuZGxlLWdyYW50ZWQgZmVhdHVyZSBmbGFncy4gQSBmaWVsZFxuICogYWxyZWFkeSBgLTFgICh1bmxpbWl0ZWQpIHN0YXlzIGAtMWAuIFB1cmU7IHRoZSBjYXRhbG9nIGlzIHBhc3NlZCBpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVmZmVjdGl2ZUVudGl0bGVtZW50cyhcbiAgdGllcjogUXVvdGFUaWVyLFxuICBhZGRvbnM6IFJlYWRvbmx5QXJyYXk8eyBidW5kbGVJZDogc3RyaW5nOyBxdWFudGl0eTogbnVtYmVyIH0+LFxuICBidW5kbGVzOiByZWFkb25seSBCdW5kbGVDb25maWdbXSxcbik6IHsgbGltaXRzOiBSZWNvcmQ8a2V5b2YgUXVvdGFUaWVyTGltaXRzLCBudW1iZXI+OyBmZWF0dXJlczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IGxpbWl0cyA9IHsgLi4uZ2V0VGllckxpbWl0cyh0aWVyKSB9IGFzIFJlY29yZDxrZXlvZiBRdW90YVRpZXJMaW1pdHMsIG51bWJlcj47XG4gIGNvbnN0IGZlYXR1cmVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGJ5SWQgPSBuZXcgTWFwKGJ1bmRsZXMubWFwKChiKSA9PiBbYi5pZCwgYl0pKTtcbiAgZm9yIChjb25zdCB7IGJ1bmRsZUlkLCBxdWFudGl0eSB9IG9mIGFkZG9ucykge1xuICAgIGNvbnN0IGJ1bmRsZSA9IGJ5SWQuZ2V0KGJ1bmRsZUlkKTtcbiAgICBpZiAoIWJ1bmRsZSB8fCBxdWFudGl0eSA8PSAwKSBjb250aW51ZTtcbiAgICAvLyBFbmZvcmNlIHRoZSBub24tc3RhY2thYmxlIGludmFyaWFudCBBTkQgdGhlIG1heFF1YW50aXR5IGNlaWxpbmcgaW4gdGhlXG4gICAgLy8gQ0FOT05JQ0FMIG1hdGgsIG5vdCBqdXN0IGF0IHRoZSBwdXJjaGFzZSByb3V0ZTogYSBgc3RhY2thYmxlOmZhbHNlYCBidW5kbGVcbiAgICAvLyBjb3VudHMgb25jZSwgYW5kIGEgc3RhY2thYmxlIHBhY2sgaXMgY2xhbXBlZCB0byBpdHMgYG1heFF1YW50aXR5YCDigJQgc28gYVxuICAgIC8vIG5vbi1yb3V0ZSBjYWxsZXIgKGRyaWZ0IHJlY29uY2lsZXIsIHN1YnNjcmlwdGlvbi1saWZlY3ljbGUpIGNhbid0IG92ZXItZ3JhbnRcbiAgICAvLyBhIHF1b3RhIGZyb20gYSBzdG9yZWQvZHJpZnRlZCBxdWFudGl0eSAoZS5nLiBhIHJldGVudGlvbiBwYWNrIHBhc3QgaXRzIGNhcCkuXG4gICAgY29uc3QgZWZmZWN0aXZlUXR5ID0gYnVuZGxlLnN0YWNrYWJsZSA/IE1hdGgubWluKHF1YW50aXR5LCBidW5kbGUubWF4UXVhbnRpdHkgPz8gcXVhbnRpdHkpIDogMTtcbiAgICBmb3IgKGNvbnN0IFtyYXdGaWVsZCwgZGVsdGFdIG9mIE9iamVjdC5lbnRyaWVzKGJ1bmRsZS5ncmFudHMpKSB7XG4gICAgICAvLyBgZ3JhbnRzYCBpcyBhIFBhcnRpYWwgbWFwLCBzbyBhIHZhbHVlIGNhbiBiZSB1bmRlZmluZWQg4oCUIHNraXAgdGhvc2UuXG4gICAgICBpZiAoZGVsdGEgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBjb25zdCBmaWVsZCA9IHJhd0ZpZWxkIGFzIGtleW9mIFF1b3RhVGllckxpbWl0czsgLy8gZ3JhbnRzIGtleXMgQVJFIHF1b3RhIGZpZWxkc1xuICAgICAgaWYgKGxpbWl0c1tmaWVsZF0gPT09IC0xKSBjb250aW51ZTsgLy8gYWxyZWFkeSB1bmxpbWl0ZWRcbiAgICAgIGxpbWl0c1tmaWVsZF0gPSAobGltaXRzW2ZpZWxkXSA/PyAwKSArIGRlbHRhICogZWZmZWN0aXZlUXR5O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGYgb2YgYnVuZGxlLmZlYXR1cmVzID8/IFtdKSBmZWF0dXJlcy5hZGQoZik7XG4gIH1cbiAgcmV0dXJuIHsgbGltaXRzLCBmZWF0dXJlczogWy4uLmZlYXR1cmVzXSB9O1xufVxuIl19
|