@pipeline-builder/pipeline-core 4.1.22 → 4.1.23

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/index.d.ts CHANGED
@@ -32,7 +32,7 @@ export * from './config/app-config.js';
32
32
  export * from './config/config-types.js';
33
33
  export * from './config/service-client.js';
34
34
  export { parsePlatformBaseUrl } from './config/infrastructure-config.js';
35
- export { ComputeType, PluginType, type MetaDataType, type Visibility, TriggerType, MetadataKeys, type MetadataKey, CDK_METADATA_PREFIX } from './core/pipeline-types.js';
35
+ export { ComputeType, PluginType, type MetaDataType, type Visibility, TriggerType, MetadataKeys, type MetadataKey } from './core/pipeline-types.js';
36
36
  export * from './core/role-types.js';
37
37
  export * from './core/security-group-types.js';
38
38
  export { replaceNonAlphanumeric, extractMetadataEnv, resolveFailureBehavior, wrapCommandsForFailureBehavior, STEP_BOOTSTRAP_CMD } from './core/metadata-helpers.js';
@@ -40,5 +40,5 @@ export * from './core/step-manifest.js';
40
40
  export { type ContractValueType, type PluginContract, type ContractScope, type ContractIssue, type ContractScopeProps, pipelineScopeMetadata, pipelineContractScope, contractScopeFromTemplateScope, isContractValueOfType, checkPluginContract, type PluginStepRef, collectPluginSteps, pluginLookupFilter, pluginArtifactAlias, type PluginRefIdentity, sanitizePublisher, } from './core/plugin-contract.js';
41
41
  export { unwrapLookup } from './core/plugin-lookup-envelope.js';
42
42
  export * from './pipeline/plugin-spec.js';
43
- export { tokenize, hasTemplate, MAX_FIELD_SIZE_BYTES, MAX_PATH_DEPTH, type Token, type LiteralToken, type ExprToken, type SourcePosition, resolve, dependencies, type Scope, type EvalError, type WalkEntry, type FieldPredicate, type TopoNode, type TopoResult, validateTemplates, detectCycles, allowedScopeRoots, type TemplateError, type TemplateValidationResult, type ResolveResult, resolveSelfReferencing, } from './template/index.js';
44
- export { resolvePluginTemplates, isPluginTemplatableField } from './template/plugin-resolver.js';
43
+ export { tokenize, hasTemplate, MAX_FIELD_SIZE_BYTES, MAX_PATH_DEPTH, type Token, type LiteralToken, type ExprToken, type SourcePosition, resolve, dependencies, type Scope, type FieldPredicate, validateTemplates, detectCycles, allowedScopeRoots, type TemplateError, type TemplateValidationResult, type ResolveResult, resolveSelfReferencing, validateTemplateDraft, formatTemplateDraftProblems, type TemplateDraftInput, type TemplateDraftLike, type TemplateDraftProblem, type TemplateDraftProblemKind, type TemplateDraftValidation, } from './template/index.js';
44
+ export { resolvePluginTemplates } from './template/plugin-resolver.js';
package/lib/index.js CHANGED
@@ -36,7 +36,7 @@ export * from './config/config-types.js';
36
36
  export * from './config/service-client.js';
37
37
  export { parsePlatformBaseUrl } from './config/infrastructure-config.js';
38
38
  // Core types (public surface)
39
- export { ComputeType, PluginType, TriggerType, MetadataKeys, CDK_METADATA_PREFIX } from './core/pipeline-types.js';
39
+ export { ComputeType, PluginType, TriggerType, MetadataKeys } from './core/pipeline-types.js';
40
40
  export * from './core/role-types.js';
41
41
  export * from './core/security-group-types.js';
42
42
  export { replaceNonAlphanumeric, extractMetadataEnv, resolveFailureBehavior, wrapCommandsForFailureBehavior, STEP_BOOTSTRAP_CMD } from './core/metadata-helpers.js';
@@ -46,7 +46,7 @@ export { unwrapLookup } from './core/plugin-lookup-envelope.js';
46
46
  // Plugin domain type (the synth-time authoring types live in the `/cdk` entry)
47
47
  export * from './pipeline/plugin-spec.js';
48
48
  // Template engine — synth-time scripting for pipeline config + plugin specs
49
- export { tokenize, hasTemplate, MAX_FIELD_SIZE_BYTES, MAX_PATH_DEPTH, resolve, dependencies, validateTemplates, detectCycles, allowedScopeRoots, resolveSelfReferencing, } from './template/index.js';
49
+ export { tokenize, hasTemplate, MAX_FIELD_SIZE_BYTES, MAX_PATH_DEPTH, resolve, dependencies, validateTemplates, detectCycles, allowedScopeRoots, resolveSelfReferencing, validateTemplateDraft, formatTemplateDraftProblems, } from './template/index.js';
50
50
  // A plugin's `{{ … }}` resolution against a pipeline scope (synth, `plugin test`)
51
- export { resolvePluginTemplates, isPluginTemplatableField } from './template/plugin-resolver.js';
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFFSCxnQkFBZ0I7QUFDaEIsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFekUsOEJBQThCO0FBQzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFzQyxXQUFXLEVBQUUsWUFBWSxFQUFvQixtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pLLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsOEJBQThCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwSyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLE9BQU8sRUFNTCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDhCQUE4QixFQUM5QixxQkFBcUIsRUFDckIsbUJBQW1CLEVBRW5CLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBRW5CLGlCQUFpQixHQUNsQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVoRSwrRUFBK0U7QUFDL0UsY0FBYywyQkFBMkIsQ0FBQztBQUUxQyw0RUFBNEU7QUFDNUUsT0FBTyxFQUNMLFFBQVEsRUFDUixXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLGNBQWMsRUFLZCxPQUFPLEVBQ1AsWUFBWSxFQU9aLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osaUJBQWlCLEVBSWpCLHNCQUFzQixHQUN2QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLGtGQUFrRjtBQUNsRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIEBtb2R1bGUgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZVxuICpcbiAqIEFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24sIHBpcGVsaW5lIGRvbWFpbiB0eXBlcywgYW5kIHRoZSB0ZW1wbGF0ZSBlbmdpbmUuXG4gKlxuICogVGhpcyBlbnRyeSBwb2ludCBpcyBkZWxpYmVyYXRlbHkgRlJFRSBvZiBgYXdzLWNkay1saWJgLiBUaGUgQ0RLIGNvbnN0cnVjdHMgbGl2ZVxuICogYmVoaW5kIGEgc2VwYXJhdGUgc3VicGF0aCDigJQgYEBwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUvY2RrYCDigJQgYmVjYXVzZSB0aGVcbiAqIEFQSSBzZXJ2aWNlcyBjb25zdW1lIHRoaXMgcGFja2FnZSBmb3IgY29uZmlnIGFuZCBkb21haW4gdHlwZXMgb25seSwgYW5kIGFuXG4gKiBgZXhwb3J0ICpgIG9mIHRoZSBjb25zdHJ1Y3RzIGZyb20gaGVyZSBwdXQgdGhlIHdob2xlIG9mIGBhd3MtY2RrLWxpYmAgb24gdGhlXG4gKiBpbXBvcnQgZ3JhcGggb2YgZXZlcnkgc2VydmljZSB0aGF0IHJlYWQgc28gbXVjaCBhcyBhIHBvcnQgbnVtYmVyLiBBbnl0aGluZyB0aGF0XG4gKiBpbXBvcnRzIGBhd3MtY2RrLWxpYmAsIGF0IHR5cGUgbGV2ZWwgb3IgdmFsdWUgbGV2ZWwsIGJlbG9uZ3MgaW4gYGNkay50c2AuXG4gKlxuICogKipDb25maWcqKlxuICogLSBDb25maWcg4oCUIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gc2luZ2xldG9uIChlbnZpcm9ubWVudC1kcml2ZW4pXG4gKiAtIENvbmZpZ1R5cGVzIOKAlCB0eXBlZCBjb25maWd1cmF0aW9uIGludGVyZmFjZXNcbiAqXG4gKiAqKlR5cGVzKipcbiAqIC0gUGlwZWxpbmVUeXBlLCBDb21wdXRlVHlwZSwgUGx1Z2luVHlwZSwgVmlzaWJpbGl0eSDigJQgcGlwZWxpbmUgZG9tYWluIGVudW1zXG4gKiAtIFJvbGVUeXBlcywgU2VjdXJpdHlHcm91cFR5cGVzIOKAlCBpbmZyYXN0cnVjdHVyZSB0eXBlIGRlZmluaXRpb25zXG4gKiAtIFBsdWdpblNwZWMg4oCUIGEgcGx1Z2luJ3MgZGVjbGFyZWQgY29udHJhY3RcbiAqIC0gSWRHZW5lcmF0b3Ig4oCUIGRldGVybWluaXN0aWMgSUQgZ2VuZXJhdGlvblxuICpcbiAqICoqSGVscGVycyoqXG4gKiAtIHJlcGxhY2VOb25BbHBoYW51bWVyaWMsIGV4dHJhY3RNZXRhZGF0YUVudiDigJQgc3RyaW5nIGFuZCBtZXRhZGF0YSB1dGlsaXRpZXNcbiAqIC0gcmVzb2x2ZUZhaWx1cmVCZWhhdmlvciwgd3JhcENvbW1hbmRzRm9yRmFpbHVyZUJlaGF2aW9yIOKAlCBhIHN0ZXAncyBmYWlsdXJlQmVoYXZpb3IsIGFzIENvZGVCdWlsZCBydW5zIGl0XG4gKlxuICogVGhlIFBvc3RncmVzL0RyaXp6bGUgZGF0YSBsYXllciAoZGIsIHNjaGVtYSwgQ3J1ZFNlcnZpY2UsIHF1ZXJ5IGJ1aWxkZXJzLFxuICogZmlsdGVyL2NvbXBsaWFuY2UgdHlwZXMsIGV0Yy4pIGlzIE5PVCByZS1leHBvcnRlZCBoZXJlIOKAlCBpbXBvcnQgdGhvc2VcbiAqIGRpcmVjdGx5IGZyb20gYEBwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGFgLlxuICovXG5cbi8vIENvbmZpZ3VyYXRpb25cbmV4cG9ydCAqIGZyb20gJy4vY29uZmlnL2FwcC1jb25maWcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25maWcvY29uZmlnLXR5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29uZmlnL3NlcnZpY2UtY2xpZW50LmpzJztcbmV4cG9ydCB7IHBhcnNlUGxhdGZvcm1CYXNlVXJsIH0gZnJvbSAnLi9jb25maWcvaW5mcmFzdHJ1Y3R1cmUtY29uZmlnLmpzJztcblxuLy8gQ29yZSB0eXBlcyAocHVibGljIHN1cmZhY2UpXG5leHBvcnQgeyBDb21wdXRlVHlwZSwgUGx1Z2luVHlwZSwgdHlwZSBNZXRhRGF0YVR5cGUsIHR5cGUgVmlzaWJpbGl0eSwgVHJpZ2dlclR5cGUsIE1ldGFkYXRhS2V5cywgdHlwZSBNZXRhZGF0YUtleSwgQ0RLX01FVEFEQVRBX1BSRUZJWCB9IGZyb20gJy4vY29yZS9waXBlbGluZS10eXBlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvcm9sZS10eXBlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvc2VjdXJpdHktZ3JvdXAtdHlwZXMuanMnO1xuZXhwb3J0IHsgcmVwbGFjZU5vbkFscGhhbnVtZXJpYywgZXh0cmFjdE1ldGFkYXRhRW52LCByZXNvbHZlRmFpbHVyZUJlaGF2aW9yLCB3cmFwQ29tbWFuZHNGb3JGYWlsdXJlQmVoYXZpb3IsIFNURVBfQk9PVFNUUkFQX0NNRCB9IGZyb20gJy4vY29yZS9tZXRhZGF0YS1oZWxwZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9zdGVwLW1hbmlmZXN0LmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgQ29udHJhY3RWYWx1ZVR5cGUsXG4gIHR5cGUgUGx1Z2luQ29udHJhY3QsXG4gIHR5cGUgQ29udHJhY3RTY29wZSxcbiAgdHlwZSBDb250cmFjdElzc3VlLFxuICB0eXBlIENvbnRyYWN0U2NvcGVQcm9wcyxcbiAgcGlwZWxpbmVTY29wZU1ldGFkYXRhLFxuICBwaXBlbGluZUNvbnRyYWN0U2NvcGUsXG4gIGNvbnRyYWN0U2NvcGVGcm9tVGVtcGxhdGVTY29wZSxcbiAgaXNDb250cmFjdFZhbHVlT2ZUeXBlLFxuICBjaGVja1BsdWdpbkNvbnRyYWN0LFxuICB0eXBlIFBsdWdpblN0ZXBSZWYsXG4gIGNvbGxlY3RQbHVnaW5TdGVwcyxcbiAgcGx1Z2luTG9va3VwRmlsdGVyLFxuICBwbHVnaW5BcnRpZmFjdEFsaWFzLFxuICB0eXBlIFBsdWdpblJlZklkZW50aXR5LFxuICBzYW5pdGl6ZVB1Ymxpc2hlcixcbn0gZnJvbSAnLi9jb3JlL3BsdWdpbi1jb250cmFjdC5qcyc7XG5leHBvcnQgeyB1bndyYXBMb29rdXAgfSBmcm9tICcuL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyc7XG5cbi8vIFBsdWdpbiBkb21haW4gdHlwZSAodGhlIHN5bnRoLXRpbWUgYXV0aG9yaW5nIHR5cGVzIGxpdmUgaW4gdGhlIGAvY2RrYCBlbnRyeSlcbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUvcGx1Z2luLXNwZWMuanMnO1xuXG4vLyBUZW1wbGF0ZSBlbmdpbmUg4oCUIHN5bnRoLXRpbWUgc2NyaXB0aW5nIGZvciBwaXBlbGluZSBjb25maWcgKyBwbHVnaW4gc3BlY3NcbmV4cG9ydCB7XG4gIHRva2VuaXplLFxuICBoYXNUZW1wbGF0ZSxcbiAgTUFYX0ZJRUxEX1NJWkVfQllURVMsXG4gIE1BWF9QQVRIX0RFUFRILFxuICB0eXBlIFRva2VuLFxuICB0eXBlIExpdGVyYWxUb2tlbixcbiAgdHlwZSBFeHByVG9rZW4sXG4gIHR5cGUgU291cmNlUG9zaXRpb24sXG4gIHJlc29sdmUsXG4gIGRlcGVuZGVuY2llcyxcbiAgdHlwZSBTY29wZSxcbiAgdHlwZSBFdmFsRXJyb3IsXG4gIHR5cGUgV2Fsa0VudHJ5LFxuICB0eXBlIEZpZWxkUHJlZGljYXRlLFxuICB0eXBlIFRvcG9Ob2RlLFxuICB0eXBlIFRvcG9SZXN1bHQsXG4gIHZhbGlkYXRlVGVtcGxhdGVzLFxuICBkZXRlY3RDeWNsZXMsXG4gIGFsbG93ZWRTY29wZVJvb3RzLFxuICB0eXBlIFRlbXBsYXRlRXJyb3IsXG4gIHR5cGUgVGVtcGxhdGVWYWxpZGF0aW9uUmVzdWx0LFxuICB0eXBlIFJlc29sdmVSZXN1bHQsXG4gIHJlc29sdmVTZWxmUmVmZXJlbmNpbmcsXG59IGZyb20gJy4vdGVtcGxhdGUvaW5kZXguanMnO1xuLy8gQSBwbHVnaW4ncyBge3sg4oCmIH19YCByZXNvbHV0aW9uIGFnYWluc3QgYSBwaXBlbGluZSBzY29wZSAoc3ludGgsIGBwbHVnaW4gdGVzdGApXG5leHBvcnQgeyByZXNvbHZlUGx1Z2luVGVtcGxhdGVzLCBpc1BsdWdpblRlbXBsYXRhYmxlRmllbGQgfSBmcm9tICcuL3RlbXBsYXRlL3BsdWdpbi1yZXNvbHZlci5qcyc7XG4iXX0=
51
+ export { resolvePluginTemplates } from './template/plugin-resolver.js';
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFFSCxnQkFBZ0I7QUFDaEIsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFekUsOEJBQThCO0FBQzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFzQyxXQUFXLEVBQUUsWUFBWSxFQUFvQixNQUFNLDBCQUEwQixDQUFDO0FBQ3BKLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsOEJBQThCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwSyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLE9BQU8sRUFNTCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDhCQUE4QixFQUM5QixxQkFBcUIsRUFDckIsbUJBQW1CLEVBRW5CLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBRW5CLGlCQUFpQixHQUNsQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVoRSwrRUFBK0U7QUFDL0UsY0FBYywyQkFBMkIsQ0FBQztBQUUxQyw0RUFBNEU7QUFDNUUsT0FBTyxFQUNMLFFBQVEsRUFDUixXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLGNBQWMsRUFLZCxPQUFPLEVBQ1AsWUFBWSxFQUdaLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osaUJBQWlCLEVBSWpCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsMkJBQTJCLEdBTTVCLE1BQU0scUJBQXFCLENBQUM7QUFDN0Isa0ZBQWtGO0FBQ2xGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogQG1vZHVsZSBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlXG4gKlxuICogQXBwbGljYXRpb24gY29uZmlndXJhdGlvbiwgcGlwZWxpbmUgZG9tYWluIHR5cGVzLCBhbmQgdGhlIHRlbXBsYXRlIGVuZ2luZS5cbiAqXG4gKiBUaGlzIGVudHJ5IHBvaW50IGlzIGRlbGliZXJhdGVseSBGUkVFIG9mIGBhd3MtY2RrLWxpYmAuIFRoZSBDREsgY29uc3RydWN0cyBsaXZlXG4gKiBiZWhpbmQgYSBzZXBhcmF0ZSBzdWJwYXRoIOKAlCBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZS9jZGtgIOKAlCBiZWNhdXNlIHRoZVxuICogQVBJIHNlcnZpY2VzIGNvbnN1bWUgdGhpcyBwYWNrYWdlIGZvciBjb25maWcgYW5kIGRvbWFpbiB0eXBlcyBvbmx5LCBhbmQgYW5cbiAqIGBleHBvcnQgKmAgb2YgdGhlIGNvbnN0cnVjdHMgZnJvbSBoZXJlIHB1dCB0aGUgd2hvbGUgb2YgYGF3cy1jZGstbGliYCBvbiB0aGVcbiAqIGltcG9ydCBncmFwaCBvZiBldmVyeSBzZXJ2aWNlIHRoYXQgcmVhZCBzbyBtdWNoIGFzIGEgcG9ydCBudW1iZXIuIEFueXRoaW5nIHRoYXRcbiAqIGltcG9ydHMgYGF3cy1jZGstbGliYCwgYXQgdHlwZSBsZXZlbCBvciB2YWx1ZSBsZXZlbCwgYmVsb25ncyBpbiBgY2RrLnRzYC5cbiAqXG4gKiAqKkNvbmZpZyoqXG4gKiAtIENvbmZpZyDigJQgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBzaW5nbGV0b24gKGVudmlyb25tZW50LWRyaXZlbilcbiAqIC0gQ29uZmlnVHlwZXMg4oCUIHR5cGVkIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlc1xuICpcbiAqICoqVHlwZXMqKlxuICogLSBQaXBlbGluZVR5cGUsIENvbXB1dGVUeXBlLCBQbHVnaW5UeXBlLCBWaXNpYmlsaXR5IOKAlCBwaXBlbGluZSBkb21haW4gZW51bXNcbiAqIC0gUm9sZVR5cGVzLCBTZWN1cml0eUdyb3VwVHlwZXMg4oCUIGluZnJhc3RydWN0dXJlIHR5cGUgZGVmaW5pdGlvbnNcbiAqIC0gUGx1Z2luU3BlYyDigJQgYSBwbHVnaW4ncyBkZWNsYXJlZCBjb250cmFjdFxuICogLSBJZEdlbmVyYXRvciDigJQgZGV0ZXJtaW5pc3RpYyBJRCBnZW5lcmF0aW9uXG4gKlxuICogKipIZWxwZXJzKipcbiAqIC0gcmVwbGFjZU5vbkFscGhhbnVtZXJpYywgZXh0cmFjdE1ldGFkYXRhRW52IOKAlCBzdHJpbmcgYW5kIG1ldGFkYXRhIHV0aWxpdGllc1xuICogLSByZXNvbHZlRmFpbHVyZUJlaGF2aW9yLCB3cmFwQ29tbWFuZHNGb3JGYWlsdXJlQmVoYXZpb3Ig4oCUIGEgc3RlcCdzIGZhaWx1cmVCZWhhdmlvciwgYXMgQ29kZUJ1aWxkIHJ1bnMgaXRcbiAqXG4gKiBUaGUgUG9zdGdyZXMvRHJpenpsZSBkYXRhIGxheWVyIChkYiwgc2NoZW1hLCBDcnVkU2VydmljZSwgcXVlcnkgYnVpbGRlcnMsXG4gKiBmaWx0ZXIvY29tcGxpYW5jZSB0eXBlcywgZXRjLikgaXMgTk9UIHJlLWV4cG9ydGVkIGhlcmUg4oCUIGltcG9ydCB0aG9zZVxuICogZGlyZWN0bHkgZnJvbSBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YWAuXG4gKi9cblxuLy8gQ29uZmlndXJhdGlvblxuZXhwb3J0ICogZnJvbSAnLi9jb25maWcvYXBwLWNvbmZpZy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9jb25maWctdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25maWcvc2VydmljZS1jbGllbnQuanMnO1xuZXhwb3J0IHsgcGFyc2VQbGF0Zm9ybUJhc2VVcmwgfSBmcm9tICcuL2NvbmZpZy9pbmZyYXN0cnVjdHVyZS1jb25maWcuanMnO1xuXG4vLyBDb3JlIHR5cGVzIChwdWJsaWMgc3VyZmFjZSlcbmV4cG9ydCB7IENvbXB1dGVUeXBlLCBQbHVnaW5UeXBlLCB0eXBlIE1ldGFEYXRhVHlwZSwgdHlwZSBWaXNpYmlsaXR5LCBUcmlnZ2VyVHlwZSwgTWV0YWRhdGFLZXlzLCB0eXBlIE1ldGFkYXRhS2V5IH0gZnJvbSAnLi9jb3JlL3BpcGVsaW5lLXR5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9yb2xlLXR5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9zZWN1cml0eS1ncm91cC10eXBlcy5qcyc7XG5leHBvcnQgeyByZXBsYWNlTm9uQWxwaGFudW1lcmljLCBleHRyYWN0TWV0YWRhdGFFbnYsIHJlc29sdmVGYWlsdXJlQmVoYXZpb3IsIHdyYXBDb21tYW5kc0ZvckZhaWx1cmVCZWhhdmlvciwgU1RFUF9CT09UU1RSQVBfQ01EIH0gZnJvbSAnLi9jb3JlL21ldGFkYXRhLWhlbHBlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3N0ZXAtbWFuaWZlc3QuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBDb250cmFjdFZhbHVlVHlwZSxcbiAgdHlwZSBQbHVnaW5Db250cmFjdCxcbiAgdHlwZSBDb250cmFjdFNjb3BlLFxuICB0eXBlIENvbnRyYWN0SXNzdWUsXG4gIHR5cGUgQ29udHJhY3RTY29wZVByb3BzLFxuICBwaXBlbGluZVNjb3BlTWV0YWRhdGEsXG4gIHBpcGVsaW5lQ29udHJhY3RTY29wZSxcbiAgY29udHJhY3RTY29wZUZyb21UZW1wbGF0ZVNjb3BlLFxuICBpc0NvbnRyYWN0VmFsdWVPZlR5cGUsXG4gIGNoZWNrUGx1Z2luQ29udHJhY3QsXG4gIHR5cGUgUGx1Z2luU3RlcFJlZixcbiAgY29sbGVjdFBsdWdpblN0ZXBzLFxuICBwbHVnaW5Mb29rdXBGaWx0ZXIsXG4gIHBsdWdpbkFydGlmYWN0QWxpYXMsXG4gIHR5cGUgUGx1Z2luUmVmSWRlbnRpdHksXG4gIHNhbml0aXplUHVibGlzaGVyLFxufSBmcm9tICcuL2NvcmUvcGx1Z2luLWNvbnRyYWN0LmpzJztcbmV4cG9ydCB7IHVud3JhcExvb2t1cCB9IGZyb20gJy4vY29yZS9wbHVnaW4tbG9va3VwLWVudmVsb3BlLmpzJztcblxuLy8gUGx1Z2luIGRvbWFpbiB0eXBlICh0aGUgc3ludGgtdGltZSBhdXRob3JpbmcgdHlwZXMgbGl2ZSBpbiB0aGUgYC9jZGtgIGVudHJ5KVxuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZS9wbHVnaW4tc3BlYy5qcyc7XG5cbi8vIFRlbXBsYXRlIGVuZ2luZSDigJQgc3ludGgtdGltZSBzY3JpcHRpbmcgZm9yIHBpcGVsaW5lIGNvbmZpZyArIHBsdWdpbiBzcGVjc1xuZXhwb3J0IHtcbiAgdG9rZW5pemUsXG4gIGhhc1RlbXBsYXRlLFxuICBNQVhfRklFTERfU0laRV9CWVRFUyxcbiAgTUFYX1BBVEhfREVQVEgsXG4gIHR5cGUgVG9rZW4sXG4gIHR5cGUgTGl0ZXJhbFRva2VuLFxuICB0eXBlIEV4cHJUb2tlbixcbiAgdHlwZSBTb3VyY2VQb3NpdGlvbixcbiAgcmVzb2x2ZSxcbiAgZGVwZW5kZW5jaWVzLFxuICB0eXBlIFNjb3BlLFxuICB0eXBlIEZpZWxkUHJlZGljYXRlLFxuICB2YWxpZGF0ZVRlbXBsYXRlcyxcbiAgZGV0ZWN0Q3ljbGVzLFxuICBhbGxvd2VkU2NvcGVSb290cyxcbiAgdHlwZSBUZW1wbGF0ZUVycm9yLFxuICB0eXBlIFRlbXBsYXRlVmFsaWRhdGlvblJlc3VsdCxcbiAgdHlwZSBSZXNvbHZlUmVzdWx0LFxuICByZXNvbHZlU2VsZlJlZmVyZW5jaW5nLFxuICB2YWxpZGF0ZVRlbXBsYXRlRHJhZnQsXG4gIGZvcm1hdFRlbXBsYXRlRHJhZnRQcm9ibGVtcyxcbiAgdHlwZSBUZW1wbGF0ZURyYWZ0SW5wdXQsXG4gIHR5cGUgVGVtcGxhdGVEcmFmdExpa2UsXG4gIHR5cGUgVGVtcGxhdGVEcmFmdFByb2JsZW0sXG4gIHR5cGUgVGVtcGxhdGVEcmFmdFByb2JsZW1LaW5kLFxuICB0eXBlIFRlbXBsYXRlRHJhZnRWYWxpZGF0aW9uLFxufSBmcm9tICcuL3RlbXBsYXRlL2luZGV4LmpzJztcbi8vIEEgcGx1Z2luJ3MgYHt7IOKApiB9fWAgcmVzb2x1dGlvbiBhZ2FpbnN0IGEgcGlwZWxpbmUgc2NvcGUgKHN5bnRoLCBgcGx1Z2luIHRlc3RgKVxuZXhwb3J0IHsgcmVzb2x2ZVBsdWdpblRlbXBsYXRlcyB9IGZyb20gJy4vdGVtcGxhdGUvcGx1Z2luLXJlc29sdmVyLmpzJztcbiJdfQ==
@@ -0,0 +1,47 @@
1
+ /** What went wrong. See the module header for what each kind means. */
2
+ export type TemplateDraftProblemKind = 'invalid-props' | 'parse' | 'reserved-scope' | 'unknown-scope' | 'cycle' | 'undeclared-variable' | 'duplicate-input' | 'invalid-input-name' | 'unused-input';
3
+ /** One problem found in a drafted template. */
4
+ export interface TemplateDraftProblem {
5
+ readonly kind: TemplateDraftProblemKind;
6
+ /** `error` blocks the draft; `warning` is worth saying but not fatal. */
7
+ readonly severity: 'error' | 'warning';
8
+ readonly message: string;
9
+ /** Dotted path of the offending field inside `props`, when there is one. */
10
+ readonly field?: string;
11
+ readonly line?: number;
12
+ readonly col?: number;
13
+ /** The `{{ path }}` that caused it. */
14
+ readonly path?: string;
15
+ /** For `cycle`: the scope keys forming the loop. */
16
+ readonly cycle?: readonly string[];
17
+ /** For the variable/input kinds: the `vars.<name>` involved. */
18
+ readonly variable?: string;
19
+ }
20
+ /** One declared input, read defensively — a draft's `inputs` is untrusted. */
21
+ export interface TemplateDraftInput {
22
+ readonly name?: unknown;
23
+ }
24
+ /** The part of a drafted template this validator reads. */
25
+ export interface TemplateDraftLike {
26
+ /** The template body: a BuilderProps carrying `{{ vars.* }}` placeholders. */
27
+ readonly props?: unknown;
28
+ /** The declared `vars.*` contract. */
29
+ readonly inputs?: readonly TemplateDraftInput[] | null;
30
+ }
31
+ /** The verdict on a drafted template. */
32
+ export interface TemplateDraftValidation {
33
+ /** True when no problem has `severity: 'error'`. */
34
+ readonly valid: boolean;
35
+ readonly problems: readonly TemplateDraftProblem[];
36
+ /** Every `vars.<name>` the body references, sorted. */
37
+ readonly referencedVariables: readonly string[];
38
+ /** Every well-formed `inputs[].name`, in declaration order. */
39
+ readonly declaredInputs: readonly string[];
40
+ }
41
+ /**
42
+ * Validate a drafted pipeline template. Never throws: a malformed draft comes
43
+ * back as problems, because the caller's job is to report them, not to crash.
44
+ */
45
+ export declare function validateTemplateDraft(draft: TemplateDraftLike): TemplateDraftValidation;
46
+ /** One readable line per problem, for a tool result or an error body. */
47
+ export declare function formatTemplateDraftProblems(problems: readonly TemplateDraftProblem[]): string[];
@@ -0,0 +1,213 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Service-side validation of a DRAFTED pipeline template — the one entry point
5
+ * a caller needs to ask "would this template survive being created and then
6
+ * instantiated?" before it is offered to anyone.
7
+ *
8
+ * It exists because a drafted template (the ask agent's `propose_template`, a
9
+ * CLI-authored file, an import) is otherwise checked only against a shape
10
+ * schema. A shape schema cannot see that `{{ vars.REGION }}` is referenced but
11
+ * never declared in `inputs`, or that two metadata values reference each other
12
+ * in a cycle: both are accepted at create time and only fail later, at synth,
13
+ * far from whoever wrote them.
14
+ *
15
+ * What it reports:
16
+ * - `parse` — malformed `{{ … }}` anywhere in the body, at its line/col.
17
+ * - `reserved-scope` — `{{ secrets.* }}`, which the engine reserves.
18
+ * - `unknown-scope` — a self-referencing field pointing at a root that is
19
+ * neither `metadata` nor `vars`; the pipeline create
20
+ * path rejects exactly these.
21
+ * - `cycle` — self-references that cannot be ordered.
22
+ * - `undeclared-variable` — `{{ vars.X }}` with no matching `inputs[].name` and
23
+ * no default in `props.vars`, so instantiation can
24
+ * never supply it.
25
+ * - `duplicate-input` / `invalid-input-name` — an input that cannot be filled:
26
+ * a repeated name, or one the grammar cannot express
27
+ * as `{{ vars.<name> }}`.
28
+ * - `unused-input` — declared but never referenced. A WARNING: the
29
+ * template still works, it just asks for something
30
+ * it ignores.
31
+ *
32
+ * Errors mean "do not offer this"; warnings mean "say so and let the author
33
+ * decide". `valid` reflects errors only.
34
+ */
35
+ import { TokenizerError, tokenize } from './tokenizer.js';
36
+ import { detectCycles } from './validate.js';
37
+ import { visitStrings } from './walker.js';
38
+ /** The template grammar's identifier rule (tokenizer.ts): `[a-zA-Z_][a-zA-Z0-9_]{0,63}`. */
39
+ const IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]{0,63}$/;
40
+ /** The roots a self-referencing pipeline field may address (same set the pipeline create path allows). */
41
+ const SELF_SCOPE_ROOTS = ['metadata', 'vars'];
42
+ /** The metadata layers synth merges, in the order it merges them. */
43
+ const METADATA_PREFIXES = ['global.', 'defaults.metadata.', 'synth.metadata.'];
44
+ /** The first path segment of `rest` — `A.B` and `A[0]` both yield `A`. */
45
+ function firstSegment(rest) {
46
+ const match = /^[^.[]+/.exec(rest);
47
+ return match ? match[0] : rest;
48
+ }
49
+ /**
50
+ * The scope key a templatable field WRITES, or null when the field is not
51
+ * self-referencing. `global.env`, `defaults.metadata.env` and
52
+ * `synth.metadata.env` all write `metadata.env` — that is how synth layers
53
+ * them — so a cycle through any layer is found.
54
+ */
55
+ function selfScopeKey(field) {
56
+ if (field === 'project')
57
+ return 'project';
58
+ for (const prefix of METADATA_PREFIXES) {
59
+ if (field.startsWith(prefix))
60
+ return `metadata.${firstSegment(field.slice(prefix.length))}`;
61
+ }
62
+ if (field.startsWith('vars.'))
63
+ return `vars.${firstSegment(field.slice('vars.'.length))}`;
64
+ return null;
65
+ }
66
+ function isRecord(value) {
67
+ return !!value && typeof value === 'object' && !Array.isArray(value);
68
+ }
69
+ /**
70
+ * Validate a drafted pipeline template. Never throws: a malformed draft comes
71
+ * back as problems, because the caller's job is to report them, not to crash.
72
+ */
73
+ export function validateTemplateDraft(draft) {
74
+ const problems = [];
75
+ const referenced = new Set();
76
+ if (!isRecord(draft.props)) {
77
+ return {
78
+ valid: false,
79
+ problems: [{ kind: 'invalid-props', severity: 'error', message: 'Template body (props) must be an object' }],
80
+ referencedVariables: [],
81
+ declaredInputs: [],
82
+ };
83
+ }
84
+ const props = draft.props;
85
+ // -- Pass 1: every string in the body, so a malformed `{{` is caught wherever
86
+ // it is — not only in the fields the pipeline create path happens to check.
87
+ let parseFailed = false;
88
+ visitStrings(props, () => true, (field, source) => {
89
+ let tokens;
90
+ try {
91
+ tokens = tokenize(source);
92
+ }
93
+ catch (err) {
94
+ parseFailed = true;
95
+ const pos = err instanceof TokenizerError ? err.pos : undefined;
96
+ problems.push({
97
+ kind: 'parse',
98
+ severity: 'error',
99
+ message: err instanceof Error ? err.message : String(err),
100
+ field,
101
+ ...(pos && { line: pos.line, col: pos.col }),
102
+ });
103
+ return;
104
+ }
105
+ const selfReferencing = selfScopeKey(field) !== null;
106
+ for (const token of tokens) {
107
+ if (token.kind !== 'expr')
108
+ continue;
109
+ const root = token.path[0];
110
+ const path = token.path.join('.');
111
+ if (root === 'secrets') {
112
+ problems.push({
113
+ kind: 'reserved-scope',
114
+ severity: 'error',
115
+ message: '\'secrets\' is a reserved scope — a template body must not reference it',
116
+ field,
117
+ path,
118
+ line: token.pos.line,
119
+ col: token.pos.col,
120
+ });
121
+ continue;
122
+ }
123
+ if (root === 'vars' && token.path.length > 1)
124
+ referenced.add(token.path[1]);
125
+ if (selfReferencing && !SELF_SCOPE_ROOTS.includes(root)) {
126
+ problems.push({
127
+ kind: 'unknown-scope',
128
+ severity: 'error',
129
+ message: `Template references unknown scope root '${root}' (a pipeline field may reference ${SELF_SCOPE_ROOTS.join(' or ')} only)`,
130
+ field,
131
+ path,
132
+ line: token.pos.line,
133
+ col: token.pos.col,
134
+ });
135
+ }
136
+ }
137
+ });
138
+ // -- Pass 2: cycles among the self-referencing fields. Skipped when anything
139
+ // failed to parse — the cycle walker tokenizes eagerly and would throw on
140
+ // the same bad field that pass 1 already reported.
141
+ if (!parseFailed) {
142
+ for (const err of detectCycles(props, (field) => selfScopeKey(field) !== null, selfScopeKey)) {
143
+ problems.push({
144
+ kind: 'cycle',
145
+ severity: 'error',
146
+ message: err.message,
147
+ field: err.field,
148
+ ...(err.cycle && { cycle: err.cycle }),
149
+ });
150
+ }
151
+ }
152
+ // -- Pass 3: the declared inputs. An input the grammar cannot express, or one
153
+ // declared twice, can never be filled in — both are errors, not warnings.
154
+ const declared = [];
155
+ const seen = new Set();
156
+ for (const input of draft.inputs ?? []) {
157
+ const name = input?.name;
158
+ if (typeof name !== 'string' || !IDENTIFIER.test(name)) {
159
+ problems.push({
160
+ kind: 'invalid-input-name',
161
+ severity: 'error',
162
+ message: `Declared input ${JSON.stringify(name)} is not a usable variable name (${IDENTIFIER.source})`,
163
+ ...(typeof name === 'string' && { variable: name }),
164
+ });
165
+ continue;
166
+ }
167
+ if (seen.has(name)) {
168
+ problems.push({ kind: 'duplicate-input', severity: 'error', message: `Declared input '${name}' appears more than once`, variable: name });
169
+ continue;
170
+ }
171
+ seen.add(name);
172
+ declared.push(name);
173
+ }
174
+ // -- Pass 4: the contract between body and inputs. A var the body references
175
+ // is supplied either by a declared input or by a default already sitting in
176
+ // `props.vars`; anything else has no way of ever getting a value.
177
+ const defaulted = isRecord(props.vars) ? Object.keys(props.vars) : [];
178
+ const supplied = new Set([...declared, ...defaulted]);
179
+ for (const variable of [...referenced].sort()) {
180
+ if (supplied.has(variable))
181
+ continue;
182
+ problems.push({
183
+ kind: 'undeclared-variable',
184
+ severity: 'error',
185
+ message: `Template references {{ vars.${variable} }} but declares no input named '${variable}'`,
186
+ variable,
187
+ });
188
+ }
189
+ for (const name of declared) {
190
+ if (referenced.has(name))
191
+ continue;
192
+ problems.push({
193
+ kind: 'unused-input',
194
+ severity: 'warning',
195
+ message: `Declared input '${name}' is never referenced as {{ vars.${name} }}`,
196
+ variable: name,
197
+ });
198
+ }
199
+ return {
200
+ valid: !problems.some((p) => p.severity === 'error'),
201
+ problems,
202
+ referencedVariables: [...referenced].sort(),
203
+ declaredInputs: declared,
204
+ };
205
+ }
206
+ /** One readable line per problem, for a tool result or an error body. */
207
+ export function formatTemplateDraftProblems(problems) {
208
+ return problems.map((p) => {
209
+ const where = p.field ? `${p.field}${p.line !== undefined ? `:${p.line}:${p.col}` : ''}` : p.kind;
210
+ return `[${where}] ${p.message}`;
211
+ });
212
+ }
213
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvZHJhZnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBd0QzQyw0RkFBNEY7QUFDNUYsTUFBTSxVQUFVLEdBQUcsK0JBQStCLENBQUM7QUFFbkQsMEdBQTBHO0FBQzFHLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFFOUMscUVBQXFFO0FBQ3JFLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUUvRSwwRUFBMEU7QUFDMUUsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNqQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFhO0lBQ2pDLElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMxQyxLQUFLLE1BQU0sTUFBTSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDdkMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sWUFBWSxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FB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QUFDO0lBRUQsT0FBTztRQUNMLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDO1FBQ3BELFFBQVE7UUFDUixtQkFBbUIsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFO1FBQzNDLGNBQWMsRUFBRSxRQUFRO0tBQ3pCLENBQUM7QUFDSixDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxRQUF5QztJQUNuRixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUN4QixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2xHLE9BQU8sSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNlcnZpY2Utc2lkZSB2YWxpZGF0aW9uIG9mIGEgRFJBRlRFRCBwaXBlbGluZSB0ZW1wbGF0ZSDigJQgdGhlIG9uZSBlbnRyeSBwb2ludFxuICogYSBjYWxsZXIgbmVlZHMgdG8gYXNrIFwid291bGQgdGhpcyB0ZW1wbGF0ZSBzdXJ2aXZlIGJlaW5nIGNyZWF0ZWQgYW5kIHRoZW5cbiAqIGluc3RhbnRpYXRlZD9cIiBiZWZvcmUgaXQgaXMgb2ZmZXJlZCB0byBhbnlvbmUuXG4gKlxuICogSXQgZXhpc3RzIGJlY2F1c2UgYSBkcmFmdGVkIHRlbXBsYXRlICh0aGUgYXNrIGFnZW50J3MgYHByb3Bvc2VfdGVtcGxhdGVgLCBhXG4gKiBDTEktYXV0aG9yZWQgZmlsZSwgYW4gaW1wb3J0KSBpcyBvdGhlcndpc2UgY2hlY2tlZCBvbmx5IGFnYWluc3QgYSBzaGFwZVxuICogc2NoZW1hLiBBIHNoYXBlIHNjaGVtYSBjYW5ub3Qgc2VlIHRoYXQgYHt7IHZhcnMuUkVHSU9OIH19YCBpcyByZWZlcmVuY2VkIGJ1dFxuICogbmV2ZXIgZGVjbGFyZWQgaW4gYGlucHV0c2AsIG9yIHRoYXQgdHdvIG1ldGFkYXRhIHZhbHVlcyByZWZlcmVuY2UgZWFjaCBvdGhlclxuICogaW4gYSBjeWNsZTogYm90aCBhcmUgYWNjZXB0ZWQgYXQgY3JlYXRlIHRpbWUgYW5kIG9ubHkgZmFpbCBsYXRlciwgYXQgc3ludGgsXG4gKiBmYXIgZnJvbSB3aG9ldmVyIHdyb3RlIHRoZW0uXG4gKlxuICogV2hhdCBpdCByZXBvcnRzOlxuICogIC0gYHBhcnNlYCAgICAgICAgICAgICAgICDigJQgbWFsZm9ybWVkIGB7eyDigKYgfX1gIGFueXdoZXJlIGluIHRoZSBib2R5LCBhdCBpdHMgbGluZS9jb2wuXG4gKiAgLSBgcmVzZXJ2ZWQtc2NvcGVgICAgICAgIOKAlCBge3sgc2VjcmV0cy4qIH19YCwgd2hpY2ggdGhlIGVuZ2luZSByZXNlcnZlcy5cbiAqICAtIGB1bmtub3duLXNjb3BlYCAgICAgICAg4oCUIGEgc2VsZi1yZWZlcmVuY2luZyBmaWVsZCBwb2ludGluZyBhdCBhIHJvb3QgdGhhdCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5laXRoZXIgYG1ldGFkYXRhYCBub3IgYHZhcnNgOyB0aGUgcGlwZWxpbmUgY3JlYXRlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCByZWplY3RzIGV4YWN0bHkgdGhlc2UuXG4gKiAgLSBgY3ljbGVgICAgICAgICAgICAgICAgIOKAlCBzZWxmLXJlZmVyZW5jZXMgdGhhdCBjYW5ub3QgYmUgb3JkZXJlZC5cbiAqICAtIGB1bmRlY2xhcmVkLXZhcmlhYmxlYCAg4oCUIGB7eyB2YXJzLlggfX1gIHdpdGggbm8gbWF0Y2hpbmcgYGlucHV0c1tdLm5hbWVgIGFuZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlZmF1bHQgaW4gYHByb3BzLnZhcnNgLCBzbyBpbnN0YW50aWF0aW9uIGNhblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldmVyIHN1cHBseSBpdC5cbiAqICAtIGBkdXBsaWNhdGUtaW5wdXRgIC8gYGludmFsaWQtaW5wdXQtbmFtZWAg4oCUIGFuIGlucHV0IHRoYXQgY2Fubm90IGJlIGZpbGxlZDpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHJlcGVhdGVkIG5hbWUsIG9yIG9uZSB0aGUgZ3JhbW1hciBjYW5ub3QgZXhwcmVzc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGB7eyB2YXJzLjxuYW1lPiB9fWAuXG4gKiAgLSBgdW51c2VkLWlucHV0YCAgICAgICAgIOKAlCBkZWNsYXJlZCBidXQgbmV2ZXIgcmVmZXJlbmNlZC4gQSBXQVJOSU5HOiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBzdGlsbCB3b3JrcywgaXQganVzdCBhc2tzIGZvciBzb21ldGhpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpZ25vcmVzLlxuICpcbiAqIEVycm9ycyBtZWFuIFwiZG8gbm90IG9mZmVyIHRoaXNcIjsgd2FybmluZ3MgbWVhbiBcInNheSBzbyBhbmQgbGV0IHRoZSBhdXRob3JcbiAqIGRlY2lkZVwiLiBgdmFsaWRgIHJlZmxlY3RzIGVycm9ycyBvbmx5LlxuICovXG5cbmltcG9ydCB7IFRva2VuaXplckVycm9yLCB0b2tlbml6ZSB9IGZyb20gJy4vdG9rZW5pemVyLmpzJztcbmltcG9ydCB7IGRldGVjdEN5Y2xlcyB9IGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IHsgdmlzaXRTdHJpbmdzIH0gZnJvbSAnLi93YWxrZXIuanMnO1xuXG4vKiogV2hhdCB3ZW50IHdyb25nLiBTZWUgdGhlIG1vZHVsZSBoZWFkZXIgZm9yIHdoYXQgZWFjaCBraW5kIG1lYW5zLiAqL1xuZXhwb3J0IHR5cGUgVGVtcGxhdGVEcmFmdFByb2JsZW1LaW5kID1cbiAgfCAnaW52YWxpZC1wcm9wcydcbiAgfCAncGFyc2UnXG4gIHwgJ3Jlc2VydmVkLXNjb3BlJ1xuICB8ICd1bmtub3duLXNjb3BlJ1xuICB8ICdjeWNsZSdcbiAgfCAndW5kZWNsYXJlZC12YXJpYWJsZSdcbiAgfCAnZHVwbGljYXRlLWlucHV0J1xuICB8ICdpbnZhbGlkLWlucHV0LW5hbWUnXG4gIHwgJ3VudXNlZC1pbnB1dCc7XG5cbi8qKiBPbmUgcHJvYmxlbSBmb3VuZCBpbiBhIGRyYWZ0ZWQgdGVtcGxhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlRHJhZnRQcm9ibGVtIHtcbiAgcmVhZG9ubHkga2luZDogVGVtcGxhdGVEcmFmdFByb2JsZW1LaW5kO1xuICAvKiogYGVycm9yYCBibG9ja3MgdGhlIGRyYWZ0OyBgd2FybmluZ2AgaXMgd29ydGggc2F5aW5nIGJ1dCBub3QgZmF0YWwuICovXG4gIHJlYWRvbmx5IHNldmVyaXR5OiAnZXJyb3InIHwgJ3dhcm5pbmcnO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBEb3R0ZWQgcGF0aCBvZiB0aGUgb2ZmZW5kaW5nIGZpZWxkIGluc2lkZSBgcHJvcHNgLCB3aGVuIHRoZXJlIGlzIG9uZS4gKi9cbiAgcmVhZG9ubHkgZmllbGQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxpbmU/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNvbD86IG51bWJlcjtcbiAgLyoqIFRoZSBge3sgcGF0aCB9fWAgdGhhdCBjYXVzZWQgaXQuICovXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG4gIC8qKiBGb3IgYGN5Y2xlYDogdGhlIHNjb3BlIGtleXMgZm9ybWluZyB0aGUgbG9vcC4gKi9cbiAgcmVhZG9ubHkgY3ljbGU/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIEZvciB0aGUgdmFyaWFibGUvaW5wdXQga2luZHM6IHRoZSBgdmFycy48bmFtZT5gIGludm9sdmVkLiAqL1xuICByZWFkb25seSB2YXJpYWJsZT86IHN0cmluZztcbn1cblxuLyoqIE9uZSBkZWNsYXJlZCBpbnB1dCwgcmVhZCBkZWZlbnNpdmVseSDigJQgYSBkcmFmdCdzIGBpbnB1dHNgIGlzIHVudHJ1c3RlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVEcmFmdElucHV0IHtcbiAgcmVhZG9ubHkgbmFtZT86IHVua25vd247XG59XG5cbi8qKiBUaGUgcGFydCBvZiBhIGRyYWZ0ZWQgdGVtcGxhdGUgdGhpcyB2YWxpZGF0b3IgcmVhZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlRHJhZnRMaWtlIHtcbiAgLyoqIFRoZSB0ZW1wbGF0ZSBib2R5OiBhIEJ1aWxkZXJQcm9wcyBjYXJyeWluZyBge3sgdmFycy4qIH19YCBwbGFjZWhvbGRlcnMuICovXG4gIHJlYWRvbmx5IHByb3BzPzogdW5rbm93bjtcbiAgLyoqIFRoZSBkZWNsYXJlZCBgdmFycy4qYCBjb250cmFjdC4gKi9cbiAgcmVhZG9ubHkgaW5wdXRzPzogcmVhZG9ubHkgVGVtcGxhdGVEcmFmdElucHV0W10gfCBudWxsO1xufVxuXG4vKiogVGhlIHZlcmRpY3Qgb24gYSBkcmFmdGVkIHRlbXBsYXRlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZURyYWZ0VmFsaWRhdGlvbiB7XG4gIC8qKiBUcnVlIHdoZW4gbm8gcHJvYmxlbSBoYXMgYHNldmVyaXR5OiAnZXJyb3InYC4gKi9cbiAgcmVhZG9ubHkgdmFsaWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHByb2JsZW1zOiByZWFkb25seSBUZW1wbGF0ZURyYWZ0UHJvYmxlbVtdO1xuICAvKiogRXZlcnkgYHZhcnMuPG5hbWU+YCB0aGUgYm9keSByZWZlcmVuY2VzLCBzb3J0ZWQuICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZWRWYXJpYWJsZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogRXZlcnkgd2VsbC1mb3JtZWQgYGlucHV0c1tdLm5hbWVgLCBpbiBkZWNsYXJhdGlvbiBvcmRlci4gKi9cbiAgcmVhZG9ubHkgZGVjbGFyZWRJbnB1dHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKiogVGhlIHRlbXBsYXRlIGdyYW1tYXIncyBpZGVudGlmaWVyIHJ1bGUgKHRva2VuaXplci50cyk6IGBbYS16QS1aX11bYS16QS1aMC05X117MCw2M31gLiAqL1xuY29uc3QgSURFTlRJRklFUiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOV9dezAsNjN9JC87XG5cbi8qKiBUaGUgcm9vdHMgYSBzZWxmLXJlZmVyZW5jaW5nIHBpcGVsaW5lIGZpZWxkIG1heSBhZGRyZXNzIChzYW1lIHNldCB0aGUgcGlwZWxpbmUgY3JlYXRlIHBhdGggYWxsb3dzKS4gKi9cbmNvbnN0IFNFTEZfU0NPUEVfUk9PVFMgPSBbJ21ldGFkYXRhJywgJ3ZhcnMnXTtcblxuLyoqIFRoZSBtZXRhZGF0YSBsYXllcnMgc3ludGggbWVyZ2VzLCBpbiB0aGUgb3JkZXIgaXQgbWVyZ2VzIHRoZW0uICovXG5jb25zdCBNRVRBREFUQV9QUkVGSVhFUyA9IFsnZ2xvYmFsLicsICdkZWZhdWx0cy5tZXRhZGF0YS4nLCAnc3ludGgubWV0YWRhdGEuJ107XG5cbi8qKiBUaGUgZmlyc3QgcGF0aCBzZWdtZW50IG9mIGByZXN0YCDigJQgYEEuQmAgYW5kIGBBWzBdYCBib3RoIHlpZWxkIGBBYC4gKi9cbmZ1bmN0aW9uIGZpcnN0U2VnbWVudChyZXN0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtYXRjaCA9IC9eW14uW10rLy5leGVjKHJlc3QpO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFswXSA6IHJlc3Q7XG59XG5cbi8qKlxuICogVGhlIHNjb3BlIGtleSBhIHRlbXBsYXRhYmxlIGZpZWxkIFdSSVRFUywgb3IgbnVsbCB3aGVuIHRoZSBmaWVsZCBpcyBub3RcbiAqIHNlbGYtcmVmZXJlbmNpbmcuIGBnbG9iYWwuZW52YCwgYGRlZmF1bHRzLm1ldGFkYXRhLmVudmAgYW5kXG4gKiBgc3ludGgubWV0YWRhdGEuZW52YCBhbGwgd3JpdGUgYG1ldGFkYXRhLmVudmAg4oCUIHRoYXQgaXMgaG93IHN5bnRoIGxheWVyc1xuICogdGhlbSDigJQgc28gYSBjeWNsZSB0aHJvdWdoIGFueSBsYXllciBpcyBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gc2VsZlNjb3BlS2V5KGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGZpZWxkID09PSAncHJvamVjdCcpIHJldHVybiAncHJvamVjdCc7XG4gIGZvciAoY29uc3QgcHJlZml4IG9mIE1FVEFEQVRBX1BSRUZJWEVTKSB7XG4gICAgaWYgKGZpZWxkLnN0YXJ0c1dpdGgocHJlZml4KSkgcmV0dXJuIGBtZXRhZGF0YS4ke2ZpcnN0U2VnbWVudChmaWVsZC5zbGljZShwcmVmaXgubGVuZ3RoKSl9YDtcbiAgfVxuICBpZiAoZmllbGQuc3RhcnRzV2l0aCgndmFycy4nKSkgcmV0dXJuIGB2YXJzLiR7Zmlyc3RTZWdtZW50KGZpZWxkLnNsaWNlKCd2YXJzLicubGVuZ3RoKSl9YDtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGRyYWZ0ZWQgcGlwZWxpbmUgdGVtcGxhdGUuIE5ldmVyIHRocm93czogYSBtYWxmb3JtZWQgZHJhZnQgY29tZXNcbiAqIGJhY2sgYXMgcHJvYmxlbXMsIGJlY2F1c2UgdGhlIGNhbGxlcidzIGpvYiBpcyB0byByZXBvcnQgdGhlbSwgbm90IHRvIGNyYXNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUZW1wbGF0ZURyYWZ0KGRyYWZ0OiBUZW1wbGF0ZURyYWZ0TGlrZSk6IFRlbXBsYXRlRHJhZnRWYWxpZGF0aW9uIHtcbiAgY29uc3QgcHJvYmxlbXM6IFRlbXBsYXRlRHJhZnRQcm9ibGVtW10gPSBbXTtcbiAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGlmICghaXNSZWNvcmQoZHJhZnQucHJvcHMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgIHByb2JsZW1zOiBbeyBraW5kOiAnaW52YWxpZC1wcm9wcycsIHNldmVyaXR5OiAnZXJyb3InLCBtZXNzYWdlOiAnVGVtcGxhdGUgYm9keSAocHJvcHMpIG11c3QgYmUgYW4gb2JqZWN0JyB9XSxcbiAgICAgIHJlZmVyZW5jZWRWYXJpYWJsZXM6IFtdLFxuICAgICAgZGVjbGFyZWRJbnB1dHM6IFtdLFxuICAgIH07XG4gIH1cbiAgY29uc3QgcHJvcHMgPSBkcmFmdC5wcm9wcztcblxuICAvLyAtLSBQYXNzIDE6IGV2ZXJ5IHN0cmluZyBpbiB0aGUgYm9keSwgc28gYSBtYWxmb3JtZWQgYHt7YCBpcyBjYXVnaHQgd2hlcmV2ZXJcbiAgLy8gICAgaXQgaXMg4oCUIG5vdCBvbmx5IGluIHRoZSBmaWVsZHMgdGhlIHBpcGVsaW5lIGNyZWF0ZSBwYXRoIGhhcHBlbnMgdG8gY2hlY2suXG4gIGxldCBwYXJzZUZhaWxlZCA9IGZhbHNlO1xuICB2aXNpdFN0cmluZ3MocHJvcHMsICgpID0+IHRydWUsIChmaWVsZCwgc291cmNlKSA9PiB7XG4gICAgbGV0IHRva2VucztcbiAgICB0cnkge1xuICAgICAgdG9rZW5zID0gdG9rZW5pemUoc291cmNlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHBhcnNlRmFpbGVkID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHBvcyA9IGVyciBpbnN0YW5jZW9mIFRva2VuaXplckVycm9yID8gZXJyLnBvcyA6IHVuZGVmaW5lZDtcbiAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICBraW5kOiAncGFyc2UnLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgbWVzc2FnZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICBmaWVsZCxcbiAgICAgICAgLi4uKHBvcyAmJiB7IGxpbmU6IHBvcy5saW5lLCBjb2w6IHBvcy5jb2wgfSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZlJlZmVyZW5jaW5nID0gc2VsZlNjb3BlS2V5KGZpZWxkKSAhPT0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgaWYgKHRva2VuLmtpbmQgIT09ICdleHByJykgY29udGludWU7XG4gICAgICBjb25zdCByb290ID0gdG9rZW4ucGF0aFswXSE7XG4gICAgICBjb25zdCBwYXRoID0gdG9rZW4ucGF0aC5qb2luKCcuJyk7XG4gICAgICBpZiAocm9vdCA9PT0gJ3NlY3JldHMnKSB7XG4gICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgIGtpbmQ6ICdyZXNlcnZlZC1zY29wZScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgbWVzc2FnZTogJ1xcJ3NlY3JldHNcXCcgaXMgYSByZXNlcnZlZCBzY29wZSDigJQgYSB0ZW1wbGF0ZSBib2R5IG11c3Qgbm90IHJlZmVyZW5jZSBpdCcsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBsaW5lOiB0b2tlbi5wb3MubGluZSxcbiAgICAgICAgICBjb2w6IHRva2VuLnBvcy5jb2wsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyb290ID09PSAndmFycycgJiYgdG9rZW4ucGF0aC5sZW5ndGggPiAxKSByZWZlcmVuY2VkLmFkZCh0b2tlbi5wYXRoWzFdISk7XG4gICAgICBpZiAoc2VsZlJlZmVyZW5jaW5nICYmICFTRUxGX1NDT1BFX1JPT1RTLmluY2x1ZGVzKHJvb3QpKSB7XG4gICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgIGtpbmQ6ICd1bmtub3duLXNjb3BlJyxcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBgVGVtcGxhdGUgcmVmZXJlbmNlcyB1bmtub3duIHNjb3BlIHJvb3QgJyR7cm9vdH0nIChhIHBpcGVsaW5lIGZpZWxkIG1heSByZWZlcmVuY2UgJHtTRUxGX1NDT1BFX1JPT1RTLmpvaW4oJyBvciAnKX0gb25seSlgLFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbGluZTogdG9rZW4ucG9zLmxpbmUsXG4gICAgICAgICAgY29sOiB0b2tlbi5wb3MuY29sLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vIC0tIFBhc3MgMjogY3ljbGVzIGFtb25nIHRoZSBzZWxmLXJlZmVyZW5jaW5nIGZpZWxkcy4gU2tpcHBlZCB3aGVuIGFueXRoaW5nXG4gIC8vICAgIGZhaWxlZCB0byBwYXJzZSDigJQgdGhlIGN5Y2xlIHdhbGtlciB0b2tlbml6ZXMgZWFnZXJseSBhbmQgd291bGQgdGhyb3cgb25cbiAgLy8gICAgdGhlIHNhbWUgYmFkIGZpZWxkIHRoYXQgcGFzcyAxIGFscmVhZHkgcmVwb3J0ZWQuXG4gIGlmICghcGFyc2VGYWlsZWQpIHtcbiAgICBmb3IgKGNvbnN0IGVyciBvZiBkZXRlY3RDeWNsZXMocHJvcHMsIChmaWVsZCkgPT4gc2VsZlNjb3BlS2V5KGZpZWxkKSAhPT0gbnVsbCwgc2VsZlNjb3BlS2V5KSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgIGtpbmQ6ICdjeWNsZScsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgZmllbGQ6IGVyci5maWVsZCxcbiAgICAgICAgLi4uKGVyci5jeWNsZSAmJiB7IGN5Y2xlOiBlcnIuY3ljbGUgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyAtLSBQYXNzIDM6IHRoZSBkZWNsYXJlZCBpbnB1dHMuIEFuIGlucHV0IHRoZSBncmFtbWFyIGNhbm5vdCBleHByZXNzLCBvciBvbmVcbiAgLy8gICAgZGVjbGFyZWQgdHdpY2UsIGNhbiBuZXZlciBiZSBmaWxsZWQgaW4g4oCUIGJvdGggYXJlIGVycm9ycywgbm90IHdhcm5pbmdzLlxuICBjb25zdCBkZWNsYXJlZDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGlucHV0IG9mIGRyYWZ0LmlucHV0cyA/PyBbXSkge1xuICAgIGNvbnN0IG5hbWUgPSBpbnB1dD8ubmFtZTtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8ICFJREVOVElGSUVSLnRlc3QobmFtZSkpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICBraW5kOiAnaW52YWxpZC1pbnB1dC1uYW1lJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6IGBEZWNsYXJlZCBpbnB1dCAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSBpcyBub3QgYSB1c2FibGUgdmFyaWFibGUgbmFtZSAoJHtJREVOVElGSUVSLnNvdXJjZX0pYCxcbiAgICAgICAgLi4uKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiB7IHZhcmlhYmxlOiBuYW1lIH0pLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNlZW4uaGFzKG5hbWUpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHsga2luZDogJ2R1cGxpY2F0ZS1pbnB1dCcsIHNldmVyaXR5OiAnZXJyb3InLCBtZXNzYWdlOiBgRGVjbGFyZWQgaW5wdXQgJyR7bmFtZX0nIGFwcGVhcnMgbW9yZSB0aGFuIG9uY2VgLCB2YXJpYWJsZTogbmFtZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBzZWVuLmFkZChuYW1lKTtcbiAgICBkZWNsYXJlZC5wdXNoKG5hbWUpO1xuICB9XG5cbiAgLy8gLS0gUGFzcyA0OiB0aGUgY29udHJhY3QgYmV0d2VlbiBib2R5IGFuZCBpbnB1dHMuIEEgdmFyIHRoZSBib2R5IHJlZmVyZW5jZXNcbiAgLy8gICAgaXMgc3VwcGxpZWQgZWl0aGVyIGJ5IGEgZGVjbGFyZWQgaW5wdXQgb3IgYnkgYSBkZWZhdWx0IGFscmVhZHkgc2l0dGluZyBpblxuICAvLyAgICBgcHJvcHMudmFyc2A7IGFueXRoaW5nIGVsc2UgaGFzIG5vIHdheSBvZiBldmVyIGdldHRpbmcgYSB2YWx1ZS5cbiAgY29uc3QgZGVmYXVsdGVkID0gaXNSZWNvcmQocHJvcHMudmFycykgPyBPYmplY3Qua2V5cyhwcm9wcy52YXJzKSA6IFtdO1xuICBjb25zdCBzdXBwbGllZCA9IG5ldyBTZXQoWy4uLmRlY2xhcmVkLCAuLi5kZWZhdWx0ZWRdKTtcbiAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiBbLi4ucmVmZXJlbmNlZF0uc29ydCgpKSB7XG4gICAgaWYgKHN1cHBsaWVkLmhhcyh2YXJpYWJsZSkpIGNvbnRpbnVlO1xuICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAga2luZDogJ3VuZGVjbGFyZWQtdmFyaWFibGUnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiBgVGVtcGxhdGUgcmVmZXJlbmNlcyB7eyB2YXJzLiR7dmFyaWFibGV9IH19IGJ1dCBkZWNsYXJlcyBubyBpbnB1dCBuYW1lZCAnJHt2YXJpYWJsZX0nYCxcbiAgICAgIHZhcmlhYmxlLFxuICAgIH0pO1xuICB9XG4gIGZvciAoY29uc3QgbmFtZSBvZiBkZWNsYXJlZCkge1xuICAgIGlmIChyZWZlcmVuY2VkLmhhcyhuYW1lKSkgY29udGludWU7XG4gICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICBraW5kOiAndW51c2VkLWlucHV0JyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiBgRGVjbGFyZWQgaW5wdXQgJyR7bmFtZX0nIGlzIG5ldmVyIHJlZmVyZW5jZWQgYXMge3sgdmFycy4ke25hbWV9IH19YCxcbiAgICAgIHZhcmlhYmxlOiBuYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2YWxpZDogIXByb2JsZW1zLnNvbWUoKHApID0+IHAuc2V2ZXJpdHkgPT09ICdlcnJvcicpLFxuICAgIHByb2JsZW1zLFxuICAgIHJlZmVyZW5jZWRWYXJpYWJsZXM6IFsuLi5yZWZlcmVuY2VkXS5zb3J0KCksXG4gICAgZGVjbGFyZWRJbnB1dHM6IGRlY2xhcmVkLFxuICB9O1xufVxuXG4vKiogT25lIHJlYWRhYmxlIGxpbmUgcGVyIHByb2JsZW0sIGZvciBhIHRvb2wgcmVzdWx0IG9yIGFuIGVycm9yIGJvZHkuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGVtcGxhdGVEcmFmdFByb2JsZW1zKHByb2JsZW1zOiByZWFkb25seSBUZW1wbGF0ZURyYWZ0UHJvYmxlbVtdKTogc3RyaW5nW10ge1xuICByZXR1cm4gcHJvYmxlbXMubWFwKChwKSA9PiB7XG4gICAgY29uc3Qgd2hlcmUgPSBwLmZpZWxkID8gYCR7cC5maWVsZH0ke3AubGluZSAhPT0gdW5kZWZpbmVkID8gYDoke3AubGluZX06JHtwLmNvbH1gIDogJyd9YCA6IHAua2luZDtcbiAgICByZXR1cm4gYFske3doZXJlfV0gJHtwLm1lc3NhZ2V9YDtcbiAgfSk7XG59XG4iXX0=
@@ -1,8 +1,8 @@
1
1
  export { tokenize, hasTemplate, MAX_FIELD_SIZE_BYTES, MAX_PATH_DEPTH, type Token, type LiteralToken, type ExprToken, type SourcePosition, } from './tokenizer.js';
2
- export { resolve, dependencies, type Scope, type EvalError, } from './evaluator.js';
3
- export { type WalkEntry, type FieldPredicate, } from './walker.js';
4
- export { type TopoNode, type TopoResult, } from './topo-sort.js';
2
+ export { resolve, dependencies, type Scope, } from './evaluator.js';
3
+ export { type FieldPredicate, } from './walker.js';
5
4
  export { validateTemplates, detectCycles, allowedScopeRoots, type TemplateError, type TemplateValidationResult, } from './validate.js';
5
+ export { validateTemplateDraft, formatTemplateDraftProblems, type TemplateDraftInput, type TemplateDraftLike, type TemplateDraftProblem, type TemplateDraftProblemKind, type TemplateDraftValidation, } from './draft.js';
6
6
  import { ErrorCode } from '@pipeline-builder/api-core';
7
7
  import { type Scope } from './evaluator.js';
8
8
  import { type FieldPredicate } from './walker.js';
@@ -3,8 +3,8 @@
3
3
  export { tokenize, hasTemplate, MAX_FIELD_SIZE_BYTES, MAX_PATH_DEPTH, } from './tokenizer.js';
4
4
  export { resolve, dependencies, } from './evaluator.js';
5
5
  export {} from './walker.js';
6
- export {} from './topo-sort.js';
7
6
  export { validateTemplates, detectCycles, allowedScopeRoots, } from './validate.js';
7
+ export { validateTemplateDraft, formatTemplateDraftProblems, } from './draft.js';
8
8
  // -- Convenience: high-level resolve() that walks + resolves + measures
9
9
  import { ErrorCode } from '@pipeline-builder/api-core';
10
10
  import { resolve as evaluatorResolve } from './evaluator.js';
@@ -102,4 +102,4 @@ export function resolveSelfReferencing(doc, scope, isTemplatable, fieldToScopePa
102
102
  }
103
103
  return { errors };
104
104
  }
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsY0FBYyxHQUtmLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUNMLE9BQU8sRUFDUCxZQUFZLEdBR2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBR04sTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUdOLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osaUJBQWlCLEdBR2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLHdFQUF3RTtBQUV4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sSUFBSSxnQkFBZ0IsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLGFBQWEsQ0FBQztBQU0vRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixHQUFNLEVBQ04sS0FBWSxFQUNaLGFBQTZCO0lBRTdCLE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUM7SUFDM0MsNEVBQTRFO0lBQzVFLDZFQUE2RTtJQUM3RSxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxF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Q0FBQyxDQUFDLENBQUM7UUFDYixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDMUIsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQztnQkFDSCxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLEdBQUcsR0FBa0QsQ0FBQztnQkFDN0QsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsb0JBQW9CO29CQUM5QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87b0JBQ2xCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUs7b0JBQ3BCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtpQkFDYixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQge1xuICB0b2tlbml6ZSxcbiAgaGFzVGVtcGxhdGUsXG4gIE1BWF9GSUVMRF9TSVpFX0JZVEVTLFxuICBNQVhfUEFUSF9ERVBUSCxcbiAgdHlwZSBUb2tlbixcbiAgdHlwZSBMaXRlcmFsVG9rZW4sXG4gIHR5cGUgRXhwclRva2VuLFxuICB0eXBlIFNvdXJjZVBvc2l0aW9uLFxufSBmcm9tICcuL3Rva2VuaXplci5qcyc7XG5cbmV4cG9ydCB7XG4gIHJlc29sdmUsXG4gIGRlcGVuZGVuY2llcyxcbiAgdHlwZSBTY29wZSxcbiAgdHlwZSBFdmFsRXJyb3IsXG59IGZyb20gJy4vZXZhbHVhdG9yLmpzJztcblxuZXhwb3J0IHtcbiAgdHlwZSBXYWxrRW50cnksXG4gIHR5cGUgRmllbGRQcmVkaWNhdGUsXG59IGZyb20gJy4vd2Fsa2VyLmpzJztcblxuZXhwb3J0IHtcbiAgdHlwZSBUb3BvTm9kZSxcbiAgdHlwZSBUb3BvUmVzdWx0LFxufSBmcm9tICcuL3RvcG8tc29ydC5qcyc7XG5cbmV4cG9ydCB7XG4gIHZhbGlkYXRlVGVtcGxhdGVzLFxuICBkZXRlY3RDeWNsZXMsXG4gIGFsbG93ZWRTY29wZVJvb3RzLFxuICB0eXBlIFRlbXBsYXRlRXJyb3IsXG4gIHR5cGUgVGVtcGxhdGVWYWxpZGF0aW9uUmVzdWx0LFxufSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuLy8gLS0gQ29udmVuaWVuY2U6IGhpZ2gtbGV2ZWwgcmVzb2x2ZSgpIHRoYXQgd2Fsa3MgKyByZXNvbHZlcyArIG1lYXN1cmVzXG5cbmltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IHJlc29sdmUgYXMgZXZhbHVhdG9yUmVzb2x2ZSwgdHlwZSBTY29wZSB9IGZyb20gJy4vZXZhbHVhdG9yLmpzJztcbmltcG9ydCB7IHRvcG9Tb3J0IH0gZnJvbSAnLi90b3BvLXNvcnQuanMnO1xuaW1wb3J0IHsgd2Fsa0FuZEJpbmQsIHR5cGUgRmllbGRQcmVkaWNhdGUgfSBmcm9tICcuL3dhbGtlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZVJlc3VsdCB7XG4gIGVycm9yczogQXJyYXk8eyBjb2RlOiBFcnJvckNvZGU7IG1lc3NhZ2U6IHN0cmluZzsgZmllbGQ/OiBzdHJpbmc7IHBhdGg/OiBzdHJpbmcgfT47XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhbGwgdGVtcGxhdGVzIGluc2lkZSBgZG9jYCBieSBtdXRhdGluZyBzdHJpbmcgZmllbGRzIGluIHBsYWNlLlxuICogYGRvY2AgaXMgdHJlYXRlZCBhcyBvcGFxdWUg4oCUIG9ubHkgc3RyaW5nIGZpZWxkcyB0aGF0IG1hdGNoIGBpc1RlbXBsYXRhYmxlYFxuICogYXJlIHJld3JpdHRlbi4gUmV0dXJucyBjb2xsZWN0ZWQgZXJyb3JzIChlbXB0eSBhcnJheSBvbiBzdWNjZXNzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZW1wbGF0ZXM8VCBleHRlbmRzIG9iamVjdD4oXG4gIGRvYzogVCxcbiAgc2NvcGU6IFNjb3BlLFxuICBpc1RlbXBsYXRhYmxlOiBGaWVsZFByZWRpY2F0ZSxcbik6IFJlc29sdmVSZXN1bHQge1xuICBjb25zdCBlcnJvcnM6IFJlc29sdmVSZXN1bHRbJ2Vycm9ycyddID0gW107XG4gIC8vIGluY2x1ZGVMaXRlcmFsT25seTogbGl0ZXJhbC1vbmx5IGZpZWxkcyAoYSBiYXJlIGB7e3t7YCBlc2NhcGUpIHN0aWxsIG5lZWRcbiAgLy8gcmV3cml0aW5nIHNvIHRoZSB0b2tlbml6ZXIncyBge3t7e2Ag4oaSIGB7e2AgdW5lc2NhcGUgbGFuZHMgaW4gdGhlIGRvY3VtZW50LlxuICBjb25zdCBlbnRyaWVzID0gd2Fsa0FuZEJpbmQoZG9jLCBpc1RlbXBsYXRhYmxlLCB0cnVlKTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZXZhbHVhdG9yUmVzb2x2ZShlbnRyeS50b2tlbnMsIHNjb3BlLCBlbnRyeS5maWVsZCk7XG4gICAgICBlbnRyeS5zZXQodmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZSA9IGVyciBhcyBFcnJvciAmIHsgY29kZT86IEVycm9yQ29kZTsgcGF0aD86IHN0cmluZyB9O1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICBjb2RlOiBlLmNvZGUgPz8gRXJyb3JDb2RlLlRFTVBMQVRFX1BBUlNFX0VSUk9SLFxuICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgIGZpZWxkOiBlbnRyeS5maWVsZCxcbiAgICAgICAgcGF0aDogZS5wYXRoLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGVycm9ycyB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBzZWxmLXJlZmVyZW5jaW5nIGRvY3VtZW50IChlLmcuIHBpcGVsaW5lLmpzb24gd2hlcmVcbiAqIG1ldGFkYXRhIGZpZWxkcyByZWZlcmVuY2UgZWFjaCBvdGhlcikuIFRvcG9sb2dpY2FsbHkgb3JkZXJzIHRoZVxuICogcmVzb2x1dGlvbiBzbyBkZXBlbmRlbmNpZXMgY29tZSBmaXJzdC4gTXV0YXRlcyBgZG9jYCBpbiBwbGFjZS5cbiAqXG4gKiBgZmllbGRUb1Njb3BlUGF0aGAgbWFwcyBlYWNoIGZpZWxkIChlLmcuIGBtZXRhZGF0YS5lbnZgKSB0byB0aGUgc2NvcGVcbiAqIHBhdGggaXQgcG9wdWxhdGVzICh0eXBpY2FsbHkgdGhlIHNhbWUsIHNhbnMgYW55IGFycmF5IGluZGljZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNlbGZSZWZlcmVuY2luZzxUIGV4dGVuZHMgb2JqZWN0PihcbiAgZG9jOiBULFxuICBzY29wZTogU2NvcGUsXG4gIGlzVGVtcGxhdGFibGU6IEZpZWxkUHJlZGljYXRlLFxuICBmaWVsZFRvU2NvcGVQYXRoOiAoZmllbGQ6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbCxcbik6IFJlc29sdmVSZXN1bHQge1xuICAvLyBpbmNsdWRlTGl0ZXJhbE9ubHk6IGEgc2VsZi1yZWZlcmVuY2luZyBmaWVsZCB0aGF0IGlzIG9ubHkgYSBge3t7e2AgZXNjYXBlXG4gIC8vIHN0aWxsIG5lZWRzIGl0cyB1bmVzY2FwZSB3cml0dGVuIGJhY2sgKHNhbWUgcmF0aW9uYWxlIGFzIHJlc29sdmVUZW1wbGF0ZXMpLlxuICBjb25zdCBlbnRyaWVzID0gd2Fsa0FuZEJpbmQoZG9jLCBpc1RlbXBsYXRhYmxlLCB0cnVlKTtcbiAgLy8gQnVpbGQgdG9wbyBub2RlcyBrZXllZCBieSB0YXJnZXQgc2NvcGUgcGF0aFxuICBjb25zdCBub2RlcyA9IGVudHJpZXNcbiAgICAubWFwKGUgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZmllbGRUb1Njb3BlUGF0aChlLmZpZWxkKTtcbiAgICAgIGlmICgha2V5KSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGRlcHM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHQgb2YgZS50b2tlbnMpIGlmICh0LmtpbmQgPT09ICdleHByJykgZGVwcy5wdXNoKHQucGF0aC5qb2luKCcuJykpO1xuICAgICAgcmV0dXJuIHsga2V5LCBkZXBzLCBlbnRyeTogZSB9O1xuICAgIH0pXG4gICAgLmZpbHRlcigobik6IG4gaXMgTm9uTnVsbGFibGU8dHlwZW9mIG4+ID0+IG4gIT09IG51bGwpO1xuXG4gIGNvbnN0IHsgb3JkZXJlZCwgY3ljbGVzIH0gPSB0b3BvU29ydChub2Rlcy5tYXAobiA9PiAoeyBrZXk6IG4ua2V5LCBkZXBzOiBuLmRlcHMgfSkpKTtcbiAgY29uc3QgZXJyb3JzOiBSZXNvbHZlUmVzdWx0WydlcnJvcnMnXSA9IFtdO1xuICBpZiAoY3ljbGVzLmxlbmd0aCkge1xuICAgIGZvciAoY29uc3QgYyBvZiBjeWNsZXMpIHtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgY29kZTogRXJyb3JDb2RlLlRFTVBMQVRFX0NZQ0xFLFxuICAgICAgICBtZXNzYWdlOiBgVGVtcGxhdGUgY3ljbGUgZGV0ZWN0ZWQ6ICR7Yy5qb2luKCcgLT4gJyl9YCxcbiAgICAgICAgcGF0aDogYy5qb2luKCcgLT4gJyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZXJyb3JzIH07XG4gIH1cblxuICAvLyBSZXNvbHZlIGluIHRvcG8gb3JkZXI7IG11bHRpcGxlIGVudHJpZXMgbWF5IHNoYXJlIGEgc2NvcGUga2V5IChlLmcuIG9uZVxuICAvLyBwaXBlbGluZSBmaWVsZCBjb3VsZCBtYXAgdG8gdGhlIHNhbWUgc2NvcGUgcGF0aCDigJQgdW5saWtlbHkgaGVyZSksIHNvXG4gIC8vIGl0ZXJhdGUgYWxsIGVudHJpZXMgd2hvc2Uga2V5ID09IG9yZGVyZWRbaV0uXG4gIGNvbnN0IGJ5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIHR5cGVvZiBub2Rlcz4oKTtcbiAgZm9yIChjb25zdCBuIG9mIG5vZGVzKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5S2V5LmdldChuLmtleSkgPz8gW107XG4gICAgbGlzdC5wdXNoKG4pO1xuICAgIGJ5S2V5LnNldChuLmtleSwgbGlzdCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBvZiBvcmRlcmVkKSB7XG4gICAgZm9yIChjb25zdCBuIG9mIGJ5S2V5LmdldChrZXkpID8/IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGV2YWx1YXRvclJlc29sdmUobi5lbnRyeS50b2tlbnMsIHNjb3BlLCBuLmVudHJ5LmZpZWxkKTtcbiAgICAgICAgbi5lbnRyeS5zZXQodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IGUgPSBlcnIgYXMgRXJyb3IgJiB7IGNvZGU/OiBFcnJvckNvZGU7IHBhdGg/OiBzdHJpbmcgfTtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgIGNvZGU6IGUuY29kZSA/PyBFcnJvckNvZGUuVEVNUExBVEVfUEFSU0VfRVJST1IsXG4gICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgIGZpZWxkOiBuLmVudHJ5LmZpZWxkLFxuICAgICAgICAgIHBhdGg6IGUucGF0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGVycm9ycyB9O1xufVxuXG4iXX0=
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsY0FBYyxHQUtmLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUNMLE9BQU8sRUFDUCxZQUFZLEdBRWIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBRU4sTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osaUJBQWlCLEdBR2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsMkJBQTJCLEdBTTVCLE1BQU0sWUFBWSxDQUFDO0FBRXBCLHdFQUF3RTtBQUV4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sSUFBSSxnQkFBZ0IsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLGFBQWEsQ0FBQztBQU0vRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixHQUFNLEVBQ04sS0FBWSxFQUNaLGFBQTZCO0lBRTdCLE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUM7SUFDM0MsNEVBQTRFO0lBQzVFLDZFQUE2RTtJQUM3RSxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLEtB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Q3BDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDYixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDMUIsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQztnQkFDSCxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLEdBQUcsR0FBa0QsQ0FBQztnQkFDN0QsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsb0JBQW9CO29CQUM5QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87b0JBQ2xCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUs7b0JBQ3BCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtpQkFDYixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQge1xuICB0b2tlbml6ZSxcbiAgaGFzVGVtcGxhdGUsXG4gIE1BWF9GSUVMRF9TSVpFX0JZVEVTLFxuICBNQVhfUEFUSF9ERVBUSCxcbiAgdHlwZSBUb2tlbixcbiAgdHlwZSBMaXRlcmFsVG9rZW4sXG4gIHR5cGUgRXhwclRva2VuLFxuICB0eXBlIFNvdXJjZVBvc2l0aW9uLFxufSBmcm9tICcuL3Rva2VuaXplci5qcyc7XG5cbmV4cG9ydCB7XG4gIHJlc29sdmUsXG4gIGRlcGVuZGVuY2llcyxcbiAgdHlwZSBTY29wZSxcbn0gZnJvbSAnLi9ldmFsdWF0b3IuanMnO1xuXG5leHBvcnQge1xuICB0eXBlIEZpZWxkUHJlZGljYXRlLFxufSBmcm9tICcuL3dhbGtlci5qcyc7XG5cbmV4cG9ydCB7XG4gIHZhbGlkYXRlVGVtcGxhdGVzLFxuICBkZXRlY3RDeWNsZXMsXG4gIGFsbG93ZWRTY29wZVJvb3RzLFxuICB0eXBlIFRlbXBsYXRlRXJyb3IsXG4gIHR5cGUgVGVtcGxhdGVWYWxpZGF0aW9uUmVzdWx0LFxufSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZXhwb3J0IHtcbiAgdmFsaWRhdGVUZW1wbGF0ZURyYWZ0LFxuICBmb3JtYXRUZW1wbGF0ZURyYWZ0UHJvYmxlbXMsXG4gIHR5cGUgVGVtcGxhdGVEcmFmdElucHV0LFxuICB0eXBlIFRlbXBsYXRlRHJhZnRMaWtlLFxuICB0eXBlIFRlbXBsYXRlRHJhZnRQcm9ibGVtLFxuICB0eXBlIFRlbXBsYXRlRHJhZnRQcm9ibGVtS2luZCxcbiAgdHlwZSBUZW1wbGF0ZURyYWZ0VmFsaWRhdGlvbixcbn0gZnJvbSAnLi9kcmFmdC5qcyc7XG5cbi8vIC0tIENvbnZlbmllbmNlOiBoaWdoLWxldmVsIHJlc29sdmUoKSB0aGF0IHdhbGtzICsgcmVzb2x2ZXMgKyBtZWFzdXJlc1xuXG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyByZXNvbHZlIGFzIGV2YWx1YXRvclJlc29sdmUsIHR5cGUgU2NvcGUgfSBmcm9tICcuL2V2YWx1YXRvci5qcyc7XG5pbXBvcnQgeyB0b3BvU29ydCB9IGZyb20gJy4vdG9wby1zb3J0LmpzJztcbmltcG9ydCB7IHdhbGtBbmRCaW5kLCB0eXBlIEZpZWxkUHJlZGljYXRlIH0gZnJvbSAnLi93YWxrZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVSZXN1bHQge1xuICBlcnJvcnM6IEFycmF5PHsgY29kZTogRXJyb3JDb2RlOyBtZXNzYWdlOiBzdHJpbmc7IGZpZWxkPzogc3RyaW5nOyBwYXRoPzogc3RyaW5nIH0+O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYWxsIHRlbXBsYXRlcyBpbnNpZGUgYGRvY2AgYnkgbXV0YXRpbmcgc3RyaW5nIGZpZWxkcyBpbiBwbGFjZS5cbiAqIGBkb2NgIGlzIHRyZWF0ZWQgYXMgb3BhcXVlIOKAlCBvbmx5IHN0cmluZyBmaWVsZHMgdGhhdCBtYXRjaCBgaXNUZW1wbGF0YWJsZWBcbiAqIGFyZSByZXdyaXR0ZW4uIFJldHVybnMgY29sbGVjdGVkIGVycm9ycyAoZW1wdHkgYXJyYXkgb24gc3VjY2VzcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVGVtcGxhdGVzPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBkb2M6IFQsXG4gIHNjb3BlOiBTY29wZSxcbiAgaXNUZW1wbGF0YWJsZTogRmllbGRQcmVkaWNhdGUsXG4pOiBSZXNvbHZlUmVzdWx0IHtcbiAgY29uc3QgZXJyb3JzOiBSZXNvbHZlUmVzdWx0WydlcnJvcnMnXSA9IFtdO1xuICAvLyBpbmNsdWRlTGl0ZXJhbE9ubHk6IGxpdGVyYWwtb25seSBmaWVsZHMgKGEgYmFyZSBge3t7e2AgZXNjYXBlKSBzdGlsbCBuZWVkXG4gIC8vIHJld3JpdGluZyBzbyB0aGUgdG9rZW5pemVyJ3MgYHt7e3tgIOKGkiBge3tgIHVuZXNjYXBlIGxhbmRzIGluIHRoZSBkb2N1bWVudC5cbiAgY29uc3QgZW50cmllcyA9IHdhbGtBbmRCaW5kKGRvYywgaXNUZW1wbGF0YWJsZSwgdHJ1ZSk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGV2YWx1YXRvclJlc29sdmUoZW50cnkudG9rZW5zLCBzY29wZSwgZW50cnkuZmllbGQpO1xuICAgICAgZW50cnkuc2V0KHZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGUgPSBlcnIgYXMgRXJyb3IgJiB7IGNvZGU/OiBFcnJvckNvZGU7IHBhdGg/OiBzdHJpbmcgfTtcbiAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgY29kZTogZS5jb2RlID8/IEVycm9yQ29kZS5URU1QTEFURV9QQVJTRV9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICBmaWVsZDogZW50cnkuZmllbGQsXG4gICAgICAgIHBhdGg6IGUucGF0aCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBlcnJvcnMgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgc2VsZi1yZWZlcmVuY2luZyBkb2N1bWVudCAoZS5nLiBwaXBlbGluZS5qc29uIHdoZXJlXG4gKiBtZXRhZGF0YSBmaWVsZHMgcmVmZXJlbmNlIGVhY2ggb3RoZXIpLiBUb3BvbG9naWNhbGx5IG9yZGVycyB0aGVcbiAqIHJlc29sdXRpb24gc28gZGVwZW5kZW5jaWVzIGNvbWUgZmlyc3QuIE11dGF0ZXMgYGRvY2AgaW4gcGxhY2UuXG4gKlxuICogYGZpZWxkVG9TY29wZVBhdGhgIG1hcHMgZWFjaCBmaWVsZCAoZS5nLiBgbWV0YWRhdGEuZW52YCkgdG8gdGhlIHNjb3BlXG4gKiBwYXRoIGl0IHBvcHVsYXRlcyAodHlwaWNhbGx5IHRoZSBzYW1lLCBzYW5zIGFueSBhcnJheSBpbmRpY2VzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTZWxmUmVmZXJlbmNpbmc8VCBleHRlbmRzIG9iamVjdD4oXG4gIGRvYzogVCxcbiAgc2NvcGU6IFNjb3BlLFxuICBpc1RlbXBsYXRhYmxlOiBGaWVsZFByZWRpY2F0ZSxcbiAgZmllbGRUb1Njb3BlUGF0aDogKGZpZWxkOiBzdHJpbmcpID0+IHN0cmluZyB8IG51bGwsXG4pOiBSZXNvbHZlUmVzdWx0IHtcbiAgLy8gaW5jbHVkZUxpdGVyYWxPbmx5OiBhIHNlbGYtcmVmZXJlbmNpbmcgZmllbGQgdGhhdCBpcyBvbmx5IGEgYHt7e3tgIGVzY2FwZVxuICAvLyBzdGlsbCBuZWVkcyBpdHMgdW5lc2NhcGUgd3JpdHRlbiBiYWNrIChzYW1lIHJhdGlvbmFsZSBhcyByZXNvbHZlVGVtcGxhdGVzKS5cbiAgY29uc3QgZW50cmllcyA9IHdhbGtBbmRCaW5kKGRvYywgaXNUZW1wbGF0YWJsZSwgdHJ1ZSk7XG4gIC8vIEJ1aWxkIHRvcG8gbm9kZXMga2V5ZWQgYnkgdGFyZ2V0IHNjb3BlIHBhdGhcbiAgY29uc3Qgbm9kZXMgPSBlbnRyaWVzXG4gICAgLm1hcChlID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGZpZWxkVG9TY29wZVBhdGgoZS5maWVsZCk7XG4gICAgICBpZiAoIWtleSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBkZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0IG9mIGUudG9rZW5zKSBpZiAodC5raW5kID09PSAnZXhwcicpIGRlcHMucHVzaCh0LnBhdGguam9pbignLicpKTtcbiAgICAgIHJldHVybiB7IGtleSwgZGVwcywgZW50cnk6IGUgfTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKG4pOiBuIGlzIE5vbk51bGxhYmxlPHR5cGVvZiBuPiA9PiBuICE9PSBudWxsKTtcblxuICBjb25zdCB7IG9yZGVyZWQsIGN5Y2xlcyB9ID0gdG9wb1NvcnQobm9kZXMubWFwKG4gPT4gKHsga2V5OiBuLmtleSwgZGVwczogbi5kZXBzIH0pKSk7XG4gIGNvbnN0IGVycm9yczogUmVzb2x2ZVJlc3VsdFsnZXJyb3JzJ10gPSBbXTtcbiAgaWYgKGN5Y2xlcy5sZW5ndGgpIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgY3ljbGVzKSB7XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIGNvZGU6IEVycm9yQ29kZS5URU1QTEFURV9DWUNMRSxcbiAgICAgICAgbWVzc2FnZTogYFRlbXBsYXRlIGN5Y2xlIGRldGVjdGVkOiAke2Muam9pbignIC0+ICcpfWAsXG4gICAgICAgIHBhdGg6IGMuam9pbignIC0+ICcpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IGVycm9ycyB9O1xuICB9XG5cbiAgLy8gUmVzb2x2ZSBpbiB0b3BvIG9yZGVyOyBtdWx0aXBsZSBlbnRyaWVzIG1heSBzaGFyZSBhIHNjb3BlIGtleSAoZS5nLiBvbmVcbiAgLy8gcGlwZWxpbmUgZmllbGQgY291bGQgbWFwIHRvIHRoZSBzYW1lIHNjb3BlIHBhdGgg4oCUIHVubGlrZWx5IGhlcmUpLCBzb1xuICAvLyBpdGVyYXRlIGFsbCBlbnRyaWVzIHdob3NlIGtleSA9PSBvcmRlcmVkW2ldLlxuICBjb25zdCBieUtleSA9IG5ldyBNYXA8c3RyaW5nLCB0eXBlb2Ygbm9kZXM+KCk7XG4gIGZvciAoY29uc3QgbiBvZiBub2Rlcykge1xuICAgIGNvbnN0IGxpc3QgPSBieUtleS5nZXQobi5rZXkpID8/IFtdO1xuICAgIGxpc3QucHVzaChuKTtcbiAgICBieUtleS5zZXQobi5rZXksIGxpc3QpO1xuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2Ygb3JkZXJlZCkge1xuICAgIGZvciAoY29uc3QgbiBvZiBieUtleS5nZXQoa2V5KSA/PyBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBldmFsdWF0b3JSZXNvbHZlKG4uZW50cnkudG9rZW5zLCBzY29wZSwgbi5lbnRyeS5maWVsZCk7XG4gICAgICAgIG4uZW50cnkuc2V0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBlID0gZXJyIGFzIEVycm9yICYgeyBjb2RlPzogRXJyb3JDb2RlOyBwYXRoPzogc3RyaW5nIH07XG4gICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICBjb2RlOiBlLmNvZGUgPz8gRXJyb3JDb2RlLlRFTVBMQVRFX1BBUlNFX0VSUk9SLFxuICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICBmaWVsZDogbi5lbnRyeS5maWVsZCxcbiAgICAgICAgICBwYXRoOiBlLnBhdGgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBlcnJvcnMgfTtcbn1cblxuIl19
@@ -1,5 +1,4 @@
1
1
  import type { Plugin } from '@pipeline-builder/pipeline-data';
2
- export declare function isPluginTemplatableField(field: string): boolean;
3
2
  /**
4
3
  * Return a shallow clone of `plugin` with all `{{ ... }}` templates
5
4
  * resolved against the given pipeline scope. Caller must pre-populate
@@ -1,26 +1,10 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ // Which plugin fields accept `{{ ... }}` is the plugin spec's TEMPLATE
4
+ // CONTRACT, owned by api-core so the upload check, the CLI and this resolver
5
+ // can't disagree about it. Do not re-declare the field list here.
6
+ import { isPluginTemplatableField } from '@pipeline-builder/api-core';
3
7
  import { resolveSelfReferencing, resolveTemplates } from './index.js';
4
- /**
5
- * Fields inside a Plugin record that accept `{{ ... }}` templates.
6
- *
7
- * Pure-string leaves only. `name`, `version`, `pluginType`, `computeType`,
8
- * `timeout`, `secrets`, `failureBehavior`, `requiredMetadata`, `requiredVars`
9
- * stay literal. `metadata.*` is excluded because CDK-metadata values are
10
- * structural, not user-interpolated.
11
- */
12
- const TEMPLATABLE_FIELDS = [
13
- 'description',
14
- 'commands', // string[]
15
- 'installCommands', // string[]
16
- 'env', // Record<string, string>
17
- 'buildArgs', // Record<string, string>
18
- ];
19
- export function isPluginTemplatableField(field) {
20
- // `commands` / `installCommands` are arrays of strings → entries like 'commands[0]'
21
- // `env` / `buildArgs` are objects → entries like 'env.STAGE'
22
- return TEMPLATABLE_FIELDS.some(f => field === f || field.startsWith(`${f}[`) || field.startsWith(`${f}.`));
23
- }
24
8
  /**
25
9
  * Return a shallow clone of `plugin` with all `{{ ... }}` templates
26
10
  * resolved against the given pipeline scope. Caller must pre-populate
@@ -59,4 +43,4 @@ export function resolvePluginTemplates(plugin, pipelineScope) {
59
43
  }
60
44
  return clone;
61
45
  }
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlL3BsdWdpbi1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBR3RDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0RTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRztJQUN6QixhQUFhO0lBQ2IsVUFBVSxFQUFFLFdBQVc7SUFDdkIsaUJBQWlCLEVBQUUsV0FBVztJQUM5QixLQUFLLEVBQUUseUJBQXlCO0lBQ2hDLFdBQVcsRUFBRSx5QkFBeUI7Q0FDOUIsQ0FBQztBQUVYLE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxLQUFhO0lBQ3BELG9GQUFvRjtJQUNwRiw2REFBNkQ7SUFDN0QsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0csQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLE1BQWMsRUFDZCxhQUFzQztJQUV0QyxrRUFBa0U7SUFDbEUsMkVBQTJFO0lBQzNFLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQXFDLENBQUM7SUFFMUUsc0VBQXNFO0lBQ3RFLDZFQUE2RTtJQUM3RSx5RUFBeUU7SUFDekUsd0VBQXdFO0lBQ3hFLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQTJCLENBQUM7SUFDeEQsTUFBTSxLQUFLLEdBQUc7UUFDWixHQUFHLGFBQWE7UUFDaEIsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDdEQsR0FBRztLQUNKLENBQUM7SUFFRiw4RUFBOEU7SUFDOUUsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSw4REFBOEQ7SUFDOUQsTUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQ3BDLEVBQUUsR0FBRyxFQUFFLEVBQ1AsS0FBSyxFQUNMLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQ3RELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQ2pCLENBQUM7SUFFRiw0RUFBNEU7SUFDNUUsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FDM0IsS0FBSyxFQUNMLEtBQUssRUFDTCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUM3RixDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RCLDJFQUEyRTtRQUMzRSwwRUFBMEU7UUFDMUUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3JCLE1BQU0sR0FBRyxHQUFHLHlDQUF5QyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNILE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IHsgcmVzb2x2ZVNlbGZSZWZlcmVuY2luZywgcmVzb2x2ZVRlbXBsYXRlcyB9IGZyb20gJy4vaW5kZXguanMnO1xuXG4vKipcbiAqIEZpZWxkcyBpbnNpZGUgYSBQbHVnaW4gcmVjb3JkIHRoYXQgYWNjZXB0IGB7eyAuLi4gfX1gIHRlbXBsYXRlcy5cbiAqXG4gKiBQdXJlLXN0cmluZyBsZWF2ZXMgb25seS4gYG5hbWVgLCBgdmVyc2lvbmAsIGBwbHVnaW5UeXBlYCwgYGNvbXB1dGVUeXBlYCxcbiAqIGB0aW1lb3V0YCwgYHNlY3JldHNgLCBgZmFpbHVyZUJlaGF2aW9yYCwgYHJlcXVpcmVkTWV0YWRhdGFgLCBgcmVxdWlyZWRWYXJzYFxuICogc3RheSBsaXRlcmFsLiBgbWV0YWRhdGEuKmAgaXMgZXhjbHVkZWQgYmVjYXVzZSBDREstbWV0YWRhdGEgdmFsdWVzIGFyZVxuICogc3RydWN0dXJhbCwgbm90IHVzZXItaW50ZXJwb2xhdGVkLlxuICovXG5jb25zdCBURU1QTEFUQUJMRV9GSUVMRFMgPSBbXG4gICdkZXNjcmlwdGlvbicsXG4gICdjb21tYW5kcycsIC8vIHN0cmluZ1tdXG4gICdpbnN0YWxsQ29tbWFuZHMnLCAvLyBzdHJpbmdbXVxuICAnZW52JywgLy8gUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAnYnVpbGRBcmdzJywgLy8gUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUGx1Z2luVGVtcGxhdGFibGVGaWVsZChmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGBjb21tYW5kc2AgLyBgaW5zdGFsbENvbW1hbmRzYCBhcmUgYXJyYXlzIG9mIHN0cmluZ3Mg4oaSIGVudHJpZXMgbGlrZSAnY29tbWFuZHNbMF0nXG4gIC8vIGBlbnZgIC8gYGJ1aWxkQXJnc2AgYXJlIG9iamVjdHMg4oaSIGVudHJpZXMgbGlrZSAnZW52LlNUQUdFJ1xuICByZXR1cm4gVEVNUExBVEFCTEVfRklFTERTLnNvbWUoZiA9PiBmaWVsZCA9PT0gZiB8fCBmaWVsZC5zdGFydHNXaXRoKGAke2Z9W2ApIHx8IGZpZWxkLnN0YXJ0c1dpdGgoYCR7Zn0uYCkpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIHNoYWxsb3cgY2xvbmUgb2YgYHBsdWdpbmAgd2l0aCBhbGwgYHt7IC4uLiB9fWAgdGVtcGxhdGVzXG4gKiByZXNvbHZlZCBhZ2FpbnN0IHRoZSBnaXZlbiBwaXBlbGluZSBzY29wZS4gQ2FsbGVyIG11c3QgcHJlLXBvcHVsYXRlXG4gKiBgcGlwZWxpbmVTY29wZWAgd2l0aCBgeyBwaXBlbGluZSwgcGx1Z2luLCBlbnYgfWAga2V5cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQbHVnaW5UZW1wbGF0ZXMoXG4gIHBsdWdpbjogUGx1Z2luLFxuICBwaXBlbGluZVNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFBsdWdpbiB7XG4gIC8vIERlZXAgY2xvbmUgc28gbXV0YXRpb25zIGRvbid0IGxlYWsgYmFjayB0byB0aGUgY2FsbGVyJ3MgUGx1Z2luLlxuICAvLyBTdHJ1Y3R1cmFsIGZpZWxkcyB3ZSBjYXJlIGFib3V0IGFyZSBwbGFpbiBKU09OOyBzdHJ1Y3R1cmVkQ2xvbmUgaXMgc2FmZS5cbiAgY29uc3QgY2xvbmUgPSBzdHJ1Y3R1cmVkQ2xvbmUocGx1Z2luKSBhcyBQbHVnaW4gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBUaGUgYGVudmAgc2NvcGUgcm9vdCBJUyB0aGUgY2xvbmUncyBlbnYgbWFwLCBub3QgdGhlIG9yaWdpbmFsOiB3aXRoXG4gIC8vIGBwbHVnaW4uZW52YCDigJQgdGhlIFVOUkVTT0xWRUQgdmFsdWVzIOKAlCBgQjogJ3t7IGVudi5BIH19J2Agd291bGQgc3Vic3RpdHV0ZVxuICAvLyBBJ3MgcmF3IHRlbXBsYXRlIHRleHQsIGJha2luZyB0aGUgbGl0ZXJhbCBge3sg4oCmIH19YCBpbnRvIHRoZSBDb2RlQnVpbGRcbiAgLy8gZW52aXJvbm1lbnQgYW5kIHNoZWxsIGNvbW1hbmRzIHdpdGggbm8gZXJyb3IuIEEgY3ljbGUgKEHihpRCKSBsaWtld2lzZS5cbiAgY29uc3QgZW52ID0gKGNsb25lLmVudiA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3Qgc2NvcGUgPSB7XG4gICAgLi4ucGlwZWxpbmVTY29wZSxcbiAgICBwbHVnaW46IHsgbmFtZTogcGx1Z2luLm5hbWUsIHZlcnNpb246IHBsdWdpbi52ZXJzaW9uIH0sXG4gICAgZW52LFxuICB9O1xuXG4gIC8vIFBhc3MgMSDigJQgYGVudmAgZmlyc3QsIGFzIGEgc2VsZi1yZWZlcmVuY2luZyBkb2N1bWVudDogdG9wb2xvZ2ljYWxseSBvcmRlcmVkXG4gIC8vIHNvIGVhY2ggdmFsdWUgcmVzb2x2ZXMgYWZ0ZXIgdGhlIG9uZXMgaXQgcmVhZHMsIHdpdGggY3ljbGVzIHJlcG9ydGVkIHJhdGhlclxuICAvLyB0aGFuIHNpbGVudGx5IGxlZnQgYXMgdGVtcGxhdGUgdGV4dC4gUmVzb2x2aW5nIHdyaXRlcyBiYWNrIGludG8gYGVudmAsIHdoaWNoXG4gIC8vIGlzIHRoZSBzY29wZSByb290LCBzbyBsYXRlciByZWZlcmVuY2VzIHNlZSByZXNvbHZlZCB2YWx1ZXMuXG4gIGNvbnN0IGVudlBhc3MgPSByZXNvbHZlU2VsZlJlZmVyZW5jaW5nKFxuICAgIHsgZW52IH0sXG4gICAgc2NvcGUsXG4gICAgKGZpZWxkKSA9PiBmaWVsZCA9PT0gJ2VudicgfHwgZmllbGQuc3RhcnRzV2l0aCgnZW52LicpLFxuICAgIChmaWVsZCkgPT4gZmllbGQsXG4gICk7XG5cbiAgLy8gUGFzcyAyIOKAlCBldmVyeXRoaW5nIGVsc2UsIGFnYWluc3QgdGhlIG5vdy1yZXNvbHZlZCBgZW52YC4gYGVudmAgaXRzZWxmIGlzXG4gIC8vIGV4Y2x1ZGVkOiBpdHMgdmFsdWVzIGFyZSBmaW5hbCwgYW5kIG9uZSBwcm9kdWNlZCBieSBhbiBlc2NhcGUgKGB7e3t7eH19YCDihpJcbiAgLy8gYHt7eH19YCkgbXVzdCBub3QgYmUgdG9rZW5pemVkIGEgc2Vjb25kIHRpbWUgYXMgaWYgaXQgd2VyZSBhbiBleHByZXNzaW9uLlxuICBjb25zdCByZXN0ID0gcmVzb2x2ZVRlbXBsYXRlcyhcbiAgICBjbG9uZSxcbiAgICBzY29wZSxcbiAgICAoZmllbGQpID0+IGlzUGx1Z2luVGVtcGxhdGFibGVGaWVsZChmaWVsZCkgJiYgIShmaWVsZCA9PT0gJ2VudicgfHwgZmllbGQuc3RhcnRzV2l0aCgnZW52LicpKSxcbiAgKTtcblxuICBjb25zdCBlcnJvcnMgPSBbLi4uZW52UGFzcy5lcnJvcnMsIC4uLnJlc3QuZXJyb3JzXTtcbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgLy8gRmlyc3QgZXJyb3Igd2lucyDigJQgcmVzb2x2ZXIgZXJyb3JzIHNob3VsZCBuZXZlciBiZSBiYXRjaGVkIGF0IHN5bnRoIHRpbWVcbiAgICAvLyBiZWNhdXNlIGEgYnJva2VuIHRlbXBsYXRlIGlzIGEgcHJvZ3JhbW1lciBlcnJvciwgbm90IGEgdmFsaWRhdGlvbiBzdGVwLlxuICAgIGNvbnN0IGUgPSBlcnJvcnNbMF0hO1xuICAgIGNvbnN0IG1zZyA9IGBUZW1wbGF0ZSByZXNvbHV0aW9uIGZhaWxlZCBpbiBwbHVnaW4gXCIke3BsdWdpbi5uYW1lfVwiIGF0IGZpZWxkICcke2UuZmllbGQgPz8gZS5wYXRoID8/ICdlbnYnfSc6ICR7ZS5tZXNzYWdlfWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gIH1cbiAgcmV0dXJuIGNsb25lO1xufVxuIl19
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbXBsYXRlL3BsdWdpbi1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLHVFQUF1RTtBQUN2RSw2RUFBNkU7QUFDN0Usa0VBQWtFO0FBQ2xFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0RTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxNQUFjLEVBQ2QsYUFBc0M7SUFFdEMsa0VBQWtFO0lBQ2xFLDJFQUEyRTtJQUMzRSxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFxQyxDQUFDO0lBRTFFLHNFQUFzRTtJQUN0RSw2RUFBNkU7SUFDN0UseUVBQXlFO0lBQ3pFLHdFQUF3RTtJQUN4RSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksRUFBRSxDQUEyQixDQUFDO0lBQ3hELE1BQU0sS0FBSyxHQUFHO1FBQ1osR0FBRyxhQUFhO1FBQ2hCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ3RELEdBQUc7S0FDSixDQUFDO0lBRUYsOEVBQThFO0lBQzlFLDhFQUE4RTtJQUM5RSwrRUFBK0U7SUFDL0UsOERBQThEO0lBQzlELE1BQU0sT0FBTyxHQUFHLHNCQUFzQixDQUNwQyxFQUFFLEdBQUcsRUFBRSxFQUNQLEtBQUssRUFDTCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUN0RCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUNqQixDQUFDO0lBRUYsNEVBQTRFO0lBQzVFLDZFQUE2RTtJQUM3RSw0RUFBNEU7SUFDNUUsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQzNCLEtBQUssRUFDTCxLQUFLLEVBQ0wsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDN0YsQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QiwyRUFBMkU7UUFDM0UsMEVBQTBFO1FBQzFFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUNyQixNQUFNLEdBQUcsR0FBRyx5Q0FBeUMsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzSCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLy8gV2hpY2ggcGx1Z2luIGZpZWxkcyBhY2NlcHQgYHt7IC4uLiB9fWAgaXMgdGhlIHBsdWdpbiBzcGVjJ3MgVEVNUExBVEVcbi8vIENPTlRSQUNULCBvd25lZCBieSBhcGktY29yZSBzbyB0aGUgdXBsb2FkIGNoZWNrLCB0aGUgQ0xJIGFuZCB0aGlzIHJlc29sdmVyXG4vLyBjYW4ndCBkaXNhZ3JlZSBhYm91dCBpdC4gRG8gbm90IHJlLWRlY2xhcmUgdGhlIGZpZWxkIGxpc3QgaGVyZS5cbmltcG9ydCB7IGlzUGx1Z2luVGVtcGxhdGFibGVGaWVsZCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5pbXBvcnQgeyByZXNvbHZlU2VsZlJlZmVyZW5jaW5nLCByZXNvbHZlVGVtcGxhdGVzIH0gZnJvbSAnLi9pbmRleC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIGEgc2hhbGxvdyBjbG9uZSBvZiBgcGx1Z2luYCB3aXRoIGFsbCBge3sgLi4uIH19YCB0ZW1wbGF0ZXNcbiAqIHJlc29sdmVkIGFnYWluc3QgdGhlIGdpdmVuIHBpcGVsaW5lIHNjb3BlLiBDYWxsZXIgbXVzdCBwcmUtcG9wdWxhdGVcbiAqIGBwaXBlbGluZVNjb3BlYCB3aXRoIGB7IHBpcGVsaW5lLCBwbHVnaW4sIGVudiB9YCBrZXlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBsdWdpblRlbXBsYXRlcyhcbiAgcGx1Z2luOiBQbHVnaW4sXG4gIHBpcGVsaW5lU2NvcGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUGx1Z2luIHtcbiAgLy8gRGVlcCBjbG9uZSBzbyBtdXRhdGlvbnMgZG9uJ3QgbGVhayBiYWNrIHRvIHRoZSBjYWxsZXIncyBQbHVnaW4uXG4gIC8vIFN0cnVjdHVyYWwgZmllbGRzIHdlIGNhcmUgYWJvdXQgYXJlIHBsYWluIEpTT047IHN0cnVjdHVyZWRDbG9uZSBpcyBzYWZlLlxuICBjb25zdCBjbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShwbHVnaW4pIGFzIFBsdWdpbiAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8vIFRoZSBgZW52YCBzY29wZSByb290IElTIHRoZSBjbG9uZSdzIGVudiBtYXAsIG5vdCB0aGUgb3JpZ2luYWw6IHdpdGhcbiAgLy8gYHBsdWdpbi5lbnZgIOKAlCB0aGUgVU5SRVNPTFZFRCB2YWx1ZXMg4oCUIGBCOiAne3sgZW52LkEgfX0nYCB3b3VsZCBzdWJzdGl0dXRlXG4gIC8vIEEncyByYXcgdGVtcGxhdGUgdGV4dCwgYmFraW5nIHRoZSBsaXRlcmFsIGB7eyDigKYgfX1gIGludG8gdGhlIENvZGVCdWlsZFxuICAvLyBlbnZpcm9ubWVudCBhbmQgc2hlbGwgY29tbWFuZHMgd2l0aCBubyBlcnJvci4gQSBjeWNsZSAoQeKGlEIpIGxpa2V3aXNlLlxuICBjb25zdCBlbnYgPSAoY2xvbmUuZW52ID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCBzY29wZSA9IHtcbiAgICAuLi5waXBlbGluZVNjb3BlLFxuICAgIHBsdWdpbjogeyBuYW1lOiBwbHVnaW4ubmFtZSwgdmVyc2lvbjogcGx1Z2luLnZlcnNpb24gfSxcbiAgICBlbnYsXG4gIH07XG5cbiAgLy8gUGFzcyAxIOKAlCBgZW52YCBmaXJzdCwgYXMgYSBzZWxmLXJlZmVyZW5jaW5nIGRvY3VtZW50OiB0b3BvbG9naWNhbGx5IG9yZGVyZWRcbiAgLy8gc28gZWFjaCB2YWx1ZSByZXNvbHZlcyBhZnRlciB0aGUgb25lcyBpdCByZWFkcywgd2l0aCBjeWNsZXMgcmVwb3J0ZWQgcmF0aGVyXG4gIC8vIHRoYW4gc2lsZW50bHkgbGVmdCBhcyB0ZW1wbGF0ZSB0ZXh0LiBSZXNvbHZpbmcgd3JpdGVzIGJhY2sgaW50byBgZW52YCwgd2hpY2hcbiAgLy8gaXMgdGhlIHNjb3BlIHJvb3QsIHNvIGxhdGVyIHJlZmVyZW5jZXMgc2VlIHJlc29sdmVkIHZhbHVlcy5cbiAgY29uc3QgZW52UGFzcyA9IHJlc29sdmVTZWxmUmVmZXJlbmNpbmcoXG4gICAgeyBlbnYgfSxcbiAgICBzY29wZSxcbiAgICAoZmllbGQpID0+IGZpZWxkID09PSAnZW52JyB8fCBmaWVsZC5zdGFydHNXaXRoKCdlbnYuJyksXG4gICAgKGZpZWxkKSA9PiBmaWVsZCxcbiAgKTtcblxuICAvLyBQYXNzIDIg4oCUIGV2ZXJ5dGhpbmcgZWxzZSwgYWdhaW5zdCB0aGUgbm93LXJlc29sdmVkIGBlbnZgLiBgZW52YCBpdHNlbGYgaXNcbiAgLy8gZXhjbHVkZWQ6IGl0cyB2YWx1ZXMgYXJlIGZpbmFsLCBhbmQgb25lIHByb2R1Y2VkIGJ5IGFuIGVzY2FwZSAoYHt7e3t4fX1gIOKGklxuICAvLyBge3t4fX1gKSBtdXN0IG5vdCBiZSB0b2tlbml6ZWQgYSBzZWNvbmQgdGltZSBhcyBpZiBpdCB3ZXJlIGFuIGV4cHJlc3Npb24uXG4gIGNvbnN0IHJlc3QgPSByZXNvbHZlVGVtcGxhdGVzKFxuICAgIGNsb25lLFxuICAgIHNjb3BlLFxuICAgIChmaWVsZCkgPT4gaXNQbHVnaW5UZW1wbGF0YWJsZUZpZWxkKGZpZWxkKSAmJiAhKGZpZWxkID09PSAnZW52JyB8fCBmaWVsZC5zdGFydHNXaXRoKCdlbnYuJykpLFxuICApO1xuXG4gIGNvbnN0IGVycm9ycyA9IFsuLi5lbnZQYXNzLmVycm9ycywgLi4ucmVzdC5lcnJvcnNdO1xuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAvLyBGaXJzdCBlcnJvciB3aW5zIOKAlCByZXNvbHZlciBlcnJvcnMgc2hvdWxkIG5ldmVyIGJlIGJhdGNoZWQgYXQgc3ludGggdGltZVxuICAgIC8vIGJlY2F1c2UgYSBicm9rZW4gdGVtcGxhdGUgaXMgYSBwcm9ncmFtbWVyIGVycm9yLCBub3QgYSB2YWxpZGF0aW9uIHN0ZXAuXG4gICAgY29uc3QgZSA9IGVycm9yc1swXSE7XG4gICAgY29uc3QgbXNnID0gYFRlbXBsYXRlIHJlc29sdXRpb24gZmFpbGVkIGluIHBsdWdpbiBcIiR7cGx1Z2luLm5hbWV9XCIgYXQgZmllbGQgJyR7ZS5maWVsZCA/PyBlLnBhdGggPz8gJ2Vudid9JzogJHtlLm1lc3NhZ2V9YDtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgfVxuICByZXR1cm4gY2xvbmU7XG59XG4iXX0=
@@ -3,7 +3,6 @@
3
3
  "entries": {
4
4
  ".": {
5
5
  "allowedScopeRoots": "function",
6
- "CDK_METADATA_PREFIX": "value",
7
6
  "checkPluginContract": "function",
8
7
  "collectPluginSteps": "function",
9
8
  "ComputeType": "value",
@@ -14,9 +13,9 @@
14
13
  "dependencies": "function",
15
14
  "detectCycles": "function",
16
15
  "extractMetadataEnv": "function",
16
+ "formatTemplateDraftProblems": "function",
17
17
  "hasTemplate": "function",
18
18
  "isContractValueOfType": "function",
19
- "isPluginTemplatableField": "function",
20
19
  "MAX_FIELD_SIZE_BYTES": "value",
21
20
  "MAX_PATH_DEPTH": "value",
22
21
  "MetadataKeys": "value",
@@ -40,6 +39,7 @@
40
39
  "tokenize": "function",
41
40
  "TriggerType": "value",
42
41
  "unwrapLookup": "function",
42
+ "validateTemplateDraft": "function",
43
43
  "validateTemplates": "function",
44
44
  "wrapCommandsForFailureBehavior": "function"
45
45
  },
package/package.json CHANGED
@@ -33,8 +33,8 @@
33
33
  "dependencies": {
34
34
  "axios": "1.20.0",
35
35
  "jsonwebtoken": "9.0.3",
36
- "@pipeline-builder/api-core": "4.1.20",
37
- "@pipeline-builder/pipeline-data": "4.1.22"
36
+ "@pipeline-builder/api-core": "4.1.21",
37
+ "@pipeline-builder/pipeline-data": "4.1.23"
38
38
  },
39
39
  "keywords": [
40
40
  "ci-cd",
@@ -97,7 +97,7 @@
97
97
  ]
98
98
  }
99
99
  },
100
- "version": "4.1.22",
100
+ "version": "4.1.23",
101
101
  "bugs": {
102
102
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
103
103
  },