@tachybase/module-workflow 1.3.24 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/client/components/ColumnExecutedTime.d.ts +1 -0
  2. package/dist/client/components/ColumnShowEventSource.d.ts +1 -0
  3. package/dist/client/index.d.ts +2 -1
  4. package/dist/client/index.js +55 -54
  5. package/dist/client/locale/index.d.ts +1 -1
  6. package/dist/client/provider/EventSourceProvider.d.ts +7 -0
  7. package/dist/client/schemas/workflows.d.ts +8 -0
  8. package/dist/externalVersion.js +11 -11
  9. package/dist/locale/en-US.json +6 -0
  10. package/dist/locale/es-ES.json +7 -0
  11. package/dist/locale/fr-FR.json +7 -0
  12. package/dist/locale/ja-JP.json +7 -0
  13. package/dist/locale/ko_KR.json +7 -0
  14. package/dist/locale/pt-BR.json +7 -0
  15. package/dist/locale/ru-RU.json +7 -0
  16. package/dist/locale/tr-TR.json +7 -0
  17. package/dist/locale/zh-CN.json +10 -0
  18. package/dist/node_modules/@babel/core/lib/index.js +12 -12
  19. package/dist/node_modules/@babel/core/package.json +1 -1
  20. package/dist/node_modules/@babel/preset-env/lib/index.js +82 -82
  21. package/dist/node_modules/@babel/preset-env/package.json +1 -1
  22. package/dist/node_modules/@babel/preset-react/lib/index.js +12 -12
  23. package/dist/node_modules/@babel/preset-react/package.json +1 -1
  24. package/dist/node_modules/@babel/preset-typescript/lib/index.js +12 -12
  25. package/dist/node_modules/@babel/preset-typescript/package.json +1 -1
  26. package/dist/node_modules/cron-parser/package.json +1 -1
  27. package/dist/node_modules/form-data/package.json +1 -1
  28. package/dist/node_modules/jsonata/package.json +1 -1
  29. package/dist/node_modules/lru-cache/package.json +1 -1
  30. package/dist/node_modules/mime-types/package.json +1 -1
  31. package/dist/node_modules/qrcode/package.json +1 -1
  32. package/dist/server/actions/executions.js +2 -2
  33. package/dist/server/actions/workflows.js +25 -10
  34. package/dist/server/collections/1-users_jobs.js +1 -1
  35. package/dist/server/collections/executions.js +1 -1
  36. package/dist/server/collections/jobs.js +1 -1
  37. package/dist/server/collections/workflowCategories.js +4 -0
  38. package/dist/server/collections/workflows.js +6 -0
  39. package/dist/server/features/loop/LoopInstruction.d.ts +4 -0
  40. package/dist/server/features/loop/LoopInstruction.js +10 -2
  41. package/dist/server/features/request/RequestInstruction.js +7 -0
  42. package/dist/server/features/script/script.instruction.js +1 -1
  43. package/dist/server/features/trigger-instruction/TriggerInstruction.d.ts +1 -1
  44. package/dist/server/features/trigger-instruction/TriggerInstruction.js +45 -16
  45. package/dist/server/instructions/CreateInstruction.js +1 -1
  46. package/dist/server/instructions/UpdateInstruction.d.ts +4 -1
  47. package/dist/server/instructions/UpdateInstruction.js +6 -2
  48. package/dist/server/instructions/UpdateOrCreateInstruction.js +1 -1
  49. package/dist/server/migrations/20251104174604-add-sort-to-workflows.d.ts +6 -0
  50. package/dist/server/migrations/20251104174604-add-sort-to-workflows.js +88 -0
  51. package/package.json +13 -13
  52. /package/dist/client/{ExecutionContextProvider.d.ts → provider/ExecutionContextProvider.d.ts} +0 -0
  53. /package/dist/client/{ExecutionResourceProvider.d.ts → provider/ExecutionResourceProvider.d.ts} +0 -0
@@ -1 +1 @@
1
- {"name":"@babel/preset-typescript","version":"7.27.1","description":"Babel preset for TypeScript.","repository":{"type":"git","url":"https://github.com/babel/babel.git","directory":"packages/babel-preset-typescript"},"license":"MIT","publishConfig":{"access":"public"},"main":"./lib/index.js","keywords":["babel-preset","typescript"],"dependencies":{"@babel/helper-plugin-utils":"^7.27.1","@babel/helper-validator-option":"^7.27.1","@babel/plugin-syntax-jsx":"^7.27.1","@babel/plugin-transform-modules-commonjs":"^7.27.1","@babel/plugin-transform-typescript":"^7.27.1"},"peerDependencies":{"@babel/core":"^7.0.0-0"},"devDependencies":{"@babel/core":"^7.27.1","@babel/helper-plugin-test-runner":"^7.27.1"},"homepage":"https://babel.dev/docs/en/next/babel-preset-typescript","bugs":"https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22area%3A%20typescript%22+is%3Aopen","engines":{"node":">=6.9.0"},"author":"The Babel Team (https://babel.dev/team)","type":"commonjs","_lastModified":"2025-08-03T23:10:30.136Z"}
1
+ {"name":"@babel/preset-typescript","version":"7.27.1","description":"Babel preset for TypeScript.","repository":{"type":"git","url":"https://github.com/babel/babel.git","directory":"packages/babel-preset-typescript"},"license":"MIT","publishConfig":{"access":"public"},"main":"./lib/index.js","keywords":["babel-preset","typescript"],"dependencies":{"@babel/helper-plugin-utils":"^7.27.1","@babel/helper-validator-option":"^7.27.1","@babel/plugin-syntax-jsx":"^7.27.1","@babel/plugin-transform-modules-commonjs":"^7.27.1","@babel/plugin-transform-typescript":"^7.27.1"},"peerDependencies":{"@babel/core":"^7.0.0-0"},"devDependencies":{"@babel/core":"^7.27.1","@babel/helper-plugin-test-runner":"^7.27.1"},"homepage":"https://babel.dev/docs/en/next/babel-preset-typescript","bugs":"https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22area%3A%20typescript%22+is%3Aopen","engines":{"node":">=6.9.0"},"author":"The Babel Team (https://babel.dev/team)","type":"commonjs","_lastModified":"2025-11-10T07:37:41.616Z"}
@@ -1 +1 @@
1
- {"name":"cron-parser","version":"4.9.0","description":"Node.js library for parsing crontab instructions","main":"lib/parser.js","types":"types/index.d.ts","typesVersions":{"<4.1":{"*":["types/ts3/*"]}},"directories":{"test":"test"},"scripts":{"test:tsd":"tsd","test:unit":"TZ=UTC tap ./test/*.js","test:cover":"TZ=UTC tap --coverage-report=html ./test/*.js","lint":"eslint .","lint:fix":"eslint --fix .","test":"npm run lint && npm run test:unit && npm run test:tsd"},"repository":{"type":"git","url":"https://github.com/harrisiirak/cron-parser.git"},"keywords":["cron","crontab","parser"],"author":"Harri Siirak","contributors":["Nicholas Clawson","Daniel Prentis <daniel@salsitasoft.com>","Renault John Lecoultre","Richard Astbury <richard.astbury@gmail.com>","Meaglin Wasabi <Meaglin.wasabi@gmail.com>","Mike Kusold <hello@mikekusold.com>","Alex Kit <alex.kit@atmajs.com>","Santiago Gimeno <santiago.gimeno@gmail.com>","Daniel <darc.tec@gmail.com>","Christian Steininger <christian.steininger.cs@gmail.com>","Mykola Piskovyi <m.piskovyi@gmail.com>","Brian Vaughn <brian.david.vaughn@gmail.com>","Nicholas Clawson <nickclaw@gmail.com>","Yasuhiroki <yasuhiroki.duck@gmail.com>","Nicholas Clawson <nickclaw@gmail.com>","Brendan Warkentin <faazshift@gmail.com>","Charlie Fish <fishcharlie.code@gmail.com>","Ian Graves <ian+diskimage@iangrav.es>","Andy Thompson <me@andytson.com>","Regev Brody <regevbr@gmail.com>"],"license":"MIT","dependencies":{"luxon":"^3.2.1"},"devDependencies":{"eslint":"^8.27.0","sinon":"^15.0.1","tap":"^16.3.3","tsd":"^0.26.0"},"engines":{"node":">=12.0.0"},"browser":{"fs":false},"tap":{"check-coverage":false},"tsd":{"directory":"test","compilerOptions":{"lib":["es2017","dom"]}},"files":["lib","types","LICENSE","README.md"],"_lastModified":"2025-08-03T23:10:30.392Z"}
1
+ {"name":"cron-parser","version":"4.9.0","description":"Node.js library for parsing crontab instructions","main":"lib/parser.js","types":"types/index.d.ts","typesVersions":{"<4.1":{"*":["types/ts3/*"]}},"directories":{"test":"test"},"scripts":{"test:tsd":"tsd","test:unit":"TZ=UTC tap ./test/*.js","test:cover":"TZ=UTC tap --coverage-report=html ./test/*.js","lint":"eslint .","lint:fix":"eslint --fix .","test":"npm run lint && npm run test:unit && npm run test:tsd"},"repository":{"type":"git","url":"https://github.com/harrisiirak/cron-parser.git"},"keywords":["cron","crontab","parser"],"author":"Harri Siirak","contributors":["Nicholas Clawson","Daniel Prentis <daniel@salsitasoft.com>","Renault John Lecoultre","Richard Astbury <richard.astbury@gmail.com>","Meaglin Wasabi <Meaglin.wasabi@gmail.com>","Mike Kusold <hello@mikekusold.com>","Alex Kit <alex.kit@atmajs.com>","Santiago Gimeno <santiago.gimeno@gmail.com>","Daniel <darc.tec@gmail.com>","Christian Steininger <christian.steininger.cs@gmail.com>","Mykola Piskovyi <m.piskovyi@gmail.com>","Brian Vaughn <brian.david.vaughn@gmail.com>","Nicholas Clawson <nickclaw@gmail.com>","Yasuhiroki <yasuhiroki.duck@gmail.com>","Nicholas Clawson <nickclaw@gmail.com>","Brendan Warkentin <faazshift@gmail.com>","Charlie Fish <fishcharlie.code@gmail.com>","Ian Graves <ian+diskimage@iangrav.es>","Andy Thompson <me@andytson.com>","Regev Brody <regevbr@gmail.com>"],"license":"MIT","dependencies":{"luxon":"^3.2.1"},"devDependencies":{"eslint":"^8.27.0","sinon":"^15.0.1","tap":"^16.3.3","tsd":"^0.26.0"},"engines":{"node":">=12.0.0"},"browser":{"fs":false},"tap":{"check-coverage":false},"tsd":{"directory":"test","compilerOptions":{"lib":["es2017","dom"]}},"files":["lib","types","LICENSE","README.md"],"_lastModified":"2025-11-10T07:37:41.846Z"}
@@ -1 +1 @@
1
- {"author":"Felix Geisendörfer <felix@debuggable.com> (http://debuggable.com/)","name":"form-data","description":"A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.","version":"4.0.4","repository":{"type":"git","url":"git://github.com/form-data/form-data.git"},"main":"./lib/form_data","browser":"./lib/browser","typings":"./index.d.ts","scripts":{"pretest":"npm run lint","pretests-only":"rimraf coverage test/tmp","tests-only":"istanbul cover test/run.js","posttests-only":"istanbul report lcov text","test":"npm run tests-only","posttest":"npx npm@'>=10.2' audit --production","lint":"eslint --ext=js,mjs .","report":"istanbul report lcov text","ci-lint":"is-node-modern 8 && npm run lint || is-node-not-modern 8","ci-test":"npm run tests-only && npm run browser && npm run report","predebug":"rimraf coverage test/tmp","debug":"verbose=1 ./test/run.js","browser":"browserify -t browserify-istanbul test/run-browser.js | obake --coverage","check":"istanbul check-coverage coverage/coverage*.json","files":"pkgfiles --sort=name","get-version":"node -e \"console.log(require('./package.json').version)\"","update-readme":"sed -i.bak 's/\\/master\\.svg/\\/v'$(npm --silent run get-version)'.svg/g' README.md","postupdate-readme":"mv README.md.bak READ.ME.md.bak","restore-readme":"mv READ.ME.md.bak README.md","prepublish":"not-in-publish || npm run prepublishOnly","prepack":"npm run update-readme","postpack":"npm run restore-readme","version":"auto-changelog && git add CHANGELOG.md","postversion":"auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""},"engines":{"node":">= 6"},"dependencies":{"asynckit":"^0.4.0","combined-stream":"^1.0.8","es-set-tostringtag":"^2.1.0","hasown":"^2.0.2","mime-types":"^2.1.12"},"devDependencies":{"@ljharb/eslint-config":"^21.2.0","auto-changelog":"^2.5.0","browserify":"^13.3.0","browserify-istanbul":"^2.0.0","coveralls":"^3.1.1","cross-spawn":"^6.0.6","eslint":"=8.8.0","fake":"^0.2.2","far":"^0.0.7","formidable":"^1.2.6","in-publish":"^2.0.1","is-node-modern":"^1.0.0","istanbul":"^0.4.5","obake":"^0.1.2","pkgfiles":"^2.3.2","pre-commit":"^1.2.2","predict-v8-randomness":"^1.0.35","puppeteer":"^1.20.0","request":"~2.87.0","rimraf":"^2.7.1","semver":"^6.3.1","tape":"^5.9.0"},"license":"MIT","auto-changelog":{"output":"CHANGELOG.md","template":"keepachangelog","unreleased":false,"commitLimit":false,"backfillLimit":false,"hideCredit":true},"_lastModified":"2025-08-03T23:10:15.424Z"}
1
+ {"author":"Felix Geisendörfer <felix@debuggable.com> (http://debuggable.com/)","name":"form-data","description":"A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.","version":"4.0.4","repository":{"type":"git","url":"git://github.com/form-data/form-data.git"},"main":"./lib/form_data","browser":"./lib/browser","typings":"./index.d.ts","scripts":{"pretest":"npm run lint","pretests-only":"rimraf coverage test/tmp","tests-only":"istanbul cover test/run.js","posttests-only":"istanbul report lcov text","test":"npm run tests-only","posttest":"npx npm@'>=10.2' audit --production","lint":"eslint --ext=js,mjs .","report":"istanbul report lcov text","ci-lint":"is-node-modern 8 && npm run lint || is-node-not-modern 8","ci-test":"npm run tests-only && npm run browser && npm run report","predebug":"rimraf coverage test/tmp","debug":"verbose=1 ./test/run.js","browser":"browserify -t browserify-istanbul test/run-browser.js | obake --coverage","check":"istanbul check-coverage coverage/coverage*.json","files":"pkgfiles --sort=name","get-version":"node -e \"console.log(require('./package.json').version)\"","update-readme":"sed -i.bak 's/\\/master\\.svg/\\/v'$(npm --silent run get-version)'.svg/g' README.md","postupdate-readme":"mv README.md.bak READ.ME.md.bak","restore-readme":"mv READ.ME.md.bak README.md","prepublish":"not-in-publish || npm run prepublishOnly","prepack":"npm run update-readme","postpack":"npm run restore-readme","version":"auto-changelog && git add CHANGELOG.md","postversion":"auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""},"engines":{"node":">= 6"},"dependencies":{"asynckit":"^0.4.0","combined-stream":"^1.0.8","es-set-tostringtag":"^2.1.0","hasown":"^2.0.2","mime-types":"^2.1.12"},"devDependencies":{"@ljharb/eslint-config":"^21.2.0","auto-changelog":"^2.5.0","browserify":"^13.3.0","browserify-istanbul":"^2.0.0","coveralls":"^3.1.1","cross-spawn":"^6.0.6","eslint":"=8.8.0","fake":"^0.2.2","far":"^0.0.7","formidable":"^1.2.6","in-publish":"^2.0.1","is-node-modern":"^1.0.0","istanbul":"^0.4.5","obake":"^0.1.2","pkgfiles":"^2.3.2","pre-commit":"^1.2.2","predict-v8-randomness":"^1.0.35","puppeteer":"^1.20.0","request":"~2.87.0","rimraf":"^2.7.1","semver":"^6.3.1","tape":"^5.9.0"},"license":"MIT","auto-changelog":{"output":"CHANGELOG.md","template":"keepachangelog","unreleased":false,"commitLimit":false,"backfillLimit":false,"hideCredit":true},"_lastModified":"2025-11-10T07:37:28.523Z"}
@@ -1 +1 @@
1
- {"name":"jsonata","version":"2.0.6","description":"JSON query and transformation language","module":"jsonata.js","main":"jsonata.js","typings":"jsonata.d.ts","homepage":"http://jsonata.org/","repository":{"type":"git","url":"https://github.com/jsonata-js/jsonata.git"},"scripts":{"pretest":"npm run lint","mocha":"nyc ./node_modules/mocha/bin/_mocha -- \"test/**/*.js\"","test":"npm run mocha","posttest":"npm run check-coverage && npm run browserify && npm run minify && npm run build-es5","build-es5":"npm run mkdir-dist && npm run regenerator && npm run browserify-es5 && npm run minify-es5","check-coverage":"nyc check-coverage --statements 100 --branches 100 --functions 100 --lines 100","browserify":"browserify src/jsonata.js --outfile jsonata.js --standalone jsonata","mkdir-dist":"mkdirp ./dist","regenerator":"babel src --out-dir dist --presets=@babel/env","browserify-es5":"regenerator --include-runtime polyfill.js > jsonata-es5.js; browserify dist/jsonata.js --standalone jsonata >> jsonata-es5.js","prepublishOnly":"npm run browserify && npm run minify && npm run build-es5","lint":"eslint src","doc":"jsdoc --configure jsdoc.json .","cover":"nyc _mocha","minify":"uglifyjs jsonata.js -o jsonata.min.js --compress --mangle","minify-es5":"uglifyjs jsonata-es5.js -o jsonata-es5.min.js --compress --mangle"},"license":"MIT","keywords":["JSON","query","transformation","transform","mapping","path"],"devDependencies":{"@babel/cli":"^7.8.4","@babel/core":"^7.8.4","@babel/preset-env":"^7.8.4","browserify":"^16.5.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"8.0.0","eslint-plugin-ideal":"^0.1.3","eslint-plugin-promise":"^6.0.0","jsdoc":"^3.6.3","mkdirp":"^1.0.3","mocha":"^7.0.1","mocha-lcov-reporter":"^1.3.0","nyc":"^15.1.0","regenerator":"^0.14.4","request":"^2.88.2","uglify-es":"^3.3.10"},"engines":{"node":">= 8"},"_lastModified":"2025-08-03T23:10:16.497Z"}
1
+ {"name":"jsonata","version":"2.0.6","description":"JSON query and transformation language","module":"jsonata.js","main":"jsonata.js","typings":"jsonata.d.ts","homepage":"http://jsonata.org/","repository":{"type":"git","url":"https://github.com/jsonata-js/jsonata.git"},"scripts":{"pretest":"npm run lint","mocha":"nyc ./node_modules/mocha/bin/_mocha -- \"test/**/*.js\"","test":"npm run mocha","posttest":"npm run check-coverage && npm run browserify && npm run minify && npm run build-es5","build-es5":"npm run mkdir-dist && npm run regenerator && npm run browserify-es5 && npm run minify-es5","check-coverage":"nyc check-coverage --statements 100 --branches 100 --functions 100 --lines 100","browserify":"browserify src/jsonata.js --outfile jsonata.js --standalone jsonata","mkdir-dist":"mkdirp ./dist","regenerator":"babel src --out-dir dist --presets=@babel/env","browserify-es5":"regenerator --include-runtime polyfill.js > jsonata-es5.js; browserify dist/jsonata.js --standalone jsonata >> jsonata-es5.js","prepublishOnly":"npm run browserify && npm run minify && npm run build-es5","lint":"eslint src","doc":"jsdoc --configure jsdoc.json .","cover":"nyc _mocha","minify":"uglifyjs jsonata.js -o jsonata.min.js --compress --mangle","minify-es5":"uglifyjs jsonata-es5.js -o jsonata-es5.min.js --compress --mangle"},"license":"MIT","keywords":["JSON","query","transformation","transform","mapping","path"],"devDependencies":{"@babel/cli":"^7.8.4","@babel/core":"^7.8.4","@babel/preset-env":"^7.8.4","browserify":"^16.5.0","chai":"^4.2.0","chai-as-promised":"^7.1.1","eslint":"8.0.0","eslint-plugin-ideal":"^0.1.3","eslint-plugin-promise":"^6.0.0","jsdoc":"^3.6.3","mkdirp":"^1.0.3","mocha":"^7.0.1","mocha-lcov-reporter":"^1.3.0","nyc":"^15.1.0","regenerator":"^0.14.4","request":"^2.88.2","uglify-es":"^3.3.10"},"engines":{"node":">= 8"},"_lastModified":"2025-11-10T07:37:29.492Z"}
@@ -1 +1 @@
1
- {"type":"commonjs","_lastModified":"2025-08-03T23:10:14.974Z"}
1
+ {"type":"commonjs","_lastModified":"2025-11-10T07:37:28.137Z"}
@@ -1 +1 @@
1
- {"name":"mime-types","description":"The ultimate javascript content-type utility.","version":"3.0.1","contributors":["Douglas Christopher Wilson <doug@somethingdoug.com>","Jeremiah Senkpiel <fishrock123@rocketmail.com> (https://searchbeam.jit.su)","Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"],"license":"MIT","keywords":["mime","types"],"repository":"jshttp/mime-types","dependencies":{"mime-db":"^1.54.0"},"devDependencies":{"eslint":"8.33.0","eslint-config-standard":"14.1.1","eslint-plugin-import":"2.27.5","eslint-plugin-markdown":"3.0.0","eslint-plugin-node":"11.1.0","eslint-plugin-promise":"6.1.1","eslint-plugin-standard":"4.1.0","mocha":"10.2.0","nyc":"15.1.0"},"files":["HISTORY.md","LICENSE","index.js","mimeScore.js"],"engines":{"node":">= 0.6"},"scripts":{"lint":"eslint .","test":"mocha --reporter spec test/test.js","test-ci":"nyc --reporter=lcov --reporter=text npm test","test-cov":"nyc --reporter=html --reporter=text npm test"},"_lastModified":"2025-08-03T23:10:15.605Z"}
1
+ {"name":"mime-types","description":"The ultimate javascript content-type utility.","version":"3.0.1","contributors":["Douglas Christopher Wilson <doug@somethingdoug.com>","Jeremiah Senkpiel <fishrock123@rocketmail.com> (https://searchbeam.jit.su)","Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"],"license":"MIT","keywords":["mime","types"],"repository":"jshttp/mime-types","dependencies":{"mime-db":"^1.54.0"},"devDependencies":{"eslint":"8.33.0","eslint-config-standard":"14.1.1","eslint-plugin-import":"2.27.5","eslint-plugin-markdown":"3.0.0","eslint-plugin-node":"11.1.0","eslint-plugin-promise":"6.1.1","eslint-plugin-standard":"4.1.0","mocha":"10.2.0","nyc":"15.1.0"},"files":["HISTORY.md","LICENSE","index.js","mimeScore.js"],"engines":{"node":">= 0.6"},"scripts":{"lint":"eslint .","test":"mocha --reporter spec test/test.js","test-ci":"nyc --reporter=lcov --reporter=text npm test","test-cov":"nyc --reporter=html --reporter=text npm test"},"_lastModified":"2025-11-10T07:37:28.698Z"}
@@ -1 +1 @@
1
- {"name":"qrcode","description":"QRCode / 2d Barcode api with both server side and client side support using canvas","version":"1.5.4","author":"Ryan Day <soldair@gmail.com>","contributors":["Vincenzo Greco <greco.vincenzo@gmail.com>","Linus Unnebäck <linus@folkdatorn.se>"],"keywords":["qr","code","canvas","qrcode"],"main":"./lib/index.js","browser":{"./lib/index.js":"./lib/browser.js","fs":false},"files":["bin","build","lib","helper"],"homepage":"http://github.com/soldair/node-qrcode","license":"MIT","scripts":{"lint":"standard","pretest":"npm run lint","test":"node --throw-deprecation test.js","build":"rollup -c","prepublish":"npm run build","browser":"node examples/clientsideserver.js"},"bin":{"qrcode":"./bin/qrcode"},"dependencies":{"dijkstrajs":"^1.0.1","pngjs":"^5.0.0","yargs":"^15.3.1"},"devDependencies":{"@babel/core":"^7.9.0","@babel/preset-env":"^7.9.5","@rollup/plugin-commonjs":"^11.1.0","@rollup/plugin-node-resolve":"^7.1.3","browserify":"^16.5.1","canvas":"^2.8.0","canvasutil":"0.0.4","colors":"^1.4.0","express":"^4.17.1","htmlparser2":"^4.1.0","rollup":"^2.6.1","rollup-plugin-babel":"^4.4.0","rollup-plugin-terser":"^5.3.0","sinon":"^9.0.2","standard":"^16.0.4","tap":"^16.2.0"},"repository":{"type":"git","url":"git://github.com/soldair/node-qrcode.git"},"engines":{"node":">=10.13.0"},"standard":{"ignore":["build/","examples/vendors/","lib/core/regex.js"]},"_lastModified":"2025-08-03T23:10:16.080Z"}
1
+ {"name":"qrcode","description":"QRCode / 2d Barcode api with both server side and client side support using canvas","version":"1.5.4","author":"Ryan Day <soldair@gmail.com>","contributors":["Vincenzo Greco <greco.vincenzo@gmail.com>","Linus Unnebäck <linus@folkdatorn.se>"],"keywords":["qr","code","canvas","qrcode"],"main":"./lib/index.js","browser":{"./lib/index.js":"./lib/browser.js","fs":false},"files":["bin","build","lib","helper"],"homepage":"http://github.com/soldair/node-qrcode","license":"MIT","scripts":{"lint":"standard","pretest":"npm run lint","test":"node --throw-deprecation test.js","build":"rollup -c","prepublish":"npm run build","browser":"node examples/clientsideserver.js"},"bin":{"qrcode":"./bin/qrcode"},"dependencies":{"dijkstrajs":"^1.0.1","pngjs":"^5.0.0","yargs":"^15.3.1"},"devDependencies":{"@babel/core":"^7.9.0","@babel/preset-env":"^7.9.5","@rollup/plugin-commonjs":"^11.1.0","@rollup/plugin-node-resolve":"^7.1.3","browserify":"^16.5.1","canvas":"^2.8.0","canvasutil":"0.0.4","colors":"^1.4.0","express":"^4.17.1","htmlparser2":"^4.1.0","rollup":"^2.6.1","rollup-plugin-babel":"^4.4.0","rollup-plugin-terser":"^5.3.0","sinon":"^9.0.2","standard":"^16.0.4","tap":"^16.2.0"},"repository":{"type":"git","url":"git://github.com/soldair/node-qrcode.git"},"engines":{"node":">=10.13.0"},"standard":{"ignore":["build/","examples/vendors/","lib/core/regex.js"]},"_lastModified":"2025-11-10T07:37:29.106Z"}
@@ -116,11 +116,11 @@ async function retry(context, next) {
116
116
  try {
117
117
  const result = await plugin.trigger(workflow, execution.context, { httpContext: context });
118
118
  context.app.logger.info(result);
119
- context.state.messages.push({ message: "Execute successfully" });
119
+ context.state.messages.push({ message: context.t("Execute ended", { ns: "workflow" }) });
120
120
  context.body = { executionId: execution.id };
121
121
  } catch (error) {
122
122
  context.app.logger.error(`Failed to retry execution ${execution.id}: ${error.message}`);
123
- context.throw(500, "Failed to retry execution");
123
+ context.throw(500, context.t("Failed to retry execution", { ns: "workflow" }));
124
124
  }
125
125
  await next();
126
126
  }
@@ -182,6 +182,7 @@ async function load(context, next) {
182
182
  await next();
183
183
  }
184
184
  async function test(context, next) {
185
+ var _a;
185
186
  const plugin = context.app.getPlugin(import_Plugin.default);
186
187
  const repository = import_server.utils.getRepositoryFromParams(context);
187
188
  const { filterByTk, filter = {}, values = {} } = context.action.params;
@@ -200,14 +201,16 @@ async function test(context, next) {
200
201
  const result = await plugin.trigger(
201
202
  workflow,
202
203
  {
203
- data: values.data,
204
- user: context.state.currentUser
204
+ data: values.data || {},
205
+ user: ((_a = context == null ? void 0 : context.state) == null ? void 0 : _a.currentUser) || {}
205
206
  },
206
207
  { httpContext: context }
207
208
  );
208
209
  context.app.logger.info(result);
209
- context.state.messages.push({ message: "testing" });
210
- context.body = "here???";
210
+ context.state.messages.push({
211
+ message: context.t("Test execution ended", { ns: "workflow" })
212
+ });
213
+ context.body = result.execution;
211
214
  }
212
215
  async function revision(context, next) {
213
216
  const plugin = context.app.getPlugin(import_Plugin.default);
@@ -300,13 +303,25 @@ async function retry(context, next) {
300
303
  sort: ["-createdAt"]
301
304
  });
302
305
  if (!execution) {
303
- context.state.messages.push({ message: "No execution records found for this workflow." });
306
+ context.state.messages.push({
307
+ message: context.t("No execution records found for this workflow.", { ns: "workflow" })
308
+ });
309
+ }
310
+ try {
311
+ const result = await plugin.trigger(workflow, execution.context, { httpContext: context });
312
+ context.app.logger.info(result);
313
+ context.state.messages.push({ message: context.t("Execute ended", { ns: "workflow" }) });
314
+ context.body = result.execution;
315
+ } catch (error) {
316
+ context.app.logger.error(`Failed to retry execution ${execution.id}: ${error.message}`);
317
+ context.state.messages.push({
318
+ message: context.t("Failed to retry execution", { ns: "workflow" }),
319
+ error: error.message
320
+ });
321
+ context.body = {
322
+ error: error.message
323
+ };
304
324
  }
305
- const executionId = execution.id;
306
- const result = await plugin.trigger(workflow, execution.context, { httpContext: context });
307
- context.app.logger.info(result);
308
- context.state.messages.push({ message: "Execute successfully" });
309
- context.body = { executionId };
310
325
  await next();
311
326
  }
312
327
  async function sync(context, next) {
@@ -24,7 +24,7 @@ var import_server = require("@tego/server");
24
24
  var users_jobs_default = (0, import_server.defineCollection)({
25
25
  name: "users_jobs",
26
26
  dumpRules: {
27
- group: "log"
27
+ group: "workflow"
28
28
  },
29
29
  shared: true,
30
30
  fields: [
@@ -22,7 +22,7 @@ __export(executions_exports, {
22
22
  module.exports = __toCommonJS(executions_exports);
23
23
  var executions_default = {
24
24
  dumpRules: {
25
- group: "log"
25
+ group: "workflow"
26
26
  },
27
27
  name: "executions",
28
28
  shared: true,
@@ -22,7 +22,7 @@ __export(jobs_exports, {
22
22
  module.exports = __toCommonJS(jobs_exports);
23
23
  var jobs_default = {
24
24
  dumpRules: {
25
- group: "log"
25
+ group: "workflow"
26
26
  },
27
27
  name: "jobs",
28
28
  shared: true,
@@ -39,6 +39,10 @@ var workflowCategories_default = {
39
39
  name: "color",
40
40
  defaultValue: "default"
41
41
  },
42
+ {
43
+ type: "string",
44
+ name: "type"
45
+ },
42
46
  {
43
47
  type: "belongsToMany",
44
48
  name: "workflows",
@@ -29,6 +29,7 @@ function workflows_default() {
29
29
  updatedAt: true,
30
30
  createdBy: true,
31
31
  updatedBy: true,
32
+ sortable: "sort",
32
33
  fields: [
33
34
  {
34
35
  name: "key",
@@ -128,6 +129,11 @@ function workflows_default() {
128
129
  type: "date",
129
130
  name: "initAt",
130
131
  defaultValue: () => /* @__PURE__ */ new Date()
132
+ },
133
+ {
134
+ name: "sort",
135
+ type: "bigInt",
136
+ interface: "sort"
131
137
  }
132
138
  ],
133
139
  // NOTE: use unique index for avoiding deadlock in mysql when setCurrent
@@ -9,5 +9,9 @@ export default class extends Instruction {
9
9
  item: any;
10
10
  index: any;
11
11
  length: number;
12
+ loopData: {
13
+ loopLength: any;
14
+ loopIndex: number;
15
+ };
12
16
  };
13
17
  }
@@ -81,19 +81,27 @@ class LoopInstruction_default extends import__.Instruction {
81
81
  return job;
82
82
  }
83
83
  getScope(node, index, processor) {
84
+ var _a, _b, _c;
84
85
  const target = processor.getParsedValue(node.config.target, node.id);
85
86
  const targets = (Array.isArray(target) ? target : [target]).filter((t) => t != null);
86
87
  const length = getTargetLength(target);
87
88
  const item = typeof target === "number" ? index : targets[index];
89
+ const params = (_c = (_b = (_a = processor.options) == null ? void 0 : _a.httpContext) == null ? void 0 : _b.action) == null ? void 0 : _c.params;
90
+ const loopData = (params == null ? void 0 : params.loopLength) ? {
91
+ loopLength: params.loopLength,
92
+ loopIndex: Number(params.loopIndex) + 1
93
+ } : null;
88
94
  const result = {
89
95
  item,
90
96
  index,
91
- length
97
+ length,
98
+ loopData
92
99
  };
93
100
  this.workflow.noticeManager.notify("workflow:regular", {
94
101
  msg: "progress",
95
102
  current: index,
96
- total: length
103
+ total: length,
104
+ loopData
97
105
  });
98
106
  return result;
99
107
  }
@@ -135,6 +135,13 @@ class RequestInstruction_default extends import__.Instruction {
135
135
  const config = processor.getParsedValue(node.config, node.id);
136
136
  const { workflow } = processor.execution;
137
137
  const sync = this.workflow.isWorkflowSync(workflow);
138
+ const loopData = prevJob.result;
139
+ if (loopData["length"]) {
140
+ config.params.push(
141
+ { name: "loopLength", value: loopData["length"] },
142
+ { name: "loopIndex", value: loopData["index"] }
143
+ );
144
+ }
138
145
  if (sync) {
139
146
  try {
140
147
  const response = await request(config, context);
@@ -179,7 +179,7 @@ async function convertByTsCode(code, data, processor) {
179
179
  app.logger.error("Cloud Component ", { error });
180
180
  }
181
181
  const func = sandbox.exports.default;
182
- const result = await func(data, {
182
+ const result = await func(data || {}, {
183
183
  ...options
184
184
  });
185
185
  return result;
@@ -3,7 +3,7 @@ import Processor from '../../Processor';
3
3
  export declare class TriggerInstruction extends Instruction {
4
4
  run(node: any, input: any, processor: Processor): Promise<{
5
5
  status: -1;
6
- result?: undefined;
6
+ result: string;
7
7
  } | {
8
8
  status: 1;
9
9
  result: any;
@@ -34,29 +34,58 @@ var import_constants = require("../../constants");
34
34
  var import_instructions = __toESM(require("../../instructions"));
35
35
  class TriggerInstruction extends import_instructions.default {
36
36
  async run(node, input, processor) {
37
+ var _a;
37
38
  const workflowKey = node.config.workflowKey;
38
39
  const wfRepo = this.workflow.db.getRepository("workflows");
39
40
  const wf = await wfRepo.findOne({ filter: { key: workflowKey, enabled: true } });
40
- if (wf.sync) {
41
- const p = await this.workflow.trigger(wf, input.result, processor.options);
42
- if (!p) {
41
+ if (!wf) {
42
+ return {
43
+ status: import_constants.JOB_STATUS.FAILED,
44
+ result: `Workflow with key "${workflowKey}" not found or disabled`
45
+ };
46
+ }
47
+ const dangerousNodeTypes = ["data-mapping", "script", "js-parse", "json-parse"];
48
+ const hasDangerousNodes = (_a = wf.nodes) == null ? void 0 : _a.some((node2) => dangerousNodeTypes.includes(node2.type));
49
+ if (hasDangerousNodes) {
50
+ this.workflow.getLogger(wf.id).warn(
51
+ `Triggering workflow ${workflowKey} contains potentially dangerous nodes: ${dangerousNodeTypes.join(", ")}`
52
+ );
53
+ }
54
+ try {
55
+ if (wf.sync) {
56
+ const p = await this.workflow.trigger(wf, input.result, processor.options);
57
+ if (!p) {
58
+ return {
59
+ status: import_constants.JOB_STATUS.FAILED,
60
+ result: "Failed to trigger sub-workflow"
61
+ };
62
+ }
63
+ const { lastSavedJob } = p;
64
+ if ((lastSavedJob == null ? void 0 : lastSavedJob.status) === import_constants.JOB_STATUS.ERROR) {
65
+ return {
66
+ status: import_constants.JOB_STATUS.FAILED,
67
+ result: `Sub-workflow execution failed: ${lastSavedJob.result}`
68
+ };
69
+ }
43
70
  return {
44
- status: import_constants.JOB_STATUS.FAILED
71
+ status: import_constants.JOB_STATUS.RESOLVED,
72
+ result: lastSavedJob == null ? void 0 : lastSavedJob.result
73
+ };
74
+ } else {
75
+ this.workflow.trigger(wf, input.result, {
76
+ ...processor.options,
77
+ parentNode: node.id,
78
+ parent: processor.execution
79
+ });
80
+ return {
81
+ status: import_constants.JOB_STATUS.PENDING
45
82
  };
46
83
  }
47
- const { lastSavedJob } = p;
48
- return {
49
- status: import_constants.JOB_STATUS.RESOLVED,
50
- result: lastSavedJob == null ? void 0 : lastSavedJob.result
51
- };
52
- } else {
53
- this.workflow.trigger(wf, input.result, {
54
- ...processor.options,
55
- parentNode: node.id,
56
- parent: processor.execution
57
- });
84
+ } catch (error) {
85
+ this.workflow.getLogger(wf.id).error(`Error triggering sub-workflow ${workflowKey}:`, error);
58
86
  return {
59
- status: import_constants.JOB_STATUS.PENDING
87
+ status: import_constants.JOB_STATUS.FAILED,
88
+ result: `Sub-workflow trigger error: ${error.message}`
60
89
  };
61
90
  }
62
91
  }
@@ -77,7 +77,7 @@ class CreateInstruction extends import__.Instruction {
77
77
  createById,
78
78
  updatedById,
79
79
  storageId
80
- } = resource;
80
+ } = resource || {};
81
81
  return {
82
82
  id,
83
83
  createdAt,
@@ -3,7 +3,10 @@ import type Processor from '../Processor';
3
3
  import type { FlowNodeModel } from '../types';
4
4
  export declare class UpdateInstruction extends Instruction {
5
5
  run(node: FlowNodeModel, input: any, processor: Processor): Promise<{
6
- result: any;
6
+ result: {
7
+ length: any;
8
+ data: any;
9
+ };
7
10
  status: 1;
8
11
  }>;
9
12
  }
@@ -38,6 +38,7 @@ var import_lodash = __toESM(require("lodash"));
38
38
  var import_mime_types = __toESM(require("mime-types"));
39
39
  var import__ = require(".");
40
40
  var import_constants = require("../constants");
41
+ var import_utils = require("../utils");
41
42
  class UpdateInstruction extends import__.Instruction {
42
43
  async run(node, input, processor) {
43
44
  var _a, _b;
@@ -75,7 +76,7 @@ class UpdateInstruction extends import__.Instruction {
75
76
  createById,
76
77
  updatedById,
77
78
  storageId
78
- } = resource;
79
+ } = resource || {};
79
80
  return {
80
81
  id,
81
82
  createdAt,
@@ -186,7 +187,10 @@ class UpdateInstruction extends import__.Instruction {
186
187
  transaction: this.workflow.useDataSourceTransaction(dataSourceName, processor.transaction)
187
188
  });
188
189
  return {
189
- result: result.length ?? result,
190
+ result: {
191
+ length: (result == null ? void 0 : result.length) ?? result,
192
+ data: (0, import_utils.toJSON)(result) ?? []
193
+ },
190
194
  status: import_constants.JOB_STATUS.RESOLVED
191
195
  };
192
196
  }
@@ -77,7 +77,7 @@ class UpdateOrCreateInstruction extends import__.Instruction {
77
77
  createById,
78
78
  updatedById,
79
79
  storageId
80
- } = resource;
80
+ } = resource || {};
81
81
  return {
82
82
  id,
83
83
  createdAt,
@@ -0,0 +1,6 @@
1
+ import { Migration } from '@tego/server';
2
+ export default class AddSortToWorkflowsMigration extends Migration {
3
+ on: string;
4
+ appVersion: string;
5
+ up(): Promise<void>;
6
+ }
@@ -0,0 +1,88 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var add_sort_to_workflows_exports = {};
19
+ __export(add_sort_to_workflows_exports, {
20
+ default: () => AddSortToWorkflowsMigration
21
+ });
22
+ module.exports = __toCommonJS(add_sort_to_workflows_exports);
23
+ var import_server = require("@tego/server");
24
+ class AddSortToWorkflowsMigration extends import_server.Migration {
25
+ constructor() {
26
+ super(...arguments);
27
+ this.on = "afterLoad";
28
+ this.appVersion = "<1.4.0";
29
+ }
30
+ async up() {
31
+ var _a, _b, _c, _d;
32
+ const queryInterface = this.db.sequelize.getQueryInterface();
33
+ const tableName = "workflows";
34
+ const tables = await queryInterface.showAllTables();
35
+ if (!tables.includes(tableName)) {
36
+ this.app.logger.info(`[migration skipped] table ${tableName} does not exist`);
37
+ return;
38
+ }
39
+ const tableDescription = await queryInterface.describeTable(tableName);
40
+ if (tableDescription.sort) {
41
+ this.app.logger.info(`[migration skipped] column sort already exists in ${tableName}`);
42
+ return;
43
+ }
44
+ try {
45
+ await queryInterface.addColumn(tableName, "sort", {
46
+ type: import_server.DataTypes.BIGINT,
47
+ allowNull: true,
48
+ defaultValue: 0
49
+ });
50
+ await this.db.sequelize.query(`UPDATE ${this.db.utils.quoteTable(tableName)} SET sort = 0 WHERE sort IS NULL`);
51
+ this.app.logger.info(`[workflows] added sort column successfully`);
52
+ const Field = this.context.db.getRepository("fields");
53
+ const sortFieldExists = await Field.count({
54
+ filter: {
55
+ name: "sort",
56
+ collectionName: "workflows"
57
+ }
58
+ });
59
+ if (!sortFieldExists) {
60
+ await Field.create({
61
+ values: {
62
+ name: "sort",
63
+ collectionName: "workflows",
64
+ type: "bigInt",
65
+ interface: "sort",
66
+ uiSchema: {
67
+ type: "number",
68
+ title: '{{t("Sort")}}',
69
+ "x-component": "InputNumber",
70
+ "x-component-props": {
71
+ stringMode: true,
72
+ step: "1"
73
+ },
74
+ "x-validator": "integer"
75
+ }
76
+ }
77
+ });
78
+ this.app.logger.info(`[workflows] added sort field record to fields table`);
79
+ }
80
+ } catch (error) {
81
+ if (((_a = error.message) == null ? void 0 : _a.includes("duplicate column name")) || ((_b = error.message) == null ? void 0 : _b.includes("already exists")) || ((_c = error.message) == null ? void 0 : _c.includes("column")) && ((_d = error.message) == null ? void 0 : _d.includes("exists"))) {
82
+ this.app.logger.info(`[migration skipped] sort column may already exist: ${error.message}`);
83
+ return;
84
+ }
85
+ throw error;
86
+ }
87
+ }
88
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tachybase/module-workflow",
3
3
  "displayName": "Workflow",
4
- "version": "1.3.24",
4
+ "version": "1.4.0",
5
5
  "description": "A powerful BPM tool that provides foundational support for business automation, with the capability to extend unlimited triggers and nodes.",
6
6
  "keywords": [
7
7
  "Workflow"
@@ -16,17 +16,17 @@
16
16
  "@babel/preset-react": "7.27.1",
17
17
  "@babel/preset-typescript": "7.27.1",
18
18
  "@dnd-kit/core": "^6.3.1",
19
- "@tachybase/schema": "^1.3.49",
20
- "@tachybase/test": "^1.3.49",
21
- "@tego/client": "^1.3.49",
22
- "@tego/server": "^1.3.49",
19
+ "@tachybase/schema": "*",
20
+ "@tachybase/test": "*",
21
+ "@tego/client": "*",
22
+ "@tego/server": "*",
23
23
  "@types/babel__core": "7.20.5",
24
24
  "@types/ejs": "^3.1.5",
25
25
  "@types/file-saver": "^2.0.7",
26
26
  "@types/lodash": "^4.17.20",
27
27
  "@types/qrcode": "^1.5.5",
28
28
  "antd": "5.22.5",
29
- "axios": "1.7.7",
29
+ "axios": "1.13.0",
30
30
  "cron-parser": "4.9.0",
31
31
  "dayjs": "^1.11.13",
32
32
  "file-saver": "^2.0.5",
@@ -37,16 +37,16 @@
37
37
  "mime-types": "^3.0.1",
38
38
  "qrcode": "^1.5.4",
39
39
  "react": "18.3.1",
40
- "react-i18next": "15.2.0",
40
+ "react-i18next": "16.2.1",
41
41
  "react-js-cron": "^3.2.0",
42
42
  "react-router-dom": "6.28.1",
43
43
  "sequelize": "^6.37.5",
44
- "@tachybase/client": "1.3.24",
45
- "@tachybase/module-collection": "1.3.24",
46
- "@tachybase/module-error-handler": "1.3.24",
47
- "@tachybase/module-ui-schema": "1.3.24",
48
- "@tachybase/module-user": "1.3.24",
49
- "@tachybase/plugin-workflow-test": "1.3.24"
44
+ "@tachybase/client": "1.4.0",
45
+ "@tachybase/module-error-handler": "1.4.0",
46
+ "@tachybase/module-collection": "1.4.0",
47
+ "@tachybase/module-ui-schema": "1.4.0",
48
+ "@tachybase/module-user": "1.4.0",
49
+ "@tachybase/plugin-workflow-test": "1.4.0"
50
50
  },
51
51
  "description.zh-CN": "一个强大的 BPM 工具,为业务自动化提供基础支持,并且可任意扩展更多的触发器和节点。",
52
52
  "displayName.zh-CN": "工作流",