@contractspec/lib.workflow-composer 3.7.20 → 3.7.22
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/dist/browser/index.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/node/index.js +1 -1
- package/dist/workflow-composer.feature.d.ts +1 -0
- package/package.json +4 -4
package/dist/browser/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{satisfies as
|
|
1
|
+
import{satisfies as x}from"compare-versions";import{validateWorkflowSpec as i}from"@contractspec/lib.contracts-spec/workflow";function d(o,r){let e=[],s=new Set(r.definition.steps.map((t)=>t.id)),a=new Set(o.hiddenSteps??[]),f=new Set(s),m=r.definition.transitions.filter((t)=>f.has(t.from)&&f.has(t.to)).map((t)=>({...t}));if(!o.workflow.trim())e.push({code:"workflow.extension.workflow",message:"workflow is required"});if(o.workflow!==r.meta.key)e.push({code:"workflow.extension.workflow.mismatch",message:`extension targets "${o.workflow}" but base workflow is "${r.meta.key}"`});a.forEach((t)=>{if(!s.has(t)){e.push({code:"workflow.extension.hidden-step",message:`hidden step "${t}" does not exist`});return}f.delete(t)}),c(m,a);let w=new Set([...s].filter((t)=>!a.has(t)));o.customSteps?.forEach((t,p)=>{let u=t.inject.id?.trim();if(!u){e.push({code:"workflow.extension.step.id",message:`customSteps[${p}] is missing an id`});return}if(t.id&&t.id!==u)e.push({code:"workflow.extension.step.id-mismatch",message:`customSteps[${p}] has mismatched id (id="${t.id}", inject.id="${u}")`});if(w.has(u))e.push({code:"workflow.extension.step.id.duplicate",message:`customSteps[${p}] injects duplicate step id "${u}"`});if(t.after&&t.before)e.push({code:"workflow.extension.step.anchor.multiple",message:`customSteps[${p}] cannot set both after and before`});if(!t.after&&!t.before)e.push({code:"workflow.extension.step.anchor",message:`customSteps[${p}] must set after or before`});if(t.after&&!w.has(t.after))e.push({code:"workflow.extension.step.after",message:`customSteps[${p}] references unknown step "${t.after}"`});if(t.before&&!w.has(t.before))e.push({code:"workflow.extension.step.before",message:`customSteps[${p}] references unknown step "${t.before}"`});if(t.transitionFrom&&!w.has(t.transitionFrom))e.push({code:"workflow.extension.step.transition-from",message:`customSteps[${p}] references unknown transitionFrom step "${t.transitionFrom}"`});if(t.transitionTo&&!w.has(t.transitionTo))e.push({code:"workflow.extension.step.transition-to",message:`customSteps[${p}] references unknown transitionTo step "${t.transitionTo}"`});if(w.add(u),f.add(u),t.transitionFrom)m.push({from:t.transitionFrom,to:u,condition:t.when});if(t.transitionTo)m.push({from:u,to:t.transitionTo,condition:t.when})});let l=r.definition.entryStepId??r.definition.steps[0]?.id;if(l&&a.has(l))e.push({code:"workflow.extension.hidden-step.entry",message:`hiddenSteps removes the entry step "${l}"`});if(l&&!a.has(l)){let t=g(l,m);for(let p of f)if(!t.has(p))e.push({code:"workflow.extension.hidden-step.orphan",message:`extension leaves step "${p}" unreachable from entry step "${l}"`})}if(e.length){let t=e.map((p)=>`${p.code}: ${p.message}`).join("; ");throw Error(`Invalid workflow extension for ${o.workflow}: ${t}`)}}function c(o,r){for(let e=o.length-1;e>=0;e-=1){let s=o[e];if(!s)continue;if(r.has(s.from)||r.has(s.to))o.splice(e,1)}}function g(o,r){let e=new Map;for(let f of r){let m=e.get(f.from)??[];m.push(f.to),e.set(f.from,m)}let s=new Set,a=[o];while(a.length>0){let f=a.shift();if(!f||s.has(f))continue;s.add(f);for(let m of e.get(f)??[])a.push(m)}return s}function n(o,r){d(r,o);let e=v(o),s=[...e.definition.steps],a=[...e.definition.transitions],f=new Set(r.hiddenSteps??[]);if(f.forEach((l)=>{let t=s.findIndex((p)=>p.id===l);if(t!==-1)s.splice(t,1)}),f.size)a=a.filter((l)=>!f.has(l.from)&&!f.has(l.to));r.customSteps?.forEach((l)=>{S(s,l),$(a,l)}),e.definition.steps=s,e.definition.transitions=E(a),e.metadata=h(e.metadata,r.metadata),e.annotations=h(e.annotations,r.annotations);let w=i(e).filter((l)=>l.level==="error");if(w.length>0)throw Error(`Invalid composed workflow ${e.meta.key}.v${e.meta.version}: ${w.map((l)=>l.message).join("; ")}`);return e}function S(o,r){let e=y(o,r);if(e===-1)throw Error(`Unable to place injected step "${r.inject.id}"`);o.splice(e,0,{...r.inject})}function y(o,r){if(r.after){let e=o.findIndex((s)=>s.id===r.after);return e===-1?-1:e+1}if(r.before){let e=o.findIndex((s)=>s.id===r.before);return e===-1?-1:e}return o.length}function $(o,r){if(!r.inject.id)return;if(r.transitionFrom)o.push({from:r.transitionFrom,to:r.inject.id,condition:r.when});if(r.transitionTo)o.push({from:r.inject.id,to:r.transitionTo,condition:r.when})}function E(o){let r=new Set,e=[];return o.forEach((s)=>{let a=`${s.from}->${s.to}:${s.condition??""}`;if(r.has(a))return;r.add(a),e.push(s)}),e}function v(o){return JSON.parse(JSON.stringify(o))}function h(o,r){if(!o&&!r)return;return{...o??{},...r??{}}}function k(o){return[...o].sort((r,e)=>{let s=(r.priority??0)-(e.priority??0);if(s!==0)return s;let a=r.workflow.localeCompare(e.workflow);if(a!==0)return a;let f=(r.tenantId??"").localeCompare(e.tenantId??"");if(f!==0)return f;let m=(r.role??"").localeCompare(e.role??"");if(m!==0)return m;let w=(r.device??"").localeCompare(e.device??"");if(w!==0)return w;return(r.baseVersion??"").localeCompare(e.baseVersion??"")})}class W{extensions=[];register(o){return this.extensions.push(o),this}registerMany(o){return o.forEach((r)=>{this.register(r)}),this}compose(o){return k(this.extensions.filter((e)=>T(o,e))).reduce((e,s)=>n(e,s),o.base)}}function T(o,r){if(r.workflow!==o.base.meta.key)return!1;if(r.baseVersion&&!x(o.base.meta.version,r.baseVersion))return!1;if(r.tenantId&&r.tenantId!==o.tenantId)return!1;if(r.role&&r.role!==o.role)return!1;if(r.device&&r.device!==o.device)return!1;return!0}function M(o){return{id:o.id,label:o.label,type:o.type??"human",description:o.description??"Tenant-specific approval",action:o.action,guard:o.guardExpression?{type:"expression",value:o.guardExpression}:void 0}}import{defineFeature as b}from"@contractspec/lib.contracts-spec/features";var D=b({meta:{key:"libs.workflow-composer",version:"1.0.0",title:"Workflow Composer",description:"Tenant-aware workflow composition helpers for ContractSpec.",domain:"workflow-composer",owners:["@contractspec-core"],tags:["package","libs","workflow-composer"],stability:"experimental"}});export{d as validateExtension,k as mergeExtensions,M as approvalStepTemplate,n as applyWorkflowExtension,D as WorkflowComposerFeature,W as WorkflowComposer};
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{satisfies as
|
|
2
|
+
import{satisfies as x}from"compare-versions";import{validateWorkflowSpec as i}from"@contractspec/lib.contracts-spec/workflow";function d(o,r){let e=[],s=new Set(r.definition.steps.map((t)=>t.id)),a=new Set(o.hiddenSteps??[]),f=new Set(s),m=r.definition.transitions.filter((t)=>f.has(t.from)&&f.has(t.to)).map((t)=>({...t}));if(!o.workflow.trim())e.push({code:"workflow.extension.workflow",message:"workflow is required"});if(o.workflow!==r.meta.key)e.push({code:"workflow.extension.workflow.mismatch",message:`extension targets "${o.workflow}" but base workflow is "${r.meta.key}"`});a.forEach((t)=>{if(!s.has(t)){e.push({code:"workflow.extension.hidden-step",message:`hidden step "${t}" does not exist`});return}f.delete(t)}),c(m,a);let w=new Set([...s].filter((t)=>!a.has(t)));o.customSteps?.forEach((t,p)=>{let u=t.inject.id?.trim();if(!u){e.push({code:"workflow.extension.step.id",message:`customSteps[${p}] is missing an id`});return}if(t.id&&t.id!==u)e.push({code:"workflow.extension.step.id-mismatch",message:`customSteps[${p}] has mismatched id (id="${t.id}", inject.id="${u}")`});if(w.has(u))e.push({code:"workflow.extension.step.id.duplicate",message:`customSteps[${p}] injects duplicate step id "${u}"`});if(t.after&&t.before)e.push({code:"workflow.extension.step.anchor.multiple",message:`customSteps[${p}] cannot set both after and before`});if(!t.after&&!t.before)e.push({code:"workflow.extension.step.anchor",message:`customSteps[${p}] must set after or before`});if(t.after&&!w.has(t.after))e.push({code:"workflow.extension.step.after",message:`customSteps[${p}] references unknown step "${t.after}"`});if(t.before&&!w.has(t.before))e.push({code:"workflow.extension.step.before",message:`customSteps[${p}] references unknown step "${t.before}"`});if(t.transitionFrom&&!w.has(t.transitionFrom))e.push({code:"workflow.extension.step.transition-from",message:`customSteps[${p}] references unknown transitionFrom step "${t.transitionFrom}"`});if(t.transitionTo&&!w.has(t.transitionTo))e.push({code:"workflow.extension.step.transition-to",message:`customSteps[${p}] references unknown transitionTo step "${t.transitionTo}"`});if(w.add(u),f.add(u),t.transitionFrom)m.push({from:t.transitionFrom,to:u,condition:t.when});if(t.transitionTo)m.push({from:u,to:t.transitionTo,condition:t.when})});let l=r.definition.entryStepId??r.definition.steps[0]?.id;if(l&&a.has(l))e.push({code:"workflow.extension.hidden-step.entry",message:`hiddenSteps removes the entry step "${l}"`});if(l&&!a.has(l)){let t=g(l,m);for(let p of f)if(!t.has(p))e.push({code:"workflow.extension.hidden-step.orphan",message:`extension leaves step "${p}" unreachable from entry step "${l}"`})}if(e.length){let t=e.map((p)=>`${p.code}: ${p.message}`).join("; ");throw Error(`Invalid workflow extension for ${o.workflow}: ${t}`)}}function c(o,r){for(let e=o.length-1;e>=0;e-=1){let s=o[e];if(!s)continue;if(r.has(s.from)||r.has(s.to))o.splice(e,1)}}function g(o,r){let e=new Map;for(let f of r){let m=e.get(f.from)??[];m.push(f.to),e.set(f.from,m)}let s=new Set,a=[o];while(a.length>0){let f=a.shift();if(!f||s.has(f))continue;s.add(f);for(let m of e.get(f)??[])a.push(m)}return s}function n(o,r){d(r,o);let e=v(o),s=[...e.definition.steps],a=[...e.definition.transitions],f=new Set(r.hiddenSteps??[]);if(f.forEach((l)=>{let t=s.findIndex((p)=>p.id===l);if(t!==-1)s.splice(t,1)}),f.size)a=a.filter((l)=>!f.has(l.from)&&!f.has(l.to));r.customSteps?.forEach((l)=>{S(s,l),$(a,l)}),e.definition.steps=s,e.definition.transitions=E(a),e.metadata=h(e.metadata,r.metadata),e.annotations=h(e.annotations,r.annotations);let w=i(e).filter((l)=>l.level==="error");if(w.length>0)throw Error(`Invalid composed workflow ${e.meta.key}.v${e.meta.version}: ${w.map((l)=>l.message).join("; ")}`);return e}function S(o,r){let e=y(o,r);if(e===-1)throw Error(`Unable to place injected step "${r.inject.id}"`);o.splice(e,0,{...r.inject})}function y(o,r){if(r.after){let e=o.findIndex((s)=>s.id===r.after);return e===-1?-1:e+1}if(r.before){let e=o.findIndex((s)=>s.id===r.before);return e===-1?-1:e}return o.length}function $(o,r){if(!r.inject.id)return;if(r.transitionFrom)o.push({from:r.transitionFrom,to:r.inject.id,condition:r.when});if(r.transitionTo)o.push({from:r.inject.id,to:r.transitionTo,condition:r.when})}function E(o){let r=new Set,e=[];return o.forEach((s)=>{let a=`${s.from}->${s.to}:${s.condition??""}`;if(r.has(a))return;r.add(a),e.push(s)}),e}function v(o){return JSON.parse(JSON.stringify(o))}function h(o,r){if(!o&&!r)return;return{...o??{},...r??{}}}function k(o){return[...o].sort((r,e)=>{let s=(r.priority??0)-(e.priority??0);if(s!==0)return s;let a=r.workflow.localeCompare(e.workflow);if(a!==0)return a;let f=(r.tenantId??"").localeCompare(e.tenantId??"");if(f!==0)return f;let m=(r.role??"").localeCompare(e.role??"");if(m!==0)return m;let w=(r.device??"").localeCompare(e.device??"");if(w!==0)return w;return(r.baseVersion??"").localeCompare(e.baseVersion??"")})}class W{extensions=[];register(o){return this.extensions.push(o),this}registerMany(o){return o.forEach((r)=>{this.register(r)}),this}compose(o){return k(this.extensions.filter((e)=>T(o,e))).reduce((e,s)=>n(e,s),o.base)}}function T(o,r){if(r.workflow!==o.base.meta.key)return!1;if(r.baseVersion&&!x(o.base.meta.version,r.baseVersion))return!1;if(r.tenantId&&r.tenantId!==o.tenantId)return!1;if(r.role&&r.role!==o.role)return!1;if(r.device&&r.device!==o.device)return!1;return!0}function M(o){return{id:o.id,label:o.label,type:o.type??"human",description:o.description??"Tenant-specific approval",action:o.action,guard:o.guardExpression?{type:"expression",value:o.guardExpression}:void 0}}import{defineFeature as b}from"@contractspec/lib.contracts-spec/features";var D=b({meta:{key:"libs.workflow-composer",version:"1.0.0",title:"Workflow Composer",description:"Tenant-aware workflow composition helpers for ContractSpec.",domain:"workflow-composer",owners:["@contractspec-core"],tags:["package","libs","workflow-composer"],stability:"experimental"}});export{d as validateExtension,k as mergeExtensions,M as approvalStepTemplate,n as applyWorkflowExtension,D as WorkflowComposerFeature,W as WorkflowComposer};
|
package/dist/node/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{satisfies as
|
|
1
|
+
import{satisfies as x}from"compare-versions";import{validateWorkflowSpec as i}from"@contractspec/lib.contracts-spec/workflow";function d(o,r){let e=[],s=new Set(r.definition.steps.map((t)=>t.id)),a=new Set(o.hiddenSteps??[]),f=new Set(s),m=r.definition.transitions.filter((t)=>f.has(t.from)&&f.has(t.to)).map((t)=>({...t}));if(!o.workflow.trim())e.push({code:"workflow.extension.workflow",message:"workflow is required"});if(o.workflow!==r.meta.key)e.push({code:"workflow.extension.workflow.mismatch",message:`extension targets "${o.workflow}" but base workflow is "${r.meta.key}"`});a.forEach((t)=>{if(!s.has(t)){e.push({code:"workflow.extension.hidden-step",message:`hidden step "${t}" does not exist`});return}f.delete(t)}),c(m,a);let w=new Set([...s].filter((t)=>!a.has(t)));o.customSteps?.forEach((t,p)=>{let u=t.inject.id?.trim();if(!u){e.push({code:"workflow.extension.step.id",message:`customSteps[${p}] is missing an id`});return}if(t.id&&t.id!==u)e.push({code:"workflow.extension.step.id-mismatch",message:`customSteps[${p}] has mismatched id (id="${t.id}", inject.id="${u}")`});if(w.has(u))e.push({code:"workflow.extension.step.id.duplicate",message:`customSteps[${p}] injects duplicate step id "${u}"`});if(t.after&&t.before)e.push({code:"workflow.extension.step.anchor.multiple",message:`customSteps[${p}] cannot set both after and before`});if(!t.after&&!t.before)e.push({code:"workflow.extension.step.anchor",message:`customSteps[${p}] must set after or before`});if(t.after&&!w.has(t.after))e.push({code:"workflow.extension.step.after",message:`customSteps[${p}] references unknown step "${t.after}"`});if(t.before&&!w.has(t.before))e.push({code:"workflow.extension.step.before",message:`customSteps[${p}] references unknown step "${t.before}"`});if(t.transitionFrom&&!w.has(t.transitionFrom))e.push({code:"workflow.extension.step.transition-from",message:`customSteps[${p}] references unknown transitionFrom step "${t.transitionFrom}"`});if(t.transitionTo&&!w.has(t.transitionTo))e.push({code:"workflow.extension.step.transition-to",message:`customSteps[${p}] references unknown transitionTo step "${t.transitionTo}"`});if(w.add(u),f.add(u),t.transitionFrom)m.push({from:t.transitionFrom,to:u,condition:t.when});if(t.transitionTo)m.push({from:u,to:t.transitionTo,condition:t.when})});let l=r.definition.entryStepId??r.definition.steps[0]?.id;if(l&&a.has(l))e.push({code:"workflow.extension.hidden-step.entry",message:`hiddenSteps removes the entry step "${l}"`});if(l&&!a.has(l)){let t=g(l,m);for(let p of f)if(!t.has(p))e.push({code:"workflow.extension.hidden-step.orphan",message:`extension leaves step "${p}" unreachable from entry step "${l}"`})}if(e.length){let t=e.map((p)=>`${p.code}: ${p.message}`).join("; ");throw Error(`Invalid workflow extension for ${o.workflow}: ${t}`)}}function c(o,r){for(let e=o.length-1;e>=0;e-=1){let s=o[e];if(!s)continue;if(r.has(s.from)||r.has(s.to))o.splice(e,1)}}function g(o,r){let e=new Map;for(let f of r){let m=e.get(f.from)??[];m.push(f.to),e.set(f.from,m)}let s=new Set,a=[o];while(a.length>0){let f=a.shift();if(!f||s.has(f))continue;s.add(f);for(let m of e.get(f)??[])a.push(m)}return s}function n(o,r){d(r,o);let e=v(o),s=[...e.definition.steps],a=[...e.definition.transitions],f=new Set(r.hiddenSteps??[]);if(f.forEach((l)=>{let t=s.findIndex((p)=>p.id===l);if(t!==-1)s.splice(t,1)}),f.size)a=a.filter((l)=>!f.has(l.from)&&!f.has(l.to));r.customSteps?.forEach((l)=>{S(s,l),$(a,l)}),e.definition.steps=s,e.definition.transitions=E(a),e.metadata=h(e.metadata,r.metadata),e.annotations=h(e.annotations,r.annotations);let w=i(e).filter((l)=>l.level==="error");if(w.length>0)throw Error(`Invalid composed workflow ${e.meta.key}.v${e.meta.version}: ${w.map((l)=>l.message).join("; ")}`);return e}function S(o,r){let e=y(o,r);if(e===-1)throw Error(`Unable to place injected step "${r.inject.id}"`);o.splice(e,0,{...r.inject})}function y(o,r){if(r.after){let e=o.findIndex((s)=>s.id===r.after);return e===-1?-1:e+1}if(r.before){let e=o.findIndex((s)=>s.id===r.before);return e===-1?-1:e}return o.length}function $(o,r){if(!r.inject.id)return;if(r.transitionFrom)o.push({from:r.transitionFrom,to:r.inject.id,condition:r.when});if(r.transitionTo)o.push({from:r.inject.id,to:r.transitionTo,condition:r.when})}function E(o){let r=new Set,e=[];return o.forEach((s)=>{let a=`${s.from}->${s.to}:${s.condition??""}`;if(r.has(a))return;r.add(a),e.push(s)}),e}function v(o){return JSON.parse(JSON.stringify(o))}function h(o,r){if(!o&&!r)return;return{...o??{},...r??{}}}function k(o){return[...o].sort((r,e)=>{let s=(r.priority??0)-(e.priority??0);if(s!==0)return s;let a=r.workflow.localeCompare(e.workflow);if(a!==0)return a;let f=(r.tenantId??"").localeCompare(e.tenantId??"");if(f!==0)return f;let m=(r.role??"").localeCompare(e.role??"");if(m!==0)return m;let w=(r.device??"").localeCompare(e.device??"");if(w!==0)return w;return(r.baseVersion??"").localeCompare(e.baseVersion??"")})}class W{extensions=[];register(o){return this.extensions.push(o),this}registerMany(o){return o.forEach((r)=>{this.register(r)}),this}compose(o){return k(this.extensions.filter((e)=>T(o,e))).reduce((e,s)=>n(e,s),o.base)}}function T(o,r){if(r.workflow!==o.base.meta.key)return!1;if(r.baseVersion&&!x(o.base.meta.version,r.baseVersion))return!1;if(r.tenantId&&r.tenantId!==o.tenantId)return!1;if(r.role&&r.role!==o.role)return!1;if(r.device&&r.device!==o.device)return!1;return!0}function M(o){return{id:o.id,label:o.label,type:o.type??"human",description:o.description??"Tenant-specific approval",action:o.action,guard:o.guardExpression?{type:"expression",value:o.guardExpression}:void 0}}import{defineFeature as b}from"@contractspec/lib.contracts-spec/features";var D=b({meta:{key:"libs.workflow-composer",version:"1.0.0",title:"Workflow Composer",description:"Tenant-aware workflow composition helpers for ContractSpec.",domain:"workflow-composer",owners:["@contractspec-core"],tags:["package","libs","workflow-composer"],stability:"experimental"}});export{d as validateExtension,k as mergeExtensions,M as approvalStepTemplate,n as applyWorkflowExtension,D as WorkflowComposerFeature,W as WorkflowComposer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const WorkflowComposerFeature: import("@contractspec/lib.contracts-spec").FeatureModuleSpec;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/lib.workflow-composer",
|
|
3
|
-
"version": "3.7.
|
|
3
|
+
"version": "3.7.22",
|
|
4
4
|
"description": "Tenant-aware workflow composition helpers for ContractSpec.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"contractspec",
|
|
@@ -31,14 +31,14 @@
|
|
|
31
31
|
"typecheck": "tsc --noEmit"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@contractspec/lib.contracts-spec": "5.
|
|
35
|
-
"@contractspec/lib.ai-providers": "3.7.
|
|
34
|
+
"@contractspec/lib.contracts-spec": "5.5.1",
|
|
35
|
+
"@contractspec/lib.ai-providers": "3.7.15",
|
|
36
36
|
"compare-versions": "^6.1.1"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@contractspec/tool.typescript": "3.7.13",
|
|
40
40
|
"typescript": "^5.9.3",
|
|
41
|
-
"@contractspec/tool.bun": "3.7.
|
|
41
|
+
"@contractspec/tool.bun": "3.7.17"
|
|
42
42
|
},
|
|
43
43
|
"exports": {
|
|
44
44
|
".": {
|