@novu/framework 0.24.3-alpha.5 → 0.24.3-alpha.6

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/express.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { i as SupportedFrameworkName, S as ServeHandlerOptions } from './handler-58kccf2b.js';
1
+ import { i as SupportedFrameworkName, S as ServeHandlerOptions } from './handler-jSdMUIfN.js';
2
2
  import 'ajv';
3
3
  import 'json-schema-to-ts';
4
4
 
package/dist/express.js CHANGED
@@ -2,27 +2,27 @@
2
2
 
3
3
  var crypto = require('crypto');
4
4
  var Ie = require('ajv');
5
- var Te = require('ajv-formats');
6
- var we = require('better-ajv-errors');
5
+ var he = require('ajv-formats');
6
+ var Te = require('better-ajv-errors');
7
7
  var jsonSchemaFaker = require('json-schema-faker');
8
- var re = require('ora');
9
- var N = require('chalk');
8
+ var te = require('ora');
9
+ var f = require('chalk');
10
10
  var liquidjs = require('liquidjs');
11
11
 
12
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
13
 
14
14
  var Ie__default = /*#__PURE__*/_interopDefault(Ie);
15
+ var he__default = /*#__PURE__*/_interopDefault(he);
15
16
  var Te__default = /*#__PURE__*/_interopDefault(Te);
16
- var we__default = /*#__PURE__*/_interopDefault(we);
17
- var re__default = /*#__PURE__*/_interopDefault(re);
18
- var N__default = /*#__PURE__*/_interopDefault(N);
17
+ var te__default = /*#__PURE__*/_interopDefault(te);
18
+ var f__default = /*#__PURE__*/_interopDefault(f);
19
19
 
20
- var k=(s=>(s.EXECUTE="execute",s.PREVIEW="preview",s.SYNC="sync",s.DIFF="diff",s))(k||{}),L=(r=>(r.DISCOVER="discover",r.HEALTH_CHECK="health-check",r.CODE="code",r))(L||{});var ae="https://api.novu.co";var O=(c=>(c.WORKFLOW_NOT_FOUND_ERROR="WorkflowNotFoundError",c.WORKFLOW_ALREADY_EXISTS_ERROR="WorkflowAlreadyExistsError",c.WORKFLOW_EXECUTION_FAILED_ERROR="WorkflowExecutionFailedError",c.EXECUTION_STATE_OUTPUT_INVALID_ERROR="ExecutionStateOutputInvalidError",c.EXECUTION_STATE_RESULT_INVALID_ERROR="ExecutionStateResultInvalidError",c.EXECUTION_PROVIDER_OUTPUT_INVALID_ERROR="ExecutionProviderOutputInvalidError",c.PROVIDER_NOT_FOUND_ERROR="ProviderNotFoundError",c.PROVIDER_EXECUTION_FAILED_ERROR="ProviderExecutionFailedError",c.STEP_NOT_FOUND_ERROR="StepNotFoundError",c.STEP_ALREADY_EXISTS_ERROR="StepAlreadyExistsError",c.STEP_EXECUTION_FAILED_ERROR="StepExecutionFailedError",c.EXECUTION_STATE_CORRUPT_ERROR="ExecutionStateCorruptError",c.EXECUTION_EVENT_DATA_INVALID_ERROR="ExecutionEventDataInvalidError",c.EXECUTION_EVENT_INPUT_INVALID_ERROR="ExecutionEventInputInvalidError",c.EXECUTION_STATE_INPUT_INVALID_ERROR="ExecutionStateInputInvalidError",c.METHOD_NOT_ALLOWED_ERROR="MethodNotAllowedError",c.INVALID_ACTION_ERROR="InvalidActionError",c.MISSING_API_KEY_ERROR="MissingApiKeyError",c.SIGNATURE_MISMATCH_ERROR="SignatureMismatchError",c.SIGNATURE_NOT_FOUND_ERROR="SignatureNotFoundError",c.SIGNATURE_INVALID_ERROR="SignatureInvalidError",c.SIGNATURE_EXPIRED_ERROR="SignatureExpiredError",c.SIGNING_KEY_NOT_FOUND_ERROR="SigningKeyNotFoundError",c.PLATFORM_ERROR="PlatformError",c.SIGNATURE_VERSION_INVALID_ERROR="SignatureVersionInvalidError",c))(O||{});var P=(r=>(r.POST="POST",r.GET="GET",r.OPTIONS="OPTIONS",r))(P||{});var I=class extends Error{data},b=class extends I{statusCode=404},R=class extends I{statusCode=400},T=class extends I{statusCode=401},A=class extends I{statusCode=500},F=class extends I{statusCode=409};var W=class extends R{code="ExecutionStateCorruptError";constructor(e,t){super(`Workflow with id: \`${e}\` has a corrupt state. Step with id: \`${t}\` does not exist. Please provide the missing state.`),this.data={workflowId:e,stepId:t};}},$=class extends R{code="ExecutionEventDataInvalidError";constructor(e,t){super(`Workflow with id: \`${e}\` has invalid \`data\`. Please provide the correct event data.`),this.data=t;}},m=class extends R{code="ExecutionEventInputInvalidError";constructor(e,t){super(`Workflow with id: \`${e}\` has invalid \`inputs\`. Please provide the correct event inputs.`),this.data=t;}},M=class extends R{code="ExecutionStateInputInvalidError";constructor(e,t,r){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` has invalid input. Please provide the correct step input.`),this.data=r;}},V=class extends R{code="ExecutionStateOutputInvalidError";constructor(e,t,r){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` has invalid output. Please provide the correct step output.`),this.data=r;}},G=class extends R{code="ExecutionStateResultInvalidError";constructor(e,t,r){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` has invalid result. Please provide the correct step result.`),this.data=r;}},K=class extends R{code="ExecutionProviderOutputInvalidError";constructor(e,t,r,s){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` and provider with id: \`${r}\` has invalid output. Please provide the correct provider output.`),this.data=s;}};var d={info:o=>N__default.default.blue(o),warning:o=>N__default.default.yellow(o),error:o=>N__default.default.red(o),success:o=>N__default.default.green(o),underline:o=>N__default.default.underline(o),bold:o=>N__default.default.bold(o)},l={SUCCESS:d.success("\u2714"),ERROR:d.error("\u2717"),WARNING:d.warning("\u26A0"),INFO:d.info("\u2139"),ARROW:d.bold("\u2192"),MOCK:d.info("\u25CB"),HYDRATED:d.bold(d.info("\u2192")),STEP:d.info("\u03C3"),ACTION:d.info("\u03B1"),DURATION:d.info("\u0394"),PROVIDER:d.info("\u2699"),OUTPUT:d.info("\u21E2"),INPUT:d.info("\u21E0"),WORKFLOW:d.info("\u03C9"),STATE:d.info("\u03C3"),EXECUTE:d.info("\u03B5"),PREVIEW:d.info("\u03C1")};var ie=o=>Object.values(o).map(e=>`\`${e}\``).join(", "),j=o=>o.replaceAll(/(\w)(\w*)/g,(e,t,r)=>t.toUpperCase()+r.toLowerCase()).replaceAll(/[\s-]+/g,"");var Y=class extends I{code="MethodNotAllowedError";statusCode=405;message=`Method not allowed. Please use one of ${ie(P)}`},y=class extends R{code="InvalidActionError";constructor(e,t){super(`Invalid query string: \`action\`=\`${e}\`. Please use one of ${ie(t)}`);}},S=class extends R{code="MissingApiKeyError";constructor(){super("API Key is missing. Please add the API Key during Client initialization.");}};var X=class extends A{code="PlatformError";message="Something went wrong. Please try again later."};var C=class extends F{constructor(e,t){super(`${j(e)} with id: \`${t}\` already exists. Please use a different id.`);}},w=class extends b{constructor(e,t){super(`${j(e)} with id: \`${t}\` does not exist. Please provide a valid id.`);}},g=class extends A{constructor(e,t){super(`Failed to execute ${j(e)} with id: \`${t}\`. Please try again later.`);}};var B=class extends w{code="ProviderNotFoundError";constructor(e){super("provider",e);}},q=class extends g{code="ProviderExecutionFailedError";constructor(e){super("workflow",e);}};var J=class extends T{code="SignatureMismatchError";constructor(){super("Signature does not match the expected signature. Please ensure the signature provided in the `x-novu-signature` header is correct and try again.");}},Q=class extends T{code="SignatureNotFoundError";constructor(){super("Signature not found. Please provide a signature in the `x-novu-signature` header");}},z=class extends T{code="SignatureInvalidError";constructor(){super("Signature is invalid. Please provide a valid signature in the `x-novu-signature` header");}},Z=class extends T{code="SignatureExpiredError";constructor(){super(`Signature expired. Please provide a signature with a timestamp no older than ${5} minutes in the \`x-novu-signature\` header`);}},H=class extends T{code="SigningKeyNotFoundError";constructor(){super("Signature key not found. Please provide a valid key in the Client constructor `config.apiKey`");}};var ee=class extends w{code="StepNotFoundError";constructor(e){super("step",e);}};var U=class extends w{code="WorkflowNotFoundError";constructor(e){super("workflow",e);}},te=class extends C{code="WorkflowAlreadyExistsError";constructor(e){super("workflow",e);}};var le={name:"@novu/framework",version:"0.24.3-alpha.5",description:"The Code-First Notifications Workflow SDK.",main:"./dist/index.js",types:"./dist/index.d.ts",publishConfig:{registry:"https://registry.npmjs.org",access:"public"},private:!1,repository:{type:"git",url:"git+https://github.com/novuhq/novu.git"},files:["dist","README.md"],scripts:{preinstall:"npx only-allow pnpm",test:"vitest","test:watch":"vitest --watch",lint:"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix",format:"prettier --check --ignore-path .gitignore .","format:fix":"prettier --write --ignore-path .gitignore .",build:"tsup","build:watch":"tsup --watch","$comment:bump:prerelease":"This is a workaround to support `npm version prerelease` with lerna","bump:prerelease":"npm version prerelease --preid=alpha & PID=$!; (sleep 1 && kill -9 $PID) & wait $PID","release:alpha":"pnpm bump:prerelease || pnpm build && npm publish --dry-run"},keywords:["novu","code-first","workflows","durable","sdk","notifications","email","sms","push","webhooks","next","nuxt","h3","express"],author:"Novu",license:"MIT",exports:{".":{require:"./dist/index.js",import:"./dist/index.js",types:"./dist/index.d.ts"},"./express":{require:"./dist/express.js",import:"./dist/express.js",types:"./dist/express.d.ts"},"./next":{require:"./dist/next.js",import:"./dist/next.js",types:"./dist/next.d.ts"},"./nuxt":{require:"./dist/nuxt.js",import:"./dist/nuxt.js",types:"./dist/nuxt.d.ts"},"./h3":{require:"./dist/h3.js",import:"./dist/h3.js",types:"./dist/h3.d.ts"},"./sveltekit":{require:"./dist/sveltekit.js",import:"./dist/sveltekit.js",types:"./dist/sveltekit.d.ts"},"./remix":{require:"./dist/remix.js",import:"./dist/remix.js",types:"./dist/remix.d.ts"}},devDependencies:{"@sveltejs/kit":"^2.5.10","@types/express":"^4.17.13","@types/json-schema":"^7.0.15","@types/node":"^20.11.20","@vercel/node":"^2.15.9",express:"^4.18.2",h3:"^1.11.1",next:"^13.5.4",prettier:"^3.2.5","ts-node":"^10.9.2",tsup:"^8.0.2",typescript:"^5.3.3",vitest:"^1.2.1"},dependencies:{ajv:"^8.12.0","ajv-formats":"^2.1.1","better-ajv-errors":"^1.2.0",chalk:"^4.1.2","cross-fetch":"^4.0.0","json-schema-faker":"^0.5.6","json-schema-to-ts":"^3.0.0",liquidjs:"^10.13.1",ora:"^5.4.1"}};var ne=le.version;jsonSchemaFaker.JSONSchemaFaker.option({useDefaultValue:!0,alwaysFakeOptionals:!0});var se=class{discoveredWorkflows=[];ajv;templateEngine=new liquidjs.Liquid;apiUrl;apiKey;version=ne;strictAuthentication;static NOVU_SIGNATURE_HEADER="x-novu-signature";constructor(e){let t=this.buildOptions(e);this.apiKey=t.apiKey,this.apiUrl=t.apiUrl,this.strictAuthentication=t.strictAuthentication;let r=new Ie__default.default({useDefaults:!0});Te__default.default(r),this.ajv=r;}buildOptions(e){let t={apiKey:void 0,apiUrl:ae,strictAuthentication:!0};return e?.apiKey!==void 0?t.apiKey=e.apiKey:process.env.NOVU_API_KEY!==void 0&&(t.apiKey=process.env.NOVU_API_KEY),e?.apiUrl!==void 0?t.apiUrl=e.apiUrl:process.env.NOVU_API_URL!==void 0&&(t.apiUrl=process.env.NOVU_API_URL),e?.strictAuthentication!==void 0?t.strictAuthentication=e.strictAuthentication:process.env.NOVU_STRICT_AUTHENTICATION!==void 0&&(t.strictAuthentication=process.env.NOVU_STRICT_AUTHENTICATION==="true"),t}addWorkflows(e){for(let t of e){if(this.discoveredWorkflows.some(r=>r.workflowId===t.workflowId))throw new te(t.workflowId);this.discoveredWorkflows.push(t);}}healthCheck(){let e=this.discoveredWorkflows.length,t=this.discoveredWorkflows.reduce((r,s)=>r+s.steps.length,0);return {status:"ok",version:ne,discovered:{workflows:e,steps:t}}}getWorkflow(e){let t=this.discoveredWorkflows.find(r=>r.workflowId===e);if(t)return t;throw new U(e)}getStep(e,t){let s=this.getWorkflow(e).steps.find(i=>i.stepId===t);if(s)return s;throw new ee(t)}getRegisteredWorkflows(){return this.discoveredWorkflows}discover(){return {workflows:this.getRegisteredWorkflows()}}getHeaders(e){let t={"content-type":"application/json",authorization:`ApiKey ${this.apiKey}`};return e&&(t["x-novu-anonymous"]=e),t}async diff(e,t){let r=this.discover()?.workflows||[];return (await fetch(this.apiUrl+"/v1/bridge/diff",{method:"POST",headers:this.getHeaders(t),body:JSON.stringify({workflows:r,bridgeUrl:e})})).json()}async sync(e,t,r){let{workflows:s}=this.discover();return (await fetch(`${this.apiUrl}/v1/bridge/sync?source=${r||"sdk"}`,{method:"POST",headers:this.getHeaders(t),body:JSON.stringify({workflows:s,bridgeUrl:e})})).json()}mock(e){return jsonSchemaFaker.JSONSchemaFaker.generate(e)}validate(e,t,r,s,i,a,n,u){if(!t(e)){let p=we__default.default(r,e,t.errors||[]);switch(console.error(`
21
- ${p}`),s){case"event":this.validateEvent(i,a,t);case"step":this.validateStep(n,i,a,t);case"provider":this.validateProvider(n,u,i,a,t);}}}validateProvider(e,t,r,s,i){if(!e)throw new Error("stepId is required");if(!t)throw new Error("providerId is required");switch(r){case"output":throw new K(s,e,t,i.errors);default:throw new Error(`Invalid payload type: '${r}'`)}}validateStep(e,t,r,s){if(!e)throw new Error("stepId is required");switch(t){case"output":throw new V(r,e,s.errors);case"result":throw new G(r,e,s.errors);case"input":throw new M(r,e,s.errors);default:throw new Error(`Invalid payload type: '${t}'`)}}validateEvent(e,t,r){switch(e){case"input":throw new m(t,r.errors);case"data":throw new $(t,r.errors);default:throw new Error(`Invalid payload type: '${e}'`)}}executeStepFactory(e,t){return async(r,s,i)=>{let a=this.getStep(e.workflowId,r),n=fe(e),u=this.createStepInputs(a,n),h=e.action==="preview";if(!h&&await this.shouldSkip(i?.skip,u))return t({options:{skip:!0}}),{};let p=this.previewStep.bind(this),E=this.executeStep.bind(this),D=await(h?p:E)(e,{...a,providers:a.providers.map(f=>{let v=i?.providers?.[f.type];if(!v)throw new B(f.type);return {...f,resolve:v}}),resolve:s});return r===e.stepId&&t(D),D.outputs}}async shouldSkip(e,t){return e?e(t):!1}async executeWorkflow(e){let s=`${{execute:"Executing",preview:"Previewing"}[e.action]} workflowId:`;console.log(`
22
- ${d.bold(d.underline(s))} '${e.workflowId}'`);let i=this.getWorkflow(e.workflowId),a=process.hrtime(),n={outputs:{},providers:{},options:{}},u,h=new Promise(_=>{u=_;}),p=_=>{u(),n=_;},E;try{if(e.action==="execute"&&!e.data)throw new m(e.workflowId,{message:"Event `data` is required"});let _=this.createExecutionInputs(e,i);await Promise.race([h,i.execute({payload:_,environment:{},input:{},subscriber:e.subscriber,step:{email:this.executeStepFactory(e,p),sms:this.executeStepFactory(e,p),inApp:this.executeStepFactory(e,p),digest:this.executeStepFactory(e,p),delay:this.executeStepFactory(e,p),push:this.executeStepFactory(e,p),chat:this.executeStepFactory(e,p),custom:this.executeStepFactory(e,p)}})]);}catch(_){E=_;}let x=process.hrtime(a),D=x[0],f=x[1],v=D*1e3+f/1e6,Re=E?l.ERROR:l.SUCCESS,Ee=e.action==="execute"?"Executed":e.action==="preview"?"Previewed":"Invalid action";if(console.log(`${Re} ${Ee} workflowId: \`${e.workflowId}\``),this.prettyPrintExecute(e,v,E),E)throw E;return {outputs:n.outputs,providers:n.providers,options:n.options,metadata:{status:"success",error:!1,duration:v}}}createExecutionInputs(e,t){let r=e.data;return this.validate(e.data,t.data.validate,t.data.schema,"event","input",e.workflowId),r}prettyPrintExecute(e,t,r){let s=r?l.ERROR:l.SUCCESS,i=e.action==="execute"?"Executed":e.action==="preview"?"Previewed":"Invalid action",a=r?"Failed to execute":i,n=r?d.error:d.success,u=`${s} ${a} workflowId: '${e.workflowId}`;console.log(`
23
- ${d.bold(n(u))}'`),console.log(` \u251C ${l.STEP} stepId: '${e.stepId}'`),console.log(` \u251C ${l.ACTION} action: '${e.action}'`),console.log(` \u2514 ${l.DURATION} duration: '${t.toFixed(2)}ms'
24
- `);}async executeProviders(e,t){return t.providers.reduce(async(r,s)=>{let i=await r,a=this.previewProvider.bind(this),n=this.executeProvider.bind(this),h=await(e.action==="preview"?a:n)(e,t,s);return {...i,[s.type]:h}},Promise.resolve({}))}previewProvider(e,t,r){return console.log(` ${l.MOCK} Mocked provider: \`${r.type}\``),this.mock(r.outputs.schema)}async executeProvider(e,t,r){let s=re__default.default({indent:2}).start(`Executing provider: \`${r.type}\``);try{if(e.stepId===t.stepId){let i=this.createStepInputs(t,e),a=await r.resolve({inputs:i});return this.validate(a,r.outputs.validate,r.outputs.schema,"step","output",e.workflowId,t.stepId,r.type),s.succeed(`Executed provider: \`${r.type}\``),a}else s.stopAndPersist({symbol:l.HYDRATED,text:`Hydrated provider: \`${r.type}\``});}catch(i){throw s.stopAndPersist({symbol:l.ERROR,text:`Failed to execute provider: \`${r.type}\``}),new q(`Failed to execute provider: '${r.type}'.
25
- ${i.message}`)}}async executeStep(e,t){if(e.stepId===t.stepId){let r=re__default.default({indent:1}).start(`Executing stepId: \`${t.stepId}\``);try{let s=this.createStepInputs(t,e),i=await this.compileInputs(s,e),a=await t.resolve(i);this.validate(a,t.outputs.validate,t.outputs.schema,"step","output",e.workflowId,t.stepId);let n=await this.executeProviders(e,t);return r.succeed(`Executed stepId: \`${t.stepId}\``),{outputs:a,providers:n}}catch(s){throw r.stopAndPersist({prefixText:"",symbol:l.ERROR,text:`Failed to execute stepId: \`${t.stepId}\``}),s}}else {let r=re__default.default({indent:1}).start(`Hydrating stepId: \`${t.stepId}\``);try{let s=e.state.find(i=>i.stepId===t.stepId);if(s)return this.validate(s.outputs,t.results.validate,t.results.schema,"step","result",e.workflowId,t.stepId),r.stopAndPersist({symbol:l.HYDRATED,text:`Hydrated stepId: \`${t.stepId}\``}),{outputs:s.outputs,providers:await this.executeProviders(e,t)};throw new W(e.workflowId,t.stepId)}catch(s){throw r.stopAndPersist({symbol:l.ERROR,text:`Failed to hydrate stepId: \`${t.stepId}\``}),s}}}async compileInputs(e,t){let r=this.templateEngine.parse(JSON.stringify(e)),s=await this.templateEngine.render(r,{...t.data,subscriber:t.subscriber});return JSON.parse(s)}createStepInputs(e,t){let r=t.inputs;return this.validate(r,e.inputs.validate,e.inputs.schema,"step","input",t.workflowId,e.stepId),r}async previewStep(e,t){let r=re__default.default({indent:1}).start(`Previewing stepId: \`${t.stepId}\``);try{if(e.stepId===t.stepId){let s=this.createStepInputs(t,e),i=await t.resolve(s);return this.validate(i,t.outputs.validate,t.outputs.schema,"step","output",e.workflowId,t.stepId),r.stopAndPersist({symbol:l.MOCK,text:`Mocked stepId: \`${t.stepId}\``}),{outputs:i,providers:await this.executeProviders(e,t)}}else {let s=this.mock(t.results.schema);return r.stopAndPersist({symbol:l.MOCK,text:`Mocked stepId: \`${t.stepId}\``}),{outputs:s,providers:await this.executeProviders(e,t)}}}catch(s){throw r.stopAndPersist({symbol:l.ERROR,text:`Failed to preview stepId: \`${t.stepId}\``}),s}}getStepCode(e,t){return {code:this.getStep(e,t).resolve.toString()}}getWorkflowCode(e){return {code:this.getWorkflow(e).execute.toString()}}getCode(e,t){let r;if(e)t?r=this.getStepCode(e,t):r=this.getWorkflowCode(e);else throw new U(e);return r}};function fe(o){return JSON.parse(JSON.stringify(o))}var oe=class{frameworkName;handler;client;hmacEnabled;constructor(e){this.handler=e.handler,this.client=e.client?e.client:new se,this.client.addWorkflows(e.workflows),this.frameworkName=e.frameworkName,this.hmacEnabled=this.client.strictAuthentication;}createHandler(){return async(...e)=>{let t=await this.handler(...e),r=await this.handleAction({actions:t});return t.transformResponse(r)}}getStaticHeaders(){let e=`novu-framework:v${this.client.version}`;return {"content-type":"application/json","access-control-allow-origin":"*","access-control-allow-methods":"GET, POST","access-control-allow-headers":"*","access-control-max-age":"604800","x-novu-framework":this.frameworkName,"user-agent":e,"x-novu-sdk":e}}createResponse(e,t,r={}){return {status:e,body:JSON.stringify(t),headers:{...this.getStaticHeaders(),...r}}}createError(e){return {status:e.statusCode,body:JSON.stringify({message:e.message,data:e.data,code:e.code}),headers:this.getStaticHeaders()}}async handleAction({actions:e}){let t=await e.url(),r=await e.method(),s=t.searchParams.get("action")||"",i=t.searchParams.get("workflowId")||"",a=t.searchParams.get("stepId")||"",n=await e.headers("x-novu-signature")||"",u=await e.headers("x-novu-anonymous")||"",h=t.searchParams.get("source")||"",p={};try{r==="POST"&&(p=await e.body());}catch{}try{s!=="health-check"&&this.validateHmac(p,n);let E=this.getPostActionMap(p,i,a,s,u,h),x=this.getGetActionMap(i,a);if(r==="POST")return await this.handlePostAction(s,E);if(r==="GET")return await this.handleGetAction(s,x);if(r==="OPTIONS")return this.createResponse(200,{},{...this.getStaticHeaders()})}catch(E){return this.handleError(E)}return this.createError(new Y(r))}getPostActionMap(e,t,r,s,i,a){return {execute:async()=>{let n=await this.client.executeWorkflow({...e,workflowId:t,stepId:r,action:s});return this.createResponse(200,n,{"x-novu-execution-duration":n.metadata.duration.toString()})},preview:async()=>{let n=await this.client.executeWorkflow({...e,workflowId:t,stepId:r,action:s});return this.createResponse(200,n,{"x-novu-execution-duration":n.metadata.duration.toString()})},sync:async()=>{if(!this.client.apiKey)throw new S;let n=await this.client.sync(e.bridgeUrl,i,a);return this.createResponse(200,n)},diff:async()=>{if(!this.client.apiKey)throw new S;let n=await this.client.diff(e.bridgeUrl,i);return this.createResponse(200,n)}}}getGetActionMap(e,t){return {discover:async()=>{let r=await this.client.discover();return this.createResponse(200,r)},"health-check":async()=>{let r=await this.client.healthCheck();return this.createResponse(200,r)},code:async()=>{let r=await this.client.getCode(e,t);return this.createResponse(200,r)}}}async handlePostAction(e,t){if(Object.values(k).includes(e)){let r=t[e];return r()}else throw new y(e,k)}async handleGetAction(e,t){if(Object.values(L).includes(e)){let r=t[e];return r()}else throw new y(e,L)}isClientError(e){return Object.values(O).includes(e.code)}handleError(e){return this.isClientError(e)?(e.statusCode===500&&console.error(e),this.createError(e)):(console.error(e),this.createError(new X))}validateHmac(e,t){if(!this.hmacEnabled)return;if(!t)throw new Q;if(!this.client.apiKey)throw new H;let[r,s]=t.split(",");if(!r||!s)throw new z;let[i,a]=r.split("="),[n,u]=s.split("=");if(Number(i)<Date.now()-1500)throw new Z;if(!(this.hashHmac(this.client.apiKey,`${a}.${JSON.stringify(e)}`)===u))throw new J}hashHmac(e,t){return crypto.createHmac("sha256",e).update(t).digest("hex")}};var ge="express",pr=o=>new oe({frameworkName:ge,...o,handler:(t,r)=>({body:()=>t.body,headers:s=>{let i=t.headers[s];return Array.isArray(i)?i[0]:i},method:()=>t.method||"GET",url:()=>{let s=t.headers.host||"",i=s?.includes("://")?"":`${t.protocol||"https"}://`;return new URL(t.originalUrl||t.url||"",`${i}${s||""}`)},queryString:s=>{let i=t.query[s];return Array.isArray(i)?i[0]:i},transformResponse:({body:s,headers:i,status:a})=>(Object.entries(i).forEach(([n,u])=>{r.setHeader(n,u);}),r.status(a).send(s))})}).createHandler();
20
+ var U=(t=>(t.EXECUTE="execute",t.PREVIEW="preview",t))(U||{}),D=(r=>(r.DISCOVER="discover",r.HEALTH_CHECK="health-check",r.CODE="code",r))(D||{});var ne="https://api.novu.co";var O=(c=>(c.WORKFLOW_NOT_FOUND_ERROR="WorkflowNotFoundError",c.WORKFLOW_ALREADY_EXISTS_ERROR="WorkflowAlreadyExistsError",c.WORKFLOW_EXECUTION_FAILED_ERROR="WorkflowExecutionFailedError",c.EXECUTION_STATE_OUTPUT_INVALID_ERROR="ExecutionStateOutputInvalidError",c.EXECUTION_STATE_RESULT_INVALID_ERROR="ExecutionStateResultInvalidError",c.EXECUTION_PROVIDER_OUTPUT_INVALID_ERROR="ExecutionProviderOutputInvalidError",c.PROVIDER_NOT_FOUND_ERROR="ProviderNotFoundError",c.PROVIDER_EXECUTION_FAILED_ERROR="ProviderExecutionFailedError",c.STEP_NOT_FOUND_ERROR="StepNotFoundError",c.STEP_ALREADY_EXISTS_ERROR="StepAlreadyExistsError",c.STEP_EXECUTION_FAILED_ERROR="StepExecutionFailedError",c.EXECUTION_STATE_CORRUPT_ERROR="ExecutionStateCorruptError",c.EXECUTION_EVENT_DATA_INVALID_ERROR="ExecutionEventDataInvalidError",c.EXECUTION_EVENT_INPUT_INVALID_ERROR="ExecutionEventInputInvalidError",c.EXECUTION_STATE_INPUT_INVALID_ERROR="ExecutionStateInputInvalidError",c.METHOD_NOT_ALLOWED_ERROR="MethodNotAllowedError",c.INVALID_ACTION_ERROR="InvalidActionError",c.MISSING_API_KEY_ERROR="MissingApiKeyError",c.SIGNATURE_MISMATCH_ERROR="SignatureMismatchError",c.SIGNATURE_NOT_FOUND_ERROR="SignatureNotFoundError",c.SIGNATURE_INVALID_ERROR="SignatureInvalidError",c.SIGNATURE_EXPIRED_ERROR="SignatureExpiredError",c.SIGNING_KEY_NOT_FOUND_ERROR="SigningKeyNotFoundError",c.PLATFORM_ERROR="PlatformError",c.SIGNATURE_VERSION_INVALID_ERROR="SignatureVersionInvalidError",c))(O||{});var k=(r=>(r.POST="POST",r.GET="GET",r.OPTIONS="OPTIONS",r))(k||{});var h=class extends Error{data},L=class extends h{statusCode=404},E=class extends h{statusCode=400},T=class extends h{statusCode=401},N=class extends h{statusCode=500},b=class extends h{statusCode=409};var F=class extends E{code="ExecutionStateCorruptError";constructor(e,t){super(`Workflow with id: \`${e}\` has a corrupt state. Step with id: \`${t}\` does not exist. Please provide the missing state.`),this.data={workflowId:e,stepId:t};}},W=class extends E{code="ExecutionEventDataInvalidError";constructor(e,t){super(`Workflow with id: \`${e}\` has invalid \`data\`. Please provide the correct event data.`),this.data=t;}},P=class extends E{code="ExecutionEventInputInvalidError";constructor(e,t){super(`Workflow with id: \`${e}\` has invalid \`inputs\`. Please provide the correct event inputs.`),this.data=t;}},$=class extends E{code="ExecutionStateInputInvalidError";constructor(e,t,r){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` has invalid input. Please provide the correct step input.`),this.data=r;}},M=class extends E{code="ExecutionStateOutputInvalidError";constructor(e,t,r){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` has invalid output. Please provide the correct step output.`),this.data=r;}},V=class extends E{code="ExecutionStateResultInvalidError";constructor(e,t,r){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` has invalid result. Please provide the correct step result.`),this.data=r;}},G=class extends E{code="ExecutionProviderOutputInvalidError";constructor(e,t,r,s){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` and provider with id: \`${r}\` has invalid output. Please provide the correct provider output.`),this.data=s;}};var d={info:o=>f__default.default.blue(o),warning:o=>f__default.default.yellow(o),error:o=>f__default.default.red(o),success:o=>f__default.default.green(o),underline:o=>f__default.default.underline(o),bold:o=>f__default.default.bold(o)},l={SUCCESS:d.success("\u2714"),ERROR:d.error("\u2717"),WARNING:d.warning("\u26A0"),INFO:d.info("\u2139"),ARROW:d.bold("\u2192"),MOCK:d.info("\u25CB"),HYDRATED:d.bold(d.info("\u2192")),STEP:d.info("\u03C3"),ACTION:d.info("\u03B1"),DURATION:d.info("\u0394"),PROVIDER:d.info("\u2699"),OUTPUT:d.info("\u21E2"),INPUT:d.info("\u21E0"),WORKFLOW:d.info("\u03C9"),STATE:d.info("\u03C3"),EXECUTE:d.info("\u03B5"),PREVIEW:d.info("\u03C1")};var oe=o=>Object.values(o).map(e=>`\`${e}\``).join(", "),K=o=>o.replaceAll(/(\w)(\w*)/g,(e,t,r)=>t.toUpperCase()+r.toLowerCase()).replaceAll(/[\s-]+/g,"");var j=class extends h{code="MethodNotAllowedError";statusCode=405;message=`Method not allowed. Please use one of ${oe(k)}`},m=class extends E{code="InvalidActionError";constructor(e,t){super(`Invalid query string: \`action\`=\`${e}\`. Please use one of ${oe(t)}`);}};var X=class extends N{code="PlatformError";message="Something went wrong. Please try again later."};var C=class extends b{constructor(e,t){super(`${K(e)} with id: \`${t}\` already exists. Please use a different id.`);}},_=class extends L{constructor(e,t){super(`${K(e)} with id: \`${t}\` does not exist. Please provide a valid id.`);}},x=class extends N{constructor(e,t){super(`Failed to execute ${K(e)} with id: \`${t}\`. Please try again later.`);}};var Y=class extends _{code="ProviderNotFoundError";constructor(e){super("provider",e);}},B=class extends x{code="ProviderExecutionFailedError";constructor(e){super("workflow",e);}};var q=class extends T{code="SignatureMismatchError";constructor(){super("Signature does not match the expected signature. Please ensure the signature provided in the `x-novu-signature` header is correct and try again.");}},J=class extends T{code="SignatureNotFoundError";constructor(){super("Signature not found. Please provide a signature in the `x-novu-signature` header");}},Q=class extends T{code="SignatureInvalidError";constructor(){super("Signature is invalid. Please provide a valid signature in the `x-novu-signature` header");}},z=class extends T{code="SignatureExpiredError";constructor(){super(`Signature expired. Please provide a signature with a timestamp no older than ${5} minutes in the \`x-novu-signature\` header`);}},Z=class extends T{code="SigningKeyNotFoundError";constructor(){super("Signature key not found. Please provide a valid key in the Client constructor `config.apiKey`");}};var H=class extends _{code="StepNotFoundError";constructor(e){super("step",e);}};var S=class extends _{code="WorkflowNotFoundError";constructor(e){super("workflow",e);}},ee=class extends C{code="WorkflowAlreadyExistsError";constructor(e){super("workflow",e);}};var pe={name:"@novu/framework",version:"0.24.3-alpha.6",description:"The Code-First Notifications Workflow SDK.",main:"./dist/index.js",types:"./dist/index.d.ts",publishConfig:{registry:"https://registry.npmjs.org",access:"public"},private:!1,repository:{type:"git",url:"git+https://github.com/novuhq/novu.git"},files:["dist","README.md"],scripts:{preinstall:"npx only-allow pnpm",test:"vitest","test:watch":"vitest --watch",lint:"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix",format:"prettier --check --ignore-path .gitignore .","format:fix":"prettier --write --ignore-path .gitignore .",build:"tsup","build:watch":"tsup --watch","$comment:bump:prerelease":"This is a workaround to support `npm version prerelease` with lerna","bump:prerelease":"npm version prerelease --preid=alpha & PID=$!; (sleep 1 && kill -9 $PID) & wait $PID","release:alpha":"pnpm bump:prerelease || pnpm build && npm publish"},keywords:["novu","code-first","workflows","durable","sdk","notifications","email","sms","push","webhooks","next","nuxt","h3","express"],author:"Novu",license:"MIT",exports:{".":{require:"./dist/index.js",import:"./dist/index.js",types:"./dist/index.d.ts"},"./express":{require:"./dist/express.js",import:"./dist/express.js",types:"./dist/express.d.ts"},"./next":{require:"./dist/next.js",import:"./dist/next.js",types:"./dist/next.d.ts"},"./nuxt":{require:"./dist/nuxt.js",import:"./dist/nuxt.js",types:"./dist/nuxt.d.ts"},"./h3":{require:"./dist/h3.js",import:"./dist/h3.js",types:"./dist/h3.d.ts"},"./sveltekit":{require:"./dist/sveltekit.js",import:"./dist/sveltekit.js",types:"./dist/sveltekit.d.ts"},"./remix":{require:"./dist/remix.js",import:"./dist/remix.js",types:"./dist/remix.d.ts"}},devDependencies:{"@sveltejs/kit":"^2.5.10","@types/express":"^4.17.13","@types/json-schema":"^7.0.15","@types/node":"^20.11.20","@vercel/node":"^2.15.9",express:"^4.18.2",h3:"^1.11.1",next:"^13.5.4",prettier:"^3.2.5","ts-node":"^10.9.2",tsup:"^8.0.2",typescript:"^5.3.3",vitest:"^1.2.1"},dependencies:{ajv:"^8.12.0","ajv-formats":"^2.1.1","better-ajv-errors":"^1.2.0",chalk:"^4.1.2","cross-fetch":"^4.0.0","json-schema-faker":"^0.5.6","json-schema-to-ts":"^3.0.0",liquidjs:"^10.13.1",ora:"^5.4.1"}};var ie=pe.version;jsonSchemaFaker.JSONSchemaFaker.option({useDefaultValue:!0,alwaysFakeOptionals:!0});var re=class{discoveredWorkflows=[];ajv;templateEngine=new liquidjs.Liquid;apiUrl;apiKey;version=ie;strictAuthentication;static NOVU_SIGNATURE_HEADER="x-novu-signature";constructor(e){let t=this.buildOptions(e);this.apiKey=t.apiKey,this.apiUrl=t.apiUrl,this.strictAuthentication=t.strictAuthentication;let r=new Ie__default.default({useDefaults:!0});he__default.default(r),this.ajv=r;}buildOptions(e){let t={apiKey:void 0,apiUrl:ne,strictAuthentication:!0};return e?.apiKey!==void 0?t.apiKey=e.apiKey:process.env.NOVU_API_KEY!==void 0&&(t.apiKey=process.env.NOVU_API_KEY),e?.apiUrl!==void 0?t.apiUrl=e.apiUrl:process.env.NOVU_API_URL!==void 0&&(t.apiUrl=process.env.NOVU_API_URL),e?.strictAuthentication!==void 0?t.strictAuthentication=e.strictAuthentication:process.env.NOVU_STRICT_AUTHENTICATION!==void 0&&(t.strictAuthentication=process.env.NOVU_STRICT_AUTHENTICATION==="true"),t}addWorkflows(e){for(let t of e){if(this.discoveredWorkflows.some(r=>r.workflowId===t.workflowId))throw new ee(t.workflowId);this.discoveredWorkflows.push(t);}}healthCheck(){let e=this.discoveredWorkflows.length,t=this.discoveredWorkflows.reduce((r,s)=>r+s.steps.length,0);return {status:"ok",version:ie,discovered:{workflows:e,steps:t}}}getWorkflow(e){let t=this.discoveredWorkflows.find(r=>r.workflowId===e);if(t)return t;throw new S(e)}getStep(e,t){let s=this.getWorkflow(e).steps.find(i=>i.stepId===t);if(s)return s;throw new H(t)}getRegisteredWorkflows(){return this.discoveredWorkflows}discover(){return {workflows:this.getRegisteredWorkflows()}}getHeaders(e){let t={"content-type":"application/json",authorization:`ApiKey ${this.apiKey}`};return e&&(t["x-novu-anonymous"]=e),t}mock(e){return jsonSchemaFaker.JSONSchemaFaker.generate(e)}validate(e,t,r,s,i,n,a,u){if(!t(e)){let p=Te__default.default(r,e,t.errors||[]);switch(console.error(`
21
+ ${p}`),s){case"event":this.validateEvent(i,n,t);case"step":this.validateStep(a,i,n,t);case"provider":this.validateProvider(a,u,i,n,t);}}}validateProvider(e,t,r,s,i){if(!e)throw new Error("stepId is required");if(!t)throw new Error("providerId is required");switch(r){case"output":throw new G(s,e,t,i.errors);default:throw new Error(`Invalid payload type: '${r}'`)}}validateStep(e,t,r,s){if(!e)throw new Error("stepId is required");switch(t){case"output":throw new M(r,e,s.errors);case"result":throw new V(r,e,s.errors);case"input":throw new $(r,e,s.errors);default:throw new Error(`Invalid payload type: '${t}'`)}}validateEvent(e,t,r){switch(e){case"input":throw new P(t,r.errors);case"data":throw new W(t,r.errors);default:throw new Error(`Invalid payload type: '${e}'`)}}executeStepFactory(e,t){return async(r,s,i)=>{let n=this.getStep(e.workflowId,r),a=we(e),u=this.createStepInputs(n,a),I=e.action==="preview";if(!I&&await this.shouldSkip(i?.skip,u))return t({options:{skip:!0}}),{};let p=this.previewStep.bind(this),R=this.executeStep.bind(this),y=await(I?p:R)(e,{...n,providers:n.providers.map(A=>{let v=i?.providers?.[A.type];if(!v)throw new Y(A.type);return {...A,resolve:v}}),resolve:s});return r===e.stepId&&t(y),y.outputs}}async shouldSkip(e,t){return e?e(t):!1}async executeWorkflow(e){let s=`${{execute:"Executing",preview:"Previewing"}[e.action]} workflowId:`;console.log(`
22
+ ${d.bold(d.underline(s))} '${e.workflowId}'`);let i=this.getWorkflow(e.workflowId),n=process.hrtime(),a={outputs:{},providers:{},options:{}},u,I=new Promise(w=>{u=w;}),p=w=>{u(),a=w;},R;try{if(e.action==="execute"&&!e.data)throw new P(e.workflowId,{message:"Event `data` is required"});let w=this.createExecutionInputs(e,i);await Promise.race([I,i.execute({payload:w,environment:{},input:{},subscriber:e.subscriber,step:{email:this.executeStepFactory(e,p),sms:this.executeStepFactory(e,p),inApp:this.executeStepFactory(e,p),digest:this.executeStepFactory(e,p),delay:this.executeStepFactory(e,p),push:this.executeStepFactory(e,p),chat:this.executeStepFactory(e,p),custom:this.executeStepFactory(e,p)}})]);}catch(w){R=w;}let g=process.hrtime(n),y=g[0],A=g[1],v=y*1e3+A/1e6,ue=R?l.ERROR:l.SUCCESS,Re=e.action==="execute"?"Executed":e.action==="preview"?"Previewed":"Invalid action";if(console.log(`${ue} ${Re} workflowId: \`${e.workflowId}\``),this.prettyPrintExecute(e,v,R),R)throw R;return {outputs:a.outputs,providers:a.providers,options:a.options,metadata:{status:"success",error:!1,duration:v}}}createExecutionInputs(e,t){let r=e.data;return this.validate(e.data,t.data.validate,t.data.schema,"event","input",e.workflowId),r}prettyPrintExecute(e,t,r){let s=r?l.ERROR:l.SUCCESS,i=e.action==="execute"?"Executed":e.action==="preview"?"Previewed":"Invalid action",n=r?"Failed to execute":i,a=r?d.error:d.success,u=`${s} ${n} workflowId: '${e.workflowId}`;console.log(`
23
+ ${d.bold(a(u))}'`),console.log(` \u251C ${l.STEP} stepId: '${e.stepId}'`),console.log(` \u251C ${l.ACTION} action: '${e.action}'`),console.log(` \u2514 ${l.DURATION} duration: '${t.toFixed(2)}ms'
24
+ `);}async executeProviders(e,t){return t.providers.reduce(async(r,s)=>{let i=await r,n=this.previewProvider.bind(this),a=this.executeProvider.bind(this),I=await(e.action==="preview"?n:a)(e,t,s);return {...i,[s.type]:I}},Promise.resolve({}))}previewProvider(e,t,r){return console.log(` ${l.MOCK} Mocked provider: \`${r.type}\``),this.mock(r.outputs.schema)}async executeProvider(e,t,r){let s=te__default.default({indent:2}).start(`Executing provider: \`${r.type}\``);try{if(e.stepId===t.stepId){let i=this.createStepInputs(t,e),n=await r.resolve({inputs:i});return this.validate(n,r.outputs.validate,r.outputs.schema,"step","output",e.workflowId,t.stepId,r.type),s.succeed(`Executed provider: \`${r.type}\``),n}else s.stopAndPersist({symbol:l.HYDRATED,text:`Hydrated provider: \`${r.type}\``});}catch(i){throw s.stopAndPersist({symbol:l.ERROR,text:`Failed to execute provider: \`${r.type}\``}),new B(`Failed to execute provider: '${r.type}'.
25
+ ${i.message}`)}}async executeStep(e,t){if(e.stepId===t.stepId){let r=te__default.default({indent:1}).start(`Executing stepId: \`${t.stepId}\``);try{let s=this.createStepInputs(t,e),i=await this.compileInputs(s,e),n=await t.resolve(i);this.validate(n,t.outputs.validate,t.outputs.schema,"step","output",e.workflowId,t.stepId);let a=await this.executeProviders(e,t);return r.succeed(`Executed stepId: \`${t.stepId}\``),{outputs:n,providers:a}}catch(s){throw r.stopAndPersist({prefixText:"",symbol:l.ERROR,text:`Failed to execute stepId: \`${t.stepId}\``}),s}}else {let r=te__default.default({indent:1}).start(`Hydrating stepId: \`${t.stepId}\``);try{let s=e.state.find(i=>i.stepId===t.stepId);if(s)return this.validate(s.outputs,t.results.validate,t.results.schema,"step","result",e.workflowId,t.stepId),r.stopAndPersist({symbol:l.HYDRATED,text:`Hydrated stepId: \`${t.stepId}\``}),{outputs:s.outputs,providers:await this.executeProviders(e,t)};throw new F(e.workflowId,t.stepId)}catch(s){throw r.stopAndPersist({symbol:l.ERROR,text:`Failed to hydrate stepId: \`${t.stepId}\``}),s}}}async compileInputs(e,t){let r=this.templateEngine.parse(JSON.stringify(e)),s=await this.templateEngine.render(r,{...t.data,subscriber:t.subscriber});return JSON.parse(s)}createStepInputs(e,t){let r=t.inputs;return this.validate(r,e.inputs.validate,e.inputs.schema,"step","input",t.workflowId,e.stepId),r}async previewStep(e,t){let r=te__default.default({indent:1}).start(`Previewing stepId: \`${t.stepId}\``);try{if(e.stepId===t.stepId){let s=this.createStepInputs(t,e),i=await this.compileInputs(s,e),n=await t.resolve(i);return this.validate(n,t.outputs.validate,t.outputs.schema,"step","output",e.workflowId,t.stepId),r.stopAndPersist({symbol:l.MOCK,text:`Mocked stepId: \`${t.stepId}\``}),{outputs:n,providers:await this.executeProviders(e,t)}}else {let s=this.mock(t.results.schema);return r.stopAndPersist({symbol:l.MOCK,text:`Mocked stepId: \`${t.stepId}\``}),{outputs:s,providers:await this.executeProviders(e,t)}}}catch(s){throw r.stopAndPersist({symbol:l.ERROR,text:`Failed to preview stepId: \`${t.stepId}\``}),s}}getStepCode(e,t){return {code:this.getStep(e,t).resolve.toString()}}getWorkflowCode(e){return {code:this.getWorkflow(e).execute.toString()}}getCode(e,t){let r;if(e)t?r=this.getStepCode(e,t):r=this.getWorkflowCode(e);else throw new S(e);return r}};function we(o){return JSON.parse(JSON.stringify(o))}var se=class{frameworkName;handler;client;hmacEnabled;constructor(e){this.handler=e.handler,this.client=e.client?e.client:new re,this.client.addWorkflows(e.workflows),this.frameworkName=e.frameworkName,this.hmacEnabled=this.client.strictAuthentication;}createHandler(){return async(...e)=>{let t=await this.handler(...e),r=await this.handleAction({actions:t});return t.transformResponse(r)}}getStaticHeaders(){let e=`novu-framework:v${this.client.version}`;return {"content-type":"application/json","access-control-allow-origin":"*","access-control-allow-methods":"GET, POST","access-control-allow-headers":"*","access-control-max-age":"604800","x-novu-framework":this.frameworkName,"user-agent":e,"x-novu-sdk":e}}createResponse(e,t,r={}){return {status:e,body:JSON.stringify(t),headers:{...this.getStaticHeaders(),...r}}}createError(e){return {status:e.statusCode,body:JSON.stringify({message:e.message,data:e.data,code:e.code}),headers:this.getStaticHeaders()}}async handleAction({actions:e}){let t=await e.url(),r=await e.method(),s=t.searchParams.get("action")||"",i=t.searchParams.get("workflowId")||"",n=t.searchParams.get("stepId")||"",a=await e.headers("x-novu-signature")||"",u=await e.headers("x-novu-anonymous")||"",I=t.searchParams.get("source")||"",p={};try{r==="POST"&&(p=await e.body());}catch{}try{s!=="health-check"&&this.validateHmac(p,a);let R=this.getPostActionMap(p,i,n,s,u,I),g=this.getGetActionMap(i,n);if(r==="POST")return await this.handlePostAction(s,R);if(r==="GET")return await this.handleGetAction(s,g);if(r==="OPTIONS")return this.createResponse(200,{},{...this.getStaticHeaders()})}catch(R){return this.handleError(R)}return this.createError(new j(r))}getPostActionMap(e,t,r,s,i,n){return {execute:async()=>{let a=await this.client.executeWorkflow({...e,workflowId:t,stepId:r,action:s});return this.createResponse(200,a,{"x-novu-execution-duration":a.metadata.duration.toString()})},preview:async()=>{let a=await this.client.executeWorkflow({...e,workflowId:t,stepId:r,action:s});return this.createResponse(200,a,{"x-novu-execution-duration":a.metadata.duration.toString()})}}}getGetActionMap(e,t){return {discover:async()=>{let r=await this.client.discover();return this.createResponse(200,r)},"health-check":async()=>{let r=await this.client.healthCheck();return this.createResponse(200,r)},code:async()=>{let r=await this.client.getCode(e,t);return this.createResponse(200,r)}}}async handlePostAction(e,t){if(Object.values(U).includes(e)){let r=t[e];return r()}else throw new m(e,U)}async handleGetAction(e,t){if(Object.values(D).includes(e)){let r=t[e];return r()}else throw new m(e,D)}isClientError(e){return Object.values(O).includes(e.code)}handleError(e){return this.isClientError(e)?(e.statusCode===500&&console.error(e),this.createError(e)):(console.error(e),this.createError(new X))}validateHmac(e,t){if(!this.hmacEnabled)return;if(!t)throw new J;if(!this.client.apiKey)throw new Z;let[r,s]=t.split(",");if(!r||!s)throw new Q;let[i,n]=r.split("="),[a,u]=s.split("=");if(Number(i)<Date.now()-1500)throw new z;if(!(this.hashHmac(this.client.apiKey,`${n}.${JSON.stringify(e)}`)===u))throw new q}hashHmac(e,t){return crypto.createHmac("sha256",e).update(t).digest("hex")}};var fe="express",lr=o=>new se({frameworkName:fe,...o,handler:(t,r)=>({body:()=>t.body,headers:s=>{let i=t.headers[s];return Array.isArray(i)?i[0]:i},method:()=>t.method||"GET",url:()=>{let s=t.headers.host||"",i=s?.includes("://")?"":`${t.protocol||"https"}://`;return new URL(t.originalUrl||t.url||"",`${i}${s||""}`)},queryString:s=>{let i=t.query[s];return Array.isArray(i)?i[0]:i},transformResponse:({body:s,headers:i,status:n})=>(Object.entries(i).forEach(([a,u])=>{r.setHeader(a,u);}),r.status(n).send(s))})}).createHandler();
26
26
 
27
- exports.frameworkName = ge;
28
- exports.serve = pr;
27
+ exports.frameworkName = fe;
28
+ exports.serve = lr;
package/dist/h3.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as h3 from 'h3';
2
2
  import { H3Event } from 'h3';
3
- import { i as SupportedFrameworkName, S as ServeHandlerOptions } from './handler-58kccf2b.js';
3
+ import { i as SupportedFrameworkName, S as ServeHandlerOptions } from './handler-jSdMUIfN.js';
4
4
  import 'ajv';
5
5
  import 'json-schema-to-ts';
6
6
 
package/dist/h3.js CHANGED
@@ -1,28 +1,28 @@
1
1
  'use strict';
2
2
 
3
3
  var crypto = require('crypto');
4
- var pt = require('ajv');
5
- var Rt = require('ajv-formats');
6
- var _t = require('better-ajv-errors');
4
+ var ht = require('ajv');
5
+ var pt = require('ajv-formats');
6
+ var Rt = require('better-ajv-errors');
7
7
  var jsonSchemaFaker = require('json-schema-faker');
8
- var oe = require('ora');
8
+ var se = require('ora');
9
9
  var A = require('chalk');
10
10
  var liquidjs = require('liquidjs');
11
11
 
12
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
13
 
14
+ var ht__default = /*#__PURE__*/_interopDefault(ht);
14
15
  var pt__default = /*#__PURE__*/_interopDefault(pt);
15
16
  var Rt__default = /*#__PURE__*/_interopDefault(Rt);
16
- var _t__default = /*#__PURE__*/_interopDefault(_t);
17
- var oe__default = /*#__PURE__*/_interopDefault(oe);
17
+ var se__default = /*#__PURE__*/_interopDefault(se);
18
18
  var A__default = /*#__PURE__*/_interopDefault(A);
19
19
 
20
- var Ee=/\+/g;function ae(r=""){try{return decodeURIComponent(""+r)}catch{return ""+r}}function Fe(r){return ae(r.replace(Ee," "))}function $e(r){return ae(r.replace(Ee," "))}function We(r=""){let e={};r[0]==="?"&&(r=r.slice(1));for(let t of r.split("&")){let s=t.match(/([^=]+)=?(.*)/)||[];if(s.length<2)continue;let o=Fe(s[1]);if(o==="__proto__"||o==="constructor")continue;let n=$e(s[2]||"");e[o]===void 0?e[o]=n:Array.isArray(e[o])?e[o].push(n):e[o]=[e[o],n];}return e}var qe=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,je=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,He=/^([/\\]\s*){2,}[^/\\]/;function Ve(r,e={}){return typeof e=="boolean"&&(e={acceptRelative:e}),e.strict?qe.test(r):je.test(r)||(e.acceptRelative?He.test(r):!1)}function me(r){return We(ce(r).search)}var Be=Symbol.for("ufo:protocolRelative");function ce(r="",e){let t=r.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(t){let[,p,g=""]=t;return {protocol:p.toLowerCase(),pathname:g,href:p+g,auth:"",host:"",search:"",hash:""}}if(!Ve(r,{acceptRelative:!0}))return e?ce(e+r):ge(r);let[,s="",o,n=""]=r.replace(/\\/g,"/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[],[,i="",a=""]=n.match(/([^#/?]*)(.*)?/)||[],{pathname:u,search:f,hash:c}=ge(a.replace(/\/(?=[A-Za-z]:)/,""));return {protocol:s.toLowerCase(),auth:o?o.slice(0,Math.max(0,o.length-1)):"",host:i,pathname:u,search:f,hash:c,[Be]:!s}}function ge(r=""){let[e="",t="",s=""]=(r.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return {pathname:e,search:t,hash:s}}var Ge=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,Ke=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,Ye=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function Xe(r,e){if(r==="__proto__"||r==="constructor"&&e&&typeof e=="object"&&"prototype"in e){Je(r);return}return e}function Je(r){console.warn(`[destr] Dropping "${r}" key to prevent prototype pollution.`);}function ye(r,e={}){if(typeof r!="string")return r;let t=r.trim();if(r[0]==='"'&&r.endsWith('"')&&!r.includes("\\"))return t.slice(1,-1);if(t.length<=9){let s=t.toLowerCase();if(s==="true")return !0;if(s==="false")return !1;if(s==="undefined")return;if(s==="null")return null;if(s==="nan")return Number.NaN;if(s==="infinity")return Number.POSITIVE_INFINITY;if(s==="-infinity")return Number.NEGATIVE_INFINITY}if(!Ye.test(r)){if(e.strict)throw new SyntaxError("[destr] Invalid JSON");return r}try{if(Ge.test(r)||Ke.test(r)){if(e.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(r,Xe)}return JSON.parse(r)}catch(s){if(e.strict)throw s;return r}}function pe(r,e){try{return e in r}catch{return !1}}var Qe=Object.defineProperty,Ze=(r,e,t)=>e in r?Qe(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,O=(r,e,t)=>(Ze(r,typeof e!="symbol"?e+"":e,t),t),S=class extends Error{constructor(e,t={}){super(e,t),O(this,"statusCode",500),O(this,"fatal",!1),O(this,"unhandled",!1),O(this,"statusMessage"),O(this,"data"),O(this,"cause"),t.cause&&!this.cause&&(this.cause=t.cause);}toJSON(){let e={message:this.message,statusCode:he(this.statusCode,500)};return this.statusMessage&&(e.statusMessage=Ne(this.statusMessage)),this.data!==void 0&&(e.data=this.data),e}};O(S,"__h3_error__",!0);function Te(r){if(typeof r=="string")return new S(r);if(et(r))return r;let e=new S(r.message??r.statusMessage??"",{cause:r.cause||r});if(pe(r,"stack"))try{Object.defineProperty(e,"stack",{get(){return r.stack}});}catch{try{e.stack=r.stack;}catch{}}if(r.data&&(e.data=r.data),r.statusCode?e.statusCode=he(r.statusCode,e.statusCode):r.status&&(e.statusCode=he(r.status,e.statusCode)),r.statusMessage?e.statusMessage=r.statusMessage:r.statusText&&(e.statusMessage=r.statusText),e.statusMessage){let t=e.statusMessage;Ne(e.statusMessage)!==t&&console.warn("[h3] Please prefer using `message` for longer error messages instead of `statusMessage`. In the future, `statusMessage` will be sanitized by default.");}return r.fatal!==void 0&&(e.fatal=r.fatal),r.unhandled!==void 0&&(e.unhandled=r.unhandled),e}function et(r){return r?.constructor?.__h3_error__===!0}function Ae(r){return me(r.path||"")}function tt(r,e,t){if(t&&r.method==="HEAD")return !0;if(typeof e=="string"){if(r.method===e)return !0}else if(e.includes(r.method))return !0;return !1}function rt(r,e,t){if(!tt(r,e,t))throw Te({statusCode:405,statusMessage:"HTTP method is not allowed."})}function st(r){let e={};for(let t in r.node.req.headers){let s=r.node.req.headers[t];e[t]=Array.isArray(s)?s.filter(Boolean).join(", "):s;}return e}function ot(r,e){return st(r)[e.toLowerCase()]}var Re=ot;var Oe=Symbol.for("h3RawBody"),fe=Symbol.for("h3ParsedBody"),nt=["PATCH","POST","PUT","DELETE"];function it(r,e="utf8"){rt(r,nt);let t=r._requestBody||r.web?.request?.body||r.node.req[Oe]||r.node.req.rawBody||r.node.req.body;if(t){let n=Promise.resolve(t).then(i=>Buffer.isBuffer(i)?i:typeof i.pipeTo=="function"?new Promise((a,u)=>{let f=[];i.pipeTo(new WritableStream({write(c){f.push(c);},close(){a(Buffer.concat(f));},abort(c){u(c);}})).catch(u);}):typeof i.pipe=="function"?new Promise((a,u)=>{let f=[];i.on("data",c=>{f.push(c);}).on("end",()=>{a(Buffer.concat(f));}).on("error",u);}):i.constructor===Object?Buffer.from(JSON.stringify(i)):Buffer.from(i));return e?n.then(i=>i.toString(e)):n}if(!Number.parseInt(r.node.req.headers["content-length"]||""))return Promise.resolve(void 0);let s=r.node.req[Oe]=new Promise((n,i)=>{let a=[];r.node.req.on("error",u=>{i(u);}).on("data",u=>{a.push(u);}).on("end",()=>{n(Buffer.concat(a));});});return e?s.then(n=>n.toString(e)):s}async function xe(r,e={}){let t=r.node.req;if(pe(t,fe))return t[fe];let s=t.headers["content-type"]||"",o=await it(r),n;return s==="application/json"?n=Ie(o,e.strict??!0):s.startsWith("application/x-www-form-urlencoded")?n=at(o):s.startsWith("text/")?n=o:n=Ie(o,e.strict??!1),t[fe]=n,n}function Ie(r="",e){if(r)try{return ye(r,{strict:e})}catch{throw Te({statusCode:400,statusMessage:"Bad Request",message:"Invalid JSON body"})}}function at(r){let e=new URLSearchParams(r),t=Object.create(null);for(let[s,o]of e.entries())pe(t,s)?(Array.isArray(t[s])||(t[s]=[t[s]]),t[s].push(o)):t[s]=o;return t}var ct=/[^\u0009\u0020-\u007E]/g;function Ne(r=""){return r.replace(ct,"")}function he(r,e=200){return !r||(typeof r=="string"&&(r=Number.parseInt(r,10)),r<100||r>999)?e:r}var dt=typeof setImmediate>"u"?r=>r():setImmediate;function Se(r,e,t){return t&&ut(r,t),new Promise(s=>{dt(()=>{r.handled||r.node.res.end(e),s();});})}function ut(r,e){e&&r.node.res.statusCode!==304&&!r.node.res.getHeader("content-type")&&r.node.res.setHeader("content-type",e);}function lt(r,e){for(let[t,s]of Object.entries(e))r.node.res.setHeader(t,s);}var Pe=lt;var v=(o=>(o.EXECUTE="execute",o.PREVIEW="preview",o.SYNC="sync",o.DIFF="diff",o))(v||{}),M=(s=>(s.DISCOVER="discover",s.HEALTH_CHECK="health-check",s.CODE="code",s))(M||{});var Ce="https://api.novu.co";var _=(d=>(d.WORKFLOW_NOT_FOUND_ERROR="WorkflowNotFoundError",d.WORKFLOW_ALREADY_EXISTS_ERROR="WorkflowAlreadyExistsError",d.WORKFLOW_EXECUTION_FAILED_ERROR="WorkflowExecutionFailedError",d.EXECUTION_STATE_OUTPUT_INVALID_ERROR="ExecutionStateOutputInvalidError",d.EXECUTION_STATE_RESULT_INVALID_ERROR="ExecutionStateResultInvalidError",d.EXECUTION_PROVIDER_OUTPUT_INVALID_ERROR="ExecutionProviderOutputInvalidError",d.PROVIDER_NOT_FOUND_ERROR="ProviderNotFoundError",d.PROVIDER_EXECUTION_FAILED_ERROR="ProviderExecutionFailedError",d.STEP_NOT_FOUND_ERROR="StepNotFoundError",d.STEP_ALREADY_EXISTS_ERROR="StepAlreadyExistsError",d.STEP_EXECUTION_FAILED_ERROR="StepExecutionFailedError",d.EXECUTION_STATE_CORRUPT_ERROR="ExecutionStateCorruptError",d.EXECUTION_EVENT_DATA_INVALID_ERROR="ExecutionEventDataInvalidError",d.EXECUTION_EVENT_INPUT_INVALID_ERROR="ExecutionEventInputInvalidError",d.EXECUTION_STATE_INPUT_INVALID_ERROR="ExecutionStateInputInvalidError",d.METHOD_NOT_ALLOWED_ERROR="MethodNotAllowedError",d.INVALID_ACTION_ERROR="InvalidActionError",d.MISSING_API_KEY_ERROR="MissingApiKeyError",d.SIGNATURE_MISMATCH_ERROR="SignatureMismatchError",d.SIGNATURE_NOT_FOUND_ERROR="SignatureNotFoundError",d.SIGNATURE_INVALID_ERROR="SignatureInvalidError",d.SIGNATURE_EXPIRED_ERROR="SignatureExpiredError",d.SIGNING_KEY_NOT_FOUND_ERROR="SigningKeyNotFoundError",d.PLATFORM_ERROR="PlatformError",d.SIGNATURE_VERSION_INVALID_ERROR="SignatureVersionInvalidError",d))(_||{});var P=(s=>(s.POST="POST",s.GET="GET",s.OPTIONS="OPTIONS",s))(P||{});var w=class extends Error{data},F=class extends w{statusCode=404},R=class extends w{statusCode=400},E=class extends w{statusCode=401},T=class extends w{statusCode=500},$=class extends w{statusCode=409};var W=class extends R{code="ExecutionStateCorruptError";constructor(e,t){super(`Workflow with id: \`${e}\` has a corrupt state. Step with id: \`${t}\` does not exist. Please provide the missing state.`),this.data={workflowId:e,stepId:t};}},q=class extends R{code="ExecutionEventDataInvalidError";constructor(e,t){super(`Workflow with id: \`${e}\` has invalid \`data\`. Please provide the correct event data.`),this.data=t;}},C=class extends R{code="ExecutionEventInputInvalidError";constructor(e,t){super(`Workflow with id: \`${e}\` has invalid \`inputs\`. Please provide the correct event inputs.`),this.data=t;}},j=class extends R{code="ExecutionStateInputInvalidError";constructor(e,t,s){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` has invalid input. Please provide the correct step input.`),this.data=s;}},H=class extends R{code="ExecutionStateOutputInvalidError";constructor(e,t,s){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` has invalid output. Please provide the correct step output.`),this.data=s;}},V=class extends R{code="ExecutionStateResultInvalidError";constructor(e,t,s){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` has invalid result. Please provide the correct step result.`),this.data=s;}},B=class extends R{code="ExecutionProviderOutputInvalidError";constructor(e,t,s,o){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` and provider with id: \`${s}\` has invalid output. Please provide the correct provider output.`),this.data=o;}};var l={info:r=>A__default.default.blue(r),warning:r=>A__default.default.yellow(r),error:r=>A__default.default.red(r),success:r=>A__default.default.green(r),underline:r=>A__default.default.underline(r),bold:r=>A__default.default.bold(r)},h={SUCCESS:l.success("\u2714"),ERROR:l.error("\u2717"),WARNING:l.warning("\u26A0"),INFO:l.info("\u2139"),ARROW:l.bold("\u2192"),MOCK:l.info("\u25CB"),HYDRATED:l.bold(l.info("\u2192")),STEP:l.info("\u03C3"),ACTION:l.info("\u03B1"),DURATION:l.info("\u0394"),PROVIDER:l.info("\u2699"),OUTPUT:l.info("\u21E2"),INPUT:l.info("\u21E0"),WORKFLOW:l.info("\u03C9"),STATE:l.info("\u03C3"),EXECUTE:l.info("\u03B5"),PREVIEW:l.info("\u03C1")};var _e=r=>Object.values(r).map(e=>`\`${e}\``).join(", "),G=r=>r.replaceAll(/(\w)(\w*)/g,(e,t,s)=>t.toUpperCase()+s.toLowerCase()).replaceAll(/[\s-]+/g,"");var K=class extends w{code="MethodNotAllowedError";statusCode=405;message=`Method not allowed. Please use one of ${_e(P)}`},b=class extends R{code="InvalidActionError";constructor(e,t){super(`Invalid query string: \`action\`=\`${e}\`. Please use one of ${_e(t)}`);}},U=class extends R{code="MissingApiKeyError";constructor(){super("API Key is missing. Please add the API Key during Client initialization.");}};var Y=class extends T{code="PlatformError";message="Something went wrong. Please try again later."};var D=class extends ${constructor(e,t){super(`${G(e)} with id: \`${t}\` already exists. Please use a different id.`);}},m=class extends F{constructor(e,t){super(`${G(e)} with id: \`${t}\` does not exist. Please provide a valid id.`);}},x=class extends T{constructor(e,t){super(`Failed to execute ${G(e)} with id: \`${t}\`. Please try again later.`);}};var X=class extends m{code="ProviderNotFoundError";constructor(e){super("provider",e);}},J=class extends x{code="ProviderExecutionFailedError";constructor(e){super("workflow",e);}};var z=class extends E{code="SignatureMismatchError";constructor(){super("Signature does not match the expected signature. Please ensure the signature provided in the `x-novu-signature` header is correct and try again.");}},Q=class extends E{code="SignatureNotFoundError";constructor(){super("Signature not found. Please provide a signature in the `x-novu-signature` header");}},Z=class extends E{code="SignatureInvalidError";constructor(){super("Signature is invalid. Please provide a valid signature in the `x-novu-signature` header");}},ee=class extends E{code="SignatureExpiredError";constructor(){super(`Signature expired. Please provide a signature with a timestamp no older than ${5} minutes in the \`x-novu-signature\` header`);}},te=class extends E{code="SigningKeyNotFoundError";constructor(){super("Signature key not found. Please provide a valid key in the Client constructor `config.apiKey`");}};var re=class extends m{code="StepNotFoundError";constructor(e){super("step",e);}};var k=class extends m{code="WorkflowNotFoundError";constructor(e){super("workflow",e);}},se=class extends D{code="WorkflowAlreadyExistsError";constructor(e){super("workflow",e);}};var ke={name:"@novu/framework",version:"0.24.3-alpha.5",description:"The Code-First Notifications Workflow SDK.",main:"./dist/index.js",types:"./dist/index.d.ts",publishConfig:{registry:"https://registry.npmjs.org",access:"public"},private:!1,repository:{type:"git",url:"git+https://github.com/novuhq/novu.git"},files:["dist","README.md"],scripts:{preinstall:"npx only-allow pnpm",test:"vitest","test:watch":"vitest --watch",lint:"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix",format:"prettier --check --ignore-path .gitignore .","format:fix":"prettier --write --ignore-path .gitignore .",build:"tsup","build:watch":"tsup --watch","$comment:bump:prerelease":"This is a workaround to support `npm version prerelease` with lerna","bump:prerelease":"npm version prerelease --preid=alpha & PID=$!; (sleep 1 && kill -9 $PID) & wait $PID","release:alpha":"pnpm bump:prerelease || pnpm build && npm publish --dry-run"},keywords:["novu","code-first","workflows","durable","sdk","notifications","email","sms","push","webhooks","next","nuxt","h3","express"],author:"Novu",license:"MIT",exports:{".":{require:"./dist/index.js",import:"./dist/index.js",types:"./dist/index.d.ts"},"./express":{require:"./dist/express.js",import:"./dist/express.js",types:"./dist/express.d.ts"},"./next":{require:"./dist/next.js",import:"./dist/next.js",types:"./dist/next.d.ts"},"./nuxt":{require:"./dist/nuxt.js",import:"./dist/nuxt.js",types:"./dist/nuxt.d.ts"},"./h3":{require:"./dist/h3.js",import:"./dist/h3.js",types:"./dist/h3.d.ts"},"./sveltekit":{require:"./dist/sveltekit.js",import:"./dist/sveltekit.js",types:"./dist/sveltekit.d.ts"},"./remix":{require:"./dist/remix.js",import:"./dist/remix.js",types:"./dist/remix.d.ts"}},devDependencies:{"@sveltejs/kit":"^2.5.10","@types/express":"^4.17.13","@types/json-schema":"^7.0.15","@types/node":"^20.11.20","@vercel/node":"^2.15.9",express:"^4.18.2",h3:"^1.11.1",next:"^13.5.4",prettier:"^3.2.5","ts-node":"^10.9.2",tsup:"^8.0.2",typescript:"^5.3.3",vitest:"^1.2.1"},dependencies:{ajv:"^8.12.0","ajv-formats":"^2.1.1","better-ajv-errors":"^1.2.0",chalk:"^4.1.2","cross-fetch":"^4.0.0","json-schema-faker":"^0.5.6","json-schema-to-ts":"^3.0.0",liquidjs:"^10.13.1",ora:"^5.4.1"}};var we=ke.version;jsonSchemaFaker.JSONSchemaFaker.option({useDefaultValue:!0,alwaysFakeOptionals:!0});var ne=class{discoveredWorkflows=[];ajv;templateEngine=new liquidjs.Liquid;apiUrl;apiKey;version=we;strictAuthentication;static NOVU_SIGNATURE_HEADER="x-novu-signature";constructor(e){let t=this.buildOptions(e);this.apiKey=t.apiKey,this.apiUrl=t.apiUrl,this.strictAuthentication=t.strictAuthentication;let s=new pt__default.default({useDefaults:!0});Rt__default.default(s),this.ajv=s;}buildOptions(e){let t={apiKey:void 0,apiUrl:Ce,strictAuthentication:!0};return e?.apiKey!==void 0?t.apiKey=e.apiKey:process.env.NOVU_API_KEY!==void 0&&(t.apiKey=process.env.NOVU_API_KEY),e?.apiUrl!==void 0?t.apiUrl=e.apiUrl:process.env.NOVU_API_URL!==void 0&&(t.apiUrl=process.env.NOVU_API_URL),e?.strictAuthentication!==void 0?t.strictAuthentication=e.strictAuthentication:process.env.NOVU_STRICT_AUTHENTICATION!==void 0&&(t.strictAuthentication=process.env.NOVU_STRICT_AUTHENTICATION==="true"),t}addWorkflows(e){for(let t of e){if(this.discoveredWorkflows.some(s=>s.workflowId===t.workflowId))throw new se(t.workflowId);this.discoveredWorkflows.push(t);}}healthCheck(){let e=this.discoveredWorkflows.length,t=this.discoveredWorkflows.reduce((s,o)=>s+o.steps.length,0);return {status:"ok",version:we,discovered:{workflows:e,steps:t}}}getWorkflow(e){let t=this.discoveredWorkflows.find(s=>s.workflowId===e);if(t)return t;throw new k(e)}getStep(e,t){let o=this.getWorkflow(e).steps.find(n=>n.stepId===t);if(o)return o;throw new re(t)}getRegisteredWorkflows(){return this.discoveredWorkflows}discover(){return {workflows:this.getRegisteredWorkflows()}}getHeaders(e){let t={"content-type":"application/json",authorization:`ApiKey ${this.apiKey}`};return e&&(t["x-novu-anonymous"]=e),t}async diff(e,t){let s=this.discover()?.workflows||[];return (await fetch(this.apiUrl+"/v1/bridge/diff",{method:"POST",headers:this.getHeaders(t),body:JSON.stringify({workflows:s,bridgeUrl:e})})).json()}async sync(e,t,s){let{workflows:o}=this.discover();return (await fetch(`${this.apiUrl}/v1/bridge/sync?source=${s||"sdk"}`,{method:"POST",headers:this.getHeaders(t),body:JSON.stringify({workflows:o,bridgeUrl:e})})).json()}mock(e){return jsonSchemaFaker.JSONSchemaFaker.generate(e)}validate(e,t,s,o,n,i,a,u){if(!t(e)){let c=_t__default.default(s,e,t.errors||[]);switch(console.error(`
21
- ${c}`),o){case"event":this.validateEvent(n,i,t);case"step":this.validateStep(a,n,i,t);case"provider":this.validateProvider(a,u,n,i,t);}}}validateProvider(e,t,s,o,n){if(!e)throw new Error("stepId is required");if(!t)throw new Error("providerId is required");switch(s){case"output":throw new B(o,e,t,n.errors);default:throw new Error(`Invalid payload type: '${s}'`)}}validateStep(e,t,s,o){if(!e)throw new Error("stepId is required");switch(t){case"output":throw new H(s,e,o.errors);case"result":throw new V(s,e,o.errors);case"input":throw new j(s,e,o.errors);default:throw new Error(`Invalid payload type: '${t}'`)}}validateEvent(e,t,s){switch(e){case"input":throw new C(t,s.errors);case"data":throw new q(t,s.errors);default:throw new Error(`Invalid payload type: '${e}'`)}}executeStepFactory(e,t){return async(s,o,n)=>{let i=this.getStep(e.workflowId,s),a=gt(e),u=this.createStepInputs(i,a),f=e.action==="preview";if(!f&&await this.shouldSkip(n?.skip,u))return t({options:{skip:!0}}),{};let c=this.previewStep.bind(this),p=this.executeStep.bind(this),L=await(f?c:p)(e,{...i,providers:i.providers.map(I=>{let N=n?.providers?.[I.type];if(!N)throw new X(I.type);return {...I,resolve:N}}),resolve:o});return s===e.stepId&&t(L),L.outputs}}async shouldSkip(e,t){return e?e(t):!1}async executeWorkflow(e){let o=`${{execute:"Executing",preview:"Previewing"}[e.action]} workflowId:`;console.log(`
22
- ${l.bold(l.underline(o))} '${e.workflowId}'`);let n=this.getWorkflow(e.workflowId),i=process.hrtime(),a={outputs:{},providers:{},options:{}},u,f=new Promise(y=>{u=y;}),c=y=>{u(),a=y;},p;try{if(e.action==="execute"&&!e.data)throw new C(e.workflowId,{message:"Event `data` is required"});let y=this.createExecutionInputs(e,n);await Promise.race([f,n.execute({payload:y,environment:{},input:{},subscriber:e.subscriber,step:{email:this.executeStepFactory(e,c),sms:this.executeStepFactory(e,c),inApp:this.executeStepFactory(e,c),digest:this.executeStepFactory(e,c),delay:this.executeStepFactory(e,c),push:this.executeStepFactory(e,c),chat:this.executeStepFactory(e,c),custom:this.executeStepFactory(e,c)}})]);}catch(y){p=y;}let g=process.hrtime(i),L=g[0],I=g[1],N=L*1e3+I/1e6,ve=p?h.ERROR:h.SUCCESS,Me=e.action==="execute"?"Executed":e.action==="preview"?"Previewed":"Invalid action";if(console.log(`${ve} ${Me} workflowId: \`${e.workflowId}\``),this.prettyPrintExecute(e,N,p),p)throw p;return {outputs:a.outputs,providers:a.providers,options:a.options,metadata:{status:"success",error:!1,duration:N}}}createExecutionInputs(e,t){let s=e.data;return this.validate(e.data,t.data.validate,t.data.schema,"event","input",e.workflowId),s}prettyPrintExecute(e,t,s){let o=s?h.ERROR:h.SUCCESS,n=e.action==="execute"?"Executed":e.action==="preview"?"Previewed":"Invalid action",i=s?"Failed to execute":n,a=s?l.error:l.success,u=`${o} ${i} workflowId: '${e.workflowId}`;console.log(`
20
+ var ge=/\+/g;function ie(r=""){try{return decodeURIComponent(""+r)}catch{return ""+r}}function Me(r){return ie(r.replace(ge," "))}function Fe(r){return ie(r.replace(ge," "))}function $e(r=""){let e={};r[0]==="?"&&(r=r.slice(1));for(let t of r.split("&")){let s=t.match(/([^=]+)=?(.*)/)||[];if(s.length<2)continue;let o=Me(s[1]);if(o==="__proto__"||o==="constructor")continue;let n=Fe(s[2]||"");e[o]===void 0?e[o]=n:Array.isArray(e[o])?e[o].push(n):e[o]=[e[o],n];}return e}var We=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,qe=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,je=/^([/\\]\s*){2,}[^/\\]/;function He(r,e={}){return typeof e=="boolean"&&(e={acceptRelative:e}),e.strict?We.test(r):qe.test(r)||(e.acceptRelative?je.test(r):!1)}function Ee(r){return $e(ae(r).search)}var Ve=Symbol.for("ufo:protocolRelative");function ae(r="",e){let t=r.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(t){let[,p,g=""]=t;return {protocol:p.toLowerCase(),pathname:g,href:p+g,auth:"",host:"",search:"",hash:""}}if(!He(r,{acceptRelative:!0}))return e?ae(e+r):we(r);let[,s="",o,n=""]=r.replace(/\\/g,"/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[],[,i="",a=""]=n.match(/([^#/?]*)(.*)?/)||[],{pathname:u,search:f,hash:c}=we(a.replace(/\/(?=[A-Za-z]:)/,""));return {protocol:s.toLowerCase(),auth:o?o.slice(0,Math.max(0,o.length-1)):"",host:i,pathname:u,search:f,hash:c,[Ve]:!s}}function we(r=""){let[e="",t="",s=""]=(r.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return {pathname:e,search:t,hash:s}}var Be=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,Ge=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,Ke=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function Xe(r,e){if(r==="__proto__"||r==="constructor"&&e&&typeof e=="object"&&"prototype"in e){Ye(r);return}return e}function Ye(r){console.warn(`[destr] Dropping "${r}" key to prevent prototype pollution.`);}function me(r,e={}){if(typeof r!="string")return r;let t=r.trim();if(r[0]==='"'&&r.endsWith('"')&&!r.includes("\\"))return t.slice(1,-1);if(t.length<=9){let s=t.toLowerCase();if(s==="true")return !0;if(s==="false")return !1;if(s==="undefined")return;if(s==="null")return null;if(s==="nan")return Number.NaN;if(s==="infinity")return Number.POSITIVE_INFINITY;if(s==="-infinity")return Number.NEGATIVE_INFINITY}if(!Ke.test(r)){if(e.strict)throw new SyntaxError("[destr] Invalid JSON");return r}try{if(Be.test(r)||Ge.test(r)){if(e.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(r,Xe)}return JSON.parse(r)}catch(s){if(e.strict)throw s;return r}}function he(r,e){try{return e in r}catch{return !1}}var ze=Object.defineProperty,Qe=(r,e,t)=>e in r?ze(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,O=(r,e,t)=>(Qe(r,typeof e!="symbol"?e+"":e,t),t),S=class extends Error{constructor(e,t={}){super(e,t),O(this,"statusCode",500),O(this,"fatal",!1),O(this,"unhandled",!1),O(this,"statusMessage"),O(this,"data"),O(this,"cause"),t.cause&&!this.cause&&(this.cause=t.cause);}toJSON(){let e={message:this.message,statusCode:fe(this.statusCode,500)};return this.statusMessage&&(e.statusMessage=xe(this.statusMessage)),this.data!==void 0&&(e.data=this.data),e}};O(S,"__h3_error__",!0);function Ie(r){if(typeof r=="string")return new S(r);if(Ze(r))return r;let e=new S(r.message??r.statusMessage??"",{cause:r.cause||r});if(he(r,"stack"))try{Object.defineProperty(e,"stack",{get(){return r.stack}});}catch{try{e.stack=r.stack;}catch{}}if(r.data&&(e.data=r.data),r.statusCode?e.statusCode=fe(r.statusCode,e.statusCode):r.status&&(e.statusCode=fe(r.status,e.statusCode)),r.statusMessage?e.statusMessage=r.statusMessage:r.statusText&&(e.statusMessage=r.statusText),e.statusMessage){let t=e.statusMessage;xe(e.statusMessage)!==t&&console.warn("[h3] Please prefer using `message` for longer error messages instead of `statusMessage`. In the future, `statusMessage` will be sanitized by default.");}return r.fatal!==void 0&&(e.fatal=r.fatal),r.unhandled!==void 0&&(e.unhandled=r.unhandled),e}function Ze(r){return r?.constructor?.__h3_error__===!0}function Te(r){return Ee(r.path||"")}function et(r,e,t){if(t&&r.method==="HEAD")return !0;if(typeof e=="string"){if(r.method===e)return !0}else if(e.includes(r.method))return !0;return !1}function tt(r,e,t){if(!et(r,e,t))throw Ie({statusCode:405,statusMessage:"HTTP method is not allowed."})}function rt(r){let e={};for(let t in r.node.req.headers){let s=r.node.req.headers[t];e[t]=Array.isArray(s)?s.filter(Boolean).join(", "):s;}return e}function st(r,e){return rt(r)[e.toLowerCase()]}var pe=st;var ye=Symbol.for("h3RawBody"),le=Symbol.for("h3ParsedBody"),ot=["PATCH","POST","PUT","DELETE"];function nt(r,e="utf8"){tt(r,ot);let t=r._requestBody||r.web?.request?.body||r.node.req[ye]||r.node.req.rawBody||r.node.req.body;if(t){let n=Promise.resolve(t).then(i=>Buffer.isBuffer(i)?i:typeof i.pipeTo=="function"?new Promise((a,u)=>{let f=[];i.pipeTo(new WritableStream({write(c){f.push(c);},close(){a(Buffer.concat(f));},abort(c){u(c);}})).catch(u);}):typeof i.pipe=="function"?new Promise((a,u)=>{let f=[];i.on("data",c=>{f.push(c);}).on("end",()=>{a(Buffer.concat(f));}).on("error",u);}):i.constructor===Object?Buffer.from(JSON.stringify(i)):Buffer.from(i));return e?n.then(i=>i.toString(e)):n}if(!Number.parseInt(r.node.req.headers["content-length"]||""))return Promise.resolve(void 0);let s=r.node.req[ye]=new Promise((n,i)=>{let a=[];r.node.req.on("error",u=>{i(u);}).on("data",u=>{a.push(u);}).on("end",()=>{n(Buffer.concat(a));});});return e?s.then(n=>n.toString(e)):s}async function Ae(r,e={}){let t=r.node.req;if(he(t,le))return t[le];let s=t.headers["content-type"]||"",o=await nt(r),n;return s==="application/json"?n=Oe(o,e.strict??!0):s.startsWith("application/x-www-form-urlencoded")?n=it(o):s.startsWith("text/")?n=o:n=Oe(o,e.strict??!1),t[le]=n,n}function Oe(r="",e){if(r)try{return me(r,{strict:e})}catch{throw Ie({statusCode:400,statusMessage:"Bad Request",message:"Invalid JSON body"})}}function it(r){let e=new URLSearchParams(r),t=Object.create(null);for(let[s,o]of e.entries())he(t,s)?(Array.isArray(t[s])||(t[s]=[t[s]]),t[s].push(o)):t[s]=o;return t}var at=/[^\u0009\u0020-\u007E]/g;function xe(r=""){return r.replace(at,"")}function fe(r,e=200){return !r||(typeof r=="string"&&(r=Number.parseInt(r,10)),r<100||r>999)?e:r}var ct=typeof setImmediate>"u"?r=>r():setImmediate;function Ne(r,e,t){return t&&dt(r,t),new Promise(s=>{ct(()=>{r.handled||r.node.res.end(e),s();});})}function dt(r,e){e&&r.node.res.statusCode!==304&&!r.node.res.getHeader("content-type")&&r.node.res.setHeader("content-type",e);}function ut(r,e){for(let[t,s]of Object.entries(e))r.node.res.setHeader(t,s);}var Se=ut;var k=(t=>(t.EXECUTE="execute",t.PREVIEW="preview",t))(k||{}),L=(s=>(s.DISCOVER="discover",s.HEALTH_CHECK="health-check",s.CODE="code",s))(L||{});var Pe="https://api.novu.co";var _=(d=>(d.WORKFLOW_NOT_FOUND_ERROR="WorkflowNotFoundError",d.WORKFLOW_ALREADY_EXISTS_ERROR="WorkflowAlreadyExistsError",d.WORKFLOW_EXECUTION_FAILED_ERROR="WorkflowExecutionFailedError",d.EXECUTION_STATE_OUTPUT_INVALID_ERROR="ExecutionStateOutputInvalidError",d.EXECUTION_STATE_RESULT_INVALID_ERROR="ExecutionStateResultInvalidError",d.EXECUTION_PROVIDER_OUTPUT_INVALID_ERROR="ExecutionProviderOutputInvalidError",d.PROVIDER_NOT_FOUND_ERROR="ProviderNotFoundError",d.PROVIDER_EXECUTION_FAILED_ERROR="ProviderExecutionFailedError",d.STEP_NOT_FOUND_ERROR="StepNotFoundError",d.STEP_ALREADY_EXISTS_ERROR="StepAlreadyExistsError",d.STEP_EXECUTION_FAILED_ERROR="StepExecutionFailedError",d.EXECUTION_STATE_CORRUPT_ERROR="ExecutionStateCorruptError",d.EXECUTION_EVENT_DATA_INVALID_ERROR="ExecutionEventDataInvalidError",d.EXECUTION_EVENT_INPUT_INVALID_ERROR="ExecutionEventInputInvalidError",d.EXECUTION_STATE_INPUT_INVALID_ERROR="ExecutionStateInputInvalidError",d.METHOD_NOT_ALLOWED_ERROR="MethodNotAllowedError",d.INVALID_ACTION_ERROR="InvalidActionError",d.MISSING_API_KEY_ERROR="MissingApiKeyError",d.SIGNATURE_MISMATCH_ERROR="SignatureMismatchError",d.SIGNATURE_NOT_FOUND_ERROR="SignatureNotFoundError",d.SIGNATURE_INVALID_ERROR="SignatureInvalidError",d.SIGNATURE_EXPIRED_ERROR="SignatureExpiredError",d.SIGNING_KEY_NOT_FOUND_ERROR="SigningKeyNotFoundError",d.PLATFORM_ERROR="PlatformError",d.SIGNATURE_VERSION_INVALID_ERROR="SignatureVersionInvalidError",d))(_||{});var v=(s=>(s.POST="POST",s.GET="GET",s.OPTIONS="OPTIONS",s))(v||{});var w=class extends Error{data},M=class extends w{statusCode=404},R=class extends w{statusCode=400},E=class extends w{statusCode=401},T=class extends w{statusCode=500},F=class extends w{statusCode=409};var $=class extends R{code="ExecutionStateCorruptError";constructor(e,t){super(`Workflow with id: \`${e}\` has a corrupt state. Step with id: \`${t}\` does not exist. Please provide the missing state.`),this.data={workflowId:e,stepId:t};}},W=class extends R{code="ExecutionEventDataInvalidError";constructor(e,t){super(`Workflow with id: \`${e}\` has invalid \`data\`. Please provide the correct event data.`),this.data=t;}},P=class extends R{code="ExecutionEventInputInvalidError";constructor(e,t){super(`Workflow with id: \`${e}\` has invalid \`inputs\`. Please provide the correct event inputs.`),this.data=t;}},q=class extends R{code="ExecutionStateInputInvalidError";constructor(e,t,s){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` has invalid input. Please provide the correct step input.`),this.data=s;}},j=class extends R{code="ExecutionStateOutputInvalidError";constructor(e,t,s){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` has invalid output. Please provide the correct step output.`),this.data=s;}},H=class extends R{code="ExecutionStateResultInvalidError";constructor(e,t,s){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` has invalid result. Please provide the correct step result.`),this.data=s;}},V=class extends R{code="ExecutionProviderOutputInvalidError";constructor(e,t,s,o){super(`Workflow with id: \`${e}\` has an invalid state. Step with id: \`${t}\` and provider with id: \`${s}\` has invalid output. Please provide the correct provider output.`),this.data=o;}};var l={info:r=>A__default.default.blue(r),warning:r=>A__default.default.yellow(r),error:r=>A__default.default.red(r),success:r=>A__default.default.green(r),underline:r=>A__default.default.underline(r),bold:r=>A__default.default.bold(r)},h={SUCCESS:l.success("\u2714"),ERROR:l.error("\u2717"),WARNING:l.warning("\u26A0"),INFO:l.info("\u2139"),ARROW:l.bold("\u2192"),MOCK:l.info("\u25CB"),HYDRATED:l.bold(l.info("\u2192")),STEP:l.info("\u03C3"),ACTION:l.info("\u03B1"),DURATION:l.info("\u0394"),PROVIDER:l.info("\u2699"),OUTPUT:l.info("\u21E2"),INPUT:l.info("\u21E0"),WORKFLOW:l.info("\u03C9"),STATE:l.info("\u03C3"),EXECUTE:l.info("\u03B5"),PREVIEW:l.info("\u03C1")};var Re=r=>Object.values(r).map(e=>`\`${e}\``).join(", "),B=r=>r.replaceAll(/(\w)(\w*)/g,(e,t,s)=>t.toUpperCase()+s.toLowerCase()).replaceAll(/[\s-]+/g,"");var G=class extends w{code="MethodNotAllowedError";statusCode=405;message=`Method not allowed. Please use one of ${Re(v)}`},C=class extends R{code="InvalidActionError";constructor(e,t){super(`Invalid query string: \`action\`=\`${e}\`. Please use one of ${Re(t)}`);}};var K=class extends T{code="PlatformError";message="Something went wrong. Please try again later."};var b=class extends F{constructor(e,t){super(`${B(e)} with id: \`${t}\` already exists. Please use a different id.`);}},m=class extends M{constructor(e,t){super(`${B(e)} with id: \`${t}\` does not exist. Please provide a valid id.`);}},x=class extends T{constructor(e,t){super(`Failed to execute ${B(e)} with id: \`${t}\`. Please try again later.`);}};var X=class extends m{code="ProviderNotFoundError";constructor(e){super("provider",e);}},Y=class extends x{code="ProviderExecutionFailedError";constructor(e){super("workflow",e);}};var J=class extends E{code="SignatureMismatchError";constructor(){super("Signature does not match the expected signature. Please ensure the signature provided in the `x-novu-signature` header is correct and try again.");}},z=class extends E{code="SignatureNotFoundError";constructor(){super("Signature not found. Please provide a signature in the `x-novu-signature` header");}},Q=class extends E{code="SignatureInvalidError";constructor(){super("Signature is invalid. Please provide a valid signature in the `x-novu-signature` header");}},Z=class extends E{code="SignatureExpiredError";constructor(){super(`Signature expired. Please provide a signature with a timestamp no older than ${5} minutes in the \`x-novu-signature\` header`);}},ee=class extends E{code="SigningKeyNotFoundError";constructor(){super("Signature key not found. Please provide a valid key in the Client constructor `config.apiKey`");}};var te=class extends m{code="StepNotFoundError";constructor(e){super("step",e);}};var U=class extends m{code="WorkflowNotFoundError";constructor(e){super("workflow",e);}},re=class extends b{code="WorkflowAlreadyExistsError";constructor(e){super("workflow",e);}};var De={name:"@novu/framework",version:"0.24.3-alpha.6",description:"The Code-First Notifications Workflow SDK.",main:"./dist/index.js",types:"./dist/index.d.ts",publishConfig:{registry:"https://registry.npmjs.org",access:"public"},private:!1,repository:{type:"git",url:"git+https://github.com/novuhq/novu.git"},files:["dist","README.md"],scripts:{preinstall:"npx only-allow pnpm",test:"vitest","test:watch":"vitest --watch",lint:"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix",format:"prettier --check --ignore-path .gitignore .","format:fix":"prettier --write --ignore-path .gitignore .",build:"tsup","build:watch":"tsup --watch","$comment:bump:prerelease":"This is a workaround to support `npm version prerelease` with lerna","bump:prerelease":"npm version prerelease --preid=alpha & PID=$!; (sleep 1 && kill -9 $PID) & wait $PID","release:alpha":"pnpm bump:prerelease || pnpm build && npm publish"},keywords:["novu","code-first","workflows","durable","sdk","notifications","email","sms","push","webhooks","next","nuxt","h3","express"],author:"Novu",license:"MIT",exports:{".":{require:"./dist/index.js",import:"./dist/index.js",types:"./dist/index.d.ts"},"./express":{require:"./dist/express.js",import:"./dist/express.js",types:"./dist/express.d.ts"},"./next":{require:"./dist/next.js",import:"./dist/next.js",types:"./dist/next.d.ts"},"./nuxt":{require:"./dist/nuxt.js",import:"./dist/nuxt.js",types:"./dist/nuxt.d.ts"},"./h3":{require:"./dist/h3.js",import:"./dist/h3.js",types:"./dist/h3.d.ts"},"./sveltekit":{require:"./dist/sveltekit.js",import:"./dist/sveltekit.js",types:"./dist/sveltekit.d.ts"},"./remix":{require:"./dist/remix.js",import:"./dist/remix.js",types:"./dist/remix.d.ts"}},devDependencies:{"@sveltejs/kit":"^2.5.10","@types/express":"^4.17.13","@types/json-schema":"^7.0.15","@types/node":"^20.11.20","@vercel/node":"^2.15.9",express:"^4.18.2",h3:"^1.11.1",next:"^13.5.4",prettier:"^3.2.5","ts-node":"^10.9.2",tsup:"^8.0.2",typescript:"^5.3.3",vitest:"^1.2.1"},dependencies:{ajv:"^8.12.0","ajv-formats":"^2.1.1","better-ajv-errors":"^1.2.0",chalk:"^4.1.2","cross-fetch":"^4.0.0","json-schema-faker":"^0.5.6","json-schema-to-ts":"^3.0.0",liquidjs:"^10.13.1",ora:"^5.4.1"}};var _e=De.version;jsonSchemaFaker.JSONSchemaFaker.option({useDefaultValue:!0,alwaysFakeOptionals:!0});var oe=class{discoveredWorkflows=[];ajv;templateEngine=new liquidjs.Liquid;apiUrl;apiKey;version=_e;strictAuthentication;static NOVU_SIGNATURE_HEADER="x-novu-signature";constructor(e){let t=this.buildOptions(e);this.apiKey=t.apiKey,this.apiUrl=t.apiUrl,this.strictAuthentication=t.strictAuthentication;let s=new ht__default.default({useDefaults:!0});pt__default.default(s),this.ajv=s;}buildOptions(e){let t={apiKey:void 0,apiUrl:Pe,strictAuthentication:!0};return e?.apiKey!==void 0?t.apiKey=e.apiKey:process.env.NOVU_API_KEY!==void 0&&(t.apiKey=process.env.NOVU_API_KEY),e?.apiUrl!==void 0?t.apiUrl=e.apiUrl:process.env.NOVU_API_URL!==void 0&&(t.apiUrl=process.env.NOVU_API_URL),e?.strictAuthentication!==void 0?t.strictAuthentication=e.strictAuthentication:process.env.NOVU_STRICT_AUTHENTICATION!==void 0&&(t.strictAuthentication=process.env.NOVU_STRICT_AUTHENTICATION==="true"),t}addWorkflows(e){for(let t of e){if(this.discoveredWorkflows.some(s=>s.workflowId===t.workflowId))throw new re(t.workflowId);this.discoveredWorkflows.push(t);}}healthCheck(){let e=this.discoveredWorkflows.length,t=this.discoveredWorkflows.reduce((s,o)=>s+o.steps.length,0);return {status:"ok",version:_e,discovered:{workflows:e,steps:t}}}getWorkflow(e){let t=this.discoveredWorkflows.find(s=>s.workflowId===e);if(t)return t;throw new U(e)}getStep(e,t){let o=this.getWorkflow(e).steps.find(n=>n.stepId===t);if(o)return o;throw new te(t)}getRegisteredWorkflows(){return this.discoveredWorkflows}discover(){return {workflows:this.getRegisteredWorkflows()}}getHeaders(e){let t={"content-type":"application/json",authorization:`ApiKey ${this.apiKey}`};return e&&(t["x-novu-anonymous"]=e),t}mock(e){return jsonSchemaFaker.JSONSchemaFaker.generate(e)}validate(e,t,s,o,n,i,a,u){if(!t(e)){let c=Rt__default.default(s,e,t.errors||[]);switch(console.error(`
21
+ ${c}`),o){case"event":this.validateEvent(n,i,t);case"step":this.validateStep(a,n,i,t);case"provider":this.validateProvider(a,u,n,i,t);}}}validateProvider(e,t,s,o,n){if(!e)throw new Error("stepId is required");if(!t)throw new Error("providerId is required");switch(s){case"output":throw new V(o,e,t,n.errors);default:throw new Error(`Invalid payload type: '${s}'`)}}validateStep(e,t,s,o){if(!e)throw new Error("stepId is required");switch(t){case"output":throw new j(s,e,o.errors);case"result":throw new H(s,e,o.errors);case"input":throw new q(s,e,o.errors);default:throw new Error(`Invalid payload type: '${t}'`)}}validateEvent(e,t,s){switch(e){case"input":throw new P(t,s.errors);case"data":throw new W(t,s.errors);default:throw new Error(`Invalid payload type: '${e}'`)}}executeStepFactory(e,t){return async(s,o,n)=>{let i=this.getStep(e.workflowId,s),a=wt(e),u=this.createStepInputs(i,a),f=e.action==="preview";if(!f&&await this.shouldSkip(n?.skip,u))return t({options:{skip:!0}}),{};let c=this.previewStep.bind(this),p=this.executeStep.bind(this),D=await(f?c:p)(e,{...i,providers:i.providers.map(I=>{let N=n?.providers?.[I.type];if(!N)throw new X(I.type);return {...I,resolve:N}}),resolve:o});return s===e.stepId&&t(D),D.outputs}}async shouldSkip(e,t){return e?e(t):!1}async executeWorkflow(e){let o=`${{execute:"Executing",preview:"Previewing"}[e.action]} workflowId:`;console.log(`
22
+ ${l.bold(l.underline(o))} '${e.workflowId}'`);let n=this.getWorkflow(e.workflowId),i=process.hrtime(),a={outputs:{},providers:{},options:{}},u,f=new Promise(y=>{u=y;}),c=y=>{u(),a=y;},p;try{if(e.action==="execute"&&!e.data)throw new P(e.workflowId,{message:"Event `data` is required"});let y=this.createExecutionInputs(e,n);await Promise.race([f,n.execute({payload:y,environment:{},input:{},subscriber:e.subscriber,step:{email:this.executeStepFactory(e,c),sms:this.executeStepFactory(e,c),inApp:this.executeStepFactory(e,c),digest:this.executeStepFactory(e,c),delay:this.executeStepFactory(e,c),push:this.executeStepFactory(e,c),chat:this.executeStepFactory(e,c),custom:this.executeStepFactory(e,c)}})]);}catch(y){p=y;}let g=process.hrtime(i),D=g[0],I=g[1],N=D*1e3+I/1e6,Le=p?h.ERROR:h.SUCCESS,ve=e.action==="execute"?"Executed":e.action==="preview"?"Previewed":"Invalid action";if(console.log(`${Le} ${ve} workflowId: \`${e.workflowId}\``),this.prettyPrintExecute(e,N,p),p)throw p;return {outputs:a.outputs,providers:a.providers,options:a.options,metadata:{status:"success",error:!1,duration:N}}}createExecutionInputs(e,t){let s=e.data;return this.validate(e.data,t.data.validate,t.data.schema,"event","input",e.workflowId),s}prettyPrintExecute(e,t,s){let o=s?h.ERROR:h.SUCCESS,n=e.action==="execute"?"Executed":e.action==="preview"?"Previewed":"Invalid action",i=s?"Failed to execute":n,a=s?l.error:l.success,u=`${o} ${i} workflowId: '${e.workflowId}`;console.log(`
23
23
  ${l.bold(a(u))}'`),console.log(` \u251C ${h.STEP} stepId: '${e.stepId}'`),console.log(` \u251C ${h.ACTION} action: '${e.action}'`),console.log(` \u2514 ${h.DURATION} duration: '${t.toFixed(2)}ms'
24
- `);}async executeProviders(e,t){return t.providers.reduce(async(s,o)=>{let n=await s,i=this.previewProvider.bind(this),a=this.executeProvider.bind(this),f=await(e.action==="preview"?i:a)(e,t,o);return {...n,[o.type]:f}},Promise.resolve({}))}previewProvider(e,t,s){return console.log(` ${h.MOCK} Mocked provider: \`${s.type}\``),this.mock(s.outputs.schema)}async executeProvider(e,t,s){let o=oe__default.default({indent:2}).start(`Executing provider: \`${s.type}\``);try{if(e.stepId===t.stepId){let n=this.createStepInputs(t,e),i=await s.resolve({inputs:n});return this.validate(i,s.outputs.validate,s.outputs.schema,"step","output",e.workflowId,t.stepId,s.type),o.succeed(`Executed provider: \`${s.type}\``),i}else o.stopAndPersist({symbol:h.HYDRATED,text:`Hydrated provider: \`${s.type}\``});}catch(n){throw o.stopAndPersist({symbol:h.ERROR,text:`Failed to execute provider: \`${s.type}\``}),new J(`Failed to execute provider: '${s.type}'.
25
- ${n.message}`)}}async executeStep(e,t){if(e.stepId===t.stepId){let s=oe__default.default({indent:1}).start(`Executing stepId: \`${t.stepId}\``);try{let o=this.createStepInputs(t,e),n=await this.compileInputs(o,e),i=await t.resolve(n);this.validate(i,t.outputs.validate,t.outputs.schema,"step","output",e.workflowId,t.stepId);let a=await this.executeProviders(e,t);return s.succeed(`Executed stepId: \`${t.stepId}\``),{outputs:i,providers:a}}catch(o){throw s.stopAndPersist({prefixText:"",symbol:h.ERROR,text:`Failed to execute stepId: \`${t.stepId}\``}),o}}else {let s=oe__default.default({indent:1}).start(`Hydrating stepId: \`${t.stepId}\``);try{let o=e.state.find(n=>n.stepId===t.stepId);if(o)return this.validate(o.outputs,t.results.validate,t.results.schema,"step","result",e.workflowId,t.stepId),s.stopAndPersist({symbol:h.HYDRATED,text:`Hydrated stepId: \`${t.stepId}\``}),{outputs:o.outputs,providers:await this.executeProviders(e,t)};throw new W(e.workflowId,t.stepId)}catch(o){throw s.stopAndPersist({symbol:h.ERROR,text:`Failed to hydrate stepId: \`${t.stepId}\``}),o}}}async compileInputs(e,t){let s=this.templateEngine.parse(JSON.stringify(e)),o=await this.templateEngine.render(s,{...t.data,subscriber:t.subscriber});return JSON.parse(o)}createStepInputs(e,t){let s=t.inputs;return this.validate(s,e.inputs.validate,e.inputs.schema,"step","input",t.workflowId,e.stepId),s}async previewStep(e,t){let s=oe__default.default({indent:1}).start(`Previewing stepId: \`${t.stepId}\``);try{if(e.stepId===t.stepId){let o=this.createStepInputs(t,e),n=await t.resolve(o);return this.validate(n,t.outputs.validate,t.outputs.schema,"step","output",e.workflowId,t.stepId),s.stopAndPersist({symbol:h.MOCK,text:`Mocked stepId: \`${t.stepId}\``}),{outputs:n,providers:await this.executeProviders(e,t)}}else {let o=this.mock(t.results.schema);return s.stopAndPersist({symbol:h.MOCK,text:`Mocked stepId: \`${t.stepId}\``}),{outputs:o,providers:await this.executeProviders(e,t)}}}catch(o){throw s.stopAndPersist({symbol:h.ERROR,text:`Failed to preview stepId: \`${t.stepId}\``}),o}}getStepCode(e,t){return {code:this.getStep(e,t).resolve.toString()}}getWorkflowCode(e){return {code:this.getWorkflow(e).execute.toString()}}getCode(e,t){let s;if(e)t?s=this.getStepCode(e,t):s=this.getWorkflowCode(e);else throw new k(e);return s}};function gt(r){return JSON.parse(JSON.stringify(r))}var ie=class{frameworkName;handler;client;hmacEnabled;constructor(e){this.handler=e.handler,this.client=e.client?e.client:new ne,this.client.addWorkflows(e.workflows),this.frameworkName=e.frameworkName,this.hmacEnabled=this.client.strictAuthentication;}createHandler(){return async(...e)=>{let t=await this.handler(...e),s=await this.handleAction({actions:t});return t.transformResponse(s)}}getStaticHeaders(){let e=`novu-framework:v${this.client.version}`;return {"content-type":"application/json","access-control-allow-origin":"*","access-control-allow-methods":"GET, POST","access-control-allow-headers":"*","access-control-max-age":"604800","x-novu-framework":this.frameworkName,"user-agent":e,"x-novu-sdk":e}}createResponse(e,t,s={}){return {status:e,body:JSON.stringify(t),headers:{...this.getStaticHeaders(),...s}}}createError(e){return {status:e.statusCode,body:JSON.stringify({message:e.message,data:e.data,code:e.code}),headers:this.getStaticHeaders()}}async handleAction({actions:e}){let t=await e.url(),s=await e.method(),o=t.searchParams.get("action")||"",n=t.searchParams.get("workflowId")||"",i=t.searchParams.get("stepId")||"",a=await e.headers("x-novu-signature")||"",u=await e.headers("x-novu-anonymous")||"",f=t.searchParams.get("source")||"",c={};try{s==="POST"&&(c=await e.body());}catch{}try{o!=="health-check"&&this.validateHmac(c,a);let p=this.getPostActionMap(c,n,i,o,u,f),g=this.getGetActionMap(n,i);if(s==="POST")return await this.handlePostAction(o,p);if(s==="GET")return await this.handleGetAction(o,g);if(s==="OPTIONS")return this.createResponse(200,{},{...this.getStaticHeaders()})}catch(p){return this.handleError(p)}return this.createError(new K(s))}getPostActionMap(e,t,s,o,n,i){return {execute:async()=>{let a=await this.client.executeWorkflow({...e,workflowId:t,stepId:s,action:o});return this.createResponse(200,a,{"x-novu-execution-duration":a.metadata.duration.toString()})},preview:async()=>{let a=await this.client.executeWorkflow({...e,workflowId:t,stepId:s,action:o});return this.createResponse(200,a,{"x-novu-execution-duration":a.metadata.duration.toString()})},sync:async()=>{if(!this.client.apiKey)throw new U;let a=await this.client.sync(e.bridgeUrl,n,i);return this.createResponse(200,a)},diff:async()=>{if(!this.client.apiKey)throw new U;let a=await this.client.diff(e.bridgeUrl,n);return this.createResponse(200,a)}}}getGetActionMap(e,t){return {discover:async()=>{let s=await this.client.discover();return this.createResponse(200,s)},"health-check":async()=>{let s=await this.client.healthCheck();return this.createResponse(200,s)},code:async()=>{let s=await this.client.getCode(e,t);return this.createResponse(200,s)}}}async handlePostAction(e,t){if(Object.values(v).includes(e)){let s=t[e];return s()}else throw new b(e,v)}async handleGetAction(e,t){if(Object.values(M).includes(e)){let s=t[e];return s()}else throw new b(e,M)}isClientError(e){return Object.values(_).includes(e.code)}handleError(e){return this.isClientError(e)?(e.statusCode===500&&console.error(e),this.createError(e)):(console.error(e),this.createError(new Y))}validateHmac(e,t){if(!this.hmacEnabled)return;if(!t)throw new Q;if(!this.client.apiKey)throw new te;let[s,o]=t.split(",");if(!s||!o)throw new Z;let[n,i]=s.split("="),[a,u]=o.split("=");if(Number(n)<Date.now()-1500)throw new ee;if(!(this.hashHmac(this.client.apiKey,`${i}.${JSON.stringify(e)}`)===u))throw new z}hashHmac(e,t){return crypto.createHmac("sha256",e).update(t).digest("hex")}};var yt="h3",xs=r=>new ie({frameworkName:yt,...r,handler:t=>({body:()=>xe(t),headers:s=>Re(t,s),method:()=>t.method,url:()=>new URL(String(t.path),`${process.env.NODE_ENV==="development"?"http":"https"}://${String(Re(t,"host"))}`),queryString:s=>String(Ae(t)[s]),transformResponse:s=>{let{res:o}=t.node;return o.statusCode=s.status,Pe(t,s.headers),Se(t,s.body)}})}).createHandler();
24
+ `);}async executeProviders(e,t){return t.providers.reduce(async(s,o)=>{let n=await s,i=this.previewProvider.bind(this),a=this.executeProvider.bind(this),f=await(e.action==="preview"?i:a)(e,t,o);return {...n,[o.type]:f}},Promise.resolve({}))}previewProvider(e,t,s){return console.log(` ${h.MOCK} Mocked provider: \`${s.type}\``),this.mock(s.outputs.schema)}async executeProvider(e,t,s){let o=se__default.default({indent:2}).start(`Executing provider: \`${s.type}\``);try{if(e.stepId===t.stepId){let n=this.createStepInputs(t,e),i=await s.resolve({inputs:n});return this.validate(i,s.outputs.validate,s.outputs.schema,"step","output",e.workflowId,t.stepId,s.type),o.succeed(`Executed provider: \`${s.type}\``),i}else o.stopAndPersist({symbol:h.HYDRATED,text:`Hydrated provider: \`${s.type}\``});}catch(n){throw o.stopAndPersist({symbol:h.ERROR,text:`Failed to execute provider: \`${s.type}\``}),new Y(`Failed to execute provider: '${s.type}'.
25
+ ${n.message}`)}}async executeStep(e,t){if(e.stepId===t.stepId){let s=se__default.default({indent:1}).start(`Executing stepId: \`${t.stepId}\``);try{let o=this.createStepInputs(t,e),n=await this.compileInputs(o,e),i=await t.resolve(n);this.validate(i,t.outputs.validate,t.outputs.schema,"step","output",e.workflowId,t.stepId);let a=await this.executeProviders(e,t);return s.succeed(`Executed stepId: \`${t.stepId}\``),{outputs:i,providers:a}}catch(o){throw s.stopAndPersist({prefixText:"",symbol:h.ERROR,text:`Failed to execute stepId: \`${t.stepId}\``}),o}}else {let s=se__default.default({indent:1}).start(`Hydrating stepId: \`${t.stepId}\``);try{let o=e.state.find(n=>n.stepId===t.stepId);if(o)return this.validate(o.outputs,t.results.validate,t.results.schema,"step","result",e.workflowId,t.stepId),s.stopAndPersist({symbol:h.HYDRATED,text:`Hydrated stepId: \`${t.stepId}\``}),{outputs:o.outputs,providers:await this.executeProviders(e,t)};throw new $(e.workflowId,t.stepId)}catch(o){throw s.stopAndPersist({symbol:h.ERROR,text:`Failed to hydrate stepId: \`${t.stepId}\``}),o}}}async compileInputs(e,t){let s=this.templateEngine.parse(JSON.stringify(e)),o=await this.templateEngine.render(s,{...t.data,subscriber:t.subscriber});return JSON.parse(o)}createStepInputs(e,t){let s=t.inputs;return this.validate(s,e.inputs.validate,e.inputs.schema,"step","input",t.workflowId,e.stepId),s}async previewStep(e,t){let s=se__default.default({indent:1}).start(`Previewing stepId: \`${t.stepId}\``);try{if(e.stepId===t.stepId){let o=this.createStepInputs(t,e),n=await this.compileInputs(o,e),i=await t.resolve(n);return this.validate(i,t.outputs.validate,t.outputs.schema,"step","output",e.workflowId,t.stepId),s.stopAndPersist({symbol:h.MOCK,text:`Mocked stepId: \`${t.stepId}\``}),{outputs:i,providers:await this.executeProviders(e,t)}}else {let o=this.mock(t.results.schema);return s.stopAndPersist({symbol:h.MOCK,text:`Mocked stepId: \`${t.stepId}\``}),{outputs:o,providers:await this.executeProviders(e,t)}}}catch(o){throw s.stopAndPersist({symbol:h.ERROR,text:`Failed to preview stepId: \`${t.stepId}\``}),o}}getStepCode(e,t){return {code:this.getStep(e,t).resolve.toString()}}getWorkflowCode(e){return {code:this.getWorkflow(e).execute.toString()}}getCode(e,t){let s;if(e)t?s=this.getStepCode(e,t):s=this.getWorkflowCode(e);else throw new U(e);return s}};function wt(r){return JSON.parse(JSON.stringify(r))}var ne=class{frameworkName;handler;client;hmacEnabled;constructor(e){this.handler=e.handler,this.client=e.client?e.client:new oe,this.client.addWorkflows(e.workflows),this.frameworkName=e.frameworkName,this.hmacEnabled=this.client.strictAuthentication;}createHandler(){return async(...e)=>{let t=await this.handler(...e),s=await this.handleAction({actions:t});return t.transformResponse(s)}}getStaticHeaders(){let e=`novu-framework:v${this.client.version}`;return {"content-type":"application/json","access-control-allow-origin":"*","access-control-allow-methods":"GET, POST","access-control-allow-headers":"*","access-control-max-age":"604800","x-novu-framework":this.frameworkName,"user-agent":e,"x-novu-sdk":e}}createResponse(e,t,s={}){return {status:e,body:JSON.stringify(t),headers:{...this.getStaticHeaders(),...s}}}createError(e){return {status:e.statusCode,body:JSON.stringify({message:e.message,data:e.data,code:e.code}),headers:this.getStaticHeaders()}}async handleAction({actions:e}){let t=await e.url(),s=await e.method(),o=t.searchParams.get("action")||"",n=t.searchParams.get("workflowId")||"",i=t.searchParams.get("stepId")||"",a=await e.headers("x-novu-signature")||"",u=await e.headers("x-novu-anonymous")||"",f=t.searchParams.get("source")||"",c={};try{s==="POST"&&(c=await e.body());}catch{}try{o!=="health-check"&&this.validateHmac(c,a);let p=this.getPostActionMap(c,n,i,o,u,f),g=this.getGetActionMap(n,i);if(s==="POST")return await this.handlePostAction(o,p);if(s==="GET")return await this.handleGetAction(o,g);if(s==="OPTIONS")return this.createResponse(200,{},{...this.getStaticHeaders()})}catch(p){return this.handleError(p)}return this.createError(new G(s))}getPostActionMap(e,t,s,o,n,i){return {execute:async()=>{let a=await this.client.executeWorkflow({...e,workflowId:t,stepId:s,action:o});return this.createResponse(200,a,{"x-novu-execution-duration":a.metadata.duration.toString()})},preview:async()=>{let a=await this.client.executeWorkflow({...e,workflowId:t,stepId:s,action:o});return this.createResponse(200,a,{"x-novu-execution-duration":a.metadata.duration.toString()})}}}getGetActionMap(e,t){return {discover:async()=>{let s=await this.client.discover();return this.createResponse(200,s)},"health-check":async()=>{let s=await this.client.healthCheck();return this.createResponse(200,s)},code:async()=>{let s=await this.client.getCode(e,t);return this.createResponse(200,s)}}}async handlePostAction(e,t){if(Object.values(k).includes(e)){let s=t[e];return s()}else throw new C(e,k)}async handleGetAction(e,t){if(Object.values(L).includes(e)){let s=t[e];return s()}else throw new C(e,L)}isClientError(e){return Object.values(_).includes(e.code)}handleError(e){return this.isClientError(e)?(e.statusCode===500&&console.error(e),this.createError(e)):(console.error(e),this.createError(new K))}validateHmac(e,t){if(!this.hmacEnabled)return;if(!t)throw new z;if(!this.client.apiKey)throw new ee;let[s,o]=t.split(",");if(!s||!o)throw new Q;let[n,i]=s.split("="),[a,u]=o.split("=");if(Number(n)<Date.now()-1500)throw new Z;if(!(this.hashHmac(this.client.apiKey,`${i}.${JSON.stringify(e)}`)===u))throw new J}hashHmac(e,t){return crypto.createHmac("sha256",e).update(t).digest("hex")}};var mt="h3",Ns=r=>new ne({frameworkName:mt,...r,handler:t=>({body:()=>Ae(t),headers:s=>pe(t,s),method:()=>t.method,url:()=>new URL(String(t.path),`${process.env.NODE_ENV==="development"?"http":"https"}://${String(pe(t,"host"))}`),queryString:s=>String(Te(t)[s]),transformResponse:s=>{let{res:o}=t.node;return o.statusCode=s.status,Se(t,s.headers),Ne(t,s.body)}})}).createHandler();
26
26
 
27
- exports.frameworkName = yt;
28
- exports.serve = xs;
27
+ exports.frameworkName = mt;
28
+ exports.serve = Ns;
@@ -2914,8 +2914,6 @@ declare class Client {
2914
2914
  private getRegisteredWorkflows;
2915
2915
  discover(): DiscoverOutput;
2916
2916
  private getHeaders;
2917
- diff(bridgeUrl: string, anonymous?: string): Promise<unknown>;
2918
- sync(bridgeUrl: string, anonymous?: string, source?: string): Promise<unknown>;
2919
2917
  /**
2920
2918
  * Mocks data based on the given schema.
2921
2919
  * The `default` value in the schema is used as the base data.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { E as Execute, W as WorkflowOptions, D as DiscoverWorkflowOutput } from './handler-58kccf2b.js';
2
- export { j as ActionStep, A as ActionStepOptions, y as Awaitable, l as ChannelStep, r as ChatOutput, s as ChatResult, C as Client, b as ClientOptions, a as CodeResult, k as CustomStep, f as DiscoverOutput, d as DiscoverProviderOutput, e as DiscoverStepOutput, x as Either, m as EmailOutput, n as EmailResult, z as ExecuteInput, h as ExecuteOutput, g as ExecuteOutputMetadata, H as HealthCheck, I as IEvent, t as InAppOutput, u as InAppResult, J as JobStatusEnum, N as NovuRequestHandler, P as PushOutput, q as PushResult, S as ServeHandlerOptions, o as SmsOutput, p as SmsResult, v as Step, c as StepType, w as Subscriber, i as SupportedFrameworkName, V as Validate } from './handler-58kccf2b.js';
1
+ import { E as Execute, W as WorkflowOptions, D as DiscoverWorkflowOutput } from './handler-jSdMUIfN.js';
2
+ export { j as ActionStep, A as ActionStepOptions, y as Awaitable, l as ChannelStep, r as ChatOutput, s as ChatResult, C as Client, b as ClientOptions, a as CodeResult, k as CustomStep, f as DiscoverOutput, d as DiscoverProviderOutput, e as DiscoverStepOutput, x as Either, m as EmailOutput, n as EmailResult, z as ExecuteInput, h as ExecuteOutput, g as ExecuteOutputMetadata, H as HealthCheck, I as IEvent, t as InAppOutput, u as InAppResult, J as JobStatusEnum, N as NovuRequestHandler, P as PushOutput, q as PushResult, S as ServeHandlerOptions, o as SmsOutput, p as SmsResult, v as Step, c as StepType, w as Subscriber, i as SupportedFrameworkName, V as Validate } from './handler-jSdMUIfN.js';
3
3
  import { Schema } from 'ajv';
4
4
  import { FromSchema } from 'json-schema-to-ts';
5
5