@xtr-dev/payload-automation 0.0.50 → 0.0.51

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.
@@ -147,7 +147,7 @@ const MAX_CACHE_SIZE = 1000;
147
147
  return await evaluate(template, context, options);
148
148
  } catch (e) {
149
149
  if (options.debug && options.logger) {
150
- options.logger.info('Failed to evaluate expression:', e instanceof Error ? e.message : e);
150
+ options.logger.info(e instanceof Error ? e.message : e, 'Failed to evaluate expression:');
151
151
  }
152
152
  // If it fails to evaluate, return as literal string
153
153
  return template;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/expression-engine.ts"],"sourcesContent":["import jsonata from 'jsonata'\nimport type {Payload} from \"payload\";\n\n/**\n * Expression engine using JSONata for safe, sandboxed expression evaluation.\n * Used for both conditions and data transformation in workflows.\n *\n * @example Conditions\n * ```\n * trigger.doc._status = \"published\"\n * trigger.doc.count > 10 and trigger.doc.enabled\n * $exists(steps.validate.output.error) = false\n * ```\n *\n * @example Data Transformation\n * ```\n * {\n * \"id\": trigger.doc.id,\n * \"title\": $uppercase(trigger.doc.title),\n * \"tags\": trigger.doc.tags[category = \"featured\"].name\n * }\n * ```\n */\n\nexport interface ExpressionContext {\n trigger: Record<string, unknown>\n steps: Record<string, unknown>\n [key: string]: unknown\n}\n\nexport interface EvaluateOptions {\n /** Timeout in milliseconds (default: 5000) */\n timeout?: number\n debug?: boolean\n logger?: Payload['logger']\n}\n\n// Cache compiled expressions for performance\nconst expressionCache = new Map<string, jsonata.Expression>()\nconst MAX_CACHE_SIZE = 1000\n\n/**\n * Compile a JSONata expression with caching\n */\nfunction compileExpression(expression: string): jsonata.Expression {\n let compiled = expressionCache.get(expression)\n\n if (!compiled) {\n compiled = jsonata(expression)\n\n // Register custom functions\n registerCustomFunctions(compiled)\n\n // Manage cache size\n if (expressionCache.size >= MAX_CACHE_SIZE) {\n const firstKey = expressionCache.keys().next().value\n if (firstKey) expressionCache.delete(firstKey)\n }\n\n expressionCache.set(expression, compiled)\n }\n\n return compiled\n}\n\n/**\n * Register custom functions on a JSONata expression\n */\nfunction registerCustomFunctions(expr: jsonata.Expression): void {\n // $env(name) - Get environment variable (only non-sensitive ones)\n expr.registerFunction('env', (name: string) => {\n // Only allow specific prefixes for security\n if (typeof name === 'string' && name.startsWith('PUBLIC_')) {\n return process.env[name]\n }\n return undefined\n }, '<s:s>')\n\n // $now() - Current ISO timestamp\n expr.registerFunction('now', () => new Date().toISOString(), '<:s>')\n\n // $timestamp() - Current Unix timestamp in milliseconds\n expr.registerFunction('timestamp', () => Date.now(), '<:n>')\n\n // $uuid() - Generate a UUID v4\n expr.registerFunction('uuid', () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0\n const v = c === 'x' ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n }, '<:s>')\n\n // $default(value, defaultValue) - Return default if value is null/undefined\n expr.registerFunction('default', (value: unknown, defaultValue: unknown) => {\n return value === null || value === undefined ? defaultValue : value\n }, '<xx:x>')\n\n // $json(value) - Parse JSON string\n expr.registerFunction('json', (value: string) => {\n try {\n return JSON.parse(value)\n } catch {\n return undefined\n }\n }, '<s:x>')\n\n // $stringify(value) - Convert to JSON string\n expr.registerFunction('stringify', (value: unknown) => {\n try {\n return JSON.stringify(value)\n } catch {\n return undefined\n }\n }, '<x:s>')\n\n // $keys(object) - Get object keys\n expr.registerFunction('keys', (obj: Record<string, unknown>) => {\n if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n return Object.keys(obj)\n }\n return []\n }, '<o:a>')\n\n // $values(object) - Get object values\n expr.registerFunction('values', (obj: Record<string, unknown>) => {\n if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n return Object.values(obj)\n }\n return []\n }, '<o:a>')\n\n // $has(object, key) - Check if object has key\n expr.registerFunction('has', (obj: Record<string, unknown>, key: string) => {\n if (obj && typeof obj === 'object') {\n return key in obj\n }\n return false\n }, '<os:b>')\n\n // $coalesce(values...) - Return first non-null value\n expr.registerFunction('coalesce', (...values: unknown[]) => {\n for (const v of values) {\n if (v !== null && v !== undefined) {\n return v\n }\n }\n return null\n }, '<x+:x>')\n}\n\n/**\n * Evaluate a JSONata expression against a context\n */\nexport async function evaluate(\n expression: string,\n context: ExpressionContext,\n options: EvaluateOptions = {}\n): Promise<unknown> {\n const { timeout = 5000 } = options\n\n const compiled = compileExpression(expression)\n\n // Create a promise that rejects on timeout\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Expression evaluation timed out after ${timeout}ms`)), timeout)\n })\n\n // Race between evaluation and timeout\n return Promise.race([\n compiled.evaluate(context),\n timeoutPromise\n ])\n}\n\n/**\n * Evaluate a condition expression and return a boolean\n */\nexport async function evaluateCondition(\n expression: string,\n context: ExpressionContext,\n options: EvaluateOptions = {}\n): Promise<boolean> {\n try {\n const result = await evaluate(expression, context, options)\n\n // Convert result to boolean\n if (result === undefined || result === null) {\n return false\n }\n if (typeof result === 'boolean') {\n return result\n }\n if (typeof result === 'number') {\n return result !== 0\n }\n if (typeof result === 'string') {\n return result.length > 0\n }\n if (Array.isArray(result)) {\n return result.length > 0\n }\n return true\n } catch (error) {\n // Log error but return false for failed conditions\n console.warn('Condition evaluation failed:', error instanceof Error ? error.message : error)\n return false\n }\n}\n\n/**\n * Transform data using a JSONata expression\n * The expression can be a JSONata query or a JSON object with embedded expressions\n */\nexport async function transform(\n template: unknown,\n context: ExpressionContext,\n options: EvaluateOptions = {}\n): Promise<unknown> {\n if (typeof template === 'string') {\n // Check if it looks like a JSONata expression (starts with common patterns)\n if (\n template.startsWith('{') ||\n template.startsWith('[') ||\n template.startsWith('$') ||\n template.includes('.') ||\n template.includes('(')\n ) {\n try {\n return await evaluate(template, context, options)\n } catch (e) {\n if (options.debug && options.logger) {\n options.logger.info(\n 'Failed to evaluate expression:',\n e instanceof Error ? e.message : e\n )\n }\n // If it fails to evaluate, return as literal string\n return template\n }\n }\n return template\n }\n\n if (Array.isArray(template)) {\n return Promise.all(template.map(item => transform(item, context, options)))\n }\n\n if (template && typeof template === 'object') {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(template)) {\n result[key] = await transform(value, context, options)\n }\n return result\n }\n\n return template\n}\n\n/**\n * Resolve a step input configuration using JSONata\n * Handles both simple values and expressions\n */\nexport async function resolveStepInput(\n config: Record<string, unknown>,\n context: ExpressionContext,\n options: EvaluateOptions = {}\n): Promise<Record<string, unknown>> {\n const result: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(config)) {\n result[key] = await transform(value, context, options)\n }\n\n return result\n}\n\n/**\n * Clear the expression cache\n */\nexport function clearCache(): void {\n expressionCache.clear()\n}\n\n/**\n * Get cache statistics\n */\nexport function getCacheStats(): { size: number; maxSize: number } {\n return {\n size: expressionCache.size,\n maxSize: MAX_CACHE_SIZE\n }\n}\n"],"names":["jsonata","expressionCache","Map","MAX_CACHE_SIZE","compileExpression","expression","compiled","get","registerCustomFunctions","size","firstKey","keys","next","value","delete","set","expr","registerFunction","name","startsWith","process","env","undefined","Date","toISOString","now","replace","c","r","Math","random","v","toString","defaultValue","JSON","parse","stringify","obj","Array","isArray","Object","values","key","evaluate","context","options","timeout","timeoutPromise","Promise","_","reject","setTimeout","Error","race","evaluateCondition","result","length","error","console","warn","message","transform","template","includes","e","debug","logger","info","all","map","item","entries","resolveStepInput","config","clearCache","clear","getCacheStats","maxSize"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/core/expression-engine.ts"],"sourcesContent":["import jsonata from 'jsonata'\nimport type {Payload} from \"payload\";\n\n/**\n * Expression engine using JSONata for safe, sandboxed expression evaluation.\n * Used for both conditions and data transformation in workflows.\n *\n * @example Conditions\n * ```\n * trigger.doc._status = \"published\"\n * trigger.doc.count > 10 and trigger.doc.enabled\n * $exists(steps.validate.output.error) = false\n * ```\n *\n * @example Data Transformation\n * ```\n * {\n * \"id\": trigger.doc.id,\n * \"title\": $uppercase(trigger.doc.title),\n * \"tags\": trigger.doc.tags[category = \"featured\"].name\n * }\n * ```\n */\n\nexport interface ExpressionContext {\n trigger: Record<string, unknown>\n steps: Record<string, unknown>\n [key: string]: unknown\n}\n\nexport interface EvaluateOptions {\n /** Timeout in milliseconds (default: 5000) */\n timeout?: number\n debug?: boolean\n logger?: Payload['logger']\n}\n\n// Cache compiled expressions for performance\nconst expressionCache = new Map<string, jsonata.Expression>()\nconst MAX_CACHE_SIZE = 1000\n\n/**\n * Compile a JSONata expression with caching\n */\nfunction compileExpression(expression: string): jsonata.Expression {\n let compiled = expressionCache.get(expression)\n\n if (!compiled) {\n compiled = jsonata(expression)\n\n // Register custom functions\n registerCustomFunctions(compiled)\n\n // Manage cache size\n if (expressionCache.size >= MAX_CACHE_SIZE) {\n const firstKey = expressionCache.keys().next().value\n if (firstKey) expressionCache.delete(firstKey)\n }\n\n expressionCache.set(expression, compiled)\n }\n\n return compiled\n}\n\n/**\n * Register custom functions on a JSONata expression\n */\nfunction registerCustomFunctions(expr: jsonata.Expression): void {\n // $env(name) - Get environment variable (only non-sensitive ones)\n expr.registerFunction('env', (name: string) => {\n // Only allow specific prefixes for security\n if (typeof name === 'string' && name.startsWith('PUBLIC_')) {\n return process.env[name]\n }\n return undefined\n }, '<s:s>')\n\n // $now() - Current ISO timestamp\n expr.registerFunction('now', () => new Date().toISOString(), '<:s>')\n\n // $timestamp() - Current Unix timestamp in milliseconds\n expr.registerFunction('timestamp', () => Date.now(), '<:n>')\n\n // $uuid() - Generate a UUID v4\n expr.registerFunction('uuid', () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0\n const v = c === 'x' ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n }, '<:s>')\n\n // $default(value, defaultValue) - Return default if value is null/undefined\n expr.registerFunction('default', (value: unknown, defaultValue: unknown) => {\n return value === null || value === undefined ? defaultValue : value\n }, '<xx:x>')\n\n // $json(value) - Parse JSON string\n expr.registerFunction('json', (value: string) => {\n try {\n return JSON.parse(value)\n } catch {\n return undefined\n }\n }, '<s:x>')\n\n // $stringify(value) - Convert to JSON string\n expr.registerFunction('stringify', (value: unknown) => {\n try {\n return JSON.stringify(value)\n } catch {\n return undefined\n }\n }, '<x:s>')\n\n // $keys(object) - Get object keys\n expr.registerFunction('keys', (obj: Record<string, unknown>) => {\n if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n return Object.keys(obj)\n }\n return []\n }, '<o:a>')\n\n // $values(object) - Get object values\n expr.registerFunction('values', (obj: Record<string, unknown>) => {\n if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n return Object.values(obj)\n }\n return []\n }, '<o:a>')\n\n // $has(object, key) - Check if object has key\n expr.registerFunction('has', (obj: Record<string, unknown>, key: string) => {\n if (obj && typeof obj === 'object') {\n return key in obj\n }\n return false\n }, '<os:b>')\n\n // $coalesce(values...) - Return first non-null value\n expr.registerFunction('coalesce', (...values: unknown[]) => {\n for (const v of values) {\n if (v !== null && v !== undefined) {\n return v\n }\n }\n return null\n }, '<x+:x>')\n}\n\n/**\n * Evaluate a JSONata expression against a context\n */\nexport async function evaluate(\n expression: string,\n context: ExpressionContext,\n options: EvaluateOptions = {}\n): Promise<unknown> {\n const { timeout = 5000 } = options\n\n const compiled = compileExpression(expression)\n\n // Create a promise that rejects on timeout\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Expression evaluation timed out after ${timeout}ms`)), timeout)\n })\n\n // Race between evaluation and timeout\n return Promise.race([\n compiled.evaluate(context),\n timeoutPromise\n ])\n}\n\n/**\n * Evaluate a condition expression and return a boolean\n */\nexport async function evaluateCondition(\n expression: string,\n context: ExpressionContext,\n options: EvaluateOptions = {}\n): Promise<boolean> {\n try {\n const result = await evaluate(expression, context, options)\n\n // Convert result to boolean\n if (result === undefined || result === null) {\n return false\n }\n if (typeof result === 'boolean') {\n return result\n }\n if (typeof result === 'number') {\n return result !== 0\n }\n if (typeof result === 'string') {\n return result.length > 0\n }\n if (Array.isArray(result)) {\n return result.length > 0\n }\n return true\n } catch (error) {\n // Log error but return false for failed conditions\n console.warn('Condition evaluation failed:', error instanceof Error ? error.message : error)\n return false\n }\n}\n\n/**\n * Transform data using a JSONata expression\n * The expression can be a JSONata query or a JSON object with embedded expressions\n */\nexport async function transform(\n template: unknown,\n context: ExpressionContext,\n options: EvaluateOptions = {}\n): Promise<unknown> {\n if (typeof template === 'string') {\n // Check if it looks like a JSONata expression (starts with common patterns)\n if (\n template.startsWith('{') ||\n template.startsWith('[') ||\n template.startsWith('$') ||\n template.includes('.') ||\n template.includes('(')\n ) {\n try {\n return await evaluate(template, context, options)\n } catch (e) {\n if (options.debug && options.logger) {\n options.logger.info(\n e instanceof Error ? e.message : e,\n 'Failed to evaluate expression:',\n )\n }\n // If it fails to evaluate, return as literal string\n return template\n }\n }\n return template\n }\n\n if (Array.isArray(template)) {\n return Promise.all(template.map(item => transform(item, context, options)))\n }\n\n if (template && typeof template === 'object') {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(template)) {\n result[key] = await transform(value, context, options)\n }\n return result\n }\n\n return template\n}\n\n/**\n * Resolve a step input configuration using JSONata\n * Handles both simple values and expressions\n */\nexport async function resolveStepInput(\n config: Record<string, unknown>,\n context: ExpressionContext,\n options: EvaluateOptions = {}\n): Promise<Record<string, unknown>> {\n const result: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(config)) {\n result[key] = await transform(value, context, options)\n }\n\n return result\n}\n\n/**\n * Clear the expression cache\n */\nexport function clearCache(): void {\n expressionCache.clear()\n}\n\n/**\n * Get cache statistics\n */\nexport function getCacheStats(): { size: number; maxSize: number } {\n return {\n size: expressionCache.size,\n maxSize: MAX_CACHE_SIZE\n }\n}\n"],"names":["jsonata","expressionCache","Map","MAX_CACHE_SIZE","compileExpression","expression","compiled","get","registerCustomFunctions","size","firstKey","keys","next","value","delete","set","expr","registerFunction","name","startsWith","process","env","undefined","Date","toISOString","now","replace","c","r","Math","random","v","toString","defaultValue","JSON","parse","stringify","obj","Array","isArray","Object","values","key","evaluate","context","options","timeout","timeoutPromise","Promise","_","reject","setTimeout","Error","race","evaluateCondition","result","length","error","console","warn","message","transform","template","includes","e","debug","logger","info","all","map","item","entries","resolveStepInput","config","clearCache","clear","getCacheStats","maxSize"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xtr-dev/payload-automation",
3
- "version": "0.0.50",
3
+ "version": "0.0.51",
4
4
  "description": "PayloadCMS Automation Plugin - Comprehensive workflow automation system with visual workflow building, execution tracking, and step types",
5
5
  "license": "MIT",
6
6
  "type": "module",