@pipeline-builder/pipeline-core 4.1.15 → 4.1.16

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.
Files changed (54) hide show
  1. package/lib/cdk.d.ts +1 -0
  2. package/lib/cdk.js +2 -1
  3. package/lib/config/app-config.d.ts +5 -8
  4. package/lib/config/app-config.js +36 -38
  5. package/lib/config/config-types.d.ts +9 -112
  6. package/lib/config/config-types.js +1 -1
  7. package/lib/config/handler-constants.d.ts +12 -3
  8. package/lib/config/handler-constants.js +9 -26
  9. package/lib/config/infrastructure-config.js +44 -43
  10. package/lib/config/server-config.d.ts +1 -1
  11. package/lib/config/server-config.js +33 -32
  12. package/lib/config/service-client.d.ts +3 -7
  13. package/lib/config/service-client.js +5 -11
  14. package/lib/core/artifact-manager.d.ts +0 -17
  15. package/lib/core/artifact-manager.js +1 -17
  16. package/lib/core/metadata-helpers.d.ts +16 -0
  17. package/lib/core/metadata-helpers.js +41 -1
  18. package/lib/core/pipeline-helpers.js +23 -58
  19. package/lib/core/plugin-contract.d.ts +126 -0
  20. package/lib/core/plugin-contract.js +217 -0
  21. package/lib/core/plugin-lookup-envelope.d.ts +14 -0
  22. package/lib/core/plugin-lookup-envelope.js +29 -0
  23. package/lib/core/step-manifest.d.ts +50 -0
  24. package/lib/core/step-manifest.js +47 -0
  25. package/lib/handlers/platform-credential.d.ts +47 -0
  26. package/lib/handlers/platform-credential.js +87 -0
  27. package/lib/handlers/plugin-lookup-handler.d.ts +1 -1
  28. package/lib/handlers/plugin-lookup-handler.js +48 -42
  29. package/lib/index.d.ts +8 -8
  30. package/lib/index.js +10 -9
  31. package/lib/pipeline/pipeline-builder.d.ts +7 -0
  32. package/lib/pipeline/pipeline-builder.js +25 -9
  33. package/lib/pipeline/pipeline-configuration.js +6 -5
  34. package/lib/pipeline/plugin-lookup.d.ts +0 -1
  35. package/lib/pipeline/plugin-lookup.js +55 -23
  36. package/lib/pipeline/plugin-spec.d.ts +41 -0
  37. package/lib/pipeline/plugin-spec.js +1 -1
  38. package/lib/pipeline/stage-builder.d.ts +11 -0
  39. package/lib/pipeline/stage-builder.js +31 -12
  40. package/lib/pipeline/step-manifest-recorder.d.ts +22 -0
  41. package/lib/pipeline/step-manifest-recorder.js +57 -0
  42. package/lib/pipeline/step-types.d.ts +16 -4
  43. package/lib/pipeline/step-types.js +1 -1
  44. package/lib/template/index.d.ts +4 -4
  45. package/lib/template/index.js +5 -5
  46. package/lib/template/plugin-resolver.js +5 -5
  47. package/lib/template/tokenizer.d.ts +4 -0
  48. package/lib/template/tokenizer.js +11 -7
  49. package/lib/testing/exports.json +72 -0
  50. package/package.json +36 -8
  51. package/lib/config/billing-config.d.ts +0 -27
  52. package/lib/config/billing-config.js +0 -534
  53. package/lib/config/entitlements.d.ts +0 -23
  54. 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