@contractspec/lib.progressive-delivery 1.46.2 → 2.0.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.
@@ -1 +1 @@
1
- {"version":3,"file":"canary-analyzer.js","names":["defaults: DeploymentThresholds","reasons: string[]"],"sources":["../src/canary-analyzer.ts"],"sourcesContent":["import type {\n CanaryStage,\n DeploymentMetrics,\n DeploymentThresholds,\n} from './types';\n\nexport interface AnalysisResult {\n status: 'pass' | 'fail';\n reasons: string[];\n metrics: DeploymentMetrics;\n}\n\nexport class CanaryAnalyzer {\n constructor(private readonly defaults: DeploymentThresholds) {}\n\n evaluate(stage: CanaryStage, metrics: DeploymentMetrics): AnalysisResult {\n const thresholds = { ...this.defaults, ...stage.thresholds };\n const reasons: string[] = [];\n\n if (metrics.errorRate > thresholds.errorRate) {\n reasons.push(\n `errorRate ${metrics.errorRate.toFixed(4)} > ${thresholds.errorRate}`\n );\n }\n\n if (\n typeof thresholds.latencyP50 === 'number' &&\n metrics.latencyP50 > thresholds.latencyP50\n ) {\n reasons.push(\n `latencyP50 ${metrics.latencyP50}ms > ${thresholds.latencyP50}ms`\n );\n }\n\n if (\n typeof thresholds.latencyP95 === 'number' &&\n metrics.latencyP95 > thresholds.latencyP95\n ) {\n reasons.push(\n `latencyP95 ${metrics.latencyP95}ms > ${thresholds.latencyP95}ms`\n );\n }\n\n if (\n typeof thresholds.latencyP99 === 'number' &&\n metrics.latencyP99 > thresholds.latencyP99\n ) {\n reasons.push(\n `latencyP99 ${metrics.latencyP99}ms > ${thresholds.latencyP99}ms`\n );\n }\n\n if (\n typeof thresholds.throughputDrop === 'number' &&\n metrics.throughput < thresholds.throughputDrop\n ) {\n reasons.push(\n `throughput ${metrics.throughput} < ${thresholds.throughputDrop}`\n );\n }\n\n if (thresholds.customEvaluator && !thresholds.customEvaluator(metrics)) {\n reasons.push('custom evaluator reported failure');\n }\n\n return {\n status: reasons.length === 0 ? 'pass' : 'fail',\n reasons,\n metrics,\n };\n }\n}\n"],"mappings":";AAYA,IAAa,iBAAb,MAA4B;CAC1B,YAAY,AAAiBA,UAAgC;EAAhC;;CAE7B,SAAS,OAAoB,SAA4C;EACvE,MAAM,aAAa;GAAE,GAAG,KAAK;GAAU,GAAG,MAAM;GAAY;EAC5D,MAAMC,UAAoB,EAAE;AAE5B,MAAI,QAAQ,YAAY,WAAW,UACjC,SAAQ,KACN,aAAa,QAAQ,UAAU,QAAQ,EAAE,CAAC,KAAK,WAAW,YAC3D;AAGH,MACE,OAAO,WAAW,eAAe,YACjC,QAAQ,aAAa,WAAW,WAEhC,SAAQ,KACN,cAAc,QAAQ,WAAW,OAAO,WAAW,WAAW,IAC/D;AAGH,MACE,OAAO,WAAW,eAAe,YACjC,QAAQ,aAAa,WAAW,WAEhC,SAAQ,KACN,cAAc,QAAQ,WAAW,OAAO,WAAW,WAAW,IAC/D;AAGH,MACE,OAAO,WAAW,eAAe,YACjC,QAAQ,aAAa,WAAW,WAEhC,SAAQ,KACN,cAAc,QAAQ,WAAW,OAAO,WAAW,WAAW,IAC/D;AAGH,MACE,OAAO,WAAW,mBAAmB,YACrC,QAAQ,aAAa,WAAW,eAEhC,SAAQ,KACN,cAAc,QAAQ,WAAW,KAAK,WAAW,iBAClD;AAGH,MAAI,WAAW,mBAAmB,CAAC,WAAW,gBAAgB,QAAQ,CACpE,SAAQ,KAAK,oCAAoC;AAGnD,SAAO;GACL,QAAQ,QAAQ,WAAW,IAAI,SAAS;GACxC;GACA;GACD"}
1
+ {"version":3,"file":"canary-analyzer.js","names":[],"sources":["../src/canary-analyzer.ts"],"sourcesContent":["import type {\n CanaryStage,\n DeploymentMetrics,\n DeploymentThresholds,\n} from './types';\n\nexport interface AnalysisResult {\n status: 'pass' | 'fail';\n reasons: string[];\n metrics: DeploymentMetrics;\n}\n\nexport class CanaryAnalyzer {\n constructor(private readonly defaults: DeploymentThresholds) {}\n\n evaluate(stage: CanaryStage, metrics: DeploymentMetrics): AnalysisResult {\n const thresholds = { ...this.defaults, ...stage.thresholds };\n const reasons: string[] = [];\n\n if (metrics.errorRate > thresholds.errorRate) {\n reasons.push(\n `errorRate ${metrics.errorRate.toFixed(4)} > ${thresholds.errorRate}`\n );\n }\n\n if (\n typeof thresholds.latencyP50 === 'number' &&\n metrics.latencyP50 > thresholds.latencyP50\n ) {\n reasons.push(\n `latencyP50 ${metrics.latencyP50}ms > ${thresholds.latencyP50}ms`\n );\n }\n\n if (\n typeof thresholds.latencyP95 === 'number' &&\n metrics.latencyP95 > thresholds.latencyP95\n ) {\n reasons.push(\n `latencyP95 ${metrics.latencyP95}ms > ${thresholds.latencyP95}ms`\n );\n }\n\n if (\n typeof thresholds.latencyP99 === 'number' &&\n metrics.latencyP99 > thresholds.latencyP99\n ) {\n reasons.push(\n `latencyP99 ${metrics.latencyP99}ms > ${thresholds.latencyP99}ms`\n );\n }\n\n if (\n typeof thresholds.throughputDrop === 'number' &&\n metrics.throughput < thresholds.throughputDrop\n ) {\n reasons.push(\n `throughput ${metrics.throughput} < ${thresholds.throughputDrop}`\n );\n }\n\n if (thresholds.customEvaluator && !thresholds.customEvaluator(metrics)) {\n reasons.push('custom evaluator reported failure');\n }\n\n return {\n status: reasons.length === 0 ? 'pass' : 'fail',\n reasons,\n metrics,\n };\n }\n}\n"],"mappings":";AAYA,IAAa,iBAAb,MAA4B;CAC1B,YAAY,AAAiB,UAAgC;EAAhC;;CAE7B,SAAS,OAAoB,SAA4C;EACvE,MAAM,aAAa;GAAE,GAAG,KAAK;GAAU,GAAG,MAAM;GAAY;EAC5D,MAAM,UAAoB,EAAE;AAE5B,MAAI,QAAQ,YAAY,WAAW,UACjC,SAAQ,KACN,aAAa,QAAQ,UAAU,QAAQ,EAAE,CAAC,KAAK,WAAW,YAC3D;AAGH,MACE,OAAO,WAAW,eAAe,YACjC,QAAQ,aAAa,WAAW,WAEhC,SAAQ,KACN,cAAc,QAAQ,WAAW,OAAO,WAAW,WAAW,IAC/D;AAGH,MACE,OAAO,WAAW,eAAe,YACjC,QAAQ,aAAa,WAAW,WAEhC,SAAQ,KACN,cAAc,QAAQ,WAAW,OAAO,WAAW,WAAW,IAC/D;AAGH,MACE,OAAO,WAAW,eAAe,YACjC,QAAQ,aAAa,WAAW,WAEhC,SAAQ,KACN,cAAc,QAAQ,WAAW,OAAO,WAAW,WAAW,IAC/D;AAGH,MACE,OAAO,WAAW,mBAAmB,YACrC,QAAQ,aAAa,WAAW,eAEhC,SAAQ,KACN,cAAc,QAAQ,WAAW,KAAK,WAAW,iBAClD;AAGH,MAAI,WAAW,mBAAmB,CAAC,WAAW,gBAAgB,QAAQ,CACpE,SAAQ,KAAK,oCAAoC;AAGnD,SAAO;GACL,QAAQ,QAAQ,WAAW,IAAI,SAAS;GACxC;GACA;GACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"canary-controller.js","names":["DEFAULT_STAGES: CanaryStage[]","options: CanaryControllerOptions"],"sources":["../src/canary-controller.ts"],"sourcesContent":["import { CanaryAnalyzer, type AnalysisResult } from './canary-analyzer';\nimport { DeploymentEventBus } from './events';\nimport type { CanaryStage, DeploymentStrategy, MetricsProvider } from './types';\n\nconst DEFAULT_STAGES: CanaryStage[] = [\n { percentage: 1, minDurationMs: 5 * 60 * 1000, label: '1%' },\n { percentage: 10, minDurationMs: 5 * 60 * 1000, label: '10%' },\n { percentage: 50, minDurationMs: 10 * 60 * 1000, label: '50%' },\n { percentage: 100, minDurationMs: 15 * 60 * 1000, label: '100%' },\n];\n\nexport interface CanaryControllerOptions {\n strategy: DeploymentStrategy;\n analyzer: CanaryAnalyzer;\n metricsProvider: MetricsProvider;\n eventBus?: DeploymentEventBus;\n}\n\nexport class CanaryController {\n private readonly stages: CanaryStage[];\n\n constructor(private readonly options: CanaryControllerOptions) {\n this.stages =\n options.strategy.stages && options.strategy.stages.length > 0\n ? options.strategy.stages\n : DEFAULT_STAGES;\n }\n\n getStageList() {\n return [...this.stages];\n }\n\n async runStage(stage: CanaryStage): Promise<AnalysisResult> {\n this.options.eventBus?.emit({\n type: 'stage_started',\n timestamp: new Date(),\n payload: { stage },\n });\n\n const metrics = await this.options.metricsProvider(\n stage,\n stage.minDurationMs\n );\n const analysis = this.options.analyzer.evaluate(stage, metrics);\n\n this.options.eventBus?.emit({\n type: analysis.status === 'pass' ? 'stage_passed' : 'stage_failed',\n timestamp: new Date(),\n payload: { stage, metrics, analysis },\n });\n\n return analysis;\n }\n}\n\nexport function createDefaultCanaryController(\n strategy: DeploymentStrategy,\n metricsProvider: MetricsProvider,\n eventBus?: DeploymentEventBus\n) {\n const analyzer = new CanaryAnalyzer(strategy.thresholds);\n return new CanaryController({\n strategy,\n analyzer,\n metricsProvider,\n eventBus,\n });\n}\n"],"mappings":";;;AAIA,MAAMA,iBAAgC;CACpC;EAAE,YAAY;EAAG,eAAe,MAAS;EAAM,OAAO;EAAM;CAC5D;EAAE,YAAY;EAAI,eAAe,MAAS;EAAM,OAAO;EAAO;CAC9D;EAAE,YAAY;EAAI,eAAe,MAAU;EAAM,OAAO;EAAO;CAC/D;EAAE,YAAY;EAAK,eAAe,MAAU;EAAM,OAAO;EAAQ;CAClE;AASD,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CAEjB,YAAY,AAAiBC,SAAkC;EAAlC;AAC3B,OAAK,SACH,QAAQ,SAAS,UAAU,QAAQ,SAAS,OAAO,SAAS,IACxD,QAAQ,SAAS,SACjB;;CAGR,eAAe;AACb,SAAO,CAAC,GAAG,KAAK,OAAO;;CAGzB,MAAM,SAAS,OAA6C;AAC1D,OAAK,QAAQ,UAAU,KAAK;GAC1B,MAAM;GACN,2BAAW,IAAI,MAAM;GACrB,SAAS,EAAE,OAAO;GACnB,CAAC;EAEF,MAAM,UAAU,MAAM,KAAK,QAAQ,gBACjC,OACA,MAAM,cACP;EACD,MAAM,WAAW,KAAK,QAAQ,SAAS,SAAS,OAAO,QAAQ;AAE/D,OAAK,QAAQ,UAAU,KAAK;GAC1B,MAAM,SAAS,WAAW,SAAS,iBAAiB;GACpD,2BAAW,IAAI,MAAM;GACrB,SAAS;IAAE;IAAO;IAAS;IAAU;GACtC,CAAC;AAEF,SAAO;;;AAIX,SAAgB,8BACd,UACA,iBACA,UACA;AAEA,QAAO,IAAI,iBAAiB;EAC1B;EACA,UAHe,IAAI,eAAe,SAAS,WAAW;EAItD;EACA;EACD,CAAC"}
1
+ {"version":3,"file":"canary-controller.js","names":[],"sources":["../src/canary-controller.ts"],"sourcesContent":["import { CanaryAnalyzer, type AnalysisResult } from './canary-analyzer';\nimport { DeploymentEventBus } from './events';\nimport type { CanaryStage, DeploymentStrategy, MetricsProvider } from './types';\n\nconst DEFAULT_STAGES: CanaryStage[] = [\n { percentage: 1, minDurationMs: 5 * 60 * 1000, label: '1%' },\n { percentage: 10, minDurationMs: 5 * 60 * 1000, label: '10%' },\n { percentage: 50, minDurationMs: 10 * 60 * 1000, label: '50%' },\n { percentage: 100, minDurationMs: 15 * 60 * 1000, label: '100%' },\n];\n\nexport interface CanaryControllerOptions {\n strategy: DeploymentStrategy;\n analyzer: CanaryAnalyzer;\n metricsProvider: MetricsProvider;\n eventBus?: DeploymentEventBus;\n}\n\nexport class CanaryController {\n private readonly stages: CanaryStage[];\n\n constructor(private readonly options: CanaryControllerOptions) {\n this.stages =\n options.strategy.stages && options.strategy.stages.length > 0\n ? options.strategy.stages\n : DEFAULT_STAGES;\n }\n\n getStageList() {\n return [...this.stages];\n }\n\n async runStage(stage: CanaryStage): Promise<AnalysisResult> {\n this.options.eventBus?.emit({\n type: 'stage_started',\n timestamp: new Date(),\n payload: { stage },\n });\n\n const metrics = await this.options.metricsProvider(\n stage,\n stage.minDurationMs\n );\n const analysis = this.options.analyzer.evaluate(stage, metrics);\n\n this.options.eventBus?.emit({\n type: analysis.status === 'pass' ? 'stage_passed' : 'stage_failed',\n timestamp: new Date(),\n payload: { stage, metrics, analysis },\n });\n\n return analysis;\n }\n}\n\nexport function createDefaultCanaryController(\n strategy: DeploymentStrategy,\n metricsProvider: MetricsProvider,\n eventBus?: DeploymentEventBus\n) {\n const analyzer = new CanaryAnalyzer(strategy.thresholds);\n return new CanaryController({\n strategy,\n analyzer,\n metricsProvider,\n eventBus,\n });\n}\n"],"mappings":";;;AAIA,MAAM,iBAAgC;CACpC;EAAE,YAAY;EAAG,eAAe,MAAS;EAAM,OAAO;EAAM;CAC5D;EAAE,YAAY;EAAI,eAAe,MAAS;EAAM,OAAO;EAAO;CAC9D;EAAE,YAAY;EAAI,eAAe,MAAU;EAAM,OAAO;EAAO;CAC/D;EAAE,YAAY;EAAK,eAAe,MAAU;EAAM,OAAO;EAAQ;CAClE;AASD,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CAEjB,YAAY,AAAiB,SAAkC;EAAlC;AAC3B,OAAK,SACH,QAAQ,SAAS,UAAU,QAAQ,SAAS,OAAO,SAAS,IACxD,QAAQ,SAAS,SACjB;;CAGR,eAAe;AACb,SAAO,CAAC,GAAG,KAAK,OAAO;;CAGzB,MAAM,SAAS,OAA6C;AAC1D,OAAK,QAAQ,UAAU,KAAK;GAC1B,MAAM;GACN,2BAAW,IAAI,MAAM;GACrB,SAAS,EAAE,OAAO;GACnB,CAAC;EAEF,MAAM,UAAU,MAAM,KAAK,QAAQ,gBACjC,OACA,MAAM,cACP;EACD,MAAM,WAAW,KAAK,QAAQ,SAAS,SAAS,OAAO,QAAQ;AAE/D,OAAK,QAAQ,UAAU,KAAK;GAC1B,MAAM,SAAS,WAAW,SAAS,iBAAiB;GACpD,2BAAW,IAAI,MAAM;GACrB,SAAS;IAAE;IAAO;IAAS;IAAU;GACtC,CAAC;AAEF,SAAO;;;AAIX,SAAgB,8BACd,UACA,iBACA,UACA;AAEA,QAAO,IAAI,iBAAiB;EAC1B;EACA,UAHe,IAAI,eAAe,SAAS,WAAW;EAItD;EACA;EACD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"deployment-coordinator.js","names":["options: DeploymentCoordinatorOptions"],"sources":["../src/deployment-coordinator.ts"],"sourcesContent":["import { CanaryController } from './canary-controller';\nimport { DeploymentEventBus } from './events';\nimport { RollbackManager } from './rollback-manager';\nimport { TrafficShifter } from './traffic-shifter';\nimport type { CanaryStage, DeploymentStrategy, TrafficSplit } from './types';\n\nexport interface DeploymentCoordinatorOptions {\n strategy: DeploymentStrategy;\n controller: CanaryController;\n trafficShifter: TrafficShifter;\n rollbackManager: RollbackManager;\n applyTrafficSplit: (\n stage: CanaryStage,\n split: TrafficSplit\n ) => void | Promise<void>;\n eventBus?: DeploymentEventBus;\n}\n\nexport interface DeploymentRunResult {\n status: 'completed' | 'rolled_back';\n failedStage?: CanaryStage;\n reasons?: string[];\n}\n\nexport class DeploymentCoordinator {\n constructor(private readonly options: DeploymentCoordinatorOptions) {}\n\n async run(): Promise<DeploymentRunResult> {\n const stages = this.options.controller.getStageList();\n\n for (const stage of stages) {\n const split = this.options.trafficShifter.computeSplit(stage);\n await this.options.applyTrafficSplit(stage, split);\n\n const analysis = await this.options.controller.runStage(stage);\n if (analysis.status === 'fail') {\n const action = await this.options.rollbackManager.execute(\n stage,\n analysis.reasons.join(', ')\n );\n\n this.options.eventBus?.emit({\n type: 'rolled_back',\n timestamp: action.triggeredAt,\n payload: { stage, reasons: analysis.reasons },\n });\n\n return {\n status: 'rolled_back',\n failedStage: stage,\n reasons: analysis.reasons,\n };\n }\n }\n\n if (this.options.strategy.mode === 'blue-green') {\n this.options.eventBus?.emit({\n type: 'blue_green_swapped',\n timestamp: new Date(),\n payload: { strategy: this.options.strategy },\n });\n }\n\n this.options.eventBus?.emit({\n type: 'completed',\n timestamp: new Date(),\n payload: { strategy: this.options.strategy },\n });\n\n return { status: 'completed' };\n }\n}\n"],"mappings":";;;AAwBA,IAAa,wBAAb,MAAmC;CACjC,YAAY,AAAiBA,SAAuC;EAAvC;;CAE7B,MAAM,MAAoC;EACxC,MAAM,SAAS,KAAK,QAAQ,WAAW,cAAc;AAErD,OAAK,MAAM,SAAS,QAAQ;GAC1B,MAAM,QAAQ,KAAK,QAAQ,eAAe,aAAa,MAAM;AAC7D,SAAM,KAAK,QAAQ,kBAAkB,OAAO,MAAM;GAElD,MAAM,WAAW,MAAM,KAAK,QAAQ,WAAW,SAAS,MAAM;AAC9D,OAAI,SAAS,WAAW,QAAQ;IAC9B,MAAM,SAAS,MAAM,KAAK,QAAQ,gBAAgB,QAChD,OACA,SAAS,QAAQ,KAAK,KAAK,CAC5B;AAED,SAAK,QAAQ,UAAU,KAAK;KAC1B,MAAM;KACN,WAAW,OAAO;KAClB,SAAS;MAAE;MAAO,SAAS,SAAS;MAAS;KAC9C,CAAC;AAEF,WAAO;KACL,QAAQ;KACR,aAAa;KACb,SAAS,SAAS;KACnB;;;AAIL,MAAI,KAAK,QAAQ,SAAS,SAAS,aACjC,MAAK,QAAQ,UAAU,KAAK;GAC1B,MAAM;GACN,2BAAW,IAAI,MAAM;GACrB,SAAS,EAAE,UAAU,KAAK,QAAQ,UAAU;GAC7C,CAAC;AAGJ,OAAK,QAAQ,UAAU,KAAK;GAC1B,MAAM;GACN,2BAAW,IAAI,MAAM;GACrB,SAAS,EAAE,UAAU,KAAK,QAAQ,UAAU;GAC7C,CAAC;AAEF,SAAO,EAAE,QAAQ,aAAa"}
1
+ {"version":3,"file":"deployment-coordinator.js","names":[],"sources":["../src/deployment-coordinator.ts"],"sourcesContent":["import { CanaryController } from './canary-controller';\nimport { DeploymentEventBus } from './events';\nimport { RollbackManager } from './rollback-manager';\nimport { TrafficShifter } from './traffic-shifter';\nimport type { CanaryStage, DeploymentStrategy, TrafficSplit } from './types';\n\nexport interface DeploymentCoordinatorOptions {\n strategy: DeploymentStrategy;\n controller: CanaryController;\n trafficShifter: TrafficShifter;\n rollbackManager: RollbackManager;\n applyTrafficSplit: (\n stage: CanaryStage,\n split: TrafficSplit\n ) => void | Promise<void>;\n eventBus?: DeploymentEventBus;\n}\n\nexport interface DeploymentRunResult {\n status: 'completed' | 'rolled_back';\n failedStage?: CanaryStage;\n reasons?: string[];\n}\n\nexport class DeploymentCoordinator {\n constructor(private readonly options: DeploymentCoordinatorOptions) {}\n\n async run(): Promise<DeploymentRunResult> {\n const stages = this.options.controller.getStageList();\n\n for (const stage of stages) {\n const split = this.options.trafficShifter.computeSplit(stage);\n await this.options.applyTrafficSplit(stage, split);\n\n const analysis = await this.options.controller.runStage(stage);\n if (analysis.status === 'fail') {\n const action = await this.options.rollbackManager.execute(\n stage,\n analysis.reasons.join(', ')\n );\n\n this.options.eventBus?.emit({\n type: 'rolled_back',\n timestamp: action.triggeredAt,\n payload: { stage, reasons: analysis.reasons },\n });\n\n return {\n status: 'rolled_back',\n failedStage: stage,\n reasons: analysis.reasons,\n };\n }\n }\n\n if (this.options.strategy.mode === 'blue-green') {\n this.options.eventBus?.emit({\n type: 'blue_green_swapped',\n timestamp: new Date(),\n payload: { strategy: this.options.strategy },\n });\n }\n\n this.options.eventBus?.emit({\n type: 'completed',\n timestamp: new Date(),\n payload: { strategy: this.options.strategy },\n });\n\n return { status: 'completed' };\n }\n}\n"],"mappings":";;;AAwBA,IAAa,wBAAb,MAAmC;CACjC,YAAY,AAAiB,SAAuC;EAAvC;;CAE7B,MAAM,MAAoC;EACxC,MAAM,SAAS,KAAK,QAAQ,WAAW,cAAc;AAErD,OAAK,MAAM,SAAS,QAAQ;GAC1B,MAAM,QAAQ,KAAK,QAAQ,eAAe,aAAa,MAAM;AAC7D,SAAM,KAAK,QAAQ,kBAAkB,OAAO,MAAM;GAElD,MAAM,WAAW,MAAM,KAAK,QAAQ,WAAW,SAAS,MAAM;AAC9D,OAAI,SAAS,WAAW,QAAQ;IAC9B,MAAM,SAAS,MAAM,KAAK,QAAQ,gBAAgB,QAChD,OACA,SAAS,QAAQ,KAAK,KAAK,CAC5B;AAED,SAAK,QAAQ,UAAU,KAAK;KAC1B,MAAM;KACN,WAAW,OAAO;KAClB,SAAS;MAAE;MAAO,SAAS,SAAS;MAAS;KAC9C,CAAC;AAEF,WAAO;KACL,QAAQ;KACR,aAAa;KACb,SAAS,SAAS;KACnB;;;AAIL,MAAI,KAAK,QAAQ,SAAS,SAAS,aACjC,MAAK,QAAQ,UAAU,KAAK;GAC1B,MAAM;GACN,2BAAW,IAAI,MAAM;GACrB,SAAS,EAAE,UAAU,KAAK,QAAQ,UAAU;GAC7C,CAAC;AAGJ,OAAK,QAAQ,UAAU,KAAK;GAC1B,MAAM;GACN,2BAAW,IAAI,MAAM;GACrB,SAAS,EAAE,UAAU,KAAK,QAAQ,UAAU;GAC7C,CAAC;AAEF,SAAO,EAAE,QAAQ,aAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"rollback-manager.js","names":["options: RollbackManagerOptions","action: RollbackAction"],"sources":["../src/rollback-manager.ts"],"sourcesContent":["import type { CanaryStage, RollbackAction } from './types';\n\nexport interface RollbackManagerOptions {\n rollback(stage: CanaryStage, reason: string): Promise<void> | void;\n onRollback?: (action: RollbackAction) => void;\n}\n\nexport class RollbackManager {\n constructor(private readonly options: RollbackManagerOptions) {}\n\n async execute(stage: CanaryStage, reason: string) {\n await this.options.rollback(stage, reason);\n const action: RollbackAction = {\n reason,\n stage,\n triggeredAt: new Date(),\n };\n this.options.onRollback?.(action);\n return action;\n }\n}\n"],"mappings":";AAOA,IAAa,kBAAb,MAA6B;CAC3B,YAAY,AAAiBA,SAAiC;EAAjC;;CAE7B,MAAM,QAAQ,OAAoB,QAAgB;AAChD,QAAM,KAAK,QAAQ,SAAS,OAAO,OAAO;EAC1C,MAAMC,SAAyB;GAC7B;GACA;GACA,6BAAa,IAAI,MAAM;GACxB;AACD,OAAK,QAAQ,aAAa,OAAO;AACjC,SAAO"}
1
+ {"version":3,"file":"rollback-manager.js","names":[],"sources":["../src/rollback-manager.ts"],"sourcesContent":["import type { CanaryStage, RollbackAction } from './types';\n\nexport interface RollbackManagerOptions {\n rollback(stage: CanaryStage, reason: string): Promise<void> | void;\n onRollback?: (action: RollbackAction) => void;\n}\n\nexport class RollbackManager {\n constructor(private readonly options: RollbackManagerOptions) {}\n\n async execute(stage: CanaryStage, reason: string) {\n await this.options.rollback(stage, reason);\n const action: RollbackAction = {\n reason,\n stage,\n triggeredAt: new Date(),\n };\n this.options.onRollback?.(action);\n return action;\n }\n}\n"],"mappings":";AAOA,IAAa,kBAAb,MAA6B;CAC3B,YAAY,AAAiB,SAAiC;EAAjC;;CAE7B,MAAM,QAAQ,OAAoB,QAAgB;AAChD,QAAM,KAAK,QAAQ,SAAS,OAAO,OAAO;EAC1C,MAAM,SAAyB;GAC7B;GACA;GACA,6BAAa,IAAI,MAAM;GACxB;AACD,OAAK,QAAQ,aAAa,OAAO;AACjC,SAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"traffic-shifter.js","names":["mode: DeploymentMode"],"sources":["../src/traffic-shifter.ts"],"sourcesContent":["import type { CanaryStage, DeploymentMode, TrafficSplit } from './types';\n\nexport class TrafficShifter {\n constructor(private readonly mode: DeploymentMode) {}\n\n computeSplit(stage: CanaryStage): TrafficSplit {\n if (this.mode === 'blue-green') {\n return stage.percentage >= 100\n ? { stable: 0, candidate: 1 }\n : { stable: 1, candidate: 0 };\n }\n\n const candidate = Math.min(Math.max(stage.percentage / 100, 0), 1);\n return {\n candidate,\n stable: 1 - candidate,\n };\n }\n}\n"],"mappings":";AAEA,IAAa,iBAAb,MAA4B;CAC1B,YAAY,AAAiBA,MAAsB;EAAtB;;CAE7B,aAAa,OAAkC;AAC7C,MAAI,KAAK,SAAS,aAChB,QAAO,MAAM,cAAc,MACvB;GAAE,QAAQ;GAAG,WAAW;GAAG,GAC3B;GAAE,QAAQ;GAAG,WAAW;GAAG;EAGjC,MAAM,YAAY,KAAK,IAAI,KAAK,IAAI,MAAM,aAAa,KAAK,EAAE,EAAE,EAAE;AAClE,SAAO;GACL;GACA,QAAQ,IAAI;GACb"}
1
+ {"version":3,"file":"traffic-shifter.js","names":[],"sources":["../src/traffic-shifter.ts"],"sourcesContent":["import type { CanaryStage, DeploymentMode, TrafficSplit } from './types';\n\nexport class TrafficShifter {\n constructor(private readonly mode: DeploymentMode) {}\n\n computeSplit(stage: CanaryStage): TrafficSplit {\n if (this.mode === 'blue-green') {\n return stage.percentage >= 100\n ? { stable: 0, candidate: 1 }\n : { stable: 1, candidate: 0 };\n }\n\n const candidate = Math.min(Math.max(stage.percentage / 100, 0), 1);\n return {\n candidate,\n stable: 1 - candidate,\n };\n }\n}\n"],"mappings":";AAEA,IAAa,iBAAb,MAA4B;CAC1B,YAAY,AAAiB,MAAsB;EAAtB;;CAE7B,aAAa,OAAkC;AAC7C,MAAI,KAAK,SAAS,aAChB,QAAO,MAAM,cAAc,MACvB;GAAE,QAAQ;GAAG,WAAW;GAAG,GAC3B;GAAE,QAAQ;GAAG,WAAW;GAAG;EAGjC,MAAM,YAAY,KAAK,IAAI,KAAK,IAAI,MAAM,aAAa,KAAK,EAAE,EAAE,EAAE;AAClE,SAAO;GACL;GACA,QAAQ,IAAI;GACb"}
package/package.json CHANGED
@@ -1,9 +1,7 @@
1
1
  {
2
2
  "name": "@contractspec/lib.progressive-delivery",
3
- "version": "1.46.2",
3
+ "version": "2.0.0",
4
4
  "type": "module",
5
- "main": "./dist/index.js",
6
- "module": "./dist/index.js",
7
5
  "types": "./dist/index.d.ts",
8
6
  "files": [
9
7
  "dist",
@@ -22,12 +20,12 @@
22
20
  "lint:check": "eslint src"
23
21
  },
24
22
  "peerDependencies": {
25
- "@contractspec/lib.observability": "1.46.2"
23
+ "@contractspec/lib.observability": "1.48.0"
26
24
  },
27
25
  "devDependencies": {
28
- "@contractspec/tool.tsdown": "1.46.2",
29
- "@contractspec/tool.typescript": "1.46.2",
30
- "tsdown": "^0.18.3",
26
+ "@contractspec/tool.tsdown": "1.48.0",
27
+ "@contractspec/tool.typescript": "1.48.0",
28
+ "tsdown": "^0.19.0",
31
29
  "typescript": "^5.9.3"
32
30
  },
33
31
  "exports": {